From: Christian Femers Date: Mon, 16 Sep 2019 00:16:05 +0000 (+0200) Subject: The final restructured version for automatic build using maven tycho X-Git-Url: https://mograsim.net/gitweb/?p=Mograsim.git;a=commitdiff_plain;h=7d05144c25daa53e60fc9ed9fd503546a86567f8 The final restructured version for automatic build using maven tycho This can be extended to automatically deploy the updatesite to e.g. ftp. The difference to the previous CI approach is the flatter structure of the project and some pipeline improvements. --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..9224174c --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +target/ +bin/ +*.class +.flattened-pom.xml +pom.tycho +**.polyglot* +**.takari* +**.META-INF_MANIFEST.MF \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..27530738 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,54 @@ +# This file is a template, and might need editing before it works on your project. + +# Build JAVA applications using Apache Maven (http://maven.apache.org) +# For docker image tags see https://hub.docker.com/_/maven/ +# +# For general lifecycle information see https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html + +# This template will build and test your projects +# * Caches downloaded dependencies and plugins between invocation. +# * Verify but don't deploy merge requests. +# * Deploy built artifacts from master branch only. + +variables: + GIT_SUBMODULE_STRATEGY: recursive + # This will suppress any download for dependencies and plugins or upload messages which would clutter the console log. + # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. + MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true" + # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used + # when running from the command line. + # `installAtEnd` and `deployAtEnd` are only effective with recent version of the corresponding plugins. + MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true" + +# This template uses jdk11 for verifying and deploying images +image: maven:3.6.1-jdk-11 # Maven 3.6.2 will currently NOT WORK! + +# Cache downloaded dependencies and plugins between builds. +# To keep cache across branches add 'key: "$CI_JOB_NAME"' +cache: + key: "$CI_COMMIT_REF_SLUG" + paths: + - .m2/repository + +stages: + - validate + - test + +default: + before_script: + - mvn $MAVEN_CLI_OPTS clean # This is only temporary to resolve TYCHO 1.5.0-SNAPSHOT for the main build + - cd net.mograsim + +validate: + stage: validate + script: + - mvn $MAVEN_CLI_OPTS clean validate + +test: + stage: test + script: + - mvn $MAVEN_CLI_OPTS verify + artifacts: + reports: + junit: + - tests/*/target/surefire-reports/TEST-*.xml diff --git a/.gitmodules b/.gitmodules index 74725734..3f39c8a7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ [submodule "SWTHelper"] - path = SWTHelper - url = https://github.com/Haspamelodica/SWTHelper - branch = master + path = SWTHelper/bundles + url = https://github.com/Haspamelodica/SWTHelper.git diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml new file mode 100644 index 00000000..e06fb0e5 --- /dev/null +++ b/.mvn/extensions.xml @@ -0,0 +1,9 @@ + + + + org.eclipse.tycho.extras + tycho-pomless + 1.5.0-SNAPSHOT + + \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 00000000..e4bb21ad --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + eragp-misim-2019 + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/MAVEN-TYCHO-README.MD b/MAVEN-TYCHO-README.MD new file mode 100644 index 00000000..0682faec --- /dev/null +++ b/MAVEN-TYCHO-README.MD @@ -0,0 +1,247 @@ +# Mograsim Development Environment + +_Mograsim Development Documentation Version 0.1 --- 2019-09-13_ + +A short guide to the Mograsim Maven Tycho configuration and Maven Tycho in general, +as well as some information on Eclipse Plugin Development and OSGi. + + +## Maven Tycho + +[Maven Tycho](https://www.eclipse.org/tycho/sitedocs/index.html) is a plugin for +[Maven](http://maven.apache.org) that allows building Eclipse and OSGi Projects comfortably +and automatically using Maven. + +Useful links: +- [eclipse.org/tycho](https://www.eclipse.org/tycho/) +- [wiki.eclipse.org/Category:Tycho](https://wiki.eclipse.org/Category:Tycho) +- [vogella.com/tutorials/EclipseTycho](https://www.vogella.com/tutorials/EclipseTycho/article.html) +- [eclipse.org/tycho/sitedocs](https://www.eclipse.org/tycho/sitedocs/index.html) +- [Tycho pomless sources](https://git.eclipse.org/c/tycho/org.eclipse.tycho.extras.git/tree/tycho-pomless/src/main/java/org/eclipse/tycho/pomless) + (see *Mapping for naming and other conventions, TychoAggregatorMapping for folders) + +## OSGi + +OSGi is a module system for Java (completely unrelated to the Java 9 Jigsaw module +system) that allows detailed control over modules, dependencies, versions and more. +The file associated with OSGi here is a specific MANIFEST.MF in the META-INF directory +of each project. + +Roughly, an OSGi bundle has: +- a **symbolic name** that acts as an identifier, therefore it should be unique and + must not be changed, otherwise it a large portion of the configuration would break. + Never change that field after distribution. +- a **bundle name** and **bundle vendor**; this is only for the users and developers + and is not constrained in any way. You can change that, but it should be consistent + across all Mograsim modules. Both can be externalized to +- a **bundle version** that denotes current the version of the bundle. The `qualifier` + is replaced during the build process with a timestamp of the format `YYYYMMDDhhmmss`. + The version itself can be set using the maven tycho version plugin, which replaces + not only the maven versions, but all (equivalent) versions in the MANIFEST as well. +- a **bundle required execution environment** (abbr. BREE) where the bundle's *minimal* + JDK version is set. This is also the one eclipse uses and displays as JRE System + Library in the Eclipse projects.
This should be the same as the one the target + definition used for the build and the same that maven is run with ( -> check the + Run Configuration) + +## Eclipse Plugins + +- Short explanation of the different names and terms used in Eclipse Plugin Dev, + and short introduction to the different mechanisms used. + +## Mograsim Structure + +The tree of Mograsim projects: + +- `bundles` - _This contains all bundles/plugins that provide functionality to Mograsim_ + - `extenal/swthelper` - _This contains the [SWTHelper](https://github.com/Haspamelodica/SWTHelper) + git submodule._ + - `bundles` - _This submodule folder needs to be named like that for Tycho + pom-less build to work._ + - _SWTInput_ - _unused_ + - **SWTObjectWrappers** - SWT object abstractions to enable zooming and + optimizations. + - _SWTSystemInOutApplication_ - _unused_ + - _SWTTiledZoomableCanvas_ - _unused_ + - **SWTZoomableCanvas** - The SWT canvas we draw the simulation in. + - **net.mograsim.logic.core**
The core logic for pure simulation. This contains + the most important low-level logic circuits and gates and defines how that + logic gets simulated. The underlying system for simulation in Mograsim is an + event based approach (see `Timeline`), using VHDL-like logic defined in `Bit` + and `BitVector`. More complex ciruits are build out of `Wire`s connecting `Component`s. + - **net.mograsim.logic.model**
The model describes how that core logic is + displayed and arranged, and allows (de-)serialization to JSON. The core logic + model gets generated based on this. Every basic net.mograsim.logic.core Component + has a model equivalent here that represents it in the GUI and persisted state + (JSON). + - **net.mograsim.logic.model.editor**
This bundle contains a standalone + SWT-based editor to edit Mograsim JSON-models in a comfortable way. It can + be used to create a new `SubmodelComponent` by arranging existing ones to a + new component. Note that editing and simulation are entirely different processes + in Mograsim, the editor cannot simulate and a running simulation cannot be + edited. (At least in the current state) + - **net.mograsim.logic.model.am2900**
This plugin contains a model for the + AMD Am2900 Family Microprocessors arranged into a microprogrammable model. + This can be used in the microprogram editor of the Mograsim plugin and in the + Mograsim assembler editor (by using a properly set up instruction set). We + took care that the plugin is independent, meaning that it only provides an + implementation for an extension point of the net.mograsim.machine plugin and + no other Mograsim depends on it.
This is also the way to go if you want + to add your own machine definitions to Mograsim and use them there. + - **net.mograsim.machine**
The machine plugin defines an extension point + that can be extended and implemented in other (your own) plugins to provide + new machines to Mograsim. In addition to the extension point and the most important + interfaces, it contains some commonly required or useful components to build/define + another machine. net.mograsim.logic.model.am2900 for example is such an extension. + The machine plugin itself scans for all available implementations of the interface + given by the extension point, and other parts of the Mograsim plugin get access + to them that way. + - **net.mograsim.plugin.core**
This is - as the name says - the core plugin + of mograsim. Here lie all the Eclipse Platform specific parts that make Mograsim + as an Eclipse plugin work. This includes the different editors, view, settings + and other functional extension to the Eclipse IDE. + - **net.mograsim.plugin.core.nl_de**
This optional plugin provides a German + localization for Mograsim. + - **net.mograsim.plugin.branding**
This contains elements for branding the + feature plugin, and additional resources and raw files (original logo and icon + in SVG and Adobe Illustrator and similar). + - **net.mograsim.plugin.docs**
The Plugin providing the user documentation. + - **net.mograsim.preferences**
A plugin for managing and accessing preferences. +- `features` - _This contains all Mograsim feature plugins_ + - **net.mograsim.feature**
The Mograsim feature plugin, containing all the + plugins above and combining them into a feature. A feature is a plugin collection + with additional properties that allows for easy installation by the end user. + For this purpose, it also contains license information, authors, updatesite + location (allows eclipse to automatically check if updates are available) and + more. +- `products` - _This contains standalone Mograsim product(s)_ + - **net.mograsim.product**
A product can be pretty much anything (see Eclipse + RCP), in our case, this is simply a pre-configured Eclipse package, comparable + to the packages located at [www.eclipse.org/downloads/packages](https://www.eclipse.org/downloads/packages/). +- `releng` - _Abbreviation for **Rel**ease **Eng**ineering, contains important configuration_ + - **net.mograsim.configuration**
This contains the configuration for the + Mograsim project and the build in particular. The central Maven configuration + is located here in a single `pom.xml`, that is the super-parent of all others, + including the generated ones. + - **net.mograsim.updatesite**
This updatesite project collects features + in form of an update site that can be accessed by Eclipse to install new features + or update features. The features are grouped into categories which can come + with further descriptions. The `target/repository/` is the part of the whole + Mograsim project that actually gets deployed. By using Help -> Install New + Software -> Add -> Local, the `repository`-folder can be selected and features + can be installed offline, e.g. to test them. + - **net.mograsim.target**
The target definition for the build. This is a + well-defined environment that we expect the plugins to work in/with. That includes + all plugin dependencies (like all plugins the Eclipse Platform is comprised + of) and the (minimum) JRE that is expected. Some plugins exclusively for testing + are included here, too. +- `tests` - _This contains (integration-like) tests in form of plugin fragments_ + - **net.mograsim.logic.tests** + - **net.mograsim.logic.model.am2900.tests** + - **net.mograsim.machine.tests** + +## Build Mograsim + +Use the main aggregator `pom.xml` next to this markdown file to build mograsim, take +care to use the correct JDK to run it (see Run Configuration). + +A short guide to the [Maven goals (Maven Lifecycle)](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html): +- The `clean` goal will remove all `target`-folders and other generated files like + flattened poms and polyglot build artifacts (all are listed in `.gitignore`). +- The `validate` goal is useful to simply check if the setup itself (Maven Tycho) + is ok and everything needed is available. +- The `integration-test` goal will run the test plugins, the `test` goal beforehand + **will not.** +- I recommend running `clean verify` or `verify`, this will do everything up to and + including the testing. + +Please note that Tycho 1.5.0 is not released yet, and thus requires a workaround. +More information can be found under [Maven Core Extension Problems](#mceps). + +## Challenges + +Not everything is as simple as it seems at first glance. + +### Maven Core Extension Problems + +The Tycho extra `tycho-pomless` is a Maven core extension allows for simpler structure +and less redundancy. Maven core extensions must be available at [the central maven repository](http://repo.maven.apache.org/maven2/) +(or already in the local repository), you cannot specify an alternative remote repository +in `.mvn/extensions.xml`. If a core extension cannot be resolved, you will get currently +(Maven 3.6.2) only a warning like + +> [WARNING] The POM for org.eclipse.tycho.extras:tycho-pomless:jar:1.5.0-SNAPSHOT is missing, no dependency information available + +This means that the extension was not found, and it cannot be used, which leads to +a failure later on. To get around that, create a dummy pom that only serves the purpose +to "request" and resolve the extension: + +```xml + + 4.0.0 + net.mograsim + net.mograsim.tycho-download + 1.0.0 + pom + + + + + tycho-snapshots + https://repo.eclipse.org/content/repositories/tycho-snapshots/ + + true + + + true + always + + + + + + + + org.eclipse.tycho.extras + tycho-pomless + 1.5.0-SNAPSHOT + + + + +``` +While that this is not the most compact way, it can be run by the developer and build +server equally easy and does not require special CLI knowledge. As developer, you +need to run that only once (in Eclipse: right click on pom.xml -> Run As -> Maven +clean). For continuous integration, you can insert one more line in the YAML (or +equivalent), like in our case ` - mvn $MAVEN_CLI_OPTS clean`. + +### Git Submodules + +Git submodules are a challenge with a tycho build, because the projects that reside +in it need to be build, too. But not only that, they need to use the same configuration +for the build, which is problematic if you do not have control over them. The solution +only exists with Tycho 1.5.0 (currently only as snapshot), where deep folder structures +are automatically scanned and poms get gnereated; not every folder requires an aggregator +pom. This however requires (at the moment) certain naming conventions (see section +on Tycho itself). + +In our case, [SWTHelper](https://github.com/Haspamelodica/SWTHelper) is a git submodule +containing several plain Java Eclipse projects with OSGi configuration (MANIFEST.MF), +which is the reason this works at all. Due to the naming conventions, the submodule +folder is named `bundles`. + +### Maven incompatibility + +Maven 3.6.2 is currently incompatible with Tycho <= 1.5.0. + +If you encounter + +> [FATAL] Non-readable POM "somepath"\tests\.polyglot.pom.tycho: input contained no data @ + +or + +> [FATAL] Non-readable POM "somepath"\bundles\net.mograsim.logic.core\.polyglot..META-INF_MANIFEST.MF: input contained no data @ + +make sure to use Maven 3.6.1 to fix that (this is the default Eclipse embedded Maven +at the moment). diff --git a/MAVEN-TYCHO-README.html b/MAVEN-TYCHO-README.html new file mode 100644 index 00000000..41829c29 --- /dev/null +++ b/MAVEN-TYCHO-README.html @@ -0,0 +1,251 @@ + + + + + + + + + +

Mograsim Development Environment

+

Mograsim Development Documentation Version 0.1 — 2019-09-13

+

A short guide to the Mograsim Maven Tycho configuration and Maven Tycho in general, +as well as some information on Eclipse Plugin Development and OSGi.

+

Maven Tycho

+

Maven Tycho is a plugin for +Maven that allows building Eclipse and OSGi Projects comfortably +and automatically using Maven.

+

Useful links:

+ +

OSGi

+

OSGi is a module system for Java (completely unrelated to the Java 9 Jigsaw module +system) that allows detailed control over modules, dependencies, versions and more. +The file associated with OSGi here is a specific MANIFEST.MF in the META-INF directory +of each project.

+

Roughly, an OSGi bundle has:

+ +

Eclipse Plugins

+ +

Mograsim Structure

+

The tree of Mograsim projects:

+ +

Build Mograsim

+

Use the main aggregator pom.xml next to this markdown file to build mograsim, take +care to use the correct JDK to run it (see Run Configuration).

+

A short guide to the Maven goals (Maven Lifecycle):

+ +

Please note that Tycho 1.5.0 is not released yet, and thus requires a workaround. +More information can be found under Maven Core Extension Problems.

+

Challenges

+

Not everything is as simple as it seems at first glance.

+

Maven Core Extension Problems

+

The Tycho extra tycho-pomless is a Maven core extension allows for simpler structure +and less redundancy. Maven core extensions must be available at the central maven repository +(or already in the local repository), you cannot specify an alternative remote repository +in .mvn/extensions.xml. If a core extension cannot be resolved, you will get currently +(Maven 3.6.2) only a warning like

+

[WARNING] The POM for org.eclipse.tycho.extras:tycho-pomless:jar:1.5.0-SNAPSHOT is missing, no dependency information available

+
+

This means that the extension was not found, and it cannot be used, which leads to +a failure later on. To get around that, create a dummy pom that only serves the purpose +to “request” and resolve the extension:

+
<project .. bla .. bla ..>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>net.mograsim</groupId>
+    <artifactId>net.mograsim.tycho-download</artifactId>
+    <version>1.0.0</version>
+    <packaging>pom</packaging>
+
+    <pluginRepositories>
+        <!-- currently necessary because we are using a SNAPSHOT build of tycho -->
+        <pluginRepository>
+            <id>tycho-snapshots</id>
+            <url>https://repo.eclipse.org/content/repositories/tycho-snapshots/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <build>
+        <extensions>
+            <extension>
+                <groupId>org.eclipse.tycho.extras</groupId>
+                <artifactId>tycho-pomless</artifactId>
+                <version>1.5.0-SNAPSHOT</version>
+            </extension>
+        </extensions>
+    </build>
+</project>
+
+

While that this is not the most compact way, it can be run by the developer and build +server equally easy and does not require special CLI knowledge. As developer, you +need to run that only once (in Eclipse: right click on pom.xml -> Run As -> Maven +clean). For continuous integration, you can insert one more line in the YAML (or +equivalent), like in our case - mvn $MAVEN_CLI_OPTS clean.

+

Git Submodules

+

Git submodules are a challenge with a tycho build, because the projects that reside +in it need to be build, too. But not only that, they need to use the same configuration +for the build, which is problematic if you do not have control over them. The solution +only exists with Tycho 1.5.0 (currently only as snapshot), where deep folder structures +are automatically scanned and poms get gnereated; not every folder requires an aggregator +pom. This however requires (at the moment) certain naming conventions (see section +on Tycho itself).

+

In our case, SWTHelper is a git submodule +containing several plain Java Eclipse projects with OSGi configuration (MANIFEST.MF), +which is the reason this works at all. Due to the naming conventions, the submodule +folder is named bundles.

+

Maven incompatibility

+

Maven 3.6.2 is currently incompatible with Tycho <= 1.5.0.

+

If you encounter

+

[FATAL] Non-readable POM “somepath”\tests.polyglot.pom.tycho: input contained no data @

+
+

or

+

[FATAL] Non-readable POM “somepath”\bundles\net.mograsim.logic.core.polyglot..META-INF_MANIFEST.MF: input contained no data @

+
+

make sure to use Maven 3.6.1 to fix that (this is the default Eclipse embedded Maven +at the moment).

+ + \ No newline at end of file diff --git a/SWTHelper b/SWTHelper deleted file mode 160000 index 78574589..00000000 --- a/SWTHelper +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7857458991642e998c691d9b65d5a9bf7f7bbfae diff --git a/SWTHelper/bundles b/SWTHelper/bundles new file mode 160000 index 00000000..78574589 --- /dev/null +++ b/SWTHelper/bundles @@ -0,0 +1 @@ +Subproject commit 7857458991642e998c691d9b65d5a9bf7f7bbfae diff --git a/SWTHelper/pom.xml b/SWTHelper/pom.xml new file mode 100644 index 00000000..c583e163 --- /dev/null +++ b/SWTHelper/pom.xml @@ -0,0 +1,17 @@ + + 4.0.0 + net.mograsim.swthelper + pom + + + net.mograsim + net.mograsim + ${revision}${changelist} + + + + bundles + + \ No newline at end of file diff --git a/TempMavenTychoSnapshotWorkaround/.project b/TempMavenTychoSnapshotWorkaround/.project new file mode 100644 index 00000000..872cf5e6 --- /dev/null +++ b/TempMavenTychoSnapshotWorkaround/.project @@ -0,0 +1,17 @@ + + + TempMavenTychoSnapshotWorkaround + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/TempMavenTychoSnapshotWorkaround/pom.xml b/TempMavenTychoSnapshotWorkaround/pom.xml new file mode 100644 index 00000000..8c6713f0 --- /dev/null +++ b/TempMavenTychoSnapshotWorkaround/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + net.mograsim + net.mograsim.tycho-download + 1.0.0 + pom + + + + + + + tycho-snapshots + https://repo.eclipse.org/content/repositories/tycho-snapshots/ + + true + + + true + always + + + + + + + + org.eclipse.tycho.extras + tycho-pomless + 1.5.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/features/net.mograsim.feature/.project b/features/net.mograsim.feature/.project new file mode 100644 index 00000000..254cd9e2 --- /dev/null +++ b/features/net.mograsim.feature/.project @@ -0,0 +1,21 @@ + + + net.mograsim.feature + + + net.mograsim.logic.model.am2900 + net.mograsim.plugin.branding + net.mograsim.plugin.core + net.mograsim.plugin.docs + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/features/net.mograsim.feature/.settings/org.eclipse.core.resources.prefs b/features/net.mograsim.feature/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/features/net.mograsim.feature/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/features/net.mograsim.feature/build.properties b/features/net.mograsim.feature/build.properties new file mode 100644 index 00000000..64f93a9f --- /dev/null +++ b/features/net.mograsim.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/features/net.mograsim.feature/feature.xml b/features/net.mograsim.feature/feature.xml new file mode 100644 index 00000000..7e121014 --- /dev/null +++ b/features/net.mograsim.feature/feature.xml @@ -0,0 +1,770 @@ + + + + + Mograsim - Modular Graphical Simulator + +For teaching microprogramming, ISAs and circuit logic at the Technical University of Munich (TUM). +By Christian Femers, Daniel Kirschten and Fabian Stemmler + + + + Copyright (c) 2019 Christian Femers, Daniel Kirschten and Fabian Stemmler + +This program and the accompanying materials are made +available under the terms of the Eclipse Public License 2.0 +which is available at https://www.eclipse.org/legal/epl-2.0/ + +This Source Code may also be made available under the following Secondary +Licenses when the conditions for such availability set forth in the Eclipse +Public License, v. 2.0 are satisfied: GNU General Public License, version 2 +with the GNU Classpath Exception which is +available at https://www.gnu.org/software/classpath/license.html. + +SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + + + + This program and the accompanying materials are made available under the +terms of the Eclipse Public License 2.0 which is available at +http://www.eclipse.org/legal/epl-2.0, or GNU General Public License, +version 2 with the GNU Classpath Exception which is available at +https://www.gnu.org/software/classpath/license.html. + +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/features/net.mograsim.feature/sourceTemplateFeature/.gitkeep b/features/net.mograsim.feature/sourceTemplateFeature/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/net.mograsim.logic.core/.classpath b/net.mograsim.logic.core/.classpath deleted file mode 100644 index da70a87e..00000000 --- a/net.mograsim.logic.core/.classpath +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.logic.core/.gitignore b/net.mograsim.logic.core/.gitignore deleted file mode 100644 index 265a1ae2..00000000 --- a/net.mograsim.logic.core/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/bin/ -*.log - -# package files -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# vm crash logs -hs_err_pid* \ No newline at end of file diff --git a/net.mograsim.logic.core/.project b/net.mograsim.logic.core/.project deleted file mode 100644 index 2f347c0a..00000000 --- a/net.mograsim.logic.core/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - net.mograsim.logic.core - - - net.mograsim.preferences - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs b/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index e5f98893..00000000 --- a/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,468 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 94658822..00000000 --- a/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=false -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true -sp_cleanup.correct_indentation=true -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=true -sp_cleanup.never_use_blocks=true -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=true -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=true -sp_cleanup.remove_redundant_semicolons=true -sp_cleanup.remove_redundant_type_arguments=true -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=true -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=true -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=true -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.logic.core/META-INF/MANIFEST.MF b/net.mograsim.logic.core/META-INF/MANIFEST.MF deleted file mode 100644 index 2aff2ab9..00000000 --- a/net.mograsim.logic.core/META-INF/MANIFEST.MF +++ /dev/null @@ -1,15 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %Bundle-Name -Bundle-SymbolicName: net.mograsim.logic.core -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.logic.core, - net.mograsim.logic.core.components, - net.mograsim.logic.core.components.gates, - net.mograsim.logic.core.timeline, - net.mograsim.logic.core.types, - net.mograsim.logic.core.wires -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Automatic-Module-Name: net.mograsim.logic.core -Bundle-Vendor: Mograsim Team -Require-Bundle: net.mograsim.preferences;bundle-version="0.1.0" diff --git a/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties b/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties deleted file mode 100644 index 8ea411e4..00000000 --- a/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Properties file for net.mograsim.logic.core -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim logic core \ No newline at end of file diff --git a/net.mograsim.logic.core/build.properties b/net.mograsim.logic.core/build.properties deleted file mode 100644 index d6642e65..00000000 --- a/net.mograsim.logic.core/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - .,\ - OSGI-INF/ diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java deleted file mode 100644 index 3a51c27c..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.mograsim.logic.core; - -public interface LogicObservable -{ - public void registerObserver(LogicObserver ob); - - public void deregisterObserver(LogicObserver ob); - - public void notifyObservers(); - -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java deleted file mode 100644 index 259fe4d7..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.mograsim.logic.core; - -@FunctionalInterface -public interface LogicObserver -{ - public void update(LogicObservable initiator); -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java deleted file mode 100644 index c82f2b37..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.logic.core.components; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; - -/** - * A basic component that recomputes all outputs (with a delay), when it is updated. - * - * @author Fabian Stemmler - */ -public abstract class BasicCoreComponent extends CoreComponent implements LogicObserver -{ - private int processTime; - - /** - * - * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed. - * - * @author Fabian Stemmler - */ - public BasicCoreComponent(Timeline timeline, int processTime) - { - super(timeline); - this.processTime = processTime > 0 ? processTime : 1; - } - - @Override - public final void update(LogicObservable initiator) - { - update(); - } - - public void update() - { - TimelineEventHandler delayedUpdates = compute(); - if (delayedUpdates != null) - timeline.addEvent(delayedUpdates, processTime); - } - - protected abstract TimelineEventHandler compute(); -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java deleted file mode 100644 index 345bc0ab..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreBitDisplay extends BasicCoreComponent implements LogicObservable -{ - private Collection observers; - private final ReadEnd in; - private BitVector displayedValue; - - public CoreBitDisplay(Timeline timeline, ReadEnd in) - { - super(timeline, 1); - observers = new ArrayList<>(); - this.in = in; - in.registerObserver(this); - compute(); - } - - @Override - protected TimelineEventHandler compute() - { - BitVector newValues = in.getValues(); - return e -> - { - displayedValue = newValues; - notifyObservers(); - }; - } - - public BitVector getDisplayedValue() - { - return displayedValue; - } - - public boolean isDisplaying(Bit... values) - { - return displayedValue.equals(BitVector.of(values)); - } - - @Override - public List getAllInputs() - { - return List.of(in); - } - - @Override - public List getAllOutputs() - { - return List.of(); - } - - @Override - public void registerObserver(LogicObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(LogicObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers() - { - observers.forEach(ob -> ob.update(this)); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java deleted file mode 100644 index 0cccdfdd..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.Collection; -import java.util.HashSet; -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEvent; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreClock extends CoreComponent implements TimelineEventHandler, LogicObservable -{ - private Collection observers; - private boolean toggle = false; - private ReadWriteEnd out; - private int delta; - - /** - * - * @param out {@link CoreWire} the clock's impulses are fed into - * @param delta ticks between rising and falling edge - */ - public CoreClock(Timeline timeline, ReadWriteEnd out, int delta) - { - super(timeline); - this.delta = delta; - this.out = out; - this.observers = new HashSet<>(); - addToTimeline(); - } - - @Override - public void handle(TimelineEvent e) - { - addToTimeline(); - out.feedSignals(toggle ? Bit.ONE : Bit.ZERO); - toggle = !toggle; - notifyObservers(); - } - - public ReadWriteEnd getOut() - { - return out; - } - - public boolean isOn() - { - return !toggle; - } - - private void addToTimeline() - { - timeline.addEvent(this, delta); - } - - @Override - public List getAllInputs() - { - return List.of(); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } - - @Override - public void registerObserver(LogicObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(LogicObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers() - { - observers.forEach(ob -> ob.update(this)); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java deleted file mode 100644 index 734f48de..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public abstract class CoreComponent -{ - protected Timeline timeline; - - public CoreComponent(Timeline timeline) - { - this.timeline = timeline; - } - - /** - * Returns immutable list of all inputs to the {@link CoreComponent} (including e.g. the select bits to a MUX). Intended for - * visualization in the UI. - */ - public abstract List getAllInputs(); - - /** - * Returns immutable list of all outputs to the {@link CoreComponent}. Intended for visualization in the UI. - */ - public abstract List getAllOutputs(); -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java deleted file mode 100644 index 8f4fe428..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java +++ /dev/null @@ -1,92 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -/** - * Models a multiplexer. Takes an arbitrary amount of input {@link CoreWire}s, one of which, as determined by select, is put through to the - * output. - * - * @author Fabian Stemmler - * - */ -public class CoreDemux extends BasicCoreComponent -{ - private final ReadEnd select, in; - private final ReadWriteEnd[] outputs; - private final int outputSize; - private int selected = -1; - - /** - * Output {@link CoreWire}s and in must be of uniform width - * - * @param in Must be of uniform width with all outputs. - * @param select Indexes the output array to which the input is mapped. Must have enough bits to index all outputs. - * @param outputs One of these outputs receives the input signal, depending on the select bits - */ - public CoreDemux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs) - { - super(timeline, processTime); - outputSize = in.width(); - - this.in = in; - this.outputs = outputs; - for (int i = 0; i < this.outputs.length; i++) - { - if (outputs[i].width() != outputSize) - throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform width!"); - this.outputs[i] = outputs[i]; - } - - this.select = select; - select.registerObserver(this); - - int maxInputs = 1 << select.width(); - if (this.outputs.length > maxInputs) - throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by " - + select.width() + " select bits (" + maxInputs + ")."); - in.registerObserver(this); - } - - @Override - public TimelineEventHandler compute() - { - int selectValue = select.getValues().isBinary() ? (int) select.getValues().getUnsignedValueLong() : -1; - if (selectValue >= outputs.length) - selectValue = -1; - - boolean hasOldSelection = selected != selectValue && selected != -1; - int oldSelection = selected; - boolean hasNewSelection = selectValue != -1; - int newSelection = selectValue; - BitVector inputValues = in.getValues(); - - selected = selectValue; - - return e -> - { - if (hasOldSelection) - outputs[oldSelection].clearSignals(); - if (hasNewSelection) - outputs[newSelection].feedSignals(inputValues); - }; - } - - @Override - public List getAllInputs() - { - return List.of(in, select); - } - - @Override - public List getAllOutputs() - { - return List.of(outputs); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java deleted file mode 100644 index b7e5d3a6..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -/** - * This class models a simple on/off (ONE/ZERO) switch for user interaction. - * - * @author Christian Femers - * - */ -public class CoreManualSwitch extends CoreComponent implements LogicObservable -{ - private Collection observers; - private ReadWriteEnd output; - private BitVector inputValues; - - public CoreManualSwitch(Timeline timeline, ReadWriteEnd output) - { - super(timeline); - observers = new ArrayList<>(); - this.output = output; - this.inputValues = output.getInputValues(); - } - - public void switchFullOn() - { - setState(BitVector.of(Bit.ONE, output.width())); - } - - public void switchFullOff() - { - setState(BitVector.of(Bit.ZERO, output.width())); - } - - public void toggle() - { - if (isFullOn()) - switchFullOff(); - else - switchFullOn(); - } - - public void setState(Bit bit) - { - setState(BitVector.of(bit)); - } - - public void setState(BitVector bits) - { - if (bits.length() != output.width()) - throw new IllegalArgumentException("Incorrect bit vector length"); - if (bits.equals(inputValues)) - return; - inputValues = bits; - output.feedSignals(bits); - notifyObservers(); - } - - public boolean isFullOn() - { - return BitVector.of(Bit.ONE, output.width()).equals(output.getInputValues()); - } - - public BitVector getValues() - { - return inputValues; - } - - @Override - public List getAllInputs() - { - return List.of(); - } - - @Override - public List getAllOutputs() - { - return List.of(output); - } - - @Override - public void registerObserver(LogicObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(LogicObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers() - { - observers.forEach(ob -> ob.update(this)); - } - -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java deleted file mode 100644 index 5b4220a5..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java +++ /dev/null @@ -1,96 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -/** - * Models a multiplexer. Takes an arbitrary amount of input {@link CoreWire}s, one of which, as determined by select, is put through to the - * output. - * - * @author Fabian Stemmler - * - */ -public class CoreMux extends BasicCoreComponent -{ - private ReadEnd select; - private ReadWriteEnd out; - private ReadEnd[] inputs; - private final int outputSize; - - /** - * Input {@link CoreWire}s and out must be of uniform width - * - * @param out Must be of uniform width with all inputs. - * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs. - * @param inputs One of these inputs is mapped to the output, depending on the select bits - */ - public CoreMux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs) - { - super(timeline, processTime); - outputSize = out.width(); - - this.inputs = inputs.clone(); - for (int i = 0; i < this.inputs.length; i++) - { - if (inputs[i].width() != outputSize) - throw new IllegalArgumentException("All MUX wire arrays must be of uniform width!"); - inputs[i].registerObserver(this); - } - - this.select = select; - select.registerObserver(this); - - int maxInputs = 1 << select.width(); - if (this.inputs.length > maxInputs) - throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by " - + select.width() + " select bits (" + maxInputs + ")."); - - this.out = out; - } - - public ReadEnd getOut() - { - return out; - } - - public ReadEnd getSelect() - { - return select; - } - - @Override - public TimelineEventHandler compute() - { - int selectValue; - if (!select.getValues().isBinary() || (selectValue = (int) select.getValues().getUnsignedValueLong()) >= inputs.length) - { - return e -> out.clearSignals(); - } - - BitVector activeValues = inputs[selectValue].getValues(); - return e -> out.feedSignals(activeValues); - } - - @Override - public List getAllInputs() - { - ArrayList wires = new ArrayList<>(Arrays.asList(inputs)); - wires.add(select); - return Collections.unmodifiableList(wires); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java deleted file mode 100644 index 4b7a339f..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreTriStateBuffer extends BasicCoreComponent -{ - ReadEnd in, enable; - ReadWriteEnd out; - - public CoreTriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable) - { - super(timeline, processTime); - if (in.width() != out.width()) - throw new IllegalArgumentException( - "Tri-state output must have the same amount of bits as the input. Input: " + in.width() + " Output: " + out.width()); - if (enable.width() != 1) - throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.width() + "."); - this.in = in; - in.registerObserver(this); - this.enable = enable; - enable.registerObserver(this); - this.out = out; - } - - @Override - protected TimelineEventHandler compute() - { - if (enable.getValue() == Bit.ONE) - { - BitVector inValues = in.getValues(); - return e -> out.feedSignals(inValues); - } - return e -> out.clearSignals(); - } - - @Override - public List getAllInputs() - { - return List.of(in, enable); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } - -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java deleted file mode 100644 index 6e6b0f15..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreUnidirectionalMerger extends CoreComponent implements LogicObserver -{ - private ReadWriteEnd out; - private ReadEnd[] inputs; - private int[] beginningIndex; - - /** - * - * @param union The output of merging n {@link CoreWire}s into one. Must have width = a1.width() + a2.width() + ... + an.width(). - * @param inputs The inputs to be merged into the union - */ - public CoreUnidirectionalMerger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs) - { - super(timeline); - this.inputs = inputs; - this.out = union; - this.beginningIndex = new int[inputs.length]; - - int width = 0; - for (int i = 0; i < inputs.length; i++) - { - beginningIndex[i] = width; - width += inputs[i].width(); - inputs[i].registerObserver(this); - } - - if (width != union.width()) - throw new IllegalArgumentException( - "The output of merging n WireArrays into one must have width = a1.width() + a2.width() + ... + an.width()."); - } - - public ReadEnd getInput(int index) - { - return inputs[index]; - } - - public ReadEnd getUnion() - { - return out; - } - - @Override - public void update(LogicObservable initiator) - { - int index = find(initiator); - int beginning = beginningIndex[index]; - out.feedSignals(beginning, inputs[index].getValues()); - } - - private int find(LogicObservable r) - { - for (int i = 0; i < inputs.length; i++) - if (inputs[i] == r) - return i; - return -1; - } - - public ReadEnd[] getInputs() - { - return inputs.clone(); - } - - @Override - public List getAllInputs() - { - return List.of(inputs); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java deleted file mode 100644 index d77e1541..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreUnidirectionalSplitter extends CoreComponent implements LogicObserver -{ - private ReadEnd input; - private ReadWriteEnd[] outputs; - - public CoreUnidirectionalSplitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs) - { - super(timeline); - this.input = input; - this.outputs = outputs; - input.registerObserver(this); - int width = 0; - for (ReadEnd out : outputs) - width += out.width(); - - if (input.width() != width) - throw new IllegalArgumentException( - "The input of splitting one into n WireArrays must have width = a1.width() + a2.width() + ... + an.width()."); - } - - protected void compute() - { - BitVector inputBits = input.getValues(); - int startIndex = 0; - for (int i = 0; i < outputs.length; i++) - { - outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].width())); - startIndex += outputs[i].width(); - } - } - - @Override - public void update(LogicObservable initiator) - { - compute(); - } - - @Override - public List getAllInputs() - { - return List.of(input); - } - - @Override - public List getAllOutputs() - { - return List.of(outputs); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java deleted file mode 100644 index d71e08e1..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreAndGate extends MultiInputCoreGate -{ - public CoreAndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::and, out, in); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java deleted file mode 100644 index e847d0ec..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreNandGate extends MultiInputCoreGate -{ - public CoreNandGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::and, true, out, in); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java deleted file mode 100644 index 12336274..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreNorGate extends MultiInputCoreGate -{ - public CoreNorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::or, true, out, in); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java deleted file mode 100644 index b7808be9..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import java.util.List; - -import net.mograsim.logic.core.components.BasicCoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreNotGate extends BasicCoreComponent -{ - private ReadEnd in; - private ReadWriteEnd out; - - public CoreNotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out) - { - super(timeline, processTime); - this.in = in; - in.registerObserver(this); - this.out = out; - } - - @Override - protected TimelineEventHandler compute() - { - BitVector values = in.getValues().not(); - return e -> out.feedSignals(values); - } - - public ReadEnd getIn() - { - return in; - } - - public ReadEnd getOut() - { - return out; - } - - @Override - public List getAllInputs() - { - return List.of(in); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java deleted file mode 100644 index 97d75c80..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreOrGate extends MultiInputCoreGate -{ - public CoreOrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::or, out, in); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java deleted file mode 100644 index 8bc98934..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -/** - * Outputs 1 when the number of 1 inputs is odd. - * - * @author Fabian Stemmler - */ -public class CoreXorGate extends MultiInputCoreGate -{ - public CoreXorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::xor, out, in); - } - -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java deleted file mode 100644 index 010ae74f..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import java.util.List; - -import net.mograsim.logic.core.components.BasicCoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.types.MutationOperation; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public abstract class MultiInputCoreGate extends BasicCoreComponent -{ - protected ReadEnd[] in; - protected ReadWriteEnd out; - protected final int width; - protected MutationOperation op; - protected boolean invert = false; - - protected MultiInputCoreGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime); - this.op = op; - width = out.width(); - this.in = in.clone(); - if (in.length < 1) - throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length)); - for (ReadEnd w : in) - { - if (w.width() != width) - throw new IllegalArgumentException("All wires connected to the gate must be of uniform length."); - w.registerObserver(this); - } - this.out = out; - } - - protected MultiInputCoreGate(Timeline timeline, int processTime, MutationOperation op, boolean invert, ReadWriteEnd out, ReadEnd... in) - { - this(timeline, processTime, op, out, in); - this.invert = invert; - } - - @Override - public List getAllInputs() - { - return List.of(in); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } - - @Override - public TimelineEventHandler compute() - { - BitVectorMutator mutator = BitVectorMutator.empty(); - for (ReadEnd w : in) - op.apply(mutator, w.getValues()); - return e -> out.feedSignals(invert ? mutator.toBitVector().not() : mutator.toBitVector()); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java deleted file mode 100644 index 9dbc31d4..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java +++ /dev/null @@ -1,256 +0,0 @@ -package net.mograsim.logic.core.timeline; - -import java.util.ArrayList; -import java.util.List; -import java.util.PriorityQueue; -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; -import java.util.function.LongSupplier; - -/** - * Orders Events by the time they are due to be executed. Can execute Events individually. - * - * @author Fabian Stemmler - * - */ -public class Timeline -{ - private PriorityQueue events; - private LongSupplier time; - private long lastTimeUpdated = 0; - private long eventCounter = 0; - - private final List> eventAddedListener; - - public final LongSupplier stepByStepExec = () -> lastTimeUpdated; - public final LongSupplier realTimeExec = () -> System.currentTimeMillis(); - - /** - * Constructs a Timeline object. Per default the time function is set to step by step execution. - * - * @param initCapacity The initial capacity of the event queue. - */ - public Timeline(int initCapacity) - { - events = new PriorityQueue<>(initCapacity); - eventAddedListener = new ArrayList<>(); - time = stepByStepExec; - } - - /** - * @param timestamp exclusive - * @return true if the first event in queue is later than the given timestamp - */ - public BooleanSupplier laterThan(long timestamp) - { - return () -> timeCmp(events.peek().getTiming(), timestamp) > 0; - } - - /** - * @return true if there is at least one event enqueued. false otherwise - */ - public boolean hasNext() - { - return !events.isEmpty(); - } - - /** - * Executes all events at the next timestamp, at which there are any - */ - public void executeNext() - { - InnerEvent first = events.peek(); - if (first != null) - executeUntil(laterThan(first.getTiming()), -1); - } - - /** - * Executes all events enqueued in the {@link Timeline}. Use very carefully! Events may generate new events, causing an infinite loop. - */ - public void executeAll() - { - while (hasNext()) - executeNext(); - } - - /** - * Executes all events until a given condition is met. The simulation process can be constrained by a real world timestamp. - * - * @param condition the condition until which the events are be processed - * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout. - * @return State of the event execution - * @formatter:off - * NOTHING_DONE if the {@link Timeline} was already empty - * EXEC_OUT_OF_TIME if the given maximum time was reached - * EXEC_UNTIL_CONDITION if the condition was met - * EXEC_UNTIL_EMPTY if events were executed until the {@link Timeline} was empty - * @formatter:on - */ - public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis) - { - if (events.isEmpty()) - { - lastTimeUpdated = getSimulationTime(); - return ExecutionResult.NOTHING_DONE; - } - int checkStop = 0; - while (hasNext() && !condition.getAsBoolean()) - { - InnerEvent event; - synchronized (events) - { - event = events.remove(); - } - lastTimeUpdated = event.getTiming(); - event.run(); - // Don't check after every run - checkStop = (checkStop + 1) % 10; - if (checkStop == 0 && System.currentTimeMillis() >= stopMillis) - return ExecutionResult.EXEC_OUT_OF_TIME; - } - lastTimeUpdated = getSimulationTime(); - return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION; - } - - /** - * Sets the function, which defines the current simulation time at any time. - * - * @param time The return value of calling this function is the current simulation time. - */ - public void setTimeFunction(LongSupplier time) - { - this.time = time; - } - - /** - * Calculates the current simulation time. - * - * @return The simulation time as defined by the time function. - */ - public long getSimulationTime() - { - return time.getAsLong(); - } - - /** - * Retrieves the timestamp of the next event. - * - * @return The timestamp of the next enqueued event, if the {@link Timeline} is not empty, -1 otherwise. - */ - public long nextEventTime() - { - if (!hasNext()) - return -1; - return events.peek().getTiming(); - } - - /** - * Clears the {@link Timeline} of enqueued events. - */ - public void reset() - { - synchronized (events) - { - events.clear(); - } - lastTimeUpdated = 0; - } - - /** - * Adds a listener, that is called when a {@link TimelineEvent} is added. - */ - public void addEventAddedListener(Consumer listener) - { - eventAddedListener.add(listener); - } - - /** - * Removes the listener, if possible. It will no longer be called when a {@link TimelineEvent} is added. - */ - public void removeEventAddedListener(Consumer listener) - { - eventAddedListener.remove(listener); - } - - /** - * Adds an Event to the {@link Timeline} - * - * @param function The {@link TimelineEventHandler} that will be executed, when the {@link InnerEvent} occurs on the timeline. - * @param relativeTiming The amount of MI ticks in which the {@link InnerEvent} is called, starting from the current time. - */ - public void addEvent(TimelineEventHandler function, int relativeTiming) - { - long timing = getSimulationTime() + relativeTiming; - TimelineEvent event = new TimelineEvent(timing); - synchronized (events) - { - events.add(new InnerEvent(function, event, eventCounter++)); - } - eventAddedListener.forEach(l -> l.accept(event)); - } - - private class InnerEvent implements Runnable, Comparable - { - private final TimelineEventHandler function; - private final TimelineEvent event; - private final long id; - - /** - * Creates an {@link InnerEvent} - * - * @param function {@link TimelineEventHandler} to be executed when the {@link InnerEvent} occurs - * @param timing Point in the MI simulation {@link Timeline}, at which the {@link InnerEvent} is executed; - */ - InnerEvent(TimelineEventHandler function, TimelineEvent event, long id) - { - this.function = function; - this.event = event; - this.id = id; - } - - public long getTiming() - { - return event.getTiming(); - } - - @Override - public void run() - { - function.handle(event); - } - - @Override - public String toString() - { - return event.toString(); - } - - @Override - public int compareTo(InnerEvent o) - { - int c1; - return (c1 = timeCmp(getTiming(), o.getTiming())) == 0 ? timeCmp(id, o.id) : c1; - } - } - - public static int timeCmp(long a, long b) - { - return Long.signum(a - b); - } - - @Override - public String toString() - { - String eventsString; - synchronized (events) - { - eventsString = events.toString(); - } - return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, eventsString); - } - - public enum ExecutionResult - { - NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME - } -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java deleted file mode 100644 index c46e6ad6..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.mograsim.logic.core.timeline; - -/** - * A class that stores all relevant information about an event in the {@link Timeline}. Currently, there is not much relevant information to - * store. - * - * @author Fabian Stemmler - * - */ -public class TimelineEvent -{ - private final long timing; - - TimelineEvent(long timing) - { - super(); - this.timing = timing; - } - - public long getTiming() - { - return timing; - } - - @Override - public String toString() - { - return "timestamp: " + timing; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java deleted file mode 100644 index badbabcb..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.mograsim.logic.core.timeline; - -@FunctionalInterface -public interface TimelineEventHandler -{ - public void handle(TimelineEvent e); -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java deleted file mode 100644 index 752fbb80..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java +++ /dev/null @@ -1,181 +0,0 @@ -package net.mograsim.logic.core.types; - -import java.util.Arrays; -import java.util.Map; -import java.util.Objects; - -/** - * stdlogic according to IEEE 1164 - */ -public enum Bit implements StrictLogicType -{ - U("U"), X("X"), ZERO("0"), ONE("1"), Z("Z"); - - private final String symbol; - - private Bit(String symbol) - { - this.symbol = symbol; - } - - /** - * Returns if the Bit is binary, this is only true for ZERO and ONE. - * - * @return true if and only if this == ONE || this == ZERO - */ - public boolean isBinary() - { - return this == ONE || this == ZERO; - } - - @Override - public Bit and(Bit other) - { - return fromTable(AND_TABLE, this, other); - } - - public static void and(Bit[] dst, Bit[] src) - { - for (int i = 0; i < dst.length; i++) - dst[i] = dst[i].and(src[i]); - } - - @Override - public Bit or(Bit other) - { - return fromTable(OR_TABLE, this, other); - } - - public static void or(Bit[] dst, Bit[] src) - { - for (int i = 0; i < dst.length; i++) - dst[i] = dst[i].or(src[i]); - } - - @Override - public Bit xor(Bit other) - { - return fromTable(XOR_TABLE, this, other); - } - - public static void xor(Bit[] dst, Bit[] src) - { - for (int i = 0; i < dst.length; i++) - dst[i] = dst[i].xor(src[i]); - } - - @Override - public Bit not() - { - switch (this) - { - case U: - return U; - case ONE: - return ZERO; - case ZERO: - return ONE; - default: - return X; - } - } - - public Bit[] makeArray(int length) - { - Bit[] bits = new Bit[length]; - Arrays.fill(bits, this); - return bits; - } - - public BitVector toVector() - { - return BitVector.of(this, 1); - } - - public BitVector toVector(int length) - { - return BitVector.of(this, length); - } - - @Override - public Bit join(Bit other) - { - return fromTable(JOIN_TABLE, this, other); - } - - public static void join(Bit[] dst, Bit[] src) - { - for (int i = 0; i < dst.length; i++) - dst[i] = dst[i].join(src[i]); - } - - @Override - public String toString() - { - return getSymbol(); - } - - public String getSymbol() - { - return symbol; - } - - public static Bit lastBitOf(int value) - { - return values()[2 + (value & 1)]; - } - - public static Bit of(boolean binaryValue) - { - return binaryValue ? ONE : ZERO; - } - - public static Bit parse(String s) - { - Bit bit = SYMBOL_MAP.get(s); - Objects.requireNonNull(bit, "No Bit found for symbol " + s); - return bit; - } - - public static Bit parse(String s, int symbolPosition) - { - return parse(s.substring(symbolPosition, symbolPosition + 1)); - } - - private static Bit fromTable(Bit[][] table, Bit a, Bit b) - { - return table[a.ordinal()][b.ordinal()]; - } - - static final Map SYMBOL_MAP = Map.of(U.symbol, U, X.symbol, X, ZERO.symbol, ZERO, ONE.symbol, ONE, Z.symbol, Z); - - // @formatter:off - private static final Bit[][] JOIN_TABLE = - { { U, U, U, U, U }, - { U, X, X, X, X }, - { U, X, ZERO, X, ZERO }, - { U, X, X, ONE, ONE }, - { U, X, ZERO, ONE, Z } }; - - private static final Bit[][] AND_TABLE = - { { U, U, ZERO, U, U }, - { U, X, ZERO, X, X }, - { ZERO, ZERO, ZERO, ZERO, ZERO }, - { U, X, ZERO, ONE, X }, - { U, X, ZERO, X, X } }; - - private static final Bit[][] OR_TABLE = - { { U, U, U, ONE, U }, - { U, X, X, ONE, X }, - { U, X, ZERO, ONE, X }, - { ONE, ONE, ONE, ONE, ONE }, - { U, X, X, ONE, X } }; - - private static final Bit[][] XOR_TABLE = - { { U, U, U, U, U }, - { U, X, X, X, X }, - { U, X, ZERO, ONE, X }, - { U, X, ONE, ZERO, X }, - { U, X, X, X, X } }; - // @formatter:on -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java deleted file mode 100644 index 13466949..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java +++ /dev/null @@ -1,530 +0,0 @@ -package net.mograsim.logic.core.types; - -import static java.lang.String.format; - -import java.math.BigInteger; -import java.util.Arrays; -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.RandomAccess; -import java.util.function.BinaryOperator; -import java.util.function.UnaryOperator; - -/** - * Immutable class representing a {@link Bit}Vector - * - * @author Christian Femers - * - */ -public final class BitVector implements StrictLogicType, Iterable, RandomAccess -{ - public static final BitVector SINGLE_U = new BitVector(Bit.U); - public static final BitVector SINGLE_X = new BitVector(Bit.X); - public static final BitVector SINGLE_0 = new BitVector(Bit.ZERO); - public static final BitVector SINGLE_1 = new BitVector(Bit.ONE); - public static final BitVector SINGLE_Z = new BitVector(Bit.Z); - - private static final BitVector[] SINGLE_BIT_MAPPING = { SINGLE_U, SINGLE_X, SINGLE_0, SINGLE_1, SINGLE_Z }; - - private final Bit[] bits; - - private BitVector(Bit single) - { - Objects.requireNonNull(single); - bits = new Bit[] { single }; - } - - private BitVector(Bit[] bits) - { - this.bits = Objects.requireNonNull(bits); // do this first to "catch" bits==null before the foreach loop - for (Bit bit : bits) - if (bit == null) - throw new NullPointerException(); - } - - public static BitVector of(Bit... bits) - { - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].ordinal()]; - return new BitVector(bits.clone()); - } - - public static BitVector of(Bit bit, int length) - { - if (length == 1) - return SINGLE_BIT_MAPPING[bit.ordinal()]; - return new BitVector(bit.makeArray(length)); - } - - public static BitVector from(long value, int bits) - { - return from(BigInteger.valueOf(value), bits); - } - - public static BitVector from(BigInteger value, int bits) - { - Bit[] values = new Bit[bits]; - for (int i = 0; i < bits; i++) - values[bits - i - 1] = Bit.of(value.testBit(i)); - return new BitVector(values); - } - - public BitVectorMutator mutator() - { - return BitVectorMutator.of(this); - } - - /** - * Returns the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) - */ - public Bit getMSBit(int bitIndex) - { - return bits[bitIndex]; - } - - /** - * Returns the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) - */ - public Bit getLSBit(int bitIndex) - { - return bits[bits.length - bitIndex - 1]; - } - - public Bit[] getBits() - { - return bits.clone(); - } - - /** - * Checks if all bits are {@link Bit#isBinary() binary}. - * - * @see Bit#isBinary() - */ - public boolean isBinary() - { - for (int i = 0; i < bits.length; i++) - { - if (!bits[i].isBinary()) - return false; - } - return true; - } - - @Override - public BitVector join(BitVector t) - { - checkCompatibility(t); - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].join(t.bits[0]).ordinal()]; - return new BitVector(binOp(bits.clone(), t.bits, Bit::join)); - } - - @Override - public BitVector and(BitVector t) - { - checkCompatibility(t); - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].and(t.bits[0]).ordinal()]; - return new BitVector(binOp(bits.clone(), t.bits, Bit::and)); - } - - @Override - public BitVector or(BitVector t) - { - checkCompatibility(t); - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].or(t.bits[0]).ordinal()]; - return new BitVector(binOp(bits.clone(), t.bits, Bit::or)); - } - - @Override - public BitVector xor(BitVector t) - { - checkCompatibility(t); - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].xor(t.bits[0]).ordinal()]; - return new BitVector(binOp(bits.clone(), t.bits, Bit::xor)); - } - - @Override - public BitVector not() - { - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].not().ordinal()]; - return new BitVector(unOp(bits.clone(), Bit::not)); - } - - public int length() - { - return bits.length; - } - - public BitVector concat(BitVector other) - { - Bit[] newBits = Arrays.copyOf(bits, length() + other.length()); - System.arraycopy(other.bits, 0, newBits, length(), other.length()); - return new BitVector(newBits); - } - - public BitVector subVector(int start) - { - return new BitVector(Arrays.copyOfRange(bits, start, length())); - } - - public BitVector subVector(int start, int end) - { - return new BitVector(Arrays.copyOfRange(bits, start, end)); - } - - private void checkCompatibility(BitVector bv) - { - if (length() != bv.length()) - throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", length(), bv.length())); - } - - static Bit[] binOp(Bit[] dest, Bit[] second, BinaryOperator op) - { - if (dest == null) - return second.clone(); - for (int i = 0; i < dest.length; i++) - { - dest[i] = op.apply(dest[i], second[i]); - } - return dest; - } - - static Bit[] unOp(Bit[] dest, UnaryOperator op) - { - if (dest == null) - return null; - for (int i = 0; i < dest.length; i++) - { - dest[i] = op.apply(dest[i]); - } - return dest; - } - - /** - * Class for comfortable and efficient manipulation of {@link BitVector}s, similar to {@link StringBuilder} - * - * @author Christian Femers - */ - public static final class BitVectorMutator implements LogicType - { - private Bit[] bits; - - private BitVectorMutator(Bit[] bits) - { - this.bits = bits; - } - - static BitVectorMutator of(BitVector bv) - { - return new BitVectorMutator(bv.getBits()); - } - - /** - * Returns a new mutator of the specified length, with all bits set to null. Use with care! - */ - public static BitVectorMutator ofLength(int length) - { - return new BitVectorMutator(new Bit[length]); - } - - /** - * Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed. - *

- * An empty BitVectorMutator must not be converted to BitVector or used to manipulate single bits until at least one two - * operand logic operation is performed. - */ - public static BitVectorMutator empty() - { - return new BitVectorMutator(null); - } - - /** - * @see #empty() - */ - public boolean isEmpty() - { - return bits == null; - } - - /** - * Produces the resulting, immutable {@link BitVector}
- * - * @throws IllegalStateException if the mutator is (still) empty - */ - public BitVector toBitVector() - { - if (bits == null) - throw new IllegalStateException("cannot create a BitVector from an empty mutator"); - return new BitVector(bits); - } - - @Override - public BitVectorMutator join(BitVector t) - { - checkCompatibility(t); - bits = binOp(bits, t.bits, Bit::join); - return this; - } - - @Override - public BitVectorMutator and(BitVector t) - { - checkCompatibility(t); - bits = binOp(bits, t.bits, Bit::and); - return this; - } - - @Override - public BitVectorMutator or(BitVector t) - { - checkCompatibility(t); - bits = binOp(bits, t.bits, Bit::or); - return this; - } - - @Override - public BitVectorMutator xor(BitVector t) - { - checkCompatibility(t); - bits = binOp(bits, t.bits, Bit::xor); - return this; - } - - @Override - public BitVectorMutator not() - { - unOp(bits, Bit::not); - return this; - } - - /** - * Set the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) - */ - public void setMSBit(int bitIndex, Bit bit) - { - if (bits == null) - throw new IllegalStateException("cannot set a bit of an empty mutator"); - bits[bitIndex] = bit; - } - - /** - * Set the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) - */ - public void setLSBit(int bitIndex, Bit bit) - { - if (bits == null) - throw new IllegalStateException("cannot set a bit of an empty mutator"); - bits[bits.length - bitIndex - 1] = bit; - } - - /** - * Returns the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) - */ - public Bit getMSBit(int bitIndex) - { - if (bits == null) - throw new IllegalStateException("cannot get a bit of an empty mutator"); - return bits[bitIndex]; - } - - /** - * Returns the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) - */ - public Bit getLSBit(int bitIndex) - { - if (bits == null) - throw new IllegalStateException("cannot get a bit of an empty mutator"); - return bits[bits.length - bitIndex - 1]; - } - - public int length() - { - if (bits == null) - throw new IllegalStateException("cannot obtain a length of an empty mutator"); - return bits.length; - } - - private void checkCompatibility(BitVector bv) - { - if (bits != null && bits.length != bv.length()) - throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", bits.length, bv.length())); - } - } - - /** - * @see Arrays#hashCode(Object[]) - */ - @Override - public int hashCode() - { - return Arrays.hashCode(bits); - } - - /** - * Does test for equality of values/content - * - * @see Object#equals(Object) - */ - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof BitVector)) - return false; - BitVector other = (BitVector) obj; - return Arrays.equals(bits, other.bits); - } - - /** - * Does test for equality of values/content, shifting the other BitVector by offset to the right.
- * Therefore offset + other.length() <= this.wdith() needs to be true. - * - * @throws ArrayIndexOutOfBoundsException if offset + other.length() > this.length() - * - * @see Object#equals(Object) - */ - public boolean equalsWithOffset(BitVector other, int offset) - { - if (other == null) - return false; - return Arrays.equals(bits, offset, offset + other.length(), other.bits, 0, other.length()); - } - - /** - * All {@link Bit}s symbols concatenated together (MSB first) - * - * @see #parse(String) - */ - @Override - public String toString() - { - StringBuilder sb = new StringBuilder(bits.length); - for (Bit bit : bits) - sb.append(bit); - return sb.toString(); - } - - /** - * Returns the value of the BitVector as BigInteger. - * - * @throws NumberFormatException if the BitVector is not {@link #isBinary() binary}. - */ - public BigInteger getUnsignedValue() - { - if (!isBinary()) - throw new NumberFormatException(this + " is not binary"); - byte[] bytes = new byte[(bits.length / 8 + (bits.length % 8 == 0 ? 0 : 1)) + 1]; - for (int i = bits.length - 1; i >= 0; i--) - { - if (Bit.ONE == bits[bits.length - i - 1]) - { - try - { - bytes[bytes.length - (i / 8) - 1] |= 1 << (i % 8); - } - catch (IndexOutOfBoundsException e) - { - e.printStackTrace(); - } - } - } - return new BigInteger(bytes); - } - - public long getUnsignedValueLong() - { - return getUnsignedValue().longValue(); - } - - /** - * Returns the value of the BitVector as BigInteger interpreted as a two's complement number. - * - * @throws NumberFormatException if the BitVector is not {@link #isBinary() binary}. - * - * @author Daniel Kirschten - */ - public BigInteger getSignedValue() - { - BigInteger unsignedValue = getUnsignedValue(); - if (bits[bits.length - 1] == Bit.ZERO) - return unsignedValue; - return unsignedValue.subtract(BitVector.of(Bit.ONE, bits.length).getUnsignedValue()).subtract(BigInteger.ONE);// TODO speed this up! - } - - public long getSignedValueLong() - { - return getSignedValue().longValue(); - } - - /** - * Parses a String containing solely {@link Bit} symbols (MSB first) - * - * @see #toString() - */ - public static BitVector parse(String s) - { - Bit[] values = new Bit[s.length()]; - for (int i = 0; i < s.length(); i++) - { - values[i] = Bit.parse(s, i); - } - return new BitVector(values); - } - - /** - * Changes a single Bit using the given operation. This can be used to set, clear or flip bits. - * - * @param msbIndex index of the MSB to be changed - * @param singleBitOperation the operation to perform on that Bit - * @return the resulting, new BitVektor - */ - public BitVector withBitChanged(int msbIndex, UnaryOperator singleBitOperation) - { - Bit[] newBits = bits.clone(); - newBits[msbIndex] = singleBitOperation.apply(newBits[msbIndex]); - return new BitVector(newBits); - } - - /** - * Iterate over the {@link Bit}s of the BitVector from MSB to LSB (left to right). - */ - @Override - public Iterator iterator() - { - return new Iterator<>() - { - private int pos = 0; - - @Override - public Bit next() - { - if (!hasNext()) - throw new NoSuchElementException(); - return getMSBit(pos++); - } - - @Override - public boolean hasNext() - { - return pos != length(); - } - }; - } - - public BitVector reverse() - { - int length = length(); - Bit[] other = new Bit[length]; - for (int i = 0, j = length - 1; i < length; i++, j--) - { - other[i] = bits[j]; - } - return new BitVector(other); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java deleted file mode 100644 index 5f645a2e..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.mograsim.logic.core.types; - -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorDefinition.BuiltInColor; -import net.mograsim.preferences.Preferences; - -public class BitVectorFormatter -{ - public static String formatValueAsString(ReadEnd end) - { - return formatAsString(end == null ? null : end.getValues()); - } - - public static String formatAsString(BitVector bitVector) - { - if (bitVector == null) - return "null"; - return bitVector.toString(); - } - - // TODO doesn't this belong to logic.model? - public static ColorDefinition formatAsColor(ReadEnd end) - { - return formatAsColor(end == null ? null : end.getValues()); - } - - public static ColorDefinition formatAsColor(BitVector bitVector) - { - // TODO maybe find a color assignment for multiple-bit bit vectors? - if (bitVector == null || bitVector.length() != 1) - return new ColorDefinition(BuiltInColor.COLOR_BLACK); - switch (bitVector.getLSBit(0)) - { - case ONE: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.one"); - case U: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.u"); - case X: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.x"); - case Z: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.z"); - case ZERO: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.zero"); - default: - throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getLSBit(0)); - } - } - - private BitVectorFormatter() - { - throw new UnsupportedOperationException("No BitVectorFormatter instances"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java deleted file mode 100644 index 39ae6816..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.mograsim.logic.core.types; - -/** - * Interface for types that support the basic logic operations - * - * @author Christian Femers - * - * @param the logic type itself, to make the operations closed in T - * @param the operand type, may be the same as T, see {@link StrictLogicType} - */ -public interface LogicType, S> -{ - /** - * Determines the result when two signals meet each other directly, also called resolution (IEEE 1164) - * - * For example: - * - *

-	 * 0 joined 0 == 0
-	 * 1 joined 0 == X
-	 * 0 joined 1 == X
-	 * 1 joined 1 == 1
-	 * 
- * - * @param t the second logic signal - * @return the resulting value - * @author Christian Femers - */ - T join(S t); - - /** - * Classical logic AND - * - * For example: - * - *
-	 * 0 AND 0 == 0
-	 * 1 AND 0 == 0
-	 * 0 AND 1 == 0
-	 * 1 AND 1 == 1
-	 * 
- * - * @param t the second logic signal - * @return the resulting value - * @author Christian Femers - */ - T and(S t); - - /** - * Classical logic OR - * - * For example: - * - *
-	 * 0 OR 0 == 0
-	 * 1 OR 0 == 1
-	 * 0 OR 1 == 1
-	 * 1 OR 1 == 1
-	 * 
- * - * @param t the second logic signal - * @return the resulting value - * @author Christian Femers - */ - T or(S t); - - /** - * Classical logic XOR (exclusive OR) - * - * For example: - * - *
-	 * 0 XOR 0 == 0
-	 * 1 XOR 0 == 1
-	 * 0 XOR 1 == 1
-	 * 1 XOR 1 == 0
-	 * 
- * - * @param t the second logic signal - * @return the resulting value - * @author Christian Femers - */ - T xor(S t); - - /** - * Classical logic NOT (logical negation) - * - * For example: - * - *
-	 * NOT 0 == 1
-	 * NOT 1 == 0
-	 * 
- * - * @return the resulting value - * @author Christian Femers - */ - T not(); - - /** - * {@link #and(Object) AND} and then {@link #not() NOT} - * - * @author Christian Femers - */ - default T nand(S t) - { - return and(t).not(); - } - - /** - * {@link #or(Object) OR} and then {@link #not() NOT} - * - * @author Christian Femers - */ - default T nor(S t) - { - return or(t).not(); - } - - /** - * {@link #xor(Object) XOR} and then {@link #not() NOT}
- * Used to determine equality (alias parity, consistency) - * - * @author Christian Femers - */ - default T xnor(S t) - { - return xor(t).not(); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java deleted file mode 100644 index 1fdae21c..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.mograsim.logic.core.types; - -import java.util.function.BiFunction; - -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; - -@FunctionalInterface -public interface MutationOperation extends BiFunction -{ - // no changes necessary, only for convenience and readability -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java deleted file mode 100644 index c830b586..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.types; - -/** - * Interface for types that support the basic logic operations only among themselves, making it mathematically closed - * - * @author Christian Femers - * @see LogicType - * - * @param the logic type itself to make the operations closed - */ -public interface StrictLogicType> extends LogicType -{ - // this is just a matter of type parameters -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java deleted file mode 100644 index 13f54a01..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java +++ /dev/null @@ -1,662 +0,0 @@ -package net.mograsim.logic.core.wires; - -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.Z; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; - -/** - * Represents an array of wires that can store n bits of information. - * - * @author Fabian Stemmler - * - */ -public class CoreWire -{ - public final String name; - private BitVector cachedValues; - public final int travelTime; - private List attached = new ArrayList<>(); - public final int width; - List inputs = new ArrayList<>(); - Timeline timeline; - private Bit[] bitsWithoutFusions; - FusedBit[] fusedBits; - - public CoreWire(Timeline timeline, int width, int travelTime) - { - this(timeline, width, travelTime, null); - } - - public CoreWire(Timeline timeline, int width, int travelTime, String name) - { - if (width < 1) - throw new IllegalArgumentException( - String.format("Tried to create an array of wires with width %d, but a width of less than 1 makes no sense.", width)); - this.name = name; - this.timeline = timeline; - this.width = width; - this.travelTime = travelTime; - initValues(); - } - - private void initValues() - { - cachedValues = U.toVector(width); - bitsWithoutFusions = cachedValues.getBits(); - } - - private void setNewValues(BitVector newValues) - { - cachedValues = newValues; - notifyObservers(); - } - - private void invalidateCachedValuesForAllFusedWires() - { - invalidateCachedValues(); - if (fusedBits != null) - for (FusedBit fusion : fusedBits) - if (fusion != null) - fusion.invalidateCachedValuesForAllParticipatingWires(); - } - - private void invalidateCachedValues() - { - cachedValues = null; - notifyObservers(); - } - - void recalculateValuesWithoutFusions() - { - Bit[] bits = new Bit[width]; - if (inputs.isEmpty()) - Arrays.fill(bits, U); - else - { - System.arraycopy(inputs.get(0).getInputValues().getBits(), 0, bits, 0, width); - for (int i = 1; i < inputs.size(); i++) - Bit.join(bits, inputs.get(i).getInputValues().getBits()); - } - bitsWithoutFusions = bits; - if (fusedBits == null) - setNewValues(BitVector.of(bits)); - else - invalidateCachedValuesForAllFusedWires(); - } - - private void recalculatedCachedValues() - { - Bit[] bits; - if (fusedBits == null) - bits = bitsWithoutFusions; - else - { - bits = new Bit[width]; - for (int i = 0; i < width; i++) - { - FusedBit fusion = fusedBits[i]; - if (fusion == null) - bits[i] = bitsWithoutFusions[i]; - else - bits[i] = fusion.getValue(); - } - } - cachedValues = BitVector.of(bits); - } - - /** - * Forces a Wire to take on specific values. If the new values differ from the old ones, the observers of the Wire will be notified. - * WARNING! Use this with care! The preferred way of writing the values is ReadWriteEnd.feedSignals(BitVector) - * - * @param values The values the Wire will have immediately after this method is called - */ - public void forceValues(BitVector values) - { - bitsWithoutFusions = values.getBits(); - invalidateCachedValuesForAllFusedWires(); - notifyObservers(); - } - - /** - * Returns the least significant bit (LSB) - */ - public Bit getValue() - { - return getValue(0); - } - - /** - * Returns the least significant bit (LSB) of the given index - */ - public Bit getValue(int index) - { - return getValues().getLSBit(index); - } - - public BitVector getValues(int start, int end) - { - return getValues().subVector(start, end); - } - - public BitVector getValues() - { - if (cachedValues == null) - recalculatedCachedValues(); - return cachedValues; - } - - /** - * Adds an {@link LogicObserver}, who will be notified when the value of the {@link CoreWire} is updated. - * - * @param ob The {@link LogicObserver} to be notified of changes. - * @return true if the given {@link LogicObserver} was not already registered, false otherwise - * - * @author Fabian Stemmler - */ - boolean attachEnd(ReadEnd end) - { - return attached.add(end); - } - - void detachEnd(ReadEnd end) - { - attached.remove(end); - } - - private void notifyObservers() - { - attached.forEach(ReadEnd::update); - } - - /** - * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link CoreWire}. This {@link ReadWriteEnd} can be written - * to. - */ - public ReadWriteEnd createReadWriteEnd() - { - return new ReadWriteEnd(); - } - - /** - * Create a {@link ReadEnd} object, which is tied to this {@link CoreWire}. This {@link ReadEnd} cannot be written to. - */ - public ReadEnd createReadOnlyEnd() - { - return new ReadEnd(); - } - - void registerInput(ReadWriteEnd toRegister) - { - inputs.add(toRegister); - recalculateValuesWithoutFusions(); - } - - /** - * A {@link ReadEnd} feeds a constant signal into the {@link CoreWire} it is tied to. The combination of all inputs determines the - * {@link CoreWire}s final value. X dominates all other inputs Z does not affect the final value, unless there are no other inputs than - * Z 0 and 1 turn into X when they are mixed - * - * @author Fabian Stemmler - */ - public class ReadEnd implements LogicObservable - { - private List observers = new ArrayList<>(); - - ReadEnd() - { - super(); - CoreWire.this.attachEnd(this); - } - - public void update() - { - notifyObservers(); - } - - /** - * Included for convenient use on {@link CoreWire}s of width 1. - * - * @return The value of bit 0. - * - * @author Fabian Stemmler - */ - public Bit getValue() - { - return CoreWire.this.getValue(); - } - - /** - * @param index Index of the requested bit. - * @return The value of the indexed bit. - * - * @author Fabian Stemmler - */ - public Bit getValue(int index) - { - return CoreWire.this.getValue(index); - } - - public BitVector getValues() - { - return CoreWire.this.getValues(); - } - - /** - * @param start Start of the wanted segment. (inclusive) - * @param end End of the wanted segment. (exclusive) - * @return The values of the segment of {@link Bit}s indexed. - * - * @author Fabian Stemmler - */ - public BitVector getValues(int start, int end) - { - return CoreWire.this.getValues(start, end); - } - - @Override - public String toString() - { - return CoreWire.this.toString(); - } - - public void close() - { - inputs.remove(this); - detachEnd(this); - recalculateValuesWithoutFusions(); - } - - public int width() - { - return width; - } - - public CoreWire getWire() - { - return CoreWire.this; - } - - @Override - public void registerObserver(LogicObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(LogicObserver ob) - { - observers.remove(ob); - } - -// void registerCloseObserver(LogicObserver ob) -// { -// closeObserver.add(ob); -// } -// -// void deregisterCloseObserver(LogicObserver ob) -// { -// closeObserver.remove(ob); -// } - - @Override - public void notifyObservers() - { - observers.forEach(ob -> ob.update(this)); - } - } - - public class ReadWriteEnd extends ReadEnd - { - private boolean open; - private boolean isWriting; - private BitVector inputValues; - - ReadWriteEnd() - { - super(); - open = true; - isWriting = true; - initValues(); - registerInput(this); - } - - private void initValues() - { - inputValues = U.toVector(width); - } - - /** - * Sets the wires values. This takes up time, as specified by the {@link CoreWire}s travel time. - * - * @param newValues The new values the wires should take on. - * - * @author Fabian Stemmler - */ - public void feedSignals(Bit... newValues) - { - feedSignals(BitVector.of(newValues)); - } - - // TODO what if this is called multiple times at the same simulation time? (happens in component unit tests) - public void feedSignals(BitVector newValues) - { - if (newValues.length() != width) - throw new IllegalArgumentException( - String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), width)); - if (!open) - throw new IllegalStateException("Attempted to write to closed WireArrayEnd."); - timeline.addEvent(e -> setValues(newValues), travelTime); - } - - /** - * Sets values of a subarray of wires. This takes up time, as specified by the {@link CoreWire}s travel time. - * - * @param bitVector The new values the wires should take on. - * @param startingBit The first index of the subarray of wires. - * - * @author Fabian Stemmler - */ - public void feedSignals(int startingBit, BitVector bitVector) - { - if (!open) - throw new IllegalStateException("Attempted to write to closed WireArrayEnd."); - timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime); - } - - /** - * Sets the values that are being fed into the {@link CoreWire}. The preferred way of setting {@link ReadWriteEnd} values is via - * feedValues(...) with a delay. - */ - void setValues(int startingBit, BitVector newValues) - { - // index check covered in equals - if (!inputValues.equalsWithOffset(newValues, startingBit)) - { - Bit[] vals = inputValues.getBits(); - System.arraycopy(newValues.getBits(), 0, vals, startingBit, newValues.length()); - inputValues = BitVector.of(vals); - CoreWire.this.recalculateValuesWithoutFusions(); - } - } - - /** - * Sets the values that are being fed into the {@link CoreWire}. The preferred way of setting {@link ReadWriteEnd} values is via - * feedValues(...) with a delay. - */ - void setValues(BitVector newValues) - { - if (inputValues.equals(newValues)) - return; - inputValues = newValues; - CoreWire.this.recalculateValuesWithoutFusions(); - } - - /** - * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link CoreWire}.Returns the least - * significant bit (LSB) - */ - public Bit getInputValue() - { - return getInputValue(0); - } - - /** - * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link CoreWire} at the indexed {@link Bit}. - * Returns the least significant bit (LSB) - * - */ - public Bit getInputValue(int index) - { - return inputValues.getLSBit(index); - } - - /** - * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link CoreWire}. - */ - public BitVector getInputValues() - { - return inputValues; - } - - public BitVector getInputValues(int start, int end) - { - return inputValues.subVector(start, end); - } - - /** - * {@link ReadEnd} now feeds Z into the associated {@link CoreWire}. - */ - public void clearSignals() - { - feedSignals(Z.toVector(width)); - } - - public BitVector wireValuesExcludingMe() - { - BitVectorMutator mutator = BitVectorMutator.empty(); - boolean modified = false; - for (ReadWriteEnd wireEnd : inputs) - { - if (wireEnd == this) - continue; - modified = true; - mutator.join(wireEnd.inputValues); - } - if (!modified) - mutator.join(BitVector.of(Bit.Z, width)); - return mutator.toBitVector(); - } - - @Override - public String toString() - { - return inputValues.toString(); - } - - @Override - public void close() - { - super.close(); - open = false; - } - - void setWriting(boolean isWriting) - { - if (this.isWriting != isWriting) - { - this.isWriting = isWriting; - if (isWriting) - inputs.add(this); - else - inputs.remove(this); - CoreWire.this.recalculateValuesWithoutFusions(); - } - } - - boolean isWriting() - { - return isWriting; - } - } - - @Override - public String toString() - { - String name = this.name == null ? String.format("0x%08x", hashCode()) : this.name; - return String.format("wire %s value: %s inputs: %s", name, getValues(), inputs); - } - - public static ReadEnd[] extractEnds(CoreWire[] w) - { - ReadEnd[] inputs = new ReadEnd[w.length]; - for (int i = 0; i < w.length; i++) - inputs[i] = w[i].createReadWriteEnd(); - return inputs; - } - - /** - * - * Fuses two wires together. If the bits change in one Wire, the other is changed accordingly immediately. Warning: The bits are - * permanently fused together. - * - * @param a The {@link CoreWire} to be fused with b - * @param b The {@link CoreWire} to be fused with a - */ - public static void fuse(CoreWire a, CoreWire b) - { - fuse(a, b, 0, 0, a.width); - } - - /** - * Fuses the selected bits of two wires together. If the bits change in one Wire, the other is changed accordingly immediately. Warning: - * The bits are permanently fused together. - * - * @param a The {@link CoreWire} to be (partially) fused with b - * @param b The {@link CoreWire} to be (partially) fused with a - * @param fromA The first bit of {@link CoreWire} a to be fused - * @param fromB The first bit of {@link CoreWire} b to be fused - * @param width The amount of bits to fuse - */ - public static void fuse(CoreWire a, CoreWire b, int fromA, int fromB, int width) - { - // iterate in this direction to be fail-fast (rely on the checks in fuse(Wire, Wire, int, int) - for (int i = width - 1; i >= 0; i--) - fuse(a, b, fromA + i, fromB + i); - } - - /** - * Fuses one bit of two wires together. If this bit changes in one Wire, the other is changed accordingly immediately. Warning: The bits - * are permanently fused together. - * - * @param a The {@link CoreWire} to be (partially) fused with b - * @param b The {@link CoreWire} to be (partially) fused with a - * @param bitA The bit of {@link CoreWire} a to be fused - * @param bitB The bit of {@link CoreWire} b to be fused - */ - public static void fuse(CoreWire a, CoreWire b, int bitA, int bitB) - { - if (bitA >= a.width) - throw new IllegalArgumentException("No bit " + bitA + " in " + a + " (width " + a.width + ")"); - if (bitB >= b.width) - throw new IllegalArgumentException("No bit " + bitB + " in " + b + " (width " + b.width + ")"); - if (a.fusedBits == null) - a.fusedBits = new FusedBit[a.width]; - if (b.fusedBits == null) - b.fusedBits = new FusedBit[b.width]; - FusedBit oldFusionA = a.fusedBits[bitA]; - FusedBit oldFusionB = b.fusedBits[bitB]; - if (oldFusionA == null) - if (oldFusionB == null) - { - FusedBit fusion = new FusedBit(); - fusion.addParticipatingWireBit(a, bitA); - fusion.addParticipatingWireBit(b, bitB); - } else - oldFusionB.addParticipatingWireBit(a, bitA); - else if (oldFusionB == null) - oldFusionA.addParticipatingWireBit(b, bitB); - else - oldFusionA.mergeOtherIntoThis(oldFusionB); - } - - private static class FusedBit - { - private final Set participatingWireBits; - - public FusedBit() - { - this.participatingWireBits = new HashSet<>(); - } - - public void addParticipatingWireBit(CoreWire w, int bit) - { - addParticipatingWireBit(new WireBit(w, bit)); - } - - private void addParticipatingWireBit(WireBit wb) - { - wb.wire.fusedBits[wb.bit] = this; - participatingWireBits.add(wb); - wb.wire.invalidateCachedValuesForAllFusedWires(); - } - - public void mergeOtherIntoThis(FusedBit other) - { - for (WireBit wb : other.participatingWireBits) - addParticipatingWireBit(wb); - } - - public void invalidateCachedValuesForAllParticipatingWires() - { - for (WireBit wb : participatingWireBits) - wb.wire.invalidateCachedValues(); - } - - public Bit getValue() - { - Bit result = null; - for (WireBit wb : participatingWireBits) - if (!wb.wire.inputs.isEmpty()) - { - Bit bit = wb.wire.bitsWithoutFusions[wb.bit]; - result = result == null ? bit : result.join(bit); - } - return result == null ? U : result; - } - } - - private static class WireBit - { - public final CoreWire wire; - public final int bit; - - public WireBit(CoreWire wire, int bit) - { - this.wire = wire; - this.bit = bit; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + bit; - result = prime * result + ((wire == null) ? 0 : wire.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - WireBit other = (WireBit) obj; - if (bit != other.bit) - return false; - if (wire == null) - { - if (other.wire != null) - return false; - } else if (!wire.equals(other.wire)) - return false; - return true; - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/CoreComponentTest.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/CoreComponentTest.java deleted file mode 100644 index 12df5844..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/CoreComponentTest.java +++ /dev/null @@ -1,465 +0,0 @@ -package net.mograsim.logic.core.tests; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import net.mograsim.logic.core.components.CoreDemux; -import net.mograsim.logic.core.components.CoreMux; -import net.mograsim.logic.core.components.CoreTriStateBuffer; -import net.mograsim.logic.core.components.CoreUnidirectionalMerger; -import net.mograsim.logic.core.components.CoreUnidirectionalSplitter; -import net.mograsim.logic.core.components.gates.CoreAndGate; -import net.mograsim.logic.core.components.gates.CoreNandGate; -import net.mograsim.logic.core.components.gates.CoreNorGate; -import net.mograsim.logic.core.components.gates.CoreNotGate; -import net.mograsim.logic.core.components.gates.CoreOrGate; -import net.mograsim.logic.core.components.gates.CoreXorGate; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -@SuppressWarnings("unused") -class CoreComponentTest -{ - private Timeline t = new Timeline(11); - - @BeforeEach - void resetTimeline() - { - t.reset(); - } - - @Test - void circuitExampleTest() - { - CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), c = new CoreWire(t, 1, 10), d = new CoreWire(t, 2, 1), - e = new CoreWire(t, 1, 1), f = new CoreWire(t, 1, 1), g = new CoreWire(t, 1, 1), h = new CoreWire(t, 2, 1), - i = new CoreWire(t, 2, 1), j = new CoreWire(t, 1, 1), k = new CoreWire(t, 1, 1); - new CoreAndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - new CoreNotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd()); - new CoreUnidirectionalMerger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd()); - new CoreMux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd()); - new CoreUnidirectionalSplitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd()); - - a.createReadWriteEnd().feedSignals(Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ZERO); - d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE); - e.createReadWriteEnd().feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ONE, j.getValue()); - assertEquals(Bit.ZERO, k.getValue()); - } - - @Test - void splitterTest() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), in = new CoreWire(t, 8, 1); - in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - new CoreUnidirectionalSplitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd()); - - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO); - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void mergerTest() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - new CoreUnidirectionalMerger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void fusionTest1() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1); - CoreWire.fuse(a, out, 0, 0, a.width); - CoreWire.fuse(b, out, 0, a.width, b.width); - CoreWire.fuse(c, out, 0, a.width + b.width, c.width); - ReadWriteEnd rA = a.createReadWriteEnd(); - rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); - ReadWriteEnd rB = b.createReadWriteEnd(); - rB.feedSignals(Bit.ONE, Bit.ZERO); - ReadWriteEnd rC = c.createReadWriteEnd(); - rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - t.executeAll(); - assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X); - assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X); - assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X); - rA.clearSignals(); - rB.clearSignals(); - rC.clearSignals(); - t.executeAll(); - assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); - assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE); - assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); - } - - @Test - void fusionTest2() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); - CoreWire.fuse(a, b); - ReadWriteEnd rw = a.createReadWriteEnd(); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); - - rw.feedSignals(Bit.ONE, Bit.U, Bit.Z); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z); - } - - @Test - void fusionTest3() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); - a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X); - t.executeAll(); - CoreWire.fuse(a, b); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X); - } - - @Test - void fusionTest4() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); - a.createReadWriteEnd(); - t.executeAll(); - - CoreWire.fuse(a, b); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); - } - -// @Test -// void connectorTest() -// { -// t.reset(); -// Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1); -// new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect(); -//// b.createReadWriteEnd(); -// a.createReadWriteEnd(); -// t.executeAll(); -// assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); -// } - - @Test - void triStateBufferTest() - { - CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), en = new CoreWire(t, 1, 1), notEn = new CoreWire(t, 1, 1); - new CoreNotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd()); - new CoreTriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd()); - new CoreTriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd()); - - ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd(); - enI.feedSignals(Bit.ONE); - aI.feedSignals(Bit.ONE); - bI.feedSignals(Bit.Z); - - t.executeAll(); - - assertEquals(Bit.ONE, b.getValue()); - - bI.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.X, b.getValue()); - assertEquals(Bit.ONE, a.getValue()); - - aI.clearSignals(); - enI.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ZERO, a.getValue()); - - } - - @Test - void muxTest() - { - CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), - out = new CoreWire(t, 4, 1); - ReadWriteEnd selectIn = select.createReadWriteEnd(); - - selectIn.feedSignals(Bit.ZERO, Bit.ZERO); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - new CoreMux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), - c.createReadOnlyEnd()); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - selectIn.feedSignals(Bit.ONE, Bit.ZERO); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - selectIn.feedSignals(Bit.ONE, Bit.ONE); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - - } - - @Test - void demuxTest() - { - CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), - in = new CoreWire(t, 4, 1); - ReadWriteEnd selectIn = select.createReadWriteEnd(); - - selectIn.feedSignals(Bit.ZERO, Bit.ZERO); - in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - - new CoreDemux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), - c.createReadWriteEnd()); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - selectIn.feedSignals(Bit.ONE, Bit.ZERO); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - - selectIn.feedSignals(Bit.ONE, Bit.ONE); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - - } - - @Test - void andTest() - { - CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1); - new CoreAndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO); - } - - @Test - void orTest() - { - CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1); - new CoreOrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void nandTest() - { - CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1); - new CoreNandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); - } - - @Test - void norTest() - { - CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1); - new CoreNorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO); - } - - @Test - void xorTest() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2), c = new CoreWire(t, 3, 1), d = new CoreWire(t, 3, 1); - new CoreXorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); - b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE); - } - - @Test - void notTest() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2); - new CoreNotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd()); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO); - } - - @Test - void rsLatchCircuitTest() - { - CoreWire r = new CoreWire(t, 1, 1), s = new CoreWire(t, 1, 1), t1 = new CoreWire(t, 1, 15), t2 = new CoreWire(t, 1, 1), - q = new CoreWire(t, 1, 1), nq = new CoreWire(t, 1, 1); - - new CoreOrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); - new CoreOrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); - new CoreNotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd()); - new CoreNotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); - - ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd(); - - sIn.feedSignals(Bit.ONE); - rIn.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ONE, q.getValue()); - assertEquals(Bit.ZERO, nq.getValue()); - - sIn.feedSignals(Bit.ZERO); - - t.executeAll(); - assertEquals(Bit.ONE, q.getValue()); - assertEquals(Bit.ZERO, nq.getValue()); - - rIn.feedSignals(Bit.ONE); - - t.executeAll(); - - assertEquals(Bit.ZERO, q.getValue()); - assertEquals(Bit.ONE, nq.getValue()); - } - - @Test - void numericValueTest() - { - CoreWire a = new CoreWire(t, 4, 1); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); - - t.executeAll(); - - assertEquals(11, a.getValues().getUnsignedValueLong()); - assertEquals(-5, a.getValues().getSignedValueLong()); - } - - boolean flag = false; - - @Test - void simpleTimelineTest() - { - Timeline t = new Timeline(3); - flag = false; - t.addEvent((e) -> - { - if (!flag) - fail("Events executed out of order!"); - flag = false; - }, 15); - t.addEvent((e) -> - { - if (flag) - fail("Events executed out of order!"); - flag = true; - }, 10); - t.addEvent((e) -> - { - if (flag) - fail("Events executed out of order!"); - flag = true; - }, 20); - t.addEvent((e) -> - { - fail("Only supposed to execute until timestamp 20, not 25"); - }, 25); - - t.executeUntil(t.laterThan(20), 100); - - if (!flag) - fail("Not all events were executed in order!"); - } - - // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes - @Disabled("Out of date") - @Test - void multipleInputs() - { - CoreWire w = new CoreWire(t, 2, 1); - ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd(); - wI1.feedSignals(Bit.ONE, Bit.Z); - wI2.feedSignals(Bit.Z, Bit.X); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X); - - wI2.feedSignals(Bit.ZERO, Bit.Z); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z); - - wI2.feedSignals(Bit.Z, Bit.Z); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); - - wI2.feedSignals(Bit.ONE, Bit.Z); - ReadEnd rE = w.createReadOnlyEnd(); - rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change.")); - t.executeAll(); - rE.close(); - wI1.feedSignals(Bit.X, Bit.X); - t.executeAll(); - wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed.")); - wI1.close(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); - } - - private static void assertBitArrayEquals(BitVector actual, Bit... expected) - { - assertArrayEquals(expected, actual.getBits()); - } -} diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/GUITest.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/GUITest.java deleted file mode 100644 index a3689a30..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/GUITest.java +++ /dev/null @@ -1,302 +0,0 @@ -package net.mograsim.logic.core.tests; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.WindowConstants; - -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.components.gates.CoreNotGate; -import net.mograsim.logic.core.components.gates.CoreOrGate; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.Timeline.ExecutionResult; -import net.mograsim.logic.core.wires.CoreWire; - -public class GUITest extends JPanel -{ - - private static final long serialVersionUID = 1L; - - private static final int WIRE_DELAY = 40; - private static final int OR_DELAY = 100; - private static final int NOT_DELAY = 100; - - private Timeline t = new Timeline(11); - - CoreWire r = new CoreWire(t, 1, WIRE_DELAY); - CoreWire s = new CoreWire(t, 1, WIRE_DELAY); - CoreWire t1 = new CoreWire(t, 1, WIRE_DELAY); - CoreWire t2 = new CoreWire(t, 1, WIRE_DELAY); - CoreWire q = new CoreWire(t, 1, WIRE_DELAY); - CoreWire nq = new CoreWire(t, 1, WIRE_DELAY); - - CoreManualSwitch rIn = new CoreManualSwitch(t, r.createReadWriteEnd()); - CoreManualSwitch sIn = new CoreManualSwitch(t, s.createReadWriteEnd()); - - CoreOrGate or1 = new CoreOrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); - CoreOrGate or2 = new CoreOrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); - CoreNotGate not1 = new CoreNotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd()); - CoreNotGate not2 = new CoreNotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); - - Map switchMap = new HashMap<>(); - - int height; - int width; - boolean sizeChanged; - - public GUITest() - { - addMouseListener(new MouseListener() - { - - @Override - public void mouseReleased(MouseEvent e) - { - for (Entry dim : switchMap.entrySet()) - { - if (dim.getValue().contains(e.getPoint())) - { - dim.getKey().switchFullOff(); - repaint(); - } - } - } - - @Override - public void mousePressed(MouseEvent e) - { - for (Entry dim : switchMap.entrySet()) - { - if (dim.getValue().contains(e.getPoint())) - { - dim.getKey().switchFullOn(); - repaint(); - } - } - } - - @Override - public void mouseExited(MouseEvent e) - { - // none - } - - @Override - public void mouseEntered(MouseEvent e) - { - // none - } - - @Override - public void mouseClicked(MouseEvent e) - { - // If you want toggle buttons, use this code instead -// for (Entry dim : switchMap.entrySet()) { -// if (dim.getValue().contains(e.getPoint())) { -// dim.getKey().toggle(); -// repaint(); -// } -// } - } - }); - } - - public Timeline getTimeline() - { - return t; - } - - @Override - public void paint(Graphics some_g) - { - super.paint(some_g); - Graphics2D g = ((Graphics2D) some_g); - g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); - - checkSizeChange(); - adaptFont(g); - - drawWire(g, r, "r", 2, 9, 4, 9); - - drawWire(g, s, "s", 2, 3, 4, 3); - - drawWire(g, t2, "t2", 5, 8.5, 6, 8.5); - - drawWire(g, t1, "t1", 5, 3.5, 6, 3.5); - - drawWire(g, q, "q", 7, 8.5, 9, 8.5); - - drawWire(g, nq, "nq", 7, 3.5, 9, 3.5); - - drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5); - drawWire(g, q, "", 7.5, 7.5, 3, 4.5); - drawWire(g, q, "", 3, 4.5, 3, 4); - drawWire(g, q, "q", 3, 4, 4, 4); - - drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5); - drawWire(g, nq, "", 7.5, 4.5, 3, 7.5); - drawWire(g, nq, "", 3, 7.5, 3, 8); - drawWire(g, nq, "nq", 3, 8, 4, 8); - - drawSquare(g, 4, 8, "OR"); - drawSquare(g, 4, 3, "OR"); - - drawSquare(g, 6, 8, "NOT"); - drawSquare(g, 6, 3, "NOT"); - - drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75); - drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75); - - drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0); - } - - private void checkSizeChange() - { - sizeChanged = height != getHeight() || width != getWidth(); - if (sizeChanged) - { - height = getHeight(); - width = getWidth(); - } - } - - private void adaptFont(Graphics g) - { - g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f)); - } - - @SuppressWarnings("static-method") - private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY) - { - int h = g.getFontMetrics().getAscent(); - int w = g.getFontMetrics().stringWidth(s); - g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY)); - } - - private void drawWire(Graphics g, CoreWire wa, String name, double x1, double y1, double x2, double y2) - { - setTo(g, wa); - g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2)); - drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0); - } - - private void drawSquare(Graphics g, int posX, int posY, String text) - { - int x1 = gX(posX) - 5; - int x2 = gX(posX + 1) + 5; - int y1 = gY(posY) - 5; - int y2 = gY(posY + 1) + 5; - - g.setColor(Color.WHITE); - g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - setBlack(g); - g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5); - - } - - private void drawSwitch(Graphics g, CoreManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2) - { - int x1 = gX(posX1) - 5; - int x2 = gX(posX2) + 5; - int y1 = gY(posY1) - 5; - int y2 = gY(posY2) + 5; - - if (sizeChanged) - { - Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1); - switchMap.put(ms, r); - } - - g.setColor(ms.isFullOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE); - g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - setBlack(g); - g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5); - } - - private static void setBlack(Graphics g) - { - g.setColor(Color.BLACK); - } - - private static void setTo(Graphics g, CoreWire wa) - { - switch (wa.getValue()) - { - case ONE: - g.setColor(Color.GREEN); - break; - case X: - g.setColor(Color.RED); - break; - case Z: - g.setColor(Color.DARK_GRAY); - break; - case ZERO: - g.setColor(Color.BLACK); - break; - case U: - g.setColor(Color.MAGENTA); - break; - default: - throw new IllegalArgumentException(); - } - } - - private int gY(double pos) - { - return (int) (pos * height / 11); - } - - private int gX(double pos) - { - return (int) (pos * width / 11) + 50; - } - - public static void main(String[] args) - { - JFrame f = new JFrame("Test circuit 1.0.0"); - GUITest gt = new GUITest(); - f.add(gt); - f.setSize(800, 600); - f.setLocation(500, 400); - f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - f.setVisible(true); - - long begin = System.currentTimeMillis(); - - long lastFrame = begin; - long updateT = 16; - - while (f.isVisible()) - { - ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14); -// if (t.hasNext()) -// t.executeNext(); - if (er != ExecutionResult.NOTHING_DONE) - gt.repaint(12); - try - { - Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0)); - } - catch (Exception e) - { - e.printStackTrace(); - } - lastFrame = System.currentTimeMillis(); - } - } -} diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java deleted file mode 100644 index 5056345f..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.mograsim.logic.core.tests; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; - -import java.util.function.LongConsumer; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; - -public final class TestCoreBitDisplay extends CoreBitDisplay -{ - - public TestCoreBitDisplay(Timeline timeline, ReadEnd in) - { - super(timeline, in); - } - - public void assertDisplays(Bit... expected) - { - assertArrayEquals(expected, getDisplayedValue().getBits()); - } - - public void assertAfterSimulationIs(Bit... expected) - { - timeline.executeAll(); - assertDisplays(expected); - } - - public void assertAfterSimulationIs(LongConsumer r, Bit... expected) - { - while (timeline.hasNext()) - { - timeline.executeNext(); - r.accept(timeline.getSimulationTime()); - } - assertDisplays(expected); - } - - @Override - protected TimelineEventHandler compute() - { - TimelineEventHandler handler = super.compute(); - return e -> - { - handler.handle(e); - System.out.println("update: value is " + getDisplayedValue()); - }; - } -} diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/types/BitVectorTest.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/types/BitVectorTest.java deleted file mode 100644 index 2b46a6c7..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/types/BitVectorTest.java +++ /dev/null @@ -1,289 +0,0 @@ -package net.mograsim.logic.core.types; - -import static net.mograsim.logic.core.types.BitVector.*; -import static net.mograsim.logic.core.types.Bit.*; -import static org.junit.jupiter.api.Assertions.*; - -import java.math.BigInteger; -import java.util.Iterator; - -import org.junit.jupiter.api.Test; - -class BitVectorTest -{ - - @Test - void testOfBitArray() - { - BitVector.of(); // should be allowed and work - - assertSame(SINGLE_U, BitVector.of(U)); - assertSame(SINGLE_X, BitVector.of(X)); - assertSame(SINGLE_0, BitVector.of(ZERO)); - assertSame(SINGLE_1, BitVector.of(ONE)); - assertSame(SINGLE_Z, BitVector.of(Z)); - } - - @Test - void testOfBitInt() - { - assertEquals(BitVector.of(), BitVector.of(ONE, 0)); - - assertSame(SINGLE_U, BitVector.of(U, 1)); - assertSame(SINGLE_X, BitVector.of(X, 1)); - assertSame(SINGLE_0, BitVector.of(ZERO, 1)); - assertSame(SINGLE_1, BitVector.of(ONE, 1)); - assertSame(SINGLE_Z, BitVector.of(Z, 1)); - - assertEquals(BitVector.of(X, X, X), BitVector.of(X, 3)); - } - - @Test - void testGetUnsignedValue() - { - assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").getUnsignedValue()); - assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").getUnsignedValue()); - assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").getUnsignedValue()); - assertEquals(BigInteger.valueOf(0b0000000101), BitVector.parse("0000000101").getUnsignedValue()); - assertEquals(BigInteger.valueOf(0b1010000000), BitVector.parse("1010000000").getUnsignedValue()); - - assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").getUnsignedValue()); - } - - @Test - void testOfLongInt() - { - assertEquals(BitVector.parse("101"), BitVector.from(0b101L, 3)); - assertEquals(BitVector.parse("01010"), BitVector.from(0b01010L, 5)); - assertEquals(BitVector.parse("10101"), BitVector.from(-11L, 5)); - assertEquals(BitVector.parse("0000"), BitVector.from(0L, 4)); - } - - @Test - void testOfBigIntegerInt() - { - assertEquals(BitVector.parse("101"), BitVector.from(BigInteger.valueOf(0b101), 3)); - assertEquals(BitVector.parse("01010"), BitVector.from(BigInteger.valueOf(0b01010), 5)); - assertEquals(BitVector.parse("10101"), BitVector.from(BigInteger.valueOf(-11), 5)); - assertEquals(BitVector.parse("0000"), BitVector.from(BigInteger.valueOf(0), 4)); - } - - @Test - void testMutator() - { - var bv = BitVector.SINGLE_1; - var bvm = bv.mutator(); - - assertFalse(bvm.isEmpty()); - assertEquals(ONE, bvm.getLSBit(0)); - assertEquals(SINGLE_1, bvm.toBitVector()); - } - - @Test - void testGetMSBit() - { - assertEquals(ONE, SINGLE_1.getMSBit(0)); - assertEquals(ONE, BitVector.of(ONE, X, X, X).getMSBit(0)); - assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getMSBit(4)); - } - - @Test - void testGetLSBit() - { - assertEquals(ONE, SINGLE_1.getLSBit(0)); - assertEquals(ONE, BitVector.of(X, X, X, ONE).getLSBit(0)); - assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getLSBit(1)); - } - - @Test - void testGetBits() - { - assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.of(X, ONE, Z).getBits()); - assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.parse("X1Z").getBits()); - } - - @Test - void testIsBinary() - { - assertTrue(SINGLE_0.isBinary()); - assertTrue(SINGLE_1.isBinary()); - - assertFalse(SINGLE_U.isBinary()); - assertFalse(SINGLE_X.isBinary()); - assertFalse(SINGLE_Z.isBinary()); - - assertTrue(BitVector.of(ONE, ZERO, ONE, ONE, ZERO).isBinary()); - assertFalse(BitVector.of(ONE, ZERO, ZERO, X).isBinary()); - } - - @Test - void testJoin() - { - // binary - assertEquals(SINGLE_0, SINGLE_0.join(SINGLE_0)); - assertEquals(SINGLE_X, SINGLE_0.join(SINGLE_1)); - assertEquals(SINGLE_1, SINGLE_1.join(SINGLE_1)); - - // other - assertEquals(SINGLE_1, SINGLE_Z.join(SINGLE_1)); - assertEquals(SINGLE_U, SINGLE_0.join(SINGLE_U)); - assertEquals(SINGLE_X, SINGLE_X.join(SINGLE_Z)); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, Z).join(BitVector.of(ONE, ZERO, ZERO, ONE, Z)); - assertEquals(BitVector.of(U, X, ZERO, ONE, Z), result); - } - - @Test - void testAnd() - { - // binary - assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_0)); - assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_1)); - assertEquals(SINGLE_1, SINGLE_1.and(SINGLE_1)); - - // other - assertEquals(SINGLE_X, SINGLE_Z.and(SINGLE_1)); - assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_U)); - assertEquals(SINGLE_X, SINGLE_X.and(SINGLE_Z)); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, ONE).and(BitVector.of(ONE, ONE, ZERO, ZERO, ONE)); - assertEquals(BitVector.of(U, X, ZERO, ZERO, ONE), result); - } - - @Test - void testOr() - { - // binary - assertEquals(SINGLE_0, SINGLE_0.or(SINGLE_0)); - assertEquals(SINGLE_1, SINGLE_0.or(SINGLE_1)); - assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_1)); - - // other - assertEquals(SINGLE_1, SINGLE_Z.or(SINGLE_1)); - assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_U)); - assertEquals(SINGLE_X, SINGLE_X.or(SINGLE_Z)); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, ZERO).or(BitVector.of(ZERO, ZERO, ZERO, ONE, ONE)); - assertEquals(BitVector.of(U, X, ZERO, ONE, ONE), result); - } - - @Test - void testXor() - { - // binary - assertEquals(SINGLE_0, SINGLE_0.xor(SINGLE_0)); - assertEquals(SINGLE_1, SINGLE_0.xor(SINGLE_1)); - assertEquals(SINGLE_0, SINGLE_1.xor(SINGLE_1)); - - // other - assertEquals(SINGLE_X, SINGLE_Z.xor(SINGLE_1)); - assertEquals(SINGLE_U, SINGLE_0.xor(SINGLE_U)); - assertEquals(SINGLE_X, SINGLE_X.xor(SINGLE_Z)); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, ONE).xor(BitVector.of(ONE, ZERO, ZERO, ZERO, ONE)); - assertEquals(BitVector.of(U, X, ZERO, ONE, ZERO), result); - } - - @Test - void testNot() - { - // binary - assertEquals(SINGLE_1, SINGLE_0.not()); - assertEquals(SINGLE_0, SINGLE_1.not()); - - // other - assertEquals(SINGLE_U, SINGLE_U.not()); - assertEquals(SINGLE_X, SINGLE_X.not()); - assertEquals(SINGLE_X, SINGLE_Z.not()); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, Z).not(); - assertEquals(BitVector.of(U, X, ONE, ZERO, X), result); - } - - @Test - void testLength() - { - assertEquals(0, BitVector.of().length()); - assertEquals(1, SINGLE_0.length()); - assertEquals(3, BitVector.of(X, X, Z).length()); - } - - @Test - void testConcat() - { - assertEquals(BitVector.of(U, X), SINGLE_U.concat(SINGLE_X)); - assertEquals(BitVector.of(Z, X, U, ONE, X), BitVector.of(Z, X, U).concat(BitVector.of(ONE, X))); - } - - @Test - void testSubVectorInt() - { - assertEquals(SINGLE_0, SINGLE_0.subVector(0)); - assertEquals(BitVector.of(), SINGLE_0.subVector(1)); - assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1)); - assertEquals(BitVector.of(X, Z), BitVector.of(ZERO, U, ONE, X, Z).subVector(3)); - } - - @Test - void testSubVectorIntInt() - { - assertEquals(SINGLE_0, SINGLE_0.subVector(0, 1)); - assertEquals(BitVector.of(), SINGLE_0.subVector(0, 0)); - assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1, 2)); - assertEquals(BitVector.of(ONE, X), BitVector.of(ZERO, U, ONE, X, Z).subVector(2, 4)); - } - - @Test - void testEqualsObject() - { - assertEquals(SINGLE_X, SINGLE_X); - assertNotEquals(SINGLE_0, SINGLE_1); - - assertEquals(BitVector.of(X, Z, U), BitVector.of(X, Z, U)); - assertNotEquals(BitVector.of(X, Z, U), BitVector.of(X, X, U)); - } - - @Test - void testEqualsWithOffset() - { - assertTrue(SINGLE_X.equalsWithOffset(SINGLE_X, 0)); - assertFalse(SINGLE_0.equalsWithOffset(SINGLE_1, 0)); - - assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(Z, U), 1)); - assertFalse(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(X, U), 1)); - assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(U), 2)); - } - - @Test - void testParse() - { - assertEquals(SINGLE_U, BitVector.parse("U")); - assertEquals(SINGLE_X, BitVector.parse("X")); - assertEquals(SINGLE_0, BitVector.parse("0")); - assertEquals(SINGLE_1, BitVector.parse("1")); - assertEquals(SINGLE_Z, BitVector.parse("Z")); - - assertEquals(BitVector.of(X, U, Z, ONE, ZERO), BitVector.parse("XUZ10")); - - assertThrows(RuntimeException.class, () -> BitVector.parse("01BX")); - } - - @Test - void testIterator() - { - var bv = BitVector.of(U, Z, ONE, ZERO, X); - Iterator it = bv.iterator(); - - assertEquals(U, it.next()); - assertEquals(Z, it.next()); - assertEquals(ONE, it.next()); - assertEquals(ZERO, it.next()); - assertEquals(X, it.next()); - assertFalse(it.hasNext()); - } -} diff --git a/net.mograsim.logic.model.am2900/.classpath b/net.mograsim.logic.model.am2900/.classpath deleted file mode 100644 index c8dbda91..00000000 --- a/net.mograsim.logic.model.am2900/.classpath +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.logic.model.am2900/.gitignore b/net.mograsim.logic.model.am2900/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.logic.model.am2900/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.logic.model.am2900/.project b/net.mograsim.logic.model.am2900/.project deleted file mode 100644 index 494b451f..00000000 --- a/net.mograsim.logic.model.am2900/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - net.mograsim.logic.model.am2900 - - - net.mograsim.logic.model - SWTZoomableCanvas - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs b/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.logic.model.am2900/Am2904Testbench.json b/net.mograsim.logic.model.am2900/Am2904Testbench.json deleted file mode 100644 index c7bec19f..00000000 --- a/net.mograsim.logic.model.am2900/Am2904Testbench.json +++ /dev/null @@ -1,2341 +0,0 @@ -{ - "width": 0.0, - "height": 0.0, - "interfacePins": [], - "innerScale": 1.0, - "submodel": { - "components": [ - { - "id": "Am2904", - "name": "Am2904#0", - "pos": { - "x": 220.0, - "y": 175.0 - } - }, - { - "id": "BitDisplay", - "name": "BitDisplay#0", - "pos": { - "x": 391.0, - "y": 150.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#1", - "pos": { - "x": 391.0, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#2", - "pos": { - "x": 391.0, - "y": 180.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#3", - "pos": { - "x": 391.0, - "y": 195.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#4", - "pos": { - "x": 365.0, - "y": 240.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#5", - "pos": { - "x": 365.0, - "y": 275.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#6", - "pos": { - "x": 365.0, - "y": 370.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#7", - "pos": { - "x": 365.0, - "y": 385.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#8", - "pos": { - "x": 365.0, - "y": 330.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#9", - "pos": { - "x": 365.0, - "y": 315.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#0", - "pos": { - "x": 255.0, - "y": 152.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#1", - "pos": { - "x": 170.0, - "y": 82.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#10", - "pos": { - "x": 160.0, - "y": 247.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#11", - "pos": { - "x": 160.0, - "y": 217.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#12", - "pos": { - "x": 160.0, - "y": 202.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#13", - "pos": { - "x": 60.0, - "y": 132.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#14", - "pos": { - "x": 165.0, - "y": 287.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#15", - "pos": { - "x": 140.0, - "y": 317.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#16", - "pos": { - "x": 140.0, - "y": 332.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#17", - "pos": { - "x": 140.0, - "y": 387.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#18", - "pos": { - "x": 140.0, - "y": 372.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#19", - "pos": { - "x": 140.0, - "y": 357.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#2", - "pos": { - "x": 170.0, - "y": 112.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#20", - "pos": { - "x": 140.0, - "y": 302.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#21", - "pos": { - "x": 55.0, - "y": 142.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#22", - "pos": { - "x": 60.0, - "y": 152.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#23", - "pos": { - "x": 60.0, - "y": 172.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#24", - "pos": { - "x": 55.0, - "y": 162.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#25", - "pos": { - "x": 55.0, - "y": 182.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#26", - "pos": { - "x": 60.0, - "y": 192.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#27", - "pos": { - "x": 60.0, - "y": 232.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#28", - "pos": { - "x": 55.0, - "y": 202.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#29", - "pos": { - "x": 55.0, - "y": 222.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#3", - "pos": { - "x": 55.0, - "y": 122.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#30", - "pos": { - "x": 60.0, - "y": 212.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#31", - "pos": { - "x": 55.0, - "y": 242.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#32", - "pos": { - "x": 300.0, - "y": 107.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#33", - "pos": { - "x": 300.0, - "y": 137.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#34", - "pos": { - "x": 300.0, - "y": 92.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#35", - "pos": { - "x": 300.0, - "y": 122.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#36", - "pos": { - "x": 300.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#37", - "pos": { - "x": 165.0, - "y": 270.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#38", - "pos": { - "x": 385.0, - "y": 220.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#4", - "pos": { - "x": 170.0, - "y": 127.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#5", - "pos": { - "x": 170.0, - "y": 142.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#6", - "pos": { - "x": 170.0, - "y": 157.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#7", - "pos": { - "x": 155.0, - "y": 172.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#8", - "pos": { - "x": 155.0, - "y": 187.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#9", - "pos": { - "x": 160.0, - "y": 232.5 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Merger#0", - "pos": { - "x": 85.0, - "y": 130.0 - }, - "params": { - "logicWidth": 13, - "orientation": "LEFT" - } - }, - { - "id": "TextComponent", - "name": "TextComponent#0", - "pos": { - "x": 140.0, - "y": 110.0 - }, - "params": "IZ" - }, - { - "id": "TextComponent", - "name": "TextComponent#1", - "pos": { - "x": 140.0, - "y": 125.0 - }, - "params": "IC" - }, - { - "id": "TextComponent", - "name": "TextComponent#10", - "pos": { - "x": 35.0, - "y": 240.0 - }, - "params": "I0" - }, - { - "id": "TextComponent", - "name": "TextComponent#11", - "pos": { - "x": 35.0, - "y": 120.0 - }, - "params": "I12" - }, - { - "id": "TextComponent", - "name": "TextComponent#12", - "pos": { - "x": 35.0, - "y": 220.0 - }, - "params": "I2" - }, - { - "id": "TextComponent", - "name": "TextComponent#13", - "pos": { - "x": 40.0, - "y": 190.0 - }, - "params": "I5" - }, - { - "id": "TextComponent", - "name": "TextComponent#14", - "pos": { - "x": 40.0, - "y": 230.0 - }, - "params": "I1" - }, - { - "id": "TextComponent", - "name": "TextComponent#15", - "pos": { - "x": 40.0, - "y": 210.0 - }, - "params": "I3" - }, - { - "id": "TextComponent", - "name": "TextComponent#16", - "pos": { - "x": 35.0, - "y": 200.0 - }, - "params": "I4" - }, - { - "id": "TextComponent", - "name": "TextComponent#17", - "pos": { - "x": 35.0, - "y": 180.0 - }, - "params": "I6" - }, - { - "id": "TextComponent", - "name": "TextComponent#18", - "pos": { - "x": 40.0, - "y": 170.0 - }, - "params": "I7" - }, - { - "id": "TextComponent", - "name": "TextComponent#19", - "pos": { - "x": 35.0, - "y": 160.0 - }, - "params": "I8" - }, - { - "id": "TextComponent", - "name": "TextComponent#2", - "pos": { - "x": 140.0, - "y": 140.0 - }, - "params": "IN" - }, - { - "id": "TextComponent", - "name": "TextComponent#20", - "pos": { - "x": 40.0, - "y": 150.0 - }, - "params": "I9" - }, - { - "id": "TextComponent", - "name": "TextComponent#21", - "pos": { - "x": 35.0, - "y": 140.0 - }, - "params": "I10" - }, - { - "id": "TextComponent", - "name": "TextComponent#22", - "pos": { - "x": 40.0, - "y": 130.0 - }, - "params": "I11" - }, - { - "id": "TextComponent", - "name": "TextComponent#23", - "pos": { - "x": 145.0, - "y": 285.0 - }, - "params": "CX" - }, - { - "id": "TextComponent", - "name": "TextComponent#24", - "pos": { - "x": 150.0, - "y": 80.0 - }, - "params": "C" - }, - { - "id": "TextComponent", - "name": "TextComponent#25", - "pos": { - "x": 225.0, - "y": 150.0 - }, - "params": "_OEY" - }, - { - "id": "TextComponent", - "name": "TextComponent#26", - "pos": { - "x": 416.0, - "y": 150.0 - }, - "params": "YZ" - }, - { - "id": "TextComponent", - "name": "TextComponent#27", - "pos": { - "x": 416.0, - "y": 165.0 - }, - "params": "YC" - }, - { - "id": "TextComponent", - "name": "TextComponent#28", - "pos": { - "x": 416.0, - "y": 180.0 - }, - "params": "YN" - }, - { - "id": "TextComponent", - "name": "TextComponent#29", - "pos": { - "x": 416.0, - "y": 195.0 - }, - "params": "YOVR" - }, - { - "id": "TextComponent", - "name": "TextComponent#3", - "pos": { - "x": 140.0, - "y": 155.0 - }, - "params": "IOVR" - }, - { - "id": "TextComponent", - "name": "TextComponent#30", - "pos": { - "x": 390.0, - "y": 240.0 - }, - "params": "CT" - }, - { - "id": "TextComponent", - "name": "TextComponent#31", - "pos": { - "x": 390.0, - "y": 275.0 - }, - "params": "C0" - }, - { - "id": "TextComponent", - "name": "TextComponent#32", - "pos": { - "x": 390.0, - "y": 315.0 - }, - "params": "SIOn" - }, - { - "id": "TextComponent", - "name": "TextComponent#33", - "pos": { - "x": 390.0, - "y": 330.0 - }, - "params": "QIOn" - }, - { - "id": "TextComponent", - "name": "TextComponent#34", - "pos": { - "x": 390.0, - "y": 370.0 - }, - "params": "SIO0" - }, - { - "id": "TextComponent", - "name": "TextComponent#35", - "pos": { - "x": 390.0, - "y": 385.0 - }, - "params": "QIO0" - }, - { - "id": "TextComponent", - "name": "TextComponent#36", - "pos": { - "x": 30.0, - "y": 300.0 - }, - "params": "enable S/QIOn input" - }, - { - "id": "TextComponent", - "name": "TextComponent#37", - "pos": { - "x": 30.0, - "y": 355.0 - }, - "params": "enable S/QIO0 input" - }, - { - "id": "TextComponent", - "name": "TextComponent#38", - "pos": { - "x": 110.0, - "y": 385.0 - }, - "params": "QIO0" - }, - { - "id": "TextComponent", - "name": "TextComponent#39", - "pos": { - "x": 110.0, - "y": 370.0 - }, - "params": "SIO0" - }, - { - "id": "TextComponent", - "name": "TextComponent#4", - "pos": { - "x": 115.0, - "y": 170.0 - }, - "params": "_CEM" - }, - { - "id": "TextComponent", - "name": "TextComponent#40", - "pos": { - "x": 110.0, - "y": 315.0 - }, - "params": "SIOn" - }, - { - "id": "TextComponent", - "name": "TextComponent#41", - "pos": { - "x": 110.0, - "y": 330.0 - }, - "params": "QIOn" - }, - { - "id": "TextComponent", - "name": "TextComponent#42", - "pos": { - "x": 270.0, - "y": 135.0 - }, - "params": "YOVR" - }, - { - "id": "TextComponent", - "name": "TextComponent#43", - "pos": { - "x": 270.0, - "y": 120.0 - }, - "params": "YN" - }, - { - "id": "TextComponent", - "name": "TextComponent#44", - "pos": { - "x": 270.0, - "y": 90.0 - }, - "params": "YZ" - }, - { - "id": "TextComponent", - "name": "TextComponent#45", - "pos": { - "x": 270.0, - "y": 105.0 - }, - "params": "YC" - }, - { - "id": "TextComponent", - "name": "TextComponent#46", - "pos": { - "x": 220.0, - "y": 75.0 - }, - "params": "enable Y input" - }, - { - "id": "TextComponent", - "name": "TextComponent#47", - "pos": { - "x": 145.0, - "y": 270.0 - }, - "params": "_SE" - }, - { - "id": "TextComponent", - "name": "TextComponent#48", - "pos": { - "x": 350.0, - "y": 220.0 - }, - "params": "_OECT" - }, - { - "id": "TextComponent", - "name": "TextComponent#5", - "pos": { - "x": 115.0, - "y": 185.0 - }, - "params": "_CEmu" - }, - { - "id": "TextComponent", - "name": "TextComponent#6", - "pos": { - "x": 125.0, - "y": 200.0 - }, - "params": "_EZ" - }, - { - "id": "TextComponent", - "name": "TextComponent#7", - "pos": { - "x": 125.0, - "y": 215.0 - }, - "params": "_EC" - }, - { - "id": "TextComponent", - "name": "TextComponent#8", - "pos": { - "x": 125.0, - "y": 230.0 - }, - "params": "_EN" - }, - { - "id": "TextComponent", - "name": "TextComponent#9", - "pos": { - "x": 125.0, - "y": 245.0 - }, - "params": "_EOVR" - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 175.0, - "y": 315.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#1", - "pos": { - "x": 175.0, - "y": 330.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#2", - "pos": { - "x": 175.0, - "y": 385.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#3", - "pos": { - "x": 175.0, - "y": 370.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#4", - "pos": { - "x": 335.0, - "y": 105.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#5", - "pos": { - "x": 335.0, - "y": 90.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#6", - "pos": { - "x": 335.0, - "y": 120.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#7", - "pos": { - "x": 335.0, - "y": 135.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 184.0, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 184.0, - "y": 309.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 369.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 374.0, - "y": 189.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 379.0, - "y": 199.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 209.0, - "y": 324.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 214.0, - "y": 339.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 354.0, - "y": 379.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 359.0, - "y": 389.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 344.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 359.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 359.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 364.0, - "y": 159.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "ManualSwitch#0", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OEY" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 280.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "C" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 215.0, - "y": 90.0 - }, - { - "x": 215.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "ManualSwitch#10", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 205.0, - "y": 220.0 - }, - { - "x": 205.0, - "y": 255.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#9", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EN" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 200.0, - "y": 240.0 - }, - { - "x": 200.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "I" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 105.0, - "y": 190.0 - }, - { - "x": 105.0, - "y": 265.0 - }, - { - "x": 210.0, - "y": 265.0 - }, - { - "x": 210.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "Cx" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 200.0, - "y": 295.0 - }, - { - "x": 200.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "YOVR" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YN" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 375.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#1", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "YZ" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 365.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "CT" - }, - "pin2": { - "compName": "BitDisplay#4", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 345.0, - "y": 235.0 - }, - { - "x": 345.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "C0" - }, - "pin2": { - "compName": "BitDisplay#5", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#2", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IZ" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 210.0, - "y": 120.0 - }, - { - "x": 210.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "SIOn" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 210.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "QIOn" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 215.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#1", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#15", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#16", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "IN" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "IN" - }, - "pin2": { - "compName": "ManualSwitch#17", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#18", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "IN" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "EN" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IC" - }, - "pin2": { - "compName": "ManualSwitch#4", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 205.0, - "y": 190.0 - }, - { - "x": 205.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "EN" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 200.0, - "y": 365.0 - }, - { - "x": 200.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#20", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "EN" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 200.0, - "y": 310.0 - }, - { - "x": 200.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#9", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 210.0, - "y": 375.0 - }, - { - "x": 345.0, - "y": 375.0 - }, - { - "x": 345.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "BitDisplay#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 350.0, - "y": 340.0 - }, - { - "x": 350.0, - "y": 380.0 - }, - { - "x": 215.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 210.0, - "y": 380.0 - }, - { - "x": 210.0, - "y": 385.0 - }, - { - "x": 355.0, - "y": 385.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "OUT" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 210.0, - "y": 390.0 - }, - { - "x": 210.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#7", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 360.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "BitDisplay#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#5", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IN" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 200.0, - "y": 150.0 - }, - { - "x": 200.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "SIO0" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 355.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "QIO0" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 360.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#3", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O12" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O11" - }, - "pin2": { - "compName": "ManualSwitch#13", - "pinName": "" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#21", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O10" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O9" - }, - "pin2": { - "compName": "ManualSwitch#22", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#24", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O8" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O7" - }, - "pin2": { - "compName": "ManualSwitch#23", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#25", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O6" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O5" - }, - "pin2": { - "compName": "ManualSwitch#26", - "pinName": "" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IOVR" - }, - "pin2": { - "compName": "ManualSwitch#6", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 195.0, - "y": 200.0 - }, - { - "x": 195.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#28", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O4" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O3" - }, - "pin2": { - "compName": "ManualSwitch#30", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#29", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O2" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O1" - }, - "pin2": { - "compName": "ManualSwitch#27", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#31", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O0" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#7", - "pinName": "IN" - }, - "pin2": { - "compName": "ManualSwitch#33", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#35", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#6", - "pinName": "IN" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#4", - "pinName": "IN" - }, - "pin2": { - "compName": "ManualSwitch#32", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#34", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "IN" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "EN" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_CEM" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 190.0, - "y": 180.0 - }, - { - "x": 190.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "ManualSwitch#36", - "pinName": "" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 360.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#4", - "pinName": "EN" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#6", - "pinName": "EN" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#7", - "pinName": "EN" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 360.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#0", - "pinName": "" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "OUT" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 365.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "YC" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 370.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#4", - "pinName": "OUT" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 370.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_CEmu" - }, - "pin2": { - "compName": "ManualSwitch#8", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 185.0, - "y": 205.0 - }, - { - "x": 185.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#6", - "pinName": "OUT" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 375.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#2", - "pinName": "" - }, - "name": "unnamedWire#71", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#3", - "pinName": "" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 380.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#7", - "pinName": "OUT" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 380.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_SE" - }, - "pin2": { - "compName": "ManualSwitch#37", - "pinName": "" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 215.0, - "y": 260.0 - }, - { - "x": 215.0, - "y": 280.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#38", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OECT" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 410.0, - "y": 230.0 - }, - { - "x": 410.0, - "y": 215.0 - }, - { - "x": 345.0, - "y": 215.0 - }, - { - "x": 345.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EZ" - }, - "pin2": { - "compName": "ManualSwitch#12", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EC" - }, - "pin2": { - "compName": "ManualSwitch#11", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 195.0, - "y": 215.0 - }, - { - "x": 195.0, - "y": 225.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "default", - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF b/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF deleted file mode 100644 index 08b14e04..00000000 --- a/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF +++ /dev/null @@ -1,20 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %Bundle-Name -Bundle-SymbolicName: net.mograsim.logic.model.am2900;singleton:=true -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.logic.model.am2900, - net.mograsim.logic.model.am2900.components, - net.mograsim.logic.model.am2900.components.am2901, - net.mograsim.logic.model.am2900.components.am2904, - net.mograsim.logic.model.am2900.components.am2910, - net.mograsim.logic.model.am2900.machine, - net.mograsim.logic.model.examples -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.eclipse.osgi, - net.mograsim.machine;bundle-version="0.1.0";visibility:=reexport, - net.mograsim.logic.core -Automatic-Module-Name: net.mograsim.logic.model.am2900 -Bundle-Vendor: Mograsim Team -Bundle-Activator: net.mograsim.logic.model.am2900.Am2900Loader -Bundle-ActivationPolicy: lazy diff --git a/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties b/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties deleted file mode 100644 index 3fe36700..00000000 --- a/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Properties file for net.mograsim.logic.model.am2900 -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim Am2900 logic \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/build.properties b/net.mograsim.logic.model.am2900/build.properties deleted file mode 100644 index 1eb041da..00000000 --- a/net.mograsim.logic.model.am2900/build.properties +++ /dev/null @@ -1,6 +0,0 @@ -source.. = src/,\ - components/ -bin.includes = META-INF/,\ - .,\ - OSGI-INF/,\ - plugin.xml diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json deleted file mode 100644 index b97159cb..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json +++ /dev/null @@ -1,6913 +0,0 @@ -{ - "width": 504.0, - "height": 342.0, - "interfacePins": [], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "ManualSwitch", - "name": "@bz_pc_cpol", - "pos": { - "x": 120.0, - "y": 435.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "@c", - "pos": { - "x": 120.0, - "y": 350.0 - }, - "params": 1 - }, - { - "id": "dlatch80", - "name": "@dlatch80#1", - "pos": { - "x": 295.0, - "y": 675.0 - } - }, - { - "id": "ManualSwitch", - "name": "@ireg_cpol", - "pos": { - "x": 120.0, - "y": 410.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "@mireg_cpol", - "pos": { - "x": 120.0, - "y": 385.0 - }, - "params": 1 - }, - { - "id": "Am2900MainMemory", - "name": "Am2900MainMemory#0", - "pos": { - "x": 35.0, - "y": 30.0 - } - }, - { - "id": "Am2900MicroInstructionMemory", - "name": "Am2900MicroInstructionMemory#0", - "pos": { - "x": 65.0, - "y": 565.0 - } - }, - { - "id": "Am2901", - "name": "Am2901#0", - "pos": { - "x": 725.0, - "y": 400.0 - } - }, - { - "id": "Am2901", - "name": "Am2901#1", - "pos": { - "x": 850.0, - "y": 400.0 - } - }, - { - "id": "Am2901", - "name": "Am2901#2", - "pos": { - "x": 975.0, - "y": 400.0 - } - }, - { - "id": "Am2901", - "name": "Am2901#3", - "pos": { - "x": 1110.0, - "y": 400.0 - } - }, - { - "id": "Am2904", - "name": "Am2904#0", - "pos": { - "x": 550.0, - "y": 405.0 - } - }, - { - "id": "Am2910", - "name": "Am2910#0", - "pos": { - "x": 405.0, - "y": 510.0 - } - }, - { - "id": "BitDisplay", - "name": "BitDisplay#1", - "pos": { - "x": 255.0, - "y": 30.0 - }, - "params": 16 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#2", - "pos": { - "x": 255.0, - "y": 45.0 - }, - "params": 16 - }, - { - "id": "FixedOutput", - "name": "FixedOutput#0", - "pos": { - "x": 540.0, - "y": 270.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#1", - "pos": { - "x": 635.0, - "y": 380.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#2", - "pos": { - "x": 365.0, - "y": 505.0 - }, - "params": { - "bits": [ - "ONE" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#3", - "pos": { - "x": 455.0, - "y": 560.0 - }, - "params": { - "bits": [ - "ONE" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#4", - "pos": { - "x": 420.0, - "y": 570.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#5", - "pos": { - "x": 475.0, - "y": 505.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#6", - "pos": { - "x": 535.0, - "y": 370.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#7", - "pos": { - "x": 260.0, - "y": 370.0 - }, - "params": { - "bits": [ - null - ] - } - }, - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 395.0, - "y": 195.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 335.0, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 395.0, - "y": 220.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 935.0, - "y": 685.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 935.0, - "y": 710.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 190.0, - "y": 100.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 240.0, - "y": 525.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 555.0, - "y": 115.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 620.0, - "y": 160.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#11", - "pos": { - "x": 575.0, - "y": 115.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#12", - "pos": { - "x": 575.0, - "y": 195.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#13", - "pos": { - "x": 575.0, - "y": 235.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#14", - "pos": { - "x": 675.0, - "y": 150.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#15", - "pos": { - "x": 675.0, - "y": 245.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#16", - "pos": { - "x": 345.0, - "y": 830.0 - }, - "params": { - "logicWidth": 80, - "orientation": "UP_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#17", - "pos": { - "x": 405.0, - "y": 815.0 - }, - "params": { - "logicWidth": 12, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#18", - "pos": { - "x": 525.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#19", - "pos": { - "x": 660.0, - "y": 755.0 - }, - "params": { - "logicWidth": 13, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 620.0, - "y": 255.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#20", - "pos": { - "x": 575.0, - "y": 815.0 - }, - "params": { - "logicWidth": 6, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#21", - "pos": { - "x": 695.0, - "y": 815.0 - }, - "params": { - "logicWidth": 2, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#22", - "pos": { - "x": 655.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#23", - "pos": { - "x": 730.0, - "y": 770.0 - }, - "params": { - "logicWidth": 6, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#24", - "pos": { - "x": 690.0, - "y": 770.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#25", - "pos": { - "x": 660.0, - "y": 770.0 - }, - "params": { - "logicWidth": 2, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#26", - "pos": { - "x": 925.0, - "y": 815.0 - }, - "params": { - "logicWidth": 16, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#27", - "pos": { - "x": 895.0, - "y": 815.0 - }, - "params": { - "logicWidth": 3, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#28", - "pos": { - "x": 865.0, - "y": 815.0 - }, - "params": { - "logicWidth": 3, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#29", - "pos": { - "x": 835.0, - "y": 815.0 - }, - "params": { - "logicWidth": 3, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 205.0, - "y": 390.0 - }, - "params": { - "logicWidth": 8, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#30", - "pos": { - "x": 795.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#31", - "pos": { - "x": 745.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#32", - "pos": { - "x": 895.0, - "y": 800.0 - }, - "params": { - "logicWidth": 3, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#33", - "pos": { - "x": 835.0, - "y": 800.0 - }, - "params": { - "logicWidth": 3, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#34", - "pos": { - "x": 865.0, - "y": 800.0 - }, - "params": { - "logicWidth": 3, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#35", - "pos": { - "x": 835.0, - "y": 780.0 - }, - "params": { - "logicWidth": 9, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#36", - "pos": { - "x": 895.0, - "y": 330.0 - }, - "params": { - "logicWidth": 16, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#37", - "pos": { - "x": 895.0, - "y": 580.0 - }, - "params": { - "logicWidth": 16, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#38", - "pos": { - "x": 895.0, - "y": 565.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#39", - "pos": { - "x": 935.0, - "y": 565.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 205.0, - "y": 405.0 - }, - "params": { - "logicWidth": 12, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#40", - "pos": { - "x": 975.0, - "y": 565.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#41", - "pos": { - "x": 1015.0, - "y": 565.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#42", - "pos": { - "x": 895.0, - "y": 345.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#43", - "pos": { - "x": 935.0, - "y": 345.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#44", - "pos": { - "x": 975.0, - "y": 345.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#45", - "pos": { - "x": 1015.0, - "y": 345.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#46", - "pos": { - "x": 310.0, - "y": 235.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#47", - "pos": { - "x": 620.0, - "y": 200.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#48", - "pos": { - "x": 365.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#49", - "pos": { - "x": 620.0, - "y": 295.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "TextComponent", - "name": "TextComponent#0", - "pos": { - "x": 305.0, - "y": 30.0 - }, - "params": "D bus" - }, - { - "id": "TextComponent", - "name": "TextComponent#1", - "pos": { - "x": 305.0, - "y": 60.0 - }, - "params": "A bus" - }, - { - "id": "TextComponent", - "name": "TextComponent#13", - "pos": { - "x": 60.0, - "y": 385.0 - }, - "params": "mireg cpol" - }, - { - "id": "TextComponent", - "name": "TextComponent#14", - "pos": { - "x": 60.0, - "y": 415.0 - }, - "params": "ireg cpol" - }, - { - "id": "TextComponent", - "name": "TextComponent#15", - "pos": { - "x": 60.0, - "y": 435.0 - }, - "params": "bz/pc cpol" - }, - { - "id": "TextComponent", - "name": "TextComponent#3", - "pos": { - "x": 515.0, - "y": 110.0 - }, - "params": "asdf" - }, - { - "id": "TextComponent", - "name": "TextComponent#4", - "pos": { - "x": 60.0, - "y": 350.0 - }, - "params": "c" - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 990.0, - "y": 590.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#1", - "pos": { - "x": 990.0, - "y": 615.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#2", - "pos": { - "x": 425.0, - "y": 120.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#3", - "pos": { - "x": 425.0, - "y": 145.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#5", - "pos": { - "x": 205.0, - "y": 70.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 604.0, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 714.0, - "y": 394.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 819.0, - "y": 384.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 824.0, - "y": 389.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 329.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 474.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 419.0, - "y": 129.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 894.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 844.0, - "y": 794.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 984.0, - "y": 599.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 249.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 244.0, - "y": 59.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 839.0, - "y": 394.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 444.0, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 389.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 449.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 454.0, - "y": 59.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 389.0, - "y": 224.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 929.0, - "y": 714.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 819.0, - "y": 529.0 - }, - "params": 9 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 944.0, - "y": 529.0 - }, - "params": 9 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 1069.0, - "y": 529.0 - }, - "params": 9 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 244.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 964.0, - "y": 394.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 564.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 569.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#32", - "pos": { - "x": 929.0, - "y": 699.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#33", - "pos": { - "x": 284.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#34", - "pos": { - "x": 294.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#35", - "pos": { - "x": 304.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#36", - "pos": { - "x": 339.0, - "y": 229.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#37", - "pos": { - "x": 824.0, - "y": 699.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#38", - "pos": { - "x": 234.0, - "y": 529.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#39", - "pos": { - "x": 234.0, - "y": 539.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 569.0, - "y": 234.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 559.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 1074.0, - "y": 389.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 1069.0, - "y": 384.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 944.0, - "y": 384.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 949.0, - "y": 389.0 - }, - "params": 4 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 860.0, - "y": 590.0 - } - }, - { - "id": "and", - "name": "and#1", - "pos": { - "x": 860.0, - "y": 610.0 - } - }, - { - "id": "and", - "name": "and#2", - "pos": { - "x": 905.0, - "y": 595.0 - } - }, - { - "id": "dff16", - "name": "dff16#0", - "pos": { - "x": 370.0, - "y": 105.0 - } - }, - { - "id": "dff16_invwe", - "name": "dff16_invwe#0", - "pos": { - "x": 490.0, - "y": 165.0 - } - }, - { - "id": "dlatch80", - "name": "dlatch80#0", - "pos": { - "x": 240.0, - "y": 675.0 - } - }, - { - "id": "inc", - "name": "inc#0", - "pos": { - "x": 315.0, - "y": 135.0 - }, - "params": 16 - }, - { - "id": "mux1_12", - "name": "mux1_12#0", - "pos": { - "x": 365.0, - "y": 420.0 - } - }, - { - "id": "mux1_16", - "name": "mux1_16#0", - "pos": { - "x": 255.0, - "y": 110.0 - } - }, - { - "id": "mux1_16", - "name": "mux1_16#1", - "pos": { - "x": 910.0, - "y": 215.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 635.0, - "y": 145.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#1", - "pos": { - "x": 635.0, - "y": 240.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 145.0, - "y": 380.0 - } - }, - { - "id": "xor", - "name": "xor#1", - "pos": { - "x": 145.0, - "y": 405.0 - } - }, - { - "id": "xor", - "name": "xor#2", - "pos": { - "x": 145.0, - "y": 430.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Am2904#0", - "pinName": "CT" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "_CC" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 675.0, - "y": 460.0 - }, - { - "x": 675.0, - "y": 355.0 - }, - { - "x": 470.0, - "y": 355.0 - }, - { - "x": 470.0, - "y": 505.0 - }, - { - "x": 400.0, - "y": 505.0 - }, - { - "x": 400.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Qn+3" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "Qn" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 835.0, - "y": 515.0 - }, - { - "x": 835.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "QIOn" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "Qn+3" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 540.0, - "y": 530.0 - }, - { - "x": 540.0, - "y": 660.0 - }, - { - "x": 1215.0, - "y": 660.0 - }, - { - "x": 1215.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "@mireg_cpol", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "Am2900MicroInstructionMemory#0", - "pinName": "D" - }, - "pin2": { - "compName": "dlatch80#0", - "pinName": "D" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 205.0, - "y": 615.0 - }, - { - "x": 205.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16_invwe#0", - "pinName": "C" - }, - "name": "unnamedWire#102", - "path": [ - { - "x": 255.0, - "y": 310.0 - }, - { - "x": 480.0, - "y": 310.0 - }, - { - "x": 480.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 390.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "O2" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 320.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "EN" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 450.0, - "y": 205.0 - }, - { - "x": 450.0, - "y": 140.0 - }, - { - "x": 435.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 390.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IN" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "F3" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 525.0, - "y": 425.0 - }, - { - "x": 525.0, - "y": 645.0 - }, - { - "x": 1105.0, - "y": 645.0 - }, - { - "x": 1105.0, - "y": 455.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "EN" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 435.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#111", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 930.0, - "y": 725.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 760.0, - "y": 165.0 - }, - { - "x": 760.0, - "y": 385.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "I" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 755.0, - "y": 390.0 - }, - { - "x": 755.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#117", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O37" - }, - "name": "unnamedWire#119", - "path": [ - { - "x": 830.0, - "y": 715.0 - }, - { - "x": 830.0, - "y": 810.0 - }, - { - "x": 715.0, - "y": 810.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "F\u003d0" - }, - "pin2": { - "compName": "and#1", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 720.0, - "y": 445.0 - }, - { - "x": 720.0, - "y": 535.0 - }, - { - "x": 840.0, - "y": 535.0 - }, - { - "x": 840.0, - "y": 625.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "name": "unnamedWire#120", - "path": [ - { - "x": 1015.0, - "y": 720.0 - }, - { - "x": 1015.0, - "y": 610.0 - }, - { - "x": 1000.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#121", - "path": [ - { - "x": 340.0, - "y": 700.0 - }, - { - "x": 340.0, - "y": 285.0 - }, - { - "x": 180.0, - "y": 285.0 - }, - { - "x": 180.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#122", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#123", - "path": [ - { - "x": 930.0, - "y": 690.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#1", - "pinName": "EN" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "name": "unnamedWire#124", - "path": [ - { - "x": 1000.0, - "y": 695.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "Am2900MainMemory#0", - "pinName": "A" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "Am2900MainMemory#0", - "pinName": "D" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "IN" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "S" - }, - "name": "unnamedWire#127", - "path": [ - { - "x": 310.0, - "y": 225.0 - }, - { - "x": 240.0, - "y": 225.0 - }, - { - "x": 240.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "D" - }, - "name": "unnamedWire#128", - "path": [ - { - "x": 335.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "A" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "Y" - }, - "name": "unnamedWire#129", - "path": [ - { - "x": 335.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#1", - "pinName": "F\u003d0" - }, - "pin2": { - "compName": "and#1", - "pinName": "A" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 845.0, - "y": 445.0 - }, - { - "x": 845.0, - "y": 615.0 - } - ] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "CI" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "name": "unnamedWire#130", - "path": [ - { - "x": 360.0, - "y": 145.0 - }, - { - "x": 360.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#131", - "path": [ - { - "x": 330.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#132", - "path": [] - }, - { - "pin1": { - "compName": "FixedOutput#7", - "pinName": "out" - }, - "pin2": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "name": "unnamedWire#133", - "path": [ - { - "x": 285.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "IN" - }, - "name": "unnamedWire#134", - "path": [ - { - "x": 420.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#5", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#135", - "path": [ - { - "x": 230.0, - "y": 80.0 - }, - { - "x": 230.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910#0", - "pinName": "_MAP" - }, - "pin2": { - "compName": "mux1_12#0", - "pinName": "S" - }, - "name": "unnamedWire#136", - "path": [ - { - "x": 420.0, - "y": 560.0 - }, - { - "x": 360.0, - "y": 560.0 - }, - { - "x": 360.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "Q" - }, - "name": "unnamedWire#137", - "path": [] - }, - { - "pin1": { - "compName": "@dlatch80#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "I" - }, - "name": "unnamedWire#138", - "path": [ - { - "x": 330.0, - "y": 760.0 - }, - { - "x": 330.0, - "y": 845.0 - }, - { - "x": 740.0, - "y": 845.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O22" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "_CCEN" - }, - "name": "unnamedWire#139", - "path": [ - { - "x": 565.0, - "y": 735.0 - }, - { - "x": 395.0, - "y": 735.0 - }, - { - "x": 395.0, - "y": 525.0 - } - ] - }, - { - "pin1": { - "compName": "and#1", - "pinName": "Y" - }, - "pin2": { - "compName": "and#2", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 900.0, - "y": 615.0 - }, - { - "x": 900.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O21" - }, - "name": "unnamedWire#140", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O20" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O2" - }, - "name": "unnamedWire#141", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O19" - }, - "name": "unnamedWire#142", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O18" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O0" - }, - "name": "unnamedWire#143", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "I" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "I" - }, - "name": "unnamedWire#144", - "path": [ - { - "x": 540.0, - "y": 730.0 - }, - { - "x": 400.0, - "y": 730.0 - }, - { - "x": 400.0, - "y": 535.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O17" - }, - "name": "unnamedWire#145", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O16" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O10" - }, - "name": "unnamedWire#146", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O15" - }, - "name": "unnamedWire#147", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O14" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O8" - }, - "name": "unnamedWire#148", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O13" - }, - "name": "unnamedWire#149", - "path": [] - }, - { - "pin1": { - "compName": "and#2", - "pinName": "A" - }, - "pin2": { - "compName": "and#0", - "pinName": "Y" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 900.0, - "y": 600.0 - }, - { - "x": 900.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O12" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O6" - }, - "name": "unnamedWire#150", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O11" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O10" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O4" - }, - "name": "unnamedWire#152", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O9" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O2" - }, - "name": "unnamedWire#154", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O7" - }, - "name": "unnamedWire#155", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O0" - }, - "name": "unnamedWire#156", - "path": [] - }, - { - "pin1": { - "compName": "mux1_12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "D" - }, - "name": "unnamedWire#157", - "path": [ - { - "x": 435.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_12#0", - "pinName": "I1" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "I" - }, - "name": "unnamedWire#158", - "path": [ - { - "x": 350.0, - "y": 480.0 - }, - { - "x": 350.0, - "y": 760.0 - }, - { - "x": 460.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "@dlatch80#1", - "pinName": "D" - }, - "pin2": { - "compName": "dlatch80#0", - "pinName": "Q" - }, - "name": "unnamedWire#159", - "path": [] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "B" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "F\u003d0" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 850.0, - "y": 605.0 - }, - { - "x": 850.0, - "y": 535.0 - }, - { - "x": 970.0, - "y": 535.0 - }, - { - "x": 970.0, - "y": 445.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#160", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#48", - "pinName": "O3" - }, - "name": "unnamedWire#161", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#48", - "pinName": "I" - }, - "name": "unnamedWire#162", - "path": [ - { - "x": 325.0, - "y": 640.0 - }, - { - "x": 380.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2900MicroInstructionMemory#0", - "pinName": "A" - }, - "name": "unnamedWire#163", - "path": [ - { - "x": 440.0, - "y": 565.0 - }, - { - "x": 205.0, - "y": 565.0 - }, - { - "x": 205.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O29" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_CEM" - }, - "name": "unnamedWire#164", - "path": [ - { - "x": 635.0, - "y": 780.0 - }, - { - "x": 505.0, - "y": 780.0 - }, - { - "x": 505.0, - "y": 400.0 - }, - { - "x": 555.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O30" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_CEmu" - }, - "name": "unnamedWire#165", - "path": [ - { - "x": 645.0, - "y": 775.0 - }, - { - "x": 500.0, - "y": 775.0 - }, - { - "x": 500.0, - "y": 395.0 - }, - { - "x": 595.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O23" - }, - "name": "unnamedWire#166", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O25" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O24" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O26" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O3" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "F\u003d0" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 1095.0, - "y": 445.0 - }, - { - "x": 1095.0, - "y": 540.0 - }, - { - "x": 855.0, - "y": 540.0 - }, - { - "x": 855.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O27" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O28" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O5" - }, - "name": "unnamedWire#171", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#22", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O31" - }, - "name": "unnamedWire#172", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O32" - }, - "pin2": { - "compName": "Splitter#22", - "pinName": "O1" - }, - "name": "unnamedWire#173", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#22", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O33" - }, - "name": "unnamedWire#174", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O34" - }, - "pin2": { - "compName": "Splitter#22", - "pinName": "O3" - }, - "name": "unnamedWire#175", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O35" - }, - "name": "unnamedWire#176", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O36" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O1" - }, - "name": "unnamedWire#177", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "I" - }, - "name": "unnamedWire#178", - "path": [ - { - "x": 755.0, - "y": 785.0 - }, - { - "x": 600.0, - "y": 785.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#22", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#24", - "pinName": "I" - }, - "name": "unnamedWire#179", - "path": [ - { - "x": 670.0, - "y": 790.0 - }, - { - "x": 705.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "and#2", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IZ" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 945.0, - "y": 600.0 - }, - { - "x": 945.0, - "y": 635.0 - }, - { - "x": 515.0, - "y": 635.0 - }, - { - "x": 515.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#25", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "I" - }, - "name": "unnamedWire#180", - "path": [ - { - "x": 665.0, - "y": 800.0 - }, - { - "x": 700.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O0" - }, - "name": "unnamedWire#181", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O1" - }, - "name": "unnamedWire#182", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#23", - "pinName": "O2" - }, - "name": "unnamedWire#183", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O3" - }, - "name": "unnamedWire#184", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#23", - "pinName": "O4" - }, - "name": "unnamedWire#185", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O5" - }, - "name": "unnamedWire#186", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#24", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O6" - }, - "name": "unnamedWire#187", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#24", - "pinName": "O1" - }, - "name": "unnamedWire#188", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#24", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O8" - }, - "name": "unnamedWire#189", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "OVR" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IOVR" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 1100.0, - "y": 450.0 - }, - { - "x": 1100.0, - "y": 650.0 - }, - { - "x": 530.0, - "y": 650.0 - }, - { - "x": 530.0, - "y": 430.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#24", - "pinName": "O3" - }, - "name": "unnamedWire#190", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#25", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O11" - }, - "name": "unnamedWire#191", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O12" - }, - "pin2": { - "compName": "Splitter#25", - "pinName": "O1" - }, - "name": "unnamedWire#192", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O73" - }, - "name": "unnamedWire#193", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O72" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O14" - }, - "name": "unnamedWire#194", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O71" - }, - "name": "unnamedWire#195", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O70" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O12" - }, - "name": "unnamedWire#196", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O69" - }, - "name": "unnamedWire#197", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O68" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O10" - }, - "name": "unnamedWire#198", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O67" - }, - "name": "unnamedWire#199", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "RAMn+3" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "RAMn" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 830.0, - "y": 510.0 - }, - { - "x": 830.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IC" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 1220.0, - "y": 520.0 - }, - { - "x": 1220.0, - "y": 640.0 - }, - { - "x": 520.0, - "y": 640.0 - }, - { - "x": 520.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O66" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O8" - }, - "name": "unnamedWire#200", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O65" - }, - "name": "unnamedWire#201", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O64" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O6" - }, - "name": "unnamedWire#202", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O63" - }, - "name": "unnamedWire#203", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O62" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O4" - }, - "name": "unnamedWire#204", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O61" - }, - "name": "unnamedWire#205", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O60" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O2" - }, - "name": "unnamedWire#206", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O59" - }, - "name": "unnamedWire#207", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O58" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O0" - }, - "name": "unnamedWire#208", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#27", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O57" - }, - "name": "unnamedWire#209", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "Cn" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 840.0, - "y": 520.0 - }, - { - "x": 840.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O56" - }, - "pin2": { - "compName": "Splitter#27", - "pinName": "O1" - }, - "name": "unnamedWire#210", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#27", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O55" - }, - "name": "unnamedWire#211", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O54" - }, - "pin2": { - "compName": "Splitter#28", - "pinName": "O2" - }, - "name": "unnamedWire#212", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#28", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O53" - }, - "name": "unnamedWire#213", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O52" - }, - "pin2": { - "compName": "Splitter#28", - "pinName": "O0" - }, - "name": "unnamedWire#214", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#29", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O51" - }, - "name": "unnamedWire#215", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O50" - }, - "pin2": { - "compName": "Splitter#29", - "pinName": "O1" - }, - "name": "unnamedWire#216", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#29", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O49" - }, - "name": "unnamedWire#217", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#30", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O48" - }, - "name": "unnamedWire#218", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#30", - "pinName": "O2" - }, - "name": "unnamedWire#219", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#1", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "Cn" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 965.0, - "y": 520.0 - }, - { - "x": 965.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#30", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O46" - }, - "name": "unnamedWire#220", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#30", - "pinName": "O0" - }, - "name": "unnamedWire#221", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#31", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O40" - }, - "name": "unnamedWire#222", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#31", - "pinName": "O1" - }, - "name": "unnamedWire#223", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#31", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O42" - }, - "name": "unnamedWire#224", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#31", - "pinName": "O3" - }, - "name": "unnamedWire#225", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O10" - }, - "name": "unnamedWire#226", - "path": [ - { - "x": 680.0, - "y": 795.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#33", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#29", - "pinName": "I" - }, - "name": "unnamedWire#227", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#34", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#28", - "pinName": "I" - }, - "name": "unnamedWire#228", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#32", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#27", - "pinName": "I" - }, - "name": "unnamedWire#229", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#2", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "Cn" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 1090.0, - "y": 520.0 - }, - { - "x": 1090.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#32", - "pinName": "O0" - }, - "name": "unnamedWire#230", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#32", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#35", - "pinName": "O1" - }, - "name": "unnamedWire#231", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#32", - "pinName": "O2" - }, - "name": "unnamedWire#232", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#34", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#35", - "pinName": "O3" - }, - "name": "unnamedWire#233", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#34", - "pinName": "O1" - }, - "name": "unnamedWire#234", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#34", - "pinName": "O2" - }, - "name": "unnamedWire#235", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#33", - "pinName": "O0" - }, - "name": "unnamedWire#236", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#33", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#237", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#33", - "pinName": "O2" - }, - "name": "unnamedWire#238", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#35", - "pinName": "O7" - }, - "name": "unnamedWire#239", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "I" - }, - "name": "unnamedWire#240", - "path": [ - { - "x": 720.0, - "y": 730.0 - }, - { - "x": 545.0, - "y": 730.0 - }, - { - "x": 545.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "Am2900MainMemory#0", - "pinName": "RW" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O0" - }, - "name": "unnamedWire#241", - "path": [ - { - "x": 175.0, - "y": 100.0 - }, - { - "x": 175.0, - "y": 290.0 - }, - { - "x": 345.0, - "y": 290.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "I" - }, - "name": "unnamedWire#242", - "path": [ - { - "x": 590.0, - "y": 150.0 - }, - { - "x": 590.0, - "y": 335.0 - }, - { - "x": 240.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#42", - "pinName": "O3" - }, - "name": "unnamedWire#243", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#42", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O14" - }, - "name": "unnamedWire#244", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#42", - "pinName": "O1" - }, - "name": "unnamedWire#245", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#42", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O12" - }, - "name": "unnamedWire#246", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#43", - "pinName": "O3" - }, - "name": "unnamedWire#247", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#43", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O10" - }, - "name": "unnamedWire#248", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#43", - "pinName": "O1" - }, - "name": "unnamedWire#249", - "path": [] - }, - { - "pin1": { - "compName": "@c", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#43", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O8" - }, - "name": "unnamedWire#250", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#44", - "pinName": "O3" - }, - "name": "unnamedWire#251", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#44", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O6" - }, - "name": "unnamedWire#252", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#44", - "pinName": "O1" - }, - "name": "unnamedWire#253", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#44", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O4" - }, - "name": "unnamedWire#254", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#45", - "pinName": "O3" - }, - "name": "unnamedWire#255", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#45", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O2" - }, - "name": "unnamedWire#256", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#45", - "pinName": "O1" - }, - "name": "unnamedWire#257", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#45", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O0" - }, - "name": "unnamedWire#258", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#38", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O15" - }, - "name": "unnamedWire#259", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "C" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 1090.0, - "y": 395.0 - }, - { - "x": 1090.0, - "y": 495.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O14" - }, - "pin2": { - "compName": "Splitter#38", - "pinName": "O2" - }, - "name": "unnamedWire#260", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#38", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O13" - }, - "name": "unnamedWire#261", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O12" - }, - "pin2": { - "compName": "Splitter#38", - "pinName": "O0" - }, - "name": "unnamedWire#262", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#39", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O11" - }, - "name": "unnamedWire#263", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O10" - }, - "pin2": { - "compName": "Splitter#39", - "pinName": "O2" - }, - "name": "unnamedWire#264", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#39", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O9" - }, - "name": "unnamedWire#265", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#39", - "pinName": "O0" - }, - "name": "unnamedWire#266", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#40", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O7" - }, - "name": "unnamedWire#267", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#40", - "pinName": "O2" - }, - "name": "unnamedWire#268", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#40", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O5" - }, - "name": "unnamedWire#269", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#2", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 965.0, - "y": 495.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#40", - "pinName": "O0" - }, - "name": "unnamedWire#270", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#41", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O3" - }, - "name": "unnamedWire#271", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#41", - "pinName": "O2" - }, - "name": "unnamedWire#272", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#41", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O1" - }, - "name": "unnamedWire#273", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#41", - "pinName": "O0" - }, - "name": "unnamedWire#274", - "path": [] - }, - { - "pin1": { - "compName": "mux1_16#1", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "I" - }, - "name": "unnamedWire#275", - "path": [ - { - "x": 970.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_16#1", - "pinName": "S" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O74" - }, - "name": "unnamedWire#276", - "path": [ - { - "x": 905.0, - "y": 220.0 - }, - { - "x": 905.0, - "y": 210.0 - }, - { - "x": 1230.0, - "y": 210.0 - }, - { - "x": 1230.0, - "y": 760.0 - }, - { - "x": 1085.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "I" - }, - "pin2": { - "compName": "mux1_16#1", - "pinName": "I0" - }, - "name": "unnamedWire#277", - "path": [ - { - "x": 1000.0, - "y": 740.0 - }, - { - "x": 1235.0, - "y": 740.0 - }, - { - "x": 1235.0, - "y": 205.0 - }, - { - "x": 900.0, - "y": 205.0 - }, - { - "x": 900.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#278", - "path": [ - { - "x": 970.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "name": "unnamedWire#279", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#1", - "pinName": "IN" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#280", - "path": [ - { - "x": 985.0, - "y": 625.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "IN" - }, - "name": "unnamedWire#281", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I1" - }, - "name": "unnamedWire#282", - "path": [ - { - "x": 420.0, - "y": 95.0 - }, - { - "x": 245.0, - "y": 95.0 - }, - { - "x": 245.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#283", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "name": "unnamedWire#284", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#285", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "name": "unnamedWire#286", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#287", - "path": [ - { - "x": 450.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "OUT" - }, - "name": "unnamedWire#288", - "path": [ - { - "x": 455.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "dff16_invwe#0", - "pinName": "D" - }, - "name": "unnamedWire#289", - "path": [ - { - "x": 475.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#1", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 840.0, - "y": 495.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#290", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O1" - }, - "pin2": { - "compName": "dff16_invwe#0", - "pinName": "_WE" - }, - "name": "unnamedWire#291", - "path": [ - { - "x": 355.0, - "y": 285.0 - }, - { - "x": 485.0, - "y": 285.0 - }, - { - "x": 485.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "name": "unnamedWire#292", - "path": [ - { - "x": 315.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "name": "unnamedWire#293", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "name": "unnamedWire#294", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "name": "unnamedWire#295", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#48", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O4" - }, - "name": "unnamedWire#296", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#48", - "pinName": "O1" - }, - "name": "unnamedWire#297", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#48", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O2" - }, - "name": "unnamedWire#298", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O11" - }, - "name": "unnamedWire#299", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#1", - "pinName": "Qn+3" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "Qn" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 960.0, - "y": 515.0 - }, - { - "x": 960.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O10" - }, - "name": "unnamedWire#300", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O9" - }, - "name": "unnamedWire#301", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#47", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#302", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "pin2": { - "compName": "Splitter#47", - "pinName": "O2" - }, - "name": "unnamedWire#303", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#47", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#304", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "pin2": { - "compName": "Splitter#47", - "pinName": "O0" - }, - "name": "unnamedWire#305", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#49", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_1" - }, - "name": "unnamedWire#306", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_2" - }, - "pin2": { - "compName": "Splitter#49", - "pinName": "O2" - }, - "name": "unnamedWire#307", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#49", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_3" - }, - "name": "unnamedWire#308", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_4" - }, - "pin2": { - "compName": "Splitter#49", - "pinName": "O0" - }, - "name": "unnamedWire#309", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "C" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 715.0, - "y": 495.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#47", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#30", - "pinName": "I" - }, - "name": "unnamedWire#310", - "path": [ - { - "x": 600.0, - "y": 215.0 - }, - { - "x": 600.0, - "y": 335.0 - }, - { - "x": 690.0, - "y": 335.0 - }, - { - "x": 690.0, - "y": 675.0 - }, - { - "x": 810.0, - "y": 675.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#31", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#49", - "pinName": "I" - }, - "name": "unnamedWire#311", - "path": [ - { - "x": 760.0, - "y": 785.0 - }, - { - "x": 800.0, - "y": 785.0 - }, - { - "x": 800.0, - "y": 685.0 - }, - { - "x": 700.0, - "y": 685.0 - }, - { - "x": 700.0, - "y": 345.0 - }, - { - "x": 610.0, - "y": 345.0 - }, - { - "x": 610.0, - "y": 310.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O44" - }, - "name": "unnamedWire#312", - "path": [ - { - "x": 605.0, - "y": 150.0 - }, - { - "x": 605.0, - "y": 340.0 - }, - { - "x": 695.0, - "y": 340.0 - }, - { - "x": 695.0, - "y": 680.0 - }, - { - "x": 805.0, - "y": 680.0 - }, - { - "x": 805.0, - "y": 800.0 - }, - { - "x": 785.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "S0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O39" - }, - "name": "unnamedWire#313", - "path": [ - { - "x": 615.0, - "y": 245.0 - }, - { - "x": 615.0, - "y": 350.0 - }, - { - "x": 705.0, - "y": 350.0 - }, - { - "x": 705.0, - "y": 690.0 - }, - { - "x": 795.0, - "y": 690.0 - }, - { - "x": 795.0, - "y": 790.0 - }, - { - "x": 735.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#35", - "pinName": "I" - }, - "name": "unnamedWire#314", - "path": [ - { - "x": 820.0, - "y": 735.0 - }, - { - "x": 875.0, - "y": 735.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#315", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "name": "unnamedWire#316", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "I" - }, - "name": "unnamedWire#317", - "path": [ - { - "x": 820.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "I" - }, - "name": "unnamedWire#318", - "path": [ - { - "x": 945.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "I" - }, - "name": "unnamedWire#319", - "path": [ - { - "x": 1070.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 715.0, - "y": 365.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "I" - }, - "name": "unnamedWire#320", - "path": [ - { - "x": 1205.0, - "y": 530.0 - }, - { - "x": 1205.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#38", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "Y" - }, - "name": "unnamedWire#321", - "path": [ - { - "x": 910.0, - "y": 545.0 - }, - { - "x": 1185.0, - "y": 545.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#39", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "Y" - }, - "name": "unnamedWire#322", - "path": [ - { - "x": 950.0, - "y": 550.0 - }, - { - "x": 1050.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#40", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "Y" - }, - "name": "unnamedWire#323", - "path": [ - { - "x": 990.0, - "y": 555.0 - }, - { - "x": 925.0, - "y": 555.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#41", - "pinName": "I" - }, - "name": "unnamedWire#324", - "path": [ - { - "x": 800.0, - "y": 560.0 - }, - { - "x": 1030.0, - "y": 560.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#45", - "pinName": "I" - }, - "name": "unnamedWire#325", - "path": [ - { - "x": 785.0, - "y": 375.0 - }, - { - "x": 1030.0, - "y": 375.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#44", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "D" - }, - "name": "unnamedWire#326", - "path": [ - { - "x": 990.0, - "y": 370.0 - }, - { - "x": 910.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#43", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "D" - }, - "name": "unnamedWire#327", - "path": [ - { - "x": 950.0, - "y": 365.0 - }, - { - "x": 1035.0, - "y": 365.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#42", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "D" - }, - "name": "unnamedWire#328", - "path": [ - { - "x": 910.0, - "y": 360.0 - }, - { - "x": 1170.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#329", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Cn" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "C0" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 675.0, - "y": 505.0 - }, - { - "x": 675.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I0" - }, - "name": "unnamedWire#330", - "path": [ - { - "x": 250.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O8" - }, - "name": "unnamedWire#331", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#1", - "pinName": "" - }, - "name": "unnamedWire#332", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#2", - "pinName": "" - }, - "name": "unnamedWire#333", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#334", - "path": [ - { - "x": 340.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#335", - "path": [ - { - "x": 185.0, - "y": 230.0 - }, - { - "x": 185.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "name": "unnamedWire#336", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O7" - }, - "name": "unnamedWire#337", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#338", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#339", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "C" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 445.0, - "y": 365.0981951658187 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O6" - }, - "name": "unnamedWire#340", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O5" - }, - "name": "unnamedWire#341", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O4" - }, - "name": "unnamedWire#342", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "mux1_12#0", - "pinName": "I0" - }, - "name": "unnamedWire#343", - "path": [ - { - "x": 260.0, - "y": 440.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#5", - "pinName": "EN" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "name": "unnamedWire#344", - "path": [ - { - "x": 215.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O38" - }, - "pin2": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "name": "unnamedWire#345", - "path": [ - { - "x": 725.0, - "y": 805.0 - }, - { - "x": 825.0, - "y": 805.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "name": "unnamedWire#346", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "name": "unnamedWire#347", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "dlatch80#0", - "pinName": "E" - }, - "name": "unnamedWire#348", - "path": [ - { - "x": 235.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#349", - "path": [] - }, - { - "pin1": { - "compName": "FixedOutput#1", - "pinName": "out" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OECT" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 660.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#350", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "@dlatch80#1", - "pinName": "E" - }, - "name": "unnamedWire#351", - "path": [ - { - "x": 290.0, - "y": 535.0 - }, - { - "x": 290.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "FixedOutput#2", - "pinName": "out" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "_RLD" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "Am2910#0", - "pinName": "CI" - }, - "pin2": { - "compName": "FixedOutput#3", - "pinName": "out" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 480.0, - "y": 540.0 - }, - { - "x": 480.0, - "y": 570.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910#0", - "pinName": "_OE" - }, - "pin2": { - "compName": "FixedOutput#4", - "pinName": "out" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 445.0, - "y": 580.0 - } - ] - }, - { - "pin1": { - "compName": "FixedOutput#5", - "pinName": "out" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_SE" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#2", - "pinName": "RAMn" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "RAMn+3" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 955.0, - "y": 410.0 - }, - { - "x": 955.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "FixedOutput#6", - "pinName": "out" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 560.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EZ" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EOVR" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 575.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EC" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EN" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "dff16_invwe#0", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O7" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O5" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "RAMn" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "RAMn+3" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 1080.0, - "y": 410.0 - }, - { - "x": 1080.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O3" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O2" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O0" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "FixedOutput#0", - "pinName": "out" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 570.0, - "y": 280.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O3" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 570.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O3" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O1" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#2", - "pinName": "Qn+3" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "Qn" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 1085.0, - "y": 515.0 - }, - { - "x": 1085.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O1" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_1" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_2" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_3" - }, - "name": "unnamedWire#69", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Qn" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "QIO0" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 685.0, - "y": 420.0 - }, - { - "x": 685.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_4" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 610.0, - "y": 250.0 - }, - { - "x": 610.0, - "y": 270.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 610.0, - "y": 210.0 - }, - { - "x": 610.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O3" - }, - "name": "unnamedWire#73", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O1" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O3" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y2" - }, - "name": "unnamedWire#78", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O1" - }, - "name": "unnamedWire#79", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "SIO0" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "RAMn" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 680.0, - "y": 525.0 - }, - { - "x": 680.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y4" - }, - "name": "unnamedWire#80", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "A" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 820.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "B" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 825.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "A" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 945.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "B" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 950.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "A" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 1070.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "B" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 1075.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "A" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 1205.0, - "y": 385.0 - }, - { - "x": 1205.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 1210.0, - "y": 435.0 - }, - { - "x": 1210.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "SIOn" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "RAMn+3" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 535.0, - "y": 525.0 - }, - { - "x": 535.0, - "y": 655.0 - }, - { - "x": 1210.0, - "y": 655.0 - }, - { - "x": 1210.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "OUT" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 1245.0, - "y": 60.0 - }, - { - "x": 1245.0, - "y": 625.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#1", - "pinName": "I1" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 895.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 1240.0, - "y": 45.0 - }, - { - "x": 1240.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "xor#2", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "C" - }, - "name": "unnamedWire#94", - "path": [ - { - "x": 245.0, - "y": 270.0 - }, - { - "x": 365.0, - "y": 270.0 - }, - { - "x": 365.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "@bz_pc_cpol", - "pinName": "" - }, - "pin2": { - "compName": "xor#2", - "pinName": "B" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "@c", - "pinName": "" - }, - "pin2": { - "compName": "xor#2", - "pinName": "A" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "B" - }, - "pin2": { - "compName": "@ireg_cpol", - "pinName": "" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "A" - }, - "pin2": { - "compName": "@c", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "A" - }, - "pin2": { - "compName": "@c", - "pinName": "" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2900", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json deleted file mode 100644 index 7a0b4b2c..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json +++ /dev/null @@ -1,253 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "_Q", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "_R", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "_S", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 7.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 40.0, - "y": 12.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 34.0, - "y": 16.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 64.0, - "y": 36.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_Q" - }, - "name": "_q", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "q", - "path": [ - { - "x": 35.0, - "y": 17.5 - }, - { - "x": 35.0, - "y": 7.5 - }, - { - "x": 65.0, - "y": 7.5 - }, - { - "x": 65.0, - "y": 12.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_S" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_R" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 35.0, - "y": 37.5 - }, - { - "x": 35.0, - "y": 27.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 65.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 65.0, - "y": 42.5 - }, - { - "x": 5.0, - "y": 42.5 - }, - { - "x": 5.0, - "y": 22.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "_rsLatch", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "wireForcing", - "params": { - "wiresToForce": [ - "q" - ], - "wiresToForceInverted": [ - "_q" - ] - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json deleted file mode 100644 index 270afa21..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json +++ /dev/null @@ -1,4003 +0,0 @@ -{ - "width": 90.0, - "height": 125.0, - "interfacePins": [ - { - "location": { - "x": 90.0, - "y": 15.0 - }, - "name": "A", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 90.0, - "y": 35.0 - }, - "name": "B", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 105.0 - }, - "name": "Cn", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 90.0, - "y": 120.0 - }, - "name": "Cn+4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 0.0 - }, - "name": "D", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "F3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "F\u003d0", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 90.0, - "y": 80.0 - }, - "name": "I", - "logicWidth": 9, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "OVR", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "Qn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 90.0, - "y": 115.0 - }, - "name": "Qn+3", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "RAMn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 90.0, - "y": 110.0 - }, - "name": "RAMn+3", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 75.0, - "y": 125.0 - }, - "name": "Y", - "logicWidth": 4, - "usage": "INPUT" - } - ], - "innerScale": 0.1, - "submodel": { - "components": [ - { - "id": "Am2901ALUInclSourceDecodeInclFunctionDecode", - "name": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pos": { - "x": 510.0, - "y": 620.0 - } - }, - { - "id": "Am2901DestDecode", - "name": "Am2901DestDecode#0", - "pos": { - "x": 380.0, - "y": 160.0 - } - }, - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 465.0, - "y": 190.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 420.0, - "y": 440.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 855.0, - "y": 760.0 - }, - "params": { - "logicWidth": 9, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 735.0, - "y": 1235.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 670.0, - "y": 135.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 670.0, - "y": 335.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#5", - "pos": { - "x": 475.0, - "y": 615.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 355.0, - "y": 920.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#1", - "pos": { - "x": 370.0, - "y": 850.0 - }, - "params": { - "logicWidth": 1, - "orientation": "DOWN" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#2", - "pos": { - "x": 400.0, - "y": 950.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#3", - "pos": { - "x": 400.0, - "y": 725.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 14.0, - "y": 714.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 459.0, - "y": 194.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 239.0, - "y": 929.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 244.0, - "y": 939.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 249.0, - "y": 949.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 254.0, - "y": 959.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 319.0, - "y": 929.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 334.0, - "y": 959.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 134.0, - "y": 1039.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 139.0, - "y": 1049.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 379.0, - "y": 529.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 394.0, - "y": 544.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 254.0, - "y": 749.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 434.0, - "y": 734.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 354.0, - "y": 504.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 359.0, - "y": 509.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 364.0, - "y": 514.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 369.0, - "y": 519.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 354.0, - "y": 449.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 359.0, - "y": 459.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 364.0, - "y": 469.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 369.0, - "y": 479.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 104.0, - "y": 769.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 134.0, - "y": 729.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 109.0, - "y": 779.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 114.0, - "y": 789.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#32", - "pos": { - "x": 109.0, - "y": 809.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#33", - "pos": { - "x": 114.0, - "y": 819.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#34", - "pos": { - "x": 119.0, - "y": 829.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#35", - "pos": { - "x": 104.0, - "y": 799.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#36", - "pos": { - "x": 109.0, - "y": 839.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#37", - "pos": { - "x": 114.0, - "y": 849.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#38", - "pos": { - "x": 119.0, - "y": 859.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#39", - "pos": { - "x": 414.0, - "y": 449.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 129.0, - "y": 739.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#40", - "pos": { - "x": 99.0, - "y": 964.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#41", - "pos": { - "x": 99.0, - "y": 764.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#42", - "pos": { - "x": 124.0, - "y": 889.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#43", - "pos": { - "x": 364.0, - "y": 889.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#44", - "pos": { - "x": 134.0, - "y": 894.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#45", - "pos": { - "x": 409.0, - "y": 894.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#46", - "pos": { - "x": 424.0, - "y": 1079.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 124.0, - "y": 749.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 349.0, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 344.0, - "y": 374.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 339.0, - "y": 384.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 334.0, - "y": 394.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 495.0, - "y": 180.0 - } - }, - { - "id": "dff4", - "name": "dff4#0", - "pos": { - "x": 200.0, - "y": 925.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#0", - "pos": { - "x": 720.0, - "y": 170.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#1", - "pos": { - "x": 260.0, - "y": 690.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 500.0, - "y": 350.0 - } - }, - { - "id": "or4", - "name": "or4#0", - "pos": { - "x": 375.0, - "y": 445.0 - } - }, - { - "id": "ram4", - "name": "ram4#0", - "pos": { - "x": 655.0, - "y": 170.0 - } - }, - { - "id": "sel3_4", - "name": "sel3_4#0", - "pos": { - "x": 145.0, - "y": 725.0 - } - }, - { - "id": "sel3_4", - "name": "sel3_4#1", - "pos": { - "x": 150.0, - "y": 925.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "Am2901DestDecode#0", - "pinName": "I6" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 845.0, - "y": 780.0 - }, - { - "x": 845.0, - "y": 305.0 - }, - { - "x": 375.0, - "y": 305.0 - }, - { - "x": 375.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I5" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 805.0, - "y": 790.0 - }, - { - "x": 805.0, - "y": 615.0 - }, - { - "x": 585.0, - "y": 615.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 15.0, - "y": 90.0 - }, - { - "x": 460.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "F3" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#100", - "path": [ - { - "x": 625.0, - "y": 645.0 - }, - { - "x": 625.0, - "y": 540.0 - }, - { - "x": 390.0, - "y": 540.0 - }, - { - "x": 390.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 395.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#102", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#104", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "name": "unnamedWire#105", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "or4#0", - "pinName": "A1" - }, - "name": "unnamedWire#106", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "or4#0", - "pinName": "A2" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "or4#0", - "pinName": "A3" - }, - "name": "unnamedWire#108", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "or4#0", - "pinName": "A4" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 355.0, - "y": 405.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 360.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 365.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 370.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 105.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#115", - "path": [ - { - "x": 110.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 115.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "name": "unnamedWire#117", - "path": [ - { - "x": 100.0, - "y": 960.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#119", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 460.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#120", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "name": "unnamedWire#121", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "name": "unnamedWire#122", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "name": "unnamedWire#123", - "path": [ - { - "x": 120.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "name": "unnamedWire#124", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#127", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#128", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "name": "unnamedWire#129", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 230.0, - "y": 715.0 - }, - { - "x": 230.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "name": "unnamedWire#130", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "name": "unnamedWire#131", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C1" - }, - "name": "unnamedWire#132", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C2" - }, - "name": "unnamedWire#133", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C3" - }, - "name": "unnamedWire#134", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "IN" - }, - "name": "unnamedWire#135", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "B1" - }, - "name": "unnamedWire#136", - "path": [ - { - "x": 105.0, - "y": 1000.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "B2" - }, - "name": "unnamedWire#137", - "path": [ - { - "x": 110.0, - "y": 1010.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "B3" - }, - "name": "unnamedWire#138", - "path": [ - { - "x": 115.0, - "y": 1020.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "B4" - }, - "name": "unnamedWire#139", - "path": [ - { - "x": 120.0, - "y": 1030.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "C" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 715.0, - "y": 750.0 - }, - { - "x": 715.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "D1" - }, - "name": "unnamedWire#140", - "path": [ - { - "x": 195.0, - "y": 730.0 - }, - { - "x": 195.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "D2" - }, - "name": "unnamedWire#141", - "path": [ - { - "x": 200.0, - "y": 740.0 - }, - { - "x": 200.0, - "y": 275.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "D3" - }, - "name": "unnamedWire#142", - "path": [ - { - "x": 205.0, - "y": 750.0 - }, - { - "x": 205.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "D4" - }, - "name": "unnamedWire#143", - "path": [ - { - "x": 210.0, - "y": 760.0 - }, - { - "x": 210.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "RAMWE" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#144", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#145" - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "WE" - }, - "name": "unnamedWire#146", - "path": [ - { - "x": 630.0, - "y": 185.0 - }, - { - "x": 630.0, - "y": 255.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "QWE" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "WE" - }, - "name": "unnamedWire#147", - "path": [ - { - "x": 450.0, - "y": 215.0 - }, - { - "x": 450.0, - "y": 245.0 - }, - { - "x": 190.0, - "y": 245.0 - }, - { - "x": 190.0, - "y": 980.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "YF" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#148", - "path": [ - { - "x": 435.0, - "y": 195.0 - }, - { - "x": 435.0, - "y": 355.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O0" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "D1" - }, - "name": "unnamedWire#149", - "path": [ - { - "x": 505.0, - "y": 630.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "Am2901DestDecode#0", - "pinName": "I8" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 835.0, - "y": 760.0 - }, - { - "x": 835.0, - "y": 315.0 - }, - { - "x": 365.0, - "y": 315.0 - }, - { - "x": 365.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#152", - "path": [ - { - "x": 555.0, - "y": 375.0 - }, - { - "x": 555.0, - "y": 520.0 - }, - { - "x": 740.0, - "y": 520.0 - }, - { - "x": 740.0, - "y": 1230.0 - }, - { - "x": 745.0, - "y": 1230.0 - } - ] - }, - { - "pin1": { - "compName": "or4#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#154", - "path": [ - { - "x": 415.0, - "y": 445.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#155", - "path": [ - { - "x": 415.0, - "y": 455.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F\u003d0" - }, - "name": "unnamedWire#156", - "path": [ - { - "x": 445.0, - "y": 450.0 - }, - { - "x": 445.0, - "y": 490.0 - }, - { - "x": 310.0, - "y": 490.0 - }, - { - "x": 310.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "name": "unnamedWire#157", - "path": [ - { - "x": 765.0, - "y": 1220.0 - }, - { - "x": 750.0, - "y": 1220.0 - }, - { - "x": 750.0, - "y": 510.0 - }, - { - "x": 565.0, - "y": 510.0 - }, - { - "x": 565.0, - "y": 355.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "name": "unnamedWire#158", - "path": [ - { - "x": 100.0, - "y": 1115.0 - }, - { - "x": 380.0, - "y": 1115.0 - }, - { - "x": 380.0, - "y": 930.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "IN" - }, - "name": "unnamedWire#159", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "C" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 255.0, - "y": 735.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#160", - "path": [ - { - "x": 100.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "OUT" - }, - "name": "unnamedWire#161", - "path": [ - { - "x": 100.0, - "y": 885.0 - }, - { - "x": 380.0, - "y": 885.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F3" - }, - "name": "unnamedWire#162", - "path": [ - { - "x": 5.0, - "y": 545.0 - }, - { - "x": 5.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "name": "unnamedWire#163", - "path": [ - { - "x": 550.0, - "y": 385.0 - }, - { - "x": 550.0, - "y": 525.0 - }, - { - "x": 735.0, - "y": 525.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#42", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#164", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#43", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "EN" - }, - "name": "unnamedWire#165", - "path": [ - { - "x": 395.0, - "y": 890.0 - }, - { - "x": 395.0, - "y": 860.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#43", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "name": "unnamedWire#166", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#43", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#42", - "pinName": "" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#44", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#44", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#45", - "pinName": "" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "C" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 255.0, - "y": 900.0 - }, - { - "x": 195.0, - "y": 900.0 - }, - { - "x": 195.0, - "y": 970.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "EN" - }, - "pin2": { - "compName": "WireCrossPoint#45", - "pinName": "" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "IN" - }, - "name": "unnamedWire#171", - "path": [ - { - "x": 395.0, - "y": 735.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "C4" - }, - "pin2": { - "compName": "WireCrossPoint#46", - "pinName": "" - }, - "name": "unnamedWire#172", - "path": [ - { - "x": 145.0, - "y": 1070.0 - }, - { - "x": 145.0, - "y": 1080.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#46", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "OUT" - }, - "name": "unnamedWire#173", - "path": [ - { - "x": 425.0, - "y": 960.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#46", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Qn+3" - }, - "name": "unnamedWire#174", - "path": [ - { - "x": 425.0, - "y": 1150.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "B0" - }, - "name": "unnamedWire#178", - "path": [ - { - "x": 635.0, - "y": 365.0 - }, - { - "x": 635.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "name": "unnamedWire#179", - "path": [] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "LSH" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 420.0, - "y": 205.0 - }, - { - "x": 420.0, - "y": 240.0 - }, - { - "x": 135.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "NSH" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 425.0, - "y": 165.0 - }, - { - "x": 425.0, - "y": 235.0 - }, - { - "x": 130.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I4" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 800.0, - "y": 800.0 - }, - { - "x": 800.0, - "y": 610.0 - }, - { - "x": 575.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "RSH" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 430.0, - "y": 175.0 - }, - { - "x": 430.0, - "y": 230.0 - }, - { - "x": 125.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "SA" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "SB" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "SC" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#44", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "SA" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 135.0, - "y": 930.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "SB" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 130.0, - "y": 940.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "SC" - }, - "pin2": { - "compName": "WireCrossPoint#42", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 125.0, - "y": 950.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "B3" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 650.0, - "y": 245.0 - }, - { - "x": 650.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "B2" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 645.0, - "y": 235.0 - }, - { - "x": 645.0, - "y": 345.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I3" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 795.0, - "y": 810.0 - }, - { - "x": 795.0, - "y": 605.0 - }, - { - "x": 565.0, - "y": 605.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "B1" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 640.0, - "y": 355.0 - }, - { - "x": 640.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 490.0, - "y": 480.0 - }, - { - "x": 600.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "D4" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O3" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 475.0, - "y": 645.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O2" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "D3" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 485.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "D2" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O1" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 495.0, - "y": 635.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QA1" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D1" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QA2" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D2" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QA3" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D3" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QA4" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D4" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QB1" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D1" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 695.0, - "y": 215.0 - }, - { - "x": 695.0, - "y": 575.0 - }, - { - "x": 250.0, - "y": 575.0 - }, - { - "x": 250.0, - "y": 695.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I2" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 790.0, - "y": 820.0 - }, - { - "x": 790.0, - "y": 600.0 - }, - { - "x": 555.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QB2" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D2" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 700.0, - "y": 225.0 - }, - { - "x": 700.0, - "y": 570.0 - }, - { - "x": 245.0, - "y": 570.0 - }, - { - "x": 245.0, - "y": 705.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QB3" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D3" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 705.0, - "y": 235.0 - }, - { - "x": 705.0, - "y": 565.0 - }, - { - "x": 240.0, - "y": 565.0 - }, - { - "x": 240.0, - "y": 715.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QB4" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D4" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 710.0, - "y": 245.0 - }, - { - "x": 710.0, - "y": 560.0 - }, - { - "x": 235.0, - "y": 560.0 - }, - { - "x": 235.0, - "y": 725.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cn" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Cn" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 55.0, - "y": 1050.0 - }, - { - "x": 55.0, - "y": 600.0 - }, - { - "x": 520.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "A0" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 650.0, - "y": 175.0 - }, - { - "x": 650.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "A1" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 645.0, - "y": 155.0 - }, - { - "x": 645.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "A2" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 640.0, - "y": 145.0 - }, - { - "x": 640.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "A3" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 635.0, - "y": 135.0 - }, - { - "x": 635.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 765.0, - "y": 175.0 - }, - { - "x": 765.0, - "y": 80.0 - }, - { - "x": 350.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 770.0, - "y": 185.0 - }, - { - "x": 770.0, - "y": 75.0 - }, - { - "x": 345.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I1" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 785.0, - "y": 830.0 - }, - { - "x": 785.0, - "y": 595.0 - }, - { - "x": 545.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [ - { - "x": 775.0, - "y": 195.0 - }, - { - "x": 775.0, - "y": 70.0 - }, - { - "x": 340.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [ - { - "x": 780.0, - "y": 205.0 - }, - { - "x": 780.0, - "y": 65.0 - }, - { - "x": 335.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "A1" - }, - "name": "unnamedWire#56", - "path": [ - { - "x": 350.0, - "y": 655.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "A2" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 345.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "A3" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 340.0, - "y": 665.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "A4" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 335.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I0" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 780.0, - "y": 840.0 - }, - { - "x": 780.0, - "y": 590.0 - }, - { - "x": 535.0, - "y": 590.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q1" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "B1" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 300.0, - "y": 695.0 - }, - { - "x": 300.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q2" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "B2" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 305.0, - "y": 705.0 - }, - { - "x": 305.0, - "y": 685.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q3" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "B3" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 310.0, - "y": 715.0 - }, - { - "x": 310.0, - "y": 690.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q4" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "B4" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 315.0, - "y": 725.0 - }, - { - "x": 315.0, - "y": 695.0 - } - ] - }, - { - "pin1": { - "compName": "dff4#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "dff4#0", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "dff4#0", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "dff4#0", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "name": "unnamedWire#69", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Qn" - }, - "pin2": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 80.0, - "y": 200.0 - }, - { - "x": 80.0, - "y": 965.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 245.0, - "y": 1095.0 - }, - { - "x": 130.0, - "y": 1095.0 - }, - { - "x": 130.0, - "y": 1050.0 - }, - { - "x": 135.0, - "y": 1050.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 250.0, - "y": 1100.0 - }, - { - "x": 135.0, - "y": 1100.0 - }, - { - "x": 135.0, - "y": 1055.0 - }, - { - "x": 140.0, - "y": 1055.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "C1" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "C2" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "C3" - }, - "name": "unnamedWire#76", - "path": [ - { - "x": 255.0, - "y": 1105.0 - }, - { - "x": 140.0, - "y": 1105.0 - }, - { - "x": 140.0, - "y": 1060.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "Am2901DestDecode#0", - "pinName": "I7" - }, - "name": "unnamedWire#77", - "path": [ - { - "x": 840.0, - "y": 770.0 - }, - { - "x": 840.0, - "y": 310.0 - }, - { - "x": 370.0, - "y": 310.0 - }, - { - "x": 370.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "RAMn" - }, - "pin2": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 75.0, - "y": 100.0 - }, - { - "x": 75.0, - "y": 765.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "A2" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 240.0, - "y": 1090.0 - }, - { - "x": 125.0, - "y": 1090.0 - }, - { - "x": 125.0, - "y": 1045.0 - }, - { - "x": 130.0, - "y": 1045.0 - }, - { - "x": 130.0, - "y": 970.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 755.0, - "y": 1225.0 - }, - { - "x": 745.0, - "y": 1225.0 - }, - { - "x": 745.0, - "y": 515.0 - }, - { - "x": 560.0, - "y": 515.0 - }, - { - "x": 560.0, - "y": 365.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Q1" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 320.0, - "y": 705.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Q2" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 325.0, - "y": 940.0 - }, - { - "x": 325.0, - "y": 710.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Q3" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 330.0, - "y": 950.0 - }, - { - "x": 330.0, - "y": 715.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Q4" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 335.0, - "y": 720.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "A3" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 135.0, - "y": 980.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "A4" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 140.0, - "y": 990.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "D1" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "D2" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "D3" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "D4" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 15.0, - "y": 950.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cn+4" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 615.0, - "y": 665.0 - }, - { - "x": 615.0, - "y": 1200.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "OVR" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "OVR" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 610.0, - "y": 675.0 - }, - { - "x": 610.0, - "y": 1125.0 - }, - { - "x": 95.0, - "y": 1125.0 - }, - { - "x": 95.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "F1" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 635.0, - "y": 625.0 - }, - { - "x": 635.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "F4" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 620.0, - "y": 655.0 - }, - { - "x": 620.0, - "y": 545.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#45", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "EN" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C4" - }, - "name": "unnamedWire#96", - "path": [ - { - "x": 435.0, - "y": 795.0 - }, - { - "x": 195.0, - "y": 795.0 - }, - { - "x": 195.0, - "y": 880.0 - }, - { - "x": 140.0, - "y": 880.0 - }, - { - "x": 140.0, - "y": 870.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RAMn+3" - }, - "name": "unnamedWire#97", - "path": [ - { - "x": 455.0, - "y": 735.0 - }, - { - "x": 455.0, - "y": 1100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [ - { - "x": 380.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "F2" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#99", - "path": [ - { - "x": 630.0, - "y": 635.0 - }, - { - "x": 630.0, - "y": 535.0 - }, - { - "x": 385.0, - "y": 535.0 - }, - { - "x": 385.0, - "y": 510.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "qreg": { - "id": "delegating", - "params": { - "delegateTarget": "dff4#0" - } - }, - "regs": { - "id": "delegating", - "params": { - "delegateTarget": "ram4#0" - } - } - }, - "atomicHighLevelStates": {} - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json deleted file mode 100644 index 90f0ad95..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json +++ /dev/null @@ -1,725 +0,0 @@ -{ - "width": 35.0, - "height": 60.0, - "interfacePins": [ - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "CinE", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "FN", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "I5", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "L", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "RN", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "SBE", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "SN", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 15.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 15.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 55.0, - "y": 45.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 55.0, - "y": 70.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 100.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 39.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 4.0, - "y": 44.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 9.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 9.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 9.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 9.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 49.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 49.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 39.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 100.0, - "y": 135.0 - } - }, - { - "id": "nand3", - "name": "nand3#0", - "pos": { - "x": 55.0, - "y": 10.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I5" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SN" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 10.0, - "y": 105.0 - }, - { - "x": 135.0, - "y": 105.0 - }, - { - "x": 135.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I3" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 50.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RN" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 50.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 50.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "CinE" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 40.0, - "y": 5.0 - }, - { - "x": 115.0, - "y": 5.0 - }, - { - "x": 115.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "C" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 40.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "nand3#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#27" - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#28" - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#29" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "L" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SBE" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 45.0, - "y": 45.0 - }, - { - "x": 45.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "FN" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 5.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "A" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 40.0 - }, - { - "x": 45.0, - "y": 40.0 - }, - { - "x": 45.0, - "y": 15.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901ALUFuncDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json deleted file mode 100644 index 9652a6d6..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json +++ /dev/null @@ -1,1541 +0,0 @@ -{ - "width": 35.0, - "height": 120.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "Cn", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "Cn+4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "F1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "F2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "F3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "F4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "I5", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "OVR", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "R1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "R2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "R3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "R4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "S2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 105.0 - }, - "name": "S3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 115.0 - }, - "name": "S4", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "Am2901ALUFuncDecode", - "name": "Am2901ALUFuncDecode#0", - "pos": { - "x": 20.0, - "y": 2.5 - } - }, - { - "id": "Am2901ALUOneBit", - "name": "Am2901ALUOneBit#0", - "pos": { - "x": 45.0, - "y": 80.0 - } - }, - { - "id": "Am2901ALUOneBit", - "name": "Am2901ALUOneBit#1", - "pos": { - "x": 45.0, - "y": 180.0 - } - }, - { - "id": "Am2901ALUOneBit", - "name": "Am2901ALUOneBit#2", - "pos": { - "x": 45.0, - "y": 280.0 - } - }, - { - "id": "Am2901ALUOneBit", - "name": "Am2901ALUOneBit#3", - "pos": { - "x": 45.0, - "y": 380.0 - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 24.0, - "y": 94.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 194.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 31.5, - "y": 244.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 31.5, - "y": 344.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 34.0, - "y": 154.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 34.0, - "y": 254.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 34.0, - "y": 354.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 36.5, - "y": 164.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 36.5, - "y": 264.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 36.5, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 84.0, - "y": 374.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 84.0, - "y": 384.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 24.0, - "y": 294.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 26.5, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 26.5, - "y": 204.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 26.5, - "y": 304.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 29.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 29.0, - "y": 224.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 29.0, - "y": 324.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 31.5, - "y": 144.0 - }, - "params": 1 - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 95.0, - "y": 400.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I5" - }, - "pin2": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "I5" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 5.0, - "y": 20.0 - }, - { - "x": 5.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I4" - }, - "pin2": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "I4" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 10.0, - "y": 60.0 - }, - { - "x": 10.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "CinE" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 70.0, - "y": 7.5 - }, - { - "x": 70.0, - "y": 77.5 - }, - { - "x": 27.5, - "y": 77.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "CinE" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "CinE" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "CinE" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "CinE" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 27.5, - "y": 405.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "RN" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 57.5, - "y": 57.5 - }, - { - "x": 57.5, - "y": 65.0 - }, - { - "x": 30.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I3" - }, - "pin2": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "I3" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 15.0, - "y": 100.0 - }, - { - "x": 15.0, - "y": 27.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "RN" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "RN" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "RN" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "RN" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 30.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "SN" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 65.0, - "y": 27.5 - }, - { - "x": 65.0, - "y": 72.5 - }, - { - "x": 32.5, - "y": 72.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "SN" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "SN" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "SN" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "SBE" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 62.5, - "y": 37.5 - }, - { - "x": 62.5, - "y": 70.0 - }, - { - "x": 25.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "SN" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 32.5, - "y": 445.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "FN" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 60.0, - "y": 47.5 - }, - { - "x": 60.0, - "y": 67.5 - }, - { - "x": 35.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "FN" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "FN" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "FN" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "FN" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 35.0, - "y": 455.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "L" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 67.5, - "y": 17.5 - }, - { - "x": 67.5, - "y": 75.0 - }, - { - "x": 37.5, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "L" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "L" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "L" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "L" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 37.5, - "y": 465.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R1" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "R" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 10.0, - "y": 180.0 - }, - { - "x": 10.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R2" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "R" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 10.0, - "y": 220.0 - }, - { - "x": 10.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R3" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "R" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 10.0, - "y": 260.0 - }, - { - "x": 10.0, - "y": 315.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R4" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "R" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 20.0, - "y": 300.0 - }, - { - "x": 20.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "S" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 15.0, - "y": 340.0 - }, - { - "x": 15.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S2" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "S" - }, - "name": "unnamedWire#50", - "path": [ - { - "x": 5.0, - "y": 380.0 - }, - { - "x": 5.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S3" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "S" - }, - "name": "unnamedWire#51", - "path": [ - { - "x": 10.0, - "y": 420.0 - }, - { - "x": 10.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S4" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "S" - }, - "name": "unnamedWire#52", - "path": [ - { - "x": 10.0, - "y": 460.0 - }, - { - "x": 10.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cn" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "Cin" - }, - "name": "unnamedWire#53", - "path": [ - { - "x": 5.0, - "y": 140.0 - }, - { - "x": 5.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#0", - "pinName": "Cout" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "Cin" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 85.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 175.0 - }, - { - "x": 40.0, - "y": 175.0 - }, - { - "x": 40.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#1", - "pinName": "Cout" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "Cin" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 85.0, - "y": 185.0 - }, - { - "x": 85.0, - "y": 275.0 - }, - { - "x": 40.0, - "y": 275.0 - }, - { - "x": 40.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#2", - "pinName": "Cout" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [ - { - "x": 85.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "Cin" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 40.0, - "y": 375.0 - }, - { - "x": 40.0, - "y": 385.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#3", - "pinName": "Cout" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#0", - "pinName": "F" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F1" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 90.0, - "y": 95.0 - }, - { - "x": 90.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "CoutE" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#1", - "pinName": "F" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F2" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 95.0, - "y": 195.0 - }, - { - "x": 95.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#2", - "pinName": "F" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F3" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 100.0, - "y": 295.0 - }, - { - "x": 100.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#3", - "pinName": "F" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F4" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 105.0, - "y": 395.0 - }, - { - "x": 105.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "A" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 90.0, - "y": 375.0 - }, - { - "x": 90.0, - "y": 405.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 85.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cn+4" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 130.0, - "y": 385.0 - }, - { - "x": 130.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "OVR" - }, - "name": "unnamedWire#66" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "CoutE" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "CoutE" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "CoutE" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 25.0, - "y": 395.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901ALUInclDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json deleted file mode 100644 index 38b9bd59..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json +++ /dev/null @@ -1,1346 +0,0 @@ -{ - "width": 95.0, - "height": 110.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 70.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 0.0 - }, - "name": "Cn", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 95.0, - "y": 45.0 - }, - "name": "Cn+4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 95.0, - "y": 5.0 - }, - "name": "F1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 95.0, - "y": 15.0 - }, - "name": "F2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 95.0, - "y": 25.0 - }, - "name": "F3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 95.0, - "y": 35.0 - }, - "name": "F4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 25.0, - "y": 0.0 - }, - "name": "I0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 0.0 - }, - "name": "I1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 0.0 - }, - "name": "I2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 55.0, - "y": 0.0 - }, - "name": "I3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 65.0, - "y": 0.0 - }, - "name": "I4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 75.0, - "y": 0.0 - }, - "name": "I5", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 95.0, - "y": 55.0 - }, - "name": "OVR", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "Q1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 90.0 - }, - "name": "Q2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "Q3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 100.0 - }, - "name": "Q4", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "Am2901ALUInclDecode", - "name": "Am2901ALUInclDecode#0", - "pos": { - "x": 315.0, - "y": 15.0 - } - }, - { - "id": "Am2901SourceDecode", - "name": "Am2901SourceDecode#0", - "pos": { - "x": 155.0, - "y": 160.0 - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 209.0, - "y": 224.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 214.0, - "y": 234.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 219.0, - "y": 244.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 224.0, - "y": 254.0 - }, - "params": 1 - }, - { - "id": "sel2_4", - "name": "sel2_4#0", - "pos": { - "x": 235.0, - "y": 85.0 - } - }, - { - "id": "sel3_4", - "name": "sel3_4#0", - "pos": { - "x": 235.0, - "y": 190.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I5" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "I5" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 300.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cn" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "Cn" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 40.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 10.0, - "y": 100.0 - }, - { - "x": 10.0, - "y": 85.0 - }, - { - "x": 170.0, - "y": 85.0 - }, - { - "x": 170.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 55.0, - "y": 140.0 - }, - { - "x": 55.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 50.0, - "y": 160.0 - }, - { - "x": 50.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 45.0, - "y": 180.0 - }, - { - "x": 45.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 40.0, - "y": 200.0 - }, - { - "x": 40.0, - "y": 255.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 210.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 215.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 220.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 225.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "I3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I3" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 220.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 25.0, - "y": 240.0 - }, - { - "x": 25.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 20.0, - "y": 260.0 - }, - { - "x": 20.0, - "y": 275.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 20.0, - "y": 280.0 - }, - { - "x": 20.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B4" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 20.0, - "y": 300.0 - }, - { - "x": 20.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q1" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C1" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 20.0, - "y": 340.0 - }, - { - "x": 20.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q2" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C2" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 25.0, - "y": 360.0 - }, - { - "x": 25.0, - "y": 315.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q3" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C3" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 30.0, - "y": 380.0 - }, - { - "x": 30.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I2" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "I2" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 180.0, - "y": 5.0 - }, - { - "x": 150.0, - "y": 5.0 - }, - { - "x": 150.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q4" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C4" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 35.0, - "y": 400.0 - }, - { - "x": 35.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "SC" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "SQ" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 200.0, - "y": 215.0 - }, - { - "x": 200.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901SourceDecode#0", - "pinName": "RD" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "SA" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 195.0, - "y": 205.0 - }, - { - "x": 195.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901SourceDecode#0", - "pinName": "SB" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "SB" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 205.0, - "y": 185.0 - }, - { - "x": 205.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "SA" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "SA" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "R1" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 275.0, - "y": 90.0 - }, - { - "x": 275.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "R2" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 280.0, - "y": 100.0 - }, - { - "x": 280.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "R3" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 285.0, - "y": 110.0 - }, - { - "x": 285.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "R4" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 290.0, - "y": 120.0 - }, - { - "x": 290.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "I1" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 140.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "S1" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 295.0, - "y": 195.0 - }, - { - "x": 295.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "S2" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 300.0, - "y": 205.0 - }, - { - "x": 300.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "S3" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 305.0, - "y": 215.0 - }, - { - "x": 305.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "S4" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 310.0, - "y": 225.0 - }, - { - "x": 310.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "F1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F1" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "F2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F2" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 375.0, - "y": 30.0 - }, - { - "x": 375.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "F3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F3" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 370.0, - "y": 40.0 - }, - { - "x": 370.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "F4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F4" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 365.0, - "y": 50.0 - }, - { - "x": 365.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cn+4" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 360.0, - "y": 60.0 - }, - { - "x": 360.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "OVR" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "OVR" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 355.0, - "y": 70.0 - }, - { - "x": 355.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "I0" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 100.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I4" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "I4" - }, - "name": "unnamedWire#50", - "path": [ - { - "x": 260.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901SourceDecode#0", - "pinName": "RA" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "SB" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 205.0, - "y": 175.0 - }, - { - "x": 205.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 10.0, - "y": 40.0 - }, - { - "x": 10.0, - "y": 55.0 - }, - { - "x": 185.0, - "y": 55.0 - }, - { - "x": 185.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 10.0, - "y": 60.0 - }, - { - "x": 10.0, - "y": 65.0 - }, - { - "x": 180.0, - "y": 65.0 - }, - { - "x": 180.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 80.0 - }, - { - "x": 10.0, - "y": 75.0 - }, - { - "x": 175.0, - "y": 75.0 - }, - { - "x": 175.0, - "y": 130.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901ALUInclSourceDecodeInclFunctionDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json deleted file mode 100644 index 31cf8af2..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json +++ /dev/null @@ -1,557 +0,0 @@ -{ - "width": 35.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "Cin", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "CinE", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Cout", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "CoutE", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "F", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "FN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "L", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "R", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "RN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "S", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "SN", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 60.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 49.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 54.0, - "y": 69.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 10.0, - "y": 20.0 - } - }, - { - "id": "and", - "name": "and#1", - "pos": { - "x": 135.0, - "y": 20.0 - } - }, - { - "id": "fulladder", - "name": "fulladder#0", - "pos": { - "x": 60.0, - "y": 20.0 - } - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 90.0, - "y": 70.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 10.0, - "y": 190.0 - } - }, - { - "id": "xor", - "name": "xor#1", - "pos": { - "x": 10.0, - "y": 290.0 - } - }, - { - "id": "xor", - "name": "xor#2", - "pos": { - "x": 135.0, - "y": 70.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cin" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "CoutE" - }, - "pin2": { - "compName": "and#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 75.0 - }, - { - "x": 5.0, - "y": 10.0 - }, - { - "x": 130.0, - "y": 10.0 - }, - { - "x": 130.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 50.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "fulladder#0", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 50.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 55.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "fulladder#0", - "pinName": "C" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 55.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "fulladder#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 100.0, - "y": 25.0 - }, - { - "x": 100.0, - "y": 65.0 - }, - { - "x": 85.0, - "y": 65.0 - }, - { - "x": 85.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "fulladder#0", - "pinName": "Z" - }, - "pin2": { - "compName": "and#1", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 82.5, - "y": 65.0 - }, - { - "x": 82.5, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "xor#2", - "pinName": "A" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "CinE" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 7.5, - "y": 125.0 - }, - { - "x": 7.5, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "and#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cout" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "xor#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R" - }, - "pin2": { - "compName": "xor#0", - "pinName": "A" - }, - "name": "unnamedWire#3" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "RN" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#4" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S" - }, - "pin2": { - "compName": "xor#1", - "pinName": "A" - }, - "name": "unnamedWire#5" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SN" - }, - "pin2": { - "compName": "xor#1", - "pinName": "B" - }, - "name": "unnamedWire#6" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "FN" - }, - "pin2": { - "compName": "xor#2", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 130.0, - "y": 375.0 - }, - { - "x": 130.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "L" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 87.5, - "y": 425.0 - }, - { - "x": 87.5, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "fulladder#0", - "pinName": "A" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901ALUOneBit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json deleted file mode 100644 index 27cd4f01..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json +++ /dev/null @@ -1,1095 +0,0 @@ -{ - "width": 35.0, - "height": 60.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I6", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I7", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "I8", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "LSH", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "NSH", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "QWE", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "RAMWE", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "RSH", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "YF", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 15.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 15.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 80.0, - "y": 145.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 110.0, - "y": 105.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#12", - "pos": { - "x": 115.0, - "y": 210.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 15.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 15.0, - "y": 150.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 50.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 50.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 50.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 50.0, - "y": 130.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 80.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 80.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 39.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 74.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 74.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 74.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 74.0, - "y": 159.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 109.0, - "y": 214.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 4.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 9.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 9.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 9.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 4.0, - "y": 154.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 39.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 44.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 44.0, - "y": 54.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I8" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 5.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I6" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 5.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 5.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 5.0, - "y": 5.0 - }, - { - "x": 40.0, - "y": 5.0 - }, - { - "x": 40.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 40.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 40.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "NSH" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 45.0, - "y": 5.0 - }, - { - "x": 135.0, - "y": 5.0 - }, - { - "x": 135.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 45.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 10.0, - "y": 115.0 - }, - { - "x": 45.0, - "y": 115.0 - }, - { - "x": 45.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 40.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 40.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 75.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 75.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RAMWE" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 125.0, - "y": 60.0 - }, - { - "x": 125.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "A" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 75.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "LSH" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 125.0, - "y": 140.0 - }, - { - "x": 125.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 75.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "B" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RSH" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 130.0, - "y": 20.0 - }, - { - "x": 130.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#41" - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "B" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 75.0, - "y": 170.0 - }, - { - "x": 105.0, - "y": 170.0 - }, - { - "x": 105.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 110.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#12", - "pinName": "A" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#12", - "pinName": "B" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 110.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "YF" - }, - "name": "unnamedWire#46" - }, - { - "pin1": { - "compName": "NandGate#12", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QWE" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I7" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 10.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901DestDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json deleted file mode 100644 index 25a64839..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json +++ /dev/null @@ -1,1138 +0,0 @@ -{ - "width": 35.0, - "height": 50.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "I2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "RA", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "RD", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "SA", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "SB", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "SQ", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 10.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 70.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 70.0, - "y": 130.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#12", - "pos": { - "x": 70.0, - "y": 170.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#13", - "pos": { - "x": 100.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#14", - "pos": { - "x": 100.0, - "y": 170.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 10.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 40.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 40.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 40.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 40.0, - "y": 130.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 40.0, - "y": 170.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 70.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 70.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 6.5, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 36.5, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 64.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 64.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 64.0, - "y": 139.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 94.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 94.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 4.0, - "y": 144.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 6.5, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 6.5, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 6.5, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 31.5, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 34.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 34.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 34.0, - "y": 134.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I2" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 5.0 - }, - { - "x": 35.0, - "y": 5.0 - }, - { - "x": 35.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 7.5, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 7.5, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 7.5, - "y": 112.5 - }, - { - "x": 32.5, - "y": 112.5 - }, - { - "x": 32.5, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 32.5, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 32.5, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 35.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 35.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 37.5, - "y": 35.0 - }, - { - "x": 65.0, - "y": 35.0 - }, - { - "x": 65.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 37.5, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#29" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 7.5, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "A" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 65.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 65.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 65.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "B" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 65.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 65.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "B" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 65.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#12", - "pinName": "A" - }, - "name": "unnamedWire#39" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 7.5, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#13", - "pinName": "A" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 95.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#13", - "pinName": "B" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 95.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RA" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SB" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SA" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#12", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#14", - "pinName": "A" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 95.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#14", - "pinName": "B" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 95.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#13", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SQ" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#14", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RD" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#12", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 5.0, - "y": 195.0 - }, - { - "x": 65.0, - "y": 195.0 - }, - { - "x": 65.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 7.5, - "y": 55.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901SourceDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json deleted file mode 100644 index 424c5471..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json +++ /dev/null @@ -1,5222 +0,0 @@ -{ - "width": 120.0, - "height": 155.0, - "interfacePins": [ - { - "location": { - "x": 55.0, - "y": 0.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 120.0, - "y": 85.0 - }, - "name": "C0", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 120.0, - "y": 55.0 - }, - "name": "CT", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "Cx", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "I", - "logicWidth": 13, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "IC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "IN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "IOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "IZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 120.0, - "y": 125.0 - }, - "name": "QIO0", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 125.0 - }, - "name": "QIOn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 120.0 - }, - "name": "SIO0", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 120.0 - }, - "name": "SIOn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 10.0 - }, - "name": "YC", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 15.0 - }, - "name": "YN", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 20.0 - }, - "name": "YOVR", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 5.0 - }, - "name": "YZ", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 5.0, - "y": 0.0 - }, - "name": "_CEM", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 0.0 - }, - "name": "_CEmu", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 15.0, - "y": 0.0 - }, - "name": "_EC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 20.0, - "y": 0.0 - }, - "name": "_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 25.0, - "y": 0.0 - }, - "name": "_EOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 0.0 - }, - "name": "_EZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 110.0, - "y": 0.0 - }, - "name": "_OECT", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 90.0, - "y": 0.0 - }, - "name": "_OEY", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 110.0 - }, - "name": "_SE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Am2904MSR", - "name": "Am2904MSR#0", - "pos": { - "x": 205.0, - "y": 90.0 - } - }, - { - "id": "Am2904RegCTInstrDecode", - "name": "Am2904RegCTInstrDecode#0", - "pos": { - "x": 180.0, - "y": 190.0 - } - }, - { - "id": "Am2904ShiftInstrDecode", - "name": "Am2904ShiftInstrDecode#0", - "pos": { - "x": 100.0, - "y": 495.0 - } - }, - { - "id": "Am2904TestLogic", - "name": "Am2904TestLogic#0", - "pos": { - "x": 260.0, - "y": 330.0 - } - }, - { - "id": "Am2904muSR", - "name": "Am2904muSR#0", - "pos": { - "x": 350.0, - "y": 95.0 - } - }, - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 230.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 140.0, - "y": 5.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 455.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 555.0, - "y": 235.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 325.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 325.0, - "y": 75.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 325.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 325.0, - "y": 35.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 185.0, - "y": 70.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 185.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 185.0, - "y": 30.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 185.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 165.0 - }, - "params": { - "logicWidth": 13, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 575.0, - "y": 40.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#10", - "pos": { - "x": 445.0, - "y": 300.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#11", - "pos": { - "x": 455.0, - "y": 635.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#12", - "pos": { - "x": 455.0, - "y": 710.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#13", - "pos": { - "x": 135.0, - "y": 645.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#14", - "pos": { - "x": 310.0, - "y": 645.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#15", - "pos": { - "x": 430.0, - "y": 535.0 - }, - "params": { - "logicWidth": 2, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#16", - "pos": { - "x": 20.0, - "y": 235.0 - }, - "params": { - "logicWidth": 6, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#17", - "pos": { - "x": 20.0, - "y": 185.0 - }, - "params": { - "logicWidth": 5, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#18", - "pos": { - "x": 15.0, - "y": 65.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#19", - "pos": { - "x": 520.0, - "y": 90.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 440.0, - "y": 90.0 - }, - "params": { - "logicWidth": 2, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#20", - "pos": { - "x": 20.0, - "y": 165.0 - }, - "params": { - "logicWidth": 2, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 465.0, - "y": 100.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 425.0, - "y": 150.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#5", - "pos": { - "x": 425.0, - "y": 190.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#6", - "pos": { - "x": 320.0, - "y": 310.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#7", - "pos": { - "x": 445.0, - "y": 340.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#8", - "pos": { - "x": 445.0, - "y": 380.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#9", - "pos": { - "x": 255.0, - "y": 430.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 540.0, - "y": 70.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#1", - "pos": { - "x": 400.0, - "y": 635.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#2", - "pos": { - "x": 240.0, - "y": 635.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#3", - "pos": { - "x": 550.0, - "y": 625.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#4", - "pos": { - "x": 550.0, - "y": 650.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#5", - "pos": { - "x": 575.0, - "y": 265.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 274.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 189.0, - "y": 139.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 179.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 179.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 179.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 449.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 534.0, - "y": 104.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 334.0, - "y": 174.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 384.0, - "y": 164.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 349.0, - "y": 439.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 434.0, - "y": 674.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 264.0, - "y": 619.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 329.0, - "y": 124.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 289.0, - "y": 609.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 294.0, - "y": 614.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 359.0, - "y": 514.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 359.0, - "y": 594.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 149.0, - "y": 664.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 149.0, - "y": 674.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 299.0, - "y": 584.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 464.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 459.0, - "y": 349.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 559.0, - "y": 619.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 404.0, - "y": 114.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 249.0, - "y": 629.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 549.0, - "y": 239.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#32", - "pos": { - "x": 404.0, - "y": 169.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#33", - "pos": { - "x": 389.0, - "y": 204.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#34", - "pos": { - "x": 439.0, - "y": 684.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#35", - "pos": { - "x": 429.0, - "y": 664.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#36", - "pos": { - "x": 429.0, - "y": 619.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#37", - "pos": { - "x": 434.0, - "y": 644.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#38", - "pos": { - "x": 579.0, - "y": 609.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#39", - "pos": { - "x": 429.0, - "y": 609.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 224.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#40", - "pos": { - "x": 584.0, - "y": 624.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#41", - "pos": { - "x": 434.0, - "y": 614.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 569.0, - "y": 54.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 134.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 319.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 319.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 319.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 495.0, - "y": 60.0 - } - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 495.0, - "y": 280.0 - } - }, - { - "id": "mux1", - "name": "mux1#1", - "pos": { - "x": 275.0, - "y": 475.0 - } - }, - { - "id": "mux1", - "name": "mux1#2", - "pos": { - "x": 355.0, - "y": 445.0 - } - }, - { - "id": "mux1", - "name": "mux1#3", - "pos": { - "x": 395.0, - "y": 425.0 - } - }, - { - "id": "mux1", - "name": "mux1#4", - "pos": { - "x": 490.0, - "y": 530.0 - } - }, - { - "id": "mux1", - "name": "mux1#5", - "pos": { - "x": 445.0, - "y": 540.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 480.0, - "y": 85.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#1", - "pos": { - "x": 440.0, - "y": 135.0 - } - }, - { - "id": "mux2", - "name": "mux2#0", - "pos": { - "x": 470.0, - "y": 625.0 - } - }, - { - "id": "mux2", - "name": "mux2#1", - "pos": { - "x": 470.0, - "y": 700.0 - } - }, - { - "id": "mux2", - "name": "mux2#2", - "pos": { - "x": 325.0, - "y": 635.0 - } - }, - { - "id": "mux3", - "name": "mux3#0", - "pos": { - "x": 335.0, - "y": 300.0 - } - }, - { - "id": "mux3", - "name": "mux3#1", - "pos": { - "x": 155.0, - "y": 635.0 - } - }, - { - "id": "not4", - "name": "not4#0", - "pos": { - "x": 130.0, - "y": 40.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 535.0, - "y": 270.0 - } - }, - { - "id": "xor", - "name": "xor#1", - "pos": { - "x": 475.0, - "y": 320.0 - } - }, - { - "id": "xor", - "name": "xor#2", - "pos": { - "x": 315.0, - "y": 465.0 - } - }, - { - "id": "xor", - "name": "xor#3", - "pos": { - "x": 115.0, - "y": 740.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_MUX" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "MUX" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 325.0, - "y": 200.0 - }, - { - "x": 325.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O0" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#101", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_1" - }, - "name": "unnamedWire#102", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_2" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_3" - }, - "name": "unnamedWire#104", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_4" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "name": "unnamedWire#105", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 330.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_4" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_3" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O1" - }, - "name": "unnamedWire#108", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_2" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_1" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O3" - }, - "name": "unnamedWire#110", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 435.0, - "y": 355.0 - }, - { - "x": 435.0, - "y": 245.0 - }, - { - "x": 390.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 535.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2904TestLogic#0", - "pinName": "I" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 535.0, - "y": 260.0 - }, - { - "x": 385.0, - "y": 260.0 - }, - { - "x": 385.0, - "y": 290.0 - }, - { - "x": 255.0, - "y": 290.0 - }, - { - "x": 255.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y111" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I111" - }, - "name": "unnamedWire#114", - "path": [] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "I110" - }, - "pin2": { - "compName": "Am2904TestLogic#0", - "pinName": "Y110" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y101" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I101" - }, - "name": "unnamedWire#116", - "path": [] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "I100" - }, - "pin2": { - "compName": "Am2904TestLogic#0", - "pinName": "Y100" - }, - "name": "unnamedWire#117", - "path": [] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y011" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I011" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y010" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I010" - }, - "name": "unnamedWire#119", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O2" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "I001" - }, - "pin2": { - "compName": "Am2904TestLogic#0", - "pinName": "Y001" - }, - "name": "unnamedWire#120", - "path": [] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y000" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I000" - }, - "name": "unnamedWire#121", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "EN" - }, - "name": "unnamedWire#122", - "path": [ - { - "x": 585.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#123", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "CT_MUX" - }, - "name": "unnamedWire#124", - "path": [ - { - "x": 210.0, - "y": 320.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O0" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "S0" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "S1" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O1" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O2" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "S2" - }, - "name": "unnamedWire#127", - "path": [] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "CT_EXP" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#128", - "path": [ - { - "x": 230.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#129", - "path": [ - { - "x": 420.0, - "y": 310.0 - }, - { - "x": 420.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "A" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "CT_INV" - }, - "name": "unnamedWire#130", - "path": [ - { - "x": 415.0, - "y": 275.0 - }, - { - "x": 415.0, - "y": 280.0 - }, - { - "x": 220.0, - "y": 280.0 - } - ] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#131", - "path": [ - { - "x": 515.0, - "y": 325.0 - }, - { - "x": 515.0, - "y": 315.0 - }, - { - "x": 490.0, - "y": 315.0 - }, - { - "x": 490.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "I" - }, - "name": "unnamedWire#132", - "path": [ - { - "x": 335.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#133", - "path": [ - { - "x": 390.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O2" - }, - "pin2": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "name": "unnamedWire#134", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#135", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "name": "unnamedWire#136", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "I" - }, - "name": "unnamedWire#137", - "path": [ - { - "x": 385.0, - "y": 250.0 - }, - { - "x": 430.0, - "y": 250.0 - }, - { - "x": 430.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "OEN" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#138", - "path": [ - { - "x": 240.0, - "y": 185.0 - }, - { - "x": 410.0, - "y": 185.0 - }, - { - "x": 410.0, - "y": 80.0 - }, - { - "x": 485.0, - "y": 80.0 - }, - { - "x": 485.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O0" - }, - "name": "unnamedWire#139", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O4" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#140", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "I12-11" - }, - "name": "unnamedWire#141", - "path": [ - { - "x": 105.0, - "y": 170.0 - }, - { - "x": 105.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "C0_MUX" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "I" - }, - "name": "unnamedWire#142", - "path": [ - { - "x": 250.0, - "y": 445.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#1", - "pinName": "I1" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#143", - "path": [ - { - "x": 270.0, - "y": 500.0 - }, - { - "x": 270.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "mu" - }, - "name": "unnamedWire#144", - "path": [ - { - "x": 185.0, - "y": 170.0 - }, - { - "x": 185.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#1", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O2" - }, - "name": "unnamedWire#145", - "path": [ - { - "x": 265.0, - "y": 490.0 - }, - { - "x": 265.0, - "y": 510.0 - }, - { - "x": 480.0, - "y": 510.0 - }, - { - "x": 480.0, - "y": 350.0 - }, - { - "x": 470.0, - "y": 350.0 - }, - { - "x": 470.0, - "y": 310.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1#1", - "pinName": "S0" - }, - "name": "unnamedWire#146", - "path": [ - { - "x": 270.0, - "y": 450.0 - }, - { - "x": 270.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#1", - "pinName": "Y" - }, - "pin2": { - "compName": "xor#2", - "pinName": "B" - }, - "name": "unnamedWire#147", - "path": [] - }, - { - "pin1": { - "compName": "xor#2", - "pinName": "A" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O0" - }, - "name": "unnamedWire#148", - "path": [ - { - "x": 290.0, - "y": 470.0 - }, - { - "x": 290.0, - "y": 460.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O2" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#149", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "I5-0" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 105.0, - "y": 260.0 - }, - { - "x": 105.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "S0" - }, - "name": "unnamedWire#150", - "path": [ - { - "x": 350.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "xor#2", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "I1" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "mux1#2", - "pinName": "I0" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cx" - }, - "name": "unnamedWire#152", - "path": [ - { - "x": 300.0, - "y": 460.0 - }, - { - "x": 300.0, - "y": 465.0 - }, - { - "x": 240.0, - "y": 465.0 - }, - { - "x": 240.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#2", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#3", - "pinName": "I1" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "mux1#3", - "pinName": "I0" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#154", - "path": [] - }, - { - "pin1": { - "compName": "mux1#3", - "pinName": "S0" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O3" - }, - "name": "unnamedWire#155", - "path": [] - }, - { - "pin1": { - "compName": "mux1#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C0" - }, - "name": "unnamedWire#156", - "path": [ - { - "x": 560.0, - "y": 430.0 - }, - { - "x": 560.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#4", - "pinName": "I1" - }, - "pin2": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "name": "unnamedWire#157", - "path": [ - { - "x": 485.0, - "y": 555.0 - }, - { - "x": 485.0, - "y": 620.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SIOn" - }, - "name": "unnamedWire#158", - "path": [ - { - "x": 55.0, - "y": 620.0 - }, - { - "x": 55.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SIO0" - }, - "name": "unnamedWire#159", - "path": [ - { - "x": 580.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "I" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 75.0, - "y": 520.0 - }, - { - "x": 75.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#5", - "pinName": "I1" - }, - "pin2": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "name": "unnamedWire#160", - "path": [ - { - "x": 435.0, - "y": 565.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QIOn" - }, - "name": "unnamedWire#161", - "path": [ - { - "x": 435.0, - "y": 625.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "name": "unnamedWire#162", - "path": [ - { - "x": 580.0, - "y": 635.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "name": "unnamedWire#163", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#164", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "IN" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "Y" - }, - "name": "unnamedWire#165", - "path": [] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "SIO0_MUX" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "I" - }, - "name": "unnamedWire#166", - "path": [ - { - "x": 165.0, - "y": 500.0 - }, - { - "x": 165.0, - "y": 575.0 - }, - { - "x": 450.0, - "y": 575.0 - }, - { - "x": 450.0, - "y": 645.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O0" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I00" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O2" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "S1" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "S0" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O1" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IOVR" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O0" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 10.0, - "y": 125.0 - }, - { - "x": 10.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I10" - }, - "name": "unnamedWire#171", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O2" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#172", - "path": [ - { - "x": 485.0, - "y": 390.0 - }, - { - "x": 485.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#173", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O1" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "S0" - }, - "name": "unnamedWire#174", - "path": [] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "S1" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O2" - }, - "name": "unnamedWire#175", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O0" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I00" - }, - "name": "unnamedWire#176", - "path": [] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#4", - "pinName": "IN" - }, - "name": "unnamedWire#177", - "path": [ - { - "x": 545.0, - "y": 710.0 - }, - { - "x": 545.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "QIO0_MUX" - }, - "name": "unnamedWire#178", - "path": [ - { - "x": 445.0, - "y": 720.0 - }, - { - "x": 445.0, - "y": 580.0 - }, - { - "x": 175.0, - "y": 580.0 - }, - { - "x": 175.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "name": "unnamedWire#179", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IN" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O1" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 5.0, - "y": 100.0 - }, - { - "x": 5.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I10" - }, - "name": "unnamedWire#180", - "path": [ - { - "x": 435.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I01" - }, - "name": "unnamedWire#181", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I11" - }, - "name": "unnamedWire#182", - "path": [ - { - "x": 440.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#183", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "S0" - }, - "name": "unnamedWire#184", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#185", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "I000" - }, - "name": "unnamedWire#186", - "path": [] - }, - { - "pin1": { - "compName": "mux3#1", - "pinName": "I001" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#187", - "path": [ - { - "x": 150.0, - "y": 685.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "SIOn_MUX" - }, - "name": "unnamedWire#188", - "path": [ - { - "x": 130.0, - "y": 655.0 - }, - { - "x": 130.0, - "y": 580.0 - }, - { - "x": 170.0, - "y": 580.0 - }, - { - "x": 170.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O2" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "S2" - }, - "name": "unnamedWire#189", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "IC" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O1" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "S1" - }, - "name": "unnamedWire#190", - "path": [] - }, - { - "pin1": { - "compName": "mux3#1", - "pinName": "I010" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#191", - "path": [ - { - "x": 105.0, - "y": 695.0 - }, - { - "x": 105.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "I011" - }, - "name": "unnamedWire#192", - "path": [ - { - "x": 110.0, - "y": 615.0 - }, - { - "x": 110.0, - "y": 705.0 - } - ] - }, - { - "pin1": { - "compName": "mux3#1", - "pinName": "I100" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#193", - "path": [ - { - "x": 115.0, - "y": 715.0 - }, - { - "x": 115.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "xor#3", - "pinName": "Y" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "I111" - }, - "name": "unnamedWire#194", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#195", - "path": [ - { - "x": 465.0, - "y": 495.0 - }, - { - "x": 345.0, - "y": 495.0 - }, - { - "x": 345.0, - "y": 585.0 - } - ] - }, - { - "pin1": { - "compName": "mux3#1", - "pinName": "I110" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O1" - }, - "name": "unnamedWire#196", - "path": [ - { - "x": 125.0, - "y": 735.0 - }, - { - "x": 125.0, - "y": 605.0 - }, - { - "x": 350.0, - "y": 605.0 - }, - { - "x": 350.0, - "y": 500.0 - }, - { - "x": 470.0, - "y": 500.0 - }, - { - "x": 470.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#2", - "pinName": "I01" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#197", - "path": [ - { - "x": 290.0, - "y": 675.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#2", - "pinName": "I10" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#198", - "path": [ - { - "x": 295.0, - "y": 685.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "I101" - }, - "name": "unnamedWire#199", - "path": [ - { - "x": 120.0, - "y": 585.0 - }, - { - "x": 120.0, - "y": 725.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_OVRRET" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "OVRRET" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 345.0, - "y": 210.0 - }, - { - "x": 345.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IZ" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O3" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 5.0, - "y": 50.0 - }, - { - "x": 5.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "xor#1", - "pinName": "B" - }, - "name": "unnamedWire#200", - "path": [ - { - "x": 465.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "mux2#2", - "pinName": "I11" - }, - "name": "unnamedWire#201", - "path": [ - { - "x": 300.0, - "y": 695.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "OEn" - }, - "name": "unnamedWire#202", - "path": [ - { - "x": 250.0, - "y": 540.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "OE0" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#203", - "path": [ - { - "x": 390.0, - "y": 550.0 - }, - { - "x": 390.0, - "y": 585.0 - }, - { - "x": 560.0, - "y": 585.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "xor#1", - "pinName": "A" - }, - "name": "unnamedWire#204", - "path": [ - { - "x": 460.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "xor#3", - "pinName": "A" - }, - "name": "unnamedWire#205", - "path": [ - { - "x": 460.0, - "y": 490.0 - }, - { - "x": 340.0, - "y": 490.0 - }, - { - "x": 340.0, - "y": 600.0 - }, - { - "x": 100.0, - "y": 600.0 - }, - { - "x": 100.0, - "y": 745.0 - } - ] - }, - { - "pin1": { - "compName": "xor#3", - "pinName": "B" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O0" - }, - "name": "unnamedWire#206", - "path": [ - { - "x": 95.0, - "y": 755.0 - }, - { - "x": 95.0, - "y": 590.0 - }, - { - "x": 355.0, - "y": 590.0 - }, - { - "x": 355.0, - "y": 505.0 - }, - { - "x": 475.0, - "y": 505.0 - }, - { - "x": 475.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#2", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "IN" - }, - "name": "unnamedWire#207", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O2" - }, - "pin2": { - "compName": "mux2#2", - "pinName": "S1" - }, - "name": "unnamedWire#208", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O1" - }, - "pin2": { - "compName": "mux2#2", - "pinName": "S0" - }, - "name": "unnamedWire#209", - "path": [] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_CINV" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "CINV" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 340.0, - "y": 220.0 - }, - { - "x": 340.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "QIOn_MUX" - }, - "name": "unnamedWire#210", - "path": [ - { - "x": 305.0, - "y": 655.0 - }, - { - "x": 305.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O0" - }, - "pin2": { - "compName": "mux2#2", - "pinName": "I00" - }, - "name": "unnamedWire#211", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "IN" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "Y" - }, - "name": "unnamedWire#212", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_SE" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "_SE" - }, - "name": "unnamedWire#213", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "EN" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#214", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#4", - "pinName": "EN" - }, - "name": "unnamedWire#215", - "path": [ - { - "x": 575.0, - "y": 620.0 - }, - { - "x": 575.0, - "y": 645.0 - }, - { - "x": 560.0, - "y": 645.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "M" - }, - "name": "unnamedWire#216", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "I" - }, - "name": "unnamedWire#217", - "path": [ - { - "x": 405.0, - "y": 240.0 - }, - { - "x": 440.0, - "y": 240.0 - }, - { - "x": 440.0, - "y": 315.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "EN" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#218", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "EN" - }, - "name": "unnamedWire#219", - "path": [ - { - "x": 410.0, - "y": 630.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 105.0, - "y": 80.0 - }, - { - "x": 105.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "name": "unnamedWire#220", - "path": [ - { - "x": 440.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#5", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#4", - "pinName": "I0" - }, - "name": "unnamedWire#221", - "path": [] - }, - { - "pin1": { - "compName": "mux1#4", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "COVD_V" - }, - "name": "unnamedWire#222", - "path": [ - { - "x": 530.0, - "y": 535.0 - }, - { - "x": 530.0, - "y": 525.0 - }, - { - "x": 230.0, - "y": 525.0 - }, - { - "x": 230.0, - "y": 310.0 - }, - { - "x": 295.0, - "y": 310.0 - }, - { - "x": 295.0, - "y": 85.0 - }, - { - "x": 275.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "OUT" - }, - "name": "unnamedWire#223", - "path": [ - { - "x": 265.0, - "y": 645.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#4", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "name": "unnamedWire#224", - "path": [ - { - "x": 585.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "MC_MUX" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "I" - }, - "name": "unnamedWire#226", - "path": [ - { - "x": 410.0, - "y": 560.0 - }, - { - "x": 410.0, - "y": 540.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1#5", - "pinName": "S0" - }, - "name": "unnamedWire#227", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1#4", - "pinName": "S0" - }, - "name": "unnamedWire#228", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I11" - }, - "name": "unnamedWire#229", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "I" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I01" - }, - "name": "unnamedWire#230", - "path": [ - { - "x": 430.0, - "y": 740.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "name": "unnamedWire#231", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "OUT" - }, - "name": "unnamedWire#232", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#233", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#234", - "path": [ - { - "x": 550.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_OECT" - }, - "name": "unnamedWire#235", - "path": [ - { - "x": 550.0, - "y": 215.0 - }, - { - "x": 565.0, - "y": 215.0 - }, - { - "x": 565.0, - "y": 25.0 - }, - { - "x": 550.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#5", - "pinName": "OUT" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "CT" - }, - "name": "unnamedWire#236", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#5", - "pinName": "IN" - }, - "pin2": { - "compName": "xor#0", - "pinName": "Y" - }, - "name": "unnamedWire#237", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "mux1#5", - "pinName": "I0" - }, - "name": "unnamedWire#238", - "path": [ - { - "x": 430.0, - "y": 555.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#239", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 190.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QIO0" - }, - "name": "unnamedWire#240", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "name": "unnamedWire#242", - "path": [ - { - "x": 585.0, - "y": 615.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904MSR#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 300.0, - "y": 110.0 - }, - { - "x": 300.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "I" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "Am2904muSR#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 405.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "I" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "C" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 255.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "C" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 300.0, - "y": 60.0 - }, - { - "x": 300.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "MSR_MUX" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "MUX" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 200.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "MC_EN" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "COVD_EN" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 225.0, - "y": 570.0 - }, - { - "x": 225.0, - "y": 305.0 - }, - { - "x": 290.0, - "y": 305.0 - }, - { - "x": 290.0, - "y": 80.0 - }, - { - "x": 265.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 225.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_CEmu" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O0" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 320.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "_EOVR" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 390.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "_EN" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 380.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904muSR#0", - "pinName": "_EC" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 370.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "_EZ" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 360.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "B" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_WEZ" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 305.0, - "y": 30.0 - }, - { - "x": 305.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_WEC" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 310.0, - "y": 240.0 - }, - { - "x": 310.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "YZ" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 595.0, - "y": 40.0 - }, - { - "x": 595.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YC" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "YN" - }, - "name": "unnamedWire#51", - "path": [ - { - "x": 595.0, - "y": 60.0 - }, - { - "x": 595.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YOVR" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#52", - "path": [ - { - "x": 590.0, - "y": 100.0 - }, - { - "x": 590.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "Y" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 570.0, - "y": 50.0 - }, - { - "x": 415.0, - "y": 50.0 - }, - { - "x": 415.0, - "y": 180.0 - }, - { - "x": 195.0, - "y": 180.0 - }, - { - "x": 195.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 135.0, - "y": 10.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_CEM" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 25.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "B" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_WEN" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 315.0, - "y": 70.0 - }, - { - "x": 315.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_WEOVR" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 320.0, - "y": 260.0 - }, - { - "x": 320.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O2" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 180.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "_EOVR" - }, - "name": "unnamedWire#66", - "path": [ - { - "x": 245.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904MSR#0", - "pinName": "_EN" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 235.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "_EC" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 225.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "_EZ" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 215.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 170.0, - "y": 45.0 - }, - { - "x": 170.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "B" - }, - "pin2": { - "compName": "not4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 175.0, - "y": 45.0 - }, - { - "x": 175.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#73", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 175.0, - "y": 75.0 - }, - { - "x": 175.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "A1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EZ" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 50.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EC" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A2" - }, - "name": "unnamedWire#76", - "path": [ - { - "x": 75.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "A3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EN" - }, - "name": "unnamedWire#77", - "path": [ - { - "x": 100.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A4" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 125.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 570.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O4" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#80", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 450.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_OEY" - }, - "name": "unnamedWire#82", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#83", - "path": [] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 550.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#85", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y2" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y4" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O1" - }, - "name": "unnamedWire#90", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#91", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O3" - }, - "name": "unnamedWire#92", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "I" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "Y_MUX" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#94", - "path": [ - { - "x": 190.0, - "y": 275.0 - }, - { - "x": 360.0, - "y": 275.0 - }, - { - "x": 360.0, - "y": 225.0 - }, - { - "x": 420.0, - "y": 225.0 - }, - { - "x": 420.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "S0" - }, - "name": "unnamedWire#95", - "path": [ - { - "x": 455.0, - "y": 100.0 - }, - { - "x": 455.0, - "y": 130.0 - }, - { - "x": 435.0, - "y": 130.0 - }, - { - "x": 435.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2904", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "msr": { - "id": "delegating", - "params": { - "delegateTarget": "Am2904MSR#0" - } - }, - "musr": { - "id": "delegating", - "params": { - "delegateTarget": "Am2904muSR#0" - } - } - }, - "atomicHighLevelStates": {} - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json deleted file mode 100644 index 927d41f8..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json +++ /dev/null @@ -1,1936 +0,0 @@ -{ - "width": 80.0, - "height": 75.0, - "interfacePins": [ - { - "location": { - "x": 50.0, - "y": 0.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 60.0, - "y": 0.0 - }, - "name": "COVD_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 70.0, - "y": 0.0 - }, - "name": "COVD_V", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "I", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 70.0 - }, - "name": "MUX", - "logicWidth": 3, - "usage": "INPUT" - }, - { - "location": { - "x": 80.0, - "y": 20.0 - }, - "name": "Q", - "logicWidth": 4, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 30.0 - }, - "name": "Y", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 20.0, - "y": 0.0 - }, - "name": "_EC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 30.0, - "y": 0.0 - }, - "name": "_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 40.0, - "y": 0.0 - }, - "name": "_EOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 0.0 - }, - "name": "_EZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "mu", - "logicWidth": 4, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 170.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 35.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 135.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 45.0, - "y": 340.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 5.0, - "y": 235.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 385.0, - "y": 85.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 19.0, - "y": 224.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 364.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 74.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 74.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 34.0, - "y": 234.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 124.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 74.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 164.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 269.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 369.0, - "y": 94.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 374.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 379.0, - "y": 114.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 29.0, - "y": 284.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 39.0, - "y": 304.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 19.0, - "y": 194.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 79.0, - "y": 254.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 39.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 195.0, - "y": 50.0 - } - }, - { - "id": "dff4_finewe", - "name": "dff4_finewe#0", - "pos": { - "x": 325.0, - "y": 80.0 - } - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 280.0, - "y": 175.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 45.0, - "y": 80.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#1", - "pos": { - "x": 85.0, - "y": 220.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#2", - "pos": { - "x": 90.0, - "y": 30.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#3", - "pos": { - "x": 130.0, - "y": 170.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#4", - "pos": { - "x": 175.0, - "y": 120.0 - } - }, - { - "id": "not4", - "name": "not4#0", - "pos": { - "x": 45.0, - "y": 270.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 40.0, - "y": 190.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "C" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 250.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE4" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 200.0, - "y": 30.0 - }, - { - "x": 305.0, - "y": 30.0 - }, - { - "x": 305.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "mu" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 35.0, - "y": 95.0 - }, - { - "x": 35.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 30.0, - "y": 45.0 - }, - { - "x": 30.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 25.0, - "y": 55.0 - }, - { - "x": 25.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 20.0, - "y": 65.0 - }, - { - "x": 20.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EN" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE3" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 150.0, - "y": 25.0 - }, - { - "x": 310.0, - "y": 25.0 - }, - { - "x": 310.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "MUX" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "I" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 30.0, - "y": 245.0 - }, - { - "x": 30.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 60.0, - "y": 360.0 - }, - { - "x": 60.0, - "y": 335.0 - }, - { - "x": 20.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "Q4" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EC" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 100.0, - "y": 20.0 - }, - { - "x": 190.0, - "y": 20.0 - }, - { - "x": 190.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_1" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_2" - }, - "pin2": { - "compName": "not4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_3" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_4" - }, - "pin2": { - "compName": "not4#0", - "pinName": "Y4" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A1" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 365.0, - "y": 315.0 - }, - { - "x": 25.0, - "y": 315.0 - }, - { - "x": 25.0, - "y": 275.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 370.0, - "y": 320.0 - }, - { - "x": 30.0, - "y": 320.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A3" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 375.0, - "y": 325.0 - }, - { - "x": 35.0, - "y": 325.0 - }, - { - "x": 35.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 380.0, - "y": 330.0 - }, - { - "x": 40.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_4" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 30.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EZ" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE1" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 50.0, - "y": 15.0 - }, - { - "x": 320.0, - "y": 15.0 - }, - { - "x": 320.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_2" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 40.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_3" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 20.0, - "y": 175.0 - }, - { - "x": 40.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "S0" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "I1_1" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 40.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "I1_3" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "I0_4" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "I0_3" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "I0_2" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "I0_1" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 75.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_1" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "I0_1" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 35.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "I0_2" - }, - "pin2": { - "compName": "xor#0", - "pinName": "Y" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "I0_3" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 80.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "I0_4" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 25.0, - "y": 265.0 - }, - { - "x": 25.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "I1_1" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y2" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "I1_3" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y4" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 125.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "S0" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "S0" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 85.0, - "y": 175.0 - }, - { - "x": 85.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "Y4" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "D4" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 235.0, - "y": 155.0 - }, - { - "x": 235.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "D3" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "Y3" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 240.0, - "y": 155.0 - }, - { - "x": 240.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE2" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 235.0, - "y": 55.0 - }, - { - "x": 235.0, - "y": 20.0 - }, - { - "x": 315.0, - "y": 20.0 - }, - { - "x": 315.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "D1" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "Y1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 250.0, - "y": 135.0 - }, - { - "x": 250.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "Y4" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "I1_3" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "Y2" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "I1_1" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "I0_4" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "Y4" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 140.0, - "y": 165.0 - }, - { - "x": 140.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "I0_3" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 145.0, - "y": 55.0 - }, - { - "x": 145.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "I0_2" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "Y2" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 150.0, - "y": 145.0 - }, - { - "x": 150.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "I0_1" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 155.0, - "y": 35.0 - }, - { - "x": 155.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "S0" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 170.0, - "y": 340.0 - }, - { - "x": 170.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#83", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "COVD_EN" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 300.0, - "y": 10.0 - }, - { - "x": 270.0, - "y": 10.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 165.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "COVD_V" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 350.0, - "y": 70.0 - }, - { - "x": 265.0, - "y": 70.0 - }, - { - "x": 265.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "Y2" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 245.0, - "y": 135.0 - }, - { - "x": 245.0, - "y": 145.0 - }, - { - "x": 275.0, - "y": 145.0 - }, - { - "x": 275.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "D2" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 320.0, - "y": 180.0 - }, - { - "x": 320.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 165.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 270.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#93", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "MSR", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "dff4_finewe#0", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json deleted file mode 100644 index 2c007e54..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json +++ /dev/null @@ -1,774 +0,0 @@ -{ - "width": 60.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "I", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 60.0, - "y": 10.0 - }, - "name": "Y000", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 20.0 - }, - "name": "Y001", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 30.0 - }, - "name": "Y010", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 40.0 - }, - "name": "Y011", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 50.0 - }, - "name": "Y100", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 60.0 - }, - "name": "Y101", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 70.0 - }, - "name": "Y110", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 80.0 - }, - "name": "Y111", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 85.0, - "y": 20.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 45.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 120.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 45.0, - "y": 105.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 80.0, - "y": 115.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 80.0, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 110.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 29.0, - "y": 129.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 34.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 39.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 79.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 79.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 19.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 24.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 39.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 74.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 74.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 24.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 40.0, - "y": 20.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "A" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 110.0, - "y": 20.0 - }, - { - "x": 110.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 20.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 40.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 115.0, - "y": 60.0 - }, - { - "x": 115.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y001" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 80.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y000" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 25.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y011" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 35.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y010" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y100" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 70.0, - "y": 115.0 - }, - { - "x": 70.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y101" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y110" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 30.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 75.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 40.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 25.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y111" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 30.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 20.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 35.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Test\nlogic", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json deleted file mode 100644 index 2949d8da..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json +++ /dev/null @@ -1,1128 +0,0 @@ -{ - "width": 50.0, - "height": 65.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "CINV", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "I", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 30.0 - }, - "name": "M", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "MUX", - "logicWidth": 2, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "OVRRET", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 50.0, - "y": 10.0 - }, - "name": "Q", - "logicWidth": 4, - "usage": "OUTPUT" - }, - { - "location": { - "x": 20.0, - "y": 0.0 - }, - "name": "_EC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 30.0, - "y": 0.0 - }, - "name": "_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 40.0, - "y": 0.0 - }, - "name": "_EOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 0.0 - }, - "name": "_EZ", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 155.0, - "y": 135.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 125.0, - "y": 150.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 125.0, - "y": 130.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 135.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 185.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 5.0, - "y": 95.0 - }, - "params": { - "logicWidth": 2, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 230.0, - "y": 30.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 19.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 59.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 59.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 224.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 114.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 59.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "dff4_finewe", - "name": "dff4_finewe#0", - "pos": { - "x": 185.0, - "y": 25.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 25.0, - "y": 125.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#1", - "pos": { - "x": 65.0, - "y": 75.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 130.0, - "y": 105.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "Q2" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 20.0, - "y": 210.0 - }, - { - "x": 20.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 20.0, - "y": 165.0 - }, - { - "x": 20.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 20.0, - "y": 155.0 - }, - { - "x": 20.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 20.0, - "y": 145.0 - }, - { - "x": 20.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "MUX" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 20.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_4" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_2" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "Q3" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_1" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_1" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 60.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_2" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_3" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_4" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 20.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "S0" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 20.0, - "y": 95.0 - }, - { - "x": 20.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "B" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 150.0, - "y": 150.0 - }, - { - "x": 150.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "OVRRET" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 115.0, - "y": 300.0 - }, - { - "x": 115.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 225.0, - "y": 175.0 - }, - { - "x": 120.0, - "y": 175.0 - }, - { - "x": 120.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "xor#0", - "pinName": "A" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 125.0, - "y": 90.0 - }, - { - "x": 125.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "CINV" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 105.0, - "y": 250.0 - }, - { - "x": 105.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "_WE1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EZ" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 180.0, - "y": 40.0 - }, - { - "x": 180.0, - "y": 5.0 - }, - { - "x": 50.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "C" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 55.0, - "y": 50.0 - }, - { - "x": 55.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE4" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 200.0, - "y": 20.0 - }, - { - "x": 165.0, - "y": 20.0 - }, - { - "x": 165.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "_WE3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EN" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 170.0, - "y": 60.0 - }, - { - "x": 170.0, - "y": 15.0 - }, - { - "x": 150.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 245.0, - "y": 45.0 - }, - { - "x": 245.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EC" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE2" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 100.0, - "y": 10.0 - }, - { - "x": 175.0, - "y": 10.0 - }, - { - "x": 175.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "D1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y1" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "D2" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 170.0, - "y": 110.0 - }, - { - "x": 170.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "D3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y3" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y4" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 115.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "D4" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 180.0, - "y": 145.0 - }, - { - "x": 180.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 115.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 20.0, - "y": 135.0 - }, - { - "x": 20.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "M" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 20.0, - "y": 185.0 - }, - { - "x": 20.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 190.0 - }, - { - "x": 20.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 20.0, - "y": 205.0 - }, - { - "x": 20.0, - "y": 200.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "µSR", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "dff4_finewe#0", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json deleted file mode 100644 index 9a6e0ba7..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json +++ /dev/null @@ -1,1159 +0,0 @@ -{ - "width": 60.0, - "height": 45.0, - "interfacePins": [ - { - "location": { - "x": 40.0, - "y": 0.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 60.0, - "y": 30.0 - }, - "name": "CI", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 30.0, - "y": 0.0 - }, - "name": "D", - "logicWidth": 12, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "Y", - "logicWidth": 12, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "_CC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "_CCEN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 60.0, - "y": 5.0 - }, - "name": "_FULL", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 15.0, - "y": 45.0 - }, - "name": "_MAP", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 40.0, - "y": 45.0 - }, - "name": "_OE", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 45.0 - }, - "name": "_PL", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "_RLD", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 20.0, - "y": 45.0 - }, - "name": "_VECT", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Am2910InstrPLA", - "name": "Am2910InstrPLA#0", - "pos": { - "x": 70.0, - "y": 90.0 - } - }, - { - "id": "Am2910RegCntr", - "name": "Am2910RegCntr#0", - "pos": { - "x": 130.0, - "y": 15.0 - } - }, - { - "id": "Am2910SP", - "name": "Am2910SP#0", - "pos": { - "x": 240.0, - "y": 10.0 - } - }, - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 40.0, - "y": 45.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 10.0, - "y": 60.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 205.0, - "y": 195.0 - }, - "params": 1 - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 165.0, - "y": 180.0 - }, - "params": { - "logicWidth": 12, - "orientation": "DOWN" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 259.0, - "y": 99.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 224.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 174.0, - "y": 174.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 164.0, - "y": 59.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 149.0, - "y": 9.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 4.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 234.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 199.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 234.0, - "y": 69.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 199.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "dff12", - "name": "dff12#0", - "pos": { - "x": 240.0, - "y": 105.0 - } - }, - { - "id": "inc", - "name": "inc#0", - "pos": { - "x": 240.0, - "y": 140.0 - }, - "params": 12 - }, - { - "id": "nor12", - "name": "nor12#0", - "pos": { - "x": 175.0, - "y": 50.0 - } - }, - { - "id": "ram5_12", - "name": "ram5_12#0", - "pos": { - "x": 240.0, - "y": 55.0 - } - }, - { - "id": "sel4_12", - "name": "sel4_12#0", - "pos": { - "x": 135.0, - "y": 110.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "YD" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "SA" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "YR" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "SB" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "nor12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2910InstrPLA#0", - "pinName": "R\u003d0" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 215.0, - "y": 60.0 - }, - { - "x": 215.0, - "y": 75.0 - }, - { - "x": 85.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "RWE" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "WE" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 105.0, - "y": 95.0 - }, - { - "x": 105.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "RDEC" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "DEC" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 110.0, - "y": 105.0 - }, - { - "x": 110.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "STKI0" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 225.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "STKI1" - }, - "pin2": { - "compName": "Am2910SP#0", - "pinName": "STKI1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 230.0, - "y": 165.0 - }, - { - "x": 230.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2910SP#0", - "pinName": "STKI0" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 225.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "ram5_12#0", - "pinName": "WE" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "sel4_12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "inc#0", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 260.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "ram5_12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "C" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 185.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "YF" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "SC" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "D" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 205.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "B" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "nor12#0", - "pinName": "D" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "D" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "A" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 125.0, - "y": 10.0 - }, - { - "x": 125.0, - "y": 65.0 - }, - { - "x": 145.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_RLD" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "_RLD" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 50.0, - "y": 25.0 - }, - { - "x": 50.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2910InstrPLA#0", - "pinName": "PASS" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 65.0, - "y": 55.0 - }, - { - "x": 65.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_CC" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "YmuPC" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "SD" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_CCEN" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 5.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 35.0, - "y": 70.0 - }, - { - "x": 35.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910SP#0", - "pinName": "_FULL" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_FULL" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff12#0", - "pinName": "C" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 235.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "Am2910SP#0", - "pinName": "C" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "C" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff12#0", - "pinName": "D" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "CI" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "CI" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "_PL" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_PL" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 75.0, - "y": 180.0 - }, - { - "x": 50.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "_MAP" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_MAP" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 85.0, - "y": 185.0 - }, - { - "x": 75.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "_VECT" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_VECT" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 95.0, - "y": 190.0 - }, - { - "x": 100.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Am2910InstrPLA#0", - "pinName": "I" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 35.0, - "y": 125.0 - }, - { - "x": 35.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "dff12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "ram5_12#0", - "pinName": "C" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_OE" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 200.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 230.0, - "y": 190.0 - }, - { - "x": 230.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "ram5_12#0", - "pinName": "D" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Am2910SP#0", - "pinName": "A" - }, - "pin2": { - "compName": "ram5_12#0", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Am2910SP#0", - "pinName": "B" - }, - "pin2": { - "compName": "ram5_12#0", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Am2910RegCntr#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 150.0, - "y": 60.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2910", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "mupc": { - "id": "delegating", - "params": { - "delegateTarget": "dff12#0" - } - }, - "r": { - "id": "delegating", - "params": { - "delegateTarget": "Am2910RegCntr#0" - } - }, - "sp": { - "id": "delegating", - "params": { - "delegateTarget": "Am2910SP#0" - } - }, - "stack": { - "id": "delegating", - "params": { - "delegateTarget": "ram5_12#0" - } - } - }, - "atomicHighLevelStates": {} - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json deleted file mode 100644 index 459bca8d..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 20.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 50.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 44.0, - "y": 24.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#1" - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 45.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 45.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#5" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "and", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json deleted file mode 100644 index b8c98863..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json +++ /dev/null @@ -1,355 +0,0 @@ -{ - "width": 35.0, - "height": 50.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 24.0, - "y": 46.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 71.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 24.0, - "y": 96.5 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 30.0, - "y": 7.5 - } - }, - { - "id": "and", - "name": "and#1", - "pos": { - "x": 30.0, - "y": 32.5 - } - }, - { - "id": "and", - "name": "and#2", - "pos": { - "x": 30.0, - "y": 57.5 - } - }, - { - "id": "and", - "name": "and#3", - "pos": { - "x": 30.0, - "y": 82.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "and#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 25.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "and#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "and#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "and#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "and#2", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "and#3", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 25.0, - "y": 112.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and#3", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "and#2", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and#1", - "pinName": "B" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "and41", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json deleted file mode 100644 index a2b45122..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json +++ /dev/null @@ -1,520 +0,0 @@ -{ - "width": 35.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "C2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "C3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "C4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "and41", - "name": "and41#0", - "pos": { - "x": 15.0, - "y": 137.5 - } - }, - { - "id": "or_4", - "name": "or_4#0", - "pos": { - "x": 35.0, - "y": 37.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A1" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 10.0, - "y": 112.5 - }, - { - "x": 10.0, - "y": 142.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A2" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 137.5 - }, - { - "x": 5.0, - "y": 152.5 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 65.0, - "y": 152.5 - }, - { - "x": 65.0, - "y": 125.0 - }, - { - "x": 25.0, - "y": 125.0 - }, - { - "x": 25.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 60.0, - "y": 162.5 - }, - { - "x": 60.0, - "y": 130.0 - }, - { - "x": 20.0, - "y": 130.0 - }, - { - "x": 20.0, - "y": 102.5 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 55.0, - "y": 172.5 - }, - { - "x": 55.0, - "y": 135.0 - }, - { - "x": 15.0, - "y": 135.0 - }, - { - "x": 15.0, - "y": 112.5 - } - ] - }, - { - "pin1": { - "compName": "or_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 75.0, - "y": 42.5 - }, - { - "x": 75.0, - "y": 12.5 - } - ] - }, - { - "pin1": { - "compName": "or_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 80.0, - "y": 52.5 - }, - { - "x": 80.0, - "y": 37.5 - } - ] - }, - { - "pin1": { - "compName": "or_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "or_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 80.0, - "y": 72.5 - }, - { - "x": 80.0, - "y": 87.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A3" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A4" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 5.0, - "y": 187.5 - }, - { - "x": 5.0, - "y": 172.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "and41#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 10.0, - "y": 212.5 - }, - { - "x": 10.0, - "y": 182.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C1" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 10.0, - "y": 12.5 - }, - { - "x": 10.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C2" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 5.0, - "y": 37.5 - }, - { - "x": 5.0, - "y": 52.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C3" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C4" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 5.0, - "y": 87.5 - }, - { - "x": 5.0, - "y": 72.5 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 70.0, - "y": 142.5 - }, - { - "x": 70.0, - "y": 120.0 - }, - { - "x": 30.0, - "y": 120.0 - }, - { - "x": 30.0, - "y": 82.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "andor414", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json deleted file mode 100644 index d8d7c36a..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "width": 35.0, - "height": 40.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y00", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y01", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y10", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y11", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 10.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 6.5, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 6.5, - "y": 16.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 36.5, - "y": 61.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 4.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 4.0, - "y": 41.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 31.5, - "y": 66.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 31.5, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 34.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 40.0, - "y": 2.5 - } - }, - { - "id": "and", - "name": "and#1", - "pos": { - "x": 40.0, - "y": 27.5 - } - }, - { - "id": "and", - "name": "and#2", - "pos": { - "x": 40.0, - "y": 52.5 - } - }, - { - "id": "and", - "name": "and#3", - "pos": { - "x": 40.0, - "y": 77.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 32.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 35.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and#1", - "pinName": "A" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 37.5, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "and#1", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 35.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "and#2", - "pinName": "A" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 32.5, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "and#2", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and#3", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 37.5, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "and#3", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 32.5, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 7.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y00" - }, - "name": "unnamedWire#20" - }, - { - "pin1": { - "compName": "and#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y01" - }, - "name": "unnamedWire#21" - }, - { - "pin1": { - "compName": "and#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y10" - }, - "name": "unnamedWire#22" - }, - { - "pin1": { - "compName": "and#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y11" - }, - "name": "unnamedWire#23" - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 5.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 7.5, - "y": 62.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 5.0, - "y": 67.5 - }, - { - "x": 32.5, - "y": 67.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "demux2", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json deleted file mode 100644 index 2c771c07..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json +++ /dev/null @@ -1,372 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "_Q", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 120.0, - "y": 20.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 9.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 19.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 94.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 104.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "_rsLatch", - "name": "_rsLatch#0", - "pos": { - "x": 40.0, - "y": 70.0 - } - }, - { - "id": "_rsLatch", - "name": "_rsLatch#1", - "pos": { - "x": 120.0, - "y": 45.0 - } - }, - { - "id": "nand3", - "name": "nand3#0", - "pos": { - "x": 40.0, - "y": 30.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#0", - "pinName": "_R" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 10.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "nand3#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#1", - "pinName": "_R" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 105.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "_rsLatch#1", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#13" - }, - { - "pin1": { - "compName": "_rsLatch#1", - "pinName": "_Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_Q" - }, - "name": "unnamedWire#14" - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "B" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 10.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 145.0, - "y": 30.0 - }, - { - "x": 145.0, - "y": 10.0 - }, - { - "x": 20.0, - "y": 10.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#0", - "pinName": "_S" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 20.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "C" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_rsLatch#0", - "pinName": "_Q" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 95.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "A" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 30.0, - "y": 65.0 - }, - { - "x": 30.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#1", - "pinName": "_S" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 95.0, - "y": 50.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "dff", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "_rsLatch#1", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json deleted file mode 100644 index 188770f4..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json +++ /dev/null @@ -1,1313 +0,0 @@ -{ - "width": 55.0, - "height": 45.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "D", - "logicWidth": 12, - "usage": "INPUT" - }, - { - "location": { - "x": 55.0, - "y": 20.0 - }, - "name": "Q", - "logicWidth": 12, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 70.0, - "y": 45.0 - }, - "params": { - "logicWidth": 12, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 255.0, - "y": 45.0 - }, - "params": { - "logicWidth": 12, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 124.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 124.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 179.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 124.0, - "y": 114.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 124.0, - "y": 144.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 124.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 269.0, - "y": 99.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 179.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 179.0, - "y": 164.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 179.0, - "y": 44.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 179.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#0", - "pos": { - "x": 185.0, - "y": 30.0 - } - }, - { - "id": "dff", - "name": "dff#1", - "pos": { - "x": 185.0, - "y": 60.0 - } - }, - { - "id": "dff", - "name": "dff#10", - "pos": { - "x": 185.0, - "y": 120.0 - } - }, - { - "id": "dff", - "name": "dff#11", - "pos": { - "x": 130.0, - "y": 100.0 - } - }, - { - "id": "dff", - "name": "dff#2", - "pos": { - "x": 130.0, - "y": 10.0 - } - }, - { - "id": "dff", - "name": "dff#3", - "pos": { - "x": 130.0, - "y": 40.0 - } - }, - { - "id": "dff", - "name": "dff#4", - "pos": { - "x": 130.0, - "y": 70.0 - } - }, - { - "id": "dff", - "name": "dff#5", - "pos": { - "x": 185.0, - "y": 150.0 - } - }, - { - "id": "dff", - "name": "dff#6", - "pos": { - "x": 185.0, - "y": 180.0 - } - }, - { - "id": "dff", - "name": "dff#7", - "pos": { - "x": 130.0, - "y": 160.0 - } - }, - { - "id": "dff", - "name": "dff#8", - "pos": { - "x": 130.0, - "y": 130.0 - } - }, - { - "id": "dff", - "name": "dff#9", - "pos": { - "x": 185.0, - "y": 90.0 - } - }, - { - "id": "mux1_12", - "name": "mux1_12#0", - "pos": { - "x": 15.0, - "y": 70.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 125.0, - "y": 5.0 - }, - { - "x": 180.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "dff#11", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#10", - "pinName": "D" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 115.0, - "y": 115.0 - }, - { - "x": 115.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "dff#8", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 110.0, - "y": 135.0 - }, - { - "x": 110.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "dff#5", - "pinName": "D" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 105.0, - "y": 135.0 - }, - { - "x": 105.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "dff#7", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 100.0, - "y": 165.0 - }, - { - "x": 100.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "dff#6", - "pinName": "D" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 95.0, - "y": 155.0 - }, - { - "x": 95.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "mux1_12#0", - "pinName": "S" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 5.0, - "y": 100.0 - }, - { - "x": 5.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "mux1_12#0", - "pinName": "I1" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 5.0, - "y": 175.0 - }, - { - "x": 5.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#2", - "pinName": "C" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "dff#3", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff#4", - "pinName": "C" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#11", - "pinName": "C" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff#8", - "pinName": "C" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "mux1_12#0", - "pinName": "I0" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 90.0 - }, - { - "x": 10.0, - "y": 205.0 - }, - { - "x": 270.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff#7", - "pinName": "C" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 125.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "dff#6", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 180.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dff#5", - "pinName": "C" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "dff#10", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dff#9", - "pinName": "C" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "C" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "dff#2", - "pinName": "D" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 85.0, - "y": 45.0 - }, - { - "x": 85.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff#0", - "pinName": "C" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "dff#0", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 90.0, - "y": 35.0 - }, - { - "x": 90.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O11" - }, - "pin2": { - "compName": "dff#2", - "pinName": "Q" - }, - "name": "unnamedWire#53", - "path": [ - { - "x": 250.0, - "y": 45.0 - }, - { - "x": 250.0, - "y": 25.0 - }, - { - "x": 170.0, - "y": 25.0 - }, - { - "x": 170.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "dff#0", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O10" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 240.0, - "y": 35.0 - }, - { - "x": 240.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O9" - }, - "pin2": { - "compName": "dff#3", - "pinName": "Q" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 235.0, - "y": 65.0 - }, - { - "x": 235.0, - "y": 55.0 - }, - { - "x": 170.0, - "y": 55.0 - }, - { - "x": 170.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "dff#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O8" - }, - "name": "unnamedWire#56", - "path": [ - { - "x": 230.0, - "y": 65.0 - }, - { - "x": 230.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "dff#4", - "pinName": "Q" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 170.0, - "y": 85.0 - }, - { - "x": 170.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "dff#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "dff#11", - "pinName": "Q" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 225.0, - "y": 105.0 - }, - { - "x": 225.0, - "y": 115.0 - }, - { - "x": 170.0, - "y": 115.0 - }, - { - "x": 170.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dff#3", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 95.0, - "y": 45.0 - }, - { - "x": 95.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#10", - "pinName": "Q" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 230.0, - "y": 115.0 - }, - { - "x": 230.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "dff#8", - "pinName": "Q" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 235.0, - "y": 125.0 - }, - { - "x": 235.0, - "y": 145.0 - }, - { - "x": 170.0, - "y": 145.0 - }, - { - "x": 170.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "dff#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 240.0, - "y": 155.0 - }, - { - "x": 240.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "dff#7", - "pinName": "Q" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 245.0, - "y": 145.0 - }, - { - "x": 245.0, - "y": 175.0 - }, - { - "x": 170.0, - "y": 175.0 - }, - { - "x": 170.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "dff#6", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 250.0, - "y": 185.0 - }, - { - "x": 250.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "dff#1", - "pinName": "D" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 100.0, - "y": 75.0 - }, - { - "x": 100.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "dff#4", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 105.0, - "y": 75.0 - }, - { - "x": 105.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "dff#9", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n12 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q12", - "q11", - "q10", - "q9", - "q8", - "q7", - "q6", - "q5", - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#6", - "subStateID": "q" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff#3", - "subStateID": "q" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff#0", - "subStateID": "q" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff#2", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#7", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#5", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#8", - "subStateID": "q" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff#10", - "subStateID": "q" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff#11", - "subStateID": "q" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff#9", - "subStateID": "q" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff#4", - "subStateID": "q" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff#1", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json deleted file mode 100644 index 6efc9033..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json +++ /dev/null @@ -1,1601 +0,0 @@ -{ - "width": 45.0, - "height": 55.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 25.0 - }, - "name": "Q", - "logicWidth": 16, - "usage": "TRISTATE" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 50.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 210.0, - "y": 50.0 - }, - "params": { - "logicWidth": 16, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 64.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 64.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 114.0, - "y": 139.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 114.0, - "y": 229.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 114.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 114.0, - "y": 169.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 114.0, - "y": 199.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 64.0, - "y": 89.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 64.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 64.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 64.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 64.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 114.0, - "y": 79.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 114.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#0", - "pos": { - "x": 70.0, - "y": 15.0 - } - }, - { - "id": "dff", - "name": "dff#1", - "pos": { - "x": 120.0, - "y": 35.0 - } - }, - { - "id": "dff", - "name": "dff#10", - "pos": { - "x": 120.0, - "y": 245.0 - } - }, - { - "id": "dff", - "name": "dff#11", - "pos": { - "x": 70.0, - "y": 225.0 - } - }, - { - "id": "dff", - "name": "dff#12", - "pos": { - "x": 70.0, - "y": 195.0 - } - }, - { - "id": "dff", - "name": "dff#13", - "pos": { - "x": 120.0, - "y": 155.0 - } - }, - { - "id": "dff", - "name": "dff#14", - "pos": { - "x": 120.0, - "y": 185.0 - } - }, - { - "id": "dff", - "name": "dff#15", - "pos": { - "x": 70.0, - "y": 165.0 - } - }, - { - "id": "dff", - "name": "dff#2", - "pos": { - "x": 120.0, - "y": 65.0 - } - }, - { - "id": "dff", - "name": "dff#3", - "pos": { - "x": 70.0, - "y": 45.0 - } - }, - { - "id": "dff", - "name": "dff#4", - "pos": { - "x": 120.0, - "y": 95.0 - } - }, - { - "id": "dff", - "name": "dff#5", - "pos": { - "x": 120.0, - "y": 125.0 - } - }, - { - "id": "dff", - "name": "dff#6", - "pos": { - "x": 70.0, - "y": 75.0 - } - }, - { - "id": "dff", - "name": "dff#7", - "pos": { - "x": 70.0, - "y": 105.0 - } - }, - { - "id": "dff", - "name": "dff#8", - "pos": { - "x": 70.0, - "y": 135.0 - } - }, - { - "id": "dff", - "name": "dff#9", - "pos": { - "x": 120.0, - "y": 215.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "dff#0", - "pinName": "D" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 20.0, - "y": 50.0 - }, - { - "x": 20.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "dff#1", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 25.0, - "y": 40.0 - }, - { - "x": 25.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "dff#15", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 45.0, - "y": 170.0 - }, - { - "x": 45.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#14", - "pinName": "D" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 40.0, - "y": 160.0 - }, - { - "x": 40.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "dff#12", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 35.0, - "y": 200.0 - }, - { - "x": 35.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "dff#9", - "pinName": "D" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 30.0, - "y": 180.0 - }, - { - "x": 30.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "dff#11", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 25.0, - "y": 230.0 - }, - { - "x": 25.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "dff#10", - "pinName": "D" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 20.0, - "y": 200.0 - }, - { - "x": 20.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#0", - "pinName": "C" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "C" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "dff#3", - "pinName": "D" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 30.0, - "y": 70.0 - }, - { - "x": 30.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#6", - "pinName": "C" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "dff#7", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff#8", - "pinName": "C" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff#15", - "pinName": "C" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dff#12", - "pinName": "C" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "dff#2", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 35.0, - "y": 70.0 - }, - { - "x": 35.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dff#11", - "pinName": "C" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 65.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "dff#10", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 115.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "dff#9", - "pinName": "C" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "dff#14", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "dff#13", - "pinName": "C" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "dff#5", - "pinName": "C" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "dff#6", - "pinName": "D" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 40.0, - "y": 90.0 - }, - { - "x": 40.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "dff#4", - "pinName": "C" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff#2", - "pinName": "C" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "C" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 65.0, - "y": 10.0 - }, - { - "x": 115.0, - "y": 10.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 10.0, - "y": 30.0 - }, - { - "x": 10.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O15" - }, - "pin2": { - "compName": "dff#0", - "pinName": "Q" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 200.0, - "y": 50.0 - }, - { - "x": 200.0, - "y": 30.0 - }, - { - "x": 110.0, - "y": 30.0 - }, - { - "x": 110.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "dff#4", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "dff#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O14" - }, - "name": "unnamedWire#50", - "path": [ - { - "x": 195.0, - "y": 40.0 - }, - { - "x": 195.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O13" - }, - "pin2": { - "compName": "dff#3", - "pinName": "Q" - }, - "name": "unnamedWire#51", - "path": [ - { - "x": 190.0, - "y": 70.0 - }, - { - "x": 190.0, - "y": 60.0 - }, - { - "x": 110.0, - "y": 60.0 - }, - { - "x": 110.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O12" - }, - "pin2": { - "compName": "dff#2", - "pinName": "Q" - }, - "name": "unnamedWire#52", - "path": [ - { - "x": 185.0, - "y": 80.0 - }, - { - "x": 185.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O11" - }, - "pin2": { - "compName": "dff#6", - "pinName": "Q" - }, - "name": "unnamedWire#53", - "path": [ - { - "x": 110.0, - "y": 90.0 - }, - { - "x": 110.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "dff#4", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O10" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O9" - }, - "pin2": { - "compName": "dff#7", - "pinName": "Q" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 160.0, - "y": 110.0 - }, - { - "x": 160.0, - "y": 120.0 - }, - { - "x": 110.0, - "y": 120.0 - }, - { - "x": 110.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "dff#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O8" - }, - "name": "unnamedWire#56", - "path": [ - { - "x": 165.0, - "y": 130.0 - }, - { - "x": 165.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "dff#8", - "pinName": "Q" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 170.0, - "y": 130.0 - }, - { - "x": 170.0, - "y": 150.0 - }, - { - "x": 110.0, - "y": 150.0 - }, - { - "x": 110.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "dff#13", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 175.0, - "y": 160.0 - }, - { - "x": 175.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "dff#15", - "pinName": "Q" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 180.0, - "y": 150.0 - }, - { - "x": 180.0, - "y": 180.0 - }, - { - "x": 110.0, - "y": 180.0 - }, - { - "x": 110.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "dff#7", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#14", - "pinName": "Q" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 185.0, - "y": 160.0 - }, - { - "x": 185.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "dff#12", - "pinName": "Q" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 190.0, - "y": 170.0 - }, - { - "x": 190.0, - "y": 210.0 - }, - { - "x": 110.0, - "y": 210.0 - }, - { - "x": 110.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "dff#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 195.0, - "y": 220.0 - }, - { - "x": 195.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "dff#11", - "pinName": "Q" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 200.0, - "y": 190.0 - }, - { - "x": 200.0, - "y": 240.0 - }, - { - "x": 110.0, - "y": 240.0 - }, - { - "x": 110.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "dff#10", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 205.0, - "y": 250.0 - }, - { - "x": 205.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "dff#5", - "pinName": "D" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 60.0, - "y": 120.0 - }, - { - "x": 60.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "dff#8", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 55.0, - "y": 140.0 - }, - { - "x": 55.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "dff#13", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 50.0, - "y": 140.0 - }, - { - "x": 50.0, - "y": 160.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n16 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q16", - "q15", - "q14", - "q13", - "q12", - "q11", - "q10", - "q9", - "q8", - "q7", - "q6", - "q5", - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#10", - "subStateID": "q" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff#7", - "subStateID": "q" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff#4", - "subStateID": "q" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff#6", - "subStateID": "q" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dff#2", - "subStateID": "q" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dff#3", - "subStateID": "q" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dff#1", - "subStateID": "q" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dff#0", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#11", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#9", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#12", - "subStateID": "q" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff#14", - "subStateID": "q" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff#15", - "subStateID": "q" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff#13", - "subStateID": "q" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff#8", - "subStateID": "q" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff#5", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json deleted file mode 100644 index 0d24ad3f..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json +++ /dev/null @@ -1,325 +0,0 @@ -{ - "width": 45.0, - "height": 55.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 25.0 - }, - "name": "Q", - "logicWidth": 16, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "_WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 164.0, - "y": 99.0 - }, - "params": 16 - }, - { - "id": "dff16", - "name": "dff16#0", - "pos": { - "x": 110.0, - "y": 75.0 - } - }, - { - "id": "mux1_16", - "name": "mux1_16#0", - "pos": { - "x": 30.0, - "y": 75.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "mux1_16#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "D" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 95.0, - "y": 125.0 - }, - { - "x": 95.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "dff16#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "C" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 95.0, - "y": 20.0 - }, - { - "x": 95.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_WE" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "S" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I1" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 165.0, - "y": 205.0 - }, - { - "x": 10.0, - "y": 205.0 - }, - { - "x": 10.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I0" - }, - "name": "unnamedWire#68", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n16 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q" - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q1" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q10" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q11" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q12" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q13" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q14" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q15" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q16" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q2" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q3" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q4" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q5" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q6" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q7" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q8" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q9" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json deleted file mode 100644 index 09127e66..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "width": 45.0, - "height": 55.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 25.0 - }, - "name": "Q", - "logicWidth": 16, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 164.0, - "y": 99.0 - }, - "params": 16 - }, - { - "id": "dff16", - "name": "dff16#0", - "pos": { - "x": 110.0, - "y": 75.0 - } - }, - { - "id": "mux1_16", - "name": "mux1_16#0", - "pos": { - "x": 30.0, - "y": 75.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "mux1_16#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "D" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 95.0, - "y": 125.0 - }, - { - "x": 95.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "dff16#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "C" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 95.0, - "y": 20.0 - }, - { - "x": 95.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "S" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I0" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 165.0, - "y": 205.0 - }, - { - "x": 20.0, - "y": 205.0 - }, - { - "x": 20.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I1" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 10.0, - "y": 100.0 - }, - { - "x": 10.0, - "y": 165.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n16 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q" - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q1" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q10" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q11" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q12" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q13" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q14" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q15" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q16" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q2" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q3" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q4" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q5" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q6" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q7" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q8" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q9" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json deleted file mode 100644 index cd203617..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json +++ /dev/null @@ -1,742 +0,0 @@ -{ - "width": 35.0, - "height": 60.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Q3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Q4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 104.0, - "y": 184.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 104.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 104.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 169.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 164.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 159.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 154.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#0", - "pos": { - "x": 115.0, - "y": 20.0 - } - }, - { - "id": "dff", - "name": "dff#1", - "pos": { - "x": 115.0, - "y": 70.0 - } - }, - { - "id": "dff", - "name": "dff#2", - "pos": { - "x": 115.0, - "y": 120.0 - } - }, - { - "id": "dff", - "name": "dff#3", - "pos": { - "x": 115.0, - "y": 170.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 55.0, - "y": 60.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#0", - "pinName": "C" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 105.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "dff#0", - "pinName": "D" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 100.0, - "y": 65.0 - }, - { - "x": 100.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 25.0, - "y": 25.0 - }, - { - "x": 25.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 20.0, - "y": 75.0 - }, - { - "x": 20.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 25.0, - "y": 125.0 - }, - { - "x": 25.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "dff#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q1" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "Q" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 25.0, - "y": 175.0 - }, - { - "x": 25.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "dff#2", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q3" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "dff#1", - "pinName": "D" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q4" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "Q" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "dff#2", - "pinName": "D" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 100.0, - "y": 85.0 - }, - { - "x": 100.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "dff#3", - "pinName": "D" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 95.0, - "y": 95.0 - }, - { - "x": 95.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 170.0, - "y": 205.0 - }, - { - "x": 50.0, - "y": 205.0 - }, - { - "x": 50.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 165.0, - "y": 210.0 - }, - { - "x": 45.0, - "y": 210.0 - }, - { - "x": 45.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 160.0, - "y": 215.0 - }, - { - "x": 40.0, - "y": 215.0 - }, - { - "x": 40.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 155.0, - "y": 220.0 - }, - { - "x": 35.0, - "y": 220.0 - }, - { - "x": 35.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "C" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "C" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#2", - "pinName": "C" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 225.0 - }, - { - "x": 20.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 275.0 - }, - { - "x": 10.0, - "y": 65.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n4 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#0", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#1", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#2", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#3", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json deleted file mode 100644 index 005cabe4..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json +++ /dev/null @@ -1,742 +0,0 @@ -{ - "width": 35.0, - "height": 60.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Q3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Q4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "_WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 104.0, - "y": 184.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 104.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 104.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 169.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 164.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 159.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 154.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#0", - "pos": { - "x": 115.0, - "y": 20.0 - } - }, - { - "id": "dff", - "name": "dff#1", - "pos": { - "x": 115.0, - "y": 70.0 - } - }, - { - "id": "dff", - "name": "dff#2", - "pos": { - "x": 115.0, - "y": 120.0 - } - }, - { - "id": "dff", - "name": "dff#3", - "pos": { - "x": 115.0, - "y": 170.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 55.0, - "y": 60.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#0", - "pinName": "C" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 105.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "dff#0", - "pinName": "D" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 100.0, - "y": 65.0 - }, - { - "x": 100.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 25.0, - "y": 25.0 - }, - { - "x": 25.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 20.0, - "y": 75.0 - }, - { - "x": 20.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 20.0, - "y": 125.0 - }, - { - "x": 20.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "dff#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q1" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "Q" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 25.0, - "y": 175.0 - }, - { - "x": 25.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dff#2", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q3" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "dff#1", - "pinName": "D" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q4" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "Q" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "dff#2", - "pinName": "D" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 100.0, - "y": 85.0 - }, - { - "x": 100.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "dff#3", - "pinName": "D" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 95.0, - "y": 95.0 - }, - { - "x": 95.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 170.0, - "y": 205.0 - }, - { - "x": 50.0, - "y": 205.0 - }, - { - "x": 50.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 165.0, - "y": 210.0 - }, - { - "x": 45.0, - "y": 210.0 - }, - { - "x": 45.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 160.0, - "y": 215.0 - }, - { - "x": 40.0, - "y": 215.0 - }, - { - "x": 40.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 155.0, - "y": 220.0 - }, - { - "x": 35.0, - "y": 220.0 - }, - { - "x": 35.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "C" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "C" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#2", - "pinName": "C" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 225.0 - }, - { - "x": 20.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_WE" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 275.0 - }, - { - "x": 10.0, - "y": 65.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n4 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#0", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#1", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#2", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#3", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json deleted file mode 100644 index 8c2a5b3b..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json +++ /dev/null @@ -1,859 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D", - "logicWidth": 8, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q", - "logicWidth": 8, - "usage": "TRISTATE" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 160.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 39.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 89.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 39.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 39.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 89.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 89.0, - "y": 44.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#10", - "pos": { - "x": 95.0, - "y": 60.0 - } - }, - { - "id": "dff", - "name": "dff#11", - "pos": { - "x": 45.0, - "y": 40.0 - } - }, - { - "id": "dff", - "name": "dff#4", - "pos": { - "x": 45.0, - "y": 10.0 - } - }, - { - "id": "dff", - "name": "dff#5", - "pos": { - "x": 95.0, - "y": 90.0 - } - }, - { - "id": "dff", - "name": "dff#6", - "pos": { - "x": 95.0, - "y": 120.0 - } - }, - { - "id": "dff", - "name": "dff#7", - "pos": { - "x": 45.0, - "y": 100.0 - } - }, - { - "id": "dff", - "name": "dff#8", - "pos": { - "x": 45.0, - "y": 70.0 - } - }, - { - "id": "dff", - "name": "dff#9", - "pos": { - "x": 95.0, - "y": 30.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 40.0, - "y": 5.0 - }, - { - "x": 90.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "dff#11", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 30.0, - "y": 45.0 - }, - { - "x": 30.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#10", - "pinName": "D" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 25.0, - "y": 70.0 - }, - { - "x": 25.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "dff#8", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 25.0, - "y": 75.0 - }, - { - "x": 25.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "dff#5", - "pinName": "D" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 25.0, - "y": 90.0 - }, - { - "x": 25.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "dff#7", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 25.0, - "y": 105.0 - }, - { - "x": 25.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "dff#6", - "pinName": "D" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 20.0, - "y": 110.0 - }, - { - "x": 20.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#11", - "pinName": "C" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff#8", - "pinName": "C" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff#7", - "pinName": "C" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 40.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "dff#6", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 90.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dff#5", - "pinName": "C" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "dff#10", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dff#9", - "pinName": "C" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#4", - "pinName": "C" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "dff#4", - "pinName": "Q" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 155.0, - "y": 40.0 - }, - { - "x": 155.0, - "y": 25.0 - }, - { - "x": 85.0, - "y": 25.0 - }, - { - "x": 85.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "dff#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 150.0, - "y": 35.0 - }, - { - "x": 150.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "dff#11", - "pinName": "Q" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 145.0, - "y": 60.0 - }, - { - "x": 145.0, - "y": 55.0 - }, - { - "x": 85.0, - "y": 55.0 - }, - { - "x": 85.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#10", - "pinName": "Q" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 140.0, - "y": 70.0 - }, - { - "x": 140.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "dff#8", - "pinName": "Q" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 140.0, - "y": 80.0 - }, - { - "x": 140.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "dff#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 140.0, - "y": 95.0 - }, - { - "x": 140.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "dff#7", - "pinName": "Q" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 140.0, - "y": 100.0 - }, - { - "x": 140.0, - "y": 115.0 - }, - { - "x": 85.0, - "y": 115.0 - }, - { - "x": 85.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dff#6", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 150.0, - "y": 125.0 - }, - { - "x": 150.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "dff#4", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 15.0 - }, - { - "x": 20.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "dff#9", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 25.0, - "y": 50.0 - }, - { - "x": 25.0, - "y": 35.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n8 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q8", - "q7", - "q6", - "q5", - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#6", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#7", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#5", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#8", - "subStateID": "q" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff#10", - "subStateID": "q" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff#11", - "subStateID": "q" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff#9", - "subStateID": "q" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff#4", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json deleted file mode 100644 index e1f37bc6..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json +++ /dev/null @@ -1,3563 +0,0 @@ -{ - "width": 25.0, - "height": 165.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "D", - "logicWidth": 80, - "usage": "INPUT" - }, - { - "location": { - "x": 25.0, - "y": 85.0 - }, - "name": "Q", - "logicWidth": 80, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 15.0, - "y": 30.0 - }, - "params": { - "logicWidth": 80, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 90.0, - "y": 750.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#10", - "pos": { - "x": 30.0, - "y": 670.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#11", - "pos": { - "x": 30.0, - "y": 750.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#12", - "pos": { - "x": 90.0, - "y": 510.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#13", - "pos": { - "x": 90.0, - "y": 590.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#14", - "pos": { - "x": 90.0, - "y": 110.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#15", - "pos": { - "x": 90.0, - "y": 430.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#16", - "pos": { - "x": 90.0, - "y": 190.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#17", - "pos": { - "x": 90.0, - "y": 350.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#18", - "pos": { - "x": 90.0, - "y": 270.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#19", - "pos": { - "x": 90.0, - "y": 670.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 30.0, - "y": 30.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#20", - "pos": { - "x": 90.0, - "y": 30.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#21", - "pos": { - "x": 105.0, - "y": 30.0 - }, - "params": { - "logicWidth": 80, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 30.0, - "y": 110.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 30.0, - "y": 190.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#5", - "pos": { - "x": 30.0, - "y": 270.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#6", - "pos": { - "x": 30.0, - "y": 350.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#7", - "pos": { - "x": 30.0, - "y": 430.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#8", - "pos": { - "x": 30.0, - "y": 510.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#9", - "pos": { - "x": 30.0, - "y": 590.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 44.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 44.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 44.0, - "y": 214.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 44.0, - "y": 294.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 44.0, - "y": 454.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 44.0, - "y": 374.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 44.0, - "y": 614.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 44.0, - "y": 534.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 44.0, - "y": 694.0 - }, - "params": 1 - }, - { - "id": "dff8", - "name": "dff8#0", - "pos": { - "x": 50.0, - "y": 770.0 - } - }, - { - "id": "dff8", - "name": "dff8#1", - "pos": { - "x": 50.0, - "y": 690.0 - } - }, - { - "id": "dff8", - "name": "dff8#2", - "pos": { - "x": 50.0, - "y": 610.0 - } - }, - { - "id": "dff8", - "name": "dff8#3", - "pos": { - "x": 50.0, - "y": 530.0 - } - }, - { - "id": "dff8", - "name": "dff8#4", - "pos": { - "x": 50.0, - "y": 450.0 - } - }, - { - "id": "dff8", - "name": "dff8#5", - "pos": { - "x": 50.0, - "y": 370.0 - } - }, - { - "id": "dff8", - "name": "dff8#6", - "pos": { - "x": 50.0, - "y": 290.0 - } - }, - { - "id": "dff8", - "name": "dff8#7", - "pos": { - "x": 50.0, - "y": 210.0 - } - }, - { - "id": "dff8", - "name": "dff8#8", - "pos": { - "x": 50.0, - "y": 130.0 - } - }, - { - "id": "dff8", - "name": "dff8#9", - "pos": { - "x": 50.0, - "y": 50.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O79" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O78" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O69" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O59" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O3" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O58" - }, - "name": "unnamedWire#101", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O57" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O1" - }, - "name": "unnamedWire#102", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O56" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O55" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O7" - }, - "name": "unnamedWire#104", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O54" - }, - "name": "unnamedWire#105", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O53" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O5" - }, - "name": "unnamedWire#106", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O52" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O51" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O3" - }, - "name": "unnamedWire#108", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O50" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O68" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O49" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O1" - }, - "name": "unnamedWire#110", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O48" - }, - "name": "unnamedWire#111", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O7" - }, - "name": "unnamedWire#112", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O46" - }, - "name": "unnamedWire#113", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O5" - }, - "name": "unnamedWire#114", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O44" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O3" - }, - "name": "unnamedWire#116", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O42" - }, - "name": "unnamedWire#117", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O1" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O40" - }, - "name": "unnamedWire#119", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O67" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O39" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O7" - }, - "name": "unnamedWire#120", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O38" - }, - "name": "unnamedWire#121", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O37" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O5" - }, - "name": "unnamedWire#122", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O36" - }, - "name": "unnamedWire#123", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O35" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O3" - }, - "name": "unnamedWire#124", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O34" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O33" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O1" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O32" - }, - "name": "unnamedWire#127", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O31" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O7" - }, - "name": "unnamedWire#128", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O30" - }, - "name": "unnamedWire#129", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O66" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O29" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O5" - }, - "name": "unnamedWire#130", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O28" - }, - "name": "unnamedWire#131", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O27" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O3" - }, - "name": "unnamedWire#132", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O26" - }, - "name": "unnamedWire#133", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O25" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O1" - }, - "name": "unnamedWire#134", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O24" - }, - "name": "unnamedWire#135", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O23" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O7" - }, - "name": "unnamedWire#136", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O22" - }, - "name": "unnamedWire#137", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O21" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O5" - }, - "name": "unnamedWire#138", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O20" - }, - "name": "unnamedWire#139", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O65" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O19" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O3" - }, - "name": "unnamedWire#140", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O18" - }, - "name": "unnamedWire#141", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O17" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O1" - }, - "name": "unnamedWire#142", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O16" - }, - "name": "unnamedWire#143", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O7" - }, - "name": "unnamedWire#144", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O14" - }, - "name": "unnamedWire#145", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O5" - }, - "name": "unnamedWire#146", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O12" - }, - "name": "unnamedWire#147", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O3" - }, - "name": "unnamedWire#148", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O10" - }, - "name": "unnamedWire#149", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O64" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O1" - }, - "name": "unnamedWire#150", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O8" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "name": "unnamedWire#152", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O6" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "name": "unnamedWire#154", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O4" - }, - "name": "unnamedWire#155", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "name": "unnamedWire#156", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O2" - }, - "name": "unnamedWire#157", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "name": "unnamedWire#158", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O0" - }, - "name": "unnamedWire#159", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O63" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O7" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#9", - "pinName": "D" - }, - "name": "unnamedWire#160", - "path": [] - }, - { - "pin1": { - "compName": "dff8#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "I" - }, - "name": "unnamedWire#161", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#8", - "pinName": "D" - }, - "name": "unnamedWire#162", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#7", - "pinName": "D" - }, - "name": "unnamedWire#163", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#6", - "pinName": "D" - }, - "name": "unnamedWire#164", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#5", - "pinName": "D" - }, - "name": "unnamedWire#165", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#4", - "pinName": "D" - }, - "name": "unnamedWire#166", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#3", - "pinName": "D" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#2", - "pinName": "D" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#1", - "pinName": "D" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O62" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#0", - "pinName": "D" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#0", - "pinName": "Q" - }, - "name": "unnamedWire#171", - "path": [] - }, - { - "pin1": { - "compName": "dff8#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "I" - }, - "name": "unnamedWire#172", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#2", - "pinName": "Q" - }, - "name": "unnamedWire#173", - "path": [] - }, - { - "pin1": { - "compName": "dff8#3", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "I" - }, - "name": "unnamedWire#174", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#4", - "pinName": "Q" - }, - "name": "unnamedWire#175", - "path": [] - }, - { - "pin1": { - "compName": "dff8#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "I" - }, - "name": "unnamedWire#176", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#6", - "pinName": "Q" - }, - "name": "unnamedWire#177", - "path": [] - }, - { - "pin1": { - "compName": "dff8#7", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "I" - }, - "name": "unnamedWire#178", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#8", - "pinName": "Q" - }, - "name": "unnamedWire#179", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O61" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O5" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#180", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "I" - }, - "name": "unnamedWire#181", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#182", - "path": [ - { - "x": 45.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff8#9", - "pinName": "C" - }, - "name": "unnamedWire#183", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff8#8", - "pinName": "C" - }, - "name": "unnamedWire#184", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#185", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#186", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff8#7", - "pinName": "C" - }, - "name": "unnamedWire#187", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#188", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff8#6", - "pinName": "C" - }, - "name": "unnamedWire#189", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O60" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#190", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dff8#5", - "pinName": "C" - }, - "name": "unnamedWire#191", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#192", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff8#4", - "pinName": "C" - }, - "name": "unnamedWire#193", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#194", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dff8#3", - "pinName": "C" - }, - "name": "unnamedWire#195", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#196", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff8#2", - "pinName": "C" - }, - "name": "unnamedWire#197", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#198", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff8#1", - "pinName": "C" - }, - "name": "unnamedWire#199", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O77" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O59" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff8#0", - "pinName": "C" - }, - "name": "unnamedWire#200", - "path": [ - { - "x": 45.0, - "y": 775.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O58" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O57" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O56" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O55" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O7" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O54" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O53" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O5" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O52" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O51" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O3" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O50" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O76" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O49" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O1" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O48" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O7" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O46" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O5" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O44" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O3" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O42" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O1" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O40" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O75" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O39" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O7" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O38" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O37" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O5" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O36" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O35" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O3" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O34" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O33" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O1" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O32" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O31" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O7" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O30" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O74" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O29" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O5" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O28" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O27" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O3" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O26" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O25" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O1" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O24" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O23" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O7" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O22" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O21" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O5" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O20" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O73" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O19" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O3" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O18" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O17" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O1" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O16" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O7" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O5" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O3" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "name": "unnamedWire#69", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O72" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O1" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "name": "unnamedWire#71", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O7" - }, - "name": "unnamedWire#72", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "name": "unnamedWire#73", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O5" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O3" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O1" - }, - "name": "unnamedWire#78", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "name": "unnamedWire#79", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O71" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O79" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O7" - }, - "name": "unnamedWire#80", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O78" - }, - "name": "unnamedWire#81", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O77" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O5" - }, - "name": "unnamedWire#82", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O76" - }, - "name": "unnamedWire#83", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O75" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O3" - }, - "name": "unnamedWire#84", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O74" - }, - "name": "unnamedWire#85", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O73" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O1" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O72" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O71" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O7" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O70" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O70" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O69" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O5" - }, - "name": "unnamedWire#90", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O68" - }, - "name": "unnamedWire#91", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O67" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O3" - }, - "name": "unnamedWire#92", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O66" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O65" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O1" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O64" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O63" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O7" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O62" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O61" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O5" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O60" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n80 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q80-73", - "q72-65", - "q64-57", - "q56-49", - "q48-41", - "q40-33", - "q32-25", - "q24-17", - "q16-9", - "q8-1" - ], - "vectorPartLengthes": [ - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q1" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q2" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q3" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q4" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q5" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q6" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q7" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q8" - } - }, - "q16-9": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q" - } - }, - "q17": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q1" - } - }, - "q18": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q2" - } - }, - "q19": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q3" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q2" - } - }, - "q20": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q4" - } - }, - "q21": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q5" - } - }, - "q22": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q6" - } - }, - "q23": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q7" - } - }, - "q24": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q8" - } - }, - "q24-17": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q" - } - }, - "q25": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q1" - } - }, - "q26": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q2" - } - }, - "q27": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q3" - } - }, - "q28": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q4" - } - }, - "q29": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q5" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q3" - } - }, - "q30": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q6" - } - }, - "q31": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q7" - } - }, - "q32": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q8" - } - }, - "q32-25": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q" - } - }, - "q33": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q1" - } - }, - "q34": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q2" - } - }, - "q35": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q3" - } - }, - "q36": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q4" - } - }, - "q37": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q5" - } - }, - "q38": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q6" - } - }, - "q39": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q7" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q4" - } - }, - "q40": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q8" - } - }, - "q40-33": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q" - } - }, - "q41": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q1" - } - }, - "q42": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q2" - } - }, - "q43": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q3" - } - }, - "q44": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q4" - } - }, - "q45": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q5" - } - }, - "q46": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q6" - } - }, - "q47": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q7" - } - }, - "q48": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q8" - } - }, - "q48-41": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q" - } - }, - "q49": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q1" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q5" - } - }, - "q50": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q2" - } - }, - "q51": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q3" - } - }, - "q52": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q4" - } - }, - "q53": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q5" - } - }, - "q54": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q6" - } - }, - "q55": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q7" - } - }, - "q56": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q8" - } - }, - "q56-49": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q" - } - }, - "q57": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q1" - } - }, - "q58": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q2" - } - }, - "q59": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q3" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q6" - } - }, - "q60": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q4" - } - }, - "q61": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q5" - } - }, - "q62": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q6" - } - }, - "q63": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q7" - } - }, - "q64": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q8" - } - }, - "q64-57": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q" - } - }, - "q65": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q1" - } - }, - "q66": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q2" - } - }, - "q67": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q3" - } - }, - "q68": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q4" - } - }, - "q69": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q5" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q7" - } - }, - "q70": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q6" - } - }, - "q71": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q7" - } - }, - "q72": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q8" - } - }, - "q72-65": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q" - } - }, - "q73": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q1" - } - }, - "q74": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q2" - } - }, - "q75": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q3" - } - }, - "q76": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q4" - } - }, - "q77": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q5" - } - }, - "q78": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q6" - } - }, - "q79": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q7" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q8" - } - }, - "q8-1": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q" - } - }, - "q80": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q8" - } - }, - "q80-73": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q1" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json deleted file mode 100644 index 3884fc0b..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json +++ /dev/null @@ -1,267 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "E", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "_Q", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 15.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 34.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "_rsLatch", - "name": "_rsLatch#0", - "pos": { - "x": 45.0, - "y": 7.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "E" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 5.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 35.0, - "y": 25.0 - }, - { - "x": 10.0, - "y": 25.0 - }, - { - "x": 10.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#0", - "pinName": "_S" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_rsLatch#0", - "pinName": "_R" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 40.0, - "y": 37.5 - }, - { - "x": 40.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "_rsLatch#0", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "_rsLatch#0", - "pinName": "_Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_Q" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "dlatch", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "_rsLatch#0", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json deleted file mode 100644 index 87f53700..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json +++ /dev/null @@ -1,405 +0,0 @@ -{ - "width": 35.0, - "height": 50.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Q3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Q4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 14.0, - "y": 46.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 14.0, - "y": 71.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 14.0, - "y": 96.5 - }, - "params": 1 - }, - { - "id": "dlatch", - "name": "dlatch#0", - "pos": { - "x": 30.0, - "y": 7.5 - } - }, - { - "id": "dlatch", - "name": "dlatch#1", - "pos": { - "x": 30.0, - "y": 32.5 - } - }, - { - "id": "dlatch", - "name": "dlatch#2", - "pos": { - "x": 30.0, - "y": 57.5 - } - }, - { - "id": "dlatch", - "name": "dlatch#3", - "pos": { - "x": 30.0, - "y": 82.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 15.0, - "y": 112.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#3", - "pinName": "E" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "dlatch#3", - "pinName": "D" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#0", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q1" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#1", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q2" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#2", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q3" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#3", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q4" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#2", - "pinName": "E" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#1", - "pinName": "E" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#0", - "pinName": "E" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 15.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "dlatch#0", - "pinName": "D" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "dlatch#1", - "pinName": "D" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "dlatch#2", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "dlatch4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#0", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#1", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#2", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#3", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json deleted file mode 100644 index c871a951..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json +++ /dev/null @@ -1,859 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D", - "logicWidth": 8, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "E", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q", - "logicWidth": 8, - "usage": "TRISTATE" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 160.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 39.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 89.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 39.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 39.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 89.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 89.0, - "y": 44.0 - }, - "params": 1 - }, - { - "id": "dlatch", - "name": "dlatch#10", - "pos": { - "x": 95.0, - "y": 60.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#11", - "pos": { - "x": 45.0, - "y": 40.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#4", - "pos": { - "x": 45.0, - "y": 10.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#5", - "pos": { - "x": 95.0, - "y": 90.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#6", - "pos": { - "x": 95.0, - "y": 120.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#7", - "pos": { - "x": 45.0, - "y": 100.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#8", - "pos": { - "x": 45.0, - "y": 70.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#9", - "pos": { - "x": 95.0, - "y": 30.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 40.0, - "y": 5.0 - }, - { - "x": 90.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "E" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#11", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 30.0, - "y": 45.0 - }, - { - "x": 30.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "dlatch#10", - "pinName": "D" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 25.0, - "y": 70.0 - }, - { - "x": 25.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#8", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 25.0, - "y": 75.0 - }, - { - "x": 25.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "dlatch#5", - "pinName": "D" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 25.0, - "y": 90.0 - }, - { - "x": 25.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#7", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 25.0, - "y": 105.0 - }, - { - "x": 25.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "dlatch#6", - "pinName": "D" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 20.0, - "y": 110.0 - }, - { - "x": 20.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#11", - "pinName": "E" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#8", - "pinName": "E" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#7", - "pinName": "E" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 40.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#6", - "pinName": "E" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 90.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#5", - "pinName": "E" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#10", - "pinName": "E" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#9", - "pinName": "E" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#4", - "pinName": "E" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "dlatch#4", - "pinName": "Q" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 155.0, - "y": 40.0 - }, - { - "x": 155.0, - "y": 25.0 - }, - { - "x": 85.0, - "y": 25.0 - }, - { - "x": 85.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 150.0, - "y": 35.0 - }, - { - "x": 150.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "dlatch#11", - "pinName": "Q" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 145.0, - "y": 60.0 - }, - { - "x": 145.0, - "y": 55.0 - }, - { - "x": 85.0, - "y": 55.0 - }, - { - "x": 85.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "dlatch#10", - "pinName": "Q" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 140.0, - "y": 70.0 - }, - { - "x": 140.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "dlatch#8", - "pinName": "Q" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 140.0, - "y": 80.0 - }, - { - "x": 140.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 140.0, - "y": 95.0 - }, - { - "x": 140.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "dlatch#7", - "pinName": "Q" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 140.0, - "y": 100.0 - }, - { - "x": 140.0, - "y": 115.0 - }, - { - "x": 85.0, - "y": 115.0 - }, - { - "x": 85.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#6", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 150.0, - "y": 125.0 - }, - { - "x": 150.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#4", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 15.0 - }, - { - "x": 20.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "dlatch#9", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 25.0, - "y": 50.0 - }, - { - "x": 25.0, - "y": 35.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D latch\n8 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q8", - "q7", - "q6", - "q5", - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#6", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#7", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#5", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#8", - "subStateID": "q" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#10", - "subStateID": "q" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#11", - "subStateID": "q" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#9", - "subStateID": "q" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#4", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json deleted file mode 100644 index d46c7843..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json +++ /dev/null @@ -1,3563 +0,0 @@ -{ - "width": 25.0, - "height": 165.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "D", - "logicWidth": 80, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "E", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 25.0, - "y": 85.0 - }, - "name": "Q", - "logicWidth": 80, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 15.0, - "y": 30.0 - }, - "params": { - "logicWidth": 80, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 90.0, - "y": 750.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#10", - "pos": { - "x": 30.0, - "y": 670.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#11", - "pos": { - "x": 30.0, - "y": 750.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#12", - "pos": { - "x": 90.0, - "y": 510.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#13", - "pos": { - "x": 90.0, - "y": 590.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#14", - "pos": { - "x": 90.0, - "y": 110.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#15", - "pos": { - "x": 90.0, - "y": 430.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#16", - "pos": { - "x": 90.0, - "y": 190.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#17", - "pos": { - "x": 90.0, - "y": 350.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#18", - "pos": { - "x": 90.0, - "y": 270.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#19", - "pos": { - "x": 90.0, - "y": 670.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 30.0, - "y": 30.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#20", - "pos": { - "x": 90.0, - "y": 30.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#21", - "pos": { - "x": 105.0, - "y": 30.0 - }, - "params": { - "logicWidth": 80, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 30.0, - "y": 110.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 30.0, - "y": 190.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#5", - "pos": { - "x": 30.0, - "y": 270.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#6", - "pos": { - "x": 30.0, - "y": 350.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#7", - "pos": { - "x": 30.0, - "y": 430.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#8", - "pos": { - "x": 30.0, - "y": 510.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#9", - "pos": { - "x": 30.0, - "y": 590.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 44.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 44.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 44.0, - "y": 214.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 44.0, - "y": 294.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 44.0, - "y": 454.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 44.0, - "y": 374.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 44.0, - "y": 614.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 44.0, - "y": 534.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 44.0, - "y": 694.0 - }, - "params": 1 - }, - { - "id": "dlatch8", - "name": "dlatch8#0", - "pos": { - "x": 50.0, - "y": 770.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#1", - "pos": { - "x": 50.0, - "y": 690.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#2", - "pos": { - "x": 50.0, - "y": 610.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#3", - "pos": { - "x": 50.0, - "y": 530.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#4", - "pos": { - "x": 50.0, - "y": 450.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#5", - "pos": { - "x": 50.0, - "y": 370.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#6", - "pos": { - "x": 50.0, - "y": 290.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#7", - "pos": { - "x": 50.0, - "y": 210.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#8", - "pos": { - "x": 50.0, - "y": 130.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#9", - "pos": { - "x": 50.0, - "y": 50.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O79" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O78" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O69" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O59" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O3" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O58" - }, - "name": "unnamedWire#101", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O57" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O1" - }, - "name": "unnamedWire#102", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O56" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O55" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O7" - }, - "name": "unnamedWire#104", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O54" - }, - "name": "unnamedWire#105", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O53" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O5" - }, - "name": "unnamedWire#106", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O52" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O51" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O3" - }, - "name": "unnamedWire#108", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O50" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O68" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O49" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O1" - }, - "name": "unnamedWire#110", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O48" - }, - "name": "unnamedWire#111", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O7" - }, - "name": "unnamedWire#112", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O46" - }, - "name": "unnamedWire#113", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O5" - }, - "name": "unnamedWire#114", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O44" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O3" - }, - "name": "unnamedWire#116", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O42" - }, - "name": "unnamedWire#117", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O1" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O40" - }, - "name": "unnamedWire#119", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O67" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O39" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O7" - }, - "name": "unnamedWire#120", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O38" - }, - "name": "unnamedWire#121", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O37" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O5" - }, - "name": "unnamedWire#122", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O36" - }, - "name": "unnamedWire#123", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O35" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O3" - }, - "name": "unnamedWire#124", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O34" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O33" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O1" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O32" - }, - "name": "unnamedWire#127", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O31" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O7" - }, - "name": "unnamedWire#128", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O30" - }, - "name": "unnamedWire#129", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O66" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O29" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O5" - }, - "name": "unnamedWire#130", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O28" - }, - "name": "unnamedWire#131", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O27" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O3" - }, - "name": "unnamedWire#132", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O26" - }, - "name": "unnamedWire#133", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O25" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O1" - }, - "name": "unnamedWire#134", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O24" - }, - "name": "unnamedWire#135", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O23" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O7" - }, - "name": "unnamedWire#136", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O22" - }, - "name": "unnamedWire#137", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O21" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O5" - }, - "name": "unnamedWire#138", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O20" - }, - "name": "unnamedWire#139", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O65" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O19" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O3" - }, - "name": "unnamedWire#140", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O18" - }, - "name": "unnamedWire#141", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O17" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O1" - }, - "name": "unnamedWire#142", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O16" - }, - "name": "unnamedWire#143", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O7" - }, - "name": "unnamedWire#144", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O14" - }, - "name": "unnamedWire#145", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O5" - }, - "name": "unnamedWire#146", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O12" - }, - "name": "unnamedWire#147", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O3" - }, - "name": "unnamedWire#148", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O10" - }, - "name": "unnamedWire#149", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O64" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O1" - }, - "name": "unnamedWire#150", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O8" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "name": "unnamedWire#152", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O6" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "name": "unnamedWire#154", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O4" - }, - "name": "unnamedWire#155", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "name": "unnamedWire#156", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O2" - }, - "name": "unnamedWire#157", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "name": "unnamedWire#158", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O0" - }, - "name": "unnamedWire#159", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O63" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O7" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#9", - "pinName": "D" - }, - "name": "unnamedWire#160", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "I" - }, - "name": "unnamedWire#161", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#8", - "pinName": "D" - }, - "name": "unnamedWire#162", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#7", - "pinName": "D" - }, - "name": "unnamedWire#163", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#6", - "pinName": "D" - }, - "name": "unnamedWire#164", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#5", - "pinName": "D" - }, - "name": "unnamedWire#165", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#4", - "pinName": "D" - }, - "name": "unnamedWire#166", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#3", - "pinName": "D" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#2", - "pinName": "D" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#1", - "pinName": "D" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O62" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#0", - "pinName": "D" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#0", - "pinName": "Q" - }, - "name": "unnamedWire#171", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "I" - }, - "name": "unnamedWire#172", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#2", - "pinName": "Q" - }, - "name": "unnamedWire#173", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#3", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "I" - }, - "name": "unnamedWire#174", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#4", - "pinName": "Q" - }, - "name": "unnamedWire#175", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "I" - }, - "name": "unnamedWire#176", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#6", - "pinName": "Q" - }, - "name": "unnamedWire#177", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#7", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "I" - }, - "name": "unnamedWire#178", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#8", - "pinName": "Q" - }, - "name": "unnamedWire#179", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O61" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O5" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#180", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "I" - }, - "name": "unnamedWire#181", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "E" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#182", - "path": [ - { - "x": 45.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#9", - "pinName": "E" - }, - "name": "unnamedWire#183", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#8", - "pinName": "E" - }, - "name": "unnamedWire#184", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#185", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#186", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#7", - "pinName": "E" - }, - "name": "unnamedWire#187", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#188", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#6", - "pinName": "E" - }, - "name": "unnamedWire#189", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O60" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#190", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#5", - "pinName": "E" - }, - "name": "unnamedWire#191", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#192", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#4", - "pinName": "E" - }, - "name": "unnamedWire#193", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#194", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#3", - "pinName": "E" - }, - "name": "unnamedWire#195", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#196", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#2", - "pinName": "E" - }, - "name": "unnamedWire#197", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#198", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#1", - "pinName": "E" - }, - "name": "unnamedWire#199", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O77" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O59" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#0", - "pinName": "E" - }, - "name": "unnamedWire#200", - "path": [ - { - "x": 45.0, - "y": 775.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O58" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O57" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O56" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O55" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O7" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O54" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O53" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O5" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O52" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O51" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O3" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O50" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O76" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O49" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O1" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O48" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O7" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O46" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O5" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O44" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O3" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O42" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O1" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O40" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O75" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O39" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O7" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O38" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O37" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O5" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O36" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O35" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O3" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O34" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O33" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O1" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O32" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O31" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O7" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O30" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O74" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O29" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O5" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O28" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O27" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O3" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O26" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O25" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O1" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O24" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O23" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O7" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O22" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O21" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O5" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O20" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O73" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O19" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O3" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O18" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O17" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O1" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O16" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O7" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O5" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O3" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "name": "unnamedWire#69", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O72" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O1" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "name": "unnamedWire#71", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O7" - }, - "name": "unnamedWire#72", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "name": "unnamedWire#73", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O5" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O3" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O1" - }, - "name": "unnamedWire#78", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "name": "unnamedWire#79", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O71" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O79" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O7" - }, - "name": "unnamedWire#80", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O78" - }, - "name": "unnamedWire#81", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O77" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O5" - }, - "name": "unnamedWire#82", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O76" - }, - "name": "unnamedWire#83", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O75" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O3" - }, - "name": "unnamedWire#84", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O74" - }, - "name": "unnamedWire#85", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O73" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O1" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O72" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O71" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O7" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O70" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O70" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O69" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O5" - }, - "name": "unnamedWire#90", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O68" - }, - "name": "unnamedWire#91", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O67" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O3" - }, - "name": "unnamedWire#92", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O66" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O65" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O1" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O64" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O63" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O7" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O62" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O61" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O5" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O60" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D latch\n80 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q80-73", - "q72-65", - "q64-57", - "q56-49", - "q48-41", - "q40-33", - "q32-25", - "q24-17", - "q16-9", - "q8-1" - ], - "vectorPartLengthes": [ - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q1" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q2" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q3" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q4" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q5" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q6" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q7" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q8" - } - }, - "q16-9": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q" - } - }, - "q17": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q1" - } - }, - "q18": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q2" - } - }, - "q19": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q3" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q2" - } - }, - "q20": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q4" - } - }, - "q21": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q5" - } - }, - "q22": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q6" - } - }, - "q23": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q7" - } - }, - "q24": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q8" - } - }, - "q24-17": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q" - } - }, - "q25": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q1" - } - }, - "q26": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q2" - } - }, - "q27": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q3" - } - }, - "q28": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q4" - } - }, - "q29": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q5" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q3" - } - }, - "q30": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q6" - } - }, - "q31": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q7" - } - }, - "q32": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q8" - } - }, - "q32-25": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q" - } - }, - "q33": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q1" - } - }, - "q34": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q2" - } - }, - "q35": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q3" - } - }, - "q36": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q4" - } - }, - "q37": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q5" - } - }, - "q38": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q6" - } - }, - "q39": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q7" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q4" - } - }, - "q40": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q8" - } - }, - "q40-33": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q" - } - }, - "q41": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q1" - } - }, - "q42": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q2" - } - }, - "q43": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q3" - } - }, - "q44": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q4" - } - }, - "q45": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q5" - } - }, - "q46": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q6" - } - }, - "q47": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q7" - } - }, - "q48": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q8" - } - }, - "q48-41": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q" - } - }, - "q49": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q1" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q5" - } - }, - "q50": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q2" - } - }, - "q51": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q3" - } - }, - "q52": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q4" - } - }, - "q53": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q5" - } - }, - "q54": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q6" - } - }, - "q55": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q7" - } - }, - "q56": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q8" - } - }, - "q56-49": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q" - } - }, - "q57": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q1" - } - }, - "q58": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q2" - } - }, - "q59": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q3" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q6" - } - }, - "q60": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q4" - } - }, - "q61": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q5" - } - }, - "q62": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q6" - } - }, - "q63": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q7" - } - }, - "q64": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q8" - } - }, - "q64-57": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q" - } - }, - "q65": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q1" - } - }, - "q66": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q2" - } - }, - "q67": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q3" - } - }, - "q68": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q4" - } - }, - "q69": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q5" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q7" - } - }, - "q70": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q6" - } - }, - "q71": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q7" - } - }, - "q72": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q8" - } - }, - "q72-65": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q" - } - }, - "q73": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q1" - } - }, - "q74": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q2" - } - }, - "q75": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q3" - } - }, - "q76": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q4" - } - }, - "q77": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q5" - } - }, - "q78": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q6" - } - }, - "q79": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q7" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q8" - } - }, - "q8-1": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q" - } - }, - "q80": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q8" - } - }, - "q80-73": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q1" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json deleted file mode 100644 index 4ba4b195..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Z", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 57.5, - "y": 40.0 - }, - "params": 1 - }, - { - "id": "halfadder", - "name": "halfadder#0", - "pos": { - "x": 5.0, - "y": 40.0 - } - }, - { - "id": "halfadder", - "name": "halfadder#1", - "pos": { - "x": 45.0, - "y": 7.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "halfadder#1", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "halfadder#0", - "pinName": "A" - }, - "name": "unnamedWire#1" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "halfadder#0", - "pinName": "B" - }, - "name": "unnamedWire#2" - }, - { - "pin1": { - "compName": "halfadder#0", - "pinName": "Y" - }, - "pin2": { - "compName": "halfadder#1", - "pinName": "B" - }, - "name": "unnamedWire#3" - }, - { - "pin1": { - "compName": "halfadder#0", - "pinName": "_Z" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "halfadder#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "halfadder#1", - "pinName": "_Z" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 82.5, - "y": 22.5 - }, - { - "x": 82.5, - "y": 35.0 - }, - { - "x": 52.5, - "y": 35.0 - }, - { - "x": 52.5, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Z" - }, - "name": "unnamedWire#7" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "fulladder", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json deleted file mode 100644 index d56f83e0..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json +++ /dev/null @@ -1,337 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "_Z", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 40.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 40.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 65.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 34.0, - "y": 24.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 62.5, - "y": 12.5 - }, - { - "x": 62.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 62.5, - "y": 37.5 - }, - { - "x": 62.5, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 5.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 5.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_Z" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 80.0, - "y": 25.0 - }, - { - "x": 80.0, - "y": 37.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 35.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 35.0, - "y": 32.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "halfadder", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json deleted file mode 100644 index 3997209b..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 7.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 35.0, - "y": 22.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 35.0, - "y": 47.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 60.0, - "y": 30.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 21.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#10" - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#4" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 5.0, - "y": 52.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#8" - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "mux1", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json deleted file mode 100644 index 9f1da98e..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json +++ /dev/null @@ -1,1845 +0,0 @@ -{ - "width": 50.0, - "height": 80.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "I0", - "logicWidth": 12, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "I1", - "logicWidth": 12, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 50.0, - "y": 30.0 - }, - "name": "Y", - "logicWidth": 12, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 55.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 45.0 - }, - "params": { - "logicWidth": 12, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 245.0 - }, - "params": { - "logicWidth": 12, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 235.0, - "y": 95.0 - }, - "params": { - "logicWidth": 12, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 139.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 144.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 89.0, - "y": 4.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 84.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 49.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 49.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 84.0, - "y": 269.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 89.0, - "y": 279.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 84.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 89.0, - "y": 219.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 89.0, - "y": 159.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 84.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 144.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 84.0, - "y": 89.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 89.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 84.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 89.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 139.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 139.0, - "y": 169.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 144.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 144.0, - "y": 239.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 139.0, - "y": 229.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 144.0, - "y": 299.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 139.0, - "y": 289.0 - }, - "params": 1 - }, - { - "id": "sel1", - "name": "sel1#0", - "pos": { - "x": 150.0, - "y": 45.0 - } - }, - { - "id": "sel1", - "name": "sel1#1", - "pos": { - "x": 95.0, - "y": 85.0 - } - }, - { - "id": "sel1", - "name": "sel1#10", - "pos": { - "x": 95.0, - "y": 265.0 - } - }, - { - "id": "sel1", - "name": "sel1#11", - "pos": { - "x": 150.0, - "y": 345.0 - } - }, - { - "id": "sel1", - "name": "sel1#2", - "pos": { - "x": 150.0, - "y": 105.0 - } - }, - { - "id": "sel1", - "name": "sel1#3", - "pos": { - "x": 95.0, - "y": 25.0 - } - }, - { - "id": "sel1", - "name": "sel1#4", - "pos": { - "x": 95.0, - "y": 325.0 - } - }, - { - "id": "sel1", - "name": "sel1#5", - "pos": { - "x": 150.0, - "y": 165.0 - } - }, - { - "id": "sel1", - "name": "sel1#6", - "pos": { - "x": 95.0, - "y": 145.0 - } - }, - { - "id": "sel1", - "name": "sel1#7", - "pos": { - "x": 95.0, - "y": 205.0 - } - }, - { - "id": "sel1", - "name": "sel1#8", - "pos": { - "x": 150.0, - "y": 285.0 - } - }, - { - "id": "sel1", - "name": "sel1#9", - "pos": { - "x": 150.0, - "y": 225.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S1" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "sel1#3", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O11" - }, - "name": "unnamedWire#103", - "path": [ - { - "x": 210.0, - "y": 30.0 - }, - { - "x": 210.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O10" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 205.0, - "y": 50.0 - }, - { - "x": 205.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "Y" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 200.0, - "y": 115.0 - }, - { - "x": 200.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#2", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O8" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 195.0, - "y": 110.0 - }, - { - "x": 195.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "Y" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 195.0, - "y": 135.0 - }, - { - "x": 195.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 200.0, - "y": 170.0 - }, - { - "x": 200.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "Y" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 205.0, - "y": 155.0 - }, - { - "x": 205.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 210.0, - "y": 230.0 - }, - { - "x": 210.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "Y" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 215.0, - "y": 175.0 - }, - { - "x": 215.0, - "y": 270.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#8", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 220.0, - "y": 290.0 - }, - { - "x": 220.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "Y" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 225.0, - "y": 195.0 - }, - { - "x": 225.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#11", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 230.0, - "y": 350.0 - }, - { - "x": 230.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 50.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#10", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "S2" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S1" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 140.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#8", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "S1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 140.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "S1" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "S1" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "sel1#2", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "sel1#2", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "S1" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 145.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "S1" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S2" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 145.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S1" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 85.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S2" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 90.0, - "y": 340.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "S2" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "S1" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "I1" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 75.0, - "y": 45.0 - }, - { - "x": 75.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I1" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 70.0, - "y": 55.0 - }, - { - "x": 70.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I1" - }, - "name": "unnamedWire#66", - "path": [ - { - "x": 65.0, - "y": 65.0 - }, - { - "x": 65.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "I1" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 60.0, - "y": 75.0 - }, - { - "x": 60.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I1" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 55.0, - "y": 85.0 - }, - { - "x": 55.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I1" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 50.0, - "y": 95.0 - }, - { - "x": 50.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#1", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I1" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 45.0, - "y": 105.0 - }, - { - "x": 45.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I1" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 40.0, - "y": 115.0 - }, - { - "x": 40.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I1" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 35.0, - "y": 125.0 - }, - { - "x": 35.0, - "y": 290.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 30.0, - "y": 135.0 - }, - { - "x": 30.0, - "y": 310.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I1" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 25.0, - "y": 145.0 - }, - { - "x": 25.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I1" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 20.0, - "y": 155.0 - }, - { - "x": 20.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "S1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O11" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "I2" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 75.0, - "y": 245.0 - }, - { - "x": 75.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O10" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I2" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 70.0, - "y": 255.0 - }, - { - "x": 70.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I2" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 65.0, - "y": 265.0 - }, - { - "x": 65.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O8" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "I2" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 60.0, - "y": 275.0 - }, - { - "x": 60.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I2" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 55.0, - "y": 285.0 - }, - { - "x": 55.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I2" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 50.0, - "y": 295.0 - }, - { - "x": 50.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I2" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 45.0, - "y": 305.0 - }, - { - "x": 45.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I2" - }, - "name": "unnamedWire#89", - "path": [ - { - "x": 40.0, - "y": 315.0 - }, - { - "x": 40.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I2" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 35.0, - "y": 325.0 - }, - { - "x": 35.0, - "y": 300.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I2" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 30.0, - "y": 335.0 - }, - { - "x": 30.0, - "y": 320.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I2" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 45.0, - "y": 345.0 - }, - { - "x": 45.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I2" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 40.0, - "y": 355.0 - }, - { - "x": 40.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "MUX\n12 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 23.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json deleted file mode 100644 index e29bbbf0..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json +++ /dev/null @@ -1,2384 +0,0 @@ -{ - "width": 55.0, - "height": 110.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I0", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 90.0 - }, - "name": "I1", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 55.0, - "y": 50.0 - }, - "name": "Y", - "logicWidth": 16, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 70.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 50.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 375.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 260.0, - "y": 175.0 - }, - "params": { - "logicWidth": 16, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 164.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 169.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 169.0, - "y": 359.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 164.0, - "y": 349.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 169.0, - "y": 419.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 164.0, - "y": 409.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 109.0, - "y": 4.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 104.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 64.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 64.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 104.0, - "y": 389.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 109.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 164.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 104.0, - "y": 329.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 109.0, - "y": 339.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 109.0, - "y": 279.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 104.0, - "y": 269.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 104.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 109.0, - "y": 219.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 104.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 109.0, - "y": 159.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 109.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 104.0, - "y": 89.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 169.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 104.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 109.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 164.0, - "y": 169.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 169.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 169.0, - "y": 239.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 164.0, - "y": 229.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 164.0, - "y": 289.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 169.0, - "y": 299.0 - }, - "params": 1 - }, - { - "id": "sel1", - "name": "sel1#0", - "pos": { - "x": 115.0, - "y": 25.0 - } - }, - { - "id": "sel1", - "name": "sel1#1", - "pos": { - "x": 175.0, - "y": 45.0 - } - }, - { - "id": "sel1", - "name": "sel1#10", - "pos": { - "x": 115.0, - "y": 265.0 - } - }, - { - "id": "sel1", - "name": "sel1#11", - "pos": { - "x": 115.0, - "y": 325.0 - } - }, - { - "id": "sel1", - "name": "sel1#12", - "pos": { - "x": 175.0, - "y": 405.0 - } - }, - { - "id": "sel1", - "name": "sel1#13", - "pos": { - "x": 175.0, - "y": 345.0 - } - }, - { - "id": "sel1", - "name": "sel1#14", - "pos": { - "x": 115.0, - "y": 385.0 - } - }, - { - "id": "sel1", - "name": "sel1#15", - "pos": { - "x": 175.0, - "y": 465.0 - } - }, - { - "id": "sel1", - "name": "sel1#2", - "pos": { - "x": 115.0, - "y": 85.0 - } - }, - { - "id": "sel1", - "name": "sel1#3", - "pos": { - "x": 175.0, - "y": 105.0 - } - }, - { - "id": "sel1", - "name": "sel1#4", - "pos": { - "x": 175.0, - "y": 165.0 - } - }, - { - "id": "sel1", - "name": "sel1#5", - "pos": { - "x": 115.0, - "y": 205.0 - } - }, - { - "id": "sel1", - "name": "sel1#6", - "pos": { - "x": 175.0, - "y": 225.0 - } - }, - { - "id": "sel1", - "name": "sel1#7", - "pos": { - "x": 115.0, - "y": 145.0 - } - }, - { - "id": "sel1", - "name": "sel1#8", - "pos": { - "x": 115.0, - "y": 445.0 - } - }, - { - "id": "sel1", - "name": "sel1#9", - "pos": { - "x": 175.0, - "y": 285.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "S1" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "S2" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S1" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O14" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "Y" - }, - "name": "unnamedWire#100", - "path": [ - { - "x": 250.0, - "y": 185.0 - }, - { - "x": 250.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#2", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O13" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 245.0, - "y": 90.0 - }, - { - "x": 245.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O12" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "Y" - }, - "name": "unnamedWire#102", - "path": [ - { - "x": 240.0, - "y": 205.0 - }, - { - "x": 240.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#7", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O11" - }, - "name": "unnamedWire#103", - "path": [ - { - "x": 235.0, - "y": 150.0 - }, - { - "x": 235.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#4", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O10" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 230.0, - "y": 170.0 - }, - { - "x": 230.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "Y" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 225.0, - "y": 235.0 - }, - { - "x": 225.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O8" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 220.0, - "y": 230.0 - }, - { - "x": 220.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "Y" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 220.0, - "y": 255.0 - }, - { - "x": 220.0, - "y": 270.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 225.0, - "y": 290.0 - }, - { - "x": 225.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "Y" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 230.0, - "y": 275.0 - }, - { - "x": 230.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel1#13", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 235.0, - "y": 350.0 - }, - { - "x": 235.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#14", - "pinName": "Y" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 240.0, - "y": 295.0 - }, - { - "x": 240.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#12", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 245.0, - "y": 410.0 - }, - { - "x": 245.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "Y" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 250.0, - "y": 315.0 - }, - { - "x": 250.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#15", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 255.0, - "y": 470.0 - }, - { - "x": 255.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 65.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#14", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "sel1#14", - "pinName": "S2" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "sel1#15", - "pinName": "S1" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 165.0, - "y": 470.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "sel1#12", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "sel1#12", - "pinName": "S1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "S1" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "sel1#13", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "sel1#13", - "pinName": "S1" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "S1" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "sel1#4", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S1" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "sel1#3", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "S1" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "S2" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "sel1#1", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "S1" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S1" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "sel1#15", - "pinName": "S2" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 170.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "S1" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 105.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "S2" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 110.0, - "y": 460.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S2" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 165.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 170.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "S1" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I1" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I1" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 90.0, - "y": 60.0 - }, - { - "x": 90.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "I1" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 85.0, - "y": 70.0 - }, - { - "x": 85.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "I1" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 80.0, - "y": 80.0 - }, - { - "x": 80.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I1" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 75.0, - "y": 90.0 - }, - { - "x": 75.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I1" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 70.0, - "y": 100.0 - }, - { - "x": 70.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I1" - }, - "name": "unnamedWire#66", - "path": [ - { - "x": 65.0, - "y": 110.0 - }, - { - "x": 65.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I1" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 60.0, - "y": 120.0 - }, - { - "x": 60.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I1" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 55.0, - "y": 130.0 - }, - { - "x": 55.0, - "y": 290.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I1" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 50.0, - "y": 140.0 - }, - { - "x": 50.0, - "y": 310.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I1" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 45.0, - "y": 150.0 - }, - { - "x": 45.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#13", - "pinName": "I1" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 40.0, - "y": 160.0 - }, - { - "x": 40.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#14", - "pinName": "I1" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 35.0, - "y": 170.0 - }, - { - "x": 35.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#12", - "pinName": "I1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 30.0, - "y": 180.0 - }, - { - "x": 30.0, - "y": 430.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I1" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 25.0, - "y": 190.0 - }, - { - "x": 25.0, - "y": 470.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#15", - "pinName": "I1" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 20.0, - "y": 200.0 - }, - { - "x": 20.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O15" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I2" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 95.0, - "y": 375.0 - }, - { - "x": 95.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O14" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I2" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 90.0, - "y": 385.0 - }, - { - "x": 90.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "S1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O13" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "I2" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 85.0, - "y": 395.0 - }, - { - "x": 85.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O12" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "I2" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 80.0, - "y": 405.0 - }, - { - "x": 80.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O11" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I2" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 75.0, - "y": 415.0 - }, - { - "x": 75.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O10" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I2" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 70.0, - "y": 425.0 - }, - { - "x": 70.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I2" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 65.0, - "y": 435.0 - }, - { - "x": 65.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O8" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I2" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 60.0, - "y": 445.0 - }, - { - "x": 60.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I2" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 55.0, - "y": 455.0 - }, - { - "x": 55.0, - "y": 300.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I2" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 50.0, - "y": 465.0 - }, - { - "x": 50.0, - "y": 320.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I2" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 45.0, - "y": 475.0 - }, - { - "x": 45.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#13", - "pinName": "I2" - }, - "name": "unnamedWire#89", - "path": [ - { - "x": 40.0, - "y": 485.0 - }, - { - "x": 40.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#10", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#14", - "pinName": "I2" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 35.0, - "y": 495.0 - }, - { - "x": 35.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#12", - "pinName": "I2" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 30.0, - "y": 505.0 - }, - { - "x": 30.0, - "y": 440.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I2" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 25.0, - "y": 515.0 - }, - { - "x": 25.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#15", - "pinName": "I2" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 20.0, - "y": 525.0 - }, - { - "x": 20.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O15" - }, - "name": "unnamedWire#99", - "path": [ - { - "x": 255.0, - "y": 30.0 - }, - { - "x": 255.0, - "y": 175.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "MUX\n16 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 23.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json deleted file mode 100644 index b5b16b89..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json +++ /dev/null @@ -1,503 +0,0 @@ -{ - "width": 35.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I0_1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I0_2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "I0_3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "I0_4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "I1_1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "I1_2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "I1_3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "I1_4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 24.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 46.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 24.0, - "y": 81.5 - }, - "params": 1 - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 30.0, - "y": 7.5 - } - }, - { - "id": "mux1", - "name": "mux1#1", - "pos": { - "x": 30.0, - "y": 42.5 - } - }, - { - "id": "mux1", - "name": "mux1#2", - "pos": { - "x": 30.0, - "y": 77.5 - } - }, - { - "id": "mux1", - "name": "mux1#3", - "pos": { - "x": 30.0, - "y": 112.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "S0" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0_3" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "I0" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 5.0, - "y": 87.5 - }, - { - "x": 5.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1_3" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "I1" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 20.0, - "y": 187.5 - }, - { - "x": 20.0, - "y": 102.5 - } - ] - }, - { - "pin1": { - "compName": "mux1#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#14" - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "mux1#3", - "pinName": "S0" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 25.0, - "y": 117.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0_4" - }, - "pin2": { - "compName": "mux1#3", - "pinName": "I0" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 5.0, - "y": 112.5 - }, - { - "x": 5.0, - "y": 127.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1#3", - "pinName": "I1" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 25.0, - "y": 212.5 - }, - { - "x": 25.0, - "y": 137.5 - } - ] - }, - { - "pin1": { - "compName": "mux1#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#18" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0_1" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 37.5 - }, - { - "x": 5.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1_1" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 137.5 - }, - { - "x": 10.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "mux1#1", - "pinName": "S0" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0_2" - }, - "pin2": { - "compName": "mux1#1", - "pinName": "I0" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 5.0, - "y": 62.5 - }, - { - "x": 5.0, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1#1", - "pinName": "I1" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 15.0, - "y": 162.5 - }, - { - "x": 15.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "mux1#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "mux1_4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json deleted file mode 100644 index 4a34c7c8..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json +++ /dev/null @@ -1,1297 +0,0 @@ -{ - "width": 40.0, - "height": 55.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I0", - "logicWidth": 8, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "I1", - "logicWidth": 8, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 40.0, - "y": 25.0 - }, - "name": "Y", - "logicWidth": 8, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 15.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 165.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 185.0, - "y": 90.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 69.0, - "y": 4.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 64.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 9.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 9.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 64.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 69.0, - "y": 159.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 64.0, - "y": 89.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 69.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 69.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 64.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 114.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 119.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 119.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 114.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 119.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 114.0, - "y": 169.0 - }, - "params": 1 - }, - { - "id": "sel1", - "name": "sel1#10", - "pos": { - "x": 75.0, - "y": 145.0 - } - }, - { - "id": "sel1", - "name": "sel1#11", - "pos": { - "x": 125.0, - "y": 225.0 - } - }, - { - "id": "sel1", - "name": "sel1#4", - "pos": { - "x": 75.0, - "y": 205.0 - } - }, - { - "id": "sel1", - "name": "sel1#5", - "pos": { - "x": 125.0, - "y": 45.0 - } - }, - { - "id": "sel1", - "name": "sel1#6", - "pos": { - "x": 75.0, - "y": 25.0 - } - }, - { - "id": "sel1", - "name": "sel1#7", - "pos": { - "x": 75.0, - "y": 85.0 - } - }, - { - "id": "sel1", - "name": "sel1#8", - "pos": { - "x": 125.0, - "y": 165.0 - } - }, - { - "id": "sel1", - "name": "sel1#9", - "pos": { - "x": 125.0, - "y": 105.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S1" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "Y" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 180.0, - "y": 90.0 - }, - { - "x": 180.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 175.0, - "y": 50.0 - }, - { - "x": 175.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "Y" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 170.0, - "y": 110.0 - }, - { - "x": 170.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 165.0, - "y": 110.0 - }, - { - "x": 165.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "Y" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 165.0, - "y": 130.0 - }, - { - "x": 165.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#8", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 170.0, - "y": 170.0 - }, - { - "x": 170.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "Y" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 175.0, - "y": 150.0 - }, - { - "x": 175.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#11", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 180.0, - "y": 230.0 - }, - { - "x": 180.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 10.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#10", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "S2" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S1" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 115.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#8", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "S1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "S1" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "S1" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 120.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 115.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S2" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 120.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S1" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 65.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S2" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 70.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I1" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 55.0, - "y": 40.0 - }, - { - "x": 55.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I1" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 50.0, - "y": 50.0 - }, - { - "x": 50.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I1" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 45.0, - "y": 60.0 - }, - { - "x": 45.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I1" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 40.0, - "y": 70.0 - }, - { - "x": 40.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I1" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 35.0, - "y": 80.0 - }, - { - "x": 35.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 30.0, - "y": 90.0 - }, - { - "x": 30.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I1" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 25.0, - "y": 100.0 - }, - { - "x": 25.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I1" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 20.0, - "y": 110.0 - }, - { - "x": 20.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "S1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I2" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 55.0, - "y": 165.0 - }, - { - "x": 55.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I2" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 50.0, - "y": 175.0 - }, - { - "x": 50.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I2" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 45.0, - "y": 185.0 - }, - { - "x": 45.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I2" - }, - "name": "unnamedWire#89", - "path": [ - { - "x": 40.0, - "y": 195.0 - }, - { - "x": 40.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I2" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 35.0, - "y": 205.0 - }, - { - "x": 35.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I2" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 30.0, - "y": 215.0 - }, - { - "x": 30.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I2" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 45.0, - "y": 225.0 - }, - { - "x": 45.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I2" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 40.0, - "y": 235.0 - }, - { - "x": 40.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "MUX\n8 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 23.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json deleted file mode 100644 index 91d1220e..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json +++ /dev/null @@ -1,434 +0,0 @@ -{ - "width": 70.0, - "height": 70.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 30.0 - }, - "name": "I00", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "I01", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "I10", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "I11", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 70.0, - "y": 10.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 30.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 24.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 54.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 115.0, - "y": 20.0 - } - }, - { - "id": "sel1", - "name": "sel1#0", - "pos": { - "x": 60.0, - "y": 35.0 - } - }, - { - "id": "sel1", - "name": "sel1#1", - "pos": { - "x": 60.0, - "y": 100.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "S2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 55.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "S2" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 25.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "S1" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 55.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 25.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I00" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I1" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 35.0, - "y": 75.0 - }, - { - "x": 35.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I01" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I2" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 40.0, - "y": 100.0 - }, - { - "x": 40.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I10" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I1" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I11" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I2" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 20.0, - "y": 150.0 - }, - { - "x": 20.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 105.0, - "y": 40.0 - }, - { - "x": 105.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#1", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 105.0, - "y": 105.0 - }, - { - "x": 105.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 15.0, - "y": 25.0 - }, - { - "x": 15.0, - "y": 10.0 - }, - { - "x": 85.0, - "y": 10.0 - }, - { - "x": 85.0, - "y": 25.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "mux2", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json deleted file mode 100644 index ac5aa8ae..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json +++ /dev/null @@ -1,483 +0,0 @@ -{ - "width": 80.0, - "height": 120.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "I000", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "I001", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "I010", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 70.0 - }, - "name": "I011", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 80.0 - }, - "name": "I100", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 90.0 - }, - "name": "I101", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 100.0 - }, - "name": "I110", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 110.0 - }, - "name": "I111", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 30.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "S2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 80.0, - "y": 10.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 19.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 94.0 - }, - "params": 1 - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 125.0, - "y": 20.0 - } - }, - { - "id": "mux2", - "name": "mux2#0", - "pos": { - "x": 35.0, - "y": 185.0 - } - }, - { - "id": "mux2", - "name": "mux2#1", - "pos": { - "x": 35.0, - "y": 85.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 20.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 25.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "I11" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I011" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 15.0, - "y": 145.0 - }, - { - "x": 15.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "I00" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I100" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 10.0, - "y": 215.0 - }, - { - "x": 10.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I101" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I01" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "I10" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I110" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 10.0, - "y": 235.0 - }, - { - "x": 10.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I111" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I11" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 15.0, - "y": 275.0 - }, - { - "x": 15.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 115.0, - "y": 195.0 - }, - { - "x": 115.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 110.0, - "y": 95.0 - }, - { - "x": 110.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "S0" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "S2" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "S1" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 25.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 20.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I000" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I00" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 10.0, - "y": 100.0 - }, - { - "x": 10.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "I01" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I001" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I010" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I10" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 150.0 - }, - { - "x": 10.0, - "y": 135.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "mux3", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json deleted file mode 100644 index ced22619..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json +++ /dev/null @@ -1,219 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 35.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 62.5, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 31.5, - "y": 24.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#1" - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 32.5, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 32.5, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 57.5, - "y": 25.0 - }, - { - "x": 57.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 60.0, - "y": 62.5 - }, - { - "x": 60.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#7", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "nand3", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json deleted file mode 100644 index 4b4e51f1..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json +++ /dev/null @@ -1,401 +0,0 @@ -{ - "width": 35.0, - "height": 40.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 30.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 30.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 30.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 30.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 14.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 14.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 14.0, - "y": 61.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 14.0, - "y": 86.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 15.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 15.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 15.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 15.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 15.0, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 15.0, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 15.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 15.0, - "y": 42.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "not4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json deleted file mode 100644 index 33e50e58..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json +++ /dev/null @@ -1,558 +0,0 @@ -{ - "width": 35.0, - "height": 40.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 20.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 20.0, - "y": 65.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 20.0, - "y": 115.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 20.0, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 50.0, - "y": 40.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 50.0, - "y": 140.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 110.0, - "y": 40.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 110.0, - "y": 140.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 140.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 14.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 14.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 14.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 14.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 104.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 104.0, - "y": 149.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 15.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 15.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#12" - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#13" - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#14" - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#15" - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 105.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 105.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 105.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 105.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#22" - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#23" - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#24" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 15.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 15.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 15.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 15.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 15.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 15.0, - "y": 80.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "or4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json deleted file mode 100644 index 46801b2f..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json +++ /dev/null @@ -1,897 +0,0 @@ -{ - "width": 35.0, - "height": 80.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 15.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 15.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 65.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 65.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 15.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 15.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 15.0, - "y": 102.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 15.0, - "y": 127.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 15.0, - "y": 152.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 15.0, - "y": 177.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 65.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 65.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 6.5, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 6.5, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 6.5, - "y": 61.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 6.5, - "y": 86.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 6.5, - "y": 111.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 6.5, - "y": 136.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 6.5, - "y": 161.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 6.5, - "y": 186.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 7.5, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 7.5, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 7.5, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 7.5, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 7.5, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 7.5, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 7.5, - "y": 107.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 7.5, - "y": 117.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 7.5, - "y": 132.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 7.5, - "y": 142.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 7.5, - "y": 157.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 7.5, - "y": 167.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 7.5, - "y": 182.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 7.5, - "y": 192.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 40.0, - "y": 12.5 - }, - { - "x": 40.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 45.0, - "y": 112.5 - }, - { - "x": 45.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 40.0, - "y": 37.5 - }, - { - "x": 40.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 50.0, - "y": 137.5 - }, - { - "x": 50.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 40.0, - "y": 62.5 - }, - { - "x": 40.0, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "B" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 55.0, - "y": 162.5 - }, - { - "x": 55.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 40.0, - "y": 87.5 - }, - { - "x": 40.0, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "B" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 60.0, - "y": 187.5 - }, - { - "x": 60.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B4" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 7.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 7.5, - "y": 17.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "or_4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json deleted file mode 100644 index 37322570..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json +++ /dev/null @@ -1,3029 +0,0 @@ -{ - "width": 35.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "B0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "QA1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "QA2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "QA3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "QA4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "QB1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "QB2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 65.0 - }, - "name": "QB3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 75.0 - }, - "name": "QB4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.1, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 109.0, - "y": 154.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 104.0, - "y": 164.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 44.0, - "y": 499.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 49.0, - "y": 509.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 34.0, - "y": 629.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 39.0, - "y": 639.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 44.0, - "y": 649.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 49.0, - "y": 659.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 129.0, - "y": 329.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 124.0, - "y": 339.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 119.0, - "y": 349.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 114.0, - "y": 359.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 99.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 129.0, - "y": 479.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 124.0, - "y": 489.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 119.0, - "y": 499.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 114.0, - "y": 509.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 129.0, - "y": 629.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 124.0, - "y": 639.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 119.0, - "y": 649.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 114.0, - "y": 659.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 129.0, - "y": 779.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 124.0, - "y": 789.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 94.0, - "y": 184.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 119.0, - "y": 799.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 114.0, - "y": 809.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 34.0, - "y": 549.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 39.0, - "y": 649.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 44.0, - "y": 749.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 49.0, - "y": 809.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 34.0, - "y": 479.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 39.0, - "y": 489.0 - }, - "params": 1 - }, - { - "id": "and41", - "name": "and41#0", - "pos": { - "x": 130.0, - "y": 150.0 - } - }, - { - "id": "and41", - "name": "and41#1", - "pos": { - "x": 235.0, - "y": 375.0 - } - }, - { - "id": "and41", - "name": "and41#2", - "pos": { - "x": 135.0, - "y": 325.0 - } - }, - { - "id": "andor414", - "name": "andor414#0", - "pos": { - "x": 235.0, - "y": 485.0 - } - }, - { - "id": "andor414", - "name": "andor414#1", - "pos": { - "x": 235.0, - "y": 635.0 - } - }, - { - "id": "andor414", - "name": "andor414#2", - "pos": { - "x": 235.0, - "y": 785.0 - } - }, - { - "id": "andor414", - "name": "andor414#3", - "pos": { - "x": 135.0, - "y": 435.0 - } - }, - { - "id": "andor414", - "name": "andor414#4", - "pos": { - "x": 135.0, - "y": 585.0 - } - }, - { - "id": "andor414", - "name": "andor414#5", - "pos": { - "x": 135.0, - "y": 735.0 - } - }, - { - "id": "demux2", - "name": "demux2#0", - "pos": { - "x": 55.0, - "y": 45.0 - } - }, - { - "id": "demux2", - "name": "demux2#1", - "pos": { - "x": 55.0, - "y": 150.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#0", - "pos": { - "x": 55.0, - "y": 325.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#1", - "pos": { - "x": 55.0, - "y": 475.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#2", - "pos": { - "x": 55.0, - "y": 625.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#3", - "pos": { - "x": 55.0, - "y": 775.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A0" - }, - "pin2": { - "compName": "demux2#0", - "pinName": "S0" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "demux2#0", - "pinName": "S1" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 10.0, - "y": 150.0 - }, - { - "x": 10.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A3" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A4" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C1" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 290.0, - "y": 380.0 - }, - { - "x": 290.0, - "y": 445.0 - }, - { - "x": 230.0, - "y": 445.0 - }, - { - "x": 230.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C2" - }, - "name": "unnamedWire#102", - "path": [ - { - "x": 285.0, - "y": 390.0 - }, - { - "x": 285.0, - "y": 440.0 - }, - { - "x": 225.0, - "y": 440.0 - }, - { - "x": 225.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C3" - }, - "name": "unnamedWire#103", - "path": [ - { - "x": 280.0, - "y": 400.0 - }, - { - "x": 280.0, - "y": 435.0 - }, - { - "x": 220.0, - "y": 435.0 - }, - { - "x": 220.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C4" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 275.0, - "y": 410.0 - }, - { - "x": 275.0, - "y": 430.0 - }, - { - "x": 215.0, - "y": 430.0 - }, - { - "x": 215.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C1" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 290.0, - "y": 490.0 - }, - { - "x": 290.0, - "y": 595.0 - }, - { - "x": 230.0, - "y": 595.0 - }, - { - "x": 230.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C2" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 285.0, - "y": 500.0 - }, - { - "x": 285.0, - "y": 590.0 - }, - { - "x": 225.0, - "y": 590.0 - }, - { - "x": 225.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C3" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 280.0, - "y": 510.0 - }, - { - "x": 280.0, - "y": 585.0 - }, - { - "x": 220.0, - "y": 585.0 - }, - { - "x": 220.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C4" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 275.0, - "y": 520.0 - }, - { - "x": 275.0, - "y": 580.0 - }, - { - "x": 215.0, - "y": 580.0 - }, - { - "x": 215.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C1" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 290.0, - "y": 640.0 - }, - { - "x": 290.0, - "y": 745.0 - }, - { - "x": 230.0, - "y": 745.0 - }, - { - "x": 230.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A4" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C2" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 285.0, - "y": 650.0 - }, - { - "x": 285.0, - "y": 740.0 - }, - { - "x": 225.0, - "y": 740.0 - }, - { - "x": 225.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C3" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 280.0, - "y": 660.0 - }, - { - "x": 280.0, - "y": 735.0 - }, - { - "x": 220.0, - "y": 735.0 - }, - { - "x": 220.0, - "y": 810.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C4" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 275.0, - "y": 670.0 - }, - { - "x": 275.0, - "y": 730.0 - }, - { - "x": 215.0, - "y": 730.0 - }, - { - "x": 215.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA1" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 300.0, - "y": 790.0 - }, - { - "x": 300.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA2" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 305.0, - "y": 800.0 - }, - { - "x": 305.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA3" - }, - "name": "unnamedWire#115", - "path": [ - { - "x": 310.0, - "y": 810.0 - }, - { - "x": 310.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA4" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 315.0, - "y": 820.0 - }, - { - "x": 315.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C1" - }, - "name": "unnamedWire#117", - "path": [ - { - "x": 190.0, - "y": 330.0 - }, - { - "x": 190.0, - "y": 430.0 - }, - { - "x": 130.0, - "y": 430.0 - }, - { - "x": 130.0, - "y": 440.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C2" - }, - "name": "unnamedWire#118", - "path": [ - { - "x": 185.0, - "y": 340.0 - }, - { - "x": 185.0, - "y": 425.0 - }, - { - "x": 125.0, - "y": 425.0 - }, - { - "x": 125.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C3" - }, - "name": "unnamedWire#119", - "path": [ - { - "x": 180.0, - "y": 350.0 - }, - { - "x": 180.0, - "y": 420.0 - }, - { - "x": 120.0, - "y": 420.0 - }, - { - "x": 120.0, - "y": 460.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "and41#0", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 5.0, - "y": 450.0 - }, - { - "x": 5.0, - "y": 300.0 - }, - { - "x": 125.0, - "y": 300.0 - }, - { - "x": 125.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C4" - }, - "name": "unnamedWire#120", - "path": [ - { - "x": 175.0, - "y": 360.0 - }, - { - "x": 175.0, - "y": 415.0 - }, - { - "x": 115.0, - "y": 415.0 - }, - { - "x": 115.0, - "y": 470.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C1" - }, - "name": "unnamedWire#121", - "path": [ - { - "x": 190.0, - "y": 440.0 - }, - { - "x": 190.0, - "y": 580.0 - }, - { - "x": 130.0, - "y": 580.0 - }, - { - "x": 130.0, - "y": 590.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C2" - }, - "name": "unnamedWire#122", - "path": [ - { - "x": 185.0, - "y": 450.0 - }, - { - "x": 185.0, - "y": 575.0 - }, - { - "x": 125.0, - "y": 575.0 - }, - { - "x": 125.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C3" - }, - "name": "unnamedWire#123", - "path": [ - { - "x": 180.0, - "y": 460.0 - }, - { - "x": 180.0, - "y": 570.0 - }, - { - "x": 120.0, - "y": 570.0 - }, - { - "x": 120.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C4" - }, - "name": "unnamedWire#124", - "path": [ - { - "x": 175.0, - "y": 470.0 - }, - { - "x": 175.0, - "y": 565.0 - }, - { - "x": 115.0, - "y": 565.0 - }, - { - "x": 115.0, - "y": 620.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C1" - }, - "name": "unnamedWire#125", - "path": [ - { - "x": 190.0, - "y": 590.0 - }, - { - "x": 190.0, - "y": 730.0 - }, - { - "x": 130.0, - "y": 730.0 - }, - { - "x": 130.0, - "y": 740.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C2" - }, - "name": "unnamedWire#126", - "path": [ - { - "x": 185.0, - "y": 600.0 - }, - { - "x": 185.0, - "y": 725.0 - }, - { - "x": 125.0, - "y": 725.0 - }, - { - "x": 125.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C3" - }, - "name": "unnamedWire#127", - "path": [ - { - "x": 180.0, - "y": 610.0 - }, - { - "x": 180.0, - "y": 720.0 - }, - { - "x": 120.0, - "y": 720.0 - }, - { - "x": 120.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C4" - }, - "name": "unnamedWire#128", - "path": [ - { - "x": 175.0, - "y": 620.0 - }, - { - "x": 175.0, - "y": 715.0 - }, - { - "x": 115.0, - "y": 715.0 - }, - { - "x": 115.0, - "y": 770.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB1" - }, - "name": "unnamedWire#129", - "path": [ - { - "x": 190.0, - "y": 740.0 - }, - { - "x": 190.0, - "y": 880.0 - }, - { - "x": 325.0, - "y": 880.0 - }, - { - "x": 325.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "C" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 185.0, - "y": 155.0 - }, - { - "x": 185.0, - "y": 250.0 - }, - { - "x": 30.0, - "y": 250.0 - }, - { - "x": 30.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB2" - }, - "name": "unnamedWire#130", - "path": [ - { - "x": 185.0, - "y": 750.0 - }, - { - "x": 185.0, - "y": 885.0 - }, - { - "x": 330.0, - "y": 885.0 - }, - { - "x": 330.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB3" - }, - "name": "unnamedWire#131", - "path": [ - { - "x": 180.0, - "y": 760.0 - }, - { - "x": 180.0, - "y": 890.0 - }, - { - "x": 335.0, - "y": 890.0 - }, - { - "x": 335.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB4" - }, - "name": "unnamedWire#132", - "path": [ - { - "x": 175.0, - "y": 770.0 - }, - { - "x": 175.0, - "y": 895.0 - }, - { - "x": 340.0, - "y": 895.0 - }, - { - "x": 340.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "C" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 180.0, - "y": 165.0 - }, - { - "x": 180.0, - "y": 245.0 - }, - { - "x": 25.0, - "y": 245.0 - }, - { - "x": 25.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "C" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 175.0, - "y": 175.0 - }, - { - "x": 175.0, - "y": 240.0 - }, - { - "x": 20.0, - "y": 240.0 - }, - { - "x": 20.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "C" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 170.0, - "y": 185.0 - }, - { - "x": 170.0, - "y": 235.0 - }, - { - "x": 15.0, - "y": 235.0 - }, - { - "x": 15.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B0" - }, - "pin2": { - "compName": "demux2#1", - "pinName": "S0" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 250.0 - }, - { - "x": 5.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 50.0, - "y": 850.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D1" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 35.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D2" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 40.0, - "y": 340.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D3" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 45.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D4" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 50.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D1" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D2" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D3" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D4" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "demux2#1", - "pinName": "S1" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 350.0 - }, - { - "x": 10.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "D1" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "D2" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "D3" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "D4" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y00" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "D1" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 35.0, - "y": 780.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "D2" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 40.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "D3" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 45.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "D4" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y01" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#2", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#2", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#2", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#2", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#3", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#3", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#3", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y10" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#3", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y00" - }, - "pin2": { - "compName": "and41#1", - "pinName": "B" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 210.0, - "y": 50.0 - }, - { - "x": 210.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y01" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "B" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 205.0, - "y": 60.0 - }, - { - "x": 205.0, - "y": 570.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y10" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "B" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 200.0, - "y": 70.0 - }, - { - "x": 200.0, - "y": 720.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y11" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "B" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 195.0, - "y": 80.0 - }, - { - "x": 195.0, - "y": 870.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "B" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 110.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "B" - }, - "name": "unnamedWire#66", - "path": [ - { - "x": 105.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "B" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 100.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "B" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 95.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A1" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 130.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y11" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A2" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 125.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A3" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 120.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A4" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 115.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 130.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A2" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 125.0, - "y": 540.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A3" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 120.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A4" - }, - "name": "unnamedWire#76", - "path": [ - { - "x": 115.0, - "y": 560.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A1" - }, - "name": "unnamedWire#77", - "path": [ - { - "x": 130.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A2" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 125.0, - "y": 690.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A3" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 120.0, - "y": 700.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A4" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 115.0, - "y": 710.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A1" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 130.0, - "y": 830.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A2" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 125.0, - "y": 840.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A3" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 120.0, - "y": 850.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A4" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 115.0, - "y": 860.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A1" - }, - "name": "unnamedWire#85", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A2" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A3" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A4" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A1" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A2" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A2" - }, - "name": "unnamedWire#90", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A3" - }, - "name": "unnamedWire#91", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A4" - }, - "name": "unnamedWire#92", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A1" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A2" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A3" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A4" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A1" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A2" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A3" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "ram2", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "c00": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch4#0" - } - }, - "c01": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch4#1" - } - }, - "c10": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch4#2" - } - }, - "c11": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch4#3" - } - } - }, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "c11.q", - "c10.q", - "c01.q", - "c00.q" - ], - "vectorPartLengthes": [ - 4, - 4, - 4, - 4 - ] - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json deleted file mode 100644 index de91b6be..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json +++ /dev/null @@ -1,3525 +0,0 @@ -{ - "width": 35.0, - "height": 130.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "B0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 105.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 115.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 125.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "QA1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "QA2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "QA3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "QA4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "QB1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "QB2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 65.0 - }, - "name": "QB3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 75.0 - }, - "name": "QB4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.1, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 229.0, - "y": 154.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 224.0, - "y": 164.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 69.0, - "y": 704.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 74.0, - "y": 714.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 59.0, - "y": 834.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 64.0, - "y": 844.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 69.0, - "y": 854.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 74.0, - "y": 864.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 39.0, - "y": 484.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 44.0, - "y": 494.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 49.0, - "y": 504.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 54.0, - "y": 514.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 219.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 39.0, - "y": 634.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 44.0, - "y": 644.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 49.0, - "y": 654.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 54.0, - "y": 664.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 39.0, - "y": 334.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 44.0, - "y": 349.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 49.0, - "y": 649.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 54.0, - "y": 749.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 214.0, - "y": 184.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 59.0, - "y": 534.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 64.0, - "y": 544.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 69.0, - "y": 554.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 74.0, - "y": 564.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 59.0, - "y": 684.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 64.0, - "y": 694.0 - }, - "params": 1 - }, - { - "id": "and41", - "name": "and41#0", - "pos": { - "x": 235.0, - "y": 150.0 - } - }, - { - "id": "and41", - "name": "and41#1", - "pos": { - "x": 250.0, - "y": 375.0 - } - }, - { - "id": "and41", - "name": "and41#2", - "pos": { - "x": 155.0, - "y": 325.0 - } - }, - { - "id": "andor414", - "name": "andor414#0", - "pos": { - "x": 250.0, - "y": 485.0 - } - }, - { - "id": "andor414", - "name": "andor414#1", - "pos": { - "x": 250.0, - "y": 635.0 - } - }, - { - "id": "andor414", - "name": "andor414#2", - "pos": { - "x": 250.0, - "y": 785.0 - } - }, - { - "id": "andor414", - "name": "andor414#3", - "pos": { - "x": 155.0, - "y": 435.0 - } - }, - { - "id": "andor414", - "name": "andor414#4", - "pos": { - "x": 155.0, - "y": 585.0 - } - }, - { - "id": "andor414", - "name": "andor414#5", - "pos": { - "x": 155.0, - "y": 735.0 - } - }, - { - "id": "demux2", - "name": "demux2#0", - "pos": { - "x": 55.0, - "y": 45.0 - } - }, - { - "id": "demux2", - "name": "demux2#1", - "pos": { - "x": 55.0, - "y": 150.0 - } - }, - { - "id": "ram2", - "name": "ram2#0", - "pos": { - "x": 80.0, - "y": 330.0 - } - }, - { - "id": "ram2", - "name": "ram2#1", - "pos": { - "x": 80.0, - "y": 480.0 - } - }, - { - "id": "ram2", - "name": "ram2#2", - "pos": { - "x": 80.0, - "y": 630.0 - } - }, - { - "id": "ram2", - "name": "ram2#3", - "pos": { - "x": 80.0, - "y": 780.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A0" - }, - "pin2": { - "compName": "demux2#0", - "pinName": "S0" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "demux2#0", - "pinName": "S1" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 10.0, - "y": 150.0 - }, - { - "x": 10.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A3" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QA4" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A4" - }, - "name": "unnamedWire#100", - "path": [ - { - "x": 140.0, - "y": 365.0 - }, - { - "x": 140.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QA1" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A1" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 140.0, - "y": 485.0 - }, - { - "x": 140.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QA2" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A2" - }, - "name": "unnamedWire#102", - "path": [ - { - "x": 140.0, - "y": 495.0 - }, - { - "x": 140.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QA3" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A3" - }, - "name": "unnamedWire#103", - "path": [ - { - "x": 140.0, - "y": 505.0 - }, - { - "x": 140.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QA4" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A4" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 140.0, - "y": 515.0 - }, - { - "x": 140.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QA1" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A1" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 140.0, - "y": 635.0 - }, - { - "x": 140.0, - "y": 630.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QA2" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A2" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 140.0, - "y": 645.0 - }, - { - "x": 140.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QA3" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A3" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 140.0, - "y": 655.0 - }, - { - "x": 140.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QA4" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A4" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 140.0, - "y": 665.0 - }, - { - "x": 140.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QA1" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A1" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 140.0, - "y": 785.0 - }, - { - "x": 140.0, - "y": 780.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A4" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QA2" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A2" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 140.0, - "y": 795.0 - }, - { - "x": 140.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QA3" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A3" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 140.0, - "y": 805.0 - }, - { - "x": 140.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QA4" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A4" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 140.0, - "y": 815.0 - }, - { - "x": 140.0, - "y": 810.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C1" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 305.0, - "y": 380.0 - }, - { - "x": 305.0, - "y": 445.0 - }, - { - "x": 245.0, - "y": 445.0 - }, - { - "x": 245.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C2" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 300.0, - "y": 390.0 - }, - { - "x": 300.0, - "y": 440.0 - }, - { - "x": 240.0, - "y": 440.0 - }, - { - "x": 240.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C3" - }, - "name": "unnamedWire#115", - "path": [ - { - "x": 295.0, - "y": 400.0 - }, - { - "x": 295.0, - "y": 435.0 - }, - { - "x": 235.0, - "y": 435.0 - }, - { - "x": 235.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C4" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 290.0, - "y": 410.0 - }, - { - "x": 290.0, - "y": 430.0 - }, - { - "x": 230.0, - "y": 430.0 - }, - { - "x": 230.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C1" - }, - "name": "unnamedWire#117", - "path": [ - { - "x": 305.0, - "y": 490.0 - }, - { - "x": 305.0, - "y": 595.0 - }, - { - "x": 245.0, - "y": 595.0 - }, - { - "x": 245.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C2" - }, - "name": "unnamedWire#118", - "path": [ - { - "x": 300.0, - "y": 500.0 - }, - { - "x": 300.0, - "y": 590.0 - }, - { - "x": 240.0, - "y": 590.0 - }, - { - "x": 240.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C3" - }, - "name": "unnamedWire#119", - "path": [ - { - "x": 295.0, - "y": 510.0 - }, - { - "x": 295.0, - "y": 585.0 - }, - { - "x": 235.0, - "y": 585.0 - }, - { - "x": 235.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "and41#0", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 15.0, - "y": 850.0 - }, - { - "x": 15.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C4" - }, - "name": "unnamedWire#120", - "path": [ - { - "x": 290.0, - "y": 520.0 - }, - { - "x": 290.0, - "y": 580.0 - }, - { - "x": 230.0, - "y": 580.0 - }, - { - "x": 230.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C1" - }, - "name": "unnamedWire#121", - "path": [ - { - "x": 305.0, - "y": 640.0 - }, - { - "x": 305.0, - "y": 745.0 - }, - { - "x": 245.0, - "y": 745.0 - }, - { - "x": 245.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C2" - }, - "name": "unnamedWire#122", - "path": [ - { - "x": 300.0, - "y": 650.0 - }, - { - "x": 300.0, - "y": 740.0 - }, - { - "x": 240.0, - "y": 740.0 - }, - { - "x": 240.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C3" - }, - "name": "unnamedWire#123", - "path": [ - { - "x": 295.0, - "y": 660.0 - }, - { - "x": 295.0, - "y": 735.0 - }, - { - "x": 235.0, - "y": 735.0 - }, - { - "x": 235.0, - "y": 810.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C4" - }, - "name": "unnamedWire#124", - "path": [ - { - "x": 290.0, - "y": 670.0 - }, - { - "x": 290.0, - "y": 730.0 - }, - { - "x": 230.0, - "y": 730.0 - }, - { - "x": 230.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB1" - }, - "name": "unnamedWire#125", - "path": [ - { - "x": 330.0, - "y": 790.0 - }, - { - "x": 330.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB2" - }, - "name": "unnamedWire#126", - "path": [ - { - "x": 335.0, - "y": 800.0 - }, - { - "x": 335.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB3" - }, - "name": "unnamedWire#127", - "path": [ - { - "x": 340.0, - "y": 810.0 - }, - { - "x": 340.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB4" - }, - "name": "unnamedWire#128", - "path": [ - { - "x": 345.0, - "y": 820.0 - }, - { - "x": 345.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C1" - }, - "name": "unnamedWire#129", - "path": [ - { - "x": 210.0, - "y": 330.0 - }, - { - "x": 210.0, - "y": 430.0 - }, - { - "x": 150.0, - "y": 430.0 - }, - { - "x": 150.0, - "y": 440.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "WE" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 290.0, - "y": 155.0 - }, - { - "x": 290.0, - "y": 230.0 - }, - { - "x": 35.0, - "y": 230.0 - }, - { - "x": 35.0, - "y": 375.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C2" - }, - "name": "unnamedWire#130", - "path": [ - { - "x": 205.0, - "y": 340.0 - }, - { - "x": 205.0, - "y": 425.0 - }, - { - "x": 145.0, - "y": 425.0 - }, - { - "x": 145.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C3" - }, - "name": "unnamedWire#131", - "path": [ - { - "x": 200.0, - "y": 350.0 - }, - { - "x": 200.0, - "y": 420.0 - }, - { - "x": 140.0, - "y": 420.0 - }, - { - "x": 140.0, - "y": 460.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C4" - }, - "name": "unnamedWire#132", - "path": [ - { - "x": 195.0, - "y": 360.0 - }, - { - "x": 195.0, - "y": 415.0 - }, - { - "x": 135.0, - "y": 415.0 - }, - { - "x": 135.0, - "y": 470.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C1" - }, - "name": "unnamedWire#133", - "path": [ - { - "x": 210.0, - "y": 440.0 - }, - { - "x": 210.0, - "y": 580.0 - }, - { - "x": 150.0, - "y": 580.0 - }, - { - "x": 150.0, - "y": 590.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C2" - }, - "name": "unnamedWire#134", - "path": [ - { - "x": 205.0, - "y": 450.0 - }, - { - "x": 205.0, - "y": 575.0 - }, - { - "x": 145.0, - "y": 575.0 - }, - { - "x": 145.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C3" - }, - "name": "unnamedWire#135", - "path": [ - { - "x": 200.0, - "y": 460.0 - }, - { - "x": 200.0, - "y": 570.0 - }, - { - "x": 140.0, - "y": 570.0 - }, - { - "x": 140.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C4" - }, - "name": "unnamedWire#136", - "path": [ - { - "x": 195.0, - "y": 470.0 - }, - { - "x": 195.0, - "y": 565.0 - }, - { - "x": 135.0, - "y": 565.0 - }, - { - "x": 135.0, - "y": 620.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C1" - }, - "name": "unnamedWire#137", - "path": [ - { - "x": 210.0, - "y": 590.0 - }, - { - "x": 210.0, - "y": 730.0 - }, - { - "x": 150.0, - "y": 730.0 - }, - { - "x": 150.0, - "y": 740.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C2" - }, - "name": "unnamedWire#138", - "path": [ - { - "x": 205.0, - "y": 600.0 - }, - { - "x": 205.0, - "y": 725.0 - }, - { - "x": 145.0, - "y": 725.0 - }, - { - "x": 145.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C3" - }, - "name": "unnamedWire#139", - "path": [ - { - "x": 200.0, - "y": 610.0 - }, - { - "x": 200.0, - "y": 720.0 - }, - { - "x": 140.0, - "y": 720.0 - }, - { - "x": 140.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "WE" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 285.0, - "y": 165.0 - }, - { - "x": 285.0, - "y": 225.0 - }, - { - "x": 30.0, - "y": 225.0 - }, - { - "x": 30.0, - "y": 525.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C4" - }, - "name": "unnamedWire#140", - "path": [ - { - "x": 195.0, - "y": 620.0 - }, - { - "x": 195.0, - "y": 715.0 - }, - { - "x": 135.0, - "y": 715.0 - }, - { - "x": 135.0, - "y": 770.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA1" - }, - "name": "unnamedWire#141", - "path": [ - { - "x": 210.0, - "y": 740.0 - }, - { - "x": 210.0, - "y": 880.0 - }, - { - "x": 310.0, - "y": 880.0 - }, - { - "x": 310.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA2" - }, - "name": "unnamedWire#142", - "path": [ - { - "x": 205.0, - "y": 750.0 - }, - { - "x": 205.0, - "y": 885.0 - }, - { - "x": 315.0, - "y": 885.0 - }, - { - "x": 315.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA3" - }, - "name": "unnamedWire#143", - "path": [ - { - "x": 200.0, - "y": 760.0 - }, - { - "x": 200.0, - "y": 890.0 - }, - { - "x": 320.0, - "y": 890.0 - }, - { - "x": 320.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA4" - }, - "name": "unnamedWire#144", - "path": [ - { - "x": 195.0, - "y": 770.0 - }, - { - "x": 195.0, - "y": 895.0 - }, - { - "x": 325.0, - "y": 895.0 - }, - { - "x": 325.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "WE" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 280.0, - "y": 175.0 - }, - { - "x": 280.0, - "y": 220.0 - }, - { - "x": 25.0, - "y": 220.0 - }, - { - "x": 25.0, - "y": 675.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "WE" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 275.0, - "y": 185.0 - }, - { - "x": 275.0, - "y": 215.0 - }, - { - "x": 20.0, - "y": 215.0 - }, - { - "x": 20.0, - "y": 825.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "A0" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B0" - }, - "pin2": { - "compName": "demux2#1", - "pinName": "S0" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 450.0 - }, - { - "x": 5.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "A1" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 45.0, - "y": 345.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "B0" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 50.0, - "y": 355.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "B1" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 55.0, - "y": 365.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "A0" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "A1" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "B0" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "B1" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "demux2#1", - "pinName": "S1" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 550.0 - }, - { - "x": 10.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "A0" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "A1" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "B0" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "B1" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "A0" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 40.0, - "y": 785.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "A1" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 45.0, - "y": 795.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "B0" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 50.0, - "y": 805.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y00" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "B1" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 55.0, - "y": 815.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 40.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "D1" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 60.0, - "y": 385.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "D2" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 65.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "D3" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 70.0, - "y": 405.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "D4" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 75.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "D1" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y01" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "D2" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "D3" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "D4" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "D1" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "D2" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "D3" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y10" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "D4" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "D1" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "D2" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "D3" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "D4" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 60.0, - "y": 950.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y11" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 65.0, - "y": 1050.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 70.0, - "y": 1150.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 75.0, - "y": 1250.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y00" - }, - "pin2": { - "compName": "and41#2", - "pinName": "B" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 135.0, - "y": 50.0 - }, - { - "x": 135.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y01" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "B" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 130.0, - "y": 60.0 - }, - { - "x": 130.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y10" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "B" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 125.0, - "y": 70.0 - }, - { - "x": 125.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y11" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "B" - }, - "name": "unnamedWire#76", - "path": [ - { - "x": 120.0, - "y": 80.0 - }, - { - "x": 120.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "B" - }, - "name": "unnamedWire#77", - "path": [ - { - "x": 230.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "B" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 225.0, - "y": 570.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "B" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 220.0, - "y": 720.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "B" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 215.0, - "y": 870.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QB1" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A1" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 140.0, - "y": 375.0 - }, - { - "x": 140.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QB2" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A2" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 140.0, - "y": 385.0 - }, - { - "x": 140.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QB3" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A3" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 140.0, - "y": 395.0 - }, - { - "x": 140.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QB4" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A4" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 140.0, - "y": 405.0 - }, - { - "x": 140.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QB1" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A1" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 140.0, - "y": 525.0 - }, - { - "x": 140.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QB2" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A2" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 140.0, - "y": 535.0 - }, - { - "x": 140.0, - "y": 540.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QB3" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A3" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 140.0, - "y": 545.0 - }, - { - "x": 140.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QB4" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A4" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 140.0, - "y": 555.0 - }, - { - "x": 140.0, - "y": 560.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QB1" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A1" - }, - "name": "unnamedWire#89", - "path": [ - { - "x": 140.0, - "y": 675.0 - }, - { - "x": 140.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A2" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QB2" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A2" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 140.0, - "y": 685.0 - }, - { - "x": 140.0, - "y": 690.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QB3" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A3" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 140.0, - "y": 695.0 - }, - { - "x": 140.0, - "y": 700.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QB4" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A4" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 140.0, - "y": 705.0 - }, - { - "x": 140.0, - "y": 710.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QB1" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A1" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 140.0, - "y": 825.0 - }, - { - "x": 140.0, - "y": 830.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QB2" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A2" - }, - "name": "unnamedWire#94", - "path": [ - { - "x": 140.0, - "y": 835.0 - }, - { - "x": 140.0, - "y": 840.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QB3" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A3" - }, - "name": "unnamedWire#95", - "path": [ - { - "x": 140.0, - "y": 845.0 - }, - { - "x": 140.0, - "y": 850.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QB4" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A4" - }, - "name": "unnamedWire#96", - "path": [ - { - "x": 140.0, - "y": 855.0 - }, - { - "x": 140.0, - "y": 860.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QA1" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A1" - }, - "name": "unnamedWire#97", - "path": [ - { - "x": 140.0, - "y": 335.0 - }, - { - "x": 140.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QA2" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A2" - }, - "name": "unnamedWire#98", - "path": [ - { - "x": 140.0, - "y": 345.0 - }, - { - "x": 140.0, - "y": 340.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QA3" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A3" - }, - "name": "unnamedWire#99", - "path": [ - { - "x": 140.0, - "y": 355.0 - }, - { - "x": 140.0, - "y": 350.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "ram4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "c00": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0" - } - }, - "c0000": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0", - "prefix": "c00" - } - }, - "c0001": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1", - "prefix": "c00" - } - }, - "c0010": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2", - "prefix": "c00" - } - }, - "c0011": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3", - "prefix": "c00" - } - }, - "c01": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1" - } - }, - "c0100": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0", - "prefix": "c01" - } - }, - "c0101": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1", - "prefix": "c01" - } - }, - "c0110": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2", - "prefix": "c01" - } - }, - "c0111": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3", - "prefix": "c01" - } - }, - "c10": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2" - } - }, - "c1000": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0", - "prefix": "c10" - } - }, - "c1001": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1", - "prefix": "c10" - } - }, - "c1010": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2", - "prefix": "c10" - } - }, - "c1011": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3", - "prefix": "c10" - } - }, - "c11": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3" - } - }, - "c1100": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0", - "prefix": "c11" - } - }, - "c1101": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1", - "prefix": "c11" - } - }, - "c1110": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2", - "prefix": "c11" - } - }, - "c1111": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3", - "prefix": "c11" - } - } - }, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "c11.q", - "c10.q", - "c01.q", - "c00.q" - ], - "vectorPartLengthes": [ - 16, - 16, - 16, - 16 - ] - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json deleted file mode 100644 index afd89f18..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json +++ /dev/null @@ -1,214 +0,0 @@ -{ - "width": 35.0, - "height": 40.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "I2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "S2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 35.0, - "y": 30.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 35.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 60.0, - "y": 40.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 25.0, - "y": 12.5 - }, - { - "x": 25.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S2" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 15.0, - "y": 37.5 - }, - { - "x": 15.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#10" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 25.0, - "y": 62.5 - }, - { - "x": 25.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I2" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 15.0, - "y": 87.5 - }, - { - "x": 15.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#8" - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "sel1", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json deleted file mode 100644 index 22f3ce64..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json +++ /dev/null @@ -1,863 +0,0 @@ -{ - "width": 35.0, - "height": 100.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "B4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "SA", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "SB", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 20.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 20.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 65.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 65.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 20.0, - "y": 102.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 20.0, - "y": 152.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 20.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 20.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 20.0, - "y": 127.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 20.0, - "y": 177.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 65.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 65.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 6.5, - "y": 16.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 6.5, - "y": 66.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 6.5, - "y": 116.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 4.0, - "y": 41.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 4.0, - "y": 91.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 4.0, - "y": 141.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 15.0, - "y": 62.5 - }, - { - "x": 15.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 17.5, - "y": 87.5 - }, - { - "x": 17.5, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#10" - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#11" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#12" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#13" - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#14" - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 7.5, - "y": 167.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#16" - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#17" - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#18" - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#19" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 17.5, - "y": 112.5 - }, - { - "x": 17.5, - "y": 107.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#20" - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 5.0, - "y": 192.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 42.5, - "y": 12.5 - }, - { - "x": 42.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 45.0, - "y": 37.5 - }, - { - "x": 45.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "A" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 47.5, - "y": 62.5 - }, - { - "x": 47.5, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 50.0, - "y": 87.5 - }, - { - "x": 50.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 52.5, - "y": 112.5 - }, - { - "x": 52.5, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "B" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 55.0, - "y": 137.5 - }, - { - "x": 55.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 57.5, - "y": 162.5 - }, - { - "x": 57.5, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "B" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 60.0, - "y": 187.5 - }, - { - "x": 60.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 17.5, - "y": 137.5 - }, - { - "x": 17.5, - "y": 157.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 10.0, - "y": 162.5 - }, - { - "x": 10.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 12.5, - "y": 187.5 - }, - { - "x": 12.5, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 15.0, - "y": 212.5 - }, - { - "x": 15.0, - "y": 132.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B4" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 10.0, - "y": 237.5 - }, - { - "x": 10.0, - "y": 182.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SA" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#8" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SB" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "sel2_4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json deleted file mode 100644 index c16624c8..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json +++ /dev/null @@ -1,937 +0,0 @@ -{ - "width": 35.0, - "height": 150.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 105.0 - }, - "name": "B4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 115.0 - }, - "name": "C1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 125.0 - }, - "name": "C2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 135.0 - }, - "name": "C3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 145.0 - }, - "name": "C4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "SA", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "SB", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "SC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 50.0, - "y": 570.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 50.0, - "y": 620.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 50.0, - "y": 670.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 50.0, - "y": 720.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 152.5, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 152.5, - "y": 65.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 152.5, - "y": 115.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 152.5, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 29.0, - "y": 584.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 29.0, - "y": 634.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 29.0, - "y": 684.0 - }, - "params": 1 - }, - { - "id": "not4", - "name": "not4#0", - "pos": { - "x": 75.0, - "y": 250.0 - } - }, - { - "id": "sel2_4", - "name": "sel2_4#0", - "pos": { - "x": 35.0, - "y": 250.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SA" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "SA" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 25.0, - "y": 25.0 - }, - { - "x": 25.0, - "y": 255.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SB" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "SB" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 20.0, - "y": 75.0 - }, - { - "x": 20.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A1" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A3" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A4" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SC" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 30.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 30.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 30.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 15.0, - "y": 175.0 - }, - { - "x": 15.0, - "y": 275.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 30.0, - "y": 735.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C1" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C2" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C3" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C4" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 115.0, - "y": 255.0 - }, - { - "x": 115.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 120.0, - "y": 265.0 - }, - { - "x": 120.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 125.0, - "y": 275.0 - }, - { - "x": 125.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 130.0, - "y": 285.0 - }, - { - "x": 130.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 135.0, - "y": 580.0 - }, - { - "x": 135.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 225.0 - }, - { - "x": 10.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 140.0, - "y": 630.0 - }, - { - "x": 140.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 145.0, - "y": 680.0 - }, - { - "x": 145.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 150.0, - "y": 730.0 - }, - { - "x": 150.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 5.0, - "y": 275.0 - }, - { - "x": 5.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 5.0, - "y": 325.0 - }, - { - "x": 5.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 10.0, - "y": 375.0 - }, - { - "x": 10.0, - "y": 315.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 15.0, - "y": 425.0 - }, - { - "x": 15.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 475.0 - }, - { - "x": 20.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B4" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 25.0, - "y": 525.0 - }, - { - "x": 25.0, - "y": 345.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "sel3_4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json deleted file mode 100644 index 2eff80ef..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json +++ /dev/null @@ -1,285 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 7.5, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 35.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 35.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 62.5, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 29.0, - "y": 24.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#10" - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#11" - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 5.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4" - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 30.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 30.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 5.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 5.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "xor", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/plugin.xml b/net.mograsim.logic.model.am2900/plugin.xml deleted file mode 100644 index 7a324ad9..00000000 --- a/net.mograsim.logic.model.am2900/plugin.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java deleted file mode 100644 index 10cf1412..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.mograsim.logic.model.am2900; - -import java.util.concurrent.atomic.AtomicBoolean; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -import net.mograsim.logic.model.serializing.ClassLoaderBasedResourceLoader; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.machine.MachineLoader; - -public class Am2900Loader implements BundleActivator -{ - // TODO use dff16 in dff16_we & dff16_invwe - private static AtomicBoolean activated = new AtomicBoolean(false); - - @Override - public void start(BundleContext context) throws Exception - { - setup(); - } - - @Override - public void stop(BundleContext context) throws Exception - { - // nothing - } - - public static void setup() - { - if (activated.getAndSet(true)) - return; - ClassLoaderBasedResourceLoader resourceLoader = ClassLoaderBasedResourceLoader.create(Am2900Loader.class.getClassLoader()); - IndirectModelComponentCreator.registerResourceLoader(resourceLoader, "Am2900Loader"); - IndirectModelComponentCreator.loadStandardComponentIDs(Am2900Loader.class.getResourceAsStream("standardComponentIDMapping.json")); - MachineLoader.setup(); -// System.out.println("SETUP DONE"); // TODO: Debug - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java deleted file mode 100644 index 4450e07b..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import net.mograsim.logic.model.am2900.machine.Am2900Machine; -import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.machine.standard.memory.ModelWordAddressableMemory; - -public class ModelAm2900MainMemory extends ModelWordAddressableMemory -{ - public ModelAm2900MainMemory(LogicModelModifiable model, String name) - { - super(model, Am2900MachineDefinition.getInstance().getMainMemoryDefinition(), name); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Am2900MainMemory"; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new ModelAm2900MainMemoryAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MainMemory.class.getCanonicalName(), (m, p, n) -> - { - return new ModelAm2900MainMemory(m, n); - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java deleted file mode 100644 index e5e34ebb..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; -import net.mograsim.machine.standard.memory.CoreWordAddressableMemory; - -public class ModelAm2900MainMemoryAdapter implements ComponentAdapter -{ - - @Override - public Class getSupportedClass() - { - return ModelAm2900MainMemory.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MainMemory modelComponent, - Map logicWiresPerPin) - { - ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd(); - ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd(); - ReadEnd mode = logicWiresPerPin.get(modelComponent.getReadWritePin()).createReadOnlyEnd(); - CoreWordAddressableMemory mem = new CoreWordAddressableMemory(timeline, 2, modelComponent.getMachine().getMainMemory(), data, mode, - address); - modelComponent.setCoreModelBinding(mem); - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java deleted file mode 100644 index cfd54c52..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import net.mograsim.logic.model.am2900.machine.Am2900Machine; -import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.machine.mi.components.ModelMicroInstructionMemory; - -public class ModelAm2900MicroInstructionMemory extends ModelMicroInstructionMemory -{ - public ModelAm2900MicroInstructionMemory(LogicModelModifiable model, String name) - { - super(model, Am2900MachineDefinition.getInstance().getMicroInstructionMemoryDefinition(), name); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new ModelAm2900MicroInstructionMemoryAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MicroInstructionMemory.class.getCanonicalName(), (m, p, n) -> - { - return new ModelAm2900MicroInstructionMemory(m, n); - }); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Am2900MicroInstructionMemory"; - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java deleted file mode 100644 index 895c58a5..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; -import net.mograsim.machine.mi.components.CoreMicroInstructionMemory; - -public class ModelAm2900MicroInstructionMemoryAdapter implements ComponentAdapter -{ - - @Override - public Class getSupportedClass() - { - return ModelAm2900MicroInstructionMemory.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MicroInstructionMemory modelComponent, - Map logicWiresPerPin) - { - ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd(); - ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd(); - CoreMicroInstructionMemory mem = new CoreMicroInstructionMemory(timeline, 2, - modelComponent.getMachine().getMicroInstructionMemory(), data, address); - modelComponent.setCoreModelBinding(mem); - } - -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java deleted file mode 100644 index 14500d5c..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modeldff12 extends SimpleRectangularHardcodedModelComponent -{ - public Modeldff12(LogicModelModifiable model, String name) - { - super(model, "dff12", name, "D flip flop\n12 bits", false); - setSize(40, 20); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 20), Position.TOP); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 10), Position.RIGHT); - addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] QC = (Bit[]) lastState; - if (QC == null) - { - QC = new Bit[13]; - Arrays.fill(QC, U); - } - - Bit CVal = readEnds.get("C").getValue(); - - if (QC[12] == ZERO && CVal == ONE) - System.arraycopy(readEnds.get("D").getValues().getBits(), 0, QC, 0, 12); - - readWriteEnds.get("Y").feedSignals(Arrays.copyOfRange(QC, 0, 12)); - QC[12] = CVal; - - return QC; - } - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - switch (stateID) - { - case "q": - return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12)); - default: - return super.getHighLevelState(state, stateID); - } - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - switch (stateID) - { - case "q": - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 12) - throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); - System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12); - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modeldff12.class.getCanonicalName(), (m, p, n) -> new Modeldff12(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java deleted file mode 100644 index a3e7047e..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java +++ /dev/null @@ -1,110 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modeldff4_finewe extends SimpleRectangularHardcodedModelComponent -{ - public Modeldff4_finewe(LogicModelModifiable model, String name) - { - super(model, "dff4_finewe", name, "D flip flop\n4 bits", false); - setSize(35, 90); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "_WE1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); - addPin(new Pin(model, this, "_WE2", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); - addPin(new Pin(model, this, "_WE3", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); - addPin(new Pin(model, this, "_WE4", 1, PinUsage.INPUT, 0, 45), Position.RIGHT); - addPin(new Pin(model, this, "D1", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); - addPin(new Pin(model, this, "D2", 1, PinUsage.INPUT, 0, 65), Position.RIGHT); - addPin(new Pin(model, this, "D3", 1, PinUsage.INPUT, 0, 75), Position.RIGHT); - addPin(new Pin(model, this, "D4", 1, PinUsage.INPUT, 0, 85), Position.RIGHT); - addPin(new Pin(model, this, "Q1", 1, PinUsage.OUTPUT, 35, 5), Position.LEFT); - addPin(new Pin(model, this, "Q2", 1, PinUsage.OUTPUT, 35, 15), Position.LEFT); - addPin(new Pin(model, this, "Q3", 1, PinUsage.OUTPUT, 35, 25), Position.LEFT); - addPin(new Pin(model, this, "Q4", 1, PinUsage.OUTPUT, 35, 35), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] QC = (Bit[]) lastState; - if (QC == null) - QC = new Bit[] { U, U, U, U, U }; - - Bit CVal = readEnds.get("C").getValue(); - - if (QC[0] == ZERO && CVal == ONE) - for (int i = 1; i < 5; i++) - { - Bit WEiVal = readEnds.get("_WE" + i).getValue(); - if (WEiVal == X || WEiVal == Z) - QC[i] = X; - else if (WEiVal == U) - QC[i] = U; - else if (WEiVal == ZERO) - QC[i] = readEnds.get("D" + i).getValue(); - } - - QC[0] = CVal; - - readWriteEnds.get("Q1").feedSignals(QC[1]); - readWriteEnds.get("Q2").feedSignals(QC[2]); - readWriteEnds.get("Q3").feedSignals(QC[3]); - readWriteEnds.get("Q4").feedSignals(QC[4]); - - return QC; - } - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - switch (stateID) - { - case "q": - return BitVector.of(Arrays.copyOfRange((Bit[]) state, 1, 5)); - default: - return super.getHighLevelState(state, stateID); - } - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - switch (stateID) - { - case "q": - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 4) - throw new IllegalArgumentException("Expected BitVector of length 4, not " + newHighLevelStateCasted.length()); - System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 1, 4); - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modeldff4_finewe.class.getCanonicalName(), - (m, p, n) -> new Modeldff4_finewe(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java deleted file mode 100644 index 981c8488..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modelinc extends SimpleRectangularHardcodedModelComponent -{ - private final int logicWidth; - - public Modelinc(LogicModelModifiable model, String name, int logicWidth) - { - super(model, "inc", name, "Incrementer", false); - this.logicWidth = logicWidth; - setSize(40, 20); - addPin(new Pin(model, this, "A", logicWidth, PinUsage.INPUT, 20, 20), Position.TOP); - addPin(new Pin(model, this, "CI", 1, PinUsage.INPUT, 40, 10), Position.LEFT); - addPin(new Pin(model, this, "Y", logicWidth, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] ABits = readEnds.get("A").getValues().getBits(); - Bit CIVal = readEnds.get("CI").getValue(); - Bit[] YBits = new Bit[logicWidth]; - if (CIVal == X) - Arrays.fill(YBits, X); - else if (CIVal == U) - Arrays.fill(YBits, U); - else if (CIVal == Z) - Arrays.fill(YBits, X); - else if (CIVal == ZERO) - YBits = ABits; - else - { - Bit carry = Bit.ONE; - // TODO extract to helper. This code almost also exists in ModelAm2910RegCntr. - for (int i = logicWidth - 1; i >= 0; i--) - { - Bit a = ABits[i]; - YBits[i] = a.xor(carry); - carry = a.and(carry); - } - } - readWriteEnds.get("Y").feedSignals(YBits); - return null; - } - - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modelinc.class.getCanonicalName(), - (m, p, n) -> new Modelinc(m, n, p.getAsInt())); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java deleted file mode 100644 index 4304d4a2..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modelnor12 extends SimpleRectangularHardcodedModelComponent -{ - public Modelnor12(LogicModelModifiable model, String name) - { - super(model, "nor12", name, "=0", false); - setSize(35, 20); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 0, 10), Position.RIGHT); - addPin(new Pin(model, this, "Y", 1, PinUsage.OUTPUT, 35, 10), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - readWriteEnds.get("Y").feedSignals(getResult(readEnds.get("D").getValues().getBits())); - return null; - } - - private static Bit getResult(Bit[] DValArr) - { - for (int i = 0; i < 12; i++) - if (DValArr[i] == X) - return X; - for (int i = 0; i < 12; i++) - if (DValArr[i] == U) - return U; - for (int i = 0; i < 12; i++) - if (DValArr[i] == ONE) - return ZERO; - for (int i = 0; i < 12; i++) - if (DValArr[i] == Z) - return X; - return ONE; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modelnor12.class.getCanonicalName(), (m, p, n) -> new Modelnor12(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java deleted file mode 100644 index 53c9960d..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modelram5_12 extends SimpleRectangularHardcodedModelComponent -{ - public Modelram5_12(LogicModelModifiable model, String name) - { - super(model, "ram5_12", name, "RAM\n5 x 12 Bit", false); - setSize(40, 40); - addPin(new Pin(model, this, "A", 3, PinUsage.INPUT, 10, 0), Position.BOTTOM); - addPin(new Pin(model, this, "B", 3, PinUsage.INPUT, 30, 0), Position.BOTTOM); - addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); - addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 0, 30), Position.RIGHT); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 40), Position.TOP); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - BitVector[] memC = (BitVector[]) lastState; - if (memC == null) - { - memC = new BitVector[6]; - Arrays.fill(memC, 0, 5, BitVector.of(U, 12)); - memC[5] = BitVector.of(U); - } - BitVector CVal = readEnds.get("C").getValues(); - BitVector oldC = memC[5]; - // TODO is the timing right? - if (oldC.getLSBit(0) == ZERO && CVal.getLSBit(0) == ONE && readEnds.get("WE").getValue() == ONE) - { - int BInt = getAsInt(readEnds.get("B").getValues()); - if (BInt == -1 || BInt > 4) - Arrays.fill(memC, BitVector.of(X, 12)); - else if (BInt == -2) - Arrays.fill(memC, BitVector.of(U, 12)); - else - memC[BInt] = readEnds.get("D").getValues(); - } - int AInt = getAsInt(readEnds.get("A").getValues()); - BitVector YVal = AInt == -1 || AInt > 4 ? BitVector.of(X, 12) : AInt == -2 ? BitVector.of(U, 12) : memC[AInt]; - readWriteEnds.get("Y").feedSignals(YVal); - memC[5] = CVal; - return memC; - } - - /** - * -1 means X, -2 means U - */ - private static int getAsInt(BitVector vect) - { - Bit[] bits = vect.getBits(); - for (int i = 0; i < 3; i++) - if (bits[i] == X) - return -1; - for (int i = 0; i < 3; i++) - if (bits[i] == U) - return -2; - for (int i = 0; i < 3; i++) - if (bits[i] == Z) - return -1; - return (bits[0] == ONE ? 4 : 0) + (bits[1] == ONE ? 2 : 0) + (bits[2] == ONE ? 1 : 0); - } - - Pattern stateIDPattern = Pattern.compile("c(0[10][10]|100)"); - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - Matcher m = stateIDPattern.matcher(stateID); - if (m.matches()) - return ((BitVector[]) state)[Integer.parseInt(m.group(1), 2)]; - return super.getHighLevelState(state, stateID); - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - Matcher m = stateIDPattern.matcher(stateID); - if (m.matches()) - { - int addr = Integer.parseInt(m.group(1), 2); - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 12) - throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); - BitVector[] memC = (BitVector[]) lastState; - memC[addr] = newHighLevelStateCasted; - return memC; - } - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modelram5_12.class.getCanonicalName(), (m, p, n) -> new Modelram5_12(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java deleted file mode 100644 index 7cce14a3..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modelsel4_12 extends SimpleRectangularHardcodedModelComponent -{ - public Modelsel4_12(LogicModelModifiable model, String name) - { - super(model, "sel4_12", name, "4-way SEL\n12 bit", false); - setSize(80, 40); - addPin(new Pin(model, this, "SA", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "SB", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); - addPin(new Pin(model, this, "SC", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); - addPin(new Pin(model, this, "SD", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); - addPin(new Pin(model, this, "A", 12, PinUsage.INPUT, 10, 0), Position.BOTTOM); - addPin(new Pin(model, this, "B", 12, PinUsage.INPUT, 30, 0), Position.BOTTOM); - addPin(new Pin(model, this, "C", 12, PinUsage.INPUT, 50, 0), Position.BOTTOM); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 70, 0), Position.BOTTOM); - addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 40, 40), Position.TOP); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit SAVal = readEnds.get("SA").getValue(); - Bit SBVal = readEnds.get("SB").getValue(); - Bit SCVal = readEnds.get("SC").getValue(); - Bit SDVal = readEnds.get("SD").getValue(); - BitVector YVal; - if (SAVal == X || SBVal == X || SCVal == X || SDVal == X) - YVal = BitVector.of(X, 12); - else if (SAVal == U || SBVal == U || SCVal == U || SDVal == U) - YVal = BitVector.of(U, 12); - else if (SAVal == Z || SBVal == Z || SCVal == Z || SDVal == Z) - YVal = BitVector.of(X, 12); - else - { - YVal = null; - if (SAVal == ONE) - YVal = readEnds.get("A").getValues(); - if (SBVal == ONE) - if (YVal != null) - YVal = BitVector.of(X, 12); - else - YVal = readEnds.get("B").getValues(); - if (SCVal == ONE) - if (YVal != null) - YVal = BitVector.of(X, 12); - else - YVal = readEnds.get("C").getValues(); - if (SDVal == ONE) - if (YVal != null) - YVal = BitVector.of(X, 12); - else - YVal = readEnds.get("D").getValues(); - if (YVal == null) - YVal = BitVector.of(ZERO, 12); - } - - readWriteEnds.get("Y").feedSignals(YVal); - return null; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modelsel4_12.class.getCanonicalName(), (m, p, n) -> new Modelsel4_12(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java deleted file mode 100644 index 880d17c9..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java +++ /dev/null @@ -1,286 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2904; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2904RegCTInstrDecode extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2904RegCTInstrDecode(LogicModelModifiable model, String name) - { - super(model, "Am2904RegCTInstrDecode", name, "Instruction\ndecode", false); - setSize(80, 80); - addPin(new Pin(model, this, "I12-11", 2, PinUsage.INPUT, 0, 30), Position.RIGHT); - addPin(new Pin(model, this, "I5-0", 6, PinUsage.INPUT, 0, 50), Position.RIGHT); - // muSR MUX: - // 00: 0 - // 01: 1 - // 10: M - // 11: I - addPin(new Pin(model, this, "muSR_MUX", 2, PinUsage.OUTPUT, 80, 10), Position.LEFT); - addPin(new Pin(model, this, "muSR_OVRRET", 1, PinUsage.OUTPUT, 80, 20), Position.LEFT); - addPin(new Pin(model, this, "muSR_CINV", 1, PinUsage.OUTPUT, 80, 30), Position.LEFT); - addPin(new Pin(model, this, "muSR_WEZ", 1, PinUsage.OUTPUT, 80, 40), Position.LEFT); - addPin(new Pin(model, this, "muSR_WEC", 1, PinUsage.OUTPUT, 80, 50), Position.LEFT); - addPin(new Pin(model, this, "muSR_WEN", 1, PinUsage.OUTPUT, 80, 60), Position.LEFT); - addPin(new Pin(model, this, "muSR_WEOVR", 1, PinUsage.OUTPUT, 80, 70), Position.LEFT); - // MSR MUX: - // 000: 0 - // 001: 1 - // 010: mu - // 011: Y - // 100: I - // 101: I, invert C - // 110: Swap OVR and C - // 111: _M - addPin(new Pin(model, this, "MSR_MUX", 3, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); - addPin(new Pin(model, this, "OEN", 1, PinUsage.OUTPUT, 60, 0), Position.BOTTOM); - // Y MUX: - // 00: mu - // 01: mu - // 10: M - // 11: I - addPin(new Pin(model, this, "Y_MUX", 2, PinUsage.OUTPUT, 10, 80), Position.TOP); - // CT MUX: - // see Am2900 Family Data Book, Am2904, Table 4 (CT_MUX2-0 = I3-1) - addPin(new Pin(model, this, "CT_MUX", 3, PinUsage.OUTPUT, 30, 80), Position.TOP); - addPin(new Pin(model, this, "CT_INV", 1, PinUsage.OUTPUT, 40, 80), Position.TOP); - addPin(new Pin(model, this, "CT_EXP", 1, PinUsage.OUTPUT, 50, 80), Position.TOP); - // C0 MUX: - // 00xx: 0 - // 01xx: 1 - // 10xx: CX - // 1100: muC - // 1101: _muC - // 1110: MC - // 1111: _MC - addPin(new Pin(model, this, "C0_MUX", 4, PinUsage.OUTPUT, 70, 80), Position.TOP); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] I5_0Bits = readEnds.get("I5-0").getValues().getBits(); - Bit[] I12_11Bits = readEnds.get("I12-11").getValues().getBits(); - int IAsInt = 0; - for (int i = 0; i < 6; i++) - switch (I5_0Bits[5 - i]) - { - case ONE: - IAsInt |= 1 << i; - break; - case U: - for (ReadWriteEnd e : readWriteEnds.values()) - e.feedSignals(BitVector.of(U, e.width())); - return null; - case X: - case Z: - for (ReadWriteEnd e : readWriteEnds.values()) - e.feedSignals(BitVector.of(X, e.width())); - return null; - case ZERO: - break; - default: - throw new IllegalArgumentException("Unknown enum constant: " + I5_0Bits[i]); - } - switch (IAsInt) - { - case 0: - case 2: - readWriteEnds.get("muSR_MUX").feedSignals(ONE, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 1: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 3: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 6: - case 7: - readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ONE); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 8: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 9: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 10: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 11: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 12: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 13: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 14: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 15: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 24: - case 25: - case 40: - case 41: - case 56: - case 57: - readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ONE); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - default: - readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - } - switch (IAsInt) - { - case 0: - readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ONE, ONE); - break; - case 1: - readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 2: - readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ONE, ZERO); - break; - case 3: - readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 4: - readWriteEnds.get("MSR_MUX").feedSignals(ONE, ONE, ZERO); - break; - case 5: - readWriteEnds.get("MSR_MUX").feedSignals(ONE, ONE, ONE); - break; - case 8: - case 9: - case 24: - case 25: - case 40: - case 41: - case 56: - case 57: - readWriteEnds.get("MSR_MUX").feedSignals(ONE, ZERO, ONE); - break; - default: - readWriteEnds.get("MSR_MUX").feedSignals(ONE, ZERO, ZERO); - break; - } - readWriteEnds.get("OEN").feedSignals(I5_0Bits[0].or(I5_0Bits[1]).or(I5_0Bits[2]).or(I5_0Bits[3]).or(I5_0Bits[4]).or(I5_0Bits[5])); - readWriteEnds.get("Y_MUX").feedSignals(I5_0Bits[0], I5_0Bits[1]); - readWriteEnds.get("CT_INV").feedSignals(I5_0Bits[5]); - readWriteEnds.get("CT_MUX").feedSignals(I5_0Bits[2], I5_0Bits[3], I5_0Bits[4]); - readWriteEnds.get("CT_EXP").feedSignals((IAsInt & 0b111110) == 0b001110 ? ONE : ZERO); - readWriteEnds.get("C0_MUX").feedSignals(I12_11Bits[0], I12_11Bits[1], I5_0Bits[0], - I5_0Bits[2].and(I5_0Bits[3].not()).and(I5_0Bits[4].not())); - return null; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2904RegCTInstrDecode.class.getCanonicalName(), - (m, p, n) -> new ModelAm2904RegCTInstrDecode(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java deleted file mode 100644 index 3e97cc6c..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java +++ /dev/null @@ -1,323 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2904; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2904ShiftInstrDecode extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2904ShiftInstrDecode(LogicModelModifiable model, String name) - { - super(model, "Am2904ShiftInstrDecode", name, "Shift \ninstruction\ndecode", false); - setSize(60, 80); - addPin(new Pin(model, this, "I", 5, PinUsage.INPUT, 0, 25), Position.RIGHT); - addPin(new Pin(model, this, "_SE", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); - // SIO0 MUX: - // 000: 0 - // 001: 1 - // 01x: SIOn - // 10x: QIOn - // 11x: MC - addPin(new Pin(model, this, "SIO0_MUX", 3, PinUsage.OUTPUT, 60, 5), Position.LEFT); - // SIOn MUX: - // 000: 0 - // 001: 1 - // 010: SIO0 - // 011: QIO0 - // 100: MC - // 101: MN - // 110: IC - // 111: IN xor IVOR - addPin(new Pin(model, this, "SIOn_MUX", 3, PinUsage.OUTPUT, 60, 15), Position.LEFT); - // QIO0 MUX: - // 000: 0 - // 001: 1 - // 01x: SIOn - // 10x: QIOn - // 11x: MC - addPin(new Pin(model, this, "QIO0_MUX", 3, PinUsage.OUTPUT, 60, 25), Position.LEFT); - // QIOn MUX: - // 000: 0 - // 001: 1 - // 01x: SIO0 - // 10x: QIO0 - // 11x: MN - addPin(new Pin(model, this, "QIOn_MUX", 3, PinUsage.OUTPUT, 60, 35), Position.LEFT); - addPin(new Pin(model, this, "OEn", 1, PinUsage.OUTPUT, 60, 45), Position.LEFT); - addPin(new Pin(model, this, "OE0", 1, PinUsage.OUTPUT, 60, 55), Position.LEFT); - // 00: SIO0 - // 01: QIO0 - // 1x: SIOn - addPin(new Pin(model, this, "MC_MUX", 2, PinUsage.OUTPUT, 60, 65), Position.LEFT); - addPin(new Pin(model, this, "MC_EN", 1, PinUsage.OUTPUT, 60, 75), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit _SE = readEnds.get("_SE").getValue(); - BitVector I = readEnds.get("I").getValues(); - readWriteEnds.get("OEn").feedSignals(I.getMSBit(0).not().and(_SE.not())); - readWriteEnds.get("OE0").feedSignals(I.getMSBit(0).and(_SE.not())); - if (_SE == Z || _SE == X) - { - readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("MC_MUX").feedSignals(X, X); - readWriteEnds.get("MC_EN").feedSignals(X); - return null; - } else if (_SE == U) - { - - readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U); - readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U); - readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U); - readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U); - readWriteEnds.get("MC_MUX").feedSignals(U, U); - readWriteEnds.get("MC_EN").feedSignals(U); - return null; - } else if (_SE == ONE) - { - readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("MC_MUX").feedSignals(X, X); - readWriteEnds.get("MC_EN").feedSignals(ZERO); - return null; - } - if (!I.isBinary()) - { - Bit val = null; - for (Bit b : I.getBits()) - if (!b.isBinary()) - { - val = b; - break; - } - readWriteEnds.get("SIO0_MUX").feedSignals(val, val, val); - readWriteEnds.get("SIOn_MUX").feedSignals(val, val, val); - readWriteEnds.get("QIO0_MUX").feedSignals(val, val, val); - readWriteEnds.get("QIOn_MUX").feedSignals(val, val, val); - readWriteEnds.get("MC_MUX").feedSignals(val, val); - readWriteEnds.get("MC_EN").feedSignals(val); - return null; - } - int IAsInt = I.getUnsignedValue().intValue(); - if (IAsInt < 16) - { - readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); - switch (IAsInt) - { - case 0: - case 2: - case 6: - case 7: - readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 1: - case 3: - readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 4: - case 9: - case 12: - readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ZERO); - break; - case 5: - readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ONE); - break; - case 8: - case 10: - readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ZERO); - break; - case 11: - readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ZERO); - break; - case 13: - case 15: - readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ONE); - break; - case 14: - readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ONE); - break; - default: - throw new IllegalStateException("can't happen"); - } - switch (IAsInt) - { - case 0: - readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 1: - readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 2: - readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ONE, X); - break; - case 3: - case 4: - case 5: - case 6: - case 7: - case 11: - case 12: - case 13: - case 14: - case 15: - readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ONE, X); - break; - case 8: - case 9: - case 10: - readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ZERO, X); - break; - default: - throw new IllegalStateException("can't happen"); - } - } else - { - readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); - switch (IAsInt) - { - case 16: - case 18: - readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 17: - case 19: - readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 20: - case 21: - case 22: - case 23: - case 28: - case 29: - case 30: - case 31: - readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X); - break; - case 24: - case 26: - readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X); - break; - case 25: - case 27: - readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ONE, X); - break; - default: - throw new IllegalStateException("can't happen"); - } - switch (IAsInt) - { - case 16: - case 18: - case 20: - case 22: - case 27: - readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 17: - case 19: - case 21: - case 23: - readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 24: - case 25: - case 26: - readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X); - break; - case 28: - case 30: - readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X); - break; - case 29: - case 31: - readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ONE, X); - break; - default: - throw new IllegalStateException("can't happen"); - } - } - // MC - switch (IAsInt) - { - case 0: - case 1: - case 3: - case 4: - case 5: - case 6: - case 10: - case 11: - case 14: - case 15: - case 18: - case 19: - case 22: - case 23: - case 26: - case 27: - case 30: - case 31: - readWriteEnds.get("MC_EN").feedSignals(ZERO); - readWriteEnds.get("MC_MUX").feedSignals(X, X); - break; - case 2: - case 8: - case 9: - readWriteEnds.get("MC_EN").feedSignals(ONE); - readWriteEnds.get("MC_MUX").feedSignals(ZERO, ZERO); - break; - case 7: - case 12: - case 13: - readWriteEnds.get("MC_EN").feedSignals(ONE); - readWriteEnds.get("MC_MUX").feedSignals(ZERO, ONE); - break; - case 16: - case 17: - case 20: - case 21: - case 24: - case 25: - case 28: - case 29: - readWriteEnds.get("MC_EN").feedSignals(ONE); - readWriteEnds.get("MC_MUX").feedSignals(ONE, X); - break; - default: - throw new IllegalStateException("can't happen"); - } - return null; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2904ShiftInstrDecode.class.getCanonicalName(), - (m, p, n) -> new ModelAm2904ShiftInstrDecode(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java deleted file mode 100644 index a96b6795..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java +++ /dev/null @@ -1,267 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2910; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2910InstrPLA extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2910InstrPLA(LogicModelModifiable model, String name) - { - super(model, "Am2910InstrPLA", name, "Instr.\nPLA", false); - setSize(30, 85); - addPin(new Pin(model, this, "PASS", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "I", 4, PinUsage.INPUT, 0, 20), Position.RIGHT); - addPin(new Pin(model, this, "R=0", 1, PinUsage.INPUT, 15, 0), Position.BOTTOM); - addPin(new Pin(model, this, "_PL", 1, PinUsage.OUTPUT, 5, 85), Position.TOP); - addPin(new Pin(model, this, "_MAP", 1, PinUsage.OUTPUT, 15, 85), Position.TOP); - addPin(new Pin(model, this, "_VECT", 1, PinUsage.OUTPUT, 25, 85), Position.TOP); - addPin(new Pin(model, this, "RWE", 1, PinUsage.OUTPUT, 30, 5), Position.LEFT); - addPin(new Pin(model, this, "RDEC", 1, PinUsage.OUTPUT, 30, 15), Position.LEFT); - addPin(new Pin(model, this, "YD", 1, PinUsage.OUTPUT, 30, 25), Position.LEFT); - addPin(new Pin(model, this, "YR", 1, PinUsage.OUTPUT, 30, 35), Position.LEFT); - addPin(new Pin(model, this, "YF", 1, PinUsage.OUTPUT, 30, 45), Position.LEFT); - addPin(new Pin(model, this, "YmuPC", 1, PinUsage.OUTPUT, 30, 55), Position.LEFT); - addPin(new Pin(model, this, "STKI0", 1, PinUsage.OUTPUT, 30, 65), Position.LEFT); - addPin(new Pin(model, this, "STKI1", 1, PinUsage.OUTPUT, 30, 75), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - ReadEnd PASS = readEnds.get("PASS"); - ReadEnd I = readEnds.get("I"); - ReadEnd Req0 = readEnds.get("R=0"); - ReadWriteEnd _PL = readWriteEnds.get("_PL"); - ReadWriteEnd _MAP = readWriteEnds.get("_MAP"); - ReadWriteEnd _VECT = readWriteEnds.get("_VECT"); - ReadWriteEnd RWE = readWriteEnds.get("RWE"); - ReadWriteEnd RDEC = readWriteEnds.get("RDEC"); - ReadWriteEnd YD = readWriteEnds.get("YD"); - ReadWriteEnd YR = readWriteEnds.get("YR"); - ReadWriteEnd YF = readWriteEnds.get("YF"); - ReadWriteEnd YmuPC = readWriteEnds.get("YmuPC"); - ReadWriteEnd STKI0 = readWriteEnds.get("STKI0"); - ReadWriteEnd STKI1 = readWriteEnds.get("STKI1"); - - Bit PASSVal = PASS.getValue(); - Bit I3Val = I.getValue(3); - Bit I2Val = I.getValue(2); - Bit I1Val = I.getValue(1); - Bit I0Val = I.getValue(0); - Bit Req0Val = Req0.getValue(); - - if (!I3Val.isBinary() || !I2Val.isBinary() || !I1Val.isBinary() || !I0Val.isBinary()) - if ((I3Val == U || I3Val.isBinary()) || (I2Val == U || I2Val.isBinary()) || (I1Val == U || I1Val.isBinary()) - || (I0Val == U || I0Val.isBinary())) - { - _PL.feedSignals(U); - _MAP.feedSignals(U); - _VECT.feedSignals(U); - RWE.feedSignals(U); - RDEC.feedSignals(U); - YD.feedSignals(U); - YR.feedSignals(U); - YF.feedSignals(U); - YmuPC.feedSignals(U); - STKI0.feedSignals(U); - STKI1.feedSignals(U); - } else - { - _PL.feedSignals(X); - _MAP.feedSignals(X); - _VECT.feedSignals(X); - RWE.feedSignals(X); - RDEC.feedSignals(X); - YD.feedSignals(X); - YR.feedSignals(X); - YF.feedSignals(X); - YmuPC.feedSignals(X); - STKI0.feedSignals(X); - STKI1.feedSignals(X); - } - else - { - int IAsInt = (I3Val == ONE ? 8 : 0) + (I2Val == ONE ? 4 : 0) + (I1Val == ONE ? 2 : 0) + (I0Val == ONE ? 1 : 0); - Bit _PLVal = ONE; - Bit _MAPVal = ONE; - Bit _VECTVal = ONE; - if (IAsInt == 2) - _MAPVal = ZERO; - else if (IAsInt == 6) - _VECTVal = ZERO; - else - _PLVal = ZERO; - _PL.feedSignals(_PLVal); - _MAP.feedSignals(_MAPVal); - _VECT.feedSignals(_VECTVal); - if (IAsInt == 8 || IAsInt == 9 || IAsInt == 15) - { - RWE.feedSignals(Req0Val); - RDEC.feedSignals(Req0Val);// "forward" X/U/Z - } else if (IAsInt == 4) - { - RWE.feedSignals(PASSVal); - RDEC.feedSignals(PASSVal == ONE ? ZERO : PASSVal);// "forward" X/U/Z - } else - { - RWE.feedSignals(ZERO); - RDEC.feedSignals(ZERO); - } - if (!PASSVal.isBinary()) - { - YD.feedSignals(PASSVal);// "forward" X/U/Z - YR.feedSignals(PASSVal);// "forward" X/U/Z - YF.feedSignals(PASSVal);// "forward" X/U/Z - YmuPC.feedSignals(PASSVal);// "forward" X/U/Z - } else - { - Bit YDVal = ZERO; - Bit YRVal = ZERO; - Bit YFVal = ZERO; - Bit YmuPCVal = ZERO; - switch (IAsInt + (PASSVal == ONE ? 16 : 0)) - { - case 0: - case 0 + 16: - break; - case 2: - case 1 + 16: - case 2 + 16: - case 3 + 16: - case 5 + 16: - case 6 + 16: - case 7 + 16: - case 11 + 16: - YDVal = ONE; - break; - case 5: - case 7: - YRVal = ONE; - break; - case 13: - case 10 + 16: - YFVal = ONE; - break; - case 1: - case 3: - case 4: - case 6: - case 10: - case 11: - case 12: - case 14: - case 4 + 16: - case 12 + 16: - case 13 + 16: - case 14 + 16: - case 15 + 16: - YmuPCVal = ONE; - break; - case 8: - case 8 + 16: - YFVal = Req0Val.not();// "forward" X/U/Z - YmuPCVal = Req0Val;// "forward" X/U/Z - break; - case 9: - case 9 + 16: - YDVal = Req0Val.not();// "forward" X/U/Z - YmuPCVal = Req0Val;// "forward" X/U/Z - break; - case 15: - YFVal = Req0Val.not();// "forward" X/U/Z - YDVal = Req0Val;// "forward" X/U/Z - break; - default: - throw new IllegalStateException("shouldn't happen"); - } - YD.feedSignals(YDVal); - YR.feedSignals(YRVal); - YF.feedSignals(YFVal); - YmuPC.feedSignals(YmuPCVal); - Bit STKI0Val; - Bit STKI1Val; - switch (IAsInt + (PASSVal == ONE ? 16 : 0)) - { - case 1: - case 2: - case 3: - case 6: - case 7: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 2 + 16: - case 3 + 16: - case 6 + 16: - case 7 + 16: - case 9 + 16: - case 12 + 16: - case 14 + 16: - // HOLD - STKI1Val = ZERO; - STKI0Val = ZERO; - break; - case 4: - case 5: - case 1 + 16: - case 4 + 16: - case 5 + 16: - // PUSH - STKI1Val = ZERO; - STKI0Val = ONE; - break; - case 0: - case 0 + 16: - // CLEAR - STKI1Val = ONE; - STKI0Val = ZERO; - break; - case 10 + 16: - case 11 + 16: - case 13 + 16: - case 15 + 16: - // POP - STKI1Val = ONE; - STKI0Val = ONE; - break; - case 8: - case 15: - case 8 + 16: - STKI1Val = Req0Val;// "forward" X/U/Z - STKI0Val = Req0Val;// "forward" X/U/Z - break; - default: - throw new IllegalStateException("shouldn't happen"); - } - STKI0.feedSignals(STKI0Val); - STKI1.feedSignals(STKI1Val); - } - } - return null; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2910InstrPLA.class.getCanonicalName(), - (m, p, n) -> new ModelAm2910InstrPLA(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java deleted file mode 100644 index 0c101bb4..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2910; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2910RegCntr extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2910RegCntr(LogicModelModifiable model, String name) - { - super(model, "Am2910RegCntr", name, "Register/\nCounter", false); - setSize(40, 40); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 0), Position.BOTTOM); - addPin(new Pin(model, this, "_RLD", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 20), Position.RIGHT); - addPin(new Pin(model, this, "DEC", 1, PinUsage.INPUT, 0, 30), Position.RIGHT); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 40, 20), Position.LEFT); - addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 40), Position.TOP); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] QC = (Bit[]) lastState; - if (QC == null) - { - QC = new Bit[13]; - Arrays.fill(QC, U); - } - - ReadEnd D = readEnds.get("D"); - ReadEnd _RLD = readEnds.get("_RLD"); - ReadEnd WE = readEnds.get("WE"); - ReadEnd DEC = readEnds.get("DEC"); - ReadEnd C = readEnds.get("C"); - ReadWriteEnd Y = readWriteEnds.get("Y"); - - Bit oldCVal = QC[12]; - Bit CVal = C.getValue(); - - // TODO handle U/X/Z - if (oldCVal == ZERO && CVal == ONE) - { - if ((DEC.getValue() == ZERO && WE.getValue() == ONE) || _RLD.getValue() == ZERO) - System.arraycopy(D.getValues().getBits(), 0, QC, 0, 12); - else if (WE.getValue() == ONE) - { - Bit carry = Bit.ZERO; - // TODO extract to helper. This code almost also exists in Modelinc. - for (int i = 11; i >= 0; i--) - { - Bit a = QC[i]; - QC[i] = a.xnor(carry); - carry = a.or(carry); - } - } - } - QC[12] = CVal; - Y.feedSignals(Arrays.copyOfRange(QC, 0, 12)); - - return QC; - } - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - switch (stateID) - { - case "q": - return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12)); - default: - return super.getHighLevelState(state, stateID); - } - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - switch (stateID) - { - case "q": - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 12) - throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); - System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12); - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2910RegCntr.class.getCanonicalName(), - (m, p, n) -> new ModelAm2910RegCntr(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java deleted file mode 100644 index a99fe0d5..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java +++ /dev/null @@ -1,134 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2910; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2910SP extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2910SP(LogicModelModifiable model, String name) - { - super(model, "Am2910SP", name, "Stack\npointer", false); - setSize(40, 30); - addPin(new Pin(model, this, "STKI0", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "STKI1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); - addPin(new Pin(model, this, "A", 3, PinUsage.OUTPUT, 10, 30), Position.TOP); - addPin(new Pin(model, this, "B", 3, PinUsage.OUTPUT, 30, 30), Position.TOP); - addPin(new Pin(model, this, "_FULL", 1, PinUsage.OUTPUT, 40, 15), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - BitAndInt SPC = (BitAndInt) lastState; - if (SPC == null) - { - SPC = new BitAndInt(); - SPC.bit = U; - SPC.i = -2; - } - int SP = SPC.i; - - Bit STKI0Val = readEnds.get("STKI0").getValue(); - Bit STKI1Val = readEnds.get("STKI1").getValue(); - Bit CVal = readEnds.get("C").getValue(); - if (SPC.bit == ZERO && CVal == ONE) - if (STKI0Val == U && STKI1Val == U) - SP = -2; - else if (!STKI0Val.isBinary() || !STKI1Val.isBinary()) - SP = -1; - else if (STKI0Val == ONE && STKI1Val == ZERO) - { - // PUSH - if (SP >= 0) - SP = SP == 5 ? 5 : SP + 1; - } else if (STKI0Val == ZERO && STKI1Val == ONE) - // CLEAR - SP = 0; - else if (STKI0Val == ONE && STKI1Val == ONE) - // POP - SP = SP <= 0 ? SP : SP - 1; - readWriteEnds.get("A").feedSignals(getAsBitVector(SP == 0 ? 7 : SP < 0 ? SP : SP - 1)); - readWriteEnds.get("B").feedSignals(getAsBitVector(SP == 5 ? 4 : SP)); - readWriteEnds.get("_FULL").feedSignals(SP == -2 ? U : SP == -1 ? X : SP == 5 ? ZERO : ONE); - - SPC.i = SP; - SPC.bit = CVal; - return SPC; - } - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - switch (stateID) - { - case "q": - return getAsBitVector(((BitAndInt) state).i); - default: - return super.getHighLevelState(state, stateID); - } - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - switch (stateID) - { - case "q": - int i; - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 3) - throw new IllegalArgumentException("Expected BitVector of length 3, not " + newHighLevelStateCasted.length()); - if (newHighLevelStateCasted.isBinary()) - i = newHighLevelStateCasted.getUnsignedValue().intValue(); - else - i = -1;// this makes setting to U impossible - if (i > 5) - throw new IllegalArgumentException("Given value not in range (0-5 incl.): " + i); - ((BitAndInt) lastState).i = i; - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - } - - private static class BitAndInt - { - Bit bit; - int i; - } - - /** - * -1 means X, -2 means U - */ - private static BitVector getAsBitVector(int i) - { - if (i == -1) - return BitVector.of(X, 3); - if (i == -2) - return BitVector.of(U, 3); - return BitVector.of((i & 0b100) > 0 ? ONE : ZERO, (i & 0b10) > 0 ? ONE : ZERO, (i & 0b1) > 0 ? ONE : ZERO); - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2910SP.class.getCanonicalName(), (m, p, n) -> new ModelAm2910SP(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java deleted file mode 100644 index 0a0787cc..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java +++ /dev/null @@ -1,104 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import net.mograsim.logic.core.components.CoreClock; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory; -import net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.machine.Machine; -import net.mograsim.machine.MachineDefinition; -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.Register; -import net.mograsim.machine.mi.MicroInstructionMemory; -import net.mograsim.machine.mi.StandardMicroInstructionMemory; -import net.mograsim.machine.standard.memory.WordAddressableMemory; - -public class Am2900Machine implements Machine -{ - private Am2900MachineDefinition machineDefinition; - private LogicModelModifiable logicModel; - private Timeline timeline; - private MainMemory mainMemory; - private MicroInstructionMemory instMemory; - private CoreClock clock; - - public Am2900Machine(Am2900MachineDefinition am2900MachineDefinition) - { - this.machineDefinition = am2900MachineDefinition; - logicModel = new LogicModelModifiable(); - IndirectModelComponentCreator.createComponent(logicModel, - "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", "Am2900"); - CoreModelParameters params = new CoreModelParameters(); - params.gateProcessTime = 50; - params.wireTravelTime = 10; - mainMemory = new WordAddressableMemory(am2900MachineDefinition.getMainMemoryDefinition()); - instMemory = new StandardMicroInstructionMemory(am2900MachineDefinition.getMicroInstructionMemoryDefinition()); - logicModel.getComponentBySubmodelPath("Am2900.Am2900MainMemory#0", ModelAm2900MainMemory.class).setMachine(this); - logicModel.getComponentBySubmodelPath("Am2900.Am2900MicroInstructionMemory#0", ModelAm2900MicroInstructionMemory.class) - .setMachine(this); - timeline = LogicCoreAdapter.convert(logicModel, params); - } - - @Override - public MachineDefinition getDefinition() - { - return machineDefinition; - } - - @Override - public void reset() - { - // TODO Auto-generated method stub - - } - - @Override - public LogicModel getModel() - { - return logicModel; - } - - @Override - public Timeline getTimeline() - { - return timeline; - } - - @Override - public CoreClock getClock() - { - return clock; - } - - @Override - public BitVector getRegister(Register r) - { - // TODO Auto-generated method stub - return null; - } - - @Override - public void setRegister(Register r, BitVector value) - { - // TODO Auto-generated method stub - - } - - @Override - public MainMemory getMainMemory() - { - return mainMemory; - } - - @Override - public MicroInstructionMemory getMicroInstructionMemory() - { - return instMemory; - } - -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java deleted file mode 100644 index 0ac06ea7..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import java.util.Objects; -import java.util.Set; - -import net.mograsim.machine.ISASchema; -import net.mograsim.machine.Machine; -import net.mograsim.machine.MachineDefinition; -import net.mograsim.machine.MachineRegistry; -import net.mograsim.machine.MainMemoryDefinition; -import net.mograsim.machine.Register; -import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; - -public class Am2900MachineDefinition implements MachineDefinition -{ - private MainMemoryDefinition memoryDefinition = new Am2900MainMemoryDefinition(); - private MicroInstructionMemoryDefinition microInstMemoryDefinition = new Am2900MicroInstructionMemoryDefinition(); - private final static Am2900MachineDefinition instance = new Am2900MachineDefinition(); - - public static Am2900MachineDefinition getInstance() - { - return Objects.requireNonNullElseGet((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"), - () -> instance); - } - - @Override - public Machine createNew() - { - return new Am2900Machine(this); - } - - @Override - public ISASchema getISASchema() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public Set getRegisters() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getAddressBits() - { - return 16; - } - - @Override - public MainMemoryDefinition getMainMemoryDefinition() - { - return memoryDefinition; - } - - @Override - public MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition() - { - return microInstMemoryDefinition; - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java deleted file mode 100644 index 478ec242..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import net.mograsim.machine.MainMemoryDefinition; - -public class Am2900MainMemoryDefinition implements MainMemoryDefinition -{ - - @Override - public int getMemoryAddressBits() - { - return 16; - } - - @Override - public long getMinimalAddress() - { - return 0; - } - - @Override - public long getMaximalAddress() - { - return 0xFFFF; - } - - @Override - public int getCellWidth() - { - return 16; - } - -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java deleted file mode 100644 index 3657bed9..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java +++ /dev/null @@ -1,112 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import java.util.Arrays; -import java.util.Optional; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.parameters.BooleanClassification; -import net.mograsim.machine.mi.parameters.IntegerClassification; -import net.mograsim.machine.mi.parameters.MnemonicFamily; -import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair; -import net.mograsim.machine.mi.parameters.ParameterClassification; - -public class Am2900MicroInstructionDefinition implements MicroInstructionDefinition -{ - private static final BooleanClassification interruptEnable = new BooleanClassification(false, "IE", "Dis"); - // not implemented, because not documented. - private static final MnemonicFamily interruptInstructions = new MnemonicFamily("X", new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))); - private static final BooleanClassification kmux = new BooleanClassification(false, "D", "K"); - private static final MnemonicFamily am2901SrcInstructions = new MnemonicFamily("AB", "AQ", "AB", "ZQ", "ZB", "ZA", "DA", "DQ", "DZ"); - private static final MnemonicFamily am2901FuncInstructions = new MnemonicFamily("ADD", "ADD", "SUBR", "SUBS", "OR", "AND", "NOTRS", - "EXOR", "EXNOR"); - private static final MnemonicFamily am2901DestInstructions = new MnemonicFamily("NOP", "QREG", "NOP", "RAMA", "RAMF", "RAMQD", "RAMD", - "RAMQU", "RAMU"); - private static final IntegerClassification register = new IntegerClassification(0, 4); - private static final BooleanClassification registerSelect = new BooleanClassification(false, "MR", "IR"); - private static final BooleanClassification abus = new BooleanClassification(true, "H", "AB"); - private static final BooleanClassification dbus = new BooleanClassification(true, "H", "DB"); - private static final MnemonicFamily am2904CarryInstructions = new MnemonicFamily("CI0", "CI0", "CI1", "CIX", "CIC"); - private static final MnemonicFamily am2904ShiftInstructions = new MnemonicFamily("RSL / LSLCO", "RSL / LSLCO", "RSH / LSHCO", - "RSCONI / LSL", "RSDH / LSH", "RSDC / LSDLCO", "RSDN / LSDHCO", "RSDL / LSDL", "RSDCO / LSDH", "RSRCO / LSCRO", - "RSRCIO / LSCRIO", "RSR / LSR", "RSDIC / LSLICI", "RSDRCI / LSDCIO", "RSDRCO / LSDRCO", "RSDXOR / LSDCI", "RSDR / LDSR"); -// private static final MnemonicFamily am2904StatusInstructions = new MnemonicFamily( -// new String[] { "MI_Zero", "MI_NotZero", "MI_UGTEQ", "MI_ULT", "MI_UGT", "MI_ULTEQ", "MI_SGTEQ", "MI_SLT", "MI_SGT", "MI_SLTEQ", -// "MA_Zero", "MA_NotZero", "MA_UGTEQ", "MA_ULT", "MA_UGT", "MA_ULTEQ", "MA_SGTEQ", "MA_SLT", "MA_SGT", "MA_SLTEQ" }, -// new long[] { 0b01_0101, 0b01_0100, 0b01_1101, 0b01_1100, 0b01_1110, 0b01_1111, 0b01_0010, 0b01_0011, 0b01_0000, 0b01_0001, -// 0b10_0101, 0b10_0100, 0b10_1101, 0b10_1100, 0b10_1110, 0b10_1111, 0b10_0010, 0b10_0011, 0b10_0000, 0b10_0001 }, -// 6); - // TODO: Maybe "X" and "notX" are swapped. - private static final MnemonicFamily am2904StatusInstructions = new MnemonicFamily("Load_Load_I_Z", "LoadM_LoadY_µ_NxorOVRorZ", - "Set_Set_µ_NxnorOVRornotZ", "Swap_Swap_µ_NxorOVR", "Reset_Reset_µ_NxnorOVR", "Load_LoadForShiftThroughOvr_µ_Z", - "Load_Invert_µ_notZ", "LoadOvrRetain_Load_µ_OVR", "LoadOvrRetain_Load_µ_notOVR", "ResetZ_LoadCarryInvert_µ_CorZ", - "SetZ_LoadCarryInvert_µ_notCandnotZ", "ResetC_Load_µ_C", "SetC_Load_µ_notC", "ResetN_Load_µ_notCorZ", "SetN_Load_µ_CandnotZ", - "ResetOvr_Load_IM_NxorN", "SetOvr_Load_IM_NxnorN", "Load_Load_µ_NxorOVRorZ", "Load_Load_µ_NxnorOVRornotZ", - "Load_Load_µ_NxorOVR", "Load_Load_µ_NxnorOVR", "Load_Load_µ_Z", "Load_Load_µ_notZ", "Load_Load_µ_OVR", "Load_Load_µ_notOVR", - "LoadCarryInvert_LoadCarryInvert_µ_CorZ", "LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ", "Load_Load_µ_C", "Load_Load_µ_notC", - "Load_Load_µ_notCorZ", "Load_Load_µ_CandnotZ", "Load_Load_µ_N", "Load_Load_µ_notN", "Load_Load_M_NxorOVRorZ", - "Load_Load_M_NxnorOVRornotZ", "Load_Load_M_NxorOVR", "Load_Load_M_NxnorOVR", "Load_Load_M_Z", "Load_Load_M_notZ", - "Load_Load_M_OVR", "Load_Load_M_notOVR", "LoadCarryInvert_LoadCarryInvert_M_CorZ", - "LoadCarryInvert_LoadCarryInvert_M_notCandnotZ", "Load_Load_M_C", "Load_Load_M_notC", "Load_Load_M_notCorZ", - "Load_Load_M_CandnotZ", "Load_Load_M_N", "Load_Load_M_notN", "Load_Load_I_NxorOVRorZ", "Load_Load_I_NxnorOVRornotZ", - "Load_Load_I_NxorOVR", "Load_Load_I_NxnorOVR", "Load_Load_I_Z", "Load_Load_I_notZ", "Load_Load_I_OVR", "Load_Load_I_notOVR", - "LoadCarryInvert_LoadCarryInvert_I_notCorZ", "LoadCarryInvert_LoadCarryInvert_I_CandnotZ", "Load_Load_I_C", "Load_Load_I_notC", - "Load_Load_I_notCorZ", "Load_Load_I_CandnotZ", "Load_Load_I_N", "Load_Load_I_notN"); - private static final BooleanClassification ccen = new BooleanClassification(true, "PS", "C"); - private static final MnemonicFamily am2910Instructions = new MnemonicFamily("CONT", "JZ", "CJS", "JMAP", "CJP", "PUSH", "JSRP", "CJV", - "JRP", "RFCT", "RPCT", "CRTN", "CJPP", "LDCT", "LOOP", "CONT", "TWB"); - - private static final IntegerClassification constant_12bit = new IntegerClassification(0, 12); - private static final IntegerClassification constant_16bit = new IntegerClassification(0, 16); - private static final BooleanClassification hE = new BooleanClassification(true, "H", "E"); - private static final BooleanClassification hI = new BooleanClassification(true, "H", "I"); - private static final BooleanClassification hL = new BooleanClassification(true, "H", "L"); - private static final BooleanClassification rW = new BooleanClassification(true, "R", "W"); - - private static final ParameterClassification[] classes = { interruptEnable, interruptInstructions, kmux, constant_16bit, - am2901SrcInstructions, am2901FuncInstructions, am2901DestInstructions, register, registerSelect, register, registerSelect, abus, - dbus, am2904CarryInstructions, am2904ShiftInstructions, hL, hL, am2904StatusInstructions, ccen, am2910Instructions, - constant_12bit, hL, hE, hI, hE, hL, rW }; - - private static final String[] paramDesc = { "Allow interrupts?", "Interrupt instructions; omitted for simplicity", - "Get D-input from data bus/constant value", "Constant value", "Operand sources for ALU operation", "ALU operation", - "Destination of ALU calculation", "Register for A-operand", "Get A-operand from instruction register/micro instruction?", - "Register for B-operand", "Get B-operand from instruction register/micro instruction?", - "Put data from Y-output on address bus?", "Put data from Y-output on data bus?", "Source for carry-in", "Shift instructions", - "Modify micro status register?", "Modify macro status register?", "Operations on the status register", - "Is conditional jump enabled?", "Instructions for the micro instruction pointer", "Absolute address of a micro instruction", - "Load instruction pointer from data bus?", "Put instruction pointer on data bus?", "Increment instruction pointer?", - "Put instruction pointer on address bus?", "Load instruction register from data bus?", "Read from/Write to main memory?" }; - - @Override - public ParameterClassification[] getParameterClassifications() - { - return classes; - } - - @Override - public ParameterClassification getParameterClassification(int index) - { - return classes[index]; - } - - @Override - public Optional getParameterDescription(int index) - { - return Optional.of(paramDesc[index]); - } - - public static void main(String[] args) - { - String s = "new BooleanClassification(\"R\", \"W\"), hL, new BooleanClassification(\"H\", \"E\"),\r\n" - + " new BooleanClassification(\"H\", \"I\"), new BooleanClassification(\"H\", \"E\"), hL, new IntegerClassification(12), am2910Instructions,\r\n" - + " new BooleanClassification(\"PS\", \"C\"), am2904StatusInstructions, hL, hL, am2904ShiftInstructions, am2904CarryInstructions,\r\n" - + " new BooleanClassification(\"H\", \"DB\"), new BooleanClassification(\"H\", \"AB\"), registerSelect, register, registerSelect, register,\r\n" - + " am2901DestInstructions, am2901FuncInstructions, am2901SrcInstructions, new IntegerClassification(16),\r\n" - + " new BooleanClassification(\"D\", \"K\"), interruptInstructions, new BooleanClassification(\"Dis\", \"IE\")"; - s = s.replaceAll("[\r\n\t]", ""); - System.out.print(Arrays.stream(s.split(", new")).reduce((a, b) -> b + ", new" + a)); -// System.out.println(Arrays.stream(paramDesc).reduce("", (a, b) -> String.format("\"%s\", %s", b, a))); - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java deleted file mode 100644 index 01b83212..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; - -public class Am2900MicroInstructionMemoryDefinition implements MicroInstructionMemoryDefinition -{ - - @Override - public int getMemoryAddressBits() - { - return 12; - } - - @Override - public long getMinimalAddress() - { - return 0; - } - - @Override - public long getMaximalAddress() - { - return 4096; - } - - @Override - public MicroInstructionDefinition getMicroInstructionDefinition() - { - return new Am2900MicroInstructionDefinition(); - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json deleted file mode 100644 index b753895c..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "version": "0.1.0", - "map": { - "Am2900MainMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory", - "Am2900MicroInstructionMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory", - "Am2904RegCTInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904RegCTInstrDecode", - "Am2904ShiftInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904ShiftInstrDecode", - "Am2910InstrPLA": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910InstrPLA", - "Am2910RegCntr": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910RegCntr", - "Am2910SP": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910SP", - "dff12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff12", - "dff4_finewe": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff4_finewe", - "inc": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelinc", - "nor12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelnor12", - "ram5_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelram5_12", - "sel4_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelsel4_12", - "Am2900": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", - "Am2901": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901.json", - "Am2901ALUFuncDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json", - "Am2901ALUInclDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json", - "Am2901ALUInclSourceDecodeInclFunctionDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json", - "Am2901ALUOneBit": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json", - "Am2904": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904.json", - "Am2910": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2910/Am2910.json", - "Am2904MSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json", - "Am2904muSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json", - "Am2904TestLogic": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json", - "Am2901DestDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json", - "Am2901SourceDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json", - "_rsLatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/_rsLatch.json", - "and": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and.json", - "and41": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and41.json", - "andor414": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/andor414.json", - "demux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/demux2.json", - "dff": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff.json", - "dff4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4.json", - "dff4_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4_invwe.json", - "dff8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff8.json", - "dff12_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff12_we.json", - "dff16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16.json", - "dff16_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_we.json", - "dff16_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_invwe.json", - "dff80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff80.json", - "dlatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch.json", - "dlatch4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch4.json", - "dlatch8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch8.json", - "dlatch80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch80.json", - "fulladder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/fulladder.json", - "halfadder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/halfadder.json", - "mux1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1.json", - "mux1_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_4.json", - "mux1_8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_8.json", - "mux1_12": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_12.json", - "mux1_16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_16.json", - "mux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux2.json", - "mux3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux3.json", - "nand3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/nand3.json", - "not4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/not4.json", - "or4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or4.json", - "or_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or_4.json", - "ram2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram2.json", - "ram4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram4.json", - "sel1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel1.json", - "sel2_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel2_4.json", - "sel3_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel3_4.json", - "xor": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/xor.json" - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java deleted file mode 100644 index 7a161348..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.mograsim.logic.model.examples; - -import java.util.ArrayList; - -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler.BitVectorSplittingAtomicHighLevelStateHandlerParams; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler.DelegatingAtomicHighLevelStateHandlerParams; - -public class GenerateDff80HighLevelStateHandler -{ - public static void main(String[] args) - { - Am2900Loader.setup(); - LogicModelModifiable model = new LogicModelModifiable(); - DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, null, null, null); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#0");// LSB - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#1"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#2"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#3"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#4"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#5"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#6"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#7"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#8"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#9");// MSB - - StandardHighLevelStateHandler hlsh = new StandardHighLevelStateHandler(comp); - comp.setHighLevelStateHandler(hlsh); - BitVectorSplittingAtomicHighLevelStateHandlerParams p = new BitVectorSplittingAtomicHighLevelStateHandlerParams(); - p.vectorPartLengthes = new ArrayList<>(); - p.vectorPartTargets = new ArrayList<>(); - for (int i = 0; i < 10; i++) - { - addHandlersForByte(comp, hlsh, i, p); - } - hlsh.addAtomicHighLevelState("q", new BitVectorSplittingAtomicHighLevelStateHandler(comp, p)); - - System.out.println(comp.getHighLevelStateHandler().getParamsForSerializingJSON(new IdentifyParams())); - } - - private static void addHandlersForByte(SubmodelComponent comp, StandardHighLevelStateHandler hlsh, int LSByteIndex, - BitVectorSplittingAtomicHighLevelStateHandlerParams p2) - { - // TODO remove the "+ 1" as soon as HighLevelStates count from 0 - // Also replace the 1 in "bitIndexInByte = 1" below with a 0 - int LSBitIndex = LSByteIndex * 8 + 1; - int MSBitIndex = LSBitIndex + 7; - String dffThisByte = "dff8#" + LSByteIndex; - String thisByteHLSID = "q" + MSBitIndex + "-" + LSBitIndex; - - p2.vectorPartLengthes.add(0, 8); - p2.vectorPartTargets.add(0, thisByteHLSID); - - DelegatingAtomicHighLevelStateHandlerParams p = new DelegatingAtomicHighLevelStateHandlerParams(); - p.delegateTarget = dffThisByte; - p.subStateID = "q"; - hlsh.addAtomicHighLevelState(thisByteHLSID, new DelegatingAtomicHighLevelStateHandler(comp, p)); - for (int bitIndexOuter = LSBitIndex, bitIndexInByte = 1; bitIndexOuter <= MSBitIndex; bitIndexOuter++, bitIndexInByte++) - { - p = new DelegatingAtomicHighLevelStateHandlerParams(); - p.delegateTarget = dffThisByte; - p.subStateID = "q" + bitIndexInByte; - hlsh.addAtomicHighLevelState("q" + bitIndexOuter, new DelegatingAtomicHighLevelStateHandler(comp, p)); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java deleted file mode 100644 index 1e654c80..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.mograsim.logic.model.examples; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelComponentTestbench -{ - public static void main(String[] args) - { - SimpleLogicUIStandalone.executeVisualisation(ModelComponentTestbench::createTestbench); - } - - @SuppressWarnings("unused") // for ModelWires being created - public static void createTestbench(LogicModelModifiable model) - { - Am2900Loader.setup(); - ModelComponent comp = IndirectModelComponentCreator.createComponent(model, "Am2900"); - - List inputPinNames = new ArrayList<>(); - List outputPinNames = new ArrayList<>(); - for (Pin p : comp.getPins().values()) - if (p.usage == PinUsage.INPUT) - inputPinNames.add(p.name); - else - outputPinNames.add(p.name); - - inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); - outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); - - comp.moveTo(100, 0); - for (int i = 0; i < inputPinNames.size(); i++) - { - String pinName = inputPinNames.get(i); - ModelManualSwitch sw = new ModelManualSwitch(model, comp.getPin(pinName).logicWidth); - sw.moveTo(0, 20 * i); - new ModelWire(model, comp.getPin(pinName), sw.getOutputPin()); - } - for (int i = 0; i < outputPinNames.size(); i++) - { - String pinName = outputPinNames.get(i); - ModelBitDisplay bd = new ModelBitDisplay(model, comp.getPin(pinName).logicWidth); - bd.moveTo(200, 20 * i); - new ModelWire(model, comp.getPin(pinName), bd.getInputPin()); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java deleted file mode 100644 index f34bf342..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java +++ /dev/null @@ -1,363 +0,0 @@ -package net.mograsim.logic.model.examples; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.Scanner; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; - -public class ReserializeAndVerifyJSONs -{ - public static double GRIDSIZE = 2.5; - public static boolean changePinUsages = false; - public static boolean changeComponentNames = false; - public static boolean snapWCPs = true; - public static boolean warnNonSnappedPoints = true; - public static boolean warnNonVertHorizLines = true; - public static boolean warnRedundantWires = true; - - public static void main(String[] args) throws IOException - { - Am2900Loader.setup(); - try (Scanner sysin = new Scanner(System.in)) - { - System.out.print("Directory to search for JSONs in / JSON file to reserialize >"); - Path root = Paths.get(sysin.nextLine()); - if (!Files.exists(root)) - throw new IllegalArgumentException("Path doesn't exist"); - if (Files.isRegularFile(root)) - reserializeJSON(root, sysin); - else - { - System.out.print("Recursive? >"); - boolean recursive = Boolean.valueOf(sysin.nextLine()); - try (Stream jsons = recursive ? Files.walk(root) : Files.list(root)) - { - jsons.filter(Files::isRegularFile).filter(p -> p.getFileName().toString().endsWith(".json")) - .forEach(j -> reserializeJSON(j, sysin)); - } - } - } - } - - public static void reserializeJSON(Path componentPath, Scanner sysin) - { - try - { - DeserializedSubmodelComponent comp = (DeserializedSubmodelComponent) IndirectModelComponentCreator - .createComponent(new LogicModelModifiable(), "jsonfile:" + componentPath.toString()); - System.out.println("Reserializing " + componentPath); - LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); - Map componentNameRemapping = new HashMap<>(); - - if (changePinUsages) - changePinUsages(sysin, comp); - if (changeComponentNames) - changeComponentNames(sysin, submodelModifiable, componentNameRemapping); - if (snapWCPs) - snapWCPs(submodelModifiable); - if (warnNonSnappedPoints) - warnNonSnappedPoints(comp, submodelModifiable); - if (warnNonVertHorizLines) - warnNonVertHorizLines(submodelModifiable); - if (warnRedundantWires) - warnRedundantWires(submodelModifiable); - - SubmodelComponentSerializer.serialize(comp, componentPath.toString()); - - if (changeComponentNames) - changeComponentNames_AfterSerialization(sysin, comp, componentNameRemapping); - } - catch (Exception e) - { - System.err.println("An error occurred visiting " + componentPath + ":"); - e.printStackTrace(); - } - } - - private static void warnRedundantWires(LogicModelModifiable submodelModifiable) - { - Map> connectedPinGroups = new HashMap<>(); - submodelModifiable.getComponentsByName().values().stream().map(ModelComponent::getPins).map(Map::values).flatMap(Collection::stream) - .forEach(p -> connectedPinGroups.put(p, new HashSet<>(Arrays.asList(p)))); - submodelModifiable.getWiresByName().values().forEach(w -> - { - Pin pin1 = w.getPin1(); - Pin pin2 = w.getPin2(); - Set pin1Group = connectedPinGroups.get(pin1); - Set pin2Group = connectedPinGroups.get(pin2); - if (pin1Group == pin2Group) - System.out.println(" Wire " + w.name + " connecting " + pin1 + " and " + pin2 + " is redundant"); - else - { - pin1Group.addAll(pin2Group); - pin2Group.forEach(p -> connectedPinGroups.put(p, pin1Group)); - } - }); - } - - private static void changePinUsages(Scanner sysin, DeserializedSubmodelComponent comp) - { - comp.getSupermodelPins().entrySet().stream().sorted(Comparator.comparing(Entry::getKey)).map(Entry::getValue).forEach(pin -> - { - PinUsage usage = null; - while (usage == null) - try - { - System.out.print(" Usage for interface pin " + pin.name + " (empty: " + pin.usage + ") >"); - String usageStr = sysin.nextLine().toUpperCase(); - usage = usageStr.equals("") ? pin.usage - : usageStr.equals("I") ? PinUsage.INPUT - : usageStr.equals("O") ? PinUsage.OUTPUT - : usageStr.equals("T") ? PinUsage.TRISTATE : PinUsage.valueOf(usageStr); - } - catch (@SuppressWarnings("unused") IllegalArgumentException e) - { - System.err.println(" Illegal usage"); - } - setInterfacePinUsage(comp, pin, usage); - }); - } - - private static void changeComponentNames(Scanner sysin, LogicModelModifiable submodelModifiable, - Map componentNameRemapping) - { - componentNameRemapping.put(SubmodelComponent.SUBMODEL_INTERFACE_NAME, SubmodelComponent.SUBMODEL_INTERFACE_NAME); - LogicModelModifiable tempModel = new LogicModelModifiable(); - IdentifyParams iP = new IdentifyParams(); - submodelModifiable.getComponentsByName().entrySet().stream() - .filter(e -> !e.getKey().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)) - .sorted(Comparator.comparing(Entry::getKey, ReserializeAndVerifyJSONs::compareStringsWithIntegers)).forEach(e -> - { - String oldName = e.getKey(); - ModelComponent subcomp = e.getValue(); - String defaultName = tempModel.getDefaultComponentName(subcomp); - String newName = null; - while (newName == null) - { - System.out.print(" New name for component " + oldName + " of type " + subcomp.getIDForSerializing(iP) + " (empty: " - + defaultName + ") >"); - newName = sysin.nextLine(); - if (newName.equals("")) - newName = defaultName; - if (tempModel.getComponentsByName().containsKey(newName)) - { - System.err.println(" There already is a component with that name"); - newName = null; - } - } - componentNameRemapping.put(oldName, newName); - IndirectModelComponentCreator - .createComponent(tempModel, subcomp.getIDForSerializing(iP), subcomp.getParamsForSerializingJSON(iP), newName) - .moveTo(subcomp.getPosX(), subcomp.getPosY()); - }); - SubmodelInterface tempSubmodelInterface = new SubmodelInterface(tempModel); - for (Pin p : submodelModifiable.getComponentsByName().get(SubmodelComponent.SUBMODEL_INTERFACE_NAME).getPins().values()) - tempSubmodelInterface - .addPin(new Pin(tempModel, tempSubmodelInterface, p.name, p.logicWidth, p.usage, p.getRelX(), p.getRelY())); - for (ModelWire w : submodelModifiable.getWiresByName().values()) - createWire(componentNameRemapping::get, tempModel, w); - - Optional o; - while ((o = submodelModifiable.getComponentsByName().values().stream() - .filter(c -> !c.getName().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)).findAny()).isPresent()) - submodelModifiable.destroyComponent(o.get()); - - tempModel.getComponentsByName().values().stream().filter(c -> !c.getName().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)) - .forEach(c -> IndirectModelComponentCreator - .createComponent(submodelModifiable, c.getIDForSerializing(iP), c.getParamsForSerializingJSON(iP), c.getName()) - .moveTo(c.getPosX(), c.getPosY())); - for (ModelWire w : tempModel.getWiresByName().values()) - createWire(Function.identity(), submodelModifiable, w); - } - - private static void changeComponentNames_AfterSerialization(Scanner sysin, DeserializedSubmodelComponent comp, - Map componentNameRemapping) - { - if (comp.getHighLevelStateHandler() == null || !(comp.getHighLevelStateHandler() instanceof DefaultHighLevelStateHandler)) - { - System.out.println(" A non-default HighLevelStateHandler was detected. Check for changes there manually."); - System.out.print(" Empty line to continue to next component, old component name to get new component name >"); - for (String line = sysin.nextLine(); !line.equals(""); line = sysin.nextLine()) - System.out.println(" " + line + "->" + componentNameRemapping.get(line) + " >"); - } - } - - private static void snapWCPs(LogicModelModifiable submodelModifiable) - { - submodelModifiable.getComponentsByName().values().stream().filter(c -> c instanceof ModelWireCrossPoint).forEach(c -> - { - double x = c.getPosX(); - double y = c.getPosY(); - double newX = x % GRIDSIZE == 0 ? x - 1 : x; - double newY = y % GRIDSIZE == 0 ? y - 1 : y; - if (x != newX || y != newY) - { - c.moveTo(newX, newY); - System.out.println(" Snapping WCP " + c.getName()); - } - }); - } - - private static void warnNonSnappedPoints(DeserializedSubmodelComponent comp, LogicModelModifiable submodelModifiable) - { - if (comp.getWidth() % GRIDSIZE != 0 || comp.getHeight() % GRIDSIZE != 0) - System.out.println(" Size is not snapped to grid: " + comp.getWidth() + "," + comp.getHeight()); - submodelModifiable.getComponentsByName().values().forEach(c -> - { - double x = c.getPosX(); - double y = c.getPosY(); - if (c instanceof ModelWireCrossPoint) - { - x++; - y++; - } - if (x % GRIDSIZE != 0 || y % GRIDSIZE != 0) - System.out.println(" Component " + c.getName() + " (type " + c.getIDForSerializing(new IdentifyParams()) - + ") is not snapped to grid: " + x + "," + y); - }); - submodelModifiable.getWiresByName().values().forEach(w -> - { - Point[] p = w.getPath(); - if (p != null) - for (int i = 0; i < p.length; i++) - if (p[i].x % GRIDSIZE != 0 || p[i].y % GRIDSIZE != 0) - System.out.println(" Wire " + w.name + " path point #" + i + " is not snapped to grid: " + p[i].x + "," + p[i].y); - }); - comp.getPins().values().forEach(p -> - { - if (p.getRelX() % GRIDSIZE != 0 || p.getRelY() % GRIDSIZE != 0) - System.out.println(" Interface point " + p.name + " is not snapped to grid: " + p.getRelX() + "," + p.getRelY()); - }); - } - - private static void warnNonVertHorizLines(LogicModelModifiable submodelModifiable) - { - submodelModifiable.getWiresByName().values().forEach(w -> - { - double[] p = w.getEffectivePath(); - for (int i = 1; i < p.length / 2; i++) - { - double x1 = p[2 * i - 2]; - double y1 = p[2 * i - 1]; - double x2 = p[2 * i + 0]; - double y2 = p[2 * i + 1]; - if (x1 != x2 && y1 != y2) - System.out.println(" Wire " + w.name + " part #" + (i - 1) + " is neither vertical nor horizontal"); - } - }); - } - - private static ModelWire createWire(Function componentNameRemapping, LogicModelModifiable tempModelForDefaultNames, - ModelWire w) - { - return new ModelWire(tempModelForDefaultNames, w.name, - getRemappedPin(componentNameRemapping, tempModelForDefaultNames, w.getPin1()), - getRemappedPin(componentNameRemapping, tempModelForDefaultNames, w.getPin2()), w.getPath()); - } - - private static Pin getRemappedPin(Function componentNameRemapping, LogicModelModifiable tempModelForDefaultNames, - Pin pin) - { - return tempModelForDefaultNames.getComponentsByName().get(componentNameRemapping.apply(pin.component.getName())).getPin(pin.name); - } - - private static int compareStringsWithIntegers(String a, String b) - { - int aLoc = 0; - int bLoc = 0; - for (;;) - { - if (aLoc == a.length()) - { - if (bLoc == b.length()) - return 0; - return -1; - } - if (bLoc == b.length()) - return 1; - int aInt = 0; - int aIntLen = 0; - char nextCharA; - for (;;) - { - nextCharA = a.charAt(aLoc++); - if (nextCharA < '0' || nextCharA > '9') - break; - aIntLen++; - aInt = aInt * 10 + nextCharA - '0'; - if (aLoc == a.length()) - break; - } - int bInt = 0; - int bIntLen = 0; - char nextCharB; - for (;;) - { - nextCharB = b.charAt(bLoc++); - if (nextCharB < '0' || nextCharB > '9') - break; - bIntLen++; - bInt = bInt * 10 + nextCharB - '0'; - if (bLoc == b.length()) - break; - } - if (aIntLen != 0) - { - if (bIntLen == 0) - return -1; - int comp = Integer.compare(aInt, bInt); - if (comp != 0) - return comp; - } else - { - if (bIntLen != 0) - return 1; - int comp = Character.compare(nextCharA, nextCharB); - if (comp != 0) - return comp; - } - } - } - - private static void setInterfacePinUsage(DeserializedSubmodelComponent comp, Pin interfacePin, PinUsage usage) - { - Set wiresConnectedToPin = comp.submodel.getWiresByName().values().stream() - .filter(w -> w.getPin1() == interfacePin || w.getPin2() == interfacePin).collect(Collectors.toSet()); - LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); - wiresConnectedToPin.forEach(submodelModifiable::destroyWire); - comp.removeSubmodelInterface(interfacePin.name); - comp.addSubmodelInterface(new MovablePin(submodelModifiable, comp, interfacePin.name, interfacePin.logicWidth, usage, - interfacePin.getRelX(), interfacePin.getRelY())); - wiresConnectedToPin.forEach(w -> new ModelWire(submodelModifiable, w.getPin1(), w.getPin2())); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/JavaJsonLineCounter.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/JavaJsonLineCounter.java deleted file mode 100644 index 2f6cd4e3..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/JavaJsonLineCounter.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.mograsim.logic.model; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.function.Function; -import java.util.stream.Stream; - -public class JavaJsonLineCounter -{ - public static void main(String[] args) throws IOException - { - printLineCount("..", "java"); - printLineCount("..", "json"); - } - - private static void printLineCount(String path, String filetype) throws IOException - { - long lineCount = Files.walk(Paths.get(path)).filter(Files::isRegularFile).filter(p -> p.toString().endsWith('.' + filetype)) - .flatMap((Function>) p -> - { - try - { - return Files.lines(p); - } - catch (IOException e) - { - throw new UncheckedIOException(e); - } - }).count(); - System.out.println("Total lines in " + filetype + " files: " + lineCount); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableCircuit.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableCircuit.java deleted file mode 100644 index d36d80ff..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableCircuit.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.mograsim.logic.model.am2900; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; - -public interface TestableCircuit -{ - void setup(); - - Result run(); - - void clockOn(boolean isClockOn); - - TestEnvironmentHelper getTestEnvironmentHelper(); - - default void assertRunSuccess() - { - assertEquals(Result.SUCCESS, run()); - } - - default void assertFullCycleSuccess() - { - assertRunSuccess(); - clockOn(false); - assertRunSuccess(); - clockOn(true); - assertRunSuccess(); - } - - default void displayState() - { - getTestEnvironmentHelper().displayState(); - } - - public enum Result - { - SUCCESS, OUT_OF_TIME, ERROR; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Test.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Test.java deleted file mode 100644 index 0d55c750..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Test.java +++ /dev/null @@ -1,302 +0,0 @@ -package net.mograsim.logic.model.am2900.am2901; - -import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Dest.*; -import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Func.*; -import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Src.*; -import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Register.*; -import static net.mograsim.logic.model.am2900.util.TestUtil.*; -import static org.junit.jupiter.api.Assertions.*; - -import java.awt.Point; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; - -import net.mograsim.logic.model.am2900.am2901.TestableAm2901.Register; -import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; - -@DisplayName("Am2901 Tests") -@TestMethodOrder(OrderAnnotation.class) -public class Am2901Test -{ - private TestableAm2901 am2901 = new TestableAm2901Impl(); - - @RegisterExtension - DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2901); - - @BeforeEach - void initialize() - { - createAndSetup(); - setInputsToZero(); - } - - void createAndSetup() - { - am2901.setup(); - } - - void setRegistersToZero() - { - setInputsToZero(); - for (Register r : Register.values()) - { - setRegisterToZero(r); - } - } - - void setRegisterToZero(Register r) - { - am2901.setD("0000"); - am2901.setSrc(DZ); - am2901.setFunc(AND); - setRegOutput(r); - - am2901.assertFullCycleSuccess(); - } - - void setRegOutput(Register r) - { - if (r == Q) - { - am2901.setDest(QREG); - } else - { - am2901.setReg_B(r.toBitString()); - am2901.setDest(RAMF); - } - } - - void setInputsToZero() - { - am2901.setCarryIn("0"); - am2901.setQ_0("0"); - am2901.setQ_3("0"); - am2901.setRAM_0("0"); - am2901.setRAM_3("0"); - am2901.setReg_A("0000"); - am2901.setReg_B("0000"); - am2901.setD("0000"); - am2901.setSrc(AB); - am2901.setFunc(ADD); - am2901.setDest(QREG); -// am2901.setNotOutEnable("0"); TODO - am2901.clockOn(true); - am2901.assertRunSuccess(); - } - - @ParameterizedTest(name = "{0}") - @Order(1) - @DisplayName("Direct / high level access") - @EnumSource(Register.class) - void testDirectAccess(Register r) - { - assertEquals("UUUU", am2901.getDirectly(r)); - - am2901.setDirectly(r, "1011"); - - assertEquals("1011", am2901.getDirectly(r)); - } - - @ParameterizedTest(name = "{0}") - @Order(2) - @DisplayName("Setting each register to 0") - @EnumSource(Register.class) - void testSetToZero(Register r) - { - assertEquals("UUUU", am2901.getDirectly(r)); - - setRegisterToZero(r); - - assertEquals("0000", am2901.getDirectly(r)); - assertEquals("0000", am2901.getY()); - assertEquals("0", am2901.getCarryOut()); - assertEquals("0", am2901.getOverflow()); - assertEquals("0", am2901.getSign()); - assertEquals("1", am2901.getZero()); - } - - @Test - @Order(3) - @DisplayName("Setting all registers to 0") - void testSetAllToZero() - { - setRegistersToZero(); - - assertEquals("0000", am2901.getY()); - assertEquals("0", am2901.getCarryOut()); - assertEquals("0", am2901.getOverflow()); - assertEquals("0", am2901.getSign()); - assertEquals("1", am2901.getZero()); - assertEquals("0", am2901.getQ_0()); - assertEquals("0", am2901.getQ_3()); - assertEquals("0", am2901.getRAM_0()); - assertEquals("0", am2901.getRAM_3()); - - assertAll("register values", Register.stream().map(r -> () -> - { - assertEquals("0000", am2901.getDirectly(r), r.name()); - })); - } - - @Test - @Order(4) - @DisplayName("ADD operation") - void testADD() - { - am2901.setSrc(DA); - am2901.setFunc(ADD); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x + xy.y; - int res4Bit = res32Bit & 0b1111; - int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y); - int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn); - - assertAll("Result of " + xy.x + " + " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"), - () -> assertEquals(to1bitBin(res32Bit > 15), am2901.getCarryOut(), " Cn+4"), - () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR")); - })); - } - - @Test - @Order(4) - @DisplayName("AND operation") - void testAND() - { - am2901.setSrc(DA); - am2901.setFunc(AND); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x & xy.y; - - assertAll("Result of " + xy.x + " & " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3") -// () -> assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), " Cn+4"), // TODO -// () -> assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), " OVR") // TODO - ); - })); - } - - @Test - @Order(4) - @DisplayName("OR operation") - void testOR() - { - am2901.setSrc(DA); - am2901.setFunc(OR); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x | xy.y; - - assertAll("Result of " + xy.x + " | " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3") -// () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), " Cn+4"), // TODO -// () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), " OVR") // TODO - ); - })); - } - - @Test - @Order(4) - @DisplayName("XOR operation") - void testXOR() - { - am2901.setSrc(DA); - am2901.setFunc(EXOR); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x ^ xy.y; - - assertAll("Result of " + xy.x + " ^ " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3")); - })); - } - - @Test - @Order(4) - @DisplayName("SUB operation") - void testSUB() - { - am2901.setSrc(DA); - am2901.setCarryIn("1"); - am2901.setFunc(SUBR); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x - xy.y; - int res4Bit = res32Bit & 0b1111; - int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y); - int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn); - - assertAll("Result of " + xy.x + " - " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"), - () -> assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), " Cn+4"), - () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR")); - })); - } - - static Stream getAll4BitPairs() - { - return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y))); - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java deleted file mode 100644 index 414054e9..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.mograsim.logic.model.am2900.am2901; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.atomic.ModelAndGate; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.atomic.ModelNotGate; -import net.mograsim.logic.model.model.components.atomic.ModelTextComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.ModellingTool; - -@Deprecated -public class Am2901Testbench -{ - public static void main(String[] args) - { - Am2900Loader.setup(); - SimpleLogicUIStandalone.executeVisualisation(Am2901Testbench::createTestbench, Am2901Testbench::beforeRun); - } - - public static void createTestbench(LogicModelModifiable model) - { - ModelComponent comp = IndirectModelComponentCreator.createComponent(model, "Am2901"); - ModellingTool tool = ModellingTool.createFor(model); - - comp.moveTo(240, 0); - - ModelManualSwitch enable = new ModelManualSwitch(model, 1); - ModelWireCrossPoint wcp0 = new ModelWireCrossPoint(model, 1); - ModelNotGate not1 = new ModelNotGate(model, 1); - ModelNotGate not2 = new ModelNotGate(model, 1); - ModelNotGate not3 = new ModelNotGate(model, 1); - ModelAndGate and = new ModelAndGate(model, 1); - tool.connect(wcp0, enable, ""); - tool.connect(wcp0, and, "A"); - tool.connect(wcp0, not1, "A"); - tool.connect(not1, not2, "Y", "A"); - tool.connect(not2, not3, "Y", "A"); - tool.connect(not3, and, "Y", "B"); - enable.moveTo(20, -32.5); - wcp0.moveTo(35, -26); - not1.moveTo(50, -20); - not2.moveTo(80, -20); - not3.moveTo(110, -20); - and.moveTo(135, -30); - Pin last = and.getPin("Y"); - - List inputPinNames = new ArrayList<>(); - List outputPinNames = new ArrayList<>(); - for (Pin p : comp.getPins().values()) - if (p.usage == PinUsage.INPUT) - inputPinNames.add(p.name); - else - outputPinNames.add(p.name); - - inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); - outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); - - for (int i = 0; i < inputPinNames.size(); i++) - { - double x = 55 + 70 * (i % 2); - double y = 10 * i; - - ModelWireCrossPoint wcp = new ModelWireCrossPoint(model, 1); - ModelComponent d_ff = IndirectModelComponentCreator.createComponent(model, "dff"); - ModelManualSwitch sw = new ModelManualSwitch(model, 1); - - tool.connect(last, wcp); - tool.connect(wcp, d_ff, "C"); - tool.connect(sw, d_ff, "", "D"); - tool.connect(d_ff, comp, "Q", inputPinNames.get(i)); - last = wcp.getPin(); - - ModelTextComponent label = new ModelTextComponent(model, inputPinNames.get(i)); - - sw.moveTo(x, y + 7.5); - wcp.moveTo(160, y); - d_ff.moveTo(170, y); - label.moveTo(x - 48, y + 8); - } - - for (int i = 0; i < outputPinNames.size(); i++) - { - double x = 300 + 75 * (i % 2); - double y = 10 * i - 2.5; - ModelBitDisplay bd = new ModelBitDisplay(model, 1); - bd.moveTo(x, y); - tool.connect(bd.getInputPin(), comp, outputPinNames.get(i)); - - ModelTextComponent label = new ModelTextComponent(model, outputPinNames.get(i)); - label.moveTo(x + 25, y); - } - } - - public static void beforeRun(VisualisationObjects vis) - { - vis.model.getComponentsByName().values().forEach(c -> - { - if (c instanceof ModelManualSwitch) - { - ModelManualSwitch cCasted = (ModelManualSwitch) c; - cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); - } - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java deleted file mode 100644 index d8899089..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java +++ /dev/null @@ -1,108 +0,0 @@ -package net.mograsim.logic.model.am2900.am2901; - -import java.util.Arrays; -import java.util.stream.Stream; - -import net.mograsim.logic.model.am2900.TestableCircuit; -import net.mograsim.logic.model.am2900.util.TestUtil; - -public interface TestableAm2901 extends TestableCircuit -{ - - void setDest(Am2901_Dest dest); - - void setFunc(Am2901_Func func); - - void setSrc(Am2901_Src src); - - void setReg_A(String val_4_bit); - - void setReg_B(String val_4_bit); - - void setCarryIn(String val_1_bit); - - void setNotOutEnable(String val_1_bit); - - void setD(String val_4_bit); - - void setQ_0(String val_1_bit); - - void setQ_3(String val_1_bit); - - void setRAM_0(String val_1_bit); - - void setRAM_3(String val_1_bit); - - void setDirectly(Register r, String val_4_bit); - - String getQ_0(); - - String getQ_3(); - - String getRAM_0(); - - String getRAM_3(); - - String getNotP(); - - String getNotG(); - - String getCarryOut(); - - String getSign(); - - String getZero(); - - String getOverflow(); - - String getY(); - - String getDirectly(Register r); - - enum Am2901_Dest - { - QREG, NOP, RAMA, RAMF, RAMQD, RAMD, RAMQU, RAMU; - - public boolean doesShift() - { - return ordinal() >= 4; - } - - public int getShiftDir() - { - return doesShift() ? (ordinal() < 6 ? -1 : 1) : 0; - } - - public int getI7() - { - return this.ordinal() >> 1 & 1; - } - } - - enum Am2901_Func - { - ADD, SUBR, SUBS, OR, AND, NOTRS, EXOR, EXNOR; - } - - enum Am2901_Src - { - AQ, AB, ZQ, ZB, ZA, DA, DQ, DZ; - } - - enum Register - { - r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF, Q; - - public String toBitString() - { - if (this.ordinal() > 0xF) - throw new UnsupportedOperationException(); - return TestUtil.to4bitBin(this.ordinal()); - } - - public static Stream stream() - { - return Arrays.stream(values()); - } - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java deleted file mode 100644 index bddddea5..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.mograsim.logic.model.am2900.am2901; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.util.SwitchWithDisplay; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; -import net.mograsim.logic.model.am2900.util.TestUtil; -import net.mograsim.logic.model.model.components.ModelComponent; - -public class TestableAm2901Impl implements TestableAm2901 -{ - private ModelComponent am2901; - private CoreManualSwitch I; - private CoreManualSwitch C; - private CoreManualSwitch Cn; - private CoreManualSwitch D; - private CoreManualSwitch A; - private CoreManualSwitch B; - private CoreBitDisplay Y; - private CoreBitDisplay F_0, Cn_4, OVR, F3; - private SwitchWithDisplay RAMn, RAMn_3, Qn, Qn_3; - - private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "Am2901"); - - @Override - public Result run() - { - return testHelper.run(); - } - - @Override - public void setup() - { - testHelper.setup(DebugState.NO_DEBUG); - } - - @Override - public void setDest(Am2901_Dest dest) - { - BitVector oldI = I.getValues(); - I.setState(TestUtil.of(dest.ordinal(), 3).concat(oldI.subVector(3))); - } - - @Override - public void setFunc(Am2901_Func func) - { - BitVector oldI = I.getValues(); - I.setState(oldI.subVector(0, 3).concat(TestUtil.of(func.ordinal(), 3)).concat(oldI.subVector(6))); - } - - @Override - public void setSrc(Am2901_Src src) - { - BitVector oldI = I.getValues(); - I.setState(oldI.subVector(0, 6).concat(TestUtil.of(src.ordinal(), 3))); - } - - @Override - public void setReg_A(String val_4_bit) - { - A.setState(BitVector.parse(val_4_bit)); - } - - @Override - public void setReg_B(String val_4_bit) - { - B.setState(BitVector.parse(val_4_bit)); - } - - @Override - public void setCarryIn(String val_1_bit) - { - Cn.setState(Bit.parse(val_1_bit)); - } - - @Override - public void setNotOutEnable(String val_1_bit) - { - throw new UnsupportedOperationException(); // TODO - } - - @Override - public void setD(String val_4_bit) - { - D.setState(BitVector.parse(val_4_bit)); - } - - @Override - public void setQ_0(String val_1_bit) - { - Qn.setState(Bit.parse(val_1_bit).toVector()); - } - - @Override - public void setQ_3(String val_1_bit) - { - Qn_3.setState(Bit.parse(val_1_bit).toVector()); - } - - @Override - public void setRAM_0(String val_1_bit) - { - RAMn.setState(Bit.parse(val_1_bit).toVector()); - } - - @Override - public void setRAM_3(String val_1_bit) - { - RAMn_3.setState(Bit.parse(val_1_bit).toVector()); - } - - @Override - public void clockOn(boolean isClockOn) - { - C.setState(isClockOn ? Bit.ONE : Bit.ZERO); - } - - @Override - public String getQ_0() - { - return Qn.getDisplayedValue().toString(); - } - - @Override - public String getQ_3() - { - return Qn_3.getDisplayedValue().toString(); - } - - @Override - public String getRAM_0() - { - return RAMn.getDisplayedValue().toString(); - } - - @Override - public String getRAM_3() - { - return RAMn_3.getDisplayedValue().toString(); - } - - @Override - public String getNotP() - { - throw new UnsupportedOperationException(); // TODO - } - - @Override - public String getNotG() - { - throw new UnsupportedOperationException(); // TODO - } - - @Override - public String getCarryOut() - { - return Cn_4.getDisplayedValue().toString(); - } - - @Override - public String getSign() - { - return F3.getDisplayedValue().toString(); - } - - @Override - public String getZero() - { - return F_0.getDisplayedValue().toString(); - } - - @Override - public String getOverflow() - { - return OVR.getDisplayedValue().toString(); - } - - @Override - public String getY() - { - return Y.getDisplayedValue().toString(); - } - - @Override - public void setDirectly(Register r, String val_4_bit) - { - am2901.setHighLevelState(regToStateID(r), BitVector.parse(val_4_bit)); - } - - @Override - public String getDirectly(Register r) - { - return ((BitVector) am2901.getHighLevelState(regToStateID(r))).toString(); - } - - private static String regToStateID(Register r) - { - if (r == Register.Q) - return "qreg.q"; - return "regs.c" + r.toBitString() + ".q"; - } - - @Override - public TestEnvironmentHelper getTestEnvironmentHelper() - { - return testHelper; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Test.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Test.java deleted file mode 100644 index 332f4f64..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Test.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.mograsim.logic.model.am2900.am2904; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; - -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_Carry; -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_Inst; -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_ShiftDir; -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.CompleteStatus; -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Register; -import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; - -@DisplayName("Am2904 Tests") -@TestMethodOrder(OrderAnnotation.class) -public class Am2904Test -{ - private TestableAm2904 am2904 = new TestableAm2904Impl(); - - @RegisterExtension - DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2904); - - @BeforeEach - void initialize() - { - createAndSetup(); - setStandardInputs(); - } - - void createAndSetup() - { - am2904.setup(); - } - - void setStandardInputs() - { - am2904.set_CEµ("0"); - am2904.set_CEM("0"); - am2904.setI("0000"); - am2904.set_E("0000"); - am2904.set_OEY("1"); - am2904.set_OECT("0"); - am2904.setCarry(Am2904_Carry.CI0); - am2904.setCX("0"); - am2904.setI10(Am2904_ShiftDir.RIGHT); - am2904.setShiftCode("0000"); - am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); - am2904.setSIO0("Z"); - am2904.setSIO3("Z"); - am2904.setQIO0("Z"); - am2904.setQIO3("Z"); - am2904.set_SE("1"); - am2904.setY("ZZZZ"); - am2904.clockOn(true); - am2904.assertRunSuccess(); - } - - @ParameterizedTest(name = "{0}") - @Order(1) - @DisplayName("Direct / high level access") - @EnumSource(Register.class) - void testDirectAccess(Register r) - { - assertEquals("U", am2904.getDirectly(r)); - - am2904.setDirectly(r, "1"); - - assertEquals("1", am2904.getDirectly(r)); - } - - @Test - @Order(2) - void testBasicStateAndOutputs() - { - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getC0()); - assertEquals("0", am2904.getCT()); - assertEquals("Z", am2904.getQIO0()); - assertEquals("Z", am2904.getQIO3()); - assertEquals("Z", am2904.getSIO0()); - assertEquals("Z", am2904.getSIO3()); - assertEquals("ZZZZ", am2904.getY()); - } - - @Test - @Order(3) - void testSimpleLoadTestIZ() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("1000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - - am2904.setInstruction(Am2904_Inst.Load_Load_I_notZ); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - } - - @Test - @Order(3) - void testSimpleLoadTestIC() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_C); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0100"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - - am2904.setInstruction(Am2904_Inst.Load_Load_I_notC); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - } - - @Test - @Order(3) - void testSimpleLoadTestIN() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_N); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0010"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - - am2904.setInstruction(Am2904_Inst.Load_Load_I_notN); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - } - - @Test - @Order(3) - void testSimpleLoadTestIOVR() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_OVR); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0001"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - - am2904.setInstruction(Am2904_Inst.Load_Load_I_notOVR); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - } - - @Test - @Order(3) - void testRegisterContentAfterLoadLoad() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); - am2904.assertFullCycleSuccess(); - - String[] statusValues = { "0001", "0010", "0100", "1000", "0000", "1111" }; - - for (String status : statusValues) - { - am2904.setI(status); - am2904.assertFullCycleSuccess(); - assertEquals(status, am2904.getDirectly(CompleteStatus.micro)); - assertEquals(status, am2904.getDirectly(CompleteStatus.MAKRO)); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java deleted file mode 100644 index e46561d5..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.mograsim.logic.model.am2900.am2904; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.Renderer; - -public class Am2904Testbench -{ - public static void main(String[] args) - { - Am2900Loader.setup(); - SimpleLogicUIStandalone.executeVisualisation(Am2904Testbench::create, Am2904Testbench::beforeRun); - } - - public static void create(LogicModelModifiable model) - { - // TODO replace with proper LogicModel deserialization - DeserializedSubmodelComponent testbench = (DeserializedSubmodelComponent) IndirectModelComponentCreator.createComponent(model, - "jsonfile:Am2904Testbench.json", "testbench"); - testbench.setSize(1000, 1000); - testbench.setOutlineRenderer(new Renderer() - { - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return null; - } - - @Override - public Void getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - // do nothing - } - }); - } - - public static void beforeRun(VisualisationObjects vis) - { - ((SubmodelComponent) vis.model.getComponentsByName().get("testbench")).submodel.getComponentsByName().values().forEach(c -> - { - if (c instanceof ModelManualSwitch) - { - ModelManualSwitch cCasted = (ModelManualSwitch) c; - cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); - } - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java deleted file mode 100644 index e41e3fef..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java +++ /dev/null @@ -1,236 +0,0 @@ -package net.mograsim.logic.model.am2900.am2904; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import net.mograsim.logic.model.am2900.TestableCircuit; - -public interface TestableAm2904 extends TestableCircuit -{ - - void setInstruction(Am2904_Inst inst); - - void setCarry(Am2904_Carry carry); - - void setShiftCode(String val_4_bit); - - void setI10(Am2904_ShiftDir dir); - - void setCX(String val_1_bit); - - void setY(String z_c_n_ovr); - - void setIZ(String val_1_bit); - - void setIC(String val_1_bit); - - void setIOVR(String val_1_bit); - - void setIN(String val_1_bit); - - default void setI(String z_c_n_ovr) - { - setIZ(z_c_n_ovr.substring(0, 1)); - setIC(z_c_n_ovr.substring(1, 2)); - setIN(z_c_n_ovr.substring(2, 3)); - setIOVR(z_c_n_ovr.substring(3, 4)); - } - - void set_CEM(String val_1_bit); - - void set_CEµ(String val_1_bit); - - void set_OEY(String val_1_bit); - - void set_OECT(String val_1_bit); - - void set_SE(String val_1_bit); - - void set_EZ(String val_1_bit); - - void set_EC(String val_1_bit); - - void set_EOVR(String val_1_bit); - - void set_EN(String val_1_bit); - - default void set_E(String z_c_n_ovr) - { - set_EZ(z_c_n_ovr.substring(0, 1)); - set_EC(z_c_n_ovr.substring(1, 2)); - set_EN(z_c_n_ovr.substring(2, 3)); - set_EOVR(z_c_n_ovr.substring(3, 4)); - } - - void setSIO0(String val_1_bit); - - void setSIO3(String val_1_bit); - - void setQIO0(String val_1_bit); - - void setQIO3(String val_1_bit); - - void setDirectly(Register r, String val_1_bit); - - void setDirectly(CompleteStatus r, String z_c_n_ovr); - - String getC0(); - - String getCT(); - - String getY(); - - String getSIO0(); - - String getSIO3(); - - String getQIO0(); - - String getQIO3(); - - String getDirectly(Register r); - - String getDirectly(CompleteStatus r); - - enum Am2904_ShiftDir - { - RIGHT, LEFT; - } - - enum Am2904_Carry - { - CI0, CI1, CX, USE_SR; - } - - /** - * Pattern:
- * [microSR]_[machineSR]_[condCodeSource]_[condCode]
- *
    - *
  • Load = load from I inputs (Am2904s)
  • - *
  • condCodeSource = µ, M, I (and a special case: I and M)
  • - *
  • condCode = the boolean term defining the CT output
  • - *
- */ - enum Am2904_Inst - { - // @formatter:off - LoadM_LoadY_µ_NxorOVRorZ(0_00), - Set_Set_µ_NxnorOVRornotZ(0_01), - Swap_Swap_µ_NxorOVR(0_02), - Reset_Reset_µ_NxnorOVR(0_03), - Load_LoadForShiftThroughOvr_µ_Z(0_04), - Load_Invert_µ_notZ(0_05), - LoadOvrRetain_Load_µ_OVR(0_06), - LoadOvrRetain_Load_µ_notOVR(0_07), - ResetZ_LoadCarryInvert_µ_CorZ(0_10), - SetZ_LoadCarryInvert_µ_notCandnotZ(0_11), - ResetC_Load_µ_C(0_12), - SetC_Load_µ_notC(0_13), - ResetN_Load_µ_notCorZ(0_14), - SetN_Load_µ_CandnotZ(0_15), - ResetOvr_Load_IM_NxorN(0_16), - SetOvr_Load_IM_NxnorN(0_17), - Load_Load_µ_NxorOVRorZ(0_20), - Load_Load_µ_NxnorOVRornotZ(0_21), - Load_Load_µ_NxorOVR(0_22), - Load_Load_µ_NxnorOVR(0_23), - Load_Load_µ_Z(0_24), - Load_Load_µ_notZ(0_25), - Load_Load_µ_OVR(0_26), - Load_Load_µ_notOVR(0_27), - LoadCarryInvert_LoadCarryInvert_µ_CorZ(0_30), - LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ(0_31), - Load_Load_µ_C(0_32), - Load_Load_µ_notC(0_33), - Load_Load_µ_notCorZ(0_34), - Load_Load_µ_CandnotZ(0_35), - Load_Load_µ_N(0_36), - Load_Load_µ_notN(0_37), - Load_Load_M_NxorOVRorZ(0_40), - Load_Load_M_NxnorOVRornotZ(0_41), - Load_Load_M_NxorOVR(0_42), - Load_Load_M_NxnorOVR(0_43), - Load_Load_M_Z(0_44), - Load_Load_M_notZ(0_45), - Load_Load_M_OVR(0_46), - Load_Load_M_notOVR(0_47), - LoadCarryInvert_LoadCarryInvert_M_CorZ(0_50), - LoadCarryInvert_LoadCarryInvert_M_notCandnotZ(0_51), - Load_Load_M_C(0_52), - Load_Load_M_notC(0_53), - Load_Load_M_notCorZ(0_54), - Load_Load_M_CandnotZ(0_55), - Load_Load_M_N(0_56), - Load_Load_M_notN(0_57), - Load_Load_I_NxorOVRorZ(0_60), - Load_Load_I_NxnorOVRornotZ(0_61), - Load_Load_I_NxorOVR(0_62), - Load_Load_I_NxnorOVR(0_63), - Load_Load_I_Z(0_64), - Load_Load_I_notZ(0_65), - Load_Load_I_OVR(0_66), - Load_Load_I_notOVR(0_67), - LoadCarryInvert_LoadCarryInvert_I_notCorZ(0_70), - LoadCarryInvert_LoadCarryInvert_I_CandnotZ(0_71), - Load_Load_I_C(0_72), - Load_Load_I_notC(0_73), - Load_Load_I_notCorZ(0_74), - Load_Load_I_CandnotZ(0_75), - Load_Load_I_N(0_76), - Load_Load_I_notN(0_77); - // @formatter:on - - public final int code; - - private Am2904_Inst(int code) - { - this.code = code; - } - - private static final Map instCodes; - - static - { - Map instCodesMod = new HashMap<>(); - Am2904_Inst[] vals = values(); - for (Am2904_Inst inst : vals) - { - assert inst.code == inst.ordinal(); - instCodesMod.put(inst.code, inst); - } - if (instCodesMod.size() != 64) - throw new IllegalStateException("There must be exactly 64 Am2904 instruction codes, but was " + instCodesMod.size()); - instCodes = Collections.unmodifiableMap(instCodesMod); - } - - public static Am2904_Inst getInstFor(int I_543210) - { - Am2904_Inst inst = instCodes.get(I_543210); - if (inst != null) - return inst; - throw new IllegalArgumentException("Invaild Am2904 instruction code: " + I_543210); - } - - public int getBlock() - { - return code >> 4; - } - - public boolean isLoadCarryInvert() - { - return (code & 0b001_110) == 0b001_000; - } - } - - enum Register - { - µZ, µC, µN, µOVR, MZ, MC, MN, MOVR; - } - - enum CompleteStatus - { - micro, MAKRO; - } - -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json deleted file mode 100644 index 964d7d3d..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json +++ /dev/null @@ -1,846 +0,0 @@ -{ - "width": 0.0, - "height": 0.0, - "interfacePins": [ - { - "location": { - "x": 10.0, - "y": 20.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 145.0, - "y": 125.0 - }, - "name": "C0", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 145.0, - "y": 75.0 - }, - "name": "CT", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 10.0, - "y": 125.0 - }, - "name": "Cx", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 30.0 - }, - "name": "IC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 35.0 - }, - "name": "IN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 40.0 - }, - "name": "IOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 25.0 - }, - "name": "IZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": -87.66482568016058, - "y": 58.834004835619645 - }, - "name": "I_10", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": -80.0, - "y": 40.0 - }, - "name": "I_11_12", - "logicWidth": 2, - "usage": "INPUT" - }, - { - "location": { - "x": -85.0, - "y": 100.0 - }, - "name": "I_5_0", - "logicWidth": 6, - "usage": "INPUT" - }, - { - "location": { - "x": -84.26853373181032, - "y": 78.72500503091884 - }, - "name": "I_6_9", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 145.0, - "y": 145.0 - }, - "name": "QIO0", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 10.0, - "y": 145.0 - }, - "name": "QIOn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 135.0 - }, - "name": "SIO0", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 10.0, - "y": 135.0 - }, - "name": "SIOn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 30.0 - }, - "name": "YC", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 35.0 - }, - "name": "YN", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 40.0 - }, - "name": "YOVR", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 25.0 - }, - "name": "YZ", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 10.0, - "y": 45.0 - }, - "name": "_CEM", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 50.0 - }, - "name": "_CEmu", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 60.0 - }, - "name": "_EC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 65.0 - }, - "name": "_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 70.0 - }, - "name": "_EOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 55.0 - }, - "name": "_EZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 145.0, - "y": 65.0 - }, - "name": "_OECT", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 80.0, - "y": 10.0 - }, - "name": "_OEY", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 100.0 - }, - "name": "_SE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 1.0, - "submodel": { - "components": [ - { - "id": "Merger", - "name": "Merger#0", - "pos": { - "x": -30.0, - "y": 70.0 - }, - "params": 13 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": -45.0, - "y": 140.0 - }, - "params": 6 - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": -45.0, - "y": 100.0 - }, - "params": 4 - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": -45.0, - "y": 70.0 - }, - "params": 2 - }, - { - "id": "Am2904", - "name": "Am2904#0", - "pos": { - "x": 20.0, - "y": 15.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Am2904#0", - "pinName": "C" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IZ" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IZ" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EZ" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EZ" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I_5_0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I1" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I3" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I5" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I6" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I7" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IC" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "IC" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I8" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I9" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I11" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I12" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I_6_9" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "I" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I_10" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I10" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I_11_12" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_SE" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_SE" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cx" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "Cx" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IN" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IN" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SIOn" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "SIOn" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "QIOn" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "QIOn" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "QIO0" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "QIO0" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SIO0" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "SIO0" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C0" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "C0" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "CT" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "CT" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_OECT" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OECT" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YOVR" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YOVR" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YN" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YN" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YC" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YC" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IOVR" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "IOVR" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YZ" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YZ" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_OEY" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OEY" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_CEM" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_CEM" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_CEmu" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_CEmu" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EC" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EC" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EN" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EN" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EOVR" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "default", - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "musr": { - "id": "delegating", - "params": { - "delegateTarget": "Am2904#0", - "prefix": "musr" - } - }, - "msr": { - "id": "delegating", - "params": { - "delegateTarget": "Am2904#0", - "prefix": "msr" - } - } - }, - "atomicHighLevelStates": {} - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java deleted file mode 100644 index b43f130e..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java +++ /dev/null @@ -1,293 +0,0 @@ -package net.mograsim.logic.model.am2900.am2904; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.util.SwitchWithDisplay; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; -import net.mograsim.logic.model.model.components.ModelComponent; - -public class TestableAm2904Impl implements TestableAm2904 -{ - - private ModelComponent am2904; - private CoreManualSwitch I_5_0; - private CoreManualSwitch I_6_9; - private CoreManualSwitch I_10; - private CoreManualSwitch I_11_12; - private CoreManualSwitch C; - private CoreManualSwitch Cx; - private CoreManualSwitch IC, IN, IOVR, IZ; - private CoreManualSwitch _CEM, _CEmu; - private CoreManualSwitch _EC, _EN, _EOVR, _EZ; - private CoreManualSwitch _OECT, _OEY; - private CoreManualSwitch _SE; - private CoreBitDisplay C0; - private CoreBitDisplay CT; - private SwitchWithDisplay SIO0, SIOn, QIO0, QIOn; - private SwitchWithDisplay YC, YN, YOVR, YZ; - - private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, - "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/am2904/TestableAm2904.json"); - - @Override - public void setup() - { - testHelper.setup(DebugState.NO_DEBUG); - } - - @Override - public Result run() - { - return testHelper.run(); - } - - @Override - public void clockOn(boolean isClockOn) - { - if (isClockOn) - C.switchFullOn(); - else - C.switchFullOff(); - } - - @Override - public void setInstruction(Am2904_Inst inst) - { - I_5_0.setState(BitVector.from(inst.ordinal(), 6)); - } - - @Override - public void setShiftCode(String val_4_bit) - { - I_6_9.setState(BitVector.parse(val_4_bit)); - } - - @Override - public void setI10(Am2904_ShiftDir dir) - { - I_10.setState(BitVector.from(dir.ordinal(), 1)); - } - - @Override - public void setCarry(Am2904_Carry carry) - { - I_11_12.setState(BitVector.from(carry.ordinal(), 2)); - } - - @Override - public void setCX(String val_1_bit) - { - Cx.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setY(String z_c_n_ovr) - { - var bv = BitVector.parse(z_c_n_ovr); - // correct order apparently unknown, most likely Z-C-N-OVR - YZ.setState(bv.getLSBit(3).toVector()); - YC.setState(bv.getLSBit(2).toVector()); - YN.setState(bv.getLSBit(1).toVector()); - YOVR.setState(bv.getLSBit(0).toVector()); - } - - @Override - public void setIZ(String val_1_bit) - { - IZ.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setIC(String val_1_bit) - { - IC.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setIOVR(String val_1_bit) - { - IOVR.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setIN(String val_1_bit) - { - IN.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_CEM(String val_1_bit) - { - _CEM.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_CEµ(String val_1_bit) - { - _CEmu.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_OEY(String val_1_bit) - { - _OEY.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_OECT(String val_1_bit) - { - _OECT.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_SE(String val_1_bit) - { - _SE.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_EZ(String val_1_bit) - { - _EZ.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_EC(String val_1_bit) - { - _EC.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_EOVR(String val_1_bit) - { - _EOVR.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_EN(String val_1_bit) - { - _EN.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setSIO0(String val_1_bit) - { - SIO0.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setSIO3(String val_1_bit) - { - SIOn.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setQIO0(String val_1_bit) - { - QIO0.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setQIO3(String val_1_bit) - { - QIOn.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setDirectly(Register r, String val_1_bit) - { - var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); - bv = bv.withBitChanged(r.ordinal() % 4, b -> Bit.parse(val_1_bit)); - am2904.setHighLevelState(regToStateID(r), bv); - } - - @Override - public void setDirectly(CompleteStatus r, String z_c_n_ovr) - { - am2904.setHighLevelState(regToStateID(r), BitVector.parse(z_c_n_ovr)); - } - - @Override - public String getC0() - { - return C0.getDisplayedValue().toString(); - } - - @Override - public String getCT() - { - return CT.getDisplayedValue().toString(); - } - - @Override - public String getY() - { - // correct order apparently unknown, most likely Z-C-N-OVR - var y3 = YZ.getDisplayedValue(); - var y2 = YC.getDisplayedValue(); - var y1 = YN.getDisplayedValue(); - var y0 = YOVR.getDisplayedValue(); - return y3.concat(y2).concat(y1).concat(y0).toString(); - } - - @Override - public String getSIO0() - { - return SIO0.getDisplayedValue().toString(); - } - - @Override - public String getSIO3() - { - return SIOn.getDisplayedValue().toString(); - } - - @Override - public String getQIO0() - { - return QIO0.getDisplayedValue().toString(); - } - - @Override - public String getQIO3() - { - return QIOn.getDisplayedValue().toString(); - } - - @Override - public String getDirectly(Register r) - { - var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); - return bv.getMSBit(r.ordinal() % 4).getSymbol(); - } - - @Override - public String getDirectly(CompleteStatus r) - { - var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); - return bv.toString(); - } - - private static String regToStateID(Register r) - { - if (r.ordinal() < 4) - return "musr.q"; - return "msr.q"; - } - - private static String regToStateID(CompleteStatus r) - { - if (r == CompleteStatus.micro) - return "musr.q"; - return "msr.q"; - } - - @Override - public TestEnvironmentHelper getTestEnvironmentHelper() - { - return testHelper; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Test.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Test.java deleted file mode 100644 index 18b2578d..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Test.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.mograsim.logic.model.am2900.am2910; - -import static net.mograsim.logic.model.am2900.am2910.TestableAm2910.Am2910_Inst.*; -import static net.mograsim.logic.core.types.Bit.*; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.am2910.TestableAm2910.Register; -import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; - -@DisplayName("Am2910 Tests") -@TestMethodOrder(OrderAnnotation.class) -public class Am2910Test -{ - private TestableAm2910 am2910 = new TestableAm2910Impl(); - - @RegisterExtension - DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2910); - - @BeforeEach - void initialize() - { - createAndSetup(); - setStandardInputs(); - } - - void createAndSetup() - { - am2910.setup(); - } - - void setStandardInputs() - { - am2910.set_CC("0"); - am2910.set_CCEN("0"); - am2910.set_OE("0"); - am2910.set_RLD("1"); - am2910.setCI("1"); - am2910.setD("000000000000"); - am2910.setInstruction(JZ); - am2910.clockOn(true); - am2910.assertRunSuccess(); - } - - @ParameterizedTest(name = "{0}") - @Order(1) - @DisplayName("Direct / high level access") - @EnumSource(Register.class) - void testDirectAccess(Register r) - { - String us = U.toVector(r.size()).toString(); - String three = BitVector.from(3, r.size()).toString(); - - assertEquals(us, am2910.getDirectly(r)); - - am2910.setDirectly(r, three); - - assertEquals(three, am2910.getDirectly(r)); - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java deleted file mode 100644 index 59ac5b14..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.mograsim.logic.model.am2900.am2910; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelClock; -import net.mograsim.logic.model.model.components.atomic.ModelClock.ModelClockParams; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class Am2910Testbench -{ - public static void main(String[] args) - { - Am2900Loader.setup(); - SimpleLogicUIStandalone.executeVisualisation(Am2910Testbench::create, Am2910Testbench::beforeRun); - } - - @SuppressWarnings("unused") // for ModelWires being created - public static void create(LogicModelModifiable model) - { - ModelComponent am2910 = IndirectModelComponentCreator.createComponent(model, "Am2910", "Am2910"); - ModelClock C = new ModelClock(model, new ModelClockParams(1000, Orientation.RIGHT)); - ModelManualSwitch D = new ModelManualSwitch(model, 12, "D"); - ModelManualSwitch _RLD = new ModelManualSwitch(model, 1, "_RLD"); - ModelManualSwitch _CC = new ModelManualSwitch(model, 1, "_CC"); - ModelManualSwitch _CCEN = new ModelManualSwitch(model, 1, "_CCEN"); - ModelManualSwitch I = new ModelManualSwitch(model, 4, "I"); - ModelManualSwitch CI = new ModelManualSwitch(model, 1, "CI"); - ModelManualSwitch _OE = new ModelManualSwitch(model, 1, "_OE"); - ModelBitDisplay _FULL = new ModelBitDisplay(model, 1, "_FULL"); - ModelBitDisplay _PL = new ModelBitDisplay(model, 1, "_PL"); - ModelBitDisplay _MAP = new ModelBitDisplay(model, 1, "_MAP"); - ModelBitDisplay _VECT = new ModelBitDisplay(model, 1, "_VECT"); - ModelBitDisplay Y = new ModelBitDisplay(model, 12, "Y"); - - C.moveTo(35, -35); - D.moveTo(10, -20); - _RLD.moveTo(-30, -1.5); - _CC.moveTo(-30, 20); - _CCEN.moveTo(-30, 40); - I.moveTo(-30, 60); - CI.moveTo(75, 45); - _FULL.moveTo(80, 6.5); - _PL.moveTo(30, 85); - _MAP.moveTo(30, 105); - _VECT.moveTo(30, 125); - Y.moveTo(40, 65); - _OE.moveTo(60, 85); - - new ModelWire(model, C.getOutputPin(), am2910.getPin("C"), new Point(60, -27.5)); - new ModelWire(model, D.getOutputPin(), am2910.getPin("D"), new Point(36, -12.5)); - new ModelWire(model, _RLD.getOutputPin(), am2910.getPin("_RLD"), new Point[0]); - new ModelWire(model, _CC.getOutputPin(), am2910.getPin("_CC")); - new ModelWire(model, _CCEN.getOutputPin(), am2910.getPin("_CCEN")); - new ModelWire(model, I.getOutputPin(), am2910.getPin("I")); - new ModelWire(model, CI.getOutputPin(), am2910.getPin("CI"), new Point(100, 52.5), new Point(100, 40)); - new ModelWire(model, am2910.getPin("_FULL"), _FULL.getInputPin(), new Point[0]); - new ModelWire(model, am2910.getPin("_PL"), _PL.getInputPin(), new Point(13, 92.5)); - new ModelWire(model, am2910.getPin("_MAP"), _MAP.getInputPin(), new Point(19, 112.5)); - new ModelWire(model, am2910.getPin("_VECT"), _VECT.getInputPin(), new Point(25, 132.5)); - new ModelWire(model, am2910.getPin("Y"), Y.getInputPin(), new Point(38, 72.5)); - new ModelWire(model, am2910.getPin("_OE"), _OE.getOutputPin()); - } - - public static void beforeRun(VisualisationObjects vis) - { - vis.model.getComponentsByName().values().forEach(c -> - { - if (c instanceof ModelManualSwitch) - { - ModelManualSwitch cCasted = (ModelManualSwitch) c; - cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); - } - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java deleted file mode 100644 index 5290c5a6..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.mograsim.logic.model.am2900.am2910; - -import java.util.Arrays; -import java.util.stream.Stream; - -import net.mograsim.logic.model.am2900.TestableCircuit; - -public interface TestableAm2910 extends TestableCircuit -{ - - void setInstruction(Am2910_Inst inst); - - void set_CCEN(String val_1_bit); - - void setD(String val_12_bit); - - void set_CC(String val_1_bit); - - void setCI(String val_1_bit); - - void set_RLD(String val_1_bit); - - void set_OE(String val_1_bit); - - void setDirectly(Register r, String val_X_bit); - - String getY(); - - String get_FULL(); - - String get_PL(); - - String get_MAP(); - - String get_VECT(); - - String getDirectly(Register r); - - enum Am2910_Inst - { - JZ, CJS, JMAP, CJP, PUSH, JSRP, CJV, JRP, RFCT, RPCT, CRTN, CJPP, LDCT, LOOP, CONT, TWB; - } - - enum Register - { - S_0, S_1, S_2, S_3, S_4, SP, PC, REG_COUNT; - - public static Stream stream() - { - return Arrays.stream(values()); - } - - public int size() - { - if (this == SP) - return 3; - return 12; - } - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java deleted file mode 100644 index 48b85698..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java +++ /dev/null @@ -1,159 +0,0 @@ -package net.mograsim.logic.model.am2900.am2910; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; -import net.mograsim.logic.model.model.components.ModelComponent; - -public class TestableAm2910Impl implements TestableAm2910 -{ - - private ModelComponent am2901; - private CoreManualSwitch I; - private CoreManualSwitch C; - private CoreManualSwitch CI; - private CoreManualSwitch D; - private CoreManualSwitch _CC; - private CoreManualSwitch _CCEN; - private CoreManualSwitch _RLD; - private CoreManualSwitch _OE; - private CoreBitDisplay _FULL; - private CoreBitDisplay Y; - private CoreBitDisplay _PL, _MAP, _VECT; - - private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "Am2910"); - - @Override - public void setup() - { - testHelper.setup(DebugState.NO_DEBUG); - } - - @Override - public Result run() - { - return testHelper.run(); - } - - @Override - public void clockOn(boolean isClockOn) - { - if (isClockOn) - C.switchFullOn(); - else - C.switchFullOff(); - } - - @Override - public void setInstruction(Am2910_Inst inst) - { - I.setState(BitVector.from(inst.ordinal(), 4)); - } - - @Override - public void set_CCEN(String val_1_bit) - { - _CCEN.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setD(String val_12_bit) - { - D.setState(BitVector.parse(val_12_bit)); - } - - @Override - public void set_CC(String val_1_bit) - { - _CC.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setCI(String val_1_bit) - { - CI.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_RLD(String val_1_bit) - { - _RLD.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_OE(String val_1_bit) - { - _OE.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setDirectly(Register r, String val_X_bit) - { - am2901.setHighLevelState(regToStateID(r), BitVector.parse(val_X_bit)); - } - - @Override - public String getY() - { - return Y.getDisplayedValue().toString(); - } - - @Override - public String get_FULL() - { - return _FULL.getDisplayedValue().toString(); - } - - @Override - public String get_PL() - { - return _PL.getDisplayedValue().toString(); - } - - @Override - public String get_MAP() - { - return _MAP.getDisplayedValue().toString(); - } - - @Override - public String get_VECT() - { - return _VECT.getDisplayedValue().toString(); - } - - @Override - public String getDirectly(Register r) - { - return am2901.getHighLevelState(regToStateID(r)).toString(); - } - - private static String regToStateID(Register r) - { - switch (r) - { - case S_0: - case S_1: - case S_2: - case S_3: - case S_4: - return "stack.c" + BitVector.from(r.ordinal(), 3); - case SP: - return "sp.q"; - case PC: - return "mupc.q"; - case REG_COUNT: - return "r.q"; - default: - throw new IllegalArgumentException("unknown: " + r); - } - } - - @Override - public TestEnvironmentHelper getTestEnvironmentHelper() - { - return testHelper; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java deleted file mode 100644 index 3f68c67e..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.mograsim.logic.model.am2900.util; - -import java.util.Objects; - -import org.junit.jupiter.api.extension.AfterTestExecutionCallback; -import org.junit.jupiter.api.extension.ExtensionContext; - -import net.mograsim.logic.model.am2900.TestableCircuit; - -public class DisplayStateOnFailure implements AfterTestExecutionCallback -{ - public static final boolean ACTIVE = true; - - private final TestableCircuit circuitUnderTest; - - public DisplayStateOnFailure(TestableCircuit circuitUnderTest) - { - this.circuitUnderTest = Objects.requireNonNull(circuitUnderTest); - } - - @Override - public void afterTestExecution(ExtensionContext context) throws Exception - { - if (ACTIVE && context.getExecutionException().isPresent()) - { - context.getExecutionException().get().printStackTrace(); - circuitUnderTest.displayState(); - } - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java deleted file mode 100644 index c085c52e..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.mograsim.logic.model.am2900.util; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.util.ModellingTool; - -public class SwitchWithDisplay -{ - private final Pin pin; - private final ModelBitDisplay modelBitDisplay; - private final ModelManualSwitch modelManualSwitch; - - public SwitchWithDisplay(LogicModelModifiable model, Pin target) - { - pin = target; - modelBitDisplay = new ModelBitDisplay(model, pin.logicWidth); - modelManualSwitch = new ModelManualSwitch(model, pin.logicWidth); - - ModellingTool tool = ModellingTool.createFor(model); - ModelWireCrossPoint crossPoint = new ModelWireCrossPoint(model, pin.logicWidth); - tool.connect(modelBitDisplay.getInputPin(), crossPoint); - tool.connect(modelManualSwitch.getOutputPin(), crossPoint); - } - - public final BitVector getDisplayedValue() - { - return modelBitDisplay.getBitDisplay().getDisplayedValue(); - } - - public final void setState(BitVector bits) - { - modelManualSwitch.getManualSwitch().setState(bits); - } - - public final Pin getPin() - { - return pin; - } - - public final CoreBitDisplay getBitDisplay() - { - return modelBitDisplay.getBitDisplay(); - } - - public final CoreManualSwitch getManualSwitch() - { - return modelManualSwitch.getManualSwitch(); - } - - final ModelBitDisplay getModelBitDisplay() - { - return modelBitDisplay; - } - - final ModelManualSwitch getModelManualSwitch() - { - return modelManualSwitch; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java deleted file mode 100644 index 4bae8ec5..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java +++ /dev/null @@ -1,276 +0,0 @@ -package net.mograsim.logic.model.am2900.util; - -import static org.junit.jupiter.api.Assertions.fail; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Objects; -import java.util.Optional; -import java.util.Queue; -import java.util.Set; -import java.util.TreeSet; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.model.LogicUIStandaloneGUI; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.am2900.TestableCircuit; -import net.mograsim.logic.model.am2900.TestableCircuit.Result; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.ModellingTool; - -public class TestEnvironmentHelper -{ - private final TestableCircuit testEnvInstance; - private final Class testEnvClass; - private final String modelId; - private Field componentField; - private Optional timelineField = Optional.empty(); - - private ModelComponent component; - private Timeline timeline; - private LogicModelModifiable logicModel; - private ModellingTool modellingTool; - private HashMap idSwitchMap = new HashMap<>(); - private HashMap idDisplayMap = new HashMap<>(); - - private DebugState debug = DebugState.NO_DEBUG; - private Set wireDebugChangeSet; - private boolean debugWires = false; - public int debugEventThreshold = 10_000; - public int debugEventCount = 500; - private int eventCounter; - - public TestEnvironmentHelper(TestableCircuit testEnv, String modelId) - { - this.testEnvInstance = testEnv; - this.modelId = modelId; - this.testEnvClass = testEnvInstance.getClass(); - for (Field f : testEnvClass.getDeclaredFields()) - { - if (ModelComponent.class.isAssignableFrom(f.getType())) - { - componentField = f; - componentField.setAccessible(true); - } else if (Timeline.class.isAssignableFrom(f.getType())) - { - f.setAccessible(true); - timelineField = Optional.of(f); - } - } - if (componentField == null) - throw new IllegalStateException("No component or timeline field found!"); - } - - public void setup(DebugState debug) - { - this.debug = debug; - // Create logic model - logicModel = new LogicModelModifiable(); - modellingTool = ModellingTool.createFor(logicModel); - Am2900Loader.setup(); - component = IndirectModelComponentCreator.createComponent(logicModel, modelId); - setField(componentField, component); - - component.getPins().values().forEach(this::extendModelPin); - - // Create core model - CoreModelParameters params = new CoreModelParameters(); - params.gateProcessTime = 50; - params.wireTravelTime = 10; - timeline = LogicCoreAdapter.convert(logicModel, params); - timelineField.ifPresent(f -> setField(f, timeline)); - - // Bind switches/displays to this test class - component.getPins().values().forEach(this::bindModelPin); - - if (debug == DebugState.DEBUG_AT_PERFORMANCE_COST) - { - setupDebugging(); - } - timeline.addEventAddedListener(te -> eventCounter++); - } - - private void extendModelPin(Pin p) - { - String javaIdentId = idToJavaIdentifier(p.name); - try - { - Field f = testEnvClass.getDeclaredField(javaIdentId); - Class type = f.getType(); - if (CoreManualSwitch.class.isAssignableFrom(type)) - { - ModelManualSwitch gms = new ModelManualSwitch(logicModel, p.logicWidth); - modellingTool.connect(p, gms.getOutputPin()); - idSwitchMap.put(p.name, gms); - } else if (CoreBitDisplay.class.isAssignableFrom(type)) - { - ModelBitDisplay gbd = new ModelBitDisplay(logicModel, p.logicWidth); - modellingTool.connect(p, gbd.getInputPin()); - idDisplayMap.put(p.name, gbd); - } else if (SwitchWithDisplay.class.isAssignableFrom(type)) - { - SwitchWithDisplay swd = new SwitchWithDisplay(logicModel, p); - setField(f, swd); - } else - { - fail("unkown field type " + type); - } - } - catch (NoSuchFieldException | SecurityException e) - { - fail(e); - } - } - - private void bindModelPin(Pin p) - { - String javaIdentId = idToJavaIdentifier(p.name); - if (idDisplayMap.containsKey(p.name)) - setField(javaIdentId, idDisplayMap.get(p.name).getBitDisplay()); - if (idSwitchMap.containsKey(p.name)) - setField(javaIdentId, idSwitchMap.get(p.name).getManualSwitch()); - } - - private void setupDebugging() - { - // Debug code - HashSet wiresIncludingSubmodels = new HashSet<>(); - Queue modelsToIterate = new LinkedList<>(); - modelsToIterate.add(logicModel); - while (modelsToIterate.size() > 0) - { - LogicModel model = modelsToIterate.poll(); - wiresIncludingSubmodels.addAll(model.getWiresByName().values()); - for (ModelComponent comp : model.getComponentsByName().values()) - if (comp instanceof SubmodelComponent) - modelsToIterate.offer(((SubmodelComponent) comp).submodel); - } - System.out.println(wiresIncludingSubmodels.size()); - logicModel.setRedrawHandler(() -> wiresIncludingSubmodels.forEach(w -> - { - if (debugWires) - { - wireDebugChangeSet.add(w.toString()); - } - })); - } - - public Result run() - { - // Normal execution until completion or eventLimit - int eventLimit = debugEventThreshold; - eventCounter = 0; - debugWires = false; - while (eventCounter < eventLimit) - { - timeline.executeNext(); - if (!timeline.hasNext()) - return Result.SUCCESS; - } - - // Start debugging if event limit is reached (if debug is active) - if (debug == DebugState.DEBUG_AT_PERFORMANCE_COST) - return debugThisRun(); - - return Result.OUT_OF_TIME; - } - - private Result debugThisRun() - { - int eventLimit = debugEventThreshold; - debugWires = true; - wireDebugChangeSet = new TreeSet<>(); - Set oldChangeSet; - // observe wire changes to detect, if we are really stuck in an endless loop - do - { - eventLimit += debugEventCount; - oldChangeSet = wireDebugChangeSet; - wireDebugChangeSet = new TreeSet<>(); - while (eventCounter < eventLimit) - { - timeline.executeNext(); - if (!timeline.hasNext()) - { - // no endless loop, but more events needed than expected - System.out.println("run() took longer than expected: " + eventCounter); - return Result.SUCCESS; - } - } - } while (!oldChangeSet.equals(wireDebugChangeSet)); - // if stuck, abort execution and print wires - System.err.print("Problematic Wire updates:"); - wireDebugChangeSet.forEach(System.out::println); - System.err.println("run() failed: " + eventCounter); - return Result.OUT_OF_TIME; - } - - private static String idToJavaIdentifier(String s) - { - StringBuilder sb = new StringBuilder(s.length()); - char c = s.charAt(0); - sb.append(Character.isJavaIdentifierStart(c) ? c : '_'); - for (int i = 1; i < s.length(); i++) - sb.append(Character.isJavaIdentifierPart(c = s.charAt(i)) ? c : '_'); - return sb.toString(); - } - - private void setField(Field f, S value) - { - try - { - f.setAccessible(true); - f.set(testEnvInstance, Objects.requireNonNull(value)); - } - catch (Exception e) - { - fail(e); - } - } - - private void setField(String name, S value) - { - try - { - Field f = testEnvClass.getDeclaredField(name); - f.setAccessible(true); - f.set(testEnvInstance, Objects.requireNonNull(value)); - } - catch (Exception e) - { - fail(e); - } - } - - public void displayState() - { - try - { - new LogicUIStandaloneGUI(logicModel).run(); - logicModel.setRedrawHandler(null); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - public enum DebugState - { - NO_DEBUG, DEBUG_AT_PERFORMANCE_COST; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestUtil.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestUtil.java deleted file mode 100644 index 5989dfbe..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestUtil.java +++ /dev/null @@ -1,100 +0,0 @@ -package net.mograsim.logic.model.am2900.util; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; - -public final class TestUtil -{ - private TestUtil() - { - - } - - /** - * Transforms the last four bits of an int to a string that contains the binary ('1' and '0') representation of the 4 bits - * - * @author Christian Femers - */ - public static String to4bitBin(int x) - { - StringBuilder sb = new StringBuilder(4); - sb.append((x & 0b1000) == 0 ? '0' : '1'); - sb.append((x & 0b0100) == 0 ? '0' : '1'); - sb.append((x & 0b0010) == 0 ? '0' : '1'); - sb.append((x & 0b0001) == 0 ? '0' : '1'); - return sb.toString(); - } - - /** - * Transforms the given boolean to a string that contains the binary ('1' and '0') representation of the bit - * - * @author Christian Femers - */ - public static String to1bitBin(boolean bitIsSet) - { - return bitIsSet ? "1" : "0"; - } - - /** - * Transforms the given int to a string that contains the binary ('1' and '0') representation of the int. "0" is only returned when the - * int is equal to zero. - * - * @author Christian Femers - */ - public static String to1bitBin(int someInt) - { - return someInt != 0 ? "1" : "0"; - } - - /** - * Transforms a 4 bit signed integer (-8 to 7) to a int representing the same number. (Adding leading 1-bits if the 4 bit int is - * negative) - * - * @author Christian Femers - */ - public static int signed4ToSigned32(int signed4bit) - { - if ((signed4bit & 0b1000) > 0) - return signed4bit | 0xFF_FF_FF_F0; - return signed4bit & 0x00_00_00_0F; - } - - /** - * Transforms a 16 bit signed integer (-32768 to 32767 - a short) to a int representing the same number. (Adding leading 1-bits if the - * 16 bit int is negative) - * - * @author Christian Femers - */ - public static int signed16ToSigned32(int signed16bit) - { - return (short) signed16bit; - } - - /** - * Transforms the last n bits of an int to a string that contains the binary ('1' and '0') representation of the n bits - * - * @author Christian Femers - */ - public static String toNbitString(int x, int n) - { - StringBuilder sb = new StringBuilder(n); - for (int i = 0; i < n; i++) - { - sb.append((x >> i) & 1); - } - return sb.reverse().toString(); - } - - public static BitVector of(int value, int length) - { - BitVectorMutator mutator = BitVectorMutator.ofLength(length); - int val = value; - for (int i = length - 1; i >= 0; i--) - { - mutator.setMSBit(i, Bit.lastBitOf(val)); - val >>>= 1; - } - return mutator.toBitVector(); - } -} diff --git a/net.mograsim.logic.model.editor/.classpath b/net.mograsim.logic.model.editor/.classpath deleted file mode 100644 index c4b0fff7..00000000 --- a/net.mograsim.logic.model.editor/.classpath +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.logic.model.editor/.gitignore b/net.mograsim.logic.model.editor/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.logic.model.editor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.logic.model.editor/.project b/net.mograsim.logic.model.editor/.project deleted file mode 100644 index 4f792a69..00000000 --- a/net.mograsim.logic.model.editor/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.logic.model.editor - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs b/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF b/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF deleted file mode 100644 index 283c286d..00000000 --- a/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF +++ /dev/null @@ -1,16 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Editor -Bundle-SymbolicName: net.mograsim.logic.model.editor -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.logic.model.editor, - net.mograsim.logic.model.editor.handles, - net.mograsim.logic.model.editor.states, - net.mograsim.logic.model.editor.ui, - net.mograsim.logic.model.editor.util -Require-Bundle: net.mograsim.logic.model;bundle-version="0.1.0", - net.mograsim.preferences;bundle-version="0.1.0", - net.mograsim.logic.model.am2900;bundle-version="0.1.0" -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Automatic-Module-Name: net.mograsim.logic.model.editor -Bundle-Vendor: Mograsim Team diff --git a/net.mograsim.logic.model.editor/build.properties b/net.mograsim.logic.model.editor/build.properties deleted file mode 100644 index d1763276..00000000 --- a/net.mograsim.logic.model.editor/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - .,\ \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java deleted file mode 100644 index 90baafb5..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java +++ /dev/null @@ -1,253 +0,0 @@ -package net.mograsim.logic.model.editor; - -import java.util.HashSet; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonParser; -import com.google.gson.JsonSyntaxException; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.editor.handles.ComponentHandle; -import net.mograsim.logic.model.editor.handles.Handle; -import net.mograsim.logic.model.editor.handles.HandleManager; -import net.mograsim.logic.model.editor.handles.PinHandle; -import net.mograsim.logic.model.editor.states.StateManager; -import net.mograsim.logic.model.editor.ui.DialogManager; -import net.mograsim.logic.model.editor.ui.EditorGUI; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer; - -public final class Editor -{ - final Selection selection = new Selection(); - final Set copyBuffer = new HashSet<>(); - public final DeserializedSubmodelComponent toBeEdited; - public final HandleManager handleManager; - public final EditorGUI gui; - public final StateManager stateManager; - private final SaveLoadManager saveManager; - private Snapping snapping = Snapping.ABSOLUTE; - private double snapX = 5, snapY = 5; - public final DialogManager dialogManager; - public final EditorUserInput userInput; - - public Editor(DeserializedSubmodelComponent toBeEdited) - { - this.toBeEdited = toBeEdited; - handleManager = new HandleManager(this); - gui = new EditorGUI(this); - userInput = new EditorUserInput(this); - stateManager = new StateManager(this); - handleManager.init(); - saveManager = new SaveLoadManager(this); - dialogManager = new DialogManager(gui.shell); - - gui.open(); - } - - public LogicModelModifiable getSubmodel() - { - return toBeEdited.getSubmodelModifiable(); - } - - public Selection getSelection() - { - return selection; - } - - // TODO: Remove this error prone method: Relative offset may change between multiple moves, - // because Handles have different ways of responding to reqMove(...), causing strange behaviour - @Deprecated - public void moveSelection(double x, double y) - { - Point ref = selection.getTopLeft(); - Point snapped = new Point(x, y); - applySnapping(snapped); - - for (Handle c : selection) - { - double newX, newY; - newX = snapped.x + c.getPosX() - ref.x; - newY = snapped.y + c.getPosY() - ref.y; - c.reqMove(newX, newY); - } - } - - public void moveHandles(double x, double y, Map handleOffsetMap) - { - Point snapped = new Point(x, y); - applySnapping(snapped); - - for (Handle c : handleOffsetMap.keySet()) - { - Point offset = handleOffsetMap.get(c); - double newX, newY; - newX = snapped.x + offset.x; - newY = snapped.y + offset.y; - c.reqMove(newX, newY); - } - } - - public void deleteSelection() - { - selection.forEach(h -> h.reqDelete()); - selection.clear(); - } - - public void copy() - { - copyBuffer.clear(); - Point refPoint = selection.getTopLeft(); - for (Handle h : selection) - { - Optional cInfo = h.reqCopy(refPoint); - if (cInfo.isPresent()) - copyBuffer.add(cInfo.get()); - } - } - - public void paste(double x, double y) - { - selection.clear(); - for (ComponentInfo info : copyBuffer) - { - ModelComponent comp = addComponent(info.identifier, info.params); - ComponentHandle h = handleManager.getHandle(comp); - h.reqMove(info.relX, info.relY); - selection.add(h); - } - moveSelection(x, y); - } - - public void save() - { - saveManager.save(); - } - - public void saveAs() - { - saveManager.openSaveAsDialog(); - } - - public void addComponent(double x, double y) - { - boolean successful = false; - JsonElement params = JsonNull.INSTANCE; - outer: while (!successful) - { - String selected = gui.getAddListSelected(); - try - { - ModelComponent c = addComponent(selected, params); - selection.clear(); - selection.add(handleManager.getHandle(c)); - moveSelection(x, y); - successful = true; - } - catch (@SuppressWarnings("unused") UnsupportedOperationException | JsonSyntaxException | NumberFormatException - | NullPointerException e) - { - String result = DialogManager.openMultiLineTextDialog("Add component", "Create", "Cancel", "Parameters:"); - if (result == null) - break outer; - params = new JsonParser().parse(result); - } - } - } - - private ModelComponent addComponent(String identifier, JsonElement params) - { - return IndirectModelComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier, params); - } - - public void duplicate() - { - copy(); - Point origin = selection.getTopLeft(); - paste(origin.x + 20, origin.y + 20); - } - - private void applySnapping(Point newP) - { - switch (snapping) - { - case OFF: - break; - case ABSOLUTE: - newP.x = (int) (newP.x / snapX + .5) * snapX; - newP.y = (int) (newP.y / snapY + .5) * snapY; - break; - default: - break; - } - } - - public static class ComponentInfo - { - public final double relX, relY; - public final String identifier; - public final JsonElement params; - - public ComponentInfo(double relX, double relY, String identifier, JsonElement params) - { - this.relX = relX; - this.relY = relY; - this.identifier = identifier; - this.params = params; - } - } - - @SuppressWarnings("unused") - public void addWire(PinHandle a, PinHandle b) - { - new ModelWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]); - } - - public static enum Snapping - { - OFF, ABSOLUTE; - - @Override - public String toString() - { - return super.toString().toLowerCase(); - } - } - - public static void main(String[] args) - { - Am2900Loader.setup(); - openNewEditor(); -// SaveLoadManager.openLoadDialog(); - } - - public static void openNewEditor() - { - DeserializedSubmodelComponent toBeEdited = new DeserializedSubmodelComponent(new LogicModelModifiable(), null, null, null); - toBeEdited.setOutlineRenderer(new DefaultOutlineRenderer(toBeEdited)); - toBeEdited.setSymbolRenderer(new DefaultSymbolRenderer(toBeEdited)); - toBeEdited.setHighLevelStateHandler(new DefaultHighLevelStateHandler()); - new Editor(toBeEdited); - } - - public Snapping getSnapping() - { - return snapping; - } - - public void setSnapping(Snapping snapping) - { - this.snapping = snapping; - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java deleted file mode 100644 index feae04f3..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java +++ /dev/null @@ -1,111 +0,0 @@ -package net.mograsim.logic.model.editor; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.ui.EditorGUI; - -public class EditorUserInput -{ - private final EditorGUI gui; - - public EditorUserInput(Editor editor) - { - this.gui = editor.gui; - gui.logicCanvas.addMouseListener(new MouseListener() - { - @Override - public void mouseDoubleClick(MouseEvent e) - { - // TODO Auto-generated method stub - } - - @Override - public void mouseDown(MouseEvent e) - { - Point clicked = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y); - switch (e.button) - { - case 1: - editor.handleManager.click(clicked, e.stateMask); - break; - } - - } - - @Override - public void mouseUp(MouseEvent e) - { - } - }); - - gui.logicCanvas.addMouseMoveListener((e) -> - { - Point dest = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y); - editor.stateManager.mouseMoved(dest.x, dest.y); - }); - - gui.logicCanvas.addKeyListener(new KeyListener() - { - - @Override - public void keyReleased(KeyEvent e) - { - // TODO Auto-generated method stub - - } - - @Override - public void keyPressed(KeyEvent e) - { - switch (e.keyCode) - { - case 'c': - if ((e.stateMask & SWT.CTRL) == SWT.CTRL) - editor.stateManager.copy(); - break; - case 'v': - if ((e.stateMask & SWT.CTRL) == SWT.CTRL) - editor.stateManager.paste(); - break; - case 'd': - if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) - editor.stateManager.duplicate(); - break; - case 'g': - editor.stateManager.grab(); - break; - case 'r': - editor.stateManager.delete(); - break; - case 's': - if ((e.stateMask & SWT.CTRL) == SWT.CTRL) - editor.save(); - break; - case 'a': - if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) - editor.stateManager.add(); - break; - case 'h': - editor.stateManager.boxSelect(); - break; - } - - } - }); - } - - public Point getCanvasMousePosition() - { - return new Point(gui.logicCanvas.toControl(gui.display.getCursorLocation())); - } - - public Point getWorldMousePosition() - { - return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition()); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java deleted file mode 100644 index bbe202b1..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.mograsim.logic.model.editor; - -import java.io.IOException; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Shell; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; - -public class SaveLoadManager -{ - private String savePath = null; - private Editor editor; - - public SaveLoadManager(Editor editor) - { - this.editor = editor; - } - - public void save() - { - if (savePath == null) - openSaveAsDialog(); - else - innerSave(); - } - - public void openSaveAsDialog() - { - Shell fdShell = new Shell(); - FileDialog fd = new FileDialog(fdShell, SWT.SAVE); - fd.setText("Save as..."); - fd.setFilterExtensions(new String[] { "*.json" }); - String result = fd.open(); - fdShell.dispose(); - if (result != null) - { - savePath = result; - innerSave(); - } - } - - private void innerSave() - { - try - { - SubmodelComponentSerializer.serialize(editor.toBeEdited, savePath); - } - catch (IOException e) - { - savePath = null; - System.err.println("Failed to save component!"); - e.printStackTrace(); - } - } - - public static void openLoadDialog() throws IOException - { - Shell fdShell = new Shell(); - FileDialog fd = new FileDialog(fdShell, SWT.OPEN); - fd.setText("Load component..."); - fd.setFilterExtensions(new String[] { "*.json" }); - String result = fd.open(); - fdShell.dispose(); - if (result != null) - { - new Editor((DeserializedSubmodelComponent) IndirectModelComponentCreator.createComponent(new LogicModelModifiable(), - "jsonfile:" + result)); - } - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java deleted file mode 100644 index bc225eb7..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java +++ /dev/null @@ -1,132 +0,0 @@ -package net.mograsim.logic.model.editor; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.function.DoubleBinaryOperator; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.editor.handles.Handle; - -public class Selection implements Iterable -{ - private Set selection = new HashSet<>(); - - public Map calculateOffsets() - { - Map offsets = new HashMap<>(); - Point ref = getTopLeft(); - selection.forEach(h -> offsets.put(h, new Point(h.getPosX() - ref.x, h.getPosY() - ref.y))); - return offsets; - } - - public Rectangle getBounds() - { - Point pos1 = getTopLeft(); - Point pos2 = getBottomRight(); - return new Rectangle(pos1.x, pos1.y, pos2.x - pos1.x, pos2.y - pos1.y); - } - - public double getWidth() - {// TODO: Compute this more efficiently - return getTopRight().x - getTopLeft().x; - } - - public double getHeight() - { - return getBottomLeft().y - getTopLeft().y; - } - - public Point getTopLeft() - { - return getCorner(Double.MAX_VALUE, Double::min, r -> 0, Double.MAX_VALUE, Double::min, r -> 0); - } - - public Point getTopRight() - { - return getCorner(-Double.MAX_VALUE, Double::max, r -> r.width, Double.MAX_VALUE, Double::min, r -> 0); - } - - public Point getBottomLeft() - { - return getCorner(Double.MAX_VALUE, Double::min, r -> 0, -Double.MAX_VALUE, Double::max, r -> r.height); - } - - public Point getBottomRight() - { - return getCorner(-Double.MAX_VALUE, Double::max, r -> r.width, -Double.MAX_VALUE, Double::max, r -> r.height); - } - - public Point getCorner(double xIdentity, DoubleBinaryOperator xOp, Offset xOffset, double yIdentity, DoubleBinaryOperator yOp, - Offset yOffset) - { - double x = xIdentity, y = yIdentity; - for (Handle c : selection) - { - Rectangle bounds = c.getBounds(); - x = xOp.applyAsDouble(x, bounds.x + xOffset.computeOffset(bounds)); - y = yOp.applyAsDouble(y, bounds.y + yOffset.computeOffset(bounds)); - } - return new Point(x, y); - } - - private static interface Offset - { - public double computeOffset(Rectangle bounds); - } - - public void add(Handle h) - { - selection.add(h); - h.onSelect(); - } - - public void remove(Handle h) - { - selection.remove(h); - h.onDeselect(); - } - - public void clear() - { - selection.forEach(h -> h.onDeselect()); - selection.clear(); - } - - public int size() - { - return selection.size(); - } - - public boolean contains(Handle h) - { - return selection.contains(h); - } - - public void addAll(Collection handles) - { - handles.forEach(h -> h.onSelect()); - selection.addAll(handles); - } - - @Override - public Iterator iterator() - { - return selection.iterator(); - } - - @Override - public String toString() - { - return selection.toString(); - } - - public boolean isEmpty() - { - return selection.isEmpty(); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java deleted file mode 100644 index 14868e94..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java +++ /dev/null @@ -1,107 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import java.util.Optional; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.editor.Editor.ComponentInfo; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; - -public class ComponentHandle extends Handle -{ - private final LogicModelModifiable model; - public final ModelComponent parent; - private final static double POS_OFFSET = 2.0d; - private final static double LENGTH_OFFSET = POS_OFFSET * 2; - boolean selected = false; - - public ComponentHandle(LogicModelModifiable model, ModelComponent parent) - { - super(4); - this.model = model; - this.parent = parent; - Rectangle bounds = parent.getBounds(); - setSize(bounds.width, bounds.height); - parent.addComponentResizedListener((c) -> - { - Rectangle pBounds = c.getBounds(); - setSize(pBounds.width, pBounds.height); - }); - moveTo(parent.getPosX(), parent.getPosY()); - } - - @Override - protected void moveTo(double x, double y) - { - super.moveTo(x, y); - parent.moveTo(x, y); - } - - @Override - protected void render(GeneralGC gc) - { - if (selected) - { - gc.setLineWidth(2); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); - Rectangle bounds = getBounds(); - bounds.x -= POS_OFFSET; - bounds.y -= POS_OFFSET; - bounds.width += LENGTH_OFFSET; - bounds.height += LENGTH_OFFSET; - gc.drawRectangle(bounds); - Font oldFont = gc.getFont(); - gc.setFont(new Font(oldFont.getName(), 5, oldFont.getStyle())); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)); - gc.drawText(parent.getName(), bounds.x, bounds.y, true); - gc.setFont(oldFont); - } - } - - @Override - public void reqMove(double x, double y) - { - moveTo(x, y); - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - public void reqDelete() - { - model.destroyComponent(parent); - } - - @Override - public Optional reqCopy(Point refPoint) - { - IdentifyParams idParams = new IdentifyParams(); - return Optional.of(new ComponentInfo(parent.getPosX() - refPoint.x, parent.getPosY() - refPoint.y, - parent.getIDForSerializing(idParams), parent.getParamsForSerializingJSON(idParams))); - } - - @Override - public HandleType getType() - { - return HandleType.COMPONENT; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java deleted file mode 100644 index 959fb896..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; - -public class CornerHandle extends Handle -{ - private final static int LENGTH = 5; - private final DeserializedSubmodelComponent toBeEdited; - private boolean selected; - - public CornerHandle(DeserializedSubmodelComponent toBeEdited) - { - super(0); - this.toBeEdited = toBeEdited; - setSize(LENGTH, LENGTH); - initPos(); - } - - @Override - protected void render(GeneralGC gc) - { - gc.setBackground(Display.getCurrent().getSystemColor(selected ? SWT.COLOR_YELLOW : SWT.COLOR_DARK_GREEN)); - gc.fillRectangle(getPosX(), getPosY(), LENGTH, LENGTH); - } - - private void initPos() - { - Rectangle bounds = toBeEdited.getBounds(); - double subScale = toBeEdited.getSubmodelScale(); - moveTo(bounds.width / subScale, bounds.height / subScale); - } - - @Override - public void reqMove(double x, double y) - { - moveTo(x, y); - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - protected void moveTo(double x, double y) - { - super.moveTo(x, y); - double subScale = toBeEdited.getSubmodelScale(); - toBeEdited.setSize(x * subScale, y * subScale); - } - - @Override - public HandleType getType() - { - return HandleType.CORNER; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java deleted file mode 100644 index cbfe2a2a..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java +++ /dev/null @@ -1,150 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Optional; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.editor.Editor.ComponentInfo; -import net.mograsim.logic.model.editor.states.EditorState; - -public abstract class Handle -{ - private final Rectangle bounds; - private final Collection redrawListeners, destroyListeners; - private final int priority; - - public Handle(int priority) - { - this.priority = priority; - redrawListeners = new ArrayList<>(); - destroyListeners = new ArrayList<>(); - bounds = new Rectangle(0, 0, 0, 0); - callRedrawListeners(); - } - - final public void render(GeneralGC gc, Rectangle visibleRegion) - { - if (bounds.intersects(visibleRegion)) - render(gc); - } - - protected abstract void render(GeneralGC gc); - - protected void setSize(double width, double height) - { - bounds.width = width; - bounds.height = height; - callRedrawListeners(); - } - - protected void moveTo(double x, double y) - { - bounds.x = x; - bounds.y = y; - callRedrawListeners(); - } - - public Rectangle getBounds() - { - return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); - } - - public void addRedrawListener(Runnable listener) - { - redrawListeners.add(listener); - } - - public void removeRedrawListener(Runnable listener) - { - redrawListeners.remove(listener); - } - - protected void callRedrawListeners() - { - redrawListeners.forEach(l -> l.run()); - } - - public double getPosX() - { - return bounds.x; - } - - public double getPosY() - { - return bounds.y; - } - - void destroy() - { - destroyListeners.forEach(l -> l.run()); - } - - public void addDestroyListener(Runnable listener) - { - redrawListeners.add(listener); - } - - public void removeDestroyListener(Runnable listener) - { - redrawListeners.remove(listener); - } - - public boolean contains(double x, double y) - { - return bounds.contains(x, y); - } - - public boolean contains(Point p) - { - return contains(p.x, p.y); - } - - /** - * Register a mouse click - * - * @param x Coordinate of the click in the world, not the display context - * @param y Coordinate of the click in the world, not the display context - * @return true if the click was consumed, false otherwise - */ - public boolean click(double x, double y, int stateMask, EditorState state) - { - if (contains(x, y)) - return state.clickedHandle(new HandleClickInfo(this, stateMask)); - return false; - } - - //@formatter:off - public void reqMove(double x, double y) {} - public void reqDelete() {} - public Optional reqCopy(Point refPoint) { return Optional.empty(); } - public void onSelect() {} - public void onDeselect() {} - //@formatter:on - - public final int getPriority() - { - return priority; - } - - public abstract HandleType getType(); - - public static enum HandleType - { - COMPONENT, STATIC_PIN, INTERFACE_PIN, WIRE_POINT, WIRE, CORNER; - } - - public static class HandleClickInfo - { - public final int stateMask; - public final Handle clicked; - - HandleClickInfo(Handle clicked, int stateMask) - { - this.clicked = clicked; - this.stateMask = stateMask; - } - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java deleted file mode 100644 index 0a33509c..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java +++ /dev/null @@ -1,390 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.states.EditorState; -import net.mograsim.logic.model.editor.util.PrioritySet; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; - -public class HandleManager -{ - private final Map handlePerPin; - private final Map handlePerInterfacePin; - private final Map> pointHandlesPerWire; - private final Map handlePerWire; - private final Set handles; - private final Set wirePointHandles; - private final Map handlePerComp; - - private final Collection> handleAddedListeners; - private final Collection> handleRemovedListeners; - private final Editor editor; - private boolean initialized = false; - - public HandleManager(Editor editor) - { - this.editor = editor; - handlePerPin = new HashMap<>(); - handlePerInterfacePin = new HashMap<>(); - pointHandlesPerWire = new HashMap<>(); - handlePerComp = new HashMap<>(); - handles = new PrioritySet<>((a, b) -> Integer.compare(a.getPriority(), b.getPriority())); - wirePointHandles = new HashSet<>(); - handlePerWire = new HashMap<>(); - - handleAddedListeners = new ArrayList<>(); - handleRemovedListeners = new ArrayList<>(); - - LogicModelModifiable model = editor.getSubmodel(); - - model.addComponentAddedListener(c -> registerComponent(c)); - - model.addComponentRemovedListener(c -> - { - removeComponentHandle(c); - }); - - model.addWireAddedListener(w -> - { - registerWire(w); - }); - - model.addWireRemovedListener(w -> - { - removeWireHandle(w); - removeWirePointHandles(w); - }); - } - - //////////////////////////////////////// - // -- Setting up initial handles -- /// - ////////////////////////////////////// - - public void init() - { - if (initialized) - System.err.println("Warning! HandleManager was already initialized."); - else - { - LogicModelModifiable model = editor.getSubmodel(); - Map compsByName = model.getComponentsByName(); - Set comps = new HashSet<>(compsByName.values()); - ModelComponent interfaceComp = compsByName.get(SubmodelComponent.SUBMODEL_INTERFACE_NAME); - comps.remove(interfaceComp); - registerInterfaceComponent(interfaceComp); - comps.forEach(c -> registerComponent(c)); - - model.getWiresByName().values().forEach(w -> registerWire(w)); - addHandle(new CornerHandle(editor.toBeEdited)); - } - } - - private void registerInterfaceComponent(ModelComponent c) - { - c.getPins().values().forEach(p -> addInterfacePinHandle(p)); - c.addPinAddedListener(p -> addInterfacePinHandle(p)); - c.addPinRemovedListener(p -> removeInterfacePinHandle(p)); - } - - private void registerComponent(ModelComponent c) - { - addComponentHandle(c); - - c.getPins().values().forEach(p -> addPinHandle(p)); - - c.addPinAddedListener(p -> addPinHandle(p)); - c.addPinRemovedListener(p -> removePinHandle(p)); - } - - private void registerWire(ModelWire wire) - { - Point[] path = wire.getPath(); - AtomicInteger oldLength = new AtomicInteger(path == null ? 0 : path.length); - wire.addPathChangedListener(w -> - { - Point[] newPath = w.getPath(); - int newLength = newPath == null ? 0 : newPath.length; - int diff = newLength - oldLength.getAndSet(newLength); - if (diff != 0) - { - if (diff > 0) - { - for (int i = 0; i < diff; i++) - addWirePointHandle(w); - } - - List wpHandles = pointHandlesPerWire.get(w); - int size = wpHandles.size(); - for (int i = 0; i < size; i++) - { - wpHandles.get(i).setIndex(i); - } - } - pointHandlesPerWire.get(w).forEach(h -> h.updatePos()); - }); - addWireHandle(wire); - if (path == null) - return; - for (int i = 0; i < path.length; i++) - { - addWirePointHandle(wire); - } - } - - ///////////////////////////////////// - // -- Adding/Removing handles -- /// - /////////////////////////////////// - - private void addComponentHandle(ModelComponent c) - { - ComponentHandle h = new ComponentHandle(editor.getSubmodel(), c); - handlePerComp.put(c, h); - addHandle(h); - } - - private void removeComponentHandle(ModelComponent c) - { - ComponentHandle h = handlePerComp.get(c); - handlePerComp.remove(c); - removeHandle(h); - } - - private void addPinHandle(Pin owner) - { - StaticPinHandle h = new StaticPinHandle(owner); - handlePerPin.put(owner, h); - addHandle(h); - } - - private void removePinHandle(Pin owner) - { - StaticPinHandle h = handlePerPin.get(owner); - handlePerPin.remove(owner); - removeHandle(h); - } - - private void addInterfacePinHandle(Pin p) - { - // The following is not an alternative to the cast, because the new pin is not yet in the map, when the listener is called - // editor.toBeEdited.getSubmodelMovablePins().get(p.name); - MovablePin pM = (MovablePin) p; - InterfacePinHandle h = new InterfacePinHandle(pM, editor.toBeEdited); - handlePerInterfacePin.put(pM, h); - addHandle(h); - } - - private void removeInterfacePinHandle(Pin p) - { - InterfacePinHandle h = handlePerInterfacePin.get(p); - handlePerInterfacePin.remove(p); - removeHandle(h); - } - - private void addWirePointHandle(ModelWire w) - { - List wireHandles = pointHandlesPerWire.get(w); - WirePointHandle h; - if (wireHandles != null) - wireHandles.add(h = new WirePointHandle(this, w, wireHandles.size())); - else - { - wireHandles = new ArrayList<>(); - h = new WirePointHandle(this, w, 0); - wireHandles.add(h); - pointHandlesPerWire.put(h.parent, wireHandles); - } - this.wirePointHandles.add(h); - addHandle(h); - } - - void destroyWirePointHandle(ModelWire owner, WirePointHandle h) - { - if (pointHandlesPerWire.containsKey(owner)) - { - List handles = pointHandlesPerWire.get(owner); - int pointIndex = handles.indexOf(h); - handles.remove(pointIndex); - removeHandle(h); - owner.removePathPoint(pointIndex); - } - } - - private void removeWirePointHandles(ModelWire owner) - { - if (!pointHandlesPerWire.containsKey(owner)) - return; - pointHandlesPerWire.get(owner).forEach(h -> - { - wirePointHandles.remove(h); - removeHandle(h); - }); - pointHandlesPerWire.remove(owner); - } - - private void addWireHandle(ModelWire w) - { - WireHandle h = new WireHandle(editor.getSubmodel(), w); - handlePerWire.put(w, h); - addHandle(h); - } - - private void removeWireHandle(ModelWire w) - { - WireHandle h = handlePerWire.get(w); - handlePerWire.remove(w); - removeHandle(h); - } - - private void addHandle(Handle h) - { - handles.add(h); - callHandleAddedListeners(h); - } - - private void removeHandle(Handle h) - { - handles.remove(h); - callHandleRemovedListeners(h); - h.destroy(); - } - - public StaticPinHandle getHandle(Pin parent) - { - return handlePerPin.get(parent); - } - - public ComponentHandle getHandle(ModelComponent parent) - { - return handlePerComp.get(parent); - } - - public WireHandle getHandle(ModelWire parent) - { - return handlePerWire.get(parent); - } - - public Handle getInterfacePinHandle(Pin p) - { - return handlePerInterfacePin.get(p); - } - - /** - * @return A Collection of the registered {@link WirePointHandle}s of the specified wire - */ - public Collection getWirePointHandles(ModelWire parent) - { - return pointHandlesPerWire.get(parent).stream().collect(Collectors.toSet()); - } - - /** - * @return An unmodifiable view of all registered {@link Handle}s - */ - public Collection getHandles() - { - return Collections.unmodifiableCollection(handles); - } - - /** - * @return An unmodifiable view of all registered {@link StaticPinHandle}s - */ - public Collection getPinHandles() - { - return Collections.unmodifiableCollection(handlePerPin.values()); - } - - /** - * @return An unmodifiable view of all registered {@link InterfacePinHandle}s - */ - public Collection getInterfacePinHandles() - { - return Collections.unmodifiableCollection(handlePerInterfacePin.values()); - } - - /** - * @return An unmodifiable view of all registered {@link ComponentHandle}s - */ - public Collection getComponentHandles() - { - return Collections.unmodifiableCollection(handlePerComp.values()); - } - - /** - * @return An unmodifiable view of all registered {@link WireHandle}s - */ - public Collection getWireHandles() - { - return Collections.unmodifiableCollection(handlePerWire.values()); - } - - /** - * @return An unmodifiable view of all registered {@link WirePointHandle}s - */ - public Collection getWirePointHandles() - { - return Collections.unmodifiableSet(wirePointHandles); - } - - public void click(Point clicked, int stateMask) - { - EditorState entryState = editor.stateManager.getState(); - // TODO: As soon as wires connected to a component being removed also are removed, change priority) - if (!click(handles, clicked, entryState, stateMask)) - entryState.clickedEmpty(clicked, stateMask); - entryState.clicked(clicked, stateMask); - } - - private static boolean click(Collection handles, Point clicked, EditorState state, int stateMask) - { - for (Handle h : handles) - if (h.click(clicked.x, clicked.y, stateMask, state)) - return true; - return false; - } - - public void addHandleAddedListener(Consumer c) - { - handleAddedListeners.add(c); - } - - private void callHandleAddedListeners(Handle added) - { - handleAddedListeners.forEach(l -> l.accept(added)); - } - - public void removeHandleAddedListener(Consumer c) - { - handleAddedListeners.remove(c); - } - - public void addHandleRemovedListener(Consumer c) - { - handleRemovedListeners.add(c); - } - - private void callHandleRemovedListeners(Handle removed) - { - handleRemovedListeners.forEach(l -> l.accept(removed)); - } - - public void removeHandleRemovedListener(Consumer c) - { - handleRemovedListeners.remove(c); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java deleted file mode 100644 index 189d3d17..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java +++ /dev/null @@ -1,108 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; - -public class InterfacePinHandle extends PinHandle -{ - private final static int CIRCLE_DIAM = 4, CIRCLE_RADIUS = CIRCLE_DIAM / 2, SELECTED_CIRCLE_OFFSET = 1, - SELECTED_CIRCLE_DIAM = SELECTED_CIRCLE_OFFSET * 2 + CIRCLE_DIAM; - private final MovablePin parent; - private final DeserializedSubmodelComponent owner; - private boolean selected = false; - - public InterfacePinHandle(MovablePin parent, DeserializedSubmodelComponent pinOwner) - { - super(2); - this.parent = parent; - this.owner = pinOwner; - setSize(CIRCLE_DIAM, CIRCLE_DIAM); - initPos(); - } - - private void initPos() - { - Point pos = parent.getPos(); - moveTo(pos.x, pos.y); - } - - @Override - protected void render(GeneralGC gc) - { - double x = getPosX(), y = getPosY(); - - gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); - gc.drawText(parent.name, x + CIRCLE_DIAM, y + CIRCLE_DIAM, true); - if (selected) - { - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); - gc.drawOval(x - SELECTED_CIRCLE_OFFSET, y - SELECTED_CIRCLE_OFFSET, SELECTED_CIRCLE_DIAM, SELECTED_CIRCLE_DIAM); - } - gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); - gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); - } - - @Override - public void reqMove(double x, double y) - { - moveTo(x, y); - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - public void reqDelete() - { - owner.removeSubmodelInterface(parent.name); - } - - @Override - protected void moveTo(double x, double y) - { - super.moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS); - parent.setRelPos(getCenterX(), getCenterY()); - } - - @Override - public double getCenterX() - { - return getPosX() + CIRCLE_RADIUS; - } - - @Override - public double getCenterY() - { - return getPosY() + CIRCLE_RADIUS; - } - - @Override - public HandleType getType() - { - return HandleType.INTERFACE_PIN; - } - - @Override - public Pin getPin() - { - return parent; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java deleted file mode 100644 index 2e4a9dc6..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import net.mograsim.logic.model.model.wires.Pin; - -public abstract class PinHandle extends Handle -{ - public PinHandle(int priority) - { - super(priority); - } - - public abstract Pin getPin(); - - public abstract double getCenterX(); - - public abstract double getCenterY(); -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java deleted file mode 100644 index 0f4a1524..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.wires.Pin; - -public class StaticPinHandle extends PinHandle -{ - private final static int CIRCLE_DIAM = 2; - private final static int CIRCLE_RADIUS = 1; - private final Pin parent; - - public StaticPinHandle(Pin parent) - { - super(1); - this.parent = parent; - setSize(CIRCLE_DIAM, CIRCLE_DIAM); - parent.addPinMovedListener((p) -> updatePos()); - updatePos(); - } - - @Override - protected void render(GeneralGC gc) - { - gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN)); - gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); - } - - private void updatePos() - { - Point pos = parent.getPos(); - moveTo(pos.x - CIRCLE_RADIUS, pos.y - CIRCLE_RADIUS); - } - - @Override - public double getCenterX() - { - return getPosX() + CIRCLE_RADIUS; - } - - @Override - public double getCenterY() - { - return getPosY() + CIRCLE_RADIUS; - } - - @Override - public HandleType getType() - { - return HandleType.STATIC_PIN; - } - - @Override - public Pin getPin() - { - return parent; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java deleted file mode 100644 index 839c2b5b..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java +++ /dev/null @@ -1,161 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import java.util.Optional; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.editor.states.EditorState; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.ModelWire; - -public class WireHandle extends Handle -{ - private boolean selected = false; - private final static double WIDTH = 2.0; - private final static double WIDTH_SQUARED = WIDTH * WIDTH; - private final LogicModelModifiable model; - public final ModelWire parent; - - public WireHandle(LogicModelModifiable model, ModelWire parent) - { - super(5); - this.model = model; - this.parent = parent; - parent.addPathChangedListener(c -> updateBounds()); - updateBounds(); - } - - @Override - void destroy() - { - super.destroy(); - parent.removePathChangedListener(c -> updateBounds()); - } - - public void updateBounds() - { - Rectangle r = parent.getBounds(); - moveTo(r.x, r.y); - setSize(r.width, r.height); - } - - @Override - public void render(GeneralGC gc) - { - if (selected) - { - gc.setLineWidth(WIDTH); - gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW)); - gc.drawPolyline(parent.getEffectivePath()); - } - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - public void reqDelete() - { - // this wire could already be removed implicitly when removing a selection containing both wires and components - if (model.getWireByName(parent.name) != null) - model.destroyWire(parent); - } - - @Override - public boolean contains(double x, double y) - { - return click(parent, x, y).isPresent(); - } - - @Override - public boolean click(double x, double y, int stateMask, EditorState state) - { - Optional op = click(parent, x, y); - if (op.isEmpty()) - return false; - WireClickData data = op.get(); - return state.clickedHandle(new WireHandleClickInfo(this, data.segment, data.pos, stateMask)); - } - - public static class WireHandleClickInfo extends HandleClickInfo - { - public final int segment; - public final Point posOnWire; - - WireHandleClickInfo(WireHandle clicked, int segment, Point posOnWire, int stateMask) - { - super(clicked, stateMask); - this.segment = segment; - this.posOnWire = posOnWire; - } - - } - - private static Optional click(ModelWire w, double x, double y) - { - Rectangle modifiedBounds = w.getBounds(); - modifiedBounds.x -= WIDTH; - modifiedBounds.y -= WIDTH; - modifiedBounds.width += WIDTH * 2; - modifiedBounds.height += WIDTH * 2; - if (modifiedBounds.contains(x, y)) - { - double[] effectivePath = w.getEffectivePath(); - for (int i = 3; i < effectivePath.length; i += 2) - { - double a1 = effectivePath[i - 3], a2 = effectivePath[i - 2], b1 = effectivePath[i - 1], b2 = effectivePath[i], r1 = b2 - a2, - r2 = a1 - b1; - - double f = ((x - a1) * r2 + (a2 - y) * r1) / (-r2 * r2 - r1 * r1); - if (f >= 0 && f <= 1) - { - double e1 = a1 + f * (b1 - a1), e2 = a2 + f * (b2 - a2); - r1 = e1 - x; - r2 = e2 - y; - if (r1 * r1 + r2 * r2 <= WIDTH_SQUARED) - return Optional.of(new WireClickData(new Point(e1, e2), (i / 2) - 1)); - } - } - } - return Optional.empty(); - } - - private final static class WireClickData - { - WireClickData(Point pos, int segment) - { - this.pos = pos; - this.segment = segment; - } - - /** - * Position on the wire that is closest to the click - */ - public final Point pos; - /** - * Segment of the wire that the {@link Point} pos is on - */ - public final int segment; - } - - @Override - public HandleType getType() - { - return HandleType.WIRE; - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java deleted file mode 100644 index 2947535f..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.model.model.wires.ModelWire; - -public class WirePointHandle extends Handle -{ - private final static int END_OFFSET = 4; - private final HandleManager manager; - private boolean selected = false; - public final ModelWire parent; - - private int pointIndex; - - public WirePointHandle(HandleManager manager, ModelWire parent, int pointIndex) - { - super(3); - this.manager = manager; - this.parent = parent; - this.pointIndex = pointIndex; - setSize(END_OFFSET, END_OFFSET); - Point pathPoint = parent.getPathPoint(pointIndex); - moveTo(pathPoint.x, pathPoint.y); - } - - void updatePos() - { - Point p = parent.getPathPoint(pointIndex); - moveTo(p.x, p.y); - callRedrawListeners(); - } - - @Override - public void render(GeneralGC gc) - { - gc.setLineWidth(1.0); - gc.setForeground(Display.getDefault().getSystemColor(selected ? SWT.COLOR_YELLOW : SWT.COLOR_BLUE)); - gc.drawLine(getPosX(), getPosY(), getPosX() + END_OFFSET, getPosY() + END_OFFSET); - } - - @Override - public void reqMove(double x, double y) - { - parent.setPathPoint(new Point(x, y), pointIndex); - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - public void reqDelete() - { - manager.destroyWirePointHandle(parent, this); - } - - @Override - public HandleType getType() - { - return HandleType.WIRE_POINT; - } - - /** - * Sets the index of the {@link Point} within the parent {@link CoreWire}s path that is controlled by this handle - * - * @param index Index of the Point in the Wires path. - * @throws IndexOutOfBoundsException - */ - public void setIndex(int index) - { - this.pointIndex = index; - updatePos(); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java deleted file mode 100644 index ef109cdb..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.Selection; -import net.mograsim.logic.model.editor.handles.Handle; - -public class BoxSelectionState extends EditorState -{ - private Point origin; - private double mX, mY; - - private final ZoomedRenderer boxRenderer = gc -> - { - if (origin != null) - { - gc.setLineWidth(0.5); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); - gc.drawRectangle(origin.x, origin.y, mX - origin.x, mY - origin.y); - } - }; - - public BoxSelectionState(Editor editor, StateManager manager) - { - super(editor, manager); - } - - @Override - public void onEntry() - { - editor.gui.logicCanvas.addZoomedRenderer(boxRenderer); - editor.gui.logicCanvas.redrawThreadsafe(); - } - - @Override - public void onExit() - { - editor.gui.logicCanvas.removeZoomedRenderer(boxRenderer); - editor.gui.logicCanvas.redrawThreadsafe(); - } - - @Override - public void boxSelect() - { - manager.setState(new SelectionState(editor, manager)); - } - - @Override - public void clicked(Point clicked, int stateMask) - { - if (origin == null) - { - origin = new Point(clicked.x, clicked.y); - mX = clicked.x; - mY = clicked.y; - } else - { - Selection s = editor.getSelection(); - s.clear(); - boolean leftToRight = mX > origin.x, topToBottom = mY > origin.y; - double x = leftToRight ? origin.x : mX, y = topToBottom ? origin.y : mY, width = leftToRight ? mX - origin.x : origin.x - mX, - height = topToBottom ? mY - origin.y : origin.y - mY; - - Rectangle selected = new Rectangle(x, y, width, height); - for (Handle h : editor.handleManager.getHandles()) - { - Rectangle hBounds = h.getBounds(); - if (selected.contains(hBounds.x, hBounds.y) && selected.contains(hBounds.x + hBounds.width, hBounds.y + hBounds.height)) - { - s.add(h); - } - } - manager.setState(new SelectionState(editor, manager)); - } - } - - @Override - public void mouseMoved(double x, double y) - { - mX = x; - mY = y; - editor.gui.logicCanvas.redrawThreadsafe(); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java deleted file mode 100644 index 1c06c52e..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.PinHandle; -import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; - -public class CreateWireState extends EditorState -{ - private final PinHandle origin; - private double mX, mY; - private ZoomedRenderer drawLine; - - public CreateWireState(Editor session, StateManager manager, PinHandle origin) - { - super(session, manager); - this.origin = origin; - mX = origin.getCenterX(); - mY = origin.getCenterY(); - } - - @Override - public void mouseMoved(double x, double y) - { - this.mX = x; - this.mY = y; - editor.gui.logicCanvas.redraw(); - } - - @Override - public void onEntry() - { - editor.getSelection().clear(); - drawLine = gc -> - { - gc.setLineWidth(1); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)); - gc.drawLine((int) origin.getCenterX(), (int) origin.getCenterY(), (int) mX, (int) mY); - }; - editor.gui.logicCanvas.addZoomedRenderer(drawLine); - editor.gui.logicCanvas.redraw(); - } - - @Override - public void onExit() - { - editor.gui.logicCanvas.removeZoomedRenderer(drawLine); - editor.gui.logicCanvas.redraw(); - } - - @Override - public boolean clickedHandle(HandleClickInfo handleClickInfo) - { - switch (handleClickInfo.clicked.getType()) - { - case INTERFACE_PIN: - case STATIC_PIN: - try - { - editor.addWire(origin, (PinHandle) handleClickInfo.clicked); - } - catch (IllegalArgumentException e) - { - Shell tmp = new Shell(Display.getCurrent()); - editor.dialogManager.openWarningDialog("Warning!", e.getMessage()); - tmp.dispose(); - } - break; - default: - return false; - } - return true; - } - - @Override - public void clicked(Point clicked, int stateMask) - { - manager.setState(new SelectionState(editor, manager)); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java deleted file mode 100644 index 05e05d85..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.InterfacePinHandle; -import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; - -public abstract class EditorState -{ - protected final Editor editor; - protected final StateManager manager; - - public EditorState(Editor session, StateManager manager) - { - this.editor = session; - this.manager = manager; - } - - //@formatter:off - public void add() {} - public void delete() {} - public void copy() {} - public void paste() {} - public void duplicate() {} - public void grab() {} - public void mouseMoved(double x, double y) {} - public void select(Point pos, boolean additive) {} - public void boxSelect() {} - public void onEntry() {} - public void onExit() {} - public void clicked(InterfacePinHandle interfacePinHandle, int stateMask) {} - public void clickedEmpty(Point clicked, int stateMask) {} - public void clicked(Point clicked, int stateMask) {} - public boolean clickedHandle(HandleClickInfo handleClickInfo) { return false; } - //@formatter:on -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java deleted file mode 100644 index 1b8447e0..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import java.util.Map; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.Handle; - -public class GrabState extends EditorState -{ - private Map offsets; - - public GrabState(Editor editor, StateManager manager) - { - super(editor, manager); - } - - @Override - public void onEntry() - { - offsets = editor.getSelection().calculateOffsets(); - } - - @Override - public void grab() - { - manager.setState(new SelectionState(editor, manager)); - } - - @Override - public void mouseMoved(double x, double y) - { - editor.moveHandles(x, y, offsets); - } - - @Override - public void clicked(Point clicked, int stateMask) - { - manager.setState(new SelectionState(editor, manager)); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java deleted file mode 100644 index baa2eff9..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java +++ /dev/null @@ -1,186 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.Selection; -import net.mograsim.logic.model.editor.handles.Handle; -import net.mograsim.logic.model.editor.handles.PinHandle; -import net.mograsim.logic.model.editor.handles.WireHandle; -import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; -import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo; -import net.mograsim.logic.model.editor.ui.DialogManager; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; - -public class SelectionState extends EditorState -{ - private final ZoomedRenderer outlineRenderer = gc -> - { - if (editor.getSelection().size() > 1) - { - gc.setLineWidth(1); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); - gc.drawRectangle(editor.getSelection().getBounds()); - } - }; - - public SelectionState(Editor editor, StateManager manager) - { - super(editor, manager); - } - - @Override - public void add() - { - Point curserPos = editor.userInput.getWorldMousePosition(); - editor.addComponent(curserPos.x, curserPos.y); - } - - @Override - public void delete() - { - editor.deleteSelection(); - } - - @Override - public void copy() - { - editor.copy(); - } - - @Override - public void paste() - { - Point curserPos = editor.userInput.getWorldMousePosition(); - editor.paste(curserPos.x, curserPos.y); - } - - @Override - public void duplicate() - { - editor.duplicate(); - } - - @Override - public void grab() - { - if (!editor.getSelection().isEmpty()) - manager.setState(new GrabState(editor, manager)); - } - - @Override - public void boxSelect() - { - manager.setState(new BoxSelectionState(editor, manager)); - } - - @Override - public void onEntry() - { - editor.gui.logicCanvas.addZoomedRenderer(outlineRenderer); - editor.gui.logicCanvas.redrawThreadsafe(); - } - - @Override - public void onExit() - { - editor.gui.logicCanvas.removeZoomedRenderer(outlineRenderer); - editor.gui.logicCanvas.redrawThreadsafe(); - } - - @Override - public void clickedEmpty(Point clicked, int stateMask) - { - editor.getSelection().clear(); - if ((stateMask & SWT.ALT) == SWT.ALT) - { - String[] result = DialogManager.openMultiTextDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width", "Usage"); - if (result != null) - { - try - { - Pin p = editor.toBeEdited.addSubmodelInterface(new MovablePin(editor.getSubmodel(), editor.toBeEdited, result[0], - Integer.parseInt(result[1]), PinUsage.valueOf(result[2]), clicked.x, clicked.y)); - editor.handleManager.getInterfacePinHandle(p).reqMove(clicked.x, clicked.y); - } - catch (NumberFormatException e) - { - editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!"); - } - catch (IllegalArgumentException e) - { - editor.dialogManager.openWarningDialog("Failed to create Pin!", "Usage must be one of INPUT, OUTPUT, TRISTATE!"); - } - } - } - } - - @Override - public boolean clickedHandle(HandleClickInfo handleClickInfo) - { - switch (handleClickInfo.clicked.getType()) - { - case INTERFACE_PIN: - if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) - { - manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked)); - break; - } - case CORNER: - case COMPONENT: - case WIRE_POINT: - boolean additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT; - select(handleClickInfo.clicked, additive); - break; - case STATIC_PIN: - if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) - manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked)); - else - return false; - break; - case WIRE: - if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) - { - WireHandleClickInfo info = (WireHandleClickInfo) handleClickInfo; - WireHandle clicked = (WireHandle) info.clicked; - clicked.parent.insertPathPoint(info.posOnWire, info.segment); - } else - { - additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT; - select(handleClickInfo.clicked, additive); - } - break; - default: - return false; - } - return true; - } - - private void select(Handle h, boolean additive) - { - Selection sel = editor.getSelection(); - if (sel.contains(h)) - if (additive) - sel.remove(h); - else - { - if (editor.getSelection().size() > 1) - { - sel.clear(); - sel.add(h); - } else - sel.clear(); - } - else - { - if (!additive) - sel.clear(); - sel.add(h); - } - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java deleted file mode 100644 index d4b3fc4d..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; - -public class StateManager -{ - private EditorState state; - - public StateManager(Editor session) - { - state = new SelectionState(session, this); - state.onEntry(); - } - - public EditorState getState() - { - return state; - } - - public void setState(EditorState state) - { - this.state.onExit(); - this.state = state; - state.onEntry(); - } - - public void add() - { - state.add(); - } - - public void delete() - { - state.delete(); - } - - public void copy() - { - state.copy(); - } - - public void paste() - { - state.paste(); - } - - public void duplicate() - { - state.duplicate(); - } - - public void grab() - { - state.grab(); - } - - public void mouseMoved(double x, double y) - { - state.mouseMoved(x, y); - } - - public void select(Point pos, boolean additive) - { - state.select(pos, additive); - } - - public boolean clickedHandle(HandleClickInfo handleClickInfo) - { - return state.clickedHandle(handleClickInfo); - } - - public void boxSelect() - { - state.boxSelect(); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java deleted file mode 100644 index df7455e6..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java +++ /dev/null @@ -1,199 +0,0 @@ -package net.mograsim.logic.model.editor.ui; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Dialog; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -public class DialogManager -{ - private Shell parent; - - public DialogManager(Shell parent) - { - this.parent = parent; - } - - public void openWarningDialog(String title, String message) - { - MessageBox b = new MessageBox(parent, SWT.ICON_WARNING | SWT.OK); - b.setText(title); - b.setMessage(message); - b.open(); - } - - private static abstract class FlexibleInputsDialog extends Dialog - { - private final String title, acceptLabel, cancelLabel; - - protected String[] result; - - public FlexibleInputsDialog(String title, String acceptLabel, String cancelLabel, String... inputs) - { - this(false, title, acceptLabel, cancelLabel, inputs); - } - - public FlexibleInputsDialog(boolean resizable, String title, String acceptLabel, String cancelLabel, String... inputs) - { - super(new Shell(SWT.CLOSE | (resizable ? SWT.RESIZE | SWT.MAX : 0) | SWT.TITLE | SWT.MIN | SWT.ON_TOP | SWT.APPLICATION_MODAL)); - this.title = title; - this.acceptLabel = acceptLabel; - this.cancelLabel = cancelLabel; - } - - protected abstract void setupWidgets(Composite parent); - - protected abstract void buildResult(); - - /** - * @return May be null (if {@link Dialog} was cancelled) - */ - public String[] open() - { - Shell shell = getParent(); - Display display = shell.getDisplay(); - shell.setMinimumSize(500, 150); - shell.setText(title); - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - shell.setLayout(layout); - - Composite inputContainer = new Composite(shell, SWT.BORDER); - GridData gd = new GridData(); - gd.horizontalSpan = 2; - gd.horizontalAlignment = SWT.FILL; - gd.grabExcessHorizontalSpace = true; - gd.verticalAlignment = SWT.FILL; - gd.grabExcessVerticalSpace = true; - inputContainer.setLayoutData(gd); - setupWidgets(inputContainer); - - Button b1 = new Button(shell, SWT.PUSH); - b1.addListener(SWT.Selection, e -> - { - buildResult(); - shell.dispose(); - }); - - b1.setText(acceptLabel); - Button b2 = new Button(shell, SWT.PUSH); - b2.addListener(SWT.Selection, e -> - { - shell.dispose(); - }); - b2.setText(cancelLabel); - - shell.pack(); - - shell.open(); - while (!shell.isDisposed()) - if (!display.readAndDispatch()) - display.sleep(); - return result; - } - } - - private static class MultiTextFieldsDialog extends FlexibleInputsDialog - { - private final String[] inputs; - private Text[] textFields; - - public MultiTextFieldsDialog(String title, String acceptLabel, String cancelLabel, String... inputs) - { - super(title, acceptLabel, cancelLabel); - this.inputs = inputs; - } - - @Override - protected void setupWidgets(Composite parent) - { - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - parent.setLayout(layout); - this.textFields = new Text[inputs.length]; - for (int i = 0; i < inputs.length; i++) - { - Label textFieldName = new Label(parent, SWT.NONE); - textFieldName.setText(inputs[i].concat(":")); - GridData g = new GridData(); - g.grabExcessHorizontalSpace = true; - g.horizontalAlignment = SWT.FILL; - Text newTextField = new Text(parent, SWT.BORDER); - newTextField.setLayoutData(g); - textFields[i] = newTextField; - } - } - - @Override - protected void buildResult() - { - result = new String[textFields.length]; - for (int i = 0; i < textFields.length; i++) - result[i] = textFields[i].getText(); - } - - } - - /** - * @return The Strings entered, in order of the input labels the dialog was opened with, if the dialog was accepted, null if the dialog - * was cancelled. - */ - public static String[] openMultiTextDialog(String title, String acceptLabel, String cancelLabel, String... inputs) - { - return new MultiTextFieldsDialog(title, acceptLabel, cancelLabel, inputs).open(); - } - - public static class MultiLineTextFieldDialog extends FlexibleInputsDialog - { - private final String input; - private Text textField; - - public MultiLineTextFieldDialog(String title, String acceptLabel, String cancelLabel, String input) - { - super(true, title, acceptLabel, cancelLabel); - this.input = input; - } - - @Override - protected void setupWidgets(Composite parent) - { - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - parent.setLayout(layout); - GridData gd = new GridData(); - Label l = new Label(parent, SWT.NONE); - l.setText(input); - gd.verticalAlignment = SWT.TOP; - l.setLayoutData(gd); - gd = new GridData(); - textField = new Text(parent, SWT.V_SCROLL); - textField.setLayoutData(gd); - gd.grabExcessHorizontalSpace = true; - gd.grabExcessVerticalSpace = true; - gd.horizontalAlignment = SWT.FILL; - gd.verticalAlignment = SWT.FILL; - } - - @Override - protected void buildResult() - { - result = new String[] { textField.getText() }; - } - } - - /** - * @return The String entered if the dialog was accepted, null if the dialog was cancelled. - */ - public static String openMultiLineTextDialog(String title, String acceptLabel, String cancelLabel, String input) - { - String[] result = new MultiLineTextFieldDialog(title, acceptLabel, cancelLabel, input).open(); - return result == null ? null : result[0]; - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java deleted file mode 100644 index aedaa481..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.mograsim.logic.model.editor.ui; - -import java.util.Collection; - -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.widgets.Composite; - -import net.haspamelodica.swt.helper.gcs.TranslatedGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.LogicUICanvas; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.Handle; -import net.mograsim.preferences.Preferences; - -//TODO: Remove Inheritance -public class EditorCanvas extends LogicUICanvas -{ - private Collection handles; - - public EditorCanvas(Composite parent, int style, Editor editor) - { - super(parent, style, editor.toBeEdited.submodel); - - handles = editor.handleManager.getHandles(); - editor.handleManager.addHandleAddedListener(h -> - { - redrawThreadsafe(); - h.addRedrawListener(this::redrawThreadsafe); - }); - // TODO: Is this even necessary? The Handle should be finalized by the gc - editor.handleManager.addHandleRemovedListener(h -> - { - redrawThreadsafe(); - h.removeRedrawListener(this::redrawThreadsafe); - }); - - addZoomedRenderer(gc -> - { - Rectangle visibleRegion = new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom); - Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background"); - if (background != null) - setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the - // canvas - - TranslatedGC tgc = new TranslatedGC(gc, 0.0d, 0.0d, 1 / editor.toBeEdited.getSubmodelScale(), false); - editor.toBeEdited.getOutlineRenderer().render(tgc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); - - handles.forEach(h -> h.render(gc, visibleRegion)); - }); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java deleted file mode 100644 index 17e12ebb..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java +++ /dev/null @@ -1,232 +0,0 @@ -package net.mograsim.logic.model.editor.ui; - -import java.io.IOException; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.List; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; - -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.SaveLoadManager; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class EditorGUI -{ - public final Display display; - public final Shell shell; - public final EditorCanvas logicCanvas; - private final List addList; - private final Editor editor; - - public EditorGUI(Editor editor) - { - this.editor = editor; - display = Display.getDefault(); - shell = new Shell(display); - - GridLayout layout = new GridLayout(); - layout.numColumns = 1; - shell.setLayout(layout); - - setupTopToolBar(shell); - Composite innerComp = new Composite(shell, SWT.NONE); - GridData innerCompData = new GridData(); - innerCompData.grabExcessHorizontalSpace = true; - innerCompData.grabExcessVerticalSpace = true; - innerCompData.horizontalAlignment = SWT.FILL; - innerCompData.verticalAlignment = SWT.FILL; - innerComp.setLayoutData(innerCompData); - - GridLayout innerLayout = new GridLayout(); - innerComp.setLayout(innerLayout); - innerLayout.numColumns = 2; - - GridData d = new GridData(); - d.grabExcessHorizontalSpace = true; - d.horizontalAlignment = SWT.FILL; - d.grabExcessVerticalSpace = true; - d.verticalAlignment = SWT.FILL; - - logicCanvas = new EditorCanvas(innerComp, SWT.TRAIL, editor); - logicCanvas.setLayoutData(d); - - d = new GridData(); - d.grabExcessVerticalSpace = true; - d.verticalAlignment = SWT.FILL; - d.verticalSpan = 2; - addList = new List(innerComp, SWT.V_SCROLL); - addList.setLayoutData(d); - refreshAddList(); - - setupBottomToolBar(innerComp); - - ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas); - userInput.buttonDrag = 3; - userInput.buttonZoom = 2; - userInput.enableUserInput(); - new ZoomableCanvasOverlay(logicCanvas, null).enableScale(); - } - - private ToolBar setupTopToolBar(Composite parent) - { - GridData d = new GridData(); - d.grabExcessHorizontalSpace = true; - d.horizontalAlignment = SWT.FILL; - - ToolBar toolBar = new ToolBar(parent, SWT.BORDER); - toolBar.setLayoutData(d); - - ToolItem file = new ToolItem(toolBar, SWT.DROP_DOWN); - - // TODO - DropDownEntry newEntry = new DropDownEntry("New", e -> Editor.openNewEditor()); - DropDownEntry loadEntry = new DropDownEntry("Load", e -> - { - try - { - SaveLoadManager.openLoadDialog(); - } - catch (IOException e1) - { - editor.dialogManager.openWarningDialog("Failed to load Component!", e1.getMessage()); - } - }); - DropDownEntry saveEntry = new DropDownEntry("Save", e -> editor.save()); - DropDownEntry saveAsEntry = new DropDownEntry("Save as...", e -> editor.saveAs()); - - DropDownEntry[] entries = new DropDownEntry[] { newEntry, loadEntry, saveEntry, saveAsEntry }; - - setupDrowpDownMenu(file, entries); - - file.setText("File"); - return toolBar; - } - - private ToolBar setupBottomToolBar(Composite parent) - { - GridData d = new GridData(); - d.grabExcessHorizontalSpace = true; - d.horizontalAlignment = SWT.FILL; - - ToolBar toolBar = new ToolBar(parent, SWT.BORDER); - toolBar.setLayoutData(d); - - ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE); - snappingLabel.setText("Snapping:"); - - ToolItem snappSelect = new ToolItem(toolBar, SWT.DROP_DOWN); - DropDownEntry[] entries = new DropDownEntry[Editor.Snapping.values().length]; - int index = 0; - for (Editor.Snapping sn : Editor.Snapping.values()) - { - entries[index++] = new DropDownEntry(sn.toString(), e -> - { - editor.setSnapping(sn); - snappSelect.setText(sn.toString()); - }); - } - snappSelect.setText(editor.getSnapping().toString()); - setupDrowpDownMenu(snappSelect, entries); - - new ToolItem(toolBar, SWT.SEPARATOR); - - toolBar.pack(); - - return toolBar; - } - - private void setupDrowpDownMenu(ToolItem parent, DropDownEntry[] entries) - { - Menu menu = new Menu(shell, SWT.POP_UP); - for (DropDownEntry entry : entries) - { - MenuItem item = new MenuItem(menu, SWT.PUSH); - item.addSelectionListener(new SelectionListener() - { - @Override - public void widgetSelected(SelectionEvent e) - { - entry.listener.widgetSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) - { - widgetSelected(e); - } - }); - item.setText(entry.title); - } - - parent.addListener(SWT.Selection, new Listener() - { - public void handleEvent(Event event) - { - if (event.detail == SWT.ARROW) - { - Rectangle rect = parent.getBounds(); - Point pt = new Point(rect.x, rect.y + rect.height); - pt = parent.getParent().toDisplay(pt); - menu.setLocation(pt.x, pt.y); - menu.setVisible(true); - } - } - }); - } - - private static class DropDownEntry - { - public final String title; - public final EntrySelectedListener listener; - - public DropDownEntry(String title, EntrySelectedListener listener) - { - super(); - this.title = title; - this.listener = listener; - } - } - - private static interface EntrySelectedListener - { - public void widgetSelected(SelectionEvent e); - } - - public void refreshAddList() - { - addList.setItems(IndirectModelComponentCreator.getStandardComponentIDs().keySet().stream().sorted().toArray(String[]::new)); - addList.select(0); - } - - public String getAddListSelected() - { - String[] selection = addList.getSelection(); - if (selection.length == 0) - throw new IllegalStateException("Selection in the Add Component List may never be empty!"); - return selection[0]; - } - - public void open() - { - shell.open(); - while (!shell.isDisposed()) - if (!display.readAndDispatch()) - display.sleep(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java deleted file mode 100644 index 253dfdd3..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.mograsim.logic.model.editor.util; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.Set; - -/** - * Similar to a SortedSet, except it is allowed for multiple elements to have the same priority (c.compare(e1, e2) == 0 is - * allowed to be true for two different elements e1 and e2). However, to elements are not allowed to be equal according to - * Object.equals(Object o). - * - * @author Fabian Stemmler - * - * @param the type of elements in this list - */ -public class PrioritySet implements Set -{ - private ArrayList list; - private Comparator c; - - public PrioritySet(Comparator c) - { - setComparator(c); - list = new ArrayList<>(); - } - - @SuppressWarnings("unchecked") - public PrioritySet() - { - this((e1, e2) -> ((Comparable) e1).compareTo(e2)); - } - - public void setComparator(Comparator c) - { - this.c = c; - } - - //@formatter:off - @Override - public int size() { return list.size(); } - @Override - public boolean isEmpty() { return list.isEmpty(); } - @Override - public boolean contains(Object o) { return list.isEmpty(); } - @Override - public Iterator iterator() { return list.iterator(); } - @Override - public Object[] toArray() { return list.toArray(); } - @Override - public E[] toArray(E[] a) { return list.toArray(a); } - @Override - public boolean remove(Object o) { return list.remove(o); } - @Override - public boolean containsAll(Collection c) { return list.containsAll(c); } - @Override - public boolean removeAll(Collection c) { return list.removeAll(c); } - @Override - public boolean retainAll(Collection c) { return list.retainAll(c); } - @Override - public void clear() { list.clear(); } - //@formatter:on - - @Override - public boolean add(T e) - { - if (isEmpty()) - { - list.add(e); - return true; - } - int index = Collections.binarySearch(list, e, c); - if (index < 0) - index = -index - 1; - if (index < size()) - { - if (list.get(index).equals(e)) - return false; - list.add(index, e); - } else - list.add(e); - return true; - } - - @Override - public boolean addAll(Collection c) - { - return c.stream().map(e -> add(e)).reduce(false, (a, b) -> a || b); - } - - @Override - public String toString() - { - return list.toString(); - } -} diff --git a/net.mograsim.logic.model/.classpath b/net.mograsim.logic.model/.classpath deleted file mode 100644 index 4a00becd..00000000 --- a/net.mograsim.logic.model/.classpath +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.logic.model/.gitignore b/net.mograsim.logic.model/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.logic.model/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.logic.model/.project b/net.mograsim.logic.model/.project deleted file mode 100644 index c6d10606..00000000 --- a/net.mograsim.logic.model/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - net.mograsim.logic.model - - - net.mograsim.logic.core - SWTZoomableCanvas - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs b/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.logic.model/META-INF/MANIFEST.MF b/net.mograsim.logic.model/META-INF/MANIFEST.MF deleted file mode 100644 index e6b077ab..00000000 --- a/net.mograsim.logic.model/META-INF/MANIFEST.MF +++ /dev/null @@ -1,31 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %Bundle-Name -Bundle-SymbolicName: net.mograsim.logic.model;singleton:=true -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.logic.model, - net.mograsim.logic.model.examples, - net.mograsim.logic.model.model, - net.mograsim.logic.model.model.components, - net.mograsim.logic.model.model.components.atomic, - net.mograsim.logic.model.model.components.submodels, - net.mograsim.logic.model.model.wires, - net.mograsim.logic.model.modeladapter, - net.mograsim.logic.model.modeladapter.componentadapters, - net.mograsim.logic.model.serializing, - net.mograsim.logic.model.snippets, - net.mograsim.logic.model.snippets.highlevelstatehandlers, - net.mograsim.logic.model.snippets.highlevelstatehandlers.standard, - net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic, - net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent, - net.mograsim.logic.model.snippets.outlinerenderers, - net.mograsim.logic.model.snippets.symbolrenderers, - net.mograsim.logic.model.util -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.eclipse.swt;bundle-version="3.0.0";visibility:=reexport, - SWTZoomableCanvas;bundle-version="1.0.0";visibility:=reexport, - net.mograsim.logic.core;bundle-version="0.1.0";visibility:=reexport, - com.google.gson;bundle-version="2.8.2";visibility:=reexport, - net.mograsim.preferences;bundle-version="0.1.0" -Automatic-Module-Name: net.mograsim.logic.model -Bundle-Vendor: Mograsim Team diff --git a/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties b/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties deleted file mode 100644 index fad36e3e..00000000 --- a/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Properties file for net.mograsim.logic.model -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim logic model and user interface \ No newline at end of file diff --git a/net.mograsim.logic.model/build.properties b/net.mograsim.logic.model/build.properties deleted file mode 100644 index d6642e65..00000000 --- a/net.mograsim.logic.model/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - .,\ - OSGI-INF/ diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java deleted file mode 100644 index a9fde7a1..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java +++ /dev/null @@ -1,111 +0,0 @@ -package net.mograsim.logic.model; - -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; - -import net.mograsim.logic.core.timeline.Timeline; - -//TODO maybe move to logic core? -public class LogicExecuter -{ - // TODO replace with CoreModel when it exists - private final Timeline timeline; - - private final AtomicBoolean shouldBeRunningLive; - private final AtomicBoolean isRunningLive; - private final AtomicLong nextExecSimulTime; - private final Thread simulationThread; - - public LogicExecuter(Timeline timeline) - { - this.timeline = timeline; - - timeline.setTimeFunction(System::currentTimeMillis); - shouldBeRunningLive = new AtomicBoolean(); - isRunningLive = new AtomicBoolean(); - nextExecSimulTime = new AtomicLong(); - simulationThread = new Thread(() -> - { - isRunningLive.set(true); - synchronized (isRunningLive) - { - isRunningLive.notify(); - } - try - { - while (shouldBeRunningLive.get()) - { - // always execute to keep timeline from "hanging behind" for too long - long current = System.currentTimeMillis(); - timeline.executeUntil(timeline.laterThan(current), current + 10); - long sleepTime; - if (timeline.hasNext()) - sleepTime = timeline.nextEventTime() - current; - else - sleepTime = 10000; - try - { - nextExecSimulTime.set(current + sleepTime); - if (sleepTime > 0) - Thread.sleep(sleepTime); - } - catch (@SuppressWarnings("unused") InterruptedException e) - {// do nothing; it is normal execution flow to be interrupted - } - } - } - finally - { - isRunningLive.set(false); - synchronized (isRunningLive) - { - isRunningLive.notify(); - } - } - }); - timeline.addEventAddedListener(event -> - { - if (isRunningLive.get()) - if (Timeline.timeCmp(event.getTiming(), nextExecSimulTime.get()) < 0) - simulationThread.interrupt(); - }); - } - - public void executeNextStep() - { - timeline.executeNext(); - } - - public synchronized void startLiveExecution() - { - if (shouldBeRunningLive.get()) - return; - shouldBeRunningLive.set(true); - simulationThread.start(); - waitForIsRunning(true); - } - - public synchronized void stopLiveExecution() - { - if (!shouldBeRunningLive.get()) - return; - shouldBeRunningLive.set(false); - simulationThread.interrupt(); - waitForIsRunning(false); - } - - private void waitForIsRunning(boolean expectedState) - { - while (isRunningLive.get() ^ expectedState) - try - { - synchronized (isRunningLive) - { - isRunningLive.wait(); - } - } - catch (@SuppressWarnings("unused") InterruptedException e) - {// no need to do anything - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java deleted file mode 100644 index 15346c63..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java +++ /dev/null @@ -1,239 +0,0 @@ -package net.mograsim.logic.model; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.preferences.Preferences; - -/** - * Simulation visualizer canvas. - * - * @author Daniel Kirschten - */ -public class LogicUICanvas extends ZoomableCanvas -{ - private static final boolean OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL = false; - - private final LogicModel model; - - public LogicUICanvas(Composite parent, int style, LogicModel model) - { - super(parent, style, Preferences.current().getBoolean("net.mograsim.logic.model.improvetext")); - - this.model = model; - - LogicUIRenderer renderer = new LogicUIRenderer(model); - addZoomedRenderer(gc -> - { - Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background"); - if (background != null) - setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the canvas - renderer.render(gc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); - }); - model.setRedrawHandler(this::redrawThreadsafe); - - addListener(SWT.MouseDown, this::mouseDown); - - if (OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL) - openDebugSetHighLevelStateShell(model); - } - - private void mouseDown(Event e) - { - if (e.button == 1) - { - Point click = canvasToWorldCoords(e.x, e.y); - for (ModelComponent component : model.getComponentsByName().values()) - if (component.getBounds().contains(click) && component.clicked(click.x, click.y)) - { - redraw(); - break; - } - } - } - - private void openDebugSetHighLevelStateShell(LogicModel model) - { - Shell debugShell = new Shell(); - debugShell.setLayout(new GridLayout(2, false)); - new Label(debugShell, SWT.NONE).setText("Target component: "); - Combo componentSelector = new Combo(debugShell, SWT.DROP_DOWN | SWT.READ_ONLY); - componentSelector.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - List componentsByItemIndex = new ArrayList<>(); - List models = new ArrayList<>(); - AtomicBoolean recalculateQueued = new AtomicBoolean(); - AtomicReference> compAdded = new AtomicReference<>(); - AtomicReference> compRemoved = new AtomicReference<>(); - compAdded.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, - recalculateQueued, true)); - compRemoved.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, - recalculateQueued, false)); - iterateModelTree(compAdded.get(), compRemoved.get(), model, models, true); - debugShell.addListener(SWT.Dispose, e -> models.forEach(m -> - { - m.removeComponentAddedListener(compAdded.get()); - m.removeComponentRemovedListener(compRemoved.get()); - })); - queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); - new Label(debugShell, SWT.NONE).setText("Target state ID: "); - Text stateIDText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); - stateIDText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - new Label(debugShell, SWT.NONE).setText("Value type: "); - Composite radioGroup = new Composite(debugShell, SWT.NONE); - radioGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - GridLayout radioGroupLayout = new GridLayout(2, false); - radioGroupLayout.marginHeight = 0; - radioGroupLayout.marginWidth = 0; - radioGroup.setLayout(radioGroupLayout); - Button radioBit = new Button(radioGroup, SWT.RADIO); - radioBit.setText("Single bit"); - Button radioBitVector = new Button(radioGroup, SWT.RADIO); - radioBitVector.setText("Bitvector"); - new Label(debugShell, SWT.NONE).setText("Value string representation: \n(Bit vectors: MSBit...LSBit)"); - Text valueText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); - valueText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - Button send = new Button(debugShell, SWT.PUSH); - send.setText("Send!"); - Button get = new Button(debugShell, SWT.PUSH); - get.setText("Get!"); - Text output = new Text(debugShell, SWT.READ_ONLY); - output.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); - Listener sendAction = e -> - { - try - { - int componentIndex = componentSelector.getSelectionIndex(); - if (componentIndex < 0 || componentIndex >= componentsByItemIndex.size()) - throw new RuntimeException("No component selected"); - ModelComponent target = componentsByItemIndex.get(componentIndex); - String valueString = valueText.getText(); - Object value; - if (radioBit.getSelection()) - value = Bit.parse(valueString); - else if (radioBitVector.getSelection()) - value = BitVector.parse(valueString); - else - throw new RuntimeException("No value type selected"); - target.setHighLevelState(stateIDText.getText(), value); - output.setText("Success!"); - } - catch (Exception x) - { - output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); - } - }; - Listener getAction = e -> - { - try - { - if (componentSelector.getSelectionIndex() >= componentsByItemIndex.size()) - throw new RuntimeException("No valid component selected"); - output.setText("Success! Value: \r\n" - + componentsByItemIndex.get(componentSelector.getSelectionIndex()).getHighLevelState(stateIDText.getText())); - } - catch (Exception x) - { - output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); - } - }; - send.addListener(SWT.Selection, sendAction); - valueText.addListener(SWT.DefaultSelection, sendAction); - get.addListener(SWT.Selection, getAction); - stateIDText.addListener(SWT.DefaultSelection, getAction); - debugShell.open(); - } - - private void compsChanged(Consumer compAdded, Consumer compRemoved, ModelComponent c, - List models, List componentsByItemIndex, Combo componentSelector, LogicModel model, - AtomicBoolean recalculateQueued, boolean add) - { - iterateSubmodelTree(compAdded, compRemoved, c, models, add); - queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); - } - - private void iterateSubmodelTree(Consumer compAdded, Consumer compRemoved, - ModelComponent c, List models, boolean add) - { - if (c instanceof SubmodelComponent) - iterateModelTree(compAdded, compRemoved, ((SubmodelComponent) c).submodel, models, add); - } - - private void iterateModelTree(Consumer compAdded, Consumer compRemoved, - LogicModel model, List models, boolean add) - { - if (add ^ models.contains(model)) - { - if (add) - { - models.add(model); - model.addComponentAddedListener(compAdded); - model.addComponentRemovedListener(compRemoved); - } else - { - models.remove(model); - model.removeComponentAddedListener(compAdded); - model.removeComponentRemovedListener(compRemoved); - } - for (ModelComponent c : model.getComponentsByName().values()) - iterateSubmodelTree(compAdded, compRemoved, c, models, add); - } - } - - private void queueRecalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, - Combo componentSelector, LogicModel model) - { - if (recalculateQueued.compareAndSet(false, true)) - getDisplay().asyncExec(() -> recalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model)); - } - - private void recalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, - Combo componentSelector, LogicModel model) - { - recalculateQueued.set(false); - componentsByItemIndex.clear(); - componentSelector.setItems(); - addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model); - } - - private void addComponentSelectorItems(List componentsByItemIndex, String base, Combo componentSelector, - LogicModel model) - { - model.getComponentsByName().values().stream().sorted((c1, c2) -> c1.getName().compareTo(c2.getName())).forEach(c -> - { - if (!(c instanceof ModelWireCrossPoint || c instanceof SubmodelInterface)) - { - String item = base + c.getName(); - componentsByItemIndex.add(c); - componentSelector.add(item); - if (c instanceof SubmodelComponent) - addComponentSelectorItems(componentsByItemIndex, item + " -> ", componentSelector, ((SubmodelComponent) c).submodel); - } - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java deleted file mode 100644 index 1df2f7b7..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.mograsim.logic.model; - -import org.eclipse.swt.SWT; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.preferences.Preferences; - -public class LogicUIRenderer -{ - private static final boolean DRAW_PINS = false; - - private final LogicModel model; - - public LogicUIRenderer(LogicModel model) - { - this.model = model; - } - - public void render(GeneralGC gc, Rectangle visibleRegion) - { - gc.setAntialias(SWT.ON); - gc.setClipping(visibleRegion); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - model.getWiresByName().values().forEach(w -> - { - Rectangle bounds = w.getBounds(); - double lw = gc.getLineWidth(); - if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw)) - w.render(gc); - }); - model.getComponentsByName().values().forEach(c -> renderComponent(gc, c, visibleRegion)); - } - - private static void renderComponent(GeneralGC gc, ModelComponent component, Rectangle visibleRegion) - { - Rectangle bounds = component.getBounds(); - double lw = gc.getLineWidth(); - if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw)) - { - component.render(gc, visibleRegion); - if (DRAW_PINS) - { - gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_DARK_CYAN)); - for (Pin p : component.getPins().values()) - { - Point pos = p.getPos(); - gc.fillOval(pos.x - 1, pos.y - 1, 2, 2); - } - } - } - } - -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java deleted file mode 100644 index 49182d66..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.logic.model; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; -import net.mograsim.logic.model.model.LogicModel; - -/** - * Standalone simulation visualizer graphical user interface. - * - * @author Daniel Kirschten - */ -public class LogicUIStandaloneGUI implements Runnable -{ - private final Display display; - private final Shell shell; - private final LogicUICanvas ui; - - public LogicUIStandaloneGUI(LogicModel model) - { - display = new Display(); - shell = new Shell(display); - shell.setLayout(new FillLayout()); - ui = new LogicUICanvas(shell, SWT.NONE, model); - - ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui); - userInput.buttonDrag = 3; - userInput.buttonZoom = 2; - userInput.enableUserInput(); - new ZoomableCanvasOverlay(ui, null).enableScale(); - } - - public LogicUICanvas getLogicUICanvas() - { - return ui; - } - - /** - * Opens the UI shell. Returns when the shell is closed. - */ - @Override - public void run() - { - shell.open(); - while (!shell.isDisposed()) - if (!display.readAndDispatch()) - display.sleep(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java deleted file mode 100644 index 03d0335c..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.mograsim.logic.model; - -import java.util.function.Consumer; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; - -public class SimpleLogicUIStandalone -{ - public static void executeVisualisation(Consumer setupLogicModel) - { - executeVisualisation(setupLogicModel, (Consumer) null); - } - - public static void executeVisualisation(Consumer setupLogicModel, Consumer beforeRun) - { - CoreModelParameters params = new CoreModelParameters(); - params.gateProcessTime = 50; - params.wireTravelTime = 10; - executeVisualisation(setupLogicModel, params, beforeRun); - } - - public static void executeVisualisation(Consumer setupLogicModel, CoreModelParameters params) - { - executeVisualisation(setupLogicModel, params, null); - } - - public static void executeVisualisation(Consumer setupLogicModel, CoreModelParameters params, - Consumer beforeRun) - { - // setup logic model - LogicModelModifiable logicModel = new LogicModelModifiable(); - setupLogicModel.accept(logicModel); - - // convert to core model - Timeline timeline = LogicCoreAdapter.convert(logicModel, params); - - // initialize UI and executer - LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(logicModel); - LogicExecuter exec = new LogicExecuter(timeline); - - if (beforeRun != null) - beforeRun.accept(new VisualisationObjects(logicModel, timeline, ui, exec)); - - // run it - exec.startLiveExecution(); - ui.run(); - exec.stopLiveExecution(); - } - - public static class VisualisationObjects - { - public final LogicModelModifiable model; - public final Timeline timeline; - public final LogicUIStandaloneGUI gui; - public final LogicExecuter executer; - - public VisualisationObjects(LogicModelModifiable model, Timeline timeline, LogicUIStandaloneGUI gui, LogicExecuter executer) - { - this.model = model; - this.timeline = timeline; - this.gui = gui; - this.executer = executer; - } - } - - private SimpleLogicUIStandalone() - { - throw new UnsupportedOperationException("No SimpleLogicUIStandalone instances"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java deleted file mode 100644 index 14073bd1..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.mograsim.logic.model.examples; - -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.submodels.SimpleRectangularSubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; - -public class ClickableSubmodelComponentsTest -{ - public static void main(String[] args) - { - SimpleLogicUIStandalone.executeVisualisation(ClickableSubmodelComponentsTest::createExample); - } - - public static void createExample(LogicModelModifiable model) - { - @SuppressWarnings("unused") // Wire - SimpleRectangularSubmodelComponent comp = new SimpleRectangularSubmodelComponent(model, 1, "") - { - { - setSubmodelScale(.4); - setOutputPins("O0"); - - ModelManualSwitch sw = new ModelManualSwitch(submodelModifiable, 1); - ModelBitDisplay bd = new ModelBitDisplay(submodelModifiable, 1); - - sw.moveTo(10, 5); - bd.moveTo(50, 5); - - new ModelWire(submodelModifiable, sw.getOutputPin(), bd.getInputPin()); - - } - }; - comp.moveTo(10, 10); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java deleted file mode 100644 index 5f68c9cc..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.mograsim.logic.model.examples; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.atomic.ModelNotGate; -import net.mograsim.logic.model.model.components.atomic.ModelOrGate; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; - -public class RSLatchExample -{ - public static void main(String[] args) - { - SimpleLogicUIStandalone.executeVisualisation(RSLatchExample::createRSLatchExample); - } - - @SuppressWarnings("unused") // for Wires being created - public static void createRSLatchExample(LogicModelModifiable model) - { - ModelManualSwitch rIn = new ModelManualSwitch(model, 1); - rIn.moveTo(100, 100); - ModelManualSwitch sIn = new ModelManualSwitch(model, 1); - sIn.moveTo(100, 200); - - ModelOrGate or1 = new ModelOrGate(model, 1); - or1.moveTo(160, 102.5); - new ModelWire(model, rIn.getOutputPin(), or1.getPin("A")); - - ModelOrGate or2 = new ModelOrGate(model, 1); - or2.moveTo(160, 192.5); - new ModelWire(model, sIn.getOutputPin(), or2.getPin("B")); - - ModelNotGate not1 = new ModelNotGate(model, 1); - not1.moveTo(200, 107.5); - new ModelWire(model, or1.getPin("Y"), not1.getPin("A")); - - ModelNotGate not2 = new ModelNotGate(model, 1); - not2.moveTo(200, 197.5); - new ModelWire(model, or2.getPin("Y"), not2.getPin("A")); - - ModelWireCrossPoint p1 = new ModelWireCrossPoint(model, 1); - p1.moveCenterTo(250, 112.5); - new ModelWire(model, not1.getPin("Y"), p1); - new ModelWire(model, p1, or2.getPin("A"), new Point(250, 130), new Point(140, 185), new Point(140, 197.5)); - - ModelWireCrossPoint p2 = new ModelWireCrossPoint(model, 1); - p2.moveCenterTo(250, 202.5); - new ModelWire(model, not2.getPin("Y"), p2); - new ModelWire(model, p2, or1.getPin("B"), new Point(250, 185), new Point(140, 130), new Point(140, 117.5)); - - ModelWireCrossPoint o1 = new ModelWireCrossPoint(model, 1); - o1.moveCenterTo(270, 112.5); - new ModelWire(model, p1, o1); - - ModelWireCrossPoint o2 = new ModelWireCrossPoint(model, 1); - o2.moveCenterTo(270, 202.5); - new ModelWire(model, p2, o2); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java deleted file mode 100644 index 17d0a44e..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java +++ /dev/null @@ -1,196 +0,0 @@ -package net.mograsim.logic.model.model; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Consumer; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; - -public class LogicModel -{ - private final Map components; - private final Map componentDestroyFunctions; - private final Map componentsUnmodifiable; - private final Map wires; - private final Map wireDestroyFunctions; - private final Map wiresUnmodifiable; - - private final List> componentAddedListeners; - private final List> componentRemovedListeners; - private final List> wireAddedListeners; - private final List> wireRemovedListeners; - private final List> redrawHandlerChangedListeners; - - private Runnable redrawHandler; - - protected LogicModel() - { - components = new HashMap<>(); - componentDestroyFunctions = new HashMap<>(); - componentsUnmodifiable = Collections.unmodifiableMap(components); - wires = new HashMap<>(); - wireDestroyFunctions = new HashMap<>(); - wiresUnmodifiable = Collections.unmodifiableMap(wires); - - componentAddedListeners = new ArrayList<>(); - componentRemovedListeners = new ArrayList<>(); - wireAddedListeners = new ArrayList<>(); - wireRemovedListeners = new ArrayList<>(); - redrawHandlerChangedListeners = new ArrayList<>(); - } - - /** - * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application - * code as it is automatically called in {@link ModelComponent}'s constructor. - * - * @author Daniel Kirschten - */ - protected void componentCreated(ModelComponent component, Runnable destroyed) - { - if (components.containsKey(component.getName())) - throw new IllegalStateException("Don't add the same component twice!"); - components.put(component.getName(), component); - componentDestroyFunctions.put(component.getName(), destroyed); - callComponentAddedListeners(component); - requestRedraw(); - } - - /** - * Destroyes the given component, removes it from the list of components and calls all componentRemovedListeners. - * - * @author Daniel Kirschten - */ - protected void destroyComponent(ModelComponent component) - { - componentDestroyFunctions.get(component.getName()).run(); - if (!components.containsKey(component.getName())) - throw new IllegalStateException("Don't remove the same component twice!"); - components.remove(component.getName()); - callComponentRemovedListeners(component); - requestRedraw(); - } - - /** - * Adds the given wire to the list of wires and calls all wireAddedListeners. Don't call this method from application code as it is - * automatically called in {@link ModelWire}'s constructor. - * - * @author Daniel Kirschten - */ - protected void wireCreated(ModelWire wire, Runnable destroyed) - { - if (wires.containsKey(wire.name)) - throw new IllegalStateException("Don't add the same wire twice!"); - wires.put(wire.name, wire); - wireDestroyFunctions.put(wire.name, destroyed); - callWireAddedListeners(wire); - requestRedraw(); - } - - /** - * Destroys the given wire, removes it from the list of wires and calls all wireRemovedListeners. - * - * @author Daniel Kirschten - */ - protected void destroyWire(ModelWire wire) - { - wireDestroyFunctions.get(wire.name).run(); - if (!wires.containsKey(wire.name)) - throw new IllegalStateException("Don't remove the same wire twice!"); - wires.remove(wire.name); - callWireRemovedListeners(wire); - requestRedraw(); - } - - public Map getComponentsByName() - { - return componentsUnmodifiable; - } - - public Map getWiresByName() - { - return wiresUnmodifiable; - } - - public ModelComponent getComponentByName(String name) - { - return components.get(name); - } - - @SuppressWarnings("unchecked") - public T getComponentByName(String name, Class expectedComponentClass) - { - ModelComponent comp = components.get(name); - Objects.requireNonNull(comp, "Invaild path, component " + name + " not found"); - if (expectedComponentClass.isInstance(comp)) - return (T) comp; - throw new IllegalArgumentException("The component " + name + " is not an instance of " + expectedComponentClass); - } - - public ModelWire getWireByName(String name) - { - return wires.get(name); - } - - public T getComponentBySubmodelPath(String path, Class modelClass) - { - int firstDot = path.indexOf('.'); - if (firstDot == -1) - return getComponentByName(path, modelClass); - String first = path.substring(0, firstDot); - String rest = path.substring(firstDot + 1); - return getComponentByName(first, SubmodelComponent.class).submodel.getComponentBySubmodelPath(rest, modelClass); - } - - public ModelWire getWireBySubmodelPath(String path) - { - int firstDot = path.indexOf('.'); - if (firstDot == -1) - return getWireByName(path); - String first = path.substring(0, firstDot); - String rest = path.substring(firstDot + 1); - return getComponentByName(first, SubmodelComponent.class).submodel.getWireBySubmodelPath(rest); - } - - // @formatter:off - public void addComponentAddedListener (Consumer listener) {componentAddedListeners .add (listener);} - public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners .add (listener);} - public void addWireAddedListener (Consumer listener) {wireAddedListeners .add (listener);} - public void addWireRemovedListener (Consumer listener) {wireRemovedListeners .add (listener);} - public void addRedrawHandlerChangedListener (Consumer listener) {redrawHandlerChangedListeners.add (listener);} - - public void removeComponentAddedListener (Consumer listener) {componentAddedListeners .remove(listener);} - public void removeComponentRemovedListener (Consumer listener) {componentRemovedListeners .remove(listener);} - public void removeWireAddedListener (Consumer listener) {wireAddedListeners .remove(listener);} - public void removeWireRemovedListener (Consumer listener) {wireRemovedListeners .remove(listener);} - public void removeRedrawHandlerChangedListener(Consumer listener) {redrawHandlerChangedListeners.remove(listener);} - - private void callComponentAddedListeners (ModelComponent c) {componentAddedListeners .forEach(l -> l.accept(c));} - private void callComponentRemovedListeners (ModelComponent c) {componentRemovedListeners .forEach(l -> l.accept(c));} - private void callWireAddedListeners (ModelWire w) {wireAddedListeners .forEach(l -> l.accept(w));} - private void callWireRemovedListeners (ModelWire w) {wireRemovedListeners .forEach(l -> l.accept(w));} - private void callRedrawHandlerChangedListener(Runnable r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));} - // @formatter:on - - public void setRedrawHandler(Runnable handler) - { - this.redrawHandler = handler; - callRedrawHandlerChangedListener(handler); - } - - public Runnable getRedrawHandler() - { - return redrawHandler; - } - - public void requestRedraw() - { - if (redrawHandler != null) - redrawHandler.run(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java deleted file mode 100644 index e903257f..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.mograsim.logic.model.model; - -import java.util.Set; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.IdentifyParams; - -public class LogicModelModifiable extends LogicModel -{ - public String getDefaultComponentName(ModelComponent component) - { - Set componentNames = getComponentsByName().keySet(); - String componentID = component.getIDForSerializing(new IdentifyParams()); - String nameBase = componentID + '#'; - for (int i = 0;; i++) - { - String nameCandidate = nameBase + i; - if (!componentNames.contains(nameCandidate)) - return nameCandidate; - } - } - - public String getDefaultWireName() - { - Set wireNames = getWiresByName().keySet(); - for (int i = 0;; i++) - { - String nameCandidate = "unnamedWire#" + i; - if (!wireNames.contains(nameCandidate)) - return nameCandidate; - } - } - - @Override - public void componentCreated(ModelComponent component, Runnable destroyed) - { - super.componentCreated(component, destroyed); - } - - @Override - public void destroyComponent(ModelComponent component) - { - super.destroyComponent(component); - } - - @Override - public void wireCreated(ModelWire wire, Runnable destroyed) - { - super.wireCreated(wire, destroyed); - } - - @Override - public void destroyWire(ModelWire wire) - { - super.destroyWire(wire); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java deleted file mode 100644 index d543c543..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java +++ /dev/null @@ -1,362 +0,0 @@ -package net.mograsim.logic.model.model.components; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.JSONSerializable; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; - -/** - * The base class for all model components.
- * A ModelComponent has a reference to the LogicModel it belongs to.
- * A ModelComponent has a name. This name is unique in the model the ModelComponent belongs to.
- * A ModelComponent has a position and size. The size can only be modified by subclasses. - * - * @author Daniel Kirschten - */ -public abstract class ModelComponent implements JSONSerializable -{ - /** - * The model this component is a part of. - */ - protected final LogicModelModifiable model; - /** - * The name of this component. Is unique for all components in its model.
- * Does never change, but can't be final since it is set in {@link #init()}. - */ - private String name; - private final Rectangle bounds; - /** - * The list of all pins of this component by name. - */ - private final Map pinsByName; - /** - * An unmodifiable view of {@link #pinsByName}. - */ - protected final Map pinsUnmodifiable; - - private final List> componentMovedListeners; - private final List> componentResizedListeners; - private final List> pinAddedListeners; - private final List> pinRemovedListeners; - - private HighLevelStateHandler highLevelStateHandler; - - // creation and destruction - - public ModelComponent(LogicModelModifiable model, String name) - { - this(model, name, true); - } - - /** - * Creates a new {@link ModelComponent} and, if callInit, initializes the component (See {@link #init()}).
- * If callInit==false, make sure to call {@link #init()}! - * - * @author Daniel Kirschten - */ - protected ModelComponent(LogicModelModifiable model, String name, boolean callInit) - { - this.model = model; - this.name = name; - this.bounds = new Rectangle(0, 0, 0, 0); - this.pinsByName = new HashMap<>(); - this.pinsUnmodifiable = Collections.unmodifiableMap(pinsByName); - - this.componentMovedListeners = new ArrayList<>(); - this.componentResizedListeners = new ArrayList<>(); - this.pinAddedListeners = new ArrayList<>(); - this.pinRemovedListeners = new ArrayList<>(); - - if (callInit) - init(); - } - - /** - * Initializes this component. This method should be called exactly once in this component's constructor.
- *
    - *
  • If {@link #name}==null, sets {@link #name} to {@link LogicModelModifiable#getDefaultComponentName(ModelComponent)}. - *
  • Registers this component in the model. - *
- */ - protected void init() - { - if (name == null) - name = model.getDefaultComponentName(this); - model.componentCreated(this, this::destroyed); - } - - // basic getters - - public String getName() - { - return name; - } - - /** - * Destroys this component. This method is called from {@link LogicModelModifiable#componentDestroyed(ModelComponent) - * destroyComponent()} of the model this component is a part of.
- * When overriding, make sure to also call the original implementation. - * - * @author Daniel Kirschten - */ - protected void destroyed() - { - pinsByName.values().forEach(this::removePinWithoutRedraw); - } - - // pins - - /** - * Adds the given pin to this component and calls pinAddedListeners and redrawListeners. - * - * @throws IllegalArgumentException if the pin doesn't belong to this component - * @throws IllegalArgumentException if there already is a pin with the given name - * - * @author Daniel Kirschten - */ - protected void addPin(Pin pin) - { - if (pin.component != this) - throw new IllegalArgumentException("Can't add a pin not belonging to this component!"); - if (pinsByName.containsKey(pin.name)) - throw new IllegalArgumentException("Duplicate pin name: " + pin.name); - pinsByName.put(pin.name, pin); - callPinAddedListeners(pin); - model.requestRedraw(); - } - - /** - * Removes the given pin from this component and calls pinAddedListeners and redrawListeners. - * - * @throws NullPointerException if there was no pin with this name - * - * @author Daniel Kirschten - */ - protected void removePin(String name) - { - removePinWithoutRedraw(pinsByName.remove(name)); - model.requestRedraw(); - } - - private void removePinWithoutRedraw(Pin pin) - { - pin.destroyed(); - callPinRemovedListeners(pin); - } - - /** - * Returns a collection of pins of this component. - * - * @author Daniel Kirschten - */ - public Map getPins() - { - return pinsUnmodifiable; - } - - /** - * Returns the pin with the given name of this component. - * - * @throws IllegalArgumentException if there is no pin with the given name - * @see #getPinOrNull(String) - * - * @author Daniel Kirschten - */ - public Pin getPin(String name) - { - Pin pin = getPinOrNull(name); - if (pin == null) - throw new IllegalArgumentException("No pin with the name " + name); - return pin; - } - - /** - * Returns the pin with the given name of this component, or null if there is no such pin. - * - * @see #getPin(String) - * - * @author Daniel Kirschten - */ - public Pin getPinOrNull(String name) - { - return pinsByName.get(name); - } - - // high-level access - - /** - * @author Daniel Kirschten - */ - protected void setHighLevelStateHandler(HighLevelStateHandler highLevelStateHandler) - { - this.highLevelStateHandler = highLevelStateHandler; - } - - public HighLevelStateHandler getHighLevelStateHandler() - { - return highLevelStateHandler; - } - - /** - * Gets the current value of the given high-level state.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #setHighLevelState(String, Object) - * @see HighLevelStateHandler#getHighLevelState(String) - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(String stateID) - { - return highLevelStateHandler.getHighLevelState(stateID); - } - - /** - * Sets the given high-level state to the given value.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #getHighLevelState(String) - * @see HighLevelStateHandler#setHighLevelState(String, Object) - * - * @author Daniel Kirschten - */ - public void setHighLevelState(String stateID, Object newState) - { - highLevelStateHandler.setHighLevelState(stateID, newState); - } - - // "graphical" operations - - /** - * Sets the position of this component and calls componentMovedListeners and redrawListeners. - * - * @author Daniel Kirschten - */ - public void moveTo(double x, double y) - { - bounds.x = x; - bounds.y = y; - callComponentMovedListeners(); - model.requestRedraw(); - } - - /** - * Sets the size of this component and calls redrawListeners. - * - * @author Daniel Kirschten - */ - protected void setSize(double width, double height) - { - bounds.width = width; - bounds.height = height; - callComponentResizedListener(); - model.requestRedraw(); - } - - /** - * Returns the bounds of this component. Is a bit slower than {@link #getPosX()}, {@link #getPosY()}, {@link #getWidth}, - * {@link #getHeight}, because new objects are created. - * - * @author Daniel Kirschten - */ - public final Rectangle getBounds() - { - return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); - } - - /** - * Returns the x coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getPosX() - { - return bounds.x; - } - - /** - * Returns the y coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getPosY() - { - return bounds.y; - } - - /** - * Returns the (graphical) width of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getWidth() - { - return bounds.width; - } - - /** - * Returns the height of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getHeight() - { - return bounds.height; - } - - /** - * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this - * click. - * - * @author Daniel Kirschten - */ - @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden - public boolean clicked(double x, double y) - { - return false; - } - - /** - * Render this component to the given gc, in absoulute coordinates. - * - * @author Daniel Kirschten - */ - public abstract void render(GeneralGC gc, Rectangle visibleRegion); - - // serializing - - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - // listeners - - // @formatter:off - public void addComponentMovedListener (Consumer listener) {componentMovedListeners .add (listener);} - public void addComponentResizedListener (Consumer listener) {componentResizedListeners.add (listener);} - public void addPinAddedListener (Consumer listener) {pinAddedListeners .add (listener);} - public void addPinRemovedListener (Consumer listener) {pinRemovedListeners .add (listener);} - - public void removeComponentMovedListener (Consumer listener) {componentMovedListeners .remove(listener);} - public void removeComponentResizedListener (Consumer listener) {componentResizedListeners.remove(listener);} - public void removePinAddedListener (Consumer listener) {pinAddedListeners .remove(listener);} - public void removePinRemovedListener (Consumer listener) {pinRemovedListeners .remove(listener);} - - private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));} - private void callComponentResizedListener( ) {componentResizedListeners.forEach(l -> l.accept(this));} - private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));} - private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));} - // @formatter:on -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java deleted file mode 100644 index 9fba366f..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.mograsim.logic.model.model.components; - -/** - * For components that can have different orientations. The meaning is not clearly defined, however it is common that the orientation - * denotes the direction the output is facing or the general flow of signals. _ALT represents an alternative, which is normally - * a mirrored version. A component can choose to not support some variants. - *

- * In terms of calculation, {@link #RIGHT} is considered the default. - *

- * Note that this needs to be interpreted using the GUI coordinate system, meaning that UP and DOWN are swapped. - * - * @author Christian Femers - */ -public enum Orientation -{ - /** - * The orientation RIGHT is the default orientation, all others are defined relative to it. - */ - RIGHT(1, 0, 0, 1), LEFT(-1, 0, 0, -1), UP(0, 1, -1, 0), DOWN(0, -1, 1, 0), RIGHT_ALT(1, 0, 0, -1), LEFT_ALT(-1, 0, 0, 1), - UP_ALT(0, -1, -1, 0), DOWN_ALT(0, 1, 1, 0); - - // simple 2D transformation matrix - final double trans11; - final double trans12; - final double trans21; - final double trans22; - - private Orientation(double trans11, double trans12, double trans21, double trans22) - { - this.trans11 = trans11; - this.trans12 = trans12; - this.trans21 = trans21; - this.trans22 = trans22; - } - - /** - * Performs a simple rotation around the origin. This does not work for the display coordinate system. - * - * @return the point's new X coordinate - */ - public double getNewX(double rightX, double rightY) - { - return rightX * trans11 + rightY * trans12; - } - - /** - * Performs a simple rotation around the origin. This does not work for the display coordinate system. - * - * @return the point's new Y coordinate - */ - public double getNewY(double rightX, double rightY) - { - return rightX * trans21 + rightY * trans22; - } - - public boolean doesMirror() - { - return ordinal() > 3; - } - - public boolean swapsWidthAndHeight() - { - return trans11 == 0; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java deleted file mode 100644 index 06621baf..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java +++ /dev/null @@ -1,76 +0,0 @@ -package net.mograsim.logic.model.model.components; - -/** - * This class simplifies the calculation of coordinates, especially for model components. - *

- * Supply it with the original width and height and an orientation, and use the methods {@link #newX(double, double)} and - * {@link #newY(double, double)} to retrieve the new coordinates, relative to the upper left corner of {@link Orientation#RIGHT}. The - * {@link #height()} and {@link #width()} methods return the width and height in the new orientation. - *

- * This is meant to be used in the context of a a classic display coordinate system, as done in the {@link ModelComponent}s. - * - * @see Orientation - * @author Christian Femers - */ -public class OrientationCalculator -{ - final Orientation o; - final double oldWHalf; - final double oldHHalf; - final double w; - final double h; - final double wHalf; - final double hHalf; - - public OrientationCalculator(Orientation o, double width, double height) - { - this.o = o; - this.oldWHalf = width / 2; - this.oldHHalf = height / 2; - - if (o.swapsWidthAndHeight()) - { - w = height; - h = width; - wHalf = oldHHalf; - hHalf = oldWHalf; - } else - { - w = width; - h = height; - wHalf = oldWHalf; - hHalf = oldHHalf; - } - } - - /** - * Returns the new height (that equals the old width if {@link Orientation#swapsWidthAndHeight()} is true) - */ - public double height() - { - return h; - } - - /** - * Returns the new width (that equals the old height if {@link Orientation#swapsWidthAndHeight()} is true) - */ - public double width() - { - return w; - } - - public double newX(double x, double y) - { - return (x - oldWHalf) * o.trans11 + (y - oldHHalf) * o.trans12 + wHalf; - } - - public double newY(double x, double y) - { - return (x - oldWHalf) * o.trans21 + (y - oldHHalf) * o.trans22 + hHalf; - } - - public final Orientation getOrientation() - { - return o; - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java deleted file mode 100644 index 3e836937..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import net.mograsim.logic.core.components.gates.CoreAndGate; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelAndGate extends SimpleRectangularModelGate -{ - public ModelAndGate(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelAndGate(LogicModelModifiable model, int logicWidth, String name) - { - super(model, "AndGate", "&", false, logicWidth, name, false); - setInputCount(2);// TODO make variable - init(); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelAndGate.class, CoreAndGate::new)); - IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), - (m, p, n) -> new ModelAndGate(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java deleted file mode 100644 index 1a01e141..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.BitDisplayAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.Preferences; - -public class ModelBitDisplay extends ModelComponent -{ - private static final double width = 20; - private static final double height = 15; - private static final double fontHeight = 5; - - public final int logicWidth; - private final Pin inputPin; - - private final LogicObserver logicObs; - private CoreBitDisplay bitDisplay; - - public ModelBitDisplay(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelBitDisplay(LogicModelModifiable model, int logicWidth, String name) - { - super(model, name, false); - this.logicWidth = logicWidth; - logicObs = (i) -> model.requestRedraw(); - - setSize(width, height); - addPin(this.inputPin = new Pin(model, this, "", logicWidth, PinUsage.INPUT, 0, height / 2)); - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - gc.drawRectangle(getBounds()); - String label = bitDisplay == null ? BitVectorFormatter.formatAsString(null) - : BitVectorFormatter.formatAsString(bitDisplay.getDisplayedValue()); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); - gc.setFont(oldFont); - } - - public void setCoreModelBinding(CoreBitDisplay bitDisplay) - { - if (this.bitDisplay != null) - this.bitDisplay.deregisterObserver(logicObs); - this.bitDisplay = bitDisplay; - if (bitDisplay != null) - bitDisplay.registerObserver(logicObs); - } - - public boolean hasCoreModelBinding() - { - return bitDisplay != null; - } - - public CoreBitDisplay getBitDisplay() - { - return bitDisplay; - } - - public Pin getInputPin() - { - return inputPin; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "BitDisplay"; - } - - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new BitDisplayAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelBitDisplay.class.getCanonicalName(), - (m, p, n) -> new ModelBitDisplay(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java deleted file mode 100644 index 38963536..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java +++ /dev/null @@ -1,168 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import com.google.gson.JsonSyntaxException; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.components.CoreClock; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.OrientationCalculator; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.ClockAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; - -public class ModelClock extends ModelComponent -{ - private static final double width = 20; - private static final double height = 20; - private static final double fontHeight = 5; - - private final Pin outputPin; - - private final LogicObserver logicObs; - private ModelClockParams params; - private OrientationCalculator oc; - private CoreClock clock; - - public ModelClock(LogicModelModifiable model, ModelClockParams params) - { - this(model, params, null); - } - - public ModelClock(LogicModelModifiable model, ModelClockParams params, String name) - { - super(model, name, false); - this.params = params; - logicObs = (i) -> model.requestRedraw(); - - oc = new OrientationCalculator(params.orientation, width, height); - setSize(oc.width(), oc.height()); - - this.outputPin = new Pin(model, this, "", 1, PinUsage.OUTPUT, oc.newX(width, height / 2), oc.newY(width, height / 2)); - addPin(outputPin); - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - gc.drawRectangle(getBounds()); - String label = clock == null ? "null" : (clock.isOn() ? "|" : "\u2015"); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (oc.width() - textExtent.x) / 2, getPosY() + (oc.height() - textExtent.y) / 2, true); - gc.setFont(oldFont); - } - - public void setCoreModelBinding(CoreClock clock) - { - if (this.clock != null) - this.clock.deregisterObserver(logicObs); - this.clock = clock; - if (clock != null) - clock.registerObserver(logicObs); - } - - public boolean hasCoreModelBinding() - { - return clock != null; - } - - @Override - public Object getHighLevelState(String stateID) - { - switch (stateID) - { - case "out": - if (clock != null) - return clock.getOut().getInputValues(); - return null; - default: - return super.getHighLevelState(stateID); - } - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - switch (stateID) - { - case "out": - throw new UnsupportedOperationException("cannot set state of clock"); - default: - super.setHighLevelState(stateID, newState); - } - } - - public CoreClock getClock() - { - return clock; - } - - public Pin getOutputPin() - { - return outputPin; - } - - public int getDelta() - { - return params.delta; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Clock"; - } - - @Override - public ModelClockParams getParamsForSerializing(IdentifyParams idParams) - { - return params; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new ClockAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelClock.class.getName(), (m, p, n) -> - { - ModelClockParams params = JsonHandler.fromJsonTree(p, ModelClockParams.class); - if (params == null) - throw new JsonSyntaxException("Invalid!!!"); - return new ModelClock(m, params, n); - }); - } - - public static class ModelClockParams - { - int delta; - Orientation orientation; - - public ModelClockParams(int delta, Orientation orientation) - { - this.delta = delta; - this.orientation = orientation; - } - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java deleted file mode 100644 index 1d3bb1ee..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java +++ /dev/null @@ -1,79 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import java.util.Objects; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.FixedOutputAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; - -public class ModelFixedOutput extends ModelComponent -{ - private static final double width = 20; - private static final double height = 20; - private static final double fontHeight = 5; - - public final BitVector bits; - - public ModelFixedOutput(LogicModelModifiable model, BitVector bits, String name) - { - super(model, name, false); - this.bits = bits; - setSize(width, height); - addPin(new Pin(model, this, "out", bits.length(), PinUsage.OUTPUT, width, height / 2)); - - init(); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "FixedOutput"; - } - - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return bits; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - gc.drawRectangle(getBounds()); - String label = BitVectorFormatter.formatAsString(bits); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); - gc.setFont(oldFont); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new FixedOutputAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelFixedOutput.class.getCanonicalName(), - (m, p, n) -> new ModelFixedOutput(m, Objects.requireNonNull(JsonHandler.fromJsonTree(p, BitVector.class)), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java deleted file mode 100644 index 7a995041..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java +++ /dev/null @@ -1,185 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.ManualSwitchAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.Preferences; - -public class ModelManualSwitch extends ModelComponent -{ - private static final double width = 20; - private static final double height = 15; - private static final double fontHeight = 5; - private static final double heightMiniButtons = 4; // 0 is disabled - - public final int logicWidth; - private final Pin outputPin; - - private final LogicObserver logicObs; - private CoreManualSwitch manualSwitch; - - public ModelManualSwitch(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelManualSwitch(LogicModelModifiable model, int logicWidth, String name) - { - super(model, name, false); - this.logicWidth = logicWidth; - logicObs = (i) -> model.requestRedraw(); - - setSize(width, height); - addPin(this.outputPin = new Pin(model, this, "", logicWidth, PinUsage.OUTPUT, width, height / 2)); - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - gc.drawRectangle(getBounds()); - String label = BitVectorFormatter.formatAsString(manualSwitch == null ? null : manualSwitch.getValues()); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); - gc.setFont(oldFont); - - if (manualSwitch != null && logicWidth > 1 && heightMiniButtons > 0 && visibleRegion.y < getPosY() + heightMiniButtons) - { - double x = getPosX(); - double y = getPosY(); - gc.drawLine(x, y + heightMiniButtons, x + width, y + heightMiniButtons); - Color c = gc.getBackground(); - gc.setBackground(gc.getForeground()); - BitVector bv = manualSwitch.getValues(); - double part = width / bv.length(); - for (int i = 0; i < bv.length(); i++) - { - double start = x + part * i; - if (i != 0) - gc.drawLine(start, y, start, y + heightMiniButtons); - if (bv.getMSBit(i) == Bit.ONE) - { -// gc.fillRectangle(start, y, part, heightMiniButtons); // alternative, but not always visible what Bit is where - gc.drawLine(start, y, start + part, y + heightMiniButtons); - gc.drawLine(start + part, y, start, y + heightMiniButtons); - } - } - gc.setBackground(c); - } - } - - public void setCoreModelBinding(CoreManualSwitch logicSwitch) - { - if (this.manualSwitch != null) - this.manualSwitch.deregisterObserver(logicObs); - this.manualSwitch = logicSwitch; - if (logicSwitch != null) - logicSwitch.registerObserver(logicObs); - } - - public boolean hasCoreModelBinding() - { - return manualSwitch != null; - } - - @Override - public Object getHighLevelState(String stateID) - { - switch (stateID) - { - case "out": - if (manualSwitch != null) - return manualSwitch.getValues(); - return null; - default: - return super.getHighLevelState(stateID); - } - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - switch (stateID) - { - case "out": - if (manualSwitch != null) - manualSwitch.setState((BitVector) newState); - break; - default: - super.setHighLevelState(stateID, newState); - break; - } - } - - @Override - public boolean clicked(double x, double y) - { - if (manualSwitch != null) - { - if (heightMiniButtons > 0 && y - getPosY() < heightMiniButtons) - { - int part = (int) ((x - getPosX()) * logicWidth / width); - manualSwitch.setState(manualSwitch.getValues().withBitChanged(part, Bit::not)); - } else - { - manualSwitch.toggle(); - } - } - return true; - } - - public CoreManualSwitch getManualSwitch() - { - return manualSwitch; - } - - public Pin getOutputPin() - { - return outputPin; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "ManualSwitch"; - } - - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new ManualSwitchAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelManualSwitch.class.getName(), - (m, p, n) -> new ModelManualSwitch(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java deleted file mode 100644 index 6efc9ad3..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.SWT; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.atomic.ModelSplitter.SplitterParams; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.MergerAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -//TODO delete this legacy class -public class ModelMerger extends ModelComponent -{ - private static final double width = 10; - private static final double heightPerPin = 10; - - public final int logicWidth; - private final Pin outputPin; - - private final ReadEnd[] inputEnds; - private ReadEnd outputEnd; - - public ModelMerger(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelMerger(LogicModelModifiable model, int logicWidth, String name) - { - super(model, name, false); - this.logicWidth = logicWidth; - setSize(width, (logicWidth - 1) * heightPerPin); - double inputHeight = (logicWidth - 1) * heightPerPin; - for (int i = 0; i < logicWidth; i++, inputHeight -= 10) - addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, 0, inputHeight)); - addPin(this.outputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, width, (logicWidth - 1) * heightPerPin / 2)); - inputEnds = new ReadEnd[logicWidth]; - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - double posX = getPosX(); - double posY = getPosY(); - - ColorDefinition c = BitVectorFormatter.formatAsColor(outputEnd); - if (c != null) - gc.setForeground(ColorManager.current().toColor(c)); - gc.setLineWidth( - Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); - double outLineY = posY + (logicWidth - 1) * heightPerPin / 2; - gc.drawLine(posX + width / 2, outLineY, posX + width, outLineY); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit")); - double inputHeight = posY; - for (int i = 0; i < logicWidth; i++, inputHeight += 10) - { - c = BitVectorFormatter.formatAsColor(inputEnds[i]); - if (c != null) - gc.setForeground(ColorManager.current().toColor(c)); - gc.drawLine(posX, inputHeight, posX + width / 2, inputHeight); - } - gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground")); - int oldLineCap = gc.getLineCap(); - int lineJoin = gc.getLineJoin(); - // TODO find better "replacement" for JOIN_BEVEL - // TODO it looks weird that the vertical line is thinner than the single multibit wire. - gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE); - gc.drawLine(posX + width / 2, posY, posX + width / 2, posY + heightPerPin * (logicWidth - 1)); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - gc.setLineCap(oldLineCap); - } - - @Override - public Pin getPin(String name) - { - Pin pin = getPinOrNull(name); - return pin == null ? getPin(name.replace('O', 'i').replace('I', 'O').replace('i', 'I')) : pin; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Splitter"; - } - - @Override - public SplitterParams getParamsForSerializing(IdentifyParams idParams) - { - SplitterParams splitterParams = new SplitterParams(); - splitterParams.logicWidth = logicWidth; - splitterParams.orientation = Orientation.LEFT; - return splitterParams; - } - - public void setCoreModelBinding(ReadEnd[] inputEnds, ReadEnd outputEnd) - { - System.arraycopy(inputEnds, 0, this.inputEnds, 0, logicWidth); - this.outputEnd = outputEnd; - } - - public Pin getOutputPin() - { - return outputPin; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new MergerAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelMerger.class.getCanonicalName(), - (m, p, n) -> new ModelMerger(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java deleted file mode 100644 index b4e91d87..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import net.mograsim.logic.core.components.gates.CoreNandGate; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelNandGate extends SimpleRectangularModelGate -{ - public ModelNandGate(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelNandGate(LogicModelModifiable model, int logicWidth, String name) - { - super(model, "NandGate", "&", true, logicWidth, name, false); - setInputCount(2);// TODO make variable - init(); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNandGate.class, CoreNandGate::new)); - IndirectModelComponentCreator.setComponentSupplier(ModelNandGate.class.getCanonicalName(), - (m, p, n) -> new ModelNandGate(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java deleted file mode 100644 index 8f3849f9..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import net.mograsim.logic.core.components.gates.CoreNotGate; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelNotGate extends SimpleRectangularModelGate -{ - public ModelNotGate(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelNotGate(LogicModelModifiable model, int logicWidth, String name) - { - super(model, "NotGate", "1", true, logicWidth, name, false); - setInputCount(1); - init(); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNotGate.class, (t, p, o, i) -> new CoreNotGate(t, p, i[0], o))); - IndirectModelComponentCreator.setComponentSupplier(ModelNotGate.class.getCanonicalName(), - (m, p, n) -> new ModelNotGate(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java deleted file mode 100644 index c09569ed..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import net.mograsim.logic.core.components.gates.CoreOrGate; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelOrGate extends SimpleRectangularModelGate -{ - public ModelOrGate(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelOrGate(LogicModelModifiable model, int logicWidth, String name) - { - super(model, "OrGate", "\u22651", false, logicWidth, name, false);// ">=1" - setInputCount(2); - init(); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelOrGate.class, CoreOrGate::new)); - IndirectModelComponentCreator.setComponentSupplier(ModelOrGate.class.getCanonicalName(), - (m, p, n) -> new ModelOrGate(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java deleted file mode 100644 index 962f2acc..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java +++ /dev/null @@ -1,165 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.SWT; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.OrientationCalculator; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SplitterAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -public class ModelSplitter extends ModelComponent -{ - private static final double width = 10; - private static final double heightPerPin = 10; - - private final double heightWithoutOC; - public final int logicWidth; - private final OrientationCalculator oc; - private final Pin inputPin; - - private ReadEnd inputEnd; - private final ReadEnd[] outputEnds; - - public ModelSplitter(LogicModelModifiable model, SplitterParams params) - { - this(model, params, null); - } - - public ModelSplitter(LogicModelModifiable model, SplitterParams params, String name) - { - super(model, name, false); - this.logicWidth = params.logicWidth; - this.oc = new OrientationCalculator(toggleLeftDownAlt(params.orientation), width, - this.heightWithoutOC = (logicWidth - 1) * heightPerPin); - setSize(oc.width(), oc.height()); - double inLineY = (logicWidth - 1) * heightPerPin / 2; - addPin(this.inputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, oc.newX(0, inLineY), oc.newY(0, inLineY))); - double outputHeight = (logicWidth - 1) * heightPerPin; - for (int i = 0; i < logicWidth; i++, outputHeight -= 10) - addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, oc.newX(width, outputHeight), oc.newY(width, outputHeight))); - outputEnds = new ReadEnd[logicWidth]; - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - double posX = getPosX(); - double posY = getPosY(); - - ColorDefinition c = BitVectorFormatter.formatAsColor(inputEnd); - if (c != null) - gc.setForeground(ColorManager.current().toColor(c)); - gc.setLineWidth( - Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); - double inLineY = heightWithoutOC / 2; - gc.drawLine(posX + oc.newX(0, inLineY), posY + oc.newY(0, inLineY), posX + oc.newX(width / 2, inLineY), - posY + oc.newY(width / 2, inLineY)); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit")); - double outputHeight = 0; - for (int i = 0; i < logicWidth; i++, outputHeight += 10) - { - c = BitVectorFormatter.formatAsColor(outputEnds[i]); - if (c != null) - gc.setForeground(ColorManager.current().toColor(c)); - gc.drawLine(posX + oc.newX(width / 2, outputHeight), posY + oc.newY(width / 2, outputHeight), - posX + oc.newX(width, outputHeight), posY + oc.newY(width, outputHeight)); - } - gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground")); - int oldLineCap = gc.getLineCap(); - int lineJoin = gc.getLineJoin(); - // TODO find better "replacement" for JOIN_BEVEL - // TODO it looks weird that the vertical line is thinner than the single multibit wire. - gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE); - gc.drawLine(posX + oc.newX(width / 2, 0), posY + oc.newY(width / 2, 0), posX + oc.newX(width / 2, heightWithoutOC), - posY + oc.newY(width / 2, heightWithoutOC)); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - gc.setLineCap(oldLineCap); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Splitter"; - } - - @Override - public SplitterParams getParamsForSerializing(IdentifyParams idParams) - { - SplitterParams splitterParams = new SplitterParams(); - splitterParams.logicWidth = logicWidth; - splitterParams.orientation = toggleLeftDownAlt(oc.getOrientation()); - return splitterParams; - } - - public void setCoreModelBinding(ReadEnd inputEnd, ReadEnd[] outputEnds) - { - this.inputEnd = inputEnd; - System.arraycopy(outputEnds, 0, this.outputEnds, 0, logicWidth); - } - - public Pin getInputPin() - { - return inputPin; - } - - /** - * Used to leave bit order intuitive (MSB left or on top) - */ - private static Orientation toggleLeftDownAlt(Orientation orientation) - { - // TODO if we upgrade to Java 12, replace with switch-expression - switch (orientation) - { - case LEFT: - return Orientation.LEFT_ALT; - case LEFT_ALT: - return Orientation.LEFT; - case DOWN: - return Orientation.DOWN_ALT; - case DOWN_ALT: - return Orientation.DOWN; - default: - return orientation; - } - } - - public static class SplitterParams - { - public int logicWidth; - public Orientation orientation; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SplitterAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelSplitter.class.getCanonicalName(), (m, p, n) -> - { - // TODO remove legacy params parsing - SplitterParams params; - if (p.isJsonPrimitive()) - { - params = new SplitterParams(); - params.logicWidth = p.getAsInt(); - params.orientation = Orientation.RIGHT; - } else - params = JsonHandler.fromJsonTree(p, SplitterParams.class); - return new ModelSplitter(m, params, n); - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java deleted file mode 100644 index ac0f64d7..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.NoLogicAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.Preferences; - -//TODO clean size calculation mess -public class ModelTextComponent extends ModelComponent -{ - private final String text; - private boolean calculatedSize; - - public ModelTextComponent(LogicModelModifiable model, String text) - { - this(model, text, null); - } - - public ModelTextComponent(LogicModelModifiable model, String text, String name) - { - super(model, name, false); - this.text = text; - // If size is unset, it defaults to 0, which could prohibit this component from being rendered, which would prohibit the size being - // set to a better guess - setSize(1, 1); - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - if (!calculatedSize) - { - calculatedSize = true; - Point textExtent = gc.textExtent(text); - setSize(textExtent.x, textExtent.y); - } - - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(text, getPosX(), getPosY(), true); - } - - // serializing - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "TextComponent"; - } - - @Override - public String getParamsForSerializing(IdentifyParams idParams) - { - return text; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new NoLogicAdapter<>(ModelTextComponent.class)); - IndirectModelComponentCreator.setComponentSupplier(ModelTextComponent.class.getName(), - (m, p, n) -> new ModelTextComponent(m, p.getAsString(), n)); - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java deleted file mode 100644 index 93bff320..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import com.google.gson.JsonSyntaxException; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.OrientationCalculator; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.TriStateBufferAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; - -public class ModelTriStateBuffer extends ModelComponent -{ - - private static final double width = 20; - private static final double height = 20; - private Pin input; - private Pin output; - private Pin enable; - private double[] path; - - private ModelTriStateBufferParams params; - private OrientationCalculator oc; - - public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params) - { - this(model, params, null); - } - - public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params, String name) - { - super(model, name, false); - this.params = params; - - oc = new OrientationCalculator(params.orientation, width, height); - - double wHalf = width / 2; - double hHalf = height / 2; - double hQuar = height / 4; - - this.input = new Pin(model, this, "IN", params.logicWidth, PinUsage.INPUT, oc.newX(0, hHalf), oc.newY(0, hHalf)); - this.output = new Pin(model, this, "OUT", params.logicWidth, PinUsage.OUTPUT, oc.newX(width, hHalf), oc.newY(width, hHalf)); - this.enable = new Pin(model, this, "EN", 1, PinUsage.INPUT, oc.newX(wHalf, hQuar), oc.newY(wHalf, hQuar)); - this.path = new double[] { oc.newX(0, 0), oc.newY(0, 0), oc.newX(width, hHalf), oc.newY(width, hHalf), oc.newX(0, height), - oc.newY(0, height) }; - - setSize(oc.width(), oc.height()); - addPin(input); - addPin(output); - addPin(enable); - - init(); - } - - public final Pin getInputPin() - { - return input; - } - - public final Pin getOutputPin() - { - return output; - } - - public final Pin getEnablePin() - { - return enable; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - double x = getPosX(); - double y = getPosY(); - gc.drawPolygon(new double[] { x + path[0], y + path[1], x + path[2], y + path[3], x + path[4], y + path[5] }); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "TriStateBuffer"; - } - - @Override - public ModelTriStateBufferParams getParamsForSerializing(IdentifyParams idParams) - { - return params; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new TriStateBufferAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelTriStateBuffer.class.getName(), (m, p, n) -> - { - ModelTriStateBufferParams params = JsonHandler.fromJsonTree(p, ModelTriStateBufferParams.class); - if (params == null) - throw new JsonSyntaxException("Invalid!!!"); - return new ModelTriStateBuffer(m, params, n); - }); - } - - public static class ModelTriStateBufferParams - { - int logicWidth; - Orientation orientation; - - public ModelTriStateBufferParams(int logicWidth, Orientation orientation) - { - this.logicWidth = logicWidth; - this.orientation = orientation; - } - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java deleted file mode 100644 index 8971285a..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java +++ /dev/null @@ -1,161 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleRectangularHardcodedModelComponentAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public abstract class SimpleRectangularHardcodedModelComponent extends ModelComponent -{ - private static final double centerTextHeight = 5; - private static final double pinNamesHeight = 3.5; - private static final double pinNamesMargin = .5; - - private final String id; - - private final DefaultOutlineRenderer outlineRenderer; - private final CenteredTextSymbolRenderer centerTextRenderer; - private final PinNamesSymbolRenderer pinNamesRenderer; - - private AtomicReference state; - private Runnable recalculate; - - // creation and destruction - - public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText) - { - this(model, id, name, centerText, true); - } - - public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText, boolean callInit) - { - super(model, name, false); - this.id = id; - this.outlineRenderer = new DefaultOutlineRenderer(this); - CenteredTextParams centeredTextParams = new CenteredTextParams(); - centeredTextParams.text = centerText; - centeredTextParams.fontHeight = centerTextHeight; - this.centerTextRenderer = new CenteredTextSymbolRenderer(this, centeredTextParams); - PinNamesParams pinNamesParams = new PinNamesParams(); - pinNamesParams.pinLabelHeight = pinNamesHeight; - pinNamesParams.pinLabelMargin = pinNamesMargin; - this.pinNamesRenderer = new PinNamesSymbolRenderer(this, pinNamesParams); - addPinRemovedListener(this::pinRemoved); - setHighLevelStateHandler(new HighLevelStateHandler() - { - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return null;// we don't need to serialize this; it's implicit since we are a SimpleRectangularHardcodedModelComponent - } - - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - @Override - public Object getHighLevelState(String stateID) - { - return SimpleRectangularHardcodedModelComponent.this.getHighLevelState(state.get(), stateID); - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - state.updateAndGet(s -> SimpleRectangularHardcodedModelComponent.this.setHighLevelState(s, stateID, newState)); - recalculate.run(); - } - }); - - if (callInit) - init(); - } - - // pins - - protected void addPin(Pin pin, Position namePosition) - { - super.addPin(pin); // do this first to catch errors - pinNamesRenderer.setPinPosition(pin, namePosition); - } - - private void pinRemoved(Pin pin) - { - pinNamesRenderer.setPinPosition(pin, null); - } - - // high-level access - - @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden - protected Object getHighLevelState(Object state, String stateID) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - // logic - - public abstract Object recalculate(Object lastState, Map readEnds, Map readWriteEnds); - - // core model binding - - public void setCoreModelBindingAndResetState(AtomicReference state, Runnable recalculate) - { - this.state = state; - this.recalculate = recalculate; - } - - // "graphical" operations - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - outlineRenderer.render(gc, visibleRegion); - centerTextRenderer.render(gc, visibleRegion); - pinNamesRenderer.render(gc, visibleRegion); - } - - // serializing - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return id; - } - - // operations no longer supported - - @Override - protected void addPin(Pin pin) - { - throw new UnsupportedOperationException("Can't add pins without setting usage, call addPin(Pin [, Position]) instead"); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleRectangularHardcodedModelComponentAdapter()); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java deleted file mode 100644 index 89366013..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java +++ /dev/null @@ -1,122 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.swt.graphics.Color; - -import com.google.gson.JsonPrimitive; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.preferences.Preferences; - -public class SimpleRectangularModelGate extends ModelComponent -{ - private static final double width = 20; - private static final double pinDistance = 10; - private static final double fontHeight = 5; - private static final double invertedCircleDiam = 3.5; - - private final String id; - - private final String label; - private final boolean isInverted; - protected final int logicWidth; - private final double rectWidth; - - private MovablePin outputPin; - private final List inputPins; - - protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, - String name) - { - this(model, id, label, isInverted, logicWidth, name, true); - } - - protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, - String name, boolean callInit) - { - super(model, name, false); - this.id = id; - this.label = label; - this.logicWidth = logicWidth; - this.isInverted = isInverted; - this.rectWidth = width - (isInverted ? invertedCircleDiam : 0); - this.outputPin = new MovablePin(model, this, "Y", logicWidth, PinUsage.OUTPUT, width, 0); - addPin(outputPin); - this.inputPins = new ArrayList<>(); - setInputCount(1); - - if (callInit) - init(); - } - - protected void setInputCount(int inputCount) - { - int oldInputCount = inputPins.size(); - setSize(width, inputCount * pinDistance); - if (oldInputCount > inputCount) - while (inputPins.size() > inputCount) - removePin(inputPins.remove(inputCount).name); - else if (oldInputCount < inputCount) - for (int i = oldInputCount; i < inputCount; i++) - { - // TODO what for more than 24 input pins? - Pin pin = new Pin(model, this, String.valueOf((char) ('A' + i)), logicWidth, PinUsage.INPUT, 0, - pinDistance / 2 + i * pinDistance); - inputPins.add(pin); - addPin(pin); - } - outputPin.setRelPos(width, inputCount * pinDistance / 2); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - double height = (getPins().size() - 1) * pinDistance; - gc.drawRectangle(getPosX(), getPosY(), rectWidth, height); - if (isInverted) - gc.drawOval(getPosX() + rectWidth, getPosY() + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (rectWidth - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); - gc.setFont(oldFont); - } - - // serializing - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return id; - } - - /** - * {@link SimpleRectangularModelGate}s implementation returns a {@link JsonPrimitive} of type int containing the {@link #logicWidth} of - * this component. - * - * @see ModelComponent#getParamsForSerializing() - */ - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java deleted file mode 100644 index ef567e92..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java +++ /dev/null @@ -1,134 +0,0 @@ -package net.mograsim.logic.model.model.components.submodels; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; - -public class SimpleRectangularSubmodelComponent extends SubmodelComponent -{ - public static final double width = 35; - public static final double pinDistance = 10; - public static final double pinNameMargin = .5; - public static final double labelFontHeight = 5; - public static final double pinNameFontHeight = 3.5; - - public final String label; - protected final int logicWidth; - - private final List inputPinNames; - private final List inputPinNamesUnmodifiable; - private final List outputPinNames; - private final List outputPinNamesUnmodifiable; - - public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label) - { - this(model, logicWidth, label, null); - } - - public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name) - { - this(model, logicWidth, label, name, true); - } - - protected SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name, boolean callInit) - { - super(model, name, false); - this.label = label; - this.logicWidth = logicWidth; - this.inputPinNames = new ArrayList<>(); - this.inputPinNamesUnmodifiable = Collections.unmodifiableList(inputPinNames); - this.outputPinNames = new ArrayList<>(); - this.outputPinNamesUnmodifiable = Collections.unmodifiableList(outputPinNames); - - SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams(); - rendererParams.centerText = label; - rendererParams.centerTextHeight = labelFontHeight; - rendererParams.horizontalComponentCenter = width / 2; - rendererParams.pinLabelHeight = pinNameFontHeight; - rendererParams.pinLabelMargin = pinNameMargin; - setSymbolRenderer(new SimpleRectangularLikeSymbolRenderer(this, rendererParams)); - setOutlineRenderer(new DefaultOutlineRenderer(this)); - - if (callInit) - init(); - } - - protected void setInputPins(String... pinNames) - { - setIOPins(0, inputPinNames, outputPinNames, PinUsage.INPUT, pinNames); - } - - protected void setOutputPins(String... pinNames) - { - setIOPins(width, outputPinNames, inputPinNames, PinUsage.OUTPUT, pinNames); - } - - private void setIOPins(double relX, List pinNamesListThisSide, List pinNamesListOtherSide, PinUsage usage, - String... newPinNames) - { - int inputCount = newPinNames.length; - List newPinNamesList = Arrays.asList(newPinNames); - if (new HashSet<>(newPinNamesList).size() != inputCount) - throw new IllegalArgumentException("Pin names contain duplicates"); - for (String pinName : newPinNamesList) - if (pinNamesListOtherSide.contains(pinName)) - throw new IllegalArgumentException("Can't add pin. There is a pin on the other side with the same name: " + pinName); - super.setSize(width, Math.max(inputCount, pinNamesListOtherSide.size()) * pinDistance); - for (int i = 0; i < inputCount; i++) - { - String pinName = newPinNames[i]; - int oldPinIndex = pinNamesListThisSide.indexOf(pinName); - if (oldPinIndex == -1) - super.addSubmodelInterface( - new MovablePin(model, this, pinName, logicWidth, usage, relX, pinDistance / 2 + i * pinDistance)); - else - getSupermodelMovablePin(pinName).setRelPos(relX, pinDistance / 2 + i * pinDistance); - } - for (String pinName : pinNamesListThisSide) - if (!newPinNamesList.contains(pinName)) - super.removeSubmodelInterface(pinName); - pinNamesListThisSide.clear(); - pinNamesListThisSide.addAll(newPinNamesList); - } - - public List getInputPinNames() - { - return inputPinNamesUnmodifiable; - } - - public List getOutputPinNames() - { - return outputPinNamesUnmodifiable; - } - - @Override - protected Pin addSubmodelInterface(MovablePin supermodelPin) - { - throw new UnsupportedOperationException( - "Can't add submodel interfaces to a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); - } - - @Override - protected void removeSubmodelInterface(String name) - { - throw new UnsupportedOperationException( - "Can't remove submodel interfaces of a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); - } - - @Override - protected void setSize(double width, double height) - { - throw new UnsupportedOperationException( - "Can't set the size of a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java deleted file mode 100644 index 9388e2fb..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java +++ /dev/null @@ -1,477 +0,0 @@ -package net.mograsim.logic.model.model.components.submodels; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Consumer; - -import net.haspamelodica.swt.helper.gcs.GCConfig; -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.gcs.TranslatedGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.LogicUIRenderer; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.serializing.SubmodelComponentParams; -import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; - -/** - * A {@link ModelComponent} consisting of another model. A SubmodelComponent can have so-called "interface pins" connecting the - * inner and outer models. - */ -public abstract class SubmodelComponent extends ModelComponent -{ - public static final String SUBMODEL_INTERFACE_NAME = "_submodelinterface"; - /** - * A modifiable view of {@link #submodel}. - */ - protected final LogicModelModifiable submodelModifiable; - /** - * The model this {@link SubmodelComponent} consists of. - */ - public final LogicModel submodel; - /** - * The list of all submodel interface pins of this {@link SubmodelComponent} on the submodel side. - */ - private final Map submodelPins; - /** - * An unmodifiable view of {@link #submodelPins}. - */ - private final Map submodelMovablePinsUnmodifiable; - /** - * An unmodifiable view of {@link #submodelPins} where pins are not movable. - */ - private final Map submodelUnmovablePinsUnmodifiable; - /** - * The list of all submodel interface pins of this {@link SubmodelComponent} on the supermodel side. - */ - private final Map supermodelPins; - /** - * An unmodifiable view of {@link #supermodelPins}. - */ - private final Map supermodelMovablePinsUnmodifiable; - /** - * An unmodifiable view of {@link #supermodelPins} where pins are not movable. - */ - private final Map supermodelUnmovablePinsUnmodifiable; - /** - * A pseudo-component containing all submodel interface pins on the submodel side. - */ - private final SubmodelInterface submodelInterface; - - /** - * The factor by which the submodel is scaled when rendering. - */ - private double submodelScale; - /** - * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel starts to - * be visible. - */ - private double maxVisibleRegionFillRatioForAlpha0; - /** - * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is fully - * visible. - */ - private double minVisibleRegionFillRatioForAlpha1; - /** - * The renderer used for rendering the submodel. - */ - private final LogicUIRenderer renderer; - - /** - * The {@link Renderer} used to render the symbol of this SubmodelCoponent. - */ - private Renderer symbolRenderer; - /** - * The {@link Renderer} used to render the outline of this SubmodelCoponent. - */ - private Renderer outlineRenderer; - - // creation and destruction - - public SubmodelComponent(LogicModelModifiable model, String name) - { - this(model, name, true); - } - - protected SubmodelComponent(LogicModelModifiable model, String name, boolean callInit) - { - super(model, name, false); - this.submodelModifiable = new LogicModelModifiable(); - this.submodel = submodelModifiable; - this.submodelPins = new HashMap<>(); - this.submodelMovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); - this.submodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); - this.supermodelPins = new HashMap<>(); - this.supermodelMovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); - this.supermodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); - this.submodelInterface = new SubmodelInterface(submodelModifiable); - - this.submodelScale = 1; - this.maxVisibleRegionFillRatioForAlpha0 = 0.8; - this.minVisibleRegionFillRatioForAlpha1 = 0.9; - this.renderer = new LogicUIRenderer(submodelModifiable); - - Consumer redrawHandlerChangedListener = submodelModifiable::setRedrawHandler; - model.addRedrawHandlerChangedListener(redrawHandlerChangedListener); - model.addComponentRemovedListener(c -> - { - if (c == this) - model.removeRedrawHandlerChangedListener(redrawHandlerChangedListener); - }); - submodelModifiable.setRedrawHandler(model.getRedrawHandler()); - - if (callInit) - init(); - } - - // pins - - /** - * Adds a new submodel interface pin. - * - * @param supermodelPin the submodel interface pin on the supermodel side - * - * @return the submodel interface pin on the submodel side - * - * @author Daniel Kirschten - */ - protected Pin addSubmodelInterface(MovablePin supermodelPin) - { - super.addPin(supermodelPin);// do this first to be fail-fast if the supermodel does not belong to this component - - String name = supermodelPin.name; - // TODO if we upgrade to Java 12, replace with switch-expression - PinUsage submodelPinUsage; - switch (supermodelPin.usage) - { - case INPUT: - submodelPinUsage = PinUsage.OUTPUT; - break; - case OUTPUT: - submodelPinUsage = PinUsage.INPUT; - break; - case TRISTATE: - submodelPinUsage = PinUsage.TRISTATE; - break; - default: - throw new IllegalArgumentException("Unknown enum constant: " + supermodelPin.usage); - } - MovablePin submodelPin = new MovablePin(submodelModifiable, submodelInterface, name, supermodelPin.logicWidth, submodelPinUsage, - supermodelPin.getRelX() / submodelScale, supermodelPin.getRelY() / submodelScale); - - submodelPin.addPinMovedListener(p -> - { - double newRelX = p.getRelX() * submodelScale; - double newRelY = p.getRelY() * submodelScale; - if (supermodelPin.getRelX() != newRelX || supermodelPin.getRelY() != newRelY) - supermodelPin.setRelPos(newRelX, newRelY); - }); - supermodelPin.addPinMovedListener(p -> - { - double newRelX = p.getRelX() / submodelScale; - double newRelY = p.getRelY() / submodelScale; - if (submodelPin.getRelX() != newRelX || submodelPin.getRelY() != newRelY) - submodelPin.setRelPos(newRelX, newRelY); - }); - - submodelInterface.addPin(submodelPin); - - submodelPins.put(name, submodelPin); - supermodelPins.put(name, supermodelPin); - - // no need to call requestRedraw() because addPin() will request a redraw - return submodelPin; - } - - /** - * Removes a submodel interface pin. - * - * @author Daniel Kirschten - */ - protected void removeSubmodelInterface(String name) - { - super.removePin(name);// do this first to be fail-fast if this component doesn't have a pin with the given name - Pin submodelPin = submodelPins.remove(name); - submodelInterface.removePin(submodelPin.name); - supermodelPins.remove(name); - - // no need to call requestRedraw() because removePin() will request a redraw - } - - /** - * Returns a collection of submodel interface pins on the submodel side of this component. - * - * @author Daniel Kirschten - */ - public Map getSubmodelPins() - { - return submodelUnmovablePinsUnmodifiable; - } - - /** - * Returns the submodel interface pin with the given name on the submodel side of this component. - * - * @author Daniel Kirschten - */ - public Pin getSubmodelPin(String name) - { - return getSubmodelMovablePin(name); - } - - /** - * Returns a collection of movable submodel interface pins on the submodel side of this component. - * - * @author Daniel Kirschten - */ - protected Map getSubmodelMovablePins() - { - return submodelMovablePinsUnmodifiable; - } - - /** - * Returns the movable submodel interface pin with the given name on the submodel side of this component. - * - * @author Daniel Kirschten - */ - protected MovablePin getSubmodelMovablePin(String name) - { - return submodelPins.get(name); - } - - /** - * Returns a collection of submodel interface pins on the supermodel side of this component. - * - * @author Daniel Kirschten - */ - public Map getSupermodelPins() - { - return supermodelUnmovablePinsUnmodifiable; - } - - /** - * Returns the submodel interface pin with the given name on the supermodel side of this component. - * - * @author Daniel Kirschten - */ - public Pin getSupermodelPin(String name) - { - return getSupermodelMovablePin(name); - } - - /** - * Returns a collection of movable submodel interface pins on the supermodel side of this component. - * - * @author Daniel Kirschten - */ - protected Map getSupermodelMovablePins() - { - return supermodelMovablePinsUnmodifiable; - } - - /** - * Returns the movable submodel interface pin with the given name on the supermodel side of this component. - * - * @author Daniel Kirschten - */ - protected MovablePin getSupermodelMovablePin(String name) - { - return supermodelPins.get(name); - } - - // "graphical" operations - - /** - * Sets the factor by which the submodel is scaled when rendering and calls redrawListeners. Note that the submodel interface pins will - * stay at their position relative to the supermodel, which means they will move relative to the submodel. - * - * @author Daniel Kirschten - */ - protected void setSubmodelScale(double submodelScale) - { - this.submodelScale = submodelScale; - - for (Entry e : supermodelPins.entrySet()) - getSubmodelMovablePin(e.getKey()).setRelPos(e.getValue().getRelX() * submodelScale, e.getValue().getRelY() * submodelScale); - - model.requestRedraw();// needed if there is no submodel interface pin - } - - /** - * Returns the current factor by which the submodel is scaled when rendering. - * - * @author Daniel Kirschten - */ - public double getSubmodelScale() - { - return submodelScale; - } - - /** - * @see #renderSymbol(GeneralGC, Rectangle) - * - * @author Daniel Kirschten - */ - protected void setSymbolRenderer(Renderer symbolRenderer) - { - this.symbolRenderer = symbolRenderer; - model.requestRedraw(); - } - - /** - * @see #renderSymbol(GeneralGC, Rectangle) - * - * @author Daniel Kirschten - */ - public Renderer getSymbolRenderer() - { - return symbolRenderer; - } - - /** - * @see #renderOutline(GeneralGC, Rectangle) - * - * @author Daniel Kirschten - */ - protected void setOutlineRenderer(Renderer outlineRenderer) - { - this.outlineRenderer = outlineRenderer; - model.requestRedraw(); - } - - /** - * @see #renderOutline(GeneralGC, Rectangle) - * - * @author Daniel Kirschten - */ - public Renderer getOutlineRenderer() - { - return outlineRenderer; - } - - @Override - public boolean clicked(double x, double y) - { - double scaledX = (x - getPosX()) / submodelScale; - double scaledY = (y - getPosY()) / submodelScale; - for (ModelComponent component : submodel.getComponentsByName().values()) - if (component.getBounds().contains(scaledX, scaledY) && component.clicked(scaledX, scaledY)) - return true; - return false; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - GCConfig conf = new GCConfig(gc); - GeneralGC tgc = new TranslatedGC(gc, getPosX(), getPosY(), submodelScale, true); - conf.reset(tgc); - double visibleRegionFillRatio = Math.max(getWidth() / visibleRegion.width, getHeight() / visibleRegion.height); - double alphaFactor = map(visibleRegionFillRatio, maxVisibleRegionFillRatioForAlpha0, minVisibleRegionFillRatioForAlpha1, 0, 1); - alphaFactor = Math.max(0, Math.min(1, alphaFactor)); - // we need to take the old alpha into account to support nested submodules better. - int oldAlpha = gc.getAlpha(); - int submodelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * alphaFactor))); - int labelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * (1 - alphaFactor)))); - if (submodelAlpha != 0) - { - gc.setAlpha(submodelAlpha); - renderer.render(tgc, visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale)); - } - if (labelAlpha != 0) - { - gc.setAlpha(labelAlpha); - renderSymbol(gc, visibleRegion); - } - conf.reset(gc); - // reset line width explicitly to avoid rounding errors causing weird glitches - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - // draw the outline after all other operations to make interface pins look better - renderOutline(gc, visibleRegion); - } - - /** - * Render the symbol of this {@link SubmodelComponent}, e.g. the things that should be hidden if the submodel is drawn. - * - * @author Daniel Kirschten - */ - protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion) - { - if (symbolRenderer != null) - symbolRenderer.render(gc, visibleRegion); - } - - /** - * Render the outline of this {@link SubmodelComponent}, e.g. the graphical elements that should stay visible if the submodel is drawn. - * - * @author Daniel Kirschten - */ - protected void renderOutline(GeneralGC gc, Rectangle visibleRegion) - { - if (outlineRenderer != null) - outlineRenderer.render(gc, visibleRegion); - } - - private static double map(double val, double valMin, double valMax, double mapMin, double mapMax) - { - return mapMin + (val - valMin) * (mapMax - mapMin) / (valMax - valMin); - } - - // serializing - - /** - * {@link SubmodelComponent}'s implementation of {@link ModelComponent#getIDForSerializing(IdentifyParams)} returns "submodel". It is - * recommended to override this behaviour. - * - * @see ModelComponent#getIDForSerializing(IdentifyParams) - * @see ModelComponent#getParamsForSerializing(IdentifyParams) - */ - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "submodel";// TODO what ID? - } - - /** - * {@link SubmodelComponent}'s implementation of {@link ModelComponent#getParamsForSerializing(IdentifyParams)} returns an instance of - * {@link SubmodelComponentParams}. It is recommended to override this behaviour. - * - * @see ModelComponent#getIDForSerializing(IdentifyParams) - * @see ModelComponent#getParamsForSerializing(IdentifyParams) - */ - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return SubmodelComponentSerializer.serialize(this, idParams); - } - - // operations no longer supported - - @Override - protected void addPin(Pin pin) - { - throw new UnsupportedOperationException("Can't add pins to a SubmodelComponent directly, call addSubmodelInterface instead"); - } - - @Override - protected void removePin(String name) - { - throw new UnsupportedOperationException("Can't remove pins of a SubmodelComponent directly, call removeSubmodelInterface instead"); - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(SubmodelComponent.class.getCanonicalName(), - (m, p, n) -> SubmodelComponentSerializer.deserialize(m, JsonHandler.fromJsonTree(p, SubmodelComponentParams.class), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java deleted file mode 100644 index 331db123..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.mograsim.logic.model.model.components.submodels; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; - -public class SubmodelInterface extends ModelComponent -{ - public SubmodelInterface(LogicModelModifiable model) - { - super(model, SubmodelComponent.SUBMODEL_INTERFACE_NAME, true); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - {// nothing to do here - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - throw new UnsupportedOperationException("A SubmodelInterface can't be serialized. Use SubmodelComponent.addSubmodelInterface"); - } - - /** - * {@inheritDoc}
- * This method is only marked public in {@link SubmodelInterface} for {@link SubmodelComponent} to be able to add / remove pins to / - * from a SubmodelInterface.
- * - * @see ModelComponent#removePin(Pin) - * - * @author Daniel Kirschten - */ - @Override - public void addPin(Pin pin) - { - super.addPin(pin); - } - - /** - * {@inheritDoc}
- * This method is only marked public in {@link SubmodelInterface} for {@link SubmodelComponent} to be able to add / remove pins to / - * from a SubmodelInterface.
- * - * @see ModelComponent#removePin(Pin) - * - * @author Daniel Kirschten - */ - @Override - protected void removePin(String name) - { - super.removePin(name); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java deleted file mode 100644 index 1f44f570..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java +++ /dev/null @@ -1,531 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; - -import org.eclipse.swt.SWT; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -/** - * A wire connecting exactly two {@link Pin}s. - * - * @author Daniel Kirschten - */ -public class ModelWire -{ - /** - * The model this wire is a part of. - */ - private final LogicModelModifiable model; - /** - * The name of this wire. Is unique for all wires in its model. - */ - public final String name; - /** - * The logical width of this wire. Is equal to the logical width of {@link #pin1} and {@link #pin2}. - */ - public final int logicWidth; - /** - * The {@link Pin} on one side of this wire, usually the signal source. - */ - private Pin pin1; - /** - * The {@link Pin} on one side of this wire, usually the signal target. - */ - private Pin pin2; - /** - * The user-defined path between {@link #pin1} and {@link #pin2}.
- * Special cases: null means "choose an interpolation as fits", and an empty array means "direct connection without any - * interpolation". - */ - private Point[] path; - /** - * The bounds of this wire, excluding line width (and line joins, if the line join is {@link SWT#JOIN_MITER}) - */ - private final Rectangle bounds; - /** - * The effective path of this wire, including automatic interpolation and the position of both {@link Pin}s. Is never null. - */ - private double[] effectivePath; - - private final List> pathChangedListeners; - - /** - * A LogicObserver calling redrawListeners. Used for core model bindings. - */ - private final LogicObserver logicObs; - /** - * A ReadEnd of the core wire this model wire currently is bound to. - */ - private ReadEnd end; - - // creation and destruction - - /** - * Creates a new {@link ModelWire} with automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2) - { - this(model, null, pin1, pin2); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, Pin pin2) - { - this(model, null, pin1, pin2); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, Pin pin1, ModelWireCrossPoint pin2) - { - this(model, null, pin1, pin2); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, Pin pin1, Pin pin2) - { - this(model, null, pin1, pin2); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2, Point... path) - { - this(model, null, pin1, pin2, path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, Pin pin2, Point... path) - { - this(model, null, pin1, pin2, path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, Pin pin1, ModelWireCrossPoint pin2, Point... path) - { - this(model, null, pin1, pin2, path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, Pin pin1, Pin pin2, Point... path) - { - this(model, null, pin1, pin2, path); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2) - { - this(model, name, pin1, pin2, (Point[]) null); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, Pin pin2) - { - this(model, name, pin1, pin2, (Point[]) null); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, Pin pin1, ModelWireCrossPoint pin2) - { - this(model, name, pin1, pin2, (Point[]) null); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, Pin pin1, Pin pin2) - { - this(model, name, pin1, pin2, (Point[]) null); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2, Point... path) - { - this(model, name, pin1.getPin(), pin2.getPin(), path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, Pin pin2, Point... path) - { - this(model, name, pin1.getPin(), pin2, path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, Pin pin1, ModelWireCrossPoint pin2, Point... path) - { - this(model, name, pin1, pin2.getPin(), path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, Pin pin1, Pin pin2, Point... path) - { - this.model = model; - this.name = name == null ? model.getDefaultWireName() : name; - this.logicWidth = pin1.logicWidth; - if (pin2.logicWidth != pin1.logicWidth) - throw new IllegalArgumentException("Can't connect pins of different logic width"); - - this.pin1 = pin1; - this.pin2 = pin2; - - this.path = path == null ? null : Arrays.copyOf(path, path.length); - this.bounds = new Rectangle(0, 0, -1, -1); - - pathChangedListeners = new ArrayList<>(); - - logicObs = (i) -> model.requestRedraw(); - - pin1.addPinMovedListener(p -> pinMoved()); - pin2.addPinMovedListener(p -> pinMoved()); - - recalculateEffectivePath(); - - model.wireCreated(this, this::destroyed); - } - - /** - * Destroys this wire. This method is called from {@link LogicModelModifiable#wireDestroyed(ModelWire) wireDestroyed()} of the model - * this wire is a part of. - * - * @author Daniel Kirschten - */ - private void destroyed() - { - // nothing to do - } - - // pins - - /** - * Returns the {@link Pin} on one side of this wire, usually the signal source. - * - * @author Daniel Kirschten - */ - public Pin getPin1() - { - return pin1; - } - - /** - * Returns the {@link Pin} on one side of this wire, usually the signal target. - * - * @author Daniel Kirschten - */ - public Pin getPin2() - { - return pin2; - } - - /** - * Called when {@link #pin1} or {@link #pin2} were moved. - * - * @author Daniel Kirschten - */ - private void pinMoved() - { - recalculateEffectivePath(); - model.requestRedraw(); - } - - // "graphical" operations - - /** - * Recalculates {@link #effectivePath} "from scratch". Also updates {@link #bounds}. - * - * @author Daniel Kirschten - */ - private void recalculateEffectivePath() - { - Point pos1 = pin1.getPos(), pos2 = pin2.getPos(); - - double boundsX1 = Math.min(pos1.x, pos2.x); - double boundsY1 = Math.min(pos1.y, pos2.y); - double boundsX2 = Math.max(pos1.x, pos2.x); - double boundsY2 = Math.max(pos1.y, pos2.y); - - if (path == null) - effectivePath = new double[] { pos1.x, pos1.y, (pos1.x + pos2.x) / 2, pos1.y, (pos1.x + pos2.x) / 2, pos2.y, pos2.x, pos2.y }; - else - { - effectivePath = new double[path.length * 2 + 4]; - effectivePath[0] = pos1.x; - effectivePath[1] = pos1.y; - for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2) - { - double pathX = path[srcI].x; - double pathY = path[srcI].y; - effectivePath[dstI + 0] = pathX; - effectivePath[dstI + 1] = pathY; - if (pathX < boundsX1) - boundsX1 = pathX; - if (pathX > boundsX2) - boundsX2 = pathX; - if (pathY < boundsY1) - boundsY1 = pathY; - if (pathY > boundsY2) - boundsY2 = pathY; - } - effectivePath[effectivePath.length - 2] = pos2.x; - effectivePath[effectivePath.length - 1] = pos2.y; - } - - bounds.x = boundsX1; - bounds.y = boundsY1; - bounds.width = boundsX2 - boundsX1; - bounds.height = boundsY2 - boundsY1; - } - - /** - * Returns the bounds of this wire, excluding line width (and line joins, if the line join is {@link SWT#JOIN_MITER}) - * - * @author Daniel Kirschten - */ - public Rectangle getBounds() - { - return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); - } - - /** - * Render this wire to the given gc, in absoulute coordinates. - * - * @author Daniel Kirschten - */ - public void render(GeneralGC gc) - { - ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end); - if (wireColor != null) - gc.setForeground(ColorManager.current().toColor(wireColor)); - gc.setLineWidth( - Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); - gc.drawPolyline(effectivePath); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - } - - // operations concerning the path - - /** - * The user-defined path between {@link #pin1} and {@link #pin2}. Note that this is not neccessarily equal to the effective path drawn - * in {@link #render(GeneralGC)}.
- * Special cases: null means "choose an interpolation as fits", and an empty array means "direct connection without any - * interpolation". - * - * @author Daniel Kirschten - */ - public Point[] getPath() - { - return deepPathCopy(path); - } - - public void setPath(Point... path) - { - this.path = deepPathCopy(path); - recalculateEffectivePath(); - callPathChangedListeners(); - model.requestRedraw(); - } - - public Point getPathPoint(int index) - { - return pointCopy(path[index]); - } - - public void setPathPoint(Point p, int index) - { - path[index] = pointCopy(p); - recalculateEffectivePath(); - callPathChangedListeners(); - model.requestRedraw(); - } - - public void insertPathPoint(Point p, int index) - { - if (path == null) - path = new Point[] { pointCopy(p) }; - else - { - Point[] oldPath = path; - path = new Point[oldPath.length + 1]; - System.arraycopy(oldPath, 0, path, 0, index); - if (index < oldPath.length) - System.arraycopy(oldPath, index, path, index + 1, oldPath.length - index); - path[index] = pointCopy(p); - } - recalculateEffectivePath(); - callPathChangedListeners(); - } - - public void removePathPoint(int index) - { - if (path.length == 0) - path = null; - else - { - Point[] oldPath = path; - path = new Point[oldPath.length - 1]; - System.arraycopy(oldPath, 0, path, 0, index); - if (index < oldPath.length - 1) - System.arraycopy(oldPath, index + 1, path, index, oldPath.length - index - 1); - } - recalculateEffectivePath(); - callPathChangedListeners(); - } - - public double[] getEffectivePath() - { - return Arrays.copyOf(effectivePath, effectivePath.length); - } - - private static Point[] deepPathCopy(Point[] path) - { - if (path == null) - return null; - Point[] copy = new Point[path.length]; - for (int i = 0; i < path.length; i++) - copy[i] = pointCopy(path[i]); - return copy; - } - - private static Point pointCopy(Point p) - { - return new Point(p.x, p.y); - } - - // core model binding - - /** - * Binds this {@link ModelWire} to the given {@link ReadEnd}: The color of this {@link ModelWire} will now depend on the state of the - * given {@link ReadEnd}, and further changes of the given {@link ReadEnd} will result in readrawListeners being called.
- * The argument can be null, in which case the old binding is stopped. - * - * @author Daniel Kirschten - */ - public void setCoreModelBinding(ReadEnd end) - { - if (this.end != null) - this.end.deregisterObserver(logicObs); - this.end = end; - if (end != null) - end.registerObserver(logicObs); - } - - /** - * Returns whether this {@link ModelWire} has a core model binding or not. - * - * @author Daniel Kirschten - */ - public boolean hasCoreModelBinding() - { - return end != null; - } - - /** - * If this {@link ModelWire} has a core model binding, delegates to {@link CoreWire#forceValues(BitVector)} for the {@link CoreWire} - * corresponding to this {@link ModelWire}. - * - * @author Daniel Kirschten - */ - public void forceWireValues(BitVector values) - { - end.getWire().forceValues(values); - } - - /** - * If this {@link ModelWire} has a core model binding, delegates to {@link ReadEnd#getValues()} for the {@link ReadEnd} corresponding to - * this {@link ModelWire}. - * - * @author Daniel Kirschten - */ - public BitVector getWireValues() - { - return end.getValues(); - } - - // listeners - - // @formatter:off - public void addPathChangedListener (Consumer listener) {pathChangedListeners.add (listener);} - - public void removePathChangedListener(Consumer listener) {pathChangedListeners.remove(listener);} - - private void callPathChangedListeners() {pathChangedListeners.forEach(l -> l.accept(this));} - // @formatter:on - - @Override - public String toString() - { - return "ModelWire [" + pin1 + "---" + pin2 + ", value=" + (end == null ? "null" : end.getValues()) + "]"; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java deleted file mode 100644 index b9a5ccc6..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java +++ /dev/null @@ -1,140 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; - -/** - * A {@link ModelComponent} with only one pin. Is used to create wires connecting more than two pins.
- * Example: There are three pins P1, P2, P3 that need to be connected. Solution: Create a - * ModelWireCrossPoint (WCP) and create the ModelWires P1-WCP, P2-WCP, - * P3-WCP.
- * Cross points are drawn as circles. The pin of cross points is in the center of this circle. - * - * @author Daniel Kirschten - */ -public class ModelWireCrossPoint extends ModelComponent -{ - private static final int CIRCLE_RADIUS = 1; - private static final int CIRCLE_DIAM = CIRCLE_RADIUS * 2; - - /** - * The logical width of this cross point. - */ - public final int logicWidth; - /** - * The (single) pin of this cross point. - */ - private final Pin pin; - - /** - * A {@link LogicObserver} calling {@link #requestRedraw()}. - */ - private final LogicObserver logicObs; - /** - * The {@link ReadEnd} currently bound to this cross point. - */ - private ReadEnd end; - - // creation and destruction - - public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth, String name) - { - super(model, name, false); - this.logicWidth = logicWidth; - logicObs = (i) -> model.requestRedraw(); - - setSize(CIRCLE_DIAM, CIRCLE_DIAM); - addPin(this.pin = new Pin(model, this, "", logicWidth, PinUsage.TRISTATE, CIRCLE_RADIUS, CIRCLE_RADIUS)); - - init(); - } - - // pins - - public Pin getPin() - { - return pin; - } - - // "graphical" operations - - /** - * Moves the center (and therefore the pin) of this {@link ModelWireCrossPoint} to the given location. - * - * @author Daniel Kirschten - */ - public void moveCenterTo(double x, double y) - { - moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end); - if (wireColor != null) - gc.setBackground(ColorManager.current().toColor(wireColor)); - gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); - } - - // core model binding - - /** - * Binds this {@link ModelWireCrossPoint} to the given {@link ReadEnd}: The color of this {@link ModelWireCrossPoint} will now depend on - * the state of the given {@link ReadEnd}, and further changes of the given {@link ReadEnd} will result in readrawListeners being - * called.
- * The argument can be null, in which case the old binding is stopped. - * - * @author Daniel Kirschten - */ - public void setCoreModelBinding(ReadEnd end) - { - if (this.end != null) - this.end.deregisterObserver(logicObs); - this.end = end; - if (end != null) - end.registerObserver(logicObs); - } - - /** - * Returns whether this {@link ModelWireCrossPoint} has a core model binding or not. - */ - public boolean hasCoreModelBinding() - { - return end != null; - } - - // serializing - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "WireCrossPoint"; - } - - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelWireCrossPoint.class.getCanonicalName(), - (m, p, n) -> new ModelWireCrossPoint(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java deleted file mode 100644 index c2291f81..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; - -/** - * Exactly like {@link Pin}, but {@link #setRelPos(double, double) setRelPos(...)} is public. - * - * @author Daniel Kirschten - */ -public class MovablePin extends Pin -{ - public MovablePin(LogicModelModifiable model, ModelComponent component, String name, int logicWidth, PinUsage usage, double relX, - double relY) - { - super(model, component, name, logicWidth, usage, relX, relY); - } - - @Override - public void setRelPos(double relX, double relY) - { - super.setRelPos(relX, relY); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java deleted file mode 100644 index e9136416..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java +++ /dev/null @@ -1,168 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.function.Consumer; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; - -/** - * A connection interface between a ModelComponent and the rest of a LogicModel. Pins usually are created by {@link ModelComponent}s - * themselves.
- * A pin has a name identifying it. Pin names are unique for a {@link ModelComponent}: Every pin of a {@link ModelComponent} has a different - * name, but different {@link ModelComponent}s can have pins with the same name. - * - * @author Daniel Kirschten - */ -public class Pin -{ - /** - * The {@link LogicModel} the component this pin belongs to is a part of. - */ - private final LogicModelModifiable model; - /** - * The {@link ModelComponent} this pin belongs to. - */ - public final ModelComponent component; - /** - * The name identifying this pin. Is unique for a {@link ModelComponent}. - */ - public final String name; - /** - * The logical width of this pin. Denotes how many bits this pin consists of. - */ - public final int logicWidth; - /** - * How this pin is used by the component it belongs to.
- * Note that this is only a hint. - */ - public final PinUsage usage; - - /** - * The X position of this pin, relative to its component's location. - */ - protected double relX; - /** - * The Y position of this pin, relative to its component's location. - */ - protected double relY; - - private final List> pinMovedListeners; - private final List redrawListeners; - - // creation and destruction - - /** - * Creates a new pin. Usually it is not needed to call this constructor manually, as {@link ModelComponent}s create their pins - * themselves. - * - * @author Daniel Kirschten - */ - public Pin(LogicModelModifiable model, ModelComponent component, String name, int logicWidth, PinUsage usage, double relX, double relY) - { - this.model = model; - this.component = component; - this.name = name; - this.logicWidth = logicWidth; - this.usage = Objects.requireNonNull(usage); - this.relX = relX; - this.relY = relY; - - this.pinMovedListeners = new ArrayList<>(); - this.redrawListeners = new ArrayList<>(); - - component.addComponentMovedListener(c -> callPinMovedListeners()); - } - - /** - * Destroys this pin by removing all wires connected to it from the model the component is a part of.
- * Don't call this method from application code as it is automatically called in {@link ModelComponent#removePin(String)}. - */ - public void destroyed() - { - Set connectedWires = new HashSet<>(); - for (ModelWire w : model.getWiresByName().values()) - if (w.getPin1() == this || w.getPin2() == this) - connectedWires.add(w); - connectedWires.forEach(model::destroyWire); - } - - // "graphical" operations - - /** - * Returns the X position of this pin relative to the position of its component. - * - * @author Daniel Kirschten - */ - public double getRelX() - { - return relX; - } - - /** - * Returns the Y position of this pin relative to the position of its component. - * - * @author Daniel Kirschten - */ - public double getRelY() - { - return relY; - } - - /** - * Returns the position of this pin relative to the position of its component. - * - * @author Daniel Kirschten - */ - public Point getRelPos() - { - return new Point(relX, relY); - } - - /** - * Returns the absolute position of this pin. - * - * @author Daniel Kirschten - */ - public Point getPos() - { - return new Point(relX + component.getPosX(), relY + component.getPosY()); - } - - /** - * Sets the position of this pin relative to the position of its component. - * - * @author Daniel Kirschten - */ - protected void setRelPos(double relX, double relY) - { - this.relX = relX; - this.relY = relY; - callPinMovedListeners(); - callRedrawListeners(); - } - - // listeners - - // @formatter:off - public void addPinMovedListener (Consumer listener){pinMovedListeners.add (listener);} - public void addRedrawListener (Runnable listener){redrawListeners .add (listener);} - - public void removePinMovedListener(Consumer listener){pinMovedListeners.remove(listener);} - public void removeRedrawListener (Runnable listener){redrawListeners .remove(listener);} - - private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));} - private void callRedrawListeners () {redrawListeners .forEach(l -> l.run ( ));} - // @formatter:on - - @Override - public String toString() - { - return "Pin " + name + " of " + component.getName(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java deleted file mode 100644 index f229d023..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -public enum PinUsage -{ - /** - * The component never affects the value of the wire connected to the pin. - */ - INPUT, - /** - * The component is never affected by the value of the wire connected to this pin. This includes the look of the component. - */ - OUTPUT, - /** - * The component (sometimes) affects the value of the wire connected to the pin, but is also (sometimes) affected by the value of this - * wire. - */ - TRISTATE; -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java deleted file mode 100644 index db3b5ac6..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.mograsim.logic.model.modeladapter; - -public class CoreModelParameters -{ - public int wireTravelTime; - public int gateProcessTime; -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java deleted file mode 100644 index 70f256ab..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java +++ /dev/null @@ -1,165 +0,0 @@ -package net.mograsim.logic.model.modeladapter; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; - -public class LogicCoreAdapter -{ - private final static Map, ComponentAdapter> componentAdapters = new HashMap<>(); - - public static void addComponentAdapter(ComponentAdapter componentAdapter) - { - componentAdapters.put(componentAdapter.getSupportedClass(), componentAdapter); - } - - public static Timeline convert(LogicModel logicModel, CoreModelParameters params) - { - // TODO replace Timeline with CoreModel as soon as it exists - Timeline timeline = new Timeline(10); - - convert(logicModel, params, timeline, Map.of()); - - return timeline; - } - - private static void convert(LogicModel logicModel, CoreModelParameters params, Timeline timeline, Map externalWires) - { - Map logicWiresPerPin = convertWires(getAllPins(logicModel), logicModel.getWiresByName().values(), externalWires, - params, timeline); - Map logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin); - - for (ModelComponent modelComp : logicModel.getComponentsByName().values()) - { - if (modelComp instanceof SubmodelComponent) - { - SubmodelComponent modelCompCasted = (SubmodelComponent) modelComp; - Map supermodelPins = modelCompCasted.getSupermodelPins(); - Map externalWiresForSubmodel = supermodelPins.entrySet().stream().collect( - Collectors.toMap(e -> modelCompCasted.getSubmodelPin(e.getKey()), e -> logicWiresPerPin.get(e.getValue()))); - convert(modelCompCasted.submodel, params, timeline, externalWiresForSubmodel); - } else if (modelComp instanceof ModelWireCrossPoint) - { - ModelWireCrossPoint modelCompCasted = (ModelWireCrossPoint) modelComp; - modelCompCasted.setCoreModelBinding(logicWiresPerPin.get(modelCompCasted.getPin()).createReadOnlyEnd()); - } else if (!(modelComp instanceof SubmodelInterface))// nothing to do for SubmodelInterfaces - createAndLinkComponent(timeline, params, modelComp, logicWiresPerPinUnmodifiable); - } - } - - private static Set getAllPins(LogicModel logicModel) - { - return logicModel.getComponentsByName().values().stream().flatMap(component -> component.getPins().values().stream()) - .collect(Collectors.toSet()); - } - - private static Map convertWires(Set allPins, Collection wires, Map externalWires, - CoreModelParameters params, Timeline timeline) - { - Map> connectedPinGroups = getConnectedPinGroups(allPins, wires); - Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups, externalWires); - setModelWiresCoreModelBinding(wires, logicWiresPerPin); - return logicWiresPerPin; - } - - private static Map createLogicWires(CoreModelParameters params, Timeline timeline, Map> connectedPinGroups, - Map externalWires) - { - Map logicWiresPerPin = new HashMap<>(); - Map, CoreWire> logicWiresPerPinGroup = new HashMap<>(); - for (Entry> e : connectedPinGroups.entrySet()) - logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(), set -> - { - CoreWire externalWire = null; - for (Pin p : set) - { - CoreWire externalWireCandidate = externalWires.get(p); - if (externalWireCandidate != null) - if (externalWire == null) - externalWire = externalWireCandidate; - else if (externalWire.width == externalWireCandidate.width) - CoreWire.fuse(externalWire, externalWireCandidate); - else - throw new IllegalArgumentException( - "Two pins to external wires with different logicWidths can't be connected directly"); - } - return externalWire == null ? new CoreWire(timeline, e.getKey().logicWidth, params.wireTravelTime) : externalWire; - })); - return logicWiresPerPin; - } - - private static void setModelWiresCoreModelBinding(Collection wires, Map logicWiresPerPin) - { - Map modelWireSharedReadEnd = logicWiresPerPin.values().stream().distinct() - .collect(Collectors.toMap(Function.identity(), CoreWire::createReadOnlyEnd)); - for (ModelWire modelWire : wires) - modelWire.setCoreModelBinding(modelWireSharedReadEnd.get(logicWiresPerPin.get(modelWire.getPin1()))); - } - - private static Map> getConnectedPinGroups(Set allPins, Collection wires) - { - Map> connectedPinsPerPin = new HashMap<>(); - - for (Pin p : allPins) - { - HashSet connectedPins = new HashSet<>(); - connectedPins.add(p); - connectedPinsPerPin.put(p, connectedPins); - } - - wires.forEach(wire -> - { - Pin pin1 = wire.getPin1(); - Pin pin2 = wire.getPin2(); - - Set pin1ConnectedPins = connectedPinsPerPin.get(pin1); - Set pin2ConnectedPins = connectedPinsPerPin.get(pin2); - - pin1ConnectedPins.addAll(pin2ConnectedPins); - pin1ConnectedPins.add(pin1); - pin1ConnectedPins.add(pin2); - - pin2ConnectedPins.forEach(pin -> connectedPinsPerPin.put(pin, pin1ConnectedPins)); - }); - return connectedPinsPerPin; - } - - @SuppressWarnings("unchecked") - private static void createAndLinkComponent(Timeline timeline, CoreModelParameters params, - ModelComponent modelComponent, Map logicWiresPerPin) - { - Class cls = modelComponent.getClass(); - ComponentAdapter adapter = null; - while (cls != ModelComponent.class && adapter == null) - { - adapter = (ComponentAdapter) componentAdapters.get(cls); - cls = cls.getSuperclass(); - } - if (adapter == null) - throw new IllegalArgumentException("Unknown component class: " + modelComponent.getClass()); - adapter.createAndLinkComponent(timeline, params, (G) modelComponent, logicWiresPerPin); - } - - private LogicCoreAdapter() - { - throw new UnsupportedOperationException("No LogicCoreAdapter instances"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java deleted file mode 100644 index 517e9464..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class BitDisplayAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelBitDisplay.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelBitDisplay modelComponent, - Map logicWiresPerPin) - { - ReadEnd end = logicWiresPerPin.get(modelComponent.getInputPin()).createReadOnlyEnd(); - CoreBitDisplay bitDisplay = new CoreBitDisplay(timeline, end); - modelComponent.setCoreModelBinding(bitDisplay); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java deleted file mode 100644 index adcda831..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreClock; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.ModelClock; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class ClockAdapter implements ComponentAdapter -{ - - @Override - public Class getSupportedClass() - { - return ModelClock.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelClock modelClock, - Map logicWiresPerPin) - { - ReadWriteEnd out = logicWiresPerPin.get(modelClock.getOutputPin()).createReadWriteEnd(); - CoreClock c = new CoreClock(timeline, out, modelClock.getDelta()); - modelClock.setCoreModelBinding(c); - } - -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java deleted file mode 100644 index d7f2d2cf..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public interface ComponentAdapter -{ - public Class getSupportedClass(); - - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, G modelComponent, - Map logicWiresPerPin); -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java deleted file mode 100644 index f8236652..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.model.model.components.atomic.ModelFixedOutput; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class FixedOutputAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelFixedOutput.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelFixedOutput modelComponent, - Map logicWiresPerPin) - { - logicWiresPerPin.get(modelComponent.getPin("out")).createReadWriteEnd().feedSignals(modelComponent.bits); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java deleted file mode 100644 index 75305f61..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class ManualSwitchAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelManualSwitch.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelManualSwitch modelComponent, - Map logicWiresPerPin) - { - ReadWriteEnd end = logicWiresPerPin.get(modelComponent.getOutputPin()).createReadWriteEnd(); - CoreManualSwitch manualSwitch = new CoreManualSwitch(timeline, end); - modelComponent.setCoreModelBinding(manualSwitch); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java deleted file mode 100644 index 22d61122..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.components.atomic.ModelMerger; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class MergerAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelMerger.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelMerger modelComponent, - Map logicWiresPerPin) - { - CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O")); - ReadEnd[] inputEnds = new ReadEnd[modelComponent.logicWidth]; - for (int i = 0; i < modelComponent.logicWidth; i++) - { - CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I" + (modelComponent.logicWidth - 1 - i))); - CoreWire.fuse(input, output, 0, i); - inputEnds[i] = input.createReadOnlyEnd(); - } - modelComponent.setCoreModelBinding(inputEnds, output.createReadOnlyEnd()); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java deleted file mode 100644 index ea87e78e..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -/** - * For ModelComponents that do not have any simulation logic behaviour - * - * @author Christian Femers - */ -public class NoLogicAdapter implements ComponentAdapter -{ - private final Class modelComponentClass; - - public NoLogicAdapter(Class modelComponentClass) - { - this.modelComponentClass = modelComponentClass; - } - - @Override - public Class getSupportedClass() - { - return modelComponentClass; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, T modelComponent, Map logicWiresPerPin) - { - // do nothing - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java deleted file mode 100644 index c38883e6..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularModelGate; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class SimpleGateAdapter implements ComponentAdapter -{ - private final Class supportedClass; - private final ComponentConstructor constructor; - - public SimpleGateAdapter(Class supportedClass, ComponentConstructor constructor) - { - this.supportedClass = supportedClass; - this.constructor = constructor; - } - - @Override - public Class getSupportedClass() - { - return supportedClass; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, G modelComponent, Map logicWiresPerPin) - { - ReadWriteEnd out = logicWiresPerPin.get(modelComponent.getPin("Y")).createReadWriteEnd(); - - // TODO can we do this prettier? - int inputPinCount = modelComponent.getPins().size() - 1; - ReadEnd[] ins = new ReadEnd[inputPinCount]; - for (int i = 0; i < inputPinCount; i++) - ins[i] = logicWiresPerPin.get(modelComponent.getPin(String.valueOf((char) ('A' + i)))).createReadOnlyEnd(); - - constructor.newComponent(timeline, params.gateProcessTime, out, ins); - } - - public static interface ComponentConstructor - { - public CoreComponent newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins); - } - -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java deleted file mode 100644 index dbebc0ff..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class SimpleRectangularHardcodedModelComponentAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return SimpleRectangularHardcodedModelComponent.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, - SimpleRectangularHardcodedModelComponent modelComponent, Map logicWiresPerPin) - { - Map readEnds = new HashMap<>(); - Map readWriteEnds = new HashMap<>(); - - AtomicReference state = new AtomicReference<>(); - - Runnable recalculate = () -> state.updateAndGet(s -> modelComponent.recalculate(s, readEnds, readWriteEnds)); - LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime); - - modelComponent.setCoreModelBindingAndResetState(state, recalculate); - - for (Pin pin : modelComponent.getPins().values()) - { - CoreWire wire = logicWiresPerPin.get(pin); - ReadEnd end; - if (pin.usage != PinUsage.INPUT) - { - ReadWriteEnd rwEnd = wire.createReadWriteEnd(); - readWriteEnds.put(pin.name, rwEnd); - end = rwEnd; - } else - end = wire.createReadOnlyEnd(); - readEnds.put(pin.name, end); - if (pin.usage != PinUsage.OUTPUT) - end.registerObserver(logicObs); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java deleted file mode 100644 index 3cfa5f28..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.components.atomic.ModelSplitter; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class SplitterAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelSplitter.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelSplitter modelComponent, - Map logicWiresPerPin) - { - CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I")); - ReadEnd[] outputEnds = new ReadEnd[modelComponent.logicWidth]; - for (int i = 0; i < modelComponent.logicWidth; i++) - { - CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O" + (modelComponent.logicWidth - 1 - i))); - CoreWire.fuse(input, output, i, 0); - outputEnds[i] = output.createReadOnlyEnd(); - } - modelComponent.setCoreModelBinding(input.createReadOnlyEnd(), outputEnds); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java deleted file mode 100644 index 56a838b7..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreTriStateBuffer; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class TriStateBufferAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelTriStateBuffer.class; - } - - @SuppressWarnings("unused") - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelTriStateBuffer modelTsb, - Map logicWiresPerPin) - { - ReadEnd in = logicWiresPerPin.get(modelTsb.getPin("IN")).createReadOnlyEnd(); - ReadEnd enable = logicWiresPerPin.get(modelTsb.getPin("EN")).createReadOnlyEnd(); - ReadWriteEnd out = logicWiresPerPin.get(modelTsb.getPin("OUT")).createReadWriteEnd(); - new CoreTriStateBuffer(timeline, params.gateProcessTime, in, out, enable); - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java deleted file mode 100644 index 3a2623ed..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.io.InputStream; - -public abstract class ClassLoaderBasedResourceLoader implements ResourceLoader -{ - @Override - public InputStream loadResource(String path) throws IOException - { - return getClassLoader().getResourceAsStream(path); - } - - @Override - public Class loadClass(String name) throws ClassNotFoundException - { - return ReflectionHelper.tryInvokeStaticInitializer(name, getClassLoader()); - } - - public abstract ClassLoader getClassLoader(); - - public static ClassLoaderBasedResourceLoader create(ClassLoader loader) - { - return new ClassLoaderBasedResourceLoader() - { - @Override - public ClassLoader getClassLoader() - { - return loader; - } - }; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java deleted file mode 100644 index 8e4d459c..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.Renderer; - -public class DeserializedSubmodelComponent extends SubmodelComponent -{ - /** - * If a DeserializedSubmodelComponent is part of another SubmodelComponent, when it it serialized, it should not return its internal - * structure, but rather the component ID used to create it. - * - * @see SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) - * SubmodelComponentSerializer.deserialize(...) - * @see SubmodelComponentSerializer#serialize(SubmodelComponent, java.util.function.Function) SubmodelComponentSerializer.serialize(...) - */ - public final String idForSerializingOverride; - /** - * See {@link #idForSerializingOverride} - */ - public final Object paramsForSerializingOverride; - - public DeserializedSubmodelComponent(LogicModelModifiable model, String name, String idForSerializingOverride, - Object paramsForSerializingOverride) - { - super(model, name, false); - this.idForSerializingOverride = idForSerializingOverride; - this.paramsForSerializingOverride = paramsForSerializingOverride; - init(); - } - - /** - * If this component has an {@link #idForSerializingOverride} set (e.g. non-null) (see - * {@link SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) - * SubmodelComponentSerializer.deserialize(...)}), this ID is returned
- * If this case doesn't apply (this component has no {@link #idForSerializingOverride} set), - * {@link SubmodelComponent#getIDForSerializing(IdentifyParams)} is invoced. - */ - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return idForSerializingOverride == null ? super.getIDForSerializing(idParams) : idForSerializingOverride; - } - - /** - * If this component has an {@link #idForSerializingOverride} set (e.g. non-null) (see - * {@link SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) - * SubmodelComponentSerializer.deserialize(...)}), {@link #paramsForSerializingOverride} is returned
- * If this case doesn't apply (this component has no {@link #idForSerializingOverride} set), - * {@link SubmodelComponent#getParamsForSerializing(IdentifyParams)} is invoced. - */ - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return idForSerializingOverride == null ? super.getParamsForSerializing(idParams) : paramsForSerializingOverride; - } - - @Override - public void setSymbolRenderer(Renderer symbolRenderer) - { - super.setSymbolRenderer(symbolRenderer); - } - - @Override - public void setOutlineRenderer(Renderer outlineRenderer) - { - super.setOutlineRenderer(outlineRenderer); - } - - @Override - public void setHighLevelStateHandler(HighLevelStateHandler handler) - { - super.setHighLevelStateHandler(handler); - } - - public LogicModelModifiable getSubmodelModifiable() - { - return submodelModifiable; - } - - @Override - public void setSubmodelScale(double submodelScale) - { - super.setSubmodelScale(submodelScale); - } - - @Override - public void setSize(double width, double height) - { - super.setSize(width, height); - } - - @Override - public Pin addSubmodelInterface(MovablePin supermodelPin) - { - return super.addSubmodelInterface(supermodelPin); - } - - @Override - public void removeSubmodelInterface(String name) - { - super.removeSubmodelInterface(name); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java deleted file mode 100644 index bf6cf617..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.logic.model.serializing; - -public class IdentifyParams -{ - // maybe we find something to put here... -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java deleted file mode 100644 index c149848a..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java +++ /dev/null @@ -1,226 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonObject; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.logic.model.util.Version; - -public class IndirectModelComponentCreator -{ - public static final Version CURRENT_STD_ID_MAPPING_VERSION = Version.parseSemver("0.1.0"); - - private static final Map standardComponentIDs = new HashMap<>(); - private static final Map standardComponentIDsUnmodifiable = Collections.unmodifiableMap(standardComponentIDs); - - private static final Map componentSuppliers = new HashMap<>(); - private static final Map resourceLoaders = new HashMap<>(); - private static final Map componentCache = new HashMap<>(); - - private static final ResourceLoader defaultResourceLoader; - static - { - defaultResourceLoader = ClassLoaderBasedResourceLoader.create(IndirectModelComponentCreator.class.getClassLoader()); - loadStandardComponentIDs(IndirectModelComponentCreator.class.getResourceAsStream("standardComponentIDMapping.json")); - } - - public static void loadStandardComponentIDs(InputStream standardComponentIdMappingStream) - { - try (InputStream s = standardComponentIdMappingStream) - { - if (s == null) - throw new IOException("Resource not found"); - Map tmp = JsonHandler.readJson(s, StandardComponentIdMappingContainer.class).getMap(); - // don't use putAll to apply sanity checks - tmp.forEach((st, id) -> - { - try - { - addStandardComponentID(st, id); - } - catch (IllegalArgumentException e) - { - System.err.println("Component ID mapping contained illegal entry: " + e.getMessage()); - } - }); - } - catch (IOException e) - { - System.err.println("Failed to initialize standard snippet ID mapping: " + e.getMessage()); - } - } - - public static void addStandardComponentID(String standardComponentID, String associatedComponentID) - { - if (!checkIDIsValidResolvedID(associatedComponentID)) - throw new IllegalArgumentException("Unrecognized component ID format: " + associatedComponentID); - standardComponentIDs.put(standardComponentID, associatedComponentID); - } - - public static Map getStandardComponentIDs() - { - return standardComponentIDsUnmodifiable; - } - - public static void setComponentSupplier(String id, ComponentSupplier componentSupplier) - { - componentSuppliers.put(id, componentSupplier); - } - - public static ModelComponent createComponent(LogicModelModifiable model, String id) - { - return createComponent(model, id, (String) null); - } - - public static ModelComponent createComponent(LogicModelModifiable model, String id, String name) - { - return createComponent(model, id, JsonNull.INSTANCE, name); - } - - public static ModelComponent createComponent(LogicModelModifiable model, String id, JsonElement params) - { - return createComponent(model, id, params, null); - } - - public static ModelComponent createComponent(LogicModelModifiable model, String id, JsonElement params, String name) - { - if (id == null) - throw new NullPointerException("Component ID is null"); - if (componentCache.containsKey(id)) - return loadComponentFromJsonObject(model, id, name, componentCache.get(id)); - String resolvedID = resolveID(id); - if (resolvedID == null) - throw new IllegalArgumentException("Unknown standard ID or illegal resolved ID: " + id); - String[] parts = resolvedID.split(":"); - String firstPart = parts[0]; - if (firstPart.equals("jsonfile")) - { - JsonObject jsonContents; - try - { - // don't use parts[1], because the path could contain ':' - jsonContents = JsonHandler.readJson(resolvedID.substring("jsonfile:".length()), JsonObject.class); - } - catch (IOException e) - { - throw new UncheckedIOException("Error loading JSON file", e); - } - return loadComponentFromJsonObject(model, id, name, jsonContents); - } - ResourceLoader loader; - String resTypeID; - String resID; - if (firstPart.equals("resloader")) - { - String loaderID = parts[1]; - loader = resourceLoaders.get(loaderID); - if (loader == null) - tryLoadResourceLoader(loaderID); - loader = resourceLoaders.get(loaderID); - if (loader == null) - throw new IllegalArgumentException( - "Unknown resource loader: " + loaderID + " (but class was found. Probably the static initializer is missing)"); - resTypeID = parts[2]; - resID = parts[3]; - } else - { - loader = defaultResourceLoader; - resTypeID = parts[0]; - resID = parts[1]; - } - if (resTypeID.equals("jsonres")) - { - JsonObject jsonContents; - try - { - @SuppressWarnings("resource") // jsonStream is closed in JsonHandler - InputStream jsonStream = Objects.requireNonNull(loader.loadResource(resID), "Error loading JSON resource: Not found"); - jsonContents = JsonHandler.readJson(jsonStream, JsonObject.class); - } - catch (IOException e) - { - throw new UncheckedIOException("Error loading JSON resource", e); - } - return loadComponentFromJsonObject(model, id, name, jsonContents); - } else if (resTypeID.equals("class")) - { - ComponentSupplier componentSupplier = componentSuppliers.get(resID); - if (componentSupplier == null) - try - { - loader.loadClass(resID); - } - catch (@SuppressWarnings("unused") ClassNotFoundException e) - { - throw new IllegalArgumentException("Unknown component supplier: " + resID); - } - componentSupplier = componentSuppliers.get(resID); - if (componentSupplier == null) - throw new IllegalArgumentException( - "Unknown component supplier: " + resID + " (but class was found. Probably the static initializer is missing)"); - return componentSupplier.create(model, params, name); - } else - throw new IllegalStateException("Unknown resource type ID: " + resTypeID); - } - - public static String resolveID(String id) - { - if (checkIDIsValidResolvedID(id)) - return id; - return standardComponentIDs.get(id); - } - - private static boolean checkIDIsValidResolvedID(String id) - { - return id.matches("jsonfile:(.+)|(resloader:([^:]+):)?(jsonres|class):[^:]+"); - } - - private static SubmodelComponent loadComponentFromJsonObject(LogicModelModifiable model, String id, String name, - JsonObject jsonContents) - { - componentCache.putIfAbsent(id, jsonContents); - SerializablePojo jsonContentsAsSerializablePojo = JsonHandler.parser.fromJson(jsonContents, SerializablePojo.class); - if (jsonContentsAsSerializablePojo.version == null) - return LegacySubmodelComponentSerializer.deserialize(model, - JsonHandler.parser.fromJson(jsonContents, LegacySubmodelComponentParams.class), name, id, null); - return SubmodelComponentSerializer.deserialize(model, JsonHandler.parser.fromJson(jsonContents, SubmodelComponentParams.class), - name, id, null); - } - - public static void registerResourceLoader(ResourceLoader resourceLoader) - { - registerResourceLoader(resourceLoader, resourceLoader.getClass()); - } - - public static void registerResourceLoader(ResourceLoader resourceLoader, Class reference) - { - resourceLoaders.put(reference.getName(), Objects.requireNonNull(resourceLoader)); - } - - public static void registerResourceLoader(ResourceLoader resourceLoader, String reference) - { - resourceLoaders.put(reference, Objects.requireNonNull(resourceLoader)); - } - - private static void tryLoadResourceLoader(String loaderClassName) - { - ReflectionHelper.tryInvokeStaticInitializer(loaderClassName, "Error loading resoruce loader %s: %s\n"); - } - - public static interface ComponentSupplier - { - public ModelComponent create(LogicModelModifiable model, JsonElement params, String name); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java deleted file mode 100644 index 32d9f941..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.util.JsonHandler; - -public interface JSONSerializable -{ - public String getIDForSerializing(IdentifyParams idParams); - - public Object getParamsForSerializing(IdentifyParams idParams); - - public default JsonElement getParamsForSerializingJSON(IdentifyParams idParams) - { - return JsonHandler.toJsonTree(getParamsForSerializing(idParams)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java deleted file mode 100644 index c21fa866..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; - -import com.google.gson.JsonElement; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.util.JsonHandler; - -/** - * This class contains all the information necessary to create a new {@link SubmodelComponent} - */ -public class LegacySubmodelComponentParams -{ - // basic stuff - public double width, height; - public LegacyInterfacePinParams[] interfacePins; - public LegacySubmodelParameters submodel; - - // functionality that needs to be expressed in Java code - public String symbolRendererSnippetID; - public JsonElement symbolRendererParams; - - public String outlineRendererSnippetID; - public JsonElement outlineRendererParams; - - public String highLevelStateHandlerSnippetID; - public JsonElement highLevelStateHandlerParams; - - public static class LegacyInterfacePinParams - { - public Point location; - public String name; - public int logicWidth; - } - - public static class LegacySubmodelParameters - { - public double innerScale; - public LegacyInnerComponentParams[] subComps; - public LegacyInnerWireParams[] innerWires; - - public static class LegacyInnerComponentParams - { - public String id; - public String name; - public Point pos; - public JsonElement params; - } - - public static class LegacyInnerWireParams - { - public LegacyInnerPinParams pin1, pin2; - public String name; - public Point[] path; - - public static class LegacyInnerPinParams - { - public String compName; - public String pinName; - } - } - } - - public static LegacySubmodelComponentParams readJson(String path) throws IOException - { - return JsonHandler.readJson(path, LegacySubmodelComponentParams.class); - } - - /** - * Writes this {@link LegacySubmodelComponentParams} object into a file in json format. The correct file extension is important! Check - * {@link LegacySubmodelComponentParams}.fileExtension - */ - public void writeJson(String path) - { - try - { - JsonHandler.writeJson(this, path); - } - catch (IOException e) - { - System.err.println("Failed to write SubComponentParams to file"); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java deleted file mode 100644 index 93fc945e..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java +++ /dev/null @@ -1,305 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -import com.google.gson.JsonElement; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacyInterfacePinParams; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerComponentParams; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams.LegacyInnerPinParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.logic.model.util.JsonHandler; - -/** - * Creates {@link SubmodelComponent}s from {@link LegacySubmodelComponentParams} - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ -public final class LegacySubmodelComponentSerializer -{ - // convenience methods - - /** - * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams)}, but first reading the - * {@link LegacySubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class)); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, JsonElement)}, but first reading the - * {@link LegacySubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), idForSerializingOverride, - paramsForSerializingOverride); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String)}, but first reading the - * {@link LegacySubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)}, but first reading the - * {@link LegacySubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name, idForSerializingOverride, - paramsForSerializingOverride); - } - - /** - * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no - * idForSerializingOverride set and using the default name. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params) - { - return deserialize(model, params, null, null, null); - } - - /** - * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} using the default name. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, - String idForSerializingOverride, JsonElement paramsForSerializingOverride) - { - return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride); - } - - /** - * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no - * idForSerializingOverride set. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name) - { - return deserialize(model, params, name, null, null); - } - - /** - * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link LegacySubmodelComponentParams} they are - * written to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(SubmodelComponent comp, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(comp), targetPath); - } - - /** - * Like {@link #serialize(SubmodelComponent, Function)}, but instead of returning the generated {@link LegacySubmodelComponentParams} - * they are written to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(comp, idParams), targetPath); - } - - /** - * {@link #serialize(SubmodelComponent, Function)} using the default {@link IdentifyParams} (see IdentifyParams's - * {@link IdentifyParams#IdentifyParams() default constructor}) - * - * @author Daniel Kirschten - */ - public static LegacySubmodelComponentParams serialize(SubmodelComponent comp) - { - return serialize(comp, new IdentifyParams()); - } - - // "core" methods - /** - * Creates a {@link SubmodelComponent} from the specified {@link LegacySubmodelComponentParams} with the given name. - *

- * When serializing a SubmodelComponent, it is undesired for every subcomponent to be serialized with its complete inner - * structure. Instead, these sub-SubmodelComponents should be serialized with the ID and params which were used to - * determine the SubmodelComponentParams defining the sub-SubmodelComponent. Because of this, it is possible - * to override the ID and params used in {@link #serialize(SubmodelComponent, Function) serialize(...)} to describe this subcomponent. - * See there for details. - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - @SuppressWarnings("unused") // for ModelWire being created - public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name, - String idForSerializingOverride, JsonElement paramsForSerializingOverride) - { - DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, - paramsForSerializingOverride); - comp.setSubmodelScale(params.submodel.innerScale); - comp.setSize(params.width, params.height); - for (LegacyInterfacePinParams iPinParams : params.interfacePins) - // TRISTATE because we don't have a better choice - comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, PinUsage.TRISTATE, - iPinParams.location.x, iPinParams.location.y)); - LegacySubmodelParameters submodelParams = params.submodel; - LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); - Map componentsByName = submodelModifiable.getComponentsByName(); - ModelComponent[] components = new ModelComponent[submodelParams.subComps.length]; - for (int i = 0; i < components.length; i++) - { - LegacyInnerComponentParams cParams = submodelParams.subComps[i]; - components[i] = IndirectModelComponentCreator.createComponent(submodelModifiable, cParams.id, cParams.params, cParams.name); - components[i].moveTo(cParams.pos.x, cParams.pos.y); - } - - for (int i = 0; i < submodelParams.innerWires.length; i++) - { - LegacyInnerWireParams innerWire = submodelParams.innerWires[i]; - new ModelWire(submodelModifiable, innerWire.name, componentsByName.get(innerWire.pin1.compName).getPin(innerWire.pin1.pinName), - componentsByName.get(innerWire.pin2.compName).getPin(innerWire.pin2.pinName), innerWire.path); - } - comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) - .create(comp, params.symbolRendererParams)); - comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier - .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams)); - comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier - .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams)); - return comp; - } - - /** - * Returns {@link LegacySubmodelComponentParams}, which describe this {@link SubmodelComponent}.
- * Subcomponents are serialized in the following way:
- * If a subcomponent is a SubmodelComponent which has been deserialized, and it has an - * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set (e.g. non-null; see - * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement) deserialize(...)}), this ID and - * the component's {@link DeserializedSubmodelComponent#paramsForSerializingOverride paramsForSerializingOverride} are written.
- * If this case doesn't apply (e.g. if the subcomponent is not a SubmodelComponent; or it is a - * SubmodelComponent, but hasn't been deserialized; or it has no - * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set), the ID defined by idGetter - * and the params obtained by {@link ModelComponent#getParamsForSerializing() getParams()} are written.
- * CodeSnippets are serialized using the ID defined by idGetter and the params obtained by the respective - * getParamsForSerializing methods ({@link Renderer#getParamsForSerializing()}). - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - public static LegacySubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams) - { - LegacySubmodelParameters submodelParams = new LegacySubmodelParameters(); - submodelParams.innerScale = comp.getSubmodelScale(); - - Map components = new HashMap<>(comp.submodel.getComponentsByName()); - components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME); - LegacyInnerComponentParams[] componentParams = new LegacyInnerComponentParams[components.size()]; - int i1 = 0; - for (ModelComponent innerComponent : components.values()) - { - LegacyInnerComponentParams innerComponentParams = new LegacyInnerComponentParams(); - componentParams[i1] = innerComponentParams; - innerComponentParams.pos = new Point(innerComponent.getPosX(), innerComponent.getPosY()); - innerComponentParams.id = innerComponent.getIDForSerializing(idParams); - innerComponentParams.params = innerComponent.getParamsForSerializingJSON(idParams); - innerComponentParams.name = innerComponent.getName(); - i1++; - } - submodelParams.subComps = componentParams; - - Collection wires = comp.submodel.getWiresByName().values(); - LegacyInnerWireParams wireParams[] = new LegacyInnerWireParams[wires.size()]; - i1 = 0; - for (ModelWire innerWire : wires) - { - LegacyInnerWireParams innerWireParams = new LegacyInnerWireParams(); - wireParams[i1] = innerWireParams; - LegacyInnerPinParams pin1Params = new LegacyInnerPinParams(), pin2Params = new LegacyInnerPinParams(); - - pin1Params.pinName = innerWire.getPin1().name; - pin1Params.compName = innerWire.getPin1().component.getName(); - pin2Params.pinName = innerWire.getPin2().name; - pin2Params.compName = innerWire.getPin2().component.getName(); - innerWireParams.name = innerWire.name; - innerWireParams.pin1 = pin1Params; - innerWireParams.pin2 = pin2Params; - innerWireParams.path = innerWire.getPath(); - i1++; - } - submodelParams.innerWires = wireParams; - - LegacySubmodelComponentParams params = new LegacySubmodelComponentParams(); - params.submodel = submodelParams; - - params.width = comp.getWidth(); - params.height = comp.getHeight(); - - LegacyInterfacePinParams[] iPins = new LegacyInterfacePinParams[comp.getPins().size()]; - int i = 0; - for (Pin p : comp.getPins().values()) - { - LegacyInterfacePinParams iPinParams = new LegacyInterfacePinParams(); - iPins[i] = iPinParams; - iPinParams.location = p.getRelPos(); - iPinParams.name = p.name; - iPinParams.logicWidth = p.logicWidth; - i++; - } - params.interfacePins = iPins; - - Renderer symbolRenderer = comp.getSymbolRenderer(); - if (symbolRenderer != null) - { - params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams); - params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams); - } - - Renderer outlineRenderer = comp.getOutlineRenderer(); - if (outlineRenderer != null) - { - params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams); - params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams); - } - - HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler(); - if (highLevelStateHandler != null) - { - params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams); - params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams); - } - - return params; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java deleted file mode 100644 index 187d82c5..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import com.google.gson.JsonElement; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.util.Version; - -public class LogicModelParams extends SerializablePojo -{ - public ComponentParams[] components; - public WireParams[] wires; - - public LogicModelParams(Version version) - { - super(version); - } - - public static class ComponentParams - { - public String id; - public String name; - public Point pos; - public JsonElement params; - } - - public static class WireParams - { - public PinParams pin1, pin2; - public String name; - public Point[] path; - - public static class PinParams - { - public String compName; - public String pinName; - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java deleted file mode 100644 index 97b84ce3..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java +++ /dev/null @@ -1,172 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.LogicModelParams.ComponentParams; -import net.mograsim.logic.model.serializing.LogicModelParams.WireParams; -import net.mograsim.logic.model.serializing.LogicModelParams.WireParams.PinParams; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.logic.model.util.Version; - -public class LogicModelSerializer -{ - public static final Version CURRENT_JSON_VERSION = Version.parseSemver("0.1.1"); - - // convenience methods - /** - * Like {@link #deserialize(LogicModelParams)}, but first reading the {@link LogicModelParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static LogicModelModifiable deserialize(String sourcePath) throws IOException - { - return deserialize(JsonHandler.readJson(sourcePath, LogicModelParams.class)); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LogicModelParams)}, but first reading the {@link LogicModelParams} from the given file - * path. - * - * @author Daniel Kirschten - */ - public static void deserialize(LogicModelModifiable model, String sourcePath) throws IOException - { - deserialize(model, JsonHandler.readJson(sourcePath, LogicModelParams.class)); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LogicModelParams)}, but using a newly created {@link LogicModelModifiable}. - * - * @author Daniel Kirschten - */ - public static LogicModelModifiable deserialize(LogicModelParams params) - { - LogicModelModifiable model = new LogicModelModifiable(); - deserialize(model, params); - return model; - } - - /** - * Like {@link #serialize(LogicModel)}, but instead of returning the generated {@link LogicModelParams} they are written to a file at - * the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(LogicModel model, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(model), targetPath); - } - - /** - * Like {@link #serialize(LogicModel, IdentifyParams)}, but instead of returning the generated {@link LogicModelParams} they are written - * to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(LogicModel model, IdentifyParams idParams, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(model, idParams), targetPath); - } - - /** - * {@link #serialize(LogicModel, IdentifyParams)} using the default {@link IdentifyParams} (see IdentifyParams's - * {@link IdentifyParams#IdentifyParams() default constructor}) - * - * @author Daniel Kirschten - */ - public static LogicModelParams serialize(LogicModel model) - { - return serialize(model, new IdentifyParams()); - } - - // "core" methods - /** - * Deserializes components and wires from the specified {@link LogicModelParams} and adds them to the given - * {@link LogicModelModifiable}. - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - @SuppressWarnings("unused") // for ModelWire being created - public static void deserialize(LogicModelModifiable model, LogicModelParams params) - { - Map componentsByName = model.getComponentsByName(); - ModelComponent[] components = new ModelComponent[params.components.length]; - for (int i = 0; i < components.length; i++) - { - ComponentParams compParams = params.components[i]; - components[i] = IndirectModelComponentCreator.createComponent(model, compParams.id, compParams.params, compParams.name); - components[i].moveTo(compParams.pos.x, compParams.pos.y); - } - - for (int i = 0; i < params.wires.length; i++) - { - WireParams wire = params.wires[i]; - new ModelWire(model, wire.name, componentsByName.get(wire.pin1.compName).getPin(wire.pin1.pinName), - componentsByName.get(wire.pin2.compName).getPin(wire.pin2.pinName), wire.path); - } - } - - /** - * Returns {@link LogicModelModifiable}, which describe the components and wires in the given {@link LogicModel}.
- * Components are serialized using {@link ModelComponent#getIDForSerializing(IdentifyParams)} and - * {@link ModelComponent#getParamsForSerializingJSON(IdentifyParams)}
- * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - public static LogicModelParams serialize(LogicModel model, IdentifyParams idParams) - { - LogicModelParams modelParams = new LogicModelParams(CURRENT_JSON_VERSION); - - Map components = new HashMap<>(model.getComponentsByName()); - components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME); - Set componentsParams = new HashSet<>(); - for (ModelComponent component : components.values()) - { - ComponentParams compParams = new ComponentParams(); - componentsParams.add(compParams); - compParams.pos = new Point(component.getPosX(), component.getPosY()); - compParams.id = component.getIDForSerializing(idParams); - compParams.params = component.getParamsForSerializingJSON(idParams); - compParams.name = component.getName(); - } - modelParams.components = componentsParams.toArray(ComponentParams[]::new); - Arrays.sort(modelParams.components, Comparator.comparing(c -> c.name)); - - Collection wires = model.getWiresByName().values(); - Set wiresParams = new HashSet<>(); - for (ModelWire innerWire : wires) - { - WireParams innerWireParams = new WireParams(); - wiresParams.add(innerWireParams); - PinParams pin1Params = new PinParams(), pin2Params = new PinParams(); - - pin1Params.pinName = innerWire.getPin1().name; - pin1Params.compName = innerWire.getPin1().component.getName(); - pin2Params.pinName = innerWire.getPin2().name; - pin2Params.compName = innerWire.getPin2().component.getName(); - innerWireParams.name = innerWire.name; - innerWireParams.pin1 = pin1Params; - innerWireParams.pin2 = pin2Params; - innerWireParams.path = innerWire.getPath(); - } - modelParams.wires = wiresParams.toArray(WireParams[]::new); - Arrays.sort(modelParams.wires, Comparator.comparing(c -> c.name)); - - return modelParams; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java deleted file mode 100644 index 1a6a66a4..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.logic.model.serializing; - -public class ReflectionHelper -{ - private ReflectionHelper() - { - } - - public static Class tryInvokeStaticInitializer(String className, String errorMessageFormat) - { - return tryInvokeStaticInitializer(className, errorMessageFormat, ReflectionHelper.class.getClassLoader()); - } - - public static Class tryInvokeStaticInitializer(String className, String errorMessageFormat, ClassLoader classLoader) - { - try - { - return tryInvokeStaticInitializer(className, classLoader); - } - catch (ClassNotFoundException e) - { - System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage()); - return null; - } - } - - public static Class tryInvokeStaticInitializer(String className) throws ClassNotFoundException - { - return tryInvokeStaticInitializer(className, ReflectionHelper.class.getClassLoader()); - } - - public static Class tryInvokeStaticInitializer(String className, ClassLoader classLoader) throws ClassNotFoundException - { - return Class.forName(className, true, classLoader); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java deleted file mode 100644 index f15b475e..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.io.InputStream; - -import net.mograsim.logic.model.model.components.ModelComponent; - -/** - * For loading JSON {@link ModelComponent}s from other OSGI-Modules or jar-Files. - */ -public interface ResourceLoader -{ - InputStream loadResource(String path) throws IOException; - - Class loadClass(String name) throws ClassNotFoundException; -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java deleted file mode 100644 index 4cc94d76..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import net.mograsim.logic.model.util.Version; - -/** - * This class is the superclass of all POJOs that can be serialized to JSON. - * - * @author Daniel Kirschten - * - */ -public class SerializablePojo -{ - public Version version; - - public SerializablePojo(Version version) - { - this.version = version; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java deleted file mode 100644 index 9467200f..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.util.Map; - -import net.mograsim.logic.model.util.Version; - -public class StandardComponentIdMappingContainer extends SerializablePojo -{ - public Map map; - - public StandardComponentIdMappingContainer(Version version) - { - super(version); - } - - public Map getMap() - { - return map; - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java deleted file mode 100644 index 97b3c7c1..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import com.google.gson.JsonElement; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.util.Version; - -/** - * This class contains all the information necessary to create a new {@link SubmodelComponent} - */ -public class SubmodelComponentParams extends SerializablePojo -{ - // basic stuff - public double width, height; - public InterfacePinParams[] interfacePins; - public double innerScale; - public LogicModelParams submodel; - - // functionality that needs to be expressed in Java code - public String symbolRendererSnippetID; - public JsonElement symbolRendererParams; - - public String outlineRendererSnippetID; - public JsonElement outlineRendererParams; - - public String highLevelStateHandlerSnippetID; - public JsonElement highLevelStateHandlerParams; - - public SubmodelComponentParams(Version version) - { - super(version); - } - - public static class InterfacePinParams - { - public Point location; - public String name; - public int logicWidth; - public PinUsage usage; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java deleted file mode 100644 index cf139885..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java +++ /dev/null @@ -1,245 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Comparator; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.SubmodelComponentParams.InterfacePinParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.logic.model.util.Version; - -/** - * Creates {@link SubmodelComponent}s from {@link SubmodelComponentParams} - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ -public final class SubmodelComponentSerializer -{ - public static final Version JSON_VERSION_CURRENT_SERIALIZING = Version.parseSemver("0.1.5"); - public static final Version JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING = Version.parseSemver("0.1.5"); - public static final Version JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED = Version.parseSemver("0.1.5"); - // convenience methods - - /** - * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams)}, but first reading the {@link SubmodelComponentParams} from - * the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class)); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, JsonElement)}, but first reading the - * {@link SubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), idForSerializingOverride, - paramsForSerializingOverride); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String)}, but first reading the - * {@link SubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), name); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)}, but first reading the - * {@link SubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), name, idForSerializingOverride, - paramsForSerializingOverride); - } - - /** - * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} with no - * idForSerializingOverride set and using the default name. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params) - { - return deserialize(model, params, null, null, null); - } - - /** - * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} using the default name. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) - { - return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride); - } - - /** - * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} with no - * idForSerializingOverride set. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String name) - { - return deserialize(model, params, name, null, null); - } - - /** - * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link SubmodelComponentParams} they are written - * to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(SubmodelComponent comp, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(comp), targetPath); - } - - /** - * Like {@link #serialize(SubmodelComponent, IdentifyParams)}, but instead of returning the generated {@link SubmodelComponentParams} - * they are written to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(comp, idParams), targetPath); - } - - /** - * {@link #serialize(SubmodelComponent, IdentifyParams)} using the default {@link IdentifyParams} (see IdentifyParams's - * {@link IdentifyParams#IdentifyParams() default constructor}) - * - * @author Daniel Kirschten - */ - public static SubmodelComponentParams serialize(SubmodelComponent comp) - { - return serialize(comp, new IdentifyParams()); - } - - // "core" methods - /** - * Creates a {@link SubmodelComponent} from the specified {@link SubmodelComponentParams} with the given name. - *

- * When serializing a SubmodelComponent, it is undesired for every subcomponent to be serialized with its complete inner - * structure. Instead, these sub-SubmodelComponents should be serialized with the ID and params which were used to - * determine the SubmodelComponentParams defining the sub-SubmodelComponent. Because of this, it is possible - * to override the ID and params used in {@link #serialize(SubmodelComponent, IdentifyParams) serialize(...)} to describe this - * subcomponent. See there for details. - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - @SuppressWarnings("unused") // for ModelWire being created - public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String name, - String idForSerializingOverride, JsonElement paramsForSerializingOverride) - { - Version version = params.version; - if (version.compareTo(JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING) > 0) - throw new IllegalArgumentException("JSON version " + version + " not supported yet"); - boolean hasUsageSerialized = version.compareTo(JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED) >= 0; - DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, - paramsForSerializingOverride); - comp.setSubmodelScale(params.innerScale); - comp.setSize(params.width, params.height); - for (InterfacePinParams iPinParams : params.interfacePins) - // TRISTATE because we don't have a better choice - comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, - hasUsageSerialized ? iPinParams.usage : PinUsage.TRISTATE, iPinParams.location.x, iPinParams.location.y)); - LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); - LogicModelSerializer.deserialize(comp.getSubmodelModifiable(), params.submodel); - comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) - .create(comp, params.symbolRendererParams)); - comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier - .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams)); - comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier - .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams)); - return comp; - } - - /** - * Returns {@link SubmodelComponentParams}, which describe this {@link SubmodelComponent}.
- * See {@link LogicModelSerializer#serialize(net.mograsim.logic.model.model.LogicModel, IdentifierGetter) - * LogicModelSerializer.serialize(...)} for how subcomponents are serialized.
- * CodeSnippets are serialized using the ID defined by idGetter and the params obtained by the respective - * getParamsForSerializing methods ({@link Renderer#getParamsForSerializing()}). - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - public static SubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams) - { - SubmodelComponentParams params = new SubmodelComponentParams(JSON_VERSION_CURRENT_SERIALIZING); - params.innerScale = comp.getSubmodelScale(); - params.submodel = LogicModelSerializer.serialize(comp.submodel, idParams); - - params.width = comp.getWidth(); - params.height = comp.getHeight(); - - InterfacePinParams[] iPins = new InterfacePinParams[comp.getPins().size()]; - int i = 0; - for (Pin p : comp.getPins().values()) - { - InterfacePinParams iPinParams = new InterfacePinParams(); - iPins[i] = iPinParams; - iPinParams.location = p.getRelPos(); - iPinParams.name = p.name; - iPinParams.logicWidth = p.logicWidth; - iPinParams.usage = p.usage; - i++; - } - params.interfacePins = iPins; - Arrays.sort(params.interfacePins, Comparator.comparing(p -> p.name)); - - Renderer symbolRenderer = comp.getSymbolRenderer(); - if (symbolRenderer != null) - { - params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams); - params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams); - } - - Renderer outlineRenderer = comp.getOutlineRenderer(); - if (outlineRenderer != null) - { - params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams); - params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams); - } - - HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler(); - if (highLevelStateHandler != null) - { - params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams); - params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams); - } - - return params; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json deleted file mode 100644 index b0b8bedd..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "0.1.0", - "map": { - "AndGate": "class:net.mograsim.logic.model.model.components.atomic.ModelAndGate", - "BitDisplay": "class:net.mograsim.logic.model.model.components.atomic.ModelBitDisplay", - "Clock": "class:net.mograsim.logic.model.model.components.atomic.ModelClock", - "FixedOutput": "class:net.mograsim.logic.model.model.components.atomic.ModelFixedOutput", - "ManualSwitch": "class:net.mograsim.logic.model.model.components.atomic.ModelManualSwitch", - "Merger": "class:net.mograsim.logic.model.model.components.atomic.ModelMerger", - "NandGate": "class:net.mograsim.logic.model.model.components.atomic.ModelNandGate", - "OrGate": "class:net.mograsim.logic.model.model.components.atomic.ModelOrGate", - "Splitter": "class:net.mograsim.logic.model.model.components.atomic.ModelSplitter", - "TriStateBuffer": "class:net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer", - "TextComponent": "class:net.mograsim.logic.model.model.components.atomic.ModelTextComponent", - "WireCrossPoint": "class:net.mograsim.logic.model.model.wires.ModelWireCrossPoint" - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java deleted file mode 100644 index 22ebc090..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import net.mograsim.logic.model.serializing.ReflectionHelper; - -public class CodeSnippetSupplier -{ - private final Map standardSnippetIDClassNames = new HashMap<>(); - private final Map standardSnippetIDClassNamesUnmodifiable = Collections.unmodifiableMap(standardSnippetIDClassNames); - private final Map> snippetSuppliersForClassNames = new HashMap<>(); - private final SnippetDefinintion defaultSnippetSupplier; - - public CodeSnippetSupplier(SnippetDefinintion defaultSnippetSupplier) - { - this.defaultSnippetSupplier = defaultSnippetSupplier; - } - - public void addStandardSnippetID(String standardSnippetID, String associatedSnippetID) - { - if (!associatedSnippetID.startsWith("class:")) - throw new IllegalArgumentException("Unrecognized snippet ID format: " + associatedSnippetID); - standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetID); - } - - public Map getStandardSnippetIDs() - { - return standardSnippetIDClassNamesUnmodifiable; - } - - public void setSnippetSupplier(String id, SnippetDefinintion snippetSupplier) - { - snippetSuppliersForClassNames.put(id, snippetSupplier); - } - - // TODO report errors - public SnippetDefinintion getSnippetSupplier(String id) - { - if (id != null) - { - String resolvedID = resolveID(id); - if (resolvedID != null) - { - String snippetClassName = resolvedID.substring(6); - tryLoadSnippetClass(snippetClassName); - SnippetDefinintion snippetSupplier = snippetSuppliersForClassNames.get(snippetClassName); - if (snippetSupplier != null) - return snippetSupplier; - } - System.err.println("Couldn't load snippet " + id + "; using default"); - } - if (defaultSnippetSupplier == null) - throw new IllegalArgumentException("No default snippet set"); - return defaultSnippetSupplier; - } - - public String resolveID(String id) - { - if (id.startsWith("class:")) - return id; - return standardSnippetIDClassNames.get(id); - } - - // static helpers - - private static void tryLoadSnippetClass(String snippetClassName) - { - ReflectionHelper.tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java deleted file mode 100644 index 622df00b..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.JSONSerializable; - -/** - * A high level state ID consists of parts separated by dots ('.').
- * The last part (the part after the last dot) is called "atomic high level state ID". The parts before that part are called "subcomponent - * ID"s.
- * If there is no dot in a high level state ID, the whole high level state ID is called atomic.
- * Note that subcomponent IDs don't have to correspond to actual subcomponents. For example, a RAM component may supply subcomponent IDs - * "c0000", "c0001" ... "cFFFF" without actually having a subcomponent for each cell. It also is allowed to delegate an atomic high level - * state ID to a subcomponent. - * - * @author Daniel Kirschten - */ -public interface HighLevelStateHandler extends JSONSerializable -{ - /** - * Gets the current value of the given high-level state.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #setHighLevelState(String, Object) - * @see ModelComponent#getHighLevelState(String) - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(String stateID); - - /** - * Sets the given high-level state to the given value.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #getHighLevelState(String) - * @see ModelComponent#setHighLevelState(String, Object) - * - * @author Daniel Kirschten - */ - public void setHighLevelState(String stateID, Object newState); - -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java deleted file mode 100644 index 5ed33bdc..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.serializing.JSONSerializable; - -public interface Renderer extends JSONSerializable -{ - public void render(GeneralGC gc, Rectangle visibleRegion); -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java deleted file mode 100644 index c5fecf25..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import java.util.function.BiFunction; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; - -public interface SnippetDefinintion -{ - public Class

getParamClass(); - - public S create(C context, P params); - - public default S create(C context, JsonElement params) - { - Class

paramClass = getParamClass(); - if (paramClass.equals(Void.class)) - { - if (params != null) - throw new IllegalArgumentException("Params given where none were expected"); - return create(context, (P) null); - } - return create(context, new Gson().fromJson(params, getParamClass())); - } - - public static SnippetDefinintion create(Class

paramClass, BiFunction supplier) - { - return new SnippetDefinintion<>() - { - @Override - public Class

getParamClass() - { - return paramClass; - } - - @Override - public S create(C context, P params) - { - return supplier.apply(context, params); - } - }; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java deleted file mode 100644 index 860557fd..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer; -import net.mograsim.logic.model.util.JsonHandler; - -public class SubmodelComponentSnippetSuppliers -{ - public static final CodeSnippetSupplier symbolRendererSupplier; - public static final CodeSnippetSupplier outlineRendererSupplier; - public static final CodeSnippetSupplier highLevelStateHandlerSupplier; - - static - { - symbolRendererSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultSymbolRenderer::new)); - outlineRendererSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultOutlineRenderer::new)); - highLevelStateHandlerSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultHighLevelStateHandler::new)); - } - - static - { - try (InputStream s = SubmodelComponentSnippetSuppliers.class.getResourceAsStream("standardSnippetIDMapping.json")) - { - if (s == null) - throw new IOException("Resource not found"); - SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class); - tmp.standardSymbolRendererSuppliers.forEach(symbolRendererSupplier::addStandardSnippetID); - tmp.standardOutlineRendererSuppliers.forEach(outlineRendererSupplier::addStandardSnippetID); - tmp.standardHighLevelStateHandlerSuppliers.forEach(highLevelStateHandlerSupplier::addStandardSnippetID); - } - catch (Exception e) - { - System.err.println("Failed to initialize standard snippet ID mapping:"); - e.printStackTrace(); - } - } - - private static class SnippetIDClassNames - { - public Map standardSymbolRendererSuppliers; - public Map standardOutlineRendererSuppliers; - public Map standardHighLevelStateHandlerSuppliers; - } - - private SubmodelComponentSnippetSuppliers() - { - throw new UnsupportedOperationException(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java deleted file mode 100644 index 7fd1fc96..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers; - -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; - -public class DefaultHighLevelStateHandler implements HighLevelStateHandler -{ - public DefaultHighLevelStateHandler() - { - this(null); - } - - public DefaultHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - @SuppressWarnings("unused") // we don't need the component; and params are always null - public DefaultHighLevelStateHandler(SubmodelComponent component, Void params) - { - // nothing to do here - } - - @Override - public Object getHighLevelState(String stateID) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "default"; - } - - @Override - public Void getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - static - { - SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier( - DefaultHighLevelStateHandler.class.getCanonicalName(), - SnippetDefinintion.create(Void.class, DefaultHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java deleted file mode 100644 index 58e8e64c..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java +++ /dev/null @@ -1,215 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.TreeMap; -import java.util.function.BiFunction; -import java.util.function.Function; - -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams; - -public class StandardHighLevelStateHandler implements HighLevelStateHandler -{ - private final SubmodelComponent component; - private final Map subcomponentHighLevelStateHandlers; - private final Map subcomponentHighLevelStateHandlersUnmodifiable; - private final Map atomicHighLevelStateHandlers; - private final Map atomicHighLevelStateHandlersUnmodifiable; - - public StandardHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params) - { - this.component = component; - this.subcomponentHighLevelStateHandlers = new HashMap<>(); - this.subcomponentHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(subcomponentHighLevelStateHandlers); - this.atomicHighLevelStateHandlers = new HashMap<>(); - this.atomicHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(atomicHighLevelStateHandlers); - if (params != null) - { - params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState); - params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState); - } - } - - public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID, - SubcomponentHighLevelStateHandlerParams handlerParams) - { - return addSubcomponentHighLevelState(subcomponentStateID, - StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create, - handlerParams.params); - } - - public H addSubcomponentHighLevelState(String subcomponentStateID, - BiFunction handlerConstructor, P handlerParams) - { - return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams)); - } - - public H addSubcomponentHighLevelState(String subcomponentStateID, - Function handlerConstructor) - { - H handler = handlerConstructor.apply(component); - addSubcomponentHighLevelState(subcomponentStateID, handler); - return handler; - } - - public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler) - { - checkHighLevelStateIDPart(subcomponentStateID); - subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler); - } - - public void removeSubcomponentHighLevelState(String subcomponentStateID) - { - checkHighLevelStateIDPart(subcomponentStateID); - subcomponentHighLevelStateHandlers.remove(subcomponentStateID); - } - - public Map getSubcomponentHighLevelStates() - { - return subcomponentHighLevelStateHandlersUnmodifiable; - } - - public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams) - { - return addAtomicHighLevelState(atomicStateID, - StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create, - handlerParams.params); - } - - public H addAtomicHighLevelState(String subcomponentStateID, - BiFunction handlerConstructor, P handlerParams) - { - return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams)); - } - - public H addAtomicHighLevelState(String subcomponentStateID, - Function handlerConstructor) - { - H handler = handlerConstructor.apply(component); - addAtomicHighLevelState(subcomponentStateID, handler); - return handler; - } - - public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler) - { - checkHighLevelStateIDPart(atomicStateID); - atomicHighLevelStateHandlers.put(atomicStateID, handler); - } - - public void removeAtomicHighLevelState(String atomicStateID) - { - checkHighLevelStateIDPart(atomicStateID); - atomicHighLevelStateHandlers.remove(atomicStateID); - } - - public Map getAtomicHighLevelStates() - { - return atomicHighLevelStateHandlersUnmodifiable; - } - - private static void checkHighLevelStateIDPart(String stateIDPart) - { - if (stateIDPart.indexOf('.') != -1) - throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart); - } - - @Override - public Object getHighLevelState(String stateID) - { - int indexOfDot = stateID.indexOf('.'); - if (indexOfDot == -1) - { - AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID); - if (handler != null) - return handler.getHighLevelState(); - } else - { - SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot)); - if (handler != null) - return handler.getHighLevelState(stateID.substring(indexOfDot + 1)); - } - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - int indexOfDot = stateID.indexOf('.'); - if (indexOfDot == -1) - { - AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID); - if (handler != null) - handler.setHighLevelState(newState); - else - throw new IllegalArgumentException("No high level state with ID " + stateID); - } else - { - SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot)); - if (handler != null) - handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState); - else - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "standard"; - } - - @Override - public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams(); - params.subcomponentHighLevelStates = new TreeMap<>(); - params.atomicHighLevelStates = new TreeMap<>(); - for (Entry e : subcomponentHighLevelStateHandlers.entrySet()) - { - String stateID = e.getKey(); - SubcomponentHighLevelStateHandler handler = e.getValue(); - SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams(); - handlerParams.id = handler.getIDForSerializing(idParams); - handlerParams.params = handler.getParamsForSerializingJSON(idParams); - params.subcomponentHighLevelStates.put(stateID, handlerParams); - } - for (Entry e : atomicHighLevelStateHandlers.entrySet()) - { - String stateID = e.getKey(); - AtomicHighLevelStateHandler handler = e.getValue(); - AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams(); - handlerParams.id = handler.getIDForSerializing(idParams); - handlerParams.params = handler.getParamsForSerializingJSON(idParams); - params.atomicHighLevelStates.put(stateID, handlerParams); - } - return params; - } - - public static class StandardHighLevelStateHandlerParams - { - public Map subcomponentHighLevelStates; - public Map atomicHighLevelStates; - } - - static - { - SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier( - StandardHighLevelStateHandler.class.getCanonicalName(), - SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java deleted file mode 100644 index 158adda2..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; - -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.snippets.CodeSnippetSupplier; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler; -import net.mograsim.logic.model.util.JsonHandler; - -public class StandardHighLevelStateHandlerSnippetSuppliers -{ - public static final CodeSnippetSupplier atomicHandlerSupplier; - public static final CodeSnippetSupplier subcomponentHandlerSupplier; - - static - { - atomicHandlerSupplier = new CodeSnippetSupplier<>(null); - subcomponentHandlerSupplier = new CodeSnippetSupplier<>(null); - } - - static - { - try (InputStream s = StandardHighLevelStateHandlerSnippetSuppliers.class.getResourceAsStream("standardSnippetIDMapping.json")) - { - if (s == null) - throw new IOException("Resource not found"); - SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class); - tmp.standardSubcomponentHandlerSuppliers.forEach(subcomponentHandlerSupplier::addStandardSnippetID); - tmp.standardAtomicHandlerSuppliers.forEach(atomicHandlerSupplier::addStandardSnippetID); - } - catch (Exception e) - { - System.err.println("Failed to initialize standard snippet ID mapping: "); - e.printStackTrace(); - } - } - - private static class SnippetIDClassNames - { - public Map standardSubcomponentHandlerSuppliers; - public Map standardAtomicHandlerSuppliers; - } - - private StandardHighLevelStateHandlerSnippetSuppliers() - { - throw new UnsupportedOperationException(); - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java deleted file mode 100644 index 97ace092..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.serializing.JSONSerializable; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; - -public interface AtomicHighLevelStateHandler extends JSONSerializable -{ - /** - * Gets the current value of the atomic high level state represented by this AtomicHighLevelStateHandler.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(); - - /** - * Sets the atomic high level state represented by this AtomicHighLevelStateHandler to the given value.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @author Daniel Kirschten - */ - public void setHighLevelState(Object newState); - - public static class AtomicHighLevelStateHandlerParams - { - public String id; - public JsonElement params; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java deleted file mode 100644 index 7ae29128..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java +++ /dev/null @@ -1,141 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; - -public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler -{ - private final SubmodelComponent component; - private final List vectorPartTargets; - private final List vectorPartTargetsUnmodifiable; - private final List vectorPartLengthes; - private final List vectorPartLengthesUnmodifiable; - private int length; - - public BitVectorSplittingAtomicHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public BitVectorSplittingAtomicHighLevelStateHandler(SubmodelComponent component, - BitVectorSplittingAtomicHighLevelStateHandlerParams params) - { - this.component = component; - this.vectorPartTargets = new ArrayList<>(); - this.vectorPartTargetsUnmodifiable = Collections.unmodifiableList(vectorPartTargets); - this.vectorPartLengthes = new ArrayList<>(); - this.vectorPartLengthesUnmodifiable = Collections.unmodifiableList(vectorPartLengthes); - if (params != null) - setVectorParts(params.vectorPartTargets, params.vectorPartLengthes); - } - - public void set(List targets, List lengthes) - { - setVectorParts(targets, lengthes); - } - - public void addVectorPart(String target, int length) - { - vectorPartTargets.add(target); - vectorPartLengthes.add(length); - this.length += length; - } - - public void clearVectorParts() - { - vectorPartTargets.clear(); - vectorPartLengthes.clear(); - length = 0; - } - - private void setVectorParts(List targets, List lengthes) - { - clearVectorParts(); - if (targets.size() != lengthes.size()) - throw new IllegalArgumentException("Targets list and lengthes list have different sizes"); - vectorPartTargets.addAll(targets); - vectorPartLengthes.addAll(lengthes); - length += lengthes.stream().mapToInt(Integer::intValue).sum(); - } - - public List getVectorPartTargets() - { - return vectorPartTargetsUnmodifiable; - } - - public List getVectorPartLenghtes() - { - return vectorPartLengthesUnmodifiable; - } - - @Override - public Object getHighLevelState() - { - BitVector result = BitVector.of(); - for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++) - { - Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex)); - BitVector vectorPart; - if (subStateUncasted instanceof Bit) - vectorPart = BitVector.of((Bit) subStateUncasted); - else - vectorPart = (BitVector) subStateUncasted; - if (vectorPart.length() != vectorPartLengthes.get(partIndex)) - throw new IllegalArgumentException( - "Incorrect vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.get(partIndex)); - result = result.concat(vectorPart); - } - return result; - } - - @Override - public void setHighLevelState(Object newState) - { - BitVector newStateCasted = (BitVector) newState; - if (newStateCasted.length() != length) - throw new IllegalArgumentException("Incorrect vector length: " + newStateCasted.length() + "; expected " + length); - for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++) - { - int vectorPartLength = vectorPartLengthes.get(partIndex); - BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartLength); - component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart); - bitIndex += vectorPartLength; - } - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "bitVectorSplitting"; - } - - @Override - public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams(); - params.vectorPartTargets = new ArrayList<>(vectorPartTargets); - params.vectorPartLengthes = new ArrayList<>(vectorPartLengthes); - return params; - } - - public static class BitVectorSplittingAtomicHighLevelStateHandlerParams - { - public List vectorPartTargets; - public List vectorPartLengthes; - } - - static - { - StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier - .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create( - BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java deleted file mode 100644 index 9d2645d7..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; - -public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler -{ - private final SubmodelComponent parentComponent; - private ModelComponent delegateTarget; - private String subStateID; - - public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component, DelegatingAtomicHighLevelStateHandlerParams params) - { - this.parentComponent = component; - if (params != null) - { - // TODO document this - if (params.delegateTarget == null) - setDelegateTarget(parentComponent); - else - { - ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget); - if (delegateTarget == null) - throw new NullPointerException("No subcomponent with name " + params.delegateTarget); - setDelegateTarget(delegateTarget); - } - setSubStateID(params.subStateID); - } - parentComponent.submodel.addComponentRemovedListener(c -> - { - if (delegateTarget == c) - delegateTarget = null; - }); - } - - public void set(ModelComponent delegateTarget, String subStateID) - { - setDelegateTarget(delegateTarget); - setSubStateID(subStateID); - } - - public void setDelegateTarget(ModelComponent delegateTarget) - { - if (delegateTarget == null) - this.delegateTarget = parentComponent; - else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget) - throw new IllegalArgumentException( - "Can only set components belonging to the submodel of the parent component of this handler as the delegate target"); - this.delegateTarget = delegateTarget; - } - - public ModelComponent getDelegateTarget() - { - return delegateTarget; - } - - public void setSubStateID(String subStateID) - { - this.subStateID = subStateID; - } - - public String getSubStateID() - { - return subStateID; - } - - @Override - public Object getHighLevelState() - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - return delegateTarget.getHighLevelState(subStateID); - } - - @Override - public void setHighLevelState(Object newState) - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - delegateTarget.setHighLevelState(subStateID, newState); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "delegating"; - } - - @Override - public DelegatingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - DelegatingAtomicHighLevelStateHandlerParams params = new DelegatingAtomicHighLevelStateHandlerParams(); - params.delegateTarget = delegateTarget.getName(); - params.subStateID = subStateID; - return params; - } - - public static class DelegatingAtomicHighLevelStateHandlerParams - { - public String delegateTarget; - public String subStateID; - } - - static - { - StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier( - DelegatingAtomicHighLevelStateHandler.class.getCanonicalName(), - SnippetDefinintion.create(DelegatingAtomicHighLevelStateHandlerParams.class, DelegatingAtomicHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java deleted file mode 100644 index 276f5415..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java +++ /dev/null @@ -1,157 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; - -public class WireForcingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler -{ - private final SubmodelComponent component; - private int logicWidth; - private final List wiresToForce; - private final List wiresToForceUnmodifiable; - private final List wiresToForceInverted; - private final List wiresToForceInvertedUnmodifiable; - - public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component, WireForcingAtomicHighLevelStateHandlerParams params) - { - this.component = component; - this.wiresToForce = new ArrayList<>(); - this.wiresToForceUnmodifiable = Collections.unmodifiableList(wiresToForce); - this.wiresToForceInverted = new ArrayList<>(); - this.wiresToForceInvertedUnmodifiable = Collections.unmodifiableList(wiresToForceInverted); - if (params != null) - { - Map wiresByName = component.submodel.getWiresByName(); - setWiresToForce(params.wiresToForce.stream().map((Function) wiresByName::get).collect(Collectors.toList()), - params.wiresToForceInverted.stream().map((Function) wiresByName::get).collect(Collectors.toList())); - } - component.submodel.addWireRemovedListener(w -> - { - wiresToForce.removeIf(w::equals); - wiresToForceInverted.removeIf(w::equals); - }); - } - - public void set(List wiresToForce, List wiresToForceInverted) - { - setWiresToForce(wiresToForce, wiresToForceInverted); - } - - public void setWiresToForce(List wiresToForce, List wiresToForceInverted) - { - clearWiresToForce(); - for (ModelWire wire : wiresToForce) - addWireToForce(wire, false); - for (ModelWire wire : wiresToForceInverted) - addWireToForce(wire, true); - } - - public void addWireToForce(ModelWire wire, boolean inverted) - { - if (component.submodel.getWiresByName().get(wire.name) != wire) - throw new IllegalArgumentException("Can only force wires belonging to the parent component of this handler"); - if (logicWidth < 1) - logicWidth = wire.logicWidth; - else if (wire.logicWidth != logicWidth) - throw new IllegalArgumentException("Can only force wires of the same logic width"); - // this can add the same wire multiple times, but maybe there is a weird configuration where it is neccessary, due to race - // conditions, to force the same wire twice. - if (inverted) - wiresToForceInverted.add(wire); - else - wiresToForce.add(wire); - } - - public void clearWiresToForce() - { - wiresToForce.clear(); - wiresToForceInverted.clear(); - logicWidth = 0; - } - - public List getWiresToForce() - { - return wiresToForceUnmodifiable; - } - - public List getWiresToForceInverted() - { - return wiresToForceInvertedUnmodifiable; - } - - @Override - public Object getHighLevelState() - { - BitVector result = BitVector.of(Bit.ZERO, logicWidth); - for (ModelWire wire : wiresToForceInverted) - if (wire.hasCoreModelBinding()) - result = result.or(wire.getWireValues()); - result = result.not(); - for (ModelWire wire : wiresToForce) - if (wire.hasCoreModelBinding()) - result = result.and(wire.getWireValues()); - return result; - } - - @Override - public void setHighLevelState(Object newState) - { - BitVector vector; - if (newState instanceof Bit) - vector = BitVector.of((Bit) newState); - else - vector = (BitVector) newState; - for (ModelWire wire : wiresToForce) - if (wire.hasCoreModelBinding()) - wire.forceWireValues(vector); - vector = vector.not(); - for (ModelWire wire : wiresToForceInverted) - if (wire.hasCoreModelBinding()) - wire.forceWireValues(vector); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "wireForcing"; - } - - @Override - public WireForcingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - WireForcingAtomicHighLevelStateHandlerParams params = new WireForcingAtomicHighLevelStateHandlerParams(); - params.wiresToForce = wiresToForce.stream().map(w -> w.name).collect(Collectors.toList()); - params.wiresToForceInverted = wiresToForceInverted.stream().map(w -> w.name).collect(Collectors.toList()); - return params; - } - - public static class WireForcingAtomicHighLevelStateHandlerParams - { - public List wiresToForce; - public List wiresToForceInverted; - } - - static - { - StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier( - WireForcingAtomicHighLevelStateHandler.class.getCanonicalName(), - SnippetDefinintion.create(WireForcingAtomicHighLevelStateHandlerParams.class, WireForcingAtomicHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json deleted file mode 100644 index ef9d686f..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json +++ /dev/null @@ -1,11 +0,0 @@ -mograsim version: 0.1.3 -{ - "standardSubcomponentHandlerSuppliers": { - "delegating": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.DelegatingSubcomponentHighLevelStateHandler" - }, - "standardAtomicHandlerSuppliers": { - "delegating": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler", - "wireForcing": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.WireForcingAtomicHighLevelStateHandler", - "bitVectorSplitting": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler" - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java deleted file mode 100644 index 12a98887..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; - -public class DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler -{ - private final SubmodelComponent parentComponent; - private ModelComponent delegateTarget; - private String prefix; - - public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component, - DelegatingSubcomponentHighLevelStateHandlerParams params) - { - this.parentComponent = component; - if (params != null) - { - // TODO document this - if (params.delegateTarget == null) - setDelegateTarget(parentComponent); - else - { - ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget); - if (delegateTarget == null) - throw new NullPointerException("No subcomponent with name " + params.delegateTarget); - setDelegateTarget(delegateTarget); - } - setPrefix(params.prefix); - } - parentComponent.submodel.addComponentRemovedListener(c -> - { - if (delegateTarget == c) - delegateTarget = null; - }); - } - - public void set(ModelComponent delegateTarget, String prefix) - { - setDelegateTarget(delegateTarget); - setPrefix(prefix); - } - - public void setDelegateTarget(ModelComponent delegateTarget) - { - if (delegateTarget == null) - this.delegateTarget = parentComponent; - else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget) - throw new IllegalArgumentException( - "Can only set components belonging to the submodel of the parent component of this handler as the delegate target"); - this.delegateTarget = delegateTarget; - } - - public ModelComponent getDelegateTarget() - { - return delegateTarget; - } - - public void setPrefix(String prefix) - { - this.prefix = prefix; - } - - public String getPrefix() - { - return prefix; - } - - @Override - public Object getHighLevelState(String subStateID) - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID)); - } - - @Override - public void setHighLevelState(String subStateID, Object newState) - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState); - } - - private String getDelegateTargetHighLevelStateID(String subStateID) - { - return prefix == null ? subStateID : prefix + '.' + subStateID; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "delegating"; - } - - @Override - public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams(); - params.delegateTarget = delegateTarget.getName(); - params.prefix = prefix; - return params; - } - - public static class DelegatingSubcomponentHighLevelStateHandlerParams - { - public String delegateTarget; - public String prefix; - } - - static - { - StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier - .setSnippetSupplier(DelegatingSubcomponentHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion - .create(DelegatingSubcomponentHighLevelStateHandlerParams.class, DelegatingSubcomponentHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java deleted file mode 100644 index 4c82bdcf..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.serializing.JSONSerializable; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; - -public interface SubcomponentHighLevelStateHandler extends JSONSerializable -{ - /** - * Gets the current value of the given high level state of the subcomponent represented by this SubcomponentHighLevelStateHandler.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(String subStateID); - - /** - * Sets the given high level state of the subcomponent represented by this SubcomponentHighLevelStateHandler to the given value.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @author Daniel Kirschten - */ - public void setHighLevelState(String subStateID, Object newState); - - public static class SubcomponentHighLevelStateHandlerParams - { - public String id; - public JsonElement params; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java deleted file mode 100644 index 90f25a41..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.mograsim.logic.model.snippets.outlinerenderers; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -public class DefaultOutlineRenderer implements Renderer -{ - private final ModelComponent component; - - public DefaultOutlineRenderer(ModelComponent component) - { - this(component, null); - } - - public DefaultOutlineRenderer(ModelComponent component, @SuppressWarnings("unused") Void params) - { - this.component = component; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.foreground"); - if (fg != null) - gc.setForeground(ColorManager.current().toColor(fg)); - gc.drawRectangle(component.getBounds()); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "default"; - } - - @Override - public Void getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - static - { - SubmodelComponentSnippetSuppliers.outlineRendererSupplier.setSnippetSupplier(DefaultOutlineRenderer.class.getCanonicalName(), - SnippetDefinintion.create(Void.class, DefaultOutlineRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json deleted file mode 100644 index 05007698..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json +++ /dev/null @@ -1,16 +0,0 @@ -mograsim version: 0.1.3 -{ - "standardOutlineRendererSuppliers": { - "default": "class:net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer" - }, - "standardSymbolRendererSuppliers": { - "default": "class:net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer", - "centeredText": "class:net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer", - "simpleRectangularLike": "class:net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer", - "pinNames": "class:net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer" - }, - "standardHighLevelStateHandlerSuppliers": { - "default": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler", - "standard": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler" - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java deleted file mode 100644 index 9a6599a6..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.mograsim.logic.model.snippets.symbolrenderers; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -/** - * Renders a text ("text") with a given font height ("height") in the center of the component. - * - * @author Daniel Kirschten - */ -public class CenteredTextSymbolRenderer implements Renderer -{ - private final ModelComponent component; - private final String text; - private final double fontHeight; - - public CenteredTextSymbolRenderer(ModelComponent component, CenteredTextParams params) - { - this.component = component; - this.text = params.text; - this.fontHeight = params.fontHeight; - - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Font oldFont = gc.getFont(); - gc.setFont(new Font(oldFont.getName(), fontHeight, oldFont.getStyle())); - ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text"); - if (fg != null) - gc.setForeground(ColorManager.current().toColor(fg)); - Point idSize = gc.textExtent(text); - Rectangle bounds = component.getBounds(); - gc.drawText(text, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true); - gc.setFont(oldFont); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "centeredText"; - } - - @Override - public CenteredTextParams getParamsForSerializing(IdentifyParams idParams) - { - CenteredTextParams params = new CenteredTextParams(); - params.text = text; - params.fontHeight = fontHeight; - return params; - } - - public static class CenteredTextParams - { - public String text; - public double fontHeight; - } - - static - { - SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(CenteredTextSymbolRenderer.class.getCanonicalName(), - SnippetDefinintion.create(CenteredTextParams.class, CenteredTextSymbolRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java deleted file mode 100644 index 28ad8a86..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.mograsim.logic.model.snippets.symbolrenderers; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -public class DefaultSymbolRenderer implements Renderer -{ - private static final String id = ""; - - private final ModelComponent component; - - public DefaultSymbolRenderer(ModelComponent component) - { - this(component, null); - } - - public DefaultSymbolRenderer(ModelComponent component, @SuppressWarnings("unused") Void params) - { - this.component = component; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text"); - if (fg != null) - gc.setForeground(ColorManager.current().toColor(fg)); - Point idSize = gc.textExtent(id); - Rectangle bounds = component.getBounds(); - gc.drawText(id, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "default"; - } - - @Override - public Void getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - static - { - SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(DefaultSymbolRenderer.class.getCanonicalName(), - SnippetDefinintion.create(Void.class, DefaultSymbolRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java deleted file mode 100644 index ede87105..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java +++ /dev/null @@ -1,116 +0,0 @@ -package net.mograsim.logic.model.snippets.symbolrenderers; - -import java.util.HashMap; -import java.util.Map; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class PinNamesSymbolRenderer implements Renderer -{ - private final ModelComponent component; - private final Map pinPositions; - private final double pinLabelHeight; - private final double pinLabelMargin; - - public PinNamesSymbolRenderer(ModelComponent component, PinNamesParams params) - { - this.component = component; - this.pinPositions = new HashMap<>(); - this.pinLabelHeight = params.pinLabelHeight; - this.pinLabelMargin = params.pinLabelMargin; - if (params.pinNamePositions != null) - params.pinNamePositions.forEach(this::setPinPosition); - component.addPinRemovedListener(p -> setPinPosition(p, null)); - } - - public void setPinPosition(String pinName, Position position) - { - setPinPosition(component.getPin(pinName), position); - } - - public void setPinPosition(Pin pin, Position position) - { - if (position == null) - pinPositions.remove(pin); - else - pinPositions.put(pin, position); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Font oldFont = gc.getFont(); - gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle())); - for (Pin pin : component.getPins().values()) - { - Position pos = pinPositions.get(pin); - if (pos == null) - pos = Position.RIGHT; - - Point topleft = pin.getPos(); - Point textExtent = gc.textExtent(pin.name); - - double x2 = topleft.x - textExtent.x - pinLabelMargin; - double y2 = topleft.y - textExtent.y - pinLabelMargin; - double x1 = topleft.x + pinLabelMargin; - double y1 = topleft.y + pinLabelMargin; - - double x = pos.posX * x1 + (1 - pos.posX) * x2; - double y = pos.posY * y1 + (1 - pos.posY) * y2; - - gc.drawText(pin.name, x, y, true); - } - gc.setFont(oldFont); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "pinNames"; - } - - @Override - public PinNamesParams getParamsForSerializing(IdentifyParams idParams) - { - PinNamesParams params = new PinNamesParams(); - params.pinNamePositions = new HashMap<>(); - pinPositions.forEach((pin, pos) -> params.pinNamePositions.put(pin.name, pos)); - return params; - } - - public static class PinNamesParams - { - public Map pinNamePositions; - public double pinLabelHeight; - public double pinLabelMargin; - - public static enum Position - { - TOP(.5, 0), TOP_LEFT(0, 0), LEFT(0, .5), BOTTOM_LEFT(0, 1), BOTTOM(.5, 1), BOTTOM_RIGHT(1, 1), RIGHT(1, .5), TOP_RIGHT(1, 0); - - private final double posX, posY; - - private Position(double posX, double posY) - { - this.posX = posX; - this.posY = posY; - } - } - } - - static - { - SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(PinNamesSymbolRenderer.class.getCanonicalName(), - SnippetDefinintion.create(PinNamesParams.class, PinNamesSymbolRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java deleted file mode 100644 index d57203ab..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java +++ /dev/null @@ -1,108 +0,0 @@ -package net.mograsim.logic.model.snippets.symbolrenderers; - -import java.util.Map.Entry; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.preferences.Preferences; - -/** - * Renders a text ("centerText") with a given font height ("centerTextHeight") in the center of the component and - * draws a label for each pin with a given font height ("pinLabelHeight"). The labels of pins to the left of a given x - * coordinate ("horizontalComponentCenter") are drawn to the right of the respective pin; labels of pins to the right are drawn - * left. A margin ("pinLabelMargin") is applied for pin label drawing. - * - * @author Daniel Kirschten - */ -public class SimpleRectangularLikeSymbolRenderer implements Renderer -{ - private final ModelComponent component; - private final String centerText; - private final double centerTextHeight; - private final double horizontalComponentCenter; - private final double pinLabelHeight; - private final double pinLabelMargin; - - public SimpleRectangularLikeSymbolRenderer(ModelComponent component, SimpleRectangularLikeParams params) - { - this.component = component; - this.centerText = params.centerText; - this.centerTextHeight = params.centerTextHeight; - this.horizontalComponentCenter = params.horizontalComponentCenter; - this.pinLabelHeight = params.pinLabelHeight; - this.pinLabelMargin = params.pinLabelMargin; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - double posX = component.getPosX(); - double posY = component.getPosY(); - double width = component.getWidth(); - double height = component.getHeight(); - - Font oldFont = gc.getFont(); - gc.setFont(new Font(oldFont.getName(), centerTextHeight, oldFont.getStyle())); - Point textExtent = gc.textExtent(centerText); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(centerText, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true); - gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle())); - for (Entry pinEntry : component.getPins().entrySet()) - { - String pinName = pinEntry.getKey(); - Pin pin = pinEntry.getValue(); - double pinX = pin.getRelX(); - double pinY = posY + pin.getRelY(); - textExtent = gc.textExtent(pinName); - gc.drawText(pinName, posX + pinX + (pinX > horizontalComponentCenter ? -textExtent.x - pinLabelMargin : pinLabelMargin), - pinY - textExtent.y / 2, true); - } - gc.setFont(oldFont); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "simpleRectangularLike"; - } - - @Override - public SimpleRectangularLikeParams getParamsForSerializing(IdentifyParams idParams) - { - SimpleRectangularLikeParams params = new SimpleRectangularLikeParams(); - params.centerText = centerText; - params.centerTextHeight = centerTextHeight; - params.horizontalComponentCenter = horizontalComponentCenter; - params.pinLabelHeight = pinLabelHeight; - params.pinLabelMargin = pinLabelMargin; - return params; - } - - public static class SimpleRectangularLikeParams - { - public String centerText; - public double centerTextHeight; - public double horizontalComponentCenter; - public double pinLabelHeight; - public double pinLabelMargin; - } - - static - { - SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier( - SimpleRectangularLikeSymbolRenderer.class.getCanonicalName(), - SnippetDefinintion.create(SimpleRectangularLikeParams.class, SimpleRectangularLikeSymbolRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java deleted file mode 100644 index 20491ce5..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.mograsim.logic.model.util; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.stream.Collectors; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; - -public class JsonHandler -{ - public final static Gson parser = new GsonBuilder().setPrettyPrinting().create(); - - public static T readJson(String path, Class type) throws IOException - { - try (FileInputStream jsonStream = new FileInputStream(path)) - { - return readJson(jsonStream, type); - } - } - - /** - * @param input The Stream is closed after being read - */ - public static T readJson(InputStream input, Class type) throws IOException - { - try (InputStreamReader reader = new InputStreamReader(input, StandardCharsets.UTF_8); - BufferedReader bf = new BufferedReader(reader)) - { - return fromJson(bf.lines().collect(Collectors.joining("\n")), type); - } - } - - public static T fromJson(String src, Class type) - { - // throw away legacy version line - String rawJson = src.lines().dropWhile(s -> s.length() == 0 || s.charAt(0) != '{').collect(Collectors.joining()); - return parser.fromJson(rawJson, type); - } - - public static T fromJsonTree(JsonElement src, Class type) - { - return parser.fromJson(src, type); - } - - public static void writeJson(Object o, String path) throws IOException - { - try (FileWriter writer = new FileWriter(path)) - { - writer.write(toJson(o)); - } - } - - public static String toJson(Object o) - { - return parser.toJson(o); - } - - public static JsonElement toJsonTree(Object o) - { - return parser.toJsonTree(o); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java deleted file mode 100644 index 58a86ea0..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java +++ /dev/null @@ -1,112 +0,0 @@ -package net.mograsim.logic.model.util; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; - -public class ModellingTool -{ - private LogicModelModifiable model; - - ModellingTool(LogicModelModifiable model) - { - this.model = model; - } - - public ModelWire connect(ModelComponent a, ModelComponent b, String pinA, String pinB) - { - return connect(null, a, b, pinA, pinB); - } - - public ModelWire connect(ModelWireCrossPoint a, ModelComponent b, String pinB) - { - return connect(null, a, b, pinB); - } - - public ModelWire connect(Pin a, ModelComponent b, String pinB) - { - return connect(null, a, b, pinB); - } - - public ModelWire connect(ModelComponent a, ModelWireCrossPoint b, String pinA) - { - return connect(null, a, b, pinA); - } - - public ModelWire connect(ModelWireCrossPoint a, ModelWireCrossPoint b) - { - return connect(null, a, b); - } - - public ModelWire connect(Pin a, ModelWireCrossPoint b) - { - return connect(null, a, b); - } - - public ModelWire connect(ModelComponent a, Pin b, String pinA) - { - return connect(null, a, b, pinA); - } - - public ModelWire connect(ModelWireCrossPoint a, Pin b) - { - return connect(null, a, b); - } - - public ModelWire connect(Pin a, Pin b) - { - return connect(null, a, b); - } - - public ModelWire connect(String name, ModelComponent a, ModelComponent b, String pinA, String pinB) - { - return connect(name, a.getPin(pinA), b.getPin(pinB)); - } - - public ModelWire connect(String name, ModelWireCrossPoint a, ModelComponent b, String pinB) - { - return connect(name, a.getPin(), b.getPin(pinB)); - } - - public ModelWire connect(String name, Pin a, ModelComponent b, String pinB) - { - return connect(name, a, b.getPin(pinB)); - } - - public ModelWire connect(String name, ModelComponent a, ModelWireCrossPoint b, String pinA) - { - return connect(name, a.getPin(pinA), b.getPin()); - } - - public ModelWire connect(String name, ModelWireCrossPoint a, ModelWireCrossPoint b) - { - return connect(name, a.getPin(), b.getPin()); - } - - public ModelWire connect(String name, Pin a, ModelWireCrossPoint b) - { - return connect(name, a, b.getPin()); - } - - public ModelWire connect(String name, ModelComponent a, Pin b, String pinA) - { - return connect(name, a.getPin(pinA), b); - } - - public ModelWire connect(String name, ModelWireCrossPoint a, Pin b) - { - return connect(name, a.getPin(), b); - } - - public ModelWire connect(String name, Pin a, Pin b) - { - return new ModelWire(model, name, a, b); - } - - public static ModellingTool createFor(LogicModelModifiable model) - { - return new ModellingTool(model); - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java deleted file mode 100644 index 00aeed89..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java +++ /dev/null @@ -1,139 +0,0 @@ -package net.mograsim.logic.model.util; - -import java.io.IOException; - -import com.google.gson.TypeAdapter; -import com.google.gson.annotations.JsonAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -import net.mograsim.logic.model.util.Version.VersionJSONAdapter; - -@JsonAdapter(VersionJSONAdapter.class) -public final class Version implements Comparable -{ - public final int major, minor, patch; - - public Version(int major, int minor, int patch) - { - super(); - this.major = major; - this.minor = minor; - this.patch = patch; - } - - public int[] getVersionNumbers() - { - return new int[] { major, minor, patch }; - } - - @Override - public String toString() - { - return toSemverString(); - } - - public String toSemverString() - { - return major + "." + minor + "." + patch; - } - - public static Version parseSemver(String semver) - { - String[] semverParts = semver.split("\\."); - return new Version(Integer.parseInt(semverParts[0]), semverParts.length > 1 ? Integer.parseInt(semverParts[1]) : 0, - semverParts.length > 2 ? Integer.parseInt(semverParts[2]) : 0); - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + major; - result = prime * result + minor; - result = prime * result + patch; - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof Version)) - return false; - Version other = (Version) obj; - if (major != other.major) - return false; - if (minor != other.minor) - return false; - if (patch != other.patch) - return false; - return true; - } - - public boolean is(int major) - { - return major == this.major; - } - - public boolean is(int major, int minor) - { - return is(major) && this.minor == minor; - } - - public boolean is(int major, int minor, int patch) - { - return is(major, minor) && this.patch == patch; - } - - /** - * Compares this {@link Version} with the specified version.
- * As required by {@link Comparable#compareTo(Object)}, returns a negative integer, zero, or a positive integer as this version is less - * (earlier) than, equal to, or greater (later) than the specified version. - *

- * If the versions are equal ({@link #major}, {@link #minor}, {@link #patch} are the same), returns 0.
- * If they differ in {@link #patch}, but neither {@link #major} or {@link #minor} , returns +-1.
- * If they differ in {@link #minor}, but not {@link #major}, returns +-2.
- * If they differ in {@link #major}, returns +-3. - */ - @Override - public int compareTo(Version o) - { - if (major != o.major) - { - if (major > o.major) - return 3; - return -3; - } - if (minor != o.minor) - { - if (minor > o.minor) - return 2; - return -2; - } - if (patch != o.patch) - { - if (patch > o.patch) - return 1; - return -1; - } - return 0; - } - - static class VersionJSONAdapter extends TypeAdapter - { - @Override - public void write(JsonWriter out, Version value) throws IOException - { - out.value(value.toSemverString()); - } - - @Override - public Version read(JsonReader in) throws IOException - { - return parseSemver(in.nextString()); - } - } -} \ No newline at end of file diff --git a/net.mograsim.machine/.classpath b/net.mograsim.machine/.classpath deleted file mode 100644 index c9d880bb..00000000 --- a/net.mograsim.machine/.classpath +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.machine/.gitignore b/net.mograsim.machine/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.machine/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.machine/.project b/net.mograsim.machine/.project deleted file mode 100644 index d179b4ce..00000000 --- a/net.mograsim.machine/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.machine - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs b/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.machine/META-INF/MANIFEST.MF b/net.mograsim.machine/META-INF/MANIFEST.MF deleted file mode 100644 index afbfc4c4..00000000 --- a/net.mograsim.machine/META-INF/MANIFEST.MF +++ /dev/null @@ -1,22 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Mograsim Machine Definition -Bundle-SymbolicName: net.mograsim.machine;singleton:=true -Bundle-Version: 0.1.0.qualifier -Bundle-Vendor: Mograsim Team -Automatic-Module-Name: net.mograsim.machine -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: net.mograsim.logic.core;bundle-version="0.1.0";visibility:=reexport, - net.mograsim.logic.model;bundle-version="0.1.0";visibility:=reexport, - net.mograsim.preferences;visibility:=reexport, - org.eclipse.e4.core.di.annotations, - org.eclipse.core.runtime -Export-Package: net.mograsim.machine, - net.mograsim.machine.isa, - net.mograsim.machine.isa.types, - net.mograsim.machine.mi, - net.mograsim.machine.mi.components, - net.mograsim.machine.mi.parameters, - net.mograsim.machine.standard.memory -Bundle-Activator: net.mograsim.machine.MachineLoader -Bundle-ActivationPolicy: lazy diff --git a/net.mograsim.machine/build.properties b/net.mograsim.machine/build.properties deleted file mode 100644 index 3090e4c0..00000000 --- a/net.mograsim.machine/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - .,\ - plugin.xml,\ - schema/ diff --git a/net.mograsim.machine/plugin.xml b/net.mograsim.machine/plugin.xml deleted file mode 100644 index 8c71c6db..00000000 --- a/net.mograsim.machine/plugin.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - > - diff --git a/net.mograsim.machine/schema/machine_definition.exsd b/net.mograsim.machine/schema/machine_definition.exsd deleted file mode 100644 index e5e147bf..00000000 --- a/net.mograsim.machine/schema/machine_definition.exsd +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - Mograsim extension for defining a machine - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The machines id, this should be unique, but still readable - - - - - - - A Class that implements the Mograsim Machine Definition - - - - - - - - - - - - - - - 0.1.0 - - - - - - - - - [Enter extension point usage example here.] - - - - - - - - - [Enter API information here.] - - - - - - - - - [Enter information about supplied implementation of this extension point.] - - - - - diff --git a/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java b/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java deleted file mode 100644 index eab88b97..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.machine; - -public interface AddressingScema -{ - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java b/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java deleted file mode 100644 index 80520140..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.mograsim.machine; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - -public abstract class GenericMemory implements Memory -{ - private final long minimalAddress, maximalAddress; - private final MemoryDefinition definition; - private final int pageSize = 64; - private Set observers = new HashSet<>(); - - private HashMap pages; - - public GenericMemory(MemoryDefinition definition) - { - super(); - this.definition = definition; - this.minimalAddress = definition.getMinimalAddress(); - this.maximalAddress = definition.getMaximalAddress(); - this.pages = new HashMap<>(); - } - - private void inBoundsCheck(long address) - { - if (address < minimalAddress || address > maximalAddress) - throw new IndexOutOfBoundsException(String.format("Memory address out of bounds! Minimum: %d Maximum: %d Actual: %d", - minimalAddress, maximalAddress, address)); - } - - private long page(long address) - { - return address / pageSize; - } - - private int offset(long address) - { - return (int) (address % pageSize); - } - - @Override - public void setCell(long address, T data) - { - inBoundsCheck(address); - long page = page(address); - int offset = offset(address); - Page p = pages.get(Long.valueOf(page)); - if (p == null) - pages.put(page, p = new Page()); - p.setCell(offset, data); - notifyObservers(address); - } - - @Override - public T getCell(long address) - { - inBoundsCheck(address); - long page = page(address); - int offset = offset(address); - Page p = pages.get(Long.valueOf(page)); - if (p == null) - return null; - return p.getCell(offset); - } - - private class Page - { - private Object[] memory; - - public Page() - { - memory = new Object[pageSize]; - } - - public T getCell(int index) - { - @SuppressWarnings("unchecked") - T data = (T) memory[index]; - return data; - } - - public void setCell(int index, T data) - { - memory[index] = data; - } - - @Override - public String toString() - { - return Arrays.deepToString(memory); - } - } - - @Override - public void registerObserver(MemoryObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(MemoryObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers(long address) - { - observers.forEach(ob -> ob.update(address)); - } - - @Override - public MemoryDefinition getDefinition() - { - return definition; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/ISA.java b/net.mograsim.machine/src/net/mograsim/machine/ISA.java deleted file mode 100644 index eaec0d94..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/ISA.java +++ /dev/null @@ -1,5 +0,0 @@ -package net.mograsim.machine; - -public interface ISA -{ -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java b/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java deleted file mode 100644 index 72e66855..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.mograsim.machine; - -import java.util.Set; - -import net.mograsim.machine.isa.AsmOperand; - -public interface ISASchema -{ - Set getSupportedOperands(); - - AddressingScema getAddressingSchema(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/Machine.java b/net.mograsim.machine/src/net/mograsim/machine/Machine.java deleted file mode 100644 index 6ff074d0..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/Machine.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.machine; - -import net.mograsim.logic.core.components.CoreClock; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.MicroInstructionMemory; -import net.mograsim.logic.model.model.LogicModel; - -public interface Machine -{ - MachineDefinition getDefinition(); - - void reset(); - - LogicModel getModel(); - - CoreClock getClock(); - - BitVector getRegister(Register r); - - void setRegister(Register r, BitVector value); - - Timeline getTimeline(); - - MainMemory getMainMemory(); - - MicroInstructionMemory getMicroInstructionMemory(); - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java deleted file mode 100644 index 02cf3757..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.mograsim.machine; - -import java.util.Set; - -import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; - -public interface MachineDefinition -{ - - /** - * Creates a new instance of the machine - * - * @return a new object of an {@link Machine} implementation. - * @author Christian Femers - */ - Machine createNew(); - - /** - * Returns the schema that all possible ISAs (Instruction Set Architecture) must be based on. - * - * @return an {@link ISASchema} implementation fitting the machine - * @author Christian Femers - */ - ISASchema getISASchema(); - - /** - * Returns a set of all {@link Register}s present in the machine. - * - * @return all registers present in the machine. - * @author Christian Femers - */ - Set getRegisters(); - - /** - * The number of bits used by the machine to address main memory. Note that this should be the number of bits used in the CPU, not a - * possibly different one used by the bus system. - * - * @return the number of bits used by the CPU - * @see MainMemoryDefinition#getMemoryAddressBits() - * @author Christian Femers - */ - int getAddressBits(); - - /** - * Returns the definition of the machines main memory. - * - * @return the {@link MainMemoryDefinition} that defines the main memory. - * @author Christian Femers - */ - MainMemoryDefinition getMainMemoryDefinition(); - - /** - * Returns the definition of the machines instruction memory. - * - * @return the {@link InstructionMemoryDefinition} that defines the instruction memory. - */ - MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition(); - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineException.java b/net.mograsim.machine/src/net/mograsim/machine/MachineException.java deleted file mode 100644 index ee9026a7..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineException.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.machine; - -public class MachineException extends RuntimeException -{ - - /** - * - */ - private static final long serialVersionUID = 6224307211078376836L; - - public MachineException() - { - super(); - } - - public MachineException(String message) - { - super(message); - } - - public MachineException(Throwable cause) - { - super(cause); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java b/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java deleted file mode 100644 index 9a88575b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.machine; - -import java.util.concurrent.atomic.AtomicBoolean; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -import net.mograsim.logic.model.serializing.ClassLoaderBasedResourceLoader; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class MachineLoader implements BundleActivator -{ - private static AtomicBoolean activated = new AtomicBoolean(false); - - @Override - public void start(BundleContext context) throws Exception - { - setup(); - } - - @Override - public void stop(BundleContext context) throws Exception - { - // nothing - } - - public static void setup() - { - if (activated.getAndSet(true)) - return; - ClassLoaderBasedResourceLoader resourceLoader = ClassLoaderBasedResourceLoader.create(MachineLoader.class.getClassLoader()); - IndirectModelComponentCreator.registerResourceLoader(resourceLoader, "MachineLoader"); - IndirectModelComponentCreator.loadStandardComponentIDs(MachineLoader.class.getResourceAsStream("standardComponentIDMapping.json")); -// System.out.println("SETUP DONE"); // TODO: Debug - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java b/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java deleted file mode 100644 index a2706462..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.mograsim.machine; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IExtensionRegistry; -import org.eclipse.core.runtime.Platform; - -public class MachineRegistry -{ - private static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition"; - - private static Map installedMachines = new HashMap<>(); - - public static void reload() - { - IExtensionRegistry registry = Platform.getExtensionRegistry(); - System.out.println(Arrays.toString(registry.getExtensionPoints("net.mograsim.machine"))); - IConfigurationElement[] config = registry.getConfigurationElementsFor(MACHINE_EXT_ID); - try - { - for (IConfigurationElement e : config) - { - System.out.println(e.getNamespaceIdentifier()); - System.out.println(Arrays.toString(e.getAttributeNames())); - final Object o = e.createExecutableExtension("class"); - final String id = e.getAttribute("unique_id"); - if (o instanceof MachineDefinition) - { - System.out.println("Found " + id); - installedMachines.put(id, (MachineDefinition) o); - } else - { - System.err.println("Invalid machine definition: " + o + "(id=" + id + ""); - } - } - } - catch (CoreException ex) - { - System.out.println(ex.getMessage()); - } - } - - public static Map getinstalledMachines() - { - return Collections.unmodifiableMap(installedMachines); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java b/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java deleted file mode 100644 index 94140b73..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.machine; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.BitVector; - -public interface MainMemory extends Memory -{ - public BigInteger getCellAsBigInteger(long address); - - public void setCellAsBigInteger(long address, BigInteger word); - - public MainMemoryDefinition getDefinition(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java deleted file mode 100644 index 72153d6d..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.mograsim.machine; - -/** - * This interface provides a means to get information about the machines memory architecture. It is not bound to any actual memory. - * - * @author Christian Femers - * - */ -public interface MainMemoryDefinition extends MemoryDefinition -{ - /** - * The width in bits of an addressable memory cell/unit. This is often 8 (= one byte). The actual cells/lines of the memory may be a lot - * larger. - * - * @return the addressable unit width in bits - * @author Christian Femers - */ - int getCellWidth(); - - public static MainMemoryDefinition create(int memoryAddressBits, int cellWidth, long minimalAddress, long maximalAddress) - { - return new StandardMainMemoryDefinition(memoryAddressBits, cellWidth, minimalAddress, maximalAddress); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/Memory.java b/net.mograsim.machine/src/net/mograsim/machine/Memory.java deleted file mode 100644 index 0ff9bb41..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/Memory.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.machine; - -public interface Memory -{ - /** - * @param address The address of the desired data. Must be non-negative - * @return The data at the requested address - * - * @throws IndexOutOfBoundsException - */ - public T getCell(long address); - - /** - * Sets the data at the supplied address - * - * @throws IndexOutOfBoundsException - */ - public void setCell(long address, T data); - - public default long size() - { - MemoryDefinition def = getDefinition(); - return Long.max(0, def.getMaximalAddress() - def.getMinimalAddress() + 1); - } - - /** - * Registers an observer to be notified when a memory cell is modified - */ - public void registerObserver(MemoryObserver ob); - - public void deregisterObserver(MemoryObserver ob); - - public void notifyObservers(long address); - - public MemoryDefinition getDefinition(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java deleted file mode 100644 index 39d12c44..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.mograsim.machine; - -public interface MemoryDefinition -{ - - /** - * The number of bits that the main memory uses to address cells. Note that this does not need to equal - * {@link MachineDefinition#getAddressBits()}. - * - * @return the number of bits used to address a memory cell - * @author Christian Femers - */ - int getMemoryAddressBits(); - - /** - * The minimal address possible to address/use. This is usually 0. - * - * @return the minimal possible address. - * @author Christian Femers - */ - long getMinimalAddress(); - - /** - * The maximal address possible to address/use. - * - * @return the maximal possible address as unsigned long - * @author Christian Femers - */ - long getMaximalAddress(); - - /** - * The size of the MainMemory as the amount of addressable memory cells. - * - * @return the amount of addressable memory cells - */ - default long size() - { - return getMaximalAddress() - getMinimalAddress() + 1; - } - - public static MemoryDefinition create(int memoryAddressBits, long minimalAddress, long maximalAddress) - { - return new StandardMemoryDefinition(memoryAddressBits, minimalAddress, maximalAddress); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java b/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java deleted file mode 100644 index 1d7fc4dd..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.machine; - -public interface MemoryObserver -{ - public void update(long address); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java b/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java deleted file mode 100644 index d0459dc1..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.machine; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; - -public abstract class ModelMemory extends ModelComponent -{ - private Renderer symbolRenderer; - private Renderer outlineRenderer; - private M machine; - - protected ModelMemory(LogicModelModifiable model, int width, int height, String name, String centerText, boolean callInit) - { - super(model, name, false); - - SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams(); - rendererParams.centerText = centerText; - rendererParams.centerTextHeight = 5; - rendererParams.horizontalComponentCenter = width / 2; - rendererParams.pinLabelHeight = 2.5; - rendererParams.pinLabelMargin = 0.5; - this.symbolRenderer = new SimpleRectangularLikeSymbolRenderer(this, rendererParams); - this.outlineRenderer = new DefaultOutlineRenderer(this); - - setSize(width, height); - - if (callInit) - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - symbolRenderer.render(gc, visibleRegion); - outlineRenderer.render(gc, visibleRegion); - } - - public void setMachine(M machine) - { - this.machine = machine; - } - - public M getMachine() - { - return machine; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/Register.java b/net.mograsim.machine/src/net/mograsim/machine/Register.java deleted file mode 100644 index 4bcb7f25..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/Register.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.machine; - -import java.util.Set; - -/** - * A register in a machine is defined by this interface. A hardware register may have {@link Register#names() named sub-registers}. - * - * - * @author Christian Femers - * - */ -public interface Register -{ - /** - * The unique identifier of the register. This does not have to be the display name or name in the assembly language. - * - * @return the registers id as case sensitive String - * @author Christian Femers - */ - String id(); - - /** - * The name(s) of this register. This is the displayed name and the name used in the assembly language. All names of all registers must - * be case-insensitive unique. A register can have multiple names if these names address different regions (but still have a common - * hardware structure), e.g. EAX, AX, AL, AH. - * - * @return all the names of regions addressing this register, must be case-insensitive. - * @author Christian Femers - */ - Set names(); - - /** - * Returns the complete width in bits of the underlying hardware structure the register and possible sub-registers are part of. - * - * @param name the name of the register - * @return the width of the (sub-)register in bits. - * - * @see #names() - * @author Christian Femers - */ - int getWidth(); - - /** - * Returns the width in bits of the register or a named part of it. - * - * @param name the name of the register - * @return the width of the (sub-)register in bits. - * - * @see #names() - * @author Christian Femers - */ - int getWidth(String name); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java deleted file mode 100644 index 22be93ee..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.mograsim.machine; - -class StandardMainMemoryDefinition extends StandardMemoryDefinition implements MainMemoryDefinition -{ - private final int cellWidth; - - StandardMainMemoryDefinition(int memoryAddressBits, int cellWidth, long minimalAddress, long maximalAddress) - { - super(memoryAddressBits, minimalAddress, maximalAddress); - this.cellWidth = cellWidth; - } - - @Override - public int getCellWidth() - { - return cellWidth; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java deleted file mode 100644 index f0d755f5..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.machine; - -class StandardMemoryDefinition implements MemoryDefinition -{ - private final int memoryAddressBits; - private final long minimalAddress, maximalAddress; - - StandardMemoryDefinition(int memoryAddressBits, long minimalAddress, long maximalAddress) - { - super(); - this.memoryAddressBits = memoryAddressBits; - this.minimalAddress = minimalAddress; - this.maximalAddress = maximalAddress; - } - - public StandardMemoryDefinition(MainMemoryDefinition definition) - { - this(definition.getMemoryAddressBits(), definition.getMinimalAddress(), definition.getMaximalAddress()); - } - - @Override - public int getMemoryAddressBits() - { - return memoryAddressBits; - } - - @Override - public long getMinimalAddress() - { - return minimalAddress; - } - - @Override - public long getMaximalAddress() - { - return maximalAddress; - } - - public static MemoryDefinition create(int memoryAddressBits, long minimalAddress, long maximalAddress) - { - return new StandardMemoryDefinition(memoryAddressBits, minimalAddress, maximalAddress); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java deleted file mode 100644 index 07b56c29..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.machine.isa; - -public interface AsmElement -{ - // only marker at the moment -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java deleted file mode 100644 index 7a1a6ebf..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.mograsim.machine.isa; - -import java.math.BigDecimal; -import java.math.BigInteger; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.machine.isa.types.AsmNumberFormatException; - -public class AsmFloatOperand implements AsmOperand -{ - private final int size; - private final int mantissa; - private final int exponent; - - public AsmFloatOperand(int size) - { - this.size = size; - switch (size) - { - case 8: - exponent = 4; - mantissa = 3; - break; - case 16: - exponent = 5; - mantissa = 10; - break; - case 32: - exponent = 8; - mantissa = 23; - break; - case 64: - exponent = 11; - mantissa = 52; - break; - case 128: - exponent = 15; - mantissa = 112; - break; - default: - if (size > 128 && size % 32 == 0) - { - exponent = (int) Math.round(Math.log(size) / Math.log(2)) - 13; - mantissa = size - exponent - 1; - } else - { - throw new IllegalArgumentException("Illegal floating point size: " + size); - } - } - } - - public AsmFloatOperand(int exponent, int mantissa) - { - if (exponent < 1 || mantissa < 1) - throw new IllegalArgumentException("illegal floating point specification: e=" + exponent + ", m=" + mantissa); - this.exponent = exponent; - this.mantissa = mantissa; - this.size = exponent + mantissa + 1; - } - - @Override - public int getSize() - { - return size; - } - - @Override - public BitVector parse(String s) throws AsmNumberFormatException - { - String cleaned = s.replace("_", "").toLowerCase(); - int len = cleaned.length(); - BigInteger res; - try - { - return bigDecToBitVector(new BigDecimal(cleaned)); - } - catch (NumberFormatException e) - { - throw new AsmNumberFormatException(e, "Error parsing %s: no valid float format", s); - } - } - - BitVector bigDecToBitVector(BigDecimal bi) throws AsmNumberFormatException - { - BigInteger raw = bi.unscaledValue(); - int mantLen = raw.bitLength(); -// bi. - int bitLength = raw.bitLength() - (bi.signum() - 1) / 2; - if (bitLength > size) - throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size); - BitVectorMutator bvm = BitVectorMutator.ofLength(size); - for (int i = 0; i < size; i++) - bvm.setLSBit(i, Bit.of(raw.testBit(i))); - return bvm.toBitVector(); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java deleted file mode 100644 index 29bbf73b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.mograsim.machine.isa; - -import java.util.Objects; - -public final class AsmInstruction implements AsmElement -{ - private final AsmOperation operation; - private final AsmOperands operands; - - public AsmInstruction(AsmOperation operation, AsmOperands operands) - { - this.operation = Objects.requireNonNull(operation); - this.operands = Objects.requireNonNull(operands); - } - - @Override - public int hashCode() - { - return Objects.hash(operands, operation); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof AsmInstruction)) - return false; - AsmInstruction other = (AsmInstruction) obj; - return Objects.equals(operands, other.operands) && Objects.equals(operation, other.operation); - } - - @Override - public String toString() - { - return String.format("%s %s", operation, operands).trim(); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java deleted file mode 100644 index d3ac80f9..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java +++ /dev/null @@ -1,95 +0,0 @@ -package net.mograsim.machine.isa; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.machine.isa.types.AsmNumberFormatException; - -public class AsmIntegerOperand implements AsmOperand -{ - private final int size; - - public AsmIntegerOperand(int size) - { - this.size = size; - } - - @Override - public int getSize() - { - return size; - } - - @Override - public BitVector parse(String s) throws AsmNumberFormatException - { - String cleaned = s.replace("_", "").toLowerCase(); - int len = cleaned.length(); - BigInteger res; - try - { - if (cleaned.startsWith("0x")) - res = new BigInteger(cleaned.substring(2), 16); - else if (cleaned.endsWith("h")) - res = new BigInteger(cleaned.substring(0, len - 1), 16); - else if (cleaned.startsWith("0b")) - res = new BigInteger(cleaned.substring(2), 2); - else if (cleaned.endsWith("b")) - res = new BigInteger(cleaned.substring(2), 2); - else if (cleaned.endsWith("q")) - res = new BigInteger(cleaned.substring(0, len - 1), 8); - else - res = new BigInteger(cleaned); - } - catch (NumberFormatException e) - { - throw new AsmNumberFormatException(e, "Error parsing %s: no valid integer format", s); - } - return bigIntToBitVector(res); - } - - BitVector bigIntToBitVector(BigInteger bi) throws AsmNumberFormatException - { - int bitLength = bi.bitLength() - (bi.signum() - 1) / 2; - if (bitLength > size) - throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size); - BitVectorMutator bvm = BitVectorMutator.ofLength(size); - for (int i = 0; i < size; i++) - bvm.setLSBit(i, Bit.of(bi.testBit(i))); - return bvm.toBitVector(); - } - - public static void main(String[] args) throws AsmNumberFormatException - { - AsmIntegerOperand aio = new AsmIntegerOperand(4); - System.out.println(aio.parse("0")); - System.out.println(aio.parse("1")); - System.out.println(aio.parse("2")); - System.out.println(aio.parse("3")); - System.out.println(aio.parse("4")); - System.out.println(aio.parse("5")); - System.out.println(aio.parse("6")); - System.out.println(aio.parse("7")); - System.out.println(aio.parse("8")); - System.out.println(aio.parse("9")); - System.out.println(aio.parse("10")); - System.out.println(aio.parse("11")); - System.out.println(aio.parse("12")); - System.out.println(aio.parse("13")); - System.out.println(aio.parse("14")); - System.out.println(aio.parse("15")); -// System.out.println(aio.parse("16")); - System.out.println(aio.parse("-0")); - System.out.println(aio.parse("-1")); - System.out.println(aio.parse("-2")); - System.out.println(aio.parse("-3")); - System.out.println(aio.parse("-4")); - System.out.println(aio.parse("-5")); - System.out.println(aio.parse("-6")); - System.out.println(aio.parse("-7")); - System.out.println(aio.parse("-8")); -// System.out.println(aio.parse("-9")); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java deleted file mode 100644 index ddb56582..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.mograsim.machine.isa; - -import java.util.Objects; - -public final class AsmLabel implements AsmElement -{ - private final String name; - private AsmInstruction inst; - - public AsmLabel(String name) - { - this.name = Objects.requireNonNull(name); - } - - public String getName() - { - return name; - } - - public void setInst(AsmInstruction inst) - { - if (inst != null) - throw new IllegalStateException("Instrution already set for " + name); - this.inst = inst; - } - - @Override - public String toString() - { - return name + ":"; - } - - @Override - public int hashCode() - { - return Objects.hash(inst, name); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof AsmLabel)) - return false; - AsmLabel other = (AsmLabel) obj; - return Objects.equals(inst, other.inst) && Objects.equals(name, other.name); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java deleted file mode 100644 index ad641d6b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.mograsim.machine.isa; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.isa.types.AsmException; - -public interface AsmOperand -{ - int getSize(); - - BitVector parse(String s) throws AsmException; -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java deleted file mode 100644 index f286c315..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.machine.isa; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -public final class AsmOperands -{ - private final List operands; - - public AsmOperands(List operands) - { - this.operands = List.copyOf(Objects.requireNonNull(operands)); - } - - public List getOperands() - { - return operands; - } - - @Override - public int hashCode() - { - return operands.hashCode(); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof AsmOperands)) - return false; - AsmOperands other = (AsmOperands) obj; - return operands.equals(other.operands); - } - - @Override - public String toString() - { - return operands.stream().map(AsmOperand::toString).collect(Collectors.joining(", ")); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java deleted file mode 100644 index abafc45f..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.mograsim.machine.isa; - -import java.util.Objects; - -public final class AsmOperation -{ - private final String mnemonic; - - public AsmOperation(String mnemonic) - { - this.mnemonic = Objects.requireNonNull(mnemonic.toLowerCase()); - } - - public String getMnemonic() - { - return mnemonic; - } - - @Override - public String toString() - { - return getMnemonic(); - } - - @Override - public int hashCode() - { - return mnemonic.hashCode(); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof AsmOperation)) - return false; - AsmOperation other = (AsmOperation) obj; - return mnemonic.equals(other.mnemonic); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java b/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java deleted file mode 100644 index 8de66267..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.machine.isa; - -public class NumericOperand -{ - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java b/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java deleted file mode 100644 index 8a9d2d02..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.machine.isa.types; - -public class AsmException extends Exception -{ - private static final long serialVersionUID = 1L; - - public AsmException() - { - super(); - } - - public AsmException(Throwable cause, String message, boolean enableSuppression, boolean writableStackTrace) - { - super(message, cause, enableSuppression, writableStackTrace); - } - - public AsmException(Throwable cause, String formatString, Object... formatArgs) - { - super(String.format(formatString, formatArgs), cause); - } - - public AsmException(String formatString, Object... formatArgs) - { - super(String.format(formatString, formatArgs)); - } - - public AsmException(Throwable cause) - { - super(cause); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java b/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java deleted file mode 100644 index 4fb4af6d..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.mograsim.machine.isa.types; - -public class AsmNumberFormatException extends AsmException -{ - private static final long serialVersionUID = 1L; - - public AsmNumberFormatException(Exception cause, String message, Object... formatArgs) - { - super(cause, message, formatArgs); - } - - public AsmNumberFormatException(String message, Object... formatArgs) - { - super(message, formatArgs); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java deleted file mode 100644 index d45c2772..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; -import net.mograsim.machine.mi.parameters.Mnemonic; - -public interface MicroInstruction -{ - - public MicroInstructionParameter getParameter(int index); - - public void setParameter(int index, MicroInstructionParameter param); - - /** - * @return The amount of {@link Mnemonic}s, the instruction is composed of - */ - public int getSize(); - - public static MicroInstruction create(Runnable updateCallback, MicroInstructionParameter... parameters) - { - return new StandardMicroInstruction(updateCallback, parameters); - } - - default BitVector toBitVector() - { - BitVector vector = BitVector.of(); - int size = getSize(); - for (int i = 0; i < size; i++) - vector = vector.concat(getParameter(i).getValue()); - return vector; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java deleted file mode 100644 index 6625fa66..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.mograsim.machine.mi; - -import java.util.Arrays; -import java.util.Optional; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; -import net.mograsim.machine.mi.parameters.ParameterClassification; - -public interface MicroInstructionDefinition -{ - /** - * @return The {@link ParameterClassification}s of which a MicroInstruction is composed. - */ - public ParameterClassification[] getParameterClassifications(); - - /** - * @throws IndexOutOfBoundsException - */ - public ParameterClassification getParameterClassification(int index); - - /** - * @return The amount of {@link MicroInstructionParameter}s in a {@link MicroInstruction} that follows this definition. - */ - public default int size() - { - return getParameterClassifications().length; - } - - /** - * @return The amount of {@link Bit}s in a {@link MicroInstruction} that follows this definition. - */ - public default int sizeInBits() - { - return Arrays.stream(getParameterClassifications()).mapToInt(e -> e.getExpectedBits()).reduce(0, (a, b) -> a + b); - } - - public default MicroInstruction createDefaultInstruction(Runnable updateCallback) - { - int size = size(); - MicroInstructionParameter[] params = new MicroInstructionParameter[size]; - ParameterClassification[] classes = getParameterClassifications(); - for (int i = 0; i < size; i++) - { - ParameterClassification classification = classes[i]; - params[i] = classification.getDefault(); - } - return new StandardMicroInstruction(updateCallback, params); - } - - public Optional getParameterDescription(int index); -} \ No newline at end of file diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java deleted file mode 100644 index 5d4fac6b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.Memory; - -public interface MicroInstructionMemory extends Memory -{ - public MicroInstructionMemoryDefinition getDefinition(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java deleted file mode 100644 index 409d2816..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.MemoryDefinition; - -public interface MicroInstructionMemoryDefinition extends MemoryDefinition -{ - MicroInstructionDefinition getMicroInstructionDefinition(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java deleted file mode 100644 index 66aa229c..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.MachineException; - -public class MicroInstructionMemoryParseException extends MachineException -{ - - /** - * - */ - private static final long serialVersionUID = 6820101808901789906L; - - public MicroInstructionMemoryParseException() - { - super(); - } - - public MicroInstructionMemoryParseException(String message) - { - super(message); - } - - public MicroInstructionMemoryParseException(Throwable cause) - { - super(cause); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java deleted file mode 100644 index d049e377..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java +++ /dev/null @@ -1,106 +0,0 @@ -package net.mograsim.machine.mi; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; - -import net.mograsim.machine.MemoryDefinition; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; -import net.mograsim.machine.mi.parameters.ParameterClassification; - -public class MicroInstructionMemoryParser -{ - public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException - { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath)))) - { - parseMemory(memory, reader); - } - } - - public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input) - { - MicroInstructionMemoryDefinition def = memory.getDefinition(); - MicroInstructionDefinition miDef = def.getMicroInstructionDefinition(); - - long minAddr = def.getMinimalAddress(); - long maxAddr = def.getMaximalAddress(); - - String line; - long i = minAddr; - try - { - for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++) - { - long iFinal = i; - memory.setCell(i, parse(() -> memory.notifyObservers(iFinal), miDef, line)); - } - } - catch (IOException e) - { - e.printStackTrace(); - } - - for (; i <= maxAddr; i++) - { - long iFinal = i; - memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal))); - } - } - - public static MicroInstruction parse(Runnable updateCallback, MicroInstructionDefinition definition, String toParse) - { - int size = definition.size(); - String[] strings = toParse.split(","); - if (size != strings.length) - throw new MicroInstructionMemoryParseException("String does not match definition! The number of parameters does not match."); - MicroInstructionParameter[] params = new MicroInstructionParameter[size]; - ParameterClassification[] classes = definition.getParameterClassifications(); - try - { - for (int i = 0; i < size; i++) - { - params[i] = classes[i].parse(strings[i]); - } - return new StandardMicroInstruction(updateCallback, params); - } - catch (Exception e) - { - throw new MicroInstructionMemoryParseException(e.getCause()); - } - } - - public static void write(MicroInstructionMemory memory, String outputPath) throws IOException - { - try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath))) - { - write(memory, writer); - } - } - - public static void write(MicroInstructionMemory memory, OutputStreamWriter output) throws IOException - { - MemoryDefinition def = memory.getDefinition(); - long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1; - for (long i = min; i < max; i++) - { - output.write(toCSV(memory.getCell(i)) + "\n"); - } - } - - private static String toCSV(MicroInstruction inst) - { - int max = inst.getSize() - 1; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < max; i++) - { - sb.append(inst.getParameter(i).toString()); - sb.append(","); - } - sb.append(inst.getParameter(max).toString()); - return sb.toString(); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java deleted file mode 100644 index c565432f..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; - -class StandardMicroInstruction implements MicroInstruction -{ - private final Runnable updateCallback; - private MicroInstructionParameter[] parameters; - - StandardMicroInstruction(Runnable updateCallback, MicroInstructionParameter... parameters) - { - this.updateCallback = updateCallback; - this.parameters = parameters; - } - - /** - * @throws IndexOutOfBoundsException - */ - @Override - public MicroInstructionParameter getParameter(int index) - { - return parameters[index]; - } - - @Override - public int getSize() - { - return parameters.length; - } - - /** - * @throws IndexOutOfBoundsException - */ - @Override - public void setParameter(int index, MicroInstructionParameter param) - { - parameters[index] = param; - updateCallback.run(); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java deleted file mode 100644 index 519c9b3a..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.mograsim.machine.mi; - -import java.util.HashSet; - -import net.mograsim.machine.MemoryObserver; -import net.mograsim.machine.standard.memory.MemoryException; - -public class StandardMicroInstructionMemory implements MicroInstructionMemory -{ - private MicroInstruction[] data; - private MicroInstructionMemoryDefinition definition; - private HashSet observers = new HashSet<>(); - - public StandardMicroInstructionMemory(MicroInstructionMemoryDefinition definition) - { - if (definition.size() > Integer.MAX_VALUE) - throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long"); - this.definition = definition; - data = new MicroInstruction[(int) definition.size()]; - } - - private int translate(long address) - { - return (int) (address - definition.getMinimalAddress()); - } - - @Override - public MicroInstruction getCell(long address) - { - int translatedAddress = translate(address); - MicroInstruction actual = data[translatedAddress]; - if (actual == null) - actual = data[translatedAddress] = definition.getMicroInstructionDefinition() - .createDefaultInstruction(() -> notifyObservers(address)); - return actual; - } - - @Override - public void setCell(long address, MicroInstruction data) - { - this.data[translate(address)] = data; - notifyObservers(address); - } - - @Override - public void registerObserver(MemoryObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(MemoryObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers(long address) - { - observers.forEach(ob -> ob.update(address)); - } - - @Override - public MicroInstructionMemoryDefinition getDefinition() - { - return definition; - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java deleted file mode 100644 index 73940280..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.mograsim.machine.mi.components; - -import java.util.List; - -import net.mograsim.logic.core.components.BasicCoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.machine.mi.MicroInstructionMemory; - -public class CoreMicroInstructionMemory extends BasicCoreComponent -{ - private final ReadWriteEnd data; - private final ReadEnd address; - private final MicroInstructionMemory memory; - - public CoreMicroInstructionMemory(Timeline timeline, int processTime, MicroInstructionMemory memory, ReadWriteEnd data, ReadEnd address) - { - super(timeline, processTime); - this.memory = memory; - this.data = data; - this.address = address; - memory.registerObserver(a -> update()); - address.registerObserver(this); - } - - public MicroInstructionMemory getMemory() - { - return memory; - } - - @Override - public List getAllInputs() - { - return List.of(address); - } - - @Override - public List getAllOutputs() - { - return List.of(data); - } - - @Override - protected TimelineEventHandler compute() - { - if (!address.getValues().isBinary()) - { - return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. - } - long addressed = address.getValues().getUnsignedValueLong(); - BitVector storedData = memory.getCell(addressed).toBitVector(); - return e -> data.feedSignals(storedData); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java deleted file mode 100644 index b3c41749..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.mograsim.machine.mi.components; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.machine.Machine; -import net.mograsim.machine.ModelMemory; -import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; - -public abstract class ModelMicroInstructionMemory extends ModelMemory -{ - private final Pin addrPin, dataPin; - private CoreMicroInstructionMemory memory; - private final MicroInstructionMemoryDefinition definition; - - public ModelMicroInstructionMemory(LogicModelModifiable model, MicroInstructionMemoryDefinition definition, String name) - { - super(model, 120, 150, name, "MPM", false); - this.definition = definition; - addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); - addPin(dataPin = new Pin(model, this, "D", definition.getMicroInstructionDefinition().sizeInBits(), PinUsage.OUTPUT, getWidth(), - 50)); - - init(); - } - - public MicroInstructionMemoryDefinition getDefinition() - { - return definition; - } - - public Pin getAddressPin() - { - return addrPin; - } - - public Pin getDataPin() - { - return dataPin; - } - - public CoreMicroInstructionMemory getCoreMemory() - { - return memory; - } - - public void setCoreModelBinding(CoreMicroInstructionMemory memory) - { - this.memory = memory; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java deleted file mode 100644 index 73acc661..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public class BooleanClassification extends MnemonicFamily -{ - String trueName, falseName; - - public BooleanClassification(boolean defaultValue, String trueName, String falseName) - { - super(defaultValue ? trueName : falseName, new MnemonicPair(trueName, BitVector.SINGLE_1), - new MnemonicPair(falseName, BitVector.SINGLE_0)); - this.trueName = trueName; - this.falseName = falseName; - } - - public Mnemonic get(boolean value) - { - return get(value ? trueName : falseName); - } - - @Override - public ParameterType getExpectedType() - { - return ParameterType.BOOLEAN_IMMEDIATE; - } - - @Override - public int getExpectedBits() - { - return 1; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java deleted file mode 100644 index c24cabeb..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public class IntegerClassification implements ParameterClassification -{ - private final int bits; - private final IntegerImmediate defaultValue; - - public IntegerClassification(int defaultValue, int bits) - { - this.bits = bits; - this.defaultValue = new IntegerImmediate(BitVector.from(defaultValue, bits)); - } - - @Override - public ParameterType getExpectedType() - { - return ParameterType.INTEGER_IMMEDIATE; - } - - @Override - public int getExpectedBits() - { - return bits; - } - - @Override - public IntegerImmediate parse(String toParse) - { - return new IntegerImmediate(new BigInteger(toParse), bits); - } - - @Override - public MicroInstructionParameter getDefault() - { - return defaultValue; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java deleted file mode 100644 index 419602c6..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.BitVector; - -public final class IntegerImmediate implements MicroInstructionParameter -{ - private BitVector value; - - public IntegerImmediate(BigInteger value, int bits) - { - this.value = BitVector.from(value, bits); - } - - public IntegerImmediate(BitVector value) - { - this.value = value; - } - - @Override - public BitVector getValue() - { - return value; - } - - @Override - public ParameterType getType() - { - return ParameterType.INTEGER_IMMEDIATE; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null) - return false; - if (!(obj instanceof IntegerImmediate)) - return false; - IntegerImmediate other = (IntegerImmediate) obj; - if (value == null) - { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; - return true; - } - - /** - * @return The value of this IntegerImmediate as an unsigned BigInteger - */ - public BigInteger getValueAsBigInteger() - { - return value.getUnsignedValue(); - } - - @Override - public String toString() - { - return getValueAsBigInteger().toString(); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java deleted file mode 100644 index 2f135d29..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.logic.core.types.BitVector; - -public interface MicroInstructionParameter -{ - public BitVector getValue(); - - public ParameterType getType(); - - public static enum ParameterType - { - INTEGER_IMMEDIATE, BOOLEAN_IMMEDIATE, MNEMONIC - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java deleted file mode 100644 index 5ea2be05..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.logic.core.types.BitVector; - -public final class Mnemonic implements MicroInstructionParameter -{ - private final String text; - private final BitVector vector; - final MnemonicFamily owner; - private final int ordinal; - - Mnemonic(String text, BitVector vector, MnemonicFamily owner, int ordinal) - { - super(); - this.text = text; - this.vector = vector; - this.owner = owner; - this.ordinal = ordinal; - } - - public String getText() - { - return text; - } - - @Override - public BitVector getValue() - { - return vector; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((text == null) ? 0 : text.hashCode()); - result = prime * result + ((vector == null) ? 0 : vector.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - return this == obj; - } - - @Override - public ParameterType getType() - { - return owner.getExpectedType(); - } - - public int ordinal() - { - return ordinal; - } - - @Override - public String toString() - { - return text; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java deleted file mode 100644 index d6906fb3..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java +++ /dev/null @@ -1,262 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public class MnemonicFamily implements ParameterClassification -{ - private final Mnemonic[] values; - private final Mnemonic defaultValue; - private final String[] stringValues; - private Map byText; - private int vectorLength; - - public MnemonicFamily(String defaultValueName, String... names) - { - this(false, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String... names) - { - this(reverse, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); - } - - public MnemonicFamily(String defaultValueName, int bits, String... names) - { - this(false, defaultValueName, bits, names); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, int bits, String... names) - { - this.values = new Mnemonic[names.length]; - this.stringValues = new String[names.length]; - BitVector[] values = new BitVector[names.length]; - for (int i = 0; i < names.length; i++) - { - values[i] = BitVector.from(i, bits); - } - - setup(names, values, reverse); - - int defaultValueIndex = -1; - for (int i = 0; i < names.length; i++) - if (names[i].equals(defaultValueName)) - { - defaultValueIndex = i; - break; - } - this.defaultValue = this.values[defaultValueIndex]; - } - - public MnemonicFamily(String defaultValueName, String[] names, long[] values, int bits) - { - this(false, defaultValueName, names, values, bits); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, long[] values, int bits) - { - if (names.length != values.length) - throw new IllegalArgumentException(); - this.values = new Mnemonic[values.length]; - this.stringValues = new String[values.length]; - BitVector[] vectors = new BitVector[values.length]; - - for (int i = 0; i < vectors.length; i++) - { - vectors[i] = BitVector.from(values[i], bits); - } - - setup(names, vectors, reverse); - - int defaultValueIndex = -1; - for (int i = 0; i < names.length; i++) - if (names[i].equals(defaultValueName)) - { - defaultValueIndex = i; - break; - } - this.defaultValue = this.values[defaultValueIndex]; - } - - public MnemonicFamily(String defaultValueName, String[] names, BitVector[] values) - { - this(false, defaultValueName, names, values); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, BitVector[] values) - { - if (names.length != values.length) - throw new IllegalArgumentException(); - this.values = new Mnemonic[values.length]; - this.stringValues = new String[values.length]; - - setup(names, values, reverse); - - int defaultValueIndex = -1; - for (int i = 0; i < names.length; i++) - if (names[i].equals(defaultValueName)) - { - defaultValueIndex = i; - break; - } - this.defaultValue = this.values[defaultValueIndex]; - } - - public MnemonicFamily(String defaultValueName, MnemonicPair... values) - { - this.values = new Mnemonic[values.length]; - this.stringValues = new String[values.length]; - - setup(values); - - int defaultValueIndex = -1; - for (int i = 0; i < values.length; i++) - if (stringValues[i].equals(defaultValueName)) - { - defaultValueIndex = i; - break; - } - this.defaultValue = this.values[defaultValueIndex]; - } - - private void setup(String[] names, BitVector[] values, boolean reverse) - { - MnemonicPair[] mnemonics = new MnemonicPair[values.length]; - for (int i = 0; i < values.length; i++) - mnemonics[i] = new MnemonicPair(names[i], reverse ? values[i].reverse() : values[i]); - setup(mnemonics); - } - - private void setup(MnemonicPair[] values) - { - for (int i = 0; i < values.length; i++) - { - this.values[i] = createMnemonic(values[i], i); - this.stringValues[i] = values[i].name; - } - if (values.length == 0) - vectorLength = 0; - else - { - vectorLength = values[0].value.length(); - for (int i = 1; i < values.length; i++) - if (values[i].value.length() != vectorLength) - throw new IllegalArgumentException("MnemonicFamily is not of uniform vector length!"); - } - byText = Arrays.stream(this.values).collect(Collectors.toMap(m -> m.getText(), m -> m)); - if (values.length != byText.keySet().size()) - throw new IllegalArgumentException("MnemonicFamily contains multiple Mnemonics with the same name!"); - } - - private Mnemonic createMnemonic(MnemonicPair mnemonicPair, int ordinal) - { - return new Mnemonic(mnemonicPair.name, mnemonicPair.value, this, ordinal); - } - - public Mnemonic[] values() - { - return values.clone(); - } - - public Mnemonic get(int ordinal) - { - return values[ordinal]; - } - - public Mnemonic get(String text) - { - return byText.get(text); - } - - @Override - public MicroInstructionParameter getDefault() - { - return defaultValue; - } - - public boolean contains(Mnemonic m) - { - if (m != null) - return m.owner == this; - else - return false; - } - - public boolean contains(String value) - { - return byText.keySet().contains(value); - } - - public int size() - { - return values.length; - } - - public int getVectorLength() - { - return vectorLength; - } - - @Override - public boolean conforms(MicroInstructionParameter param) - { - return ParameterClassification.super.conforms(param) && (param instanceof Mnemonic ? contains((Mnemonic) param) : false); - } - - @Override - public ParameterType getExpectedType() - { - return ParameterType.MNEMONIC; - } - - @Override - public int getExpectedBits() - { - return vectorLength; - } - - public String[] getStringValues() - { - return stringValues.clone(); - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + Arrays.hashCode(values); - return result; - } - - @Override - public boolean equals(Object obj) - { - return this == obj; - } - - @Override - public Mnemonic parse(String toParse) - { - Mnemonic parsed = get(toParse); - if (parsed == null) - throw new UnknownMnemonicException(toParse); - return parsed; - } - - public static class MnemonicPair - { - public final String name; - public final BitVector value; - - public MnemonicPair(String name, BitVector value) - { - this.name = name; - this.value = value; - } - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java deleted file mode 100644 index c81f6e55..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public interface ParameterClassification -{ - /** - * Determines whether a {@link MicroInstructionParameter} is part of this class of parameters. - * - * @return true if the classification contains the Parameter, false otherwise - */ - public default boolean conforms(MicroInstructionParameter param) - { - return param.getType().equals(getExpectedType()) && param.getValue().length() == getExpectedBits(); - } - - /** - * @return The type of the parameters in this classification. - */ - public ParameterType getExpectedType(); - - /** - * @return The number of bits of the parameters in this classification. - */ - public int getExpectedBits(); - - public MicroInstructionParameter parse(String toParse); - - public MicroInstructionParameter getDefault(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java deleted file mode 100644 index 3af062e3..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.machine.MachineException; - -public class UnknownMnemonicException extends MachineException -{ - /** - * - */ - private static final long serialVersionUID = 701558899889830975L; - - public UnknownMnemonicException() - { - super(); - } - - public UnknownMnemonicException(String message) - { - super(message); - } - - public UnknownMnemonicException(Throwable cause) - { - super(cause); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java deleted file mode 100644 index ca557a6b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java +++ /dev/null @@ -1,94 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import java.util.List; - -import net.mograsim.logic.core.components.BasicCoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.MainMemoryDefinition; - -/** - * A memory component that only allows access to words of a specific width - */ -public class CoreWordAddressableMemory extends BasicCoreComponent -{ - private final MainMemory memory; - private final static Bit read = Bit.ONE; - - private ReadWriteEnd data; - private ReadEnd rWBit, address; - - /** - * @param data The bits of this ReadEnd are the value that is written to/read from memory; The bit width of this wire is the width of - * a memory word - * @param rWBit The value of the 0th bit dictates the mode: 0: Write, 1: Read - * @param address The bits of this ReadEnd address the memory cell to read/write - */ - public CoreWordAddressableMemory(Timeline timeline, int processTime, MainMemory memory, ReadWriteEnd data, ReadEnd rWBit, - ReadEnd address) - { - super(timeline, processTime); - MainMemoryDefinition definition = memory.getDefinition(); - if (data.width() != definition.getCellWidth()) - throw new IllegalArgumentException( - String.format("Bit width of data wire does not match main memory definition. Expected: %d Actual: %d", - definition.getCellWidth(), data.width())); - if (rWBit.width() != 1) - throw new IllegalArgumentException( - String.format("Bit width of read/write mode select wire is unexpected. Expected: 1 Actual: %d", rWBit.width())); - if (address.width() != definition.getMemoryAddressBits()) - throw new IllegalArgumentException( - String.format("Bit width of address wire does not match main memory definition. Expected: %d Actual: %d", - definition.getMemoryAddressBits(), address.width())); - this.memory = memory; - this.data = data; - this.rWBit = rWBit; - this.address = address; - memory.registerObserver(a -> update()); - data.registerObserver(this); - rWBit.registerObserver(this); - address.registerObserver(this); - } - - @Override - protected TimelineEventHandler compute() - { - if (!address.getValues().isBinary()) - { - if (read.equals(rWBit.getValue())) - return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. - return e -> data.clearSignals(); - } - long addressed = address.getValues().getUnsignedValueLong(); - if (read.equals(rWBit.getValue())) - { - BitVector storedData = memory.getCell(addressed); - return e -> data.feedSignals(storedData); - } - BitVector transData = data.getValues(); - if (transData.equals(memory.getCell(addressed))) - return null; - return e -> - { - data.clearSignals(); - memory.setCell(addressed, transData); - }; - } - - @Override - public List getAllInputs() - { - return List.of(data, rWBit, address); - } - - @Override - public List getAllOutputs() - { - return List.of(data); - } -} \ No newline at end of file diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java deleted file mode 100644 index 5183e323..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import net.mograsim.machine.MachineException; - -public class MemoryException extends MachineException -{ - - /** - * - */ - private static final long serialVersionUID = 6416796315595721079L; - - public MemoryException() - { - super(); - } - - public MemoryException(String message) - { - super(message); - } - - public MemoryException(Throwable cause) - { - super(cause); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java deleted file mode 100644 index 986dbe50..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.machine.Machine; -import net.mograsim.machine.MainMemoryDefinition; -import net.mograsim.machine.ModelMemory; - -public abstract class ModelWordAddressableMemory extends ModelMemory -{ - private final Pin addrPin, dataPin, rWPin; - private CoreWordAddressableMemory memory; - private MainMemoryDefinition definition; - - public ModelWordAddressableMemory(LogicModelModifiable model, MainMemoryDefinition definition, String name) - { - super(model, 120, 150, name, "RAM", false); - this.definition = definition; - - addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); - addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, getWidth(), 50)); - addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, getWidth(), 70)); - - init(); - } - - public MainMemoryDefinition getDefinition() - { - return definition; - } - - public Pin getAddressPin() - { - return addrPin; - } - - public Pin getDataPin() - { - return dataPin; - } - - public Pin getReadWritePin() - { - return rWPin; - } - - public void setCoreModelBinding(CoreWordAddressableMemory memory) - { - this.memory = memory; - } - - public CoreWordAddressableMemory getCoreMemory() - { - return memory; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java deleted file mode 100644 index 4a54ad9f..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.GenericMemory; -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.MainMemoryDefinition; - -public class WordAddressableMemory extends GenericMemory implements MainMemory -{ - private final int cellWidth; - private final MainMemoryDefinition definition; - - public WordAddressableMemory(MainMemoryDefinition definition) - { - super(definition); - this.cellWidth = definition.getCellWidth(); - this.definition = definition; - } - - @Override - public BitVector getCell(long address) - { - BitVector data = super.getCell(address); - return data == null ? BitVector.of(Bit.ZERO, cellWidth) : data; - } - - @Override - public BigInteger getCellAsBigInteger(long address) - { - BitVector data = getCell(address); - return data == null ? BigInteger.valueOf(0) : data.getUnsignedValue(); - } - - @Override - public void setCellAsBigInteger(long address, BigInteger data) - { - setCell(address, BitVector.from(data, cellWidth)); - } - - @Override - public MainMemoryDefinition getDefinition() - { - return definition; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json b/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json deleted file mode 100644 index 8202b0c4..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "0.1.0", - "map": { - } -} \ No newline at end of file diff --git a/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java b/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java deleted file mode 100644 index 9d38b894..00000000 --- a/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.math.BigInteger; -import java.util.Random; - -import org.junit.jupiter.api.Test; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.machine.MainMemoryDefinition; - -class WordAddressableMemoryTest -{ - - private Timeline t = new Timeline(10); - - @Test - public void wordAddressableMemoryLargeTest() - { - CoreWire rW = new CoreWire(t, 1, 2); - CoreWire data = new CoreWire(t, 16, 2); - CoreWire address = new CoreWire(t, 64, 2); - ReadWriteEnd rWI = rW.createReadWriteEnd(); - ReadWriteEnd dataI = data.createReadWriteEnd(); - ReadWriteEnd addressI = address.createReadWriteEnd(); - - @SuppressWarnings("unused") - CoreWordAddressableMemory memory = new CoreWordAddressableMemory(t, 4, - new WordAddressableMemory(MainMemoryDefinition.create(64, 16, 4096L, Long.MAX_VALUE)), data.createReadWriteEnd(), - rW.createReadOnlyEnd(), address.createReadOnlyEnd()); - - Random r = new Random(); - for (long j = 1; j > 0; j *= 2) - { - for (int i = 0; i < 50; i++) - { - String sAddress = String.format("%64s", BigInteger.valueOf(4096 + i + j).toString(2)).replace(' ', '0'); - BitVector bAddress = BitVector.parse(sAddress); - addressI.feedSignals(bAddress); - t.executeAll(); - String random = BigInteger.valueOf(Math.abs(r.nextInt())).toString(5); - random = random.substring(Integer.max(0, random.length() - 16)); - random = String.format("%16s", random).replace(' ', '0'); - random = random.replace('2', 'X').replace('3', 'Z').replace('4', 'U'); - BitVector vector = BitVector.parse(random); - dataI.feedSignals(vector); - rWI.feedSignals(Bit.ZERO); - t.executeAll(); - rWI.feedSignals(Bit.ONE); - t.executeAll(); - dataI.clearSignals(); - t.executeAll(); - - assertEquals(dataI.getValues(), vector); - } - } - } - -} diff --git a/net.mograsim.plugin.branding/.classpath b/net.mograsim.plugin.branding/.classpath deleted file mode 100644 index bc3587db..00000000 --- a/net.mograsim.plugin.branding/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/net.mograsim.plugin.branding/.gitignore b/net.mograsim.plugin.branding/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.plugin.branding/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.plugin.branding/.project b/net.mograsim.plugin.branding/.project deleted file mode 100644 index b0c2a7a1..00000000 --- a/net.mograsim.plugin.branding/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.plugin.branding - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 5db31272..00000000 --- a/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,8 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 diff --git a/net.mograsim.plugin.branding/META-INF/MANIFEST.MF b/net.mograsim.plugin.branding/META-INF/MANIFEST.MF deleted file mode 100644 index a85a3578..00000000 --- a/net.mograsim.plugin.branding/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Mograsim branding -Bundle-SymbolicName: net.mograsim.plugin.branding;singleton:=true -Bundle-Version: 0.1.0.qualifier -Bundle-Vendor: Mograsim Team -Automatic-Module-Name: net.mograsim.plugin.branding -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.eclipse.ui.intro;bundle-version="3.5.500", - org.eclipse.ui.intro.universal;bundle-version="3.3.400" diff --git a/net.mograsim.plugin.branding/about.ini b/net.mograsim.plugin.branding/about.ini deleted file mode 100644 index 4f49cd29..00000000 --- a/net.mograsim.plugin.branding/about.ini +++ /dev/null @@ -1,2 +0,0 @@ -aboutText=Mograsim - Modular Graphical Simulator by Christian Femers, Daniel Kirschten and Fabian Stemmler -featureImage=icon_blue-orange_32.png \ No newline at end of file diff --git a/net.mograsim.plugin.branding/build.properties b/net.mograsim.plugin.branding/build.properties deleted file mode 100644 index 37fc21c9..00000000 --- a/net.mograsim.plugin.branding/build.properties +++ /dev/null @@ -1,6 +0,0 @@ -bin.includes = META-INF/,\ - .,\ - eclipse_with_icon_32.png,\ - about.ini,\ - icons/,\ - icon_blue-orange_32.png diff --git a/net.mograsim.plugin.branding/eclipse_with_icon_32.png b/net.mograsim.plugin.branding/eclipse_with_icon_32.png deleted file mode 100644 index c180b842..00000000 Binary files a/net.mograsim.plugin.branding/eclipse_with_icon_32.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/icon_blue-orange_32.png b/net.mograsim.plugin.branding/icon_blue-orange_32.png deleted file mode 100644 index a0dc941a..00000000 Binary files a/net.mograsim.plugin.branding/icon_blue-orange_32.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/icons/.gitkeep b/net.mograsim.plugin.branding/icons/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai b/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai deleted file mode 100644 index d082a8e1..00000000 --- a/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai +++ /dev/null @@ -1,760 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[5 0 R 25 0 R 44 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - uuid:fa56d82b-e056-4a05-9c36-ef2b93c3828f - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - proof:pdf - - - - - saved - xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T03:03:20+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - - EmbedByReference - - K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai - - - - - - - application/pdf - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T03:03:20+02:00 - 2019-06-22T03:20:05+02:00 - 2019-06-22T03:20:05+02:00 - - - - 256 - 240 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqp3FzbW0RluJUhiHV5GCj7zkMmSMBciAPNlCEpGoiyxzUfzC0G1JWAveSD/fYolf9ZqfgDmm1 HtBp4bRuZ8uXzLtMPY2afOojzY7efmXq0hItbeK3U9C1ZGH0/Cv/AAuafN7SZpfRER+38fJ2eLsP GPqJP2LLWf8AMDWqNDLOkLdJRSBKexAWv0VyGKfaGp3BlXf9I/R9jLJHRYOYF931FOLXyBfS0fVd VlkPVo4mY/8ADvX/AIjmyxdg5Jb5ckj7v1n9Tg5O14DbHAD3/qH60fJ5d8kaLCJ7/wBCFO899KAp p/xkIT8M2WHsTTR5Q4j57/scLJ2pnn/FXu2Sa6/OP8ntFqg12yUDalkjTjb/AJhkkGbTFouH6YiP wpwp5JS+ok+9JLr/AJye/KyH+7mvLnp/dWzD/k4Y8yBpZsEHJ/zlZ+WyuqraarID1dYIKD58p1P3 DD+Un5Krxf8AOUn5YO3FhqEQp9p7dSP+FkY4Pys1Tmw/5yD/ACkvCFGuC3c/s3EFxH/wxj4f8NkT p5jorLtI83+VNZIXSdZsr9z+xb3EUj/SqsWGVGBHMKm+RV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KobUNSsdPgM95MsMfYsdyfBR1J+WUZ9Tjwx4pmg24cE8hqIssH1n8yZ3LRaVF6S9P rEoBf5qn2R9Nc5fWe0cjthFeZ5/L+13+m7EA3yG/IfrYfeX97ey+rdzvPJ4uSafLw+jOdzZ55Tcy ZHzd3iwwxiogAJxofkrV9U4ysv1W0O/rSDcj/ITqf1ZsdD2Nmz7n0w7z+gOFq+1MWLb6pdwZedI8 l+U7I6hqtxDCkf2ry+dVFadEDUWvgAK51ui7Fw4uQ4pd53ed1PaebLtfCO4PNvN3/OVflewL2/lq xl1eYbC6mrb2/wAwCDK/yKr8830NITz2de8f8y/85BfmhrjOo1T9F2zdINOX0KfKWrTf8PmTHTwH RLz68vr29na4vbiS5uG+1NM7SOfmzEnLwKVQxV2KuxV2KuxVsEg1HXFWWeXvzX/MTy+UGma7dJCn S3mf6xDTwEc3NR9AyuWGMuYV6z5T/wCcs72MpD5q0hZ4+jXmnnhIB4mGQlWPydflmNPR9xV7d5P/ ADL8k+bowdD1OKa4pyayc+lcrTrWJ6MQPFaj3zFnilHmEMnytXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYqxHzJ5+tbIva6bxubobNL1jQ/R9o/hnPdo9uwxXHF6p9/Qfrd1ouyJZPVk9MftP6nnl9qF7 f3BuLyZppW/aY9B4AdAPYZx+fUTyy4pmy9Liwwxx4Yigu07TL3UblbaziMsp3NOgHix6AYdPpp5p cMBZRmzwxR4pGg9C0jyhouhWrajq8sTvApklnmIWCELuT8VBt/M34Z2nZ3YePFRn65/YPc8vrO1p 5do+mP2l5Z+Yv/OUdjaGXT/JUK3k4qratcKRAp6VhjNGenZmoPZhnUY9Le8nUvnjzD5o8w+Y783+ uX81/dGtHmaoUHfiiCiovsoAzNjARFBKV5JXYq7FXYq7FXYq7FXYq7FXYq7FVSCeaCZJoJGimjIa OVCVZWG4KsNwRir2T8v/APnJrzVojRWfmVTrmmCi+uSFvYx4iQ0Evyfc/wAwzFyaUHlsr6X8o+d/ LPm7Tvr+g3qXUQoJovsyxMf2ZYz8Sn8D2zBnjMTRQnmQV2KuxV2KuxV2KuxV2KuxV2KrJpooYmlm cRxIOTuxoAB3JORnMRBJNAMoxMjQ3LzbzV54n1AvZ6eWhstw8nR5R/Bfbv38M4rtTtuWW4Y9od/U /sep7P7KGP1T3n937WJZz7uU48u+Wr3WrjjF+7tkP764IqF9h4t7Zsez+zZ6mVDaI5n8dXB1uuhg jvvLoGW+Z/Nnkv8ALPy/696/Bnr9XtUo11dSAdht07saKv3DPQND2fDFHgxj3n9byOo1M80uKRfK P5k/m95q89XbC8lNppCNW20mFj6S06NIdjK/+U30AZvMWEQ97QwbLVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVTLy/wCY9c8u6nHqei3kljexfZliPUVqVdTVXU03VgQcjKIkKKvq38o/z+0fzf6O ka0E03zGQFRa0t7o/wDFJJ+F/wDis/QT21+bTmO45IeuZjK7FXYq7FXYq7FXYq7FVk00UETzTOEi jBZ3bYADck5GcxEGRNAMoxMjQ5l5b5t82zaxMbe3Jj06M/CvQyEftN/AZwnavap1B4Y7Yx9vmXru zuzhhHFLeZ+xjeaV2id+WPLNxrd0RUx2cRHrzf8AGq/5R/DNp2Z2bLUz7oDmf0DzcDX66OCPfI8g n35lfmV5d/LTy7HFFGkupyoV0zTFO7Hp6stNxGD1PVjsPb0TR6OMYiEBUQ8dkySySMpGyXx15o80 655n1ibV9aumuryY9TsqIPsxxr0VF7AfrzcQgIigwSnJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq2rMrBlJDA1BGxBGKvpf8j/+cgTevb+V/OE/+ltSPT9YkNPVPRYpz/P2V/2uh33ODn09 bxQ+g8wldirsVdirsVdirsVeZ+d/NR1Cc6fZv/oMLfvHH+7XH/Go7ff4ZxHbXanjS8OB9A+0/qer 7K7P8MccvrP2ftYlnPu5THQtFudY1BLSH4V+1NKeiIOp/pmZodHLUZBCPxPcHF1eqjhhxH4ebL/P /nnQPyz8oibgslywMWmWFaPPN1LMevFa8nb6OpAz0nRaOMIiEBUQ8VmzSySMpcy+MPMXmLWPMesX GsaxcNc31y3KSRugHZVHRVUbADpm7jERFBrSzJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FX1D/zj3+dTarHD5P8AMc9dTiXhpV7Id50Uf3MjE7yqPsn9of5XXA1GCvUEPesw1dir sVdirsVYh5+8yGytv0bbNS6uVrM46pGdqfNv1Zz3b3aPhx8KP1S5+Q/a7rsjRccvEl9MeXmf2PNc 4l6pdFHJLIsUal5HIVFG5JJoAMlGJkQBzLGUgBZ5PULVNI8keVbrU9UlWKK2jNxqFx1JI6IvjueK juT756L2V2cMGMRH1y5/juDxWv1hz5L/AIRyfGf5i+fdV87+ZrjWb4lIj+7sbStVggBPBB4nux7n 7s6fHjEBThsXyxXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVSCea3mjngka KaJg8UqEqyspqrKRuCDir7Q/JH80ovPPlvheMq+YNNCx6jGKD1ARRLhQOz0+KnRvamavPi4D5Iej 5QrsVdiqF1TUINOsJr2f+7hXlTuT0VR8ztlGp1EcOMzlyDdgwnLMQHMvGL++uL68mu7g8pZmLN4D wA9gNhnmufPLLMzlzL3OHFHHERjyCHyltZv+XOgiWV9XnWqREpag93/af/YjYf2Z1Hs9oeInNLkN o+/vdB21q6HhDrzeN/8AOTn5lHVNYXydp0v+4/S3D6kynaS7ptGfFYgf+CJ/lGd/pcVDiLzbwrMt XYq7FXYq9A/I7yjofmvz5FpGtwtPYtbTStGrtGeSAFTyQg5TnmYxsK+jP+hbfyk/6tc3/SVcf815 hfmZ96Hf9C2/lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm/wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/p KuP+a8fzM+9Xf9C2/lJ/1a5v+kq4/wCa8fzM+9Xf9C2/lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm /wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/pKuP+a8fzM+9Xf9C2/lJ/1a5v+kq4/wCa8fzM+9Xf9C2/ lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm/wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/pKuP+a8fzM+9X f9C2/lJ/1a5v+kq4/wCa8fzM+9XnP58fk/5D8o+SI9V0Kykt71r2KAyPPLIODpISOLsw6qMu0+aU pUUvnnM1XYq7FXYqyT8vfO2oeTPNVnrlmSyRNwvLcGgmt2I9SM9txuvgwByGSAkKV926Tqljq2mW up2Eomsr2JJ7eUd0cch8j4jNQRRooRWBXYq89/MnWS88WlRN8EVJbindyPgX6F3+nOQ9o9ZchhHT c+/o9L2JpqByHrsGEZy7v1exs5r28htIRWWZwi/Sev0ZbgwnJMQjzkWvLkEImR5Bn35h+abX8vvy 8ur+34+vbxrbabG37dzJshI703kYdwDnqOi0sYiOOP0h4PNlOSZkeZfDk88080k8zmSaVi8sjGrM zGrMSepJzeMFPFXYq7FXYq9Z/wCcYv8AyakH/MHc/wDERmPqvoV9hZrEIO61nR7SX0bq+t7eUAEx yyojUPQ0Yg4REqpf4l8uf9XWz/6SIv8AmrDwnuV3+JfLn/V1s/8ApIi/5qx4T3K7/Evlz/q62f8A 0kRf81Y8J7ld/iXy5/1dbP8A6SIv+aseE9yu/wAS+XP+rrZ/9JEX/NWPCe5Xf4l8uf8AV1s/+kiL /mrHhPcrv8S+XP8Aq62f/SRF/wA1Y8J7ld/iXy5/1dbP/pIi/wCaseE9yu/xL5c/6utn/wBJEX/N WPCe5Xf4l8uf9XWz/wCkiL/mrHhPcqYgggEGoO4IyKvHv+cp/wDyWcX/AG0rf/k3LmTpPr+CvkXN kl2KuxV2KuxV9L/84q+fTPaXfky9lrJbcrvSuR6xMf30Q/1WIcD3bwzB1eP+JD6EzCVSurmK1tpb mU0jhRpHPsoqcry5BCJkeQFs8cDOQiOZeJX15LeXk13MayTuXb2qen0Z5jnzHJMzPORt73FjEIiI 5BQypsZp+WulCW8n1KRarbj04Sf53HxEfJf1503s5peKZyn+HYe8/s+90PbmoqIxjrufd+PueM/8 5T+cjqPmu18tW71tdGjElyAdjc3Cht/9SPjT5nPQdJChfe808PzLV2KuxV2KuxV6z/zjF/5NSD/m Duf+IjMfVfQr7CzWIfHv/OTv/k1J/wDmDtv+InNnpfoS8mzIV2KuxV2KuxV2KuxV2KuxV2Kv0T03 /jnWv/GGP/iIzSnmh5N/zlP/AOSzi/7aVv8A8m5cyNJ9fwV8i5skuxV2KuxV2Kp15M8zXXlfzTpm vWtTJYTrI6DbnEfhlj/2cbMv05GceIEK++7K8tr2zgvbVxLbXUaTQSDoySKGVh8wc05FIY7+YmoG 20L6upo944T34L8TfqA+nND7QajgwcI5zNfDm7fsbDxZuL+aHl2cK9a7FXrvla0GmeWICY2ZzGbm REFXYuOVAO7caDPReyNP4WniOp3PxeJ7SzeJnkeg2+T5F1/8r/ze1vXL/WLvy3eG41C4kuZdloDI xag+LoK0GdPHLACrcJAf8qW/NT/qWrz/AIFf+asPjw71d/ypb81P+pavP+BX/mrHx4d6u/5Ut+an /UtXn/Ar/wA1Y+PDvV3/ACpb81P+pavP+BX/AJqx8eHerv8AlS35qf8AUtXn/Ar/AM1Y+PDvV6P+ QH5b+etA/MSHUdZ0a4sbJbWdDPKAFDMo4jYnrlGoyxMaBV9PZgIfHv8Azk7/AOTUn/5g7b/iJzZ6 X6EoP/nH7yzo/mbzlfaNrEAnsrrS7gMOjKwki4ujfssp3Bw6iRjGx3qx38yPy81jyL5ik0q+Bltn rJp96BRJ4a0DAVNGHRl7H2ocniyCYtWKZYrsVdirsVdiqrbW1xc3EdtbRtNcTMI4YYwWd3Y0VVUb kk4kq9s82/k9beSfyWn1HUkWXzPfXNr9Yk2YW8ZYn0Iz4/zsOp26DMSGbjyUOSvDsy1fonpv/HOt f+MMf/ERmlPNDzj/AJyI8t675h8gx2Gi2Ul9eC+hlMEQBbgqSAtuR05DL9NIRlZV80/8qW/NT/qW rz/gV/5qzO8eHel3/KlvzU/6lq8/4Ff+asfHh3q7/lS35qf9S1ef8Cv/ADVj48O9Xf8AKlvzU/6l q8/4Ff8AmrHx4d6u/wCVLfmp/wBS1ef8Cv8AzVj48O9Xf8qW/NT/AKlq8/4Ff+asfHh3q+pfyOXz Ha+QbPSPMdpLZalpbNbrFNs7W9eUL7E7AEoP9XNfnrisIQv5l3nq6vBag1W3iqR4NIan/hQucJ7S ZuLMIfzY/f8AgPU9h4qxGX84/cxDOdd2idNtDeahbWo/3fKkZ9gzAE/dl+mxeJkjD+cQGrPk4IGX cHtUyikMQU8C4FV24hAXH0VWmeoAU8ASrYq7FXYq7FXYq7FXYq7FXx7/AM5O/wDk1J/+YO2/4ic2 el+hKJ/5xY/8mZL/ANs24/5ORYNX9HxV9KfmF5C0bzv5dm0fUl4P/eWV2BV4JgCFkXcVG9GXuMwc eQwNhD4h82+VNZ8q69c6Jq8PpXdsdmG6SId0kjb9pWHT7juDm1hMSFhKT5JXYq7FWwCTQdcVfVH/ ADj7+S36Ct4vNfmG3prU61060kG9rGw+26kbTMP+BHuTTX6jPfpHJCdf85O/+Srn/wCYy2/4kchp frV8eZs0v0T03/jnWv8Axhj/AOIjNKeaERgV2KuxV2KuxV2KuxVQkPC8haoCyhoiKbswHNN/BVV/ vwq8k823P1jzJfvWvGUx/wDIsBP+Nc847VycepmfOvls9v2dDhwQHlfz3SjNc5rIfIVsJvM1uSKr CryEfJSB+LDNx2Fj4tVHys/Y6ztefDpz50Ff85vzfk/L290f0NPXUZb6O55xvKYgio0XE7K9amue j4MPHbxzzr/ob3Uf+pZh/wCktv8Aqll35Md6Xf8AQ3uo/wDUsw/9Jbf9UsfyY71d/wBDe6j/ANSz D/0lt/1Sx/JjvV3/AEN7qP8A1LMP/SW3/VLH8mO9Xf8AQ3mpf9SzD/0lt/1Sw/kx3q7/AKG81L/q WYf+ktv+qWP5Md6u/wChvNS/6lmH/pLb/qlj+THerv8AobzUv+pZh/6S2/6pY/kx3q8k/Mrz1N54 8zvr0tmti7wxw/V1cyAemKV5FV6/LMjFj4BSs4/5xY/8mZL/ANs24/5ORZVq/o+KvrnNahgX5vfl Xp/n3QDEOMGuWas2mXp6BjuYpKf7rem/8p3HgbsOUwPkr4t1XSdR0nUrnTNRga2vrRzFcQOKMrL+ sdwRsRm0BBFhKEphV1MVep/kF5XhufzQ0uLW7HlF9VfUbSGdfhai1hl4nqP2lr7HMfUS9BpX2Pms Q8n/AOcnf/JVz/8AMZbf8SOZOl+tXx7TNkl9AW3/ADltqMNvFCPLULCJFTl9aYV4ilf7rMM6Md6q n/Q3mpf9SzD/ANJbf9UsfyY71d/0N5qX/Usw/wDSW3/VLH8mO9Xf9Deal/1LMP8A0lt/1Sx/JjvV 3/Q3mo/9SzD/ANJbf9UsfyY71d/0N7qP/Usw/wDSW3/VLB+THerv+hvdR/6lmH/pLb/qlj+THerv +hvdR/6lmH/pLb/qlj+THeqa+U/+cnbnzD5p0jRrjQorNL+7itxcrcGQo0rcBRTGoNeXHr3yM9Lw gm0I+/lMt9cSnrJK7H6WJzyLPLiySPeS+gYY1ADuAUMpbGY/llEDq11L/JBxH+ydT/xrnSezUf30 j3R/SHR9uy/dxH9L9Dxn/nLG99Xz7ptoDVbfTEYjfZ5J5a/8Kq56JpB6T73mHiWZSuxV2Kt4quph V1MVdTFXUxV1MVew/wDOLI/5CZL/ANs24/5ORZjav6Pir63zWIdiryf89Pyci85aadY0iNU8zWSf CBQC6iXf0mP84/YP0HbcZOnz8Jo8lfIU0EsMrwzI0c0bFJI3BVlZTQqwO4IObNL138h/yZfzZfLr 2txFfLVm/wC7ibb65Kp+wP8AitSPjPf7I70xtRn4dhzV6ckaR/8AOUSpGoRE0YKiKKAAR0AAGY/+ R+KHtWYivKP+cm//ACVk/wDzGW3/ABI5k6T61fH1M2aXUxV1MVdTFXUxVphiVW4FdirsVTLy1eNZ eY9KvFrytry3mFOtY5Vbbp4YJCwVfSGeHPobsVZz+VwPr6ie3GLf6WzqfZj6p/D9Lz/b3KHx/Qnm o+R/KGvaldXmtaPaajdRssKTXEKSOsYjRggJFacmJ+nOyGSQGxebQ/8Ayqb8s/8AqWNN/wCkaP8A pj40+8q7/lU35Z/9Sxpv/SNH/THxp95V3/Kpvyz/AOpY03/pGj/pj40+8q7/AJVN+Wf/AFLGm/8A SNH/AEx8afeVb/5VP+Wn/Usad/0jx/0w+NPvKu/5VP8Alp/1LGnf9I8f9MfGn3lXf8qn/LT/AKlj Tv8ApHj/AKY+NPvKu/5VP+Wn/Usad/0jx/0x8afeVfL3/OQWh6Pov5izWOk2cVjZi1gcW8CBEDMp qeI8c2OmkTCylN/+cWx/yEuX/tnT/wDJyLI6z6Pir61zVoecWf5tWtv+bOseRdXKwrztzot10DNL awyNbv8A5TO7MhPX7PhmQcHoEgr0fMdXzv8A85N/lppcNp/jaw42908qQanABRZi9QswoNn2o3j1 69c/SZT9JV7n5Ttre28raRBbxrDDHZwBI0AVQPTXoBmFM+oq8s/9ek/7dH/MvMn/ACPxV7RmIryn /nJr/wAlbP8A8xlt/wASOZOk+tXyBTNql9x2H5Vfls9jbO/lrTmZokLMbeOpJUVPTNMc075lCv8A 8qn/AC0/6ljTv+keP+mPjT7yrv8AlU/5af8AUsad/wBI8f8ATHxp95V3/Kp/y0/6ljTv+keP+mPj T7yrv+VT/lmf+mY03/pHj/pg8afeVa/5VN+Wf/Usab/0jR/0x8afeVd/yqb8s/8AqWNN/wCkaP8A pj40+8q7/lU35Z/9Sxpv/SNH/THxp95Vw/Kb8swajyxptf8AmHj/AKY+NPvKvMs8lfQ3YEs5/K4/ v9QFeqxGnyLZ1PsyfVP3D9Lz/b3KHx/QmOufmX5G8r6tcafr2qx2N5KUuI4XSViYmjVA1URh9pGG dnHFKQsB5tAf8r4/KT/qYof+RVx/1Tw/l59yu/5Xx+Un/UxQ/wDIq4/6p4/l59yu/wCV8flJ/wBT FD/yKuP+qeP5efcrY/Pj8pSaf4ih/wCRVx/1Tx/Lz7lXf8r0/Kf/AKmGH/kVP/1Tw/lsncrv+V6f lP8A9TDD/wAip/8Aqnj+Wydyu/5Xp+U//Uww/wDIqf8A6p4/lsncrv8Alen5T/8AUww/8ip/+qeP 5bJ3K+a/z38yaJ5j8/zalot0t5YtbQRrOoZRyQEMKOFO3yzY6aBjCilO/wDnF0f8hKl/7Z0//JyL K9Z9HxV9aZq0PjL/AJyCLL+cOvMpowNmQRsQRZQZt9L/AHY/HVL2v8hvzjXzPZp5d1yYf4itU/cT vt9bhTv/AMZUH2h3HxeNMPU6fh3HJCN/5yY/8ldP/wAxdt/xI4NH9avRPLf/ACjul/8AMJB/yaXM efMq8p/9ei/7dH/MvMr/ACHxV7PmGryr/nJj/wAldP8A8xdt/wASOZWj+tXyFTNql9oWP54/lVHZ W8b+YIQ6RorD0p9iFAP+681B02S+SFf/AJXp+U//AFMMP/Iqf/qng/LZO5Xf8r0/Kf8A6mGH/kVP /wBU8fy2TuV3/K9Pyn/6mGH/AJFT/wDVPH8tk7lWn89vymHXzFCP+eVx/wBU8H5efcrX/K+Pyk/6 mKH/AJFXH/VPH8vPuV3/ACvj8pP+pih/5FXH/VPH8vPuV3/K+Pyk/wCpih/5FXH/AFTx/Lz7lbH5 8flKTQeYoa/8Yrj/AKp4/l59ysL1CIw39zEescrof9ixGeUaiPDkkO4l7/DLigD3gIfKW1mP5ZSg avdRfzwch/sXUf8AG2dH7NTrNId8f0h0fbsf3UT/AEv0PGv+csrL0/PmmXYFFuNNRCfFop5a/wDC uuei6Q+k+95h4jmUrsVdirYNCDhVF0yxXUxV1MVdTFXUxV67/wA4vD/kJMv/AGzp/wDk5FmJrfo+ KvrLNUh8af8AOQY/5C9r/wD0af8AUFBm40v92Px1SwGxvLuwvIL2zlaC7tnWWCZDRkdDVWB8QcyC LFFXuHnT817Tzz+S08N0Vh8w2Vzai/thsJF5ECeIfyt+0P2Tt0Irg48Bhk8lfRHlz/lHtL/5hIP+ TS5r58yh5X/69D/26P8AmXmV/kPir2XMNXlX/OS//kr5/wDmLtv+JHMrR/Wr5Fpm2S6mKupirqYq 6mKqE/2gPbISVSyKuxV2Kpn5Zs2vvMmk2Sglrq8t4QB1rJKq+/jkZGgVfU/m62+r+ZL9Kfak9Qf8 9AH/AONs8g7Wx8GpmPO/nu9r2dPiwRPlXy2SfNc5zIPIlz6Hma2BNFmDxt9Kkj/hgM2/YeTh1UfO x9jre1ocWnl5UUd+cH5PR/mJdaSRqZ0uTT0uOUvofWBIshiotPVh48eJz0fDm4L2eNee/wDQn/8A 39v/AHL/APs6y/8AOeSu/wChP/8Av7f+5f8A9nWP5zyV3/Qn/wD39v8A3L/+zrH855K7/oT/AP7+ 3/uX/wDZ1j+c8lVh/wA4j0AH+K/+5f8A9nOS/P8A9H7U23/0KR/39f8A3L/+znD+f/o/b+xbd/0K R/39f/cv/wCznH8//R+39i27/oUj/v6/+5f/ANnOP5/+j9v7Ft5F+ZXkX/BPmh9C+u/pDhDHN9Y9 L0a+oK04c5On+tmXhyccbpWZ/wDOMA/5CTL/ANs6f/k5FlOt+j4q+sM1KHxt/wA5Aj/kLuvf9Gn/ AFBQ5udJ/dj8dUvPKZkq6mKvvzy5/wAo9pf/ADCQf8mlzn58yh5X/wCvP/8Abp/5l5l/5D4q9kzC V5X/AM5K/wDkr5/+Yu3/AOJHMvR/3ivkembdL6Btv+cTfWt4pv8AFXH1EV+P1CtOQrT/AHpzXHX/ ANH7VVf+hSP+/r/7l/8A2c4/n/6P2/sW3f8AQpH/AH9f/cv/AOznH8//AEft/Ytu/wChSP8Av6/+ 5f8A9nOP5/8Ao/b+xbUn/wCcQeTFv8W0r/2r/wDs5yB1t9PtVb/0J/8A9/b/ANy//s6x/OeSHf8A Qn//AH9v/cv/AOzrH855K7/oT/8A7+3/ALl//Z1j+c8lTbyn/wA4uJ5f8zaXrb+YhfDTbmK5FqbL 0uZiYMvx+vJxoRX7JyM9VYIpWX/mZZmPVbe7A+G4i4k/5UZ3/Bhnn/tJhrLGf84fc9R2HlvGY9x+ 9h2c47xEafdG0v7e6HWCRJP+BYHLtPl8PJGf80gtWbHxwMe8PbWdWWORWPCoI478gw4j6PirnqAI IsPAkUqYUOxV2KuxV2KuxV2KuxV8k/8AOSY/5CfP/wAwlv8A8RObjRf3aUR/zjEP+QkS/wDbOn/5 ORYNd9HxUvq7NQh8cf8AOQA/5C5r3/Rp/wBQUObrSf3Y/HVLzymZKupir768u/8AKP6Z/wAwkH/J tc56f1FDyz/153/t0/8AMvMv/IfFXseYSvLP+ck//JYT/wDMXb/8SOZei/vFfJFM3CX6Bad/xz7X /jFH/wARGc6eaERgV2KuxV2KuxV2KuxVawrIlRULVg3gaU/UTirG/wAwtP8ArWgmdRWS0cSbdeJ+ Fv11+jNH2/p+PT8Q5wN/oLtux83BmrpLZ5ZnCPXOxV615TuxqnleKNndXVGtZXRirqVHEFWG4biQ a56J2NqPE08T1jt8v2U8V2nh8PPLuO/zfG/mLzf+Z+h69qGjXXmnWPrGn3ElvIfr91QmNivIfvOj UqM6mMIEXQcFL/8AlZX5i/8AU1ax/wBJ91/1UyXhR7grv+VlfmL/ANTVrH/Sfdf9VMfCj3BXf8rK /MX/AKmrWP8ApPuv+qmPhR7grafmX+YisCfNOrkDqDf3P/VTCMcO4KmA/MX8wCAR5n1ah6f6dc/8 15f4MO4fJXpH/OP/AJu82ap+YkNpqet399am1nY29zdTTRllUUPB2ZajMXWYoiFgBX09mpQ+Sv8A nJIf8hOn/wCYS3/4ic3Oi/u0sK8necdb8o6sdV0Zo0u2iaAmVBIvByCdj/qjL8mITFFWbf8AQyP5 nf7/ALT/AKR1/rlH5HGtMB80eY9T8za7c63qhRr674es0a8F/dxrEtFHT4UGZOPGIigqVUySupir 060/5yI/Mm1tYbWKa1EUCLFGDbqTxQBRU18BmKdFjJVJf+Vtecf8Y/4u9SD9M+h9W5+kPT9OlPsV 65P8tHh4eip//wBDI/md/v8AtP8ApHX+uV/kca0kvm785PO3mvR20jV5Ld7N3SUiKEI3JDVfiByz HpYQNhWDUy9X3/p3/HPtf+MSf8RGc5Lmh5x/zkRq+raV5BjutLvbiwuTfQoZ7WV4ZOJSQleUZU0N OmZWiiJToi9lfNH/ACsT8wf+pn1b/pOuf+a82vgQ/mj5JQl1+ZX5hB+CeaNXFOpF/c9f+RmVTxw7 h8lUf+VlfmL/ANTVrH/Sfdf9VMh4Ue4K7/lZX5i/9TVrH/Sfdf8AVTHwo9wV3/KyvzF/6mrWP+k+ 6/6qY+FHuCu/5WV+Yv8A1NWsf9J91/1Ux8KPcFfWf5C22vr+XVlqGvX91qGoaq73gkvJpJ5Egaiw orSFjxKLzA/ys12oI4qHRD0C4giuLeSCUcopVZHHirChzFyQE4mJ5EUyhMxkCOYeJ6jYy2N9PZy/ 3kDlCfGnQ/SN88x1GE4shgecS97hyjJASHVDZS2sy/LbVRDqE2nufgul5xf8ZEG4+lf1Z0ns5quH IcZ/i5e8fs+50fben4oCY/h+4vHv+cqfJrWHme080W6f6Lq8YhumHa6gUKCf9eILT/VOeh6Sdiu5 5h4ZmWrsVdirsVRdnN/upj/q/wBMtxy6K9d/5xvH/ITYP+YS4/4iMp1392pfWeaVDB/Nv5OeSvNe sNq+rxTteMiRExTFF4oKDYDMjHqZwFBUm/6Fu/LL/fF3/wBJDf0yz89kW3f9C3fll/vi7/6SG/pj +eyLbv8AoW78sv8AfF3/ANJDf0x/PZFt3/Qt35Zf74u/+khv6Y/nsi27/oW78sv98Xf/AEkN/TH8 9kW3f9C3fll/vi7/AOkhv6Y/nsi27/oW78sv98Xf/SQ39Mfz2Rbd/wBC3fll/vi7/wCkhv6Y/nsi 27/oW78sv98Xf/SQ39Mfz2Rbd/0Ld+WX++Lv/pIb+mP57ItvT4o1iiSJPsooVa+AFBmGryj/AJya /wDJcxf9tCD/AIhLmboP7z4KHyfcSiJK/tHZRm2kaCUuJJNT1OY6tYq7FXYqnvkjyvc+afNmmaDb 1DX06pK4FSkQ+KWT/YRqzZHJPhiSr75s7S3s7SC0tkEVtbxrFDGuwVEAVVHyAzTk2hVwKwD8ytGK yw6tEvwvSK5p/MPsMfmNvuzkvaPR0RmHXY/o/U9H2JqdjjPvH6WC5yr0KtaXU1pdRXMJpLC4dD7q a5ZiynHMSjzBtryYxOJieRegee/LNp+Yf5eXNhEVWa6iE9hIx2juot0BPhyqjexOeoaHVicY5I8i 8JnwnHMxPR8OXNtPa3MttcRmK4gdo5omFGV0PFlI8QRm+Ba1LFXYq7FWwSDUdcVeu/8AON+p2kX5 jQyXc0cCra3ALyMEU1UU3YgZDVHix11V9W/4h0D/AKudp/yPj/5qzU8Eu5Dv8Q6B/wBXO0/5Hx/8 1Y8Eu5Xf4h0D/q52n/I+P/mrHgl3K7/EOgf9XO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P8A5qx4Jdyu /wAQ6B/1c7T/AJHx/wDNWPBLuV3+IdA/6udp/wAj4/8AmrHgl3K7/EOgf9XO0/5Hx/8ANWPBLuV3 +IdA/wCrnaf8j4/+aseCXcrv8Q6B/wBXO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P/mrHgl3K7/EOgf9 XO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P8A5qx4JdyvKv8AnJPWtIn/AC7RLe9gnkF/A3pxSI7UCSdl JOZmiBjOz3K+TZpWlcs30DwGZ8pWlTyKuxV2KuxV9N/84reQWtdPu/Od7HSW9DWmmBhuIUb97KP9 d14j/VPjmBq8m/Ch9AZhq7FUPqFjBf2U1nOKxTKVbxHgR7g75TqMEcsDCXKTbhynHMSHMPGNT0+4 06+ms5xSSFqE9iOoYexG+ea6nTyw5DCXMPc4M0csBKPIoXKG5mn5da8ILltKnakVweVuT0ElN1/2 Q/H5503s9ruCXgy5S5e/9v45ui7a0nFHxBzHP3fseR/85O/lo2n6ovnPTYf9B1BhHqqoNo7nospp 2lGxP83u2eg6XLY4S8y8FzLV2KuxV2KtqzKQymhHQ4QVTK1vEkoj7SfgcyIZLVFUyxLqYq6mKupi rqYq6mKupirqYq6mKupirqYqpzTRwrVzv2Hc5GUgEJXPO8zVbYDovhmNKVqpZFXYq7FXYqyj8uPI 1/51812miWtUhc+pfXIFfRtkI9R9++9F8WIyvLkERavurTNNstM06206xiEFnZxJDbxL0VIwFUfc M1JNm0InArsVdirFfPfls6jZ/XrZK3lsvxKOrx9SPmvUZoe3OzvGh4kR64/aP2O47J1vhS4JfTL7 C8wzhnrFyO6OroSrqQVYbEEbgjCCQbCCARRen6bcaX5z8r3Ol6rEsyzRG31CA7VDDZ18K9QR0Ye2 eidkdo+PjB/jjz/X8Xi+0NGcGTb6Ty/U+N/zL/L7U/I3mefSLuslq1ZNOvKUWaAn4W/1h0cdj7Uz qcWQTFuCxTLFdirsVdirsVRlvqDpRZPjXx7jLY5a5qmEU0UoqjA+I7/dmRGQPJV9MKXUxV1MVdTF XUxV1MVdTFXMVUVY0A6k4lUFPqKD4YRyP8x6ZTLL3IS93d2LOase5ygm1W4FdirsVdiqra21xdXM VrbRtNcTuscMSAszuxoqqB1JJxJV9qfkr+WEPkXywEuVVte1ALLqcwoeJH2IFP8ALHX6WqfDNVny 8Z8kPQspV2KuxV2KuxV5v568qG0lfVLJP9EkNbiMf7rcn7Q/yWP3HOM7c7L8MnLAeg8/I/qL1HZP aHGPDn9Q5ef7WHZzbvEdo2r3Wk38d5bnddpEPR0PVTmXo9XPT5BOP9ocfU6aOaBjJmfnbyd5e/M7 yf8AV3YRzislheUBktrim4YeB6OvcfQc9I0GujkiMkOR/FPE6jBLFMxlzfGPmfyxrPljW7nRtYgM F7bGjDqrqfsujftKw3BzewkJCw1JVkldirsVdirsVbBKmoNCOhGFUVFqVwmzUce/X78sGUhUSmqw n7alT7bjLBmCqy39o3+7KfMEZMZIqvF1bH/dq/fh4496VpvbQdZB9FT+rB4ke9Cm+p2y/Zq3yFP1 5E5oqhpNVkO0aBfc7nIHMeioSSaWQ1di3zykyJ5qswK7FXYq7FXYq2ASaDrir6m/5x9/JU6HFF5t 8xQU1iZK6bZSChtY2BBkcH/drqdh+yPc7a/UZ79I5Ie6ZiK7FXYq7FXYq7FWpI0kRo5FDo4KsrCo IOxBBwSiCKPJIJBsPL/N/lCbS5Wu7RS+nOa7bmIk/Zb/ACfA/wCZ4btbsg4Dxw3xn/Y/set7O7SG UcMvr+9i+aJ2yb+XPMd3ot36kfx270E8BOzDxHgw7HNj2f2hPTTsbxPMfjq4Wt0Uc8aP1dCyL8wP y68r/md5ejmDiHUYkb9H6ko+OJuvpSr+0leq9uoz0XRa6M4icDcT+Pm8bmwyxSMZDd8e+bPKOv8A lTWJdI1u2NtdR7qesciHpJE/RlPj9B3zdQmJCw1pNkldirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVXIjyOscal3chURRUknYAAYq+nfyO/ID9FPb+Z/NsIbUhSTT9KcVFueqyzDvJ3Vf2ep+L7 OBn1F7RQ98zDV2KuxV2KuxV2KuxV2KtSRpIjRyKHRwVZWFQQdiCDglEEUeSQSDYedeavIktqXvdL UyW27SWw3dP9X+ZfxGcd2p2GYXPELj3dR7vJ6bs/tYTqGTaXf3sMzmneppoPmG+0a69W3PKFqetb sfhcfwPgcz9D2hk007jy6jvcPV6OGeNS59CzLXvL3kv8zPL5tNQiDsm8ci0W6tZGH2kbfrT/AFW7 53/Z/aUM0eLGfeHkNVpJ4ZVL5975V/Mz8mvNPkW4aadDfaI7Ug1WFTw3OyzLuYn+ex7E5vsWYT97 jsBy5XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FU28teVtf8zarHpeiWb3l5JvxQUVF7vI5oqKP FjkZTERZV9YflJ+Q2i+S1j1TUympeZSKielYbavUQKw+12Mh38OO9ddm1BlsOSHquY6uxV2KuxV2 KuxV2KuxV2KuxV2KsX8x+RrLUi9zZ0tb01JNP3bn/KA6H3GaPtHsSGa5Q9M/sPv/AFu20Xas8Xpl 6ofaHnOpaTqGmzmC9haJ/wBkndWHirDY5xmp0uTDLhmKL0+DUQyi4G1OyvruxuFubSVoZk6Ov6iO hHscjhzzxS4oGpM8uKOSPDIWHoGi+d9L1W3bT9ajjjaZTHIJAGt5VbYhg1QK9w22dj2f2/DJUcno n39D+p5nWdkTh6sfqj9v7XnH5i/84v6RqXq6l5NmTTbt6u2mykm0cnf9045NF8t18OIzq8WrPXd0 z528z+TvM3le++pa9p01jMa8DIKxyAdTHItUce6k5nRmJclSbJK7FXYq7FXYq7FXYq7FXYq7FXYq q21rc3VxHb2sLz3Ep4xQxKXdmPZVWpJxJV7V+Xv/ADjF5j1cx33mqQ6Np5oRZrRryQe43WKv+VVv 8nMXJqgOW6vpTyt5Q8ueVdMXTdCso7O2G7ld3kb+aRzVnb5nMCczI2UJxkVdirsVdirsVdirsVdi rsVdirsVdirsVUbuytLyAwXUSzRN1RxUfMeByrLhhkjwzAIbMeWUDcTRYVrP5aqeUukzce/1aY7f JX/r9+c1rPZzrhPwP6/1/N3um7b6ZB8R+phuoaRqWnScL23eE9AzD4T8mHwn6DnN6jSZcJqcSPx3 u8w6jHlFwIKP0Tzdq+klUjk9a1HW3k3Wn+Seq/RmVou1s2n2BuPcfxs4+q7OxZtyKl3hmMfmXyj5 ks20/WLeIxy7PaXqLJEx6bMw49+9DnWaPt3Dk5ngl5/r/sed1PZOXHuPUPL9TAPNv/OLXk3VOdz5 du5dGuH+JYf96LU132ViJFr7PT2zoserPXd1rx/zJ/zjp+Z+il3hsU1e2U7S2DiRqdv3T8Ja/JTm VHUwPkrzrUdK1PTZzb6jZz2VwOsNxG8T/wDAuFOXAg8lQuFXYq7FXYq7FVyI8jqiKXdjRVUVJJ7A DFWZeXvyc/MrX+DWOg3KQPuLi6Ato6fzBpinIf6tcqlmgOqvWvKn/OJdGSbzVrAIFC1lpw69955R 94Ef05jz1ncEPbPKf5f+TvKcPp6DpcNo5HGS5pzncf5cz8nI9q0zEnklLmVZDkFdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVWyRxyoUkQOjfaVgCD8wcjKIkKIsJjIg2Eg1DyH5eu6skLWsh/ agPEf8Car9wzU6jsLTZOQ4T5fq5Oyw9rZ4czxDzY7efljeLU2d5HIOyyqUP3rzzT5vZqY+iYPv2/ W7LF27E/XEj3b/qQ1tovn3Rj/oYk9MfsxukiH/nmSf1ZTj0faGn+i68iCPl+xtnqtHn+qr8wQfmn Fr5y8x24C6noszAdZY0dNh3oQwP35sMXbGphtlxS94BDhZOzcEv7vIPiQmJ80eWtRh+r6hAyo/WC 8tyyntvs6/fmxxds4Tz4oHzB/Q4U+zMseVS9xSq5/Kz8o9b5N+gdOkJ3Y2qiBt+59AxnNrh1vH9E r+LhzxTh9QISa5/5xr/KaY1j06e2Fa0iupz9H7xpMyBqptaBf/nFr8sWcsH1FAeircJQffGTh/Nz VEQf84yflVGV5213NxFCHuXFdup4cPwwfmpqnWn/AJEflNYkGLy9DIw73Ek09Tt2ld17eGROomeq ss0ry55e0gU0rTLTTxSn+iwRw7f7BVysyJ5lUxyKuxV2KuxV2KuxV2KuxV2KuxV2Kv8A/9k= - - - - - - 1 - False - False - - 119.000000 - 118.999512 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Standard-Farbfeldgruppe - 0 - - - - - - Document - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/Shading<>>>/Thumb 50 0 R/TrimBox[0.0 0.0 119.0 119.0]/Type/Page>> endobj 46 0 obj <>stream -H‰tVËn1 Ýç+òãÚygۂX!„XÀþ -èâ‚Tø‰c'™;s[ZuÆ'3±íL>=ù‡Oìß=y÷â؋tûÛôòç»ûê;&©ÑãõqýóÓ=|øÂþç_÷âÅ3~Û ³øÜ)ùåt]¯[¨Äqêœý–u·P¼¸­fê©íÏ{¥–ãmûĬ¯NÛ¿vžï~g܁ymbóôÃ}ÆB©)ùÜA{âÄpÕ}*T²ˆÂ͗ EÒBwÆW×"•^¤åh¢æâÎøºp­Ô»ŸŽz_Ya'ÚÃN|uƒã„“þðsÎíbU}ÙK¸1±þ€]©(aÈ2ÌÃs Z–2³ EKýøÍ?|yfÿ÷Ù¿ÿ懢ÿë¦^:\æ¦-%í?Í)EJ9[ Q[ˆ^:Ŏ‚V -(z¢ŠÏBœñ²KÉ슈«(F)Õغ8ôk -y᭑öS£°F3k³õìmKò›íIËã‚­ãíy‚rÁ ×nDÇCÎU Œ,6KCûq³ôò¡3EµP‰nҠ̝Ñ"%Pˆ-ÞÔÙ"T-êçjv  ¹ÁWQjý†5%½ãHÊ]QY¹i””1OëꞍލüf¦VúaòÇ»FǬ­S±Í„côåë{zäÒîI‰…ŠWãÀbX¨Zf“ё›ŽB¦ªw„ov,ocáà^²5ãNõM\€ùl/G!’9ac0nGcÅ(eY)˜ª+›{YW±f¥Åƒ¶΁T‰¦¹ „I ¥ ¯Òy‹–_½â¢SÙ(b`€tV¶B¹íáYŠ¯ ó0…Ëќݠi#À= -%ï -žÑî]'«H>.t(™;…YÿÉ]qSñfr¦Þžè½|úMbnííaIµíâ¶QS7¨FØ; Œi€Õç” sÐ6[ãeºóç}6$æêcBU˺̓qõקaU±»'UðåÚ³(TÓ(Í°pÐg‰¬9¼¡‰Î„~Э—㸢I±Ž[­ÖùDoy´ûnß{ÍðÛk†PÑ´ë´Œ¡ÊŠò¢œ¥–úñµŠb‘sYoôßÄ?(ŸÝ?uô­· -endstream endobj 50 0 obj <>stream -8;UT3d0Te-#Xc.2r%d*YWt%"+'N:(9\^ -endstream endobj 51 0 obj [/Indexed/DeviceRGB 255 52 0 R] endobj 52 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 49 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 44 0 obj <> endobj 56 0 obj [/View/Design] endobj 57 0 obj <>>> endobj 48 0 obj <> endobj 47 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (Eclipse_with_icon.ai) -%%CreationDate: 6/22/2019 3:20 AM -%%Canvassize: 16383 -%%BoundingBox: 404 366 514 469 -%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%%DocumentFiles:K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 399.6704 358.1719 518.6704 477.1714 -%AI3_TemplateBox: 639.5 400.5 639.5 400.5 -%AI3_TileBox: 43.1904 129.791 843.8301 705.7915 -%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: 1 -%AI9_OpenToView: 251.75 551.25 4 1528 954 26 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 60 0 obj <>stream -%%BoundingBox: 404 366 514 469 -%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 -%AI7_Thumbnail: 128 120 8 -%%BeginData: 22957 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 -%524C45FD31FFCFCFC9C9C2FD04C1C8C8CFCAFD6EFFCACFC8C89FC1BAC098 -%C1C1C9C9FD70FFCAC9C2C1C0C1C0C0BAC1C2C9CAFD0BFFA8A87EA87D7E7D -%A87DA8A8A9A8FD58FFCAC9C1C198C09EC198C0C1C9CAFD07FFA8A8535328 -%2821280028002100220021002821282853537E7EFD51FFCFC2C1C0C1C0C1 -%C0C1C0C8CAFD07FF7D772828212800282828212828282128282821282828 -%21282128002828537DA9FD4BFFC9C2BAC098C1C0C198C1C2CFFD05FFA977 -%4C0028002800282128002821280028212800282128002821280028212800 -%280021002853A8A9FD45FFC9C1C0C0C1C1C1C0C1C0C8CAFD05FF7D532128 -%212821282828212828282128282821282828212828282128282821282828 -%212828280028214C53FD42FFC9C198C19EC198C198C09FCFFD04FFA87721 -%220028002821280028212800282128002821280028212800282128002821 -%2800282128002821280028002100537EFD3EFFC2C1C0C1C1C1C0C1C0C1C9 -%FD05FF532800282828272828282728282827282828272828282728282827 -%28282827282828272828282728282827282828272821284CA8FD3AFFC998 -%C0C0C19EC1C0C098C8CFFFFFFFA853002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%2821280028212200537EFD36FFCAC8C0C1C0C1C1C1C0C1C1CFFD04FF7728 -%002821282828212828282128282821282828212828282128282821282828 -%212828282128282821282828212828282128282821282828002853FD34FF -%C9C098C19EC198C198C09FFD04FFA8282100282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%280028212800282128002821280022217DFD31FFC2C1C0C1C1C1C0C1C0C1 -%C9FD04FF7D21282728282827282828272828282728282827282828272828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828280053A8FD2DFFCF9FC0C0C19EC1C0C198C1C9FFFFFFA828 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%0028212800287DFD2BFFCFC1C1C0C1C1C1C0C1C0C1CAFFFFFF7D28212821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%282828002853FD29FFC998C19EC198C19EC198C1CAFFFFFF522100282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%00282128002128A9FD26FFC9C0C1C1C1C0C1C1C1C0C8FD04FF4C28212828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827FD0428A9FD24FFC9BAC19EC1C0C19EC1BAC2FFFFFFA92828 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800A8FD22FFC9C0C1C1C1C0C1C1C1BAC8 -%FD04FF282821282828212828282128282821282828212828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%28212828282128282821282828212828282128282800A2FD20FFC998C198 -%C19EC198C198C1CAFFFFA921282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%28007EFD1EFFCFC0C1C0C1C1C1C0C1C0C1CFFFFFFFFD0428272828282728 -%282827282828272828282728282827282828272828282728282827282828 -%272828282728282827282828272828282728282827282828272828282728 -%28282728282827FD052800A8FD1CFFCF9EC1C0C19EC1C0C198C1CAFFFFFF -%282100282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%21280028212800282128002821280028212800282128002800A8FD1BFFC1 -%C1C0C1C1C1C0C1C0C1C9FFFFFFFD04282128282821282828212828282128 -%282821282828212828282128282821282828212828282128282821282828 -%212828282128282821282828212828282128282821282828212828282128 -%282821282828212828A9FD19FF9FC09EC198C19EC198C0C8FFFFFF520000 -%282128002821280028212800282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%2821280028212800282128002821280028212800282128002827FD18FFC9 -%C1C1C1C0C1C1C1C0C1C2FFFFFF7D28212828282728282827282828272828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%28272828282728282827FD0428FD16FFCAC198C1C0C19EC1C0C09EFFFFFF -%7E2821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212153FD15FFC8C0C1C0C1C1C1C0C1C0CFFFFFA928002828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%28282821282828212828282128282821282828212828287EFD13FFC998C1 -%9EC198C19EC198C8FFFFFF53002800282128002821280028212800282128 -%002800280028002800280028002800280028002800280028002800280028 -%002800280028002800280028002800280028002800280028002800282128 -%00282128002821280028212800280028A8FD11FFCFC0C1C1C1C0C1C1C1C0 -%C1CFFFFFA800282728282827282828272828282728282827FD3B28272828 -%282728282827282828272828280077FD11FFC1C09EC1C0C19EC1C0C0C9FF -%FFFF212821280028212800282128002821280028212828FFA8A9A8FFA8A9 -%A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FF -%A8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8FF772821280028212800282128 -%002821280028212800A8FD0FFFC9C1C0C1C0C1C1C1C0C1C1FFFFFF532821 -%28282821282828212828282128282821282153FD37FFA800282828212828 -%28212828282128282821FD0428FD0FFFC198C19EC198C19EC198CAFFFF7E -%2800280028212800282128002821280028212800284CFD37FF7D21002821 -%280028212800282128002821280028210053FD0DFFC9C0C1C1C1C0C1C1C1 -%C0C8FFFFFF5321282728282827282828272828282728282827282153FD37 -%FFA800282828272828282728282827282828272828282128A8FD0CFFC1C0 -%9EC1C0C19EC1C0C0C9FFFFA8002821280028212800282128002821280028 -%2128002852FD37FF7D220028212800282128002821280028212800282128 -%007DFD0BFFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828212828282128282821 -%28282821282828212828280053FD37FFA821282128282821282828212828 -%28212828282128282821FD0BFFC198C19EC198C19EC198CAFFFF7D280028 -%00282128002821280028212800282128002821214CFD06FFA87EA87EA87E -%A87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87E -%A87EA87EA87EA8A8FD05FF7D280028002821280028212800282128002821 -%280028212152FD09FFCFC0C1C1C1C0C1C1C1C0C8FFFFFF53212827282828 -%272828282728282827282828272828280053FD06FF522828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%28212828FD06FFA821282728282827282828272828282728282827282828 -%2128A9FD08FFC1C09EC1C0C19EC1C0C0C9FFFFA800282128002821280028 -%21280028212800282128002821224CFD06FF530028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%28A8FD05FF7D282128002821280028212800282128002821280028212800 -%7DFD07FFCAC1C0C1C0C1C1C1C0C1C1FFFFFF532821282828212828282128 -%2828212828282128282821282153FD06FF53282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%FD06FFA8002828282128282821282828212828282128282821FD0428FD07 -%FFC998C19EC198C19EC198C8FFFFA8280028002821280028212800282128 -%002821280028212800284CFD06FF53002800280028002821280028212800 -%282128002821280028212800282128002821280028002800280028A8FD05 -%FF7D210028212800282128002821280028212800282128002800217DFD06 -%FFFD04C1C0C1C1C1C0C1CAFFFFA800282728282827282828272828282728 -%28282728282827282153FD06FF532827282153FD04282728282827282828 -%2728282827282828272828282728282827282853FD0528FD06FFA8002828 -%2827282828272828282728282827282828272828280077FD05FFCAC198C1 -%C0C19EC1C0C19FFFFFFF4C28212800282128002821280028212800282128 -%00282128002852FD06FF530028002877FF21282128002821280028212800 -%282128002821280028212800282128007EA82800282128A8FD05FF7D2100 -%282128002821280028212800282128002821280028212821FD05FFC9C0C1 -%C0C1C1C1C0C1C0C8FFFFA828002821282128212821282128212821282128 -%2128212821280053FD06FF52282828007DFFA80028282821282828212828 -%2821282828212828282128282821280077FFA92128212828FD06FFA80028 -%2128212821282128212821282128212821282128212821227DFD04FF9FC0 -%9EC198C19EC198C0C9FFFFFF7EA87EA87EA87EA87EA87EA87EA87EA87EA8 -%7EA87EA87EA87EA8A8FD06FF530028212152FFFF7E002821280028212800 -%2821280028212800282128002821280053FFFF7E2800280028A8FD05FFA8 -%A87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA8FFFFFF -%CFC1C0C1C0C1C1C1C0C1C1FD25FF52282828007DFFFFFF7E002827282828 -%272828282728282827282828272828280053FFFFFFA92828272828FD25FF -%CA98C1C0C19EC1C0C198C8FD25FF530028212153FD04FF7D002800282128 -%00282128002821280028212800280028A8FFFFFF7E2821280028A8FD21FF -%A8FFFFC8C0C0C1C1C1C0C1C1C0C8FD25FF53282128007DFD05FF53002821 -%2828282128282821282828212828280028A8FD04FFA82128282821FD25FF -%C898C198C19EC198C198C9FFFFA8FD22FF530028002253FD05FFA8520028 -%002821280028212800282128002800227DFD05FF7E2800280028A8FD21FF -%A8FFFFC1C1C0C1C1C1C0C1C0C1CAFD25FF53282728007DFD07FF4C002828 -%282728282827282828272828287DFD06FFA821FD0428FD24FFCAC1C0C19E -%C1C0C19EC1C1FFFFFFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8 -%A9A8FFA8A9A8FFA8A9A8FFA8A9A8530028002853FD07FFA8280028212800 -%2821280028212800284CFD07FFA828002821287EFFA8A9A8FFA8A9A8FFA8 -%A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8FFCFC0C1C1C1 -%C0C1C1C1C0C8FFFFFF4C2828212828282128282821282828212828282128 -%282821282828212828282128282821282828007DFD08FFA8280028282821 -%282828212828280053FD07FFA82128212828282128282821282828212828 -%2821282828212828282128282821282828212828282128A8C8C098C19EC1 -%98C19EC0A0FFFFA800280028002800280028002800280028002800280028 -%00280028002800280028002800280028212153FD09FF7D21002821280028 -%212800284C4C28FD07FF7E28002800280028002800280028002800280028 -%0028002800280028002800280028002800280028007EC9C0C1C1C1C0C1C1 -%C1C0C9FFFFA228282827282828272828282728282827FD1728007DFD0AFF -%7DFD0A28FF5253FD07FFA9FD1A28272828282728282827282828272853C1 -%C09EC1C0C19EC1C0C0C9FFFF7E0028212800282128002821280028212800 -%282128212821282128212821282128212821282128212253FD0BFF522821 -%282128212821FFFF5228FD07FF7E28212821282128212821282128212821 -%28212821282128002821280028212800282128002821280053C8C0C1C0C1 -%C1C1C0C1C0CFFFFF7D222128282821282828212828282128282821282828 -%222828282228282822282828222828282228007DFD0CFF4C282828222828 -%A8FFFF5253FD07FFA8212828282228282822282828222828282228282821 -%28282821282828212828282128282821FD04289FC19EC198C19EC198C1C9 -%FFFF53002100220021002200210022002100220021002800220028002200 -%2800220028002200282128002853FD0DFF2828212800A8FFFFFF5328FD07 -%FFA228002821280022002200280022002800220028002200220021002200 -%21002200210022002100220028C1C1C1C0C1C1C1C0C1C1FFFFFF7E7D537D -%537D537D537D537D537D537D537D537E537D537D537D537D537D537D537D -%537EFD0428217DFD0EFF2828217EFD04FF5253FD07FFA822FD04287D777D -%537D537D537D537D537D537D537D537D537D537D537D537D537D537D537D -%537D539EC1C0C19EC1C0C198C1CAFFA8FD24FF530028212853FD05FFA87E -%FD07FFA92228A8FD04FF534CFD07FFA82800282128A8FD23FFC1C0C1C1C1 -%C0C1C1C1C0FFFFFFA8FD23FF52282828007DFD06FF22A8FD07FFA822A8FD -%04FF4C53FD07FFA9FD0528FD24FF9EC198C19EC198C19EC1CAFFA9FD24FF -%530028212253FD05FFA82800A8FD06FF7E287EFD04FF5328FD07FF7E2821 -%280028A8FD23FFC1C0C1C1C1C0FD04C1FFFFFFA8FD23FF53282828007EFD -%06FF282828FD06FFA928A8FD04FF4C53FD07FFA9FD0528FD24FFC0C19EC1 -%C0C19EC1C0C1CAFD26FF530028222253FD06FF28002828FD05FF7E28A2FD -%04FF5328FD07FF7E2822282128A8FD23FFC1C1C1C0C1C1C1C0C1C1FFFFFF -%A9FD23FF53282828227DFD06FFFD04284CFD04FFA822A9FD04FF5253FD07 -%FFA822FD0428FD24FF98C19EC198C19EC198C1CAFFFF7D284C2852284C28 -%52284C2852284C2852284C2853284C2853284C2853284C28532852282822 -%28212853FD05FFA8282128212852FFFFFF7E287EFD04FF5328FD07FFA228 -%002822282853284C2853284C2853284C2853284C2853284C2852284C2852 -%284C2852284C2852284CC8C0C1C0C1C1C1C0C1C0CFFFFF53222128212821 -%28212821282128212821282128282822282828222828282228282822FD05 -%28227DFD06FFFD062853FFFFA822A9FD04FF5353FD07FFA9FD0828222828 -%282228282822282828222828282128212821282128212821282128212828 -%9FC1C0C19EC1C0C198C1C9FFFF7E00280028212800282128002821280028 -%21282228282822282828222828282228282822282828222853FD05FFA828 -%2228222822287DFFA8287EFD04FF534CFD07FFA828222828282228282822 -%282828222828282228282822282128002821280028212800282128002800 -%52C8C0C1C1C1C0C1C1C1BAC9FFFF7D282828212828282128282821282828 -%21FD1728007EFD06FFFD0828A8FF28A8FD04FF4C53FD07FFA9FD1A282128 -%28282128282821282828212853C2C098C19EC198C19EC0A0FFFFA8002821 -%280028212800282128002821280028222822282228222822282228222822 -%2822282228222853FD05FFA828002822282228222853287EFD04FF5328FD -%07FF7E282228222822282228222822282228222822282228222800282128 -%002821280028212800282128007DC9C0C1C1C1C0C1C1C1C0C9FFFFA82821 -%2821282828212828282128282821FD14284D2828227EFD06FFFD05284DFD -%0528A9FD04FF5353FD07FFA92828284DFD12282128282821282828212828 -%282128282821287DC9C098C1C0C19EC1C0C09FFFFFFFFD04282728282827 -%2828282728282827FD13282228282853FD06FF2822282828222828282228 -%A8FD04FF5328FD07FFA228222822FD132821282828272828282728282827 -%28282821A8FFC1C1C0C1C1C1C0C1C0C1CFFD25FF53282828227DFD06FFFD -%0B28A9FD04FF5353FD07FFA8FD0528FD24FFCAC198C198C19EC198C19ECF -%FFFFCBFD22FF530128222853FD05FFA828222822282228222822287EFD04 -%FF534CFD07FFA22822282228A8FD24FFC2C1C0C1C1C1C0C1C1C1C9FD25FF -%5328284D227EFD06FF2828284D2828284D282828A9FD04FF5353FD07FFA9 -%2829282828FD25FFC9BAC19EC1C0C19EC1BAC8FFFFA8FD22FF5322282228 -%53FD05FFA84D22282228282822282828A2FD04FF534CFD07FFA828222828 -%28A8FD24FFC9C1C0C1C0C1C1C1C0C1C1FD25FF53282828227EFD06FFFD05 -%284D2828282928A8FD04FF4D53FD07FFA92828282928FD26FF9EC19EC198 -%C19EC198C1CAFFA8FD22FF530128282853FD05FFA9282228282822282828 -%2228A8FD04FF5328FD07FF7E2822282228A8FD21FFA8FFFFFFC8C0C1C0C1 -%C1C1C0C1C0C9FFFFA87E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7E7E -%7DA27E7E7DA8FD06FF53282829227EFD06FF28292829284D2829284D28A9 -%FD04FF5353FD07FFA92829284D28FD07FF7D7E7DA27E7E7D7E7D7E7D7E7D -%7E7D7E7D7E7D7E7D7E7D7E7D7EA2FD04FFC9C0C0C19EC1C0C19EC0C2FFFF -%FF00000022002100220021002200210022002100282228012801224CFD06 -%FF5322FD042877FD05532822FD072822284DFD04532828FD07534C282828 -%2228A8FD05FF7D2201280128012800220021002200210022002100220021 -%0022007EFD05FFC0C1C1C1C0C1C1C1C0C1CFFFFF53002821282828212828 -%282128282821282828224D2829284D2877FD06FF5328284D282822282828 -%22282829284D2829284D282928292828222828282228282822FD04284D28 -%2828FD06FFA8224D2829284D282821282828212828282128282821282828 -%2128FD06FFC298C19EC198C19EC198C9FFFF7D2200280028212800282128 -%002821280028212822282828222853FD06FF532228222828282228282822 -%282828222828282228282822282828222828282228282822282828222822 -%28A8FD05FF7E282228282822282128002821280028212800282128002821 -%2152FD06FFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828272828282728282827 -%282828272828282128284D284D2877FD06FF5328284D2829284D2829284D -%2829284D2829284D2829284D2829284D2829284D2829284D2829284D2829 -%28FD06FFA8284D284DFD04282728282827282828272828282728282800A8 -%FD07FF9EC1C0C19EC1C0C198C1CAFFFF7D00280028212800282128002821 -%280028212800FD052853FD06FFA9A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8 -%A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2FD04A8FD05FF7E -%28282928280028212800282128002821280028212800280028FD08FFC8BA -%C1C1C1C0C1C1C1BAC9FFFFA8282828212828282128282821282828212828 -%28212828292277FD37FFA82829284D282821282828212828282128282821 -%28282821287DFD08FFCAC098C19EC198C19EC09FFFFFFF4C222128002821 -%280028212800282128002821280028282853FD37FF7D2828280028212800 -%28212800282128002821280028212821FD0AFFFD04C1C0C1C1C1C0C1C9FF -%FFA82128272828282728282827282828272828282728284D287EFD37FFA8 -%284DFD042827282828272828282728282827282828007EFD0AFFCA98C1C0 -%C19EC1C0C198C2FFFFFF5300280028212800282128002821280028212800 -%28282853FD37FF7E29282800282128002821280028212800282128002800 -%28A8FD0BFFC2C0C1C1C1C0C1C1C1BACFFFFFA22828282128282821282828 -%212828282128282821282277FD37FFA82228282821282828212828282128 -%282821282828212877FD0CFFC9C098C19EC198C19EC09FFFFFFF28222128 -%00282128002821280028212800282128002828A8A2A8A8A87EA8A8A87EA8 -%A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A8 -%7EA8A8A87EA8A8A87EA8A8A87EA953280028212800282128002821280028 -%21280028212821FD0EFFFD04C1C0C1C1C1C0C1C9FFFFFF28282728282827 -%282828272828282728282827FD04284D284D284D284D284D284D284D284D -%284D284D284D284D284D284D284D284D284D284D284D284D284D284D284D -%284D284D284D284D28282128282827282828272828282728282827282828 -%007EFD0EFFCF98C1C0C19EC1C0C198C1CFFFFF7D00280028212800282128 -%002821280028212800282128222928292829282928292829282928292829 -%282928292829282928292829282928292829282928292829282928292829 -%28292829222821280028212800282128002821280028212800280028FD10 -%FFC8BAC1C1C1C0C1C1C1BAC9FFFFFF4C2128212828282128282821282828 -%2128282821FD04284D284D284D284D284D284D284D284D284D284D284D28 -%4D284D284D284D284D284D284D284D284D284D284D284D284D284D282821 -%282828212828282128282821282828212828282128A8FD10FFCAC198C19E -%C198C19EC198CFFFFF7D2800280028212800282128002821280028212800 -%282128002828292829282928292829282928292829282928292829282928 -%292829282928292829282928292829282928292829212800280028212800 -%28212800282128002821280028212152FD12FFC9C1C1C1C0C1C1C1C0C1C1 -%FFFFFF53FD05282728282827282828272828282728282827FD04284D284D -%284D284D284D284D284D284D284D284D284D284D284D284D284D284D284D -%284D284D284D284D294DFD04282728282827282828272828282728282827 -%FD0428FD14FF9FC0C0C19EC1C0C19EC0C9FFFFFF28220028212800282128 -%00282128002821280028212800282128284D2829284D2829284D2829284D -%2829284D2829284D2829284D2829284D2829284D2829284D282928282128 -%0028212800282128002821280028212800282128002800A8FD15FFC0C1C1 -%C1C0C1C1C1C0C1CAFFFFA921282128282821282828212828282128282821 -%28282821FD04284D294D284D284D284D284D284D284D284D284D284D284D -%284D284D284D284D284D284D284D28282128282821282828212828282128 -%28282128282821282828007EFD16FFC998C19EC198C19EC198C1FFFFFF7E -%002800282128002821280028212800282128002821280028212800282829 -%28292829282928292829282928292829282928292829282928292829284D -%282800280028002821280028212800282128002821280028212800280053 -%FD18FFC9C0C1C0C1C1C1C0C1C0C8FFFFFF7D002828282728282827282828 -%27282828272828282728282827FD04284D294D2953294D2853294D285329 -%4D2853294D2853294D2853294D284D282821282828272828282728282827 -%282828272828282728282827282152FD1AFFC8BAC19EC1C0C19EC1BAC9FF -%FFFF53002821280028212800282128002821280028212800282128002821 -%2800FD04284D2829284D2829284D2829284D2829284D2829282928280028 -%21280028212800282128002821280028212800282128002821280028A8FD -%1AFFCFC1C0C1C0C1C1C1C0C1C0CFFFFFFF52002828282128282821282828 -%2128282821282828212828282128282821FD042829284D284D294D284D29 -%4D284D294D284D2828212828282128282821282828212828282128282821 -%2828282128282821282128A8FD1CFFCAC198C198C19EC198C19ECFFFFFA8 -%280028212800282128002821280028212800282128002821280028212800 -%280028002821280028222822282228002821280028002800282128002821 -%28002821280028212800282128002821280028212800287EFD1EFFCAC1C0 -%C1C1C1C0FD04C1FFFFFFA84C002827282828272828282728282827282828 -%272828282728282827282828272828282128282821282828212828282728 -%282827282828272828282728282827282828272828282728282827282828 -%2128A2FD20FFC9C098C1C0C19EC1C0C09EFFFFFFA8520028002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002800287DFD22FFC9C1C0C1C1C1C0FD04C1FFFFFFA95300 -%282128282821282828212828282128282821282828212828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828280028A8FD24FFC9C198C19EC198C19EC09E -%FFFFFFA85300280028212800282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%28212800282128002821280028212800280028A8FD26FFCAC1C0C1C0C1C1 -%C1C0C1C1CFFFFFFF7D002828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827282828272828282728282827280053FD29FFCAC1BAC19EC1 -%C0C19EC1C0CAFFFFFF7E2128212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128007DFD2CFFC8C0C1C0C1C1C1 -%C0C1C0C9FD04FF2828212821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%2828282128282821282828212828A8FD2EFFC998C098C19EC198C198C8CA -%FFFFFF532800280028212800282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%2821280028002128FD31FFCFFD04C1C0C1C1C1C0C8CFFFFFFFA853002828 -%282728282827282828272828282728282827282828272828282728282827 -%2828282728282827282828272828282728282827282828272800287EFD34 -%FFA0C0C0C19EC1C0C198C1C9FD04FF7E2722002800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282121007DA8FD36FFC9C1C0C1C0C1C1C1C0C1C1CF -%FD04FF532800282128282821282828212828282128282821282828212828 -%28212828282128282821282828212828282128282821282828002853A9FD -%39FFCAC99EC098C19EC198C098C9CAFFFFFFA87D21210028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002100537EFD3EFFC2C1C0C1C0C1C1C1C0C7C9FD05FF7D53 -%002821282828272828282728282827282828272828282728282827282828 -%272828282728282827282828002853A9FD41FFC9C8C0C098C1C0C198C0C1 -%CAFD04FFA8A8522800280028002821280028212800282128002821280028 -%21280028212800282128002821280028287EA8FD45FFCFC8C1BAC1C0C1C0 -%C1C0C8C9FD05FFA87E522821280028282821282828212828282128282821 -%28282821282828212821280028287EA8FD4AFFCAC99FC198C098C198C09F -%C9CAFD05FFA8A8534C002800210028002800280028002800280028002800 -%220022004C527EA8FD50FFCAC9C1C1C0C1C0C1C0C1C2CFFD08FFA87E5353 -%FD06280028212821FD042853537E7EFD58FFC9C9C1C198C0BAC098C1C2CA -%CAFD09FFA8A9A8A87E7E7DA27EA8A2CBA8FD60FFCFCFC8C8C1C1C0C0BAC1 -%C1C9CAFD78FFCACAA7C9C2C29FC1C1C8A0CACFFD40FFFF -%%EndData - -endstream endobj 61 0 obj <>stream -%AI12_CompressedDataxœì½×vúȳ0z®g-¿8ƒDNÆD 6Ø`œˆ`‚°$&]|Osžá»:wûÅNw+ %Âoïùï5ãõó`Ԫꮮ®ÔUÝÎv'XÑ* aŽ“ß..Ê Er4“q ¯׋ņåø•çÁëÀ! ¶*^§úBËÅ°3z•AÏBQø”€ï{ÊSfÆr3rå ¨%häux¼ðiwÆ-(ð¼:\ÌÖ,ÕÿcÆMû³!½ -‘3¯Ô²Br ]"‰„#žvD3ÌQ¼EMÈÕï$ËÎþ¦ Þh -¡-ћÕh¶š”è?3ŽsD G9b‰4|^Ÿ=P¬¶Q(žÄ¢°e(žHÅ@óh(™Äâàø‹Á+ôp³¤V\›¡‡˖éÍ°Gù/0¶[ržŽj± ÿp”äp®|‡ WhKl¸ C–ºÁ:Eþþ—²ÁE¨‘e3b¶ ØL#ó.í‰fæìšRï+Š -é C²³eh½ØLf«Ð€!Ñ(ßòþ¾ú)Üÿc:ã(@g¹xïC `²–$çÀ#hf‹×x¤_ÚÌ£»Ír@yL¤qô}´ÆýȂƒ±ÃÏèûdÿz ¾êP‚1 y¨•”ÔߢÏ[L02sjõá!3ô~ގ¦Ó¡DN^<“`ÚãxŠÿ&–LÂobÂK]j¹^A3™ˆ¦C`Ò0 üV|›‚qò ái -¤CÉ4îH/RQ w€)‡_ˆ/È3Ný>£þÈ8îè%­Èpžñbÿ[xô°YPÌãj§2¾KóT»¥GÔ¼!ƒ $"úÁåßB‹.ÉL(ð+½Øphy¥$,`fšä_dA\@ÒZS«.ÝC]ÄñP2ÿEx<’r¤ã1G$ÐÄ&H‡_F3Š#fa$<€ðŒ…‡†¡VÿÀ‰ð€¡Áʐ`qã‰TXlÒ뿘ÌhL-g«Ù -¼žŒ„ýgCr±¢¹ðô¯õ”Z…0,5 -/É!ì +˜¤0N,xsƹ?hvˆ6£™07e(Jú‹n8*¼Ü8ðT4Œ¾ Áü#hCj4[,H ,Gé С%É7 Ô£T ->üِ x~œ’‹1Cø’uàéH¸ˆø€*ò‹ŠÙ,òô-J£/„‹ÕpYèB¸Š^WÑËJUñzUzïšouÍ£¸V´¹–ÚT¹iø!`Zü -þ…–â…ߧ–ôÞr³àfëÅ_Ề<ñ(è‘ùQñò£ôÖ ÿ°;¥À-P¯«±a’GLŠã!o“4ÕՐ† -6ãè«uö– - kZ„5/ð‚¸ûz‚ ™&Âvt™ Õýk-*„¸zÒäçЊº[£g©~éýCoÖ׫1}ò›‡·ßzÔØh@]­Á7øXawäp:¡þ¦fÃ)°(ÖQ¤ßKm°öZœ¡üSð.úü ÿoçý -5†‡ €ÿ¶þMƀ¼[_,åþ^Ò£Í<­®~§ôšrnu<‘ÌÚŠö‚\‘Œ=1(á:®¡X!çÜìwǒHA£æ èˆ6 èk &k@5ôj£ÆfÖ@ñÈ*’›ë¨V‚^„ª Ìâf5Ù¢ßÞøÎ_˽˜±K ¸òé³Íž²®Z+¾Ë̆:º4½ ßn rXÏV,µÐôFü{ÿ(DRc=$pñüG (“À”bq= õ°4„ç㥋Ìà}[Ü5DS¥‡µ³¦þž‘ ]ŒÛ¯ý㐠<è*ÈN!`Ú¦óÉ §Žæ øľ²X­p²Ç³Õt´³¾œ„ÊŠ¥¸¿9  x…b¼@(^ÁÇ¡®Qª“`Ø|ŽÒJ©nj Ôú+ø돫¹zd"| H÷k Ï"ŽÒ⹓ߪÑj üÄÁO¢š¬¦À¿4ø?Åj ý+UË观~àÁÂŽþáDü—ˆ‚ÿGù¿ä'¿å>Ô:‚ZD‰úIq" ~D -üNƒßiéwQø”BŸŠèw üÿŸEx"¶Þñái¼„—ñ*è‰Db‘D$IGŠ‘r¤ -:G#ÑX4…qŠt´-E+€ x,‹Åâ±D,KÅÒ±ø©€ŸjxWq,ܶx4‹Çã‰x2žŠ§ãEÃ@,~’X -KcEðSÂÊX Ã#xã è<ãEЯ -^`‘h$Žú%÷* -zûàFË GêQô¦+óýàñ&ÀèL þ^-#`x ƒ$Ž‚ cª(e0ºcŒ4~’à'~ÀPàk'èÀºÅ¢œ$Лj¤~Ê"¾­·à{èMð£|S~¼ ~Jৈ~Òà'~’ðçä70ò?ü]‡€À"¾T*•L%RñT t9’ÂS`•j²’,'KÉb2L%“ÉD2žŒŽE’xK‰J¢œ(%Š‰t"•H&‰8 Q ÁpþÀì•x9^ŠÁÌ¥À &âq„/æ¸è—´4€;K&ãQèƒÉ$øG"ô”á@“ÀM+ƒßàˆ -ðÿ!üìtçQ³Ömÿˆ K,ì!¤M:ÁÅà”‚X:Çá7žHFbàC$™ŠEqøj€q 8LÑÁcA„ý+UdQ&Š*sk9j_ÀéI·EÛ¿¢í_Ñöß'ÚRÉPäè =¦x‹BGq0Çè<|€ÁÿG>5vd€,RiG xc´™qöh -Ž}'Š›Ó‚;e$HêõòÈRÕß©Uk42¦—ùˆÑžæ‡Œàí1fÅXe¦ƒ‚Y"RC”ÏÅ?D ôe½ê$\)ñ;³åz!K|ÌÑâ /¦qáŽg~³Ã¬áü¬¡ýn{=Šü«ƒ~Âÿ‡uP(`ýÿBEÔNW3ŽC{”ŽÌÞùWý«ŽþUG–ê(òOQGÑ_.üÿÇV1ö¿Š­—ö·ôŽ(ªþÇWñ?ƨŒý»Šÿ“Wñžýß´Šÿ§uñXH«Ɍ>öq áԆ’q,cœ‰d:‘Š¢X$‚"£žˆ‰†¿¸¿Ö”ðØãZ±ýßI†Í*<[eÛßÉÅFj ° á.§ÐNè «þó?žTÀ¡ìPiAç0ÈbƒLbÓÀ?b€ƒ*ÁÅí ðL‡âîÐhl TÙü˜Lq8Qps¢Ø#ŌúÙÖÊ°3Óÿ㌰»PÈün_,À¶ÿ †‡ã¢Xã?@üýRÍ°$4¸ ëÐ>§þw¬СZþw-evüÇ?€¿ÿ$9»˜ ÿ÷ˆqK‡"w% ‡ýÇlÄMmÍ»Ðò!½q,†—À-‡7¥à)¶Æ'6ýG P:âÅj€ÙÛ_ÿaIGØX ëO{¢è2,i£Òp<š–F“sü±$¶†·ýÒ?ƨ@Ò²Co˜!…Î(úgX@Ùý#ú±¤8rÌ­#t&}pgÎFBÌÄÏ)Zó¯c! ýç?(Àtzµ><{§Dÿùü"¼ ¥§1ôºÈP$³×³ ´Ë4™ŽãüÙI)…R‘”°Á6þÑh=èÌ"Õjñ [ò·$3»~=DYˆ«ÙŒSì´Â•ôG»ø |%ß$è$wáZté;ߝ6ÍÎàÐãˆ(»ÅC¡Ä# ìƒÀåAñåš-2܀&™Q…“›…ڍ'Mlƒ¨+’ZKÞ¨”.±&G#-¢%ÉÎeªðß±kšÓ¶#3QÖ$E©8ZÏB¢€¾Ò Ffªâµ£¸áhÇ 8˜ýMi¡¯qÜ!ržc¾¢‡szÃ9&|Õ¹YÛKÃcµº“1T­ÓŽ5¹¦;[nè¨6Í:‡MH‚Ž!<K#õaŽ!Wìšäš0³‘ƒ•ÇS§S†Ðлí¶†’V¿ecFŠ %âñhܸ)®ìƒe[e,Ë}@‡ÛIMÅX-ü]G&®šÊ6C±ó;åèRrèØr0[Ì8‘‘=o·3Ž˞L4^ü×ÿe7«ÉÇöºFÀ¤ø0:[Ë!ÜfaáÊÅ—Yá°n)v*1(b‡| ™¸²1Õ+­ ·\jñ&d»Mr5ِÊÑ¦× -NÆED -ѧ8‚ždÖ¢„„ šfzäjÆNÐ  ˜Š;RQHªB¾º [kr(«€XÜ´1A)tº”es8µ[­S†]¶- &0-9ÅüìƖpYˆæ Ú£© ©e[;$E Õ$ÀìʾE$Ác&ë_É!ñT:…›´UŒHiÈ%ìM®¸™˜—¤ÄÔÉtú±TJãs@ßøueÄƓk<‚9¢ßúI¿‚ –7$Vbžžªà}ؙ&äé«fÉbFÇc–’„“!ÓC­SN:'͕ùÚSi¨¨a[Vaԙ@…ãRÓ Ïô£Wª©ÅSI#FD„ÐÈ*]é ü tä&‹2X›­9`“Š FCÀ0‹Äb@±%„ú¼&yÒ,ò¸M2Àú„Gz¶+Ì:‚AeéŠ\¦j[](xp,<¹Aýe -eàñ©[>ŽªÙÓt6œnƒ”[UëÎf¸ ùüE™üF¶—34>çV†’<@@©J·¢‘DàKñ,I3 ž ¼¥lR¼ ÄÛà"ÏÊՕ2=À#8¢&=Tz„"Ô&€&úÔ×b?5~È{4‘=… qg×ÌíP‹?èC¹W„rO¹Ò@ËP÷—Ýÿ Òý[m[ïv 9]Õ¬+³xRöóø6xWˆ¨ñ"ºÍ™QXïð‚ð§¶åhç)Íü-.ƒfka{Ĕ1âIȜ…FbšÂÜÕ6c¡ç'A³lø»ÅHÙáz1üËDŒñ†«­h¶¼å‡Á(Á”-ȵ r Í°ž,ç!js£LÅ5lÆJ•–¼ŒÚóò]±Xì¼Vk ÅÎ(ªŽ·Ú‰5 Òï< õ‡ ½¶jíª°¬Úñ÷N0Vk…Ç ·Z$ÚM©< #•JÉFkN9.«ÆJ¥¤¯`stEŽ¦'6ZË=±ÑXÙ½•5^q¡ÑÂB"òÖ̘^™ŠC؎ΰћ- ÷wÊÌXM3h=šM:ZQR±snÐj¸åñ6ziemQXBŠýè3b§ä^?aèiQ‘ÎPl¸kZjš%õ´ÁŸë:NÅôð‚f £ÝƒC{}zM'[M  -*Sқ[¹!f²hº˜™IÐÆDIµŸkВ^Í$jÁšM?j1Úèû®æ ðÌXÊ5oVC3®á a‰s,4z‰\­¤¼}÷5³ô>†K¥­å)ÓÀW9ˆVí¡M;Þ=ם–$bÉ`$Á°Ø»×Â\«Pi;ꙣ tèT›RzÄ=©áò/3\ђ榖9o®ê­+¡rLlHvU{]1ª¿a© -=,Á?õù¢ø¦Ò•W†wâòÞ|{ö'µhS̘rJ"îüóñ.ñ5tË Ÿ=`š/À¿Õ„Á£"ÿ…2¶ÞRãâƒD;#ã_³môh[&+Һ͔þ£>m…ö:½::FBÐ]_úñZ>Íéäù€p|ü#Ú@„¾áèÅhG-ÀUD–•Ÿ·cʓ±.vþ‚?ÛQ"Åe•ÁcGŒÀdÆÚ¢/® “e 6…çÖ¬­Zâ°%º#°$£@m¥à¦¶¨§€cÍä•Ø– Yî‰À Z)Ø1£XP”#X)‘¢@R²H or ¨ÙÞ«2Ná'à!Å(o Â[<á.$ëX‚zŽ–CÈÑ£˜?¨Õ€èàK9ªJÐx.=uðpØõý¿°”{¶R"qÐ#þ;ˆ~ Ù_ô†’˥ãðöß!G)ä¸^UP„ôšd@ρ¢s,ÿëÿ§ð‚ÿ^Mþëÿ[p³ %ötˆýûj8G ø®lVj4̘ãBæl&²@?dfk+A¯š¿ ‹\f"Þp-2fN¯ØúšÀÄNS÷GՍ’R}X7ubSx«äµ¹g'6í2³¥²Ç¤@dYÕvo›²C¥k)ï–kbØ/>½ <æ/“ g’µéÅL -gèÛàbooé=œ2ô(ç?V|Ú¶º3£¸`›(VL[&×|šàŒ²Cc¡ÿ׫!„Ò1ƒ0xÑz÷X׎‘D -T`ô€Çÿ ™yÉʤßÊþ/ÅVîý†Tl8eöóõ}!•pßs¶ô¦»1“òÖÌæ¡åO€ÛšžÝ¨¬X1ӑÂÞÊýD×´äp+¬0-í¤Šîã@Iʍg;˜}†6CÊ>a5u -¾Q’Þ”ßvŸr»©iöt Ï»ð¬î½ª–›g’G²Ø×Bj’©—Z$b ]u¨¶Å?1[ Å`ºlˆÄ␡$Ç_{¼‘d¥g>PHØéN3¼¥NÄ.Ä-YދÝQؕڊ¨^ÐNi“hsr¬ä´¾¤3ՊrB ʧ±EˆÊÞø­Y -¹½]͆±=ÍÓ¬«¨r°CHe`^v§›å`Eά 1¥Ñn -²tÐ4IÐÔ^ã÷¾¡¦pðl²ëžÿëÎöιÂl -iÏMÓ¾¡Ò|ûÉN‹­‰úDí",uù= ý -Á+«²ä£Šžpi&zÁÅNùú:¯PpDèiìªåzóçž.ÝYò9puµ‚¥S[N3“•ó†p<îòŒ ±ç‰Çz5q–)<Öò·±«LóÝ}[`6Ã$QÜ¦.ðXì ÃØÊweÀÎ Ùϐ¯ ¬Ùۈ„šB¶édÄV7\iR¿or1ªSž]懕PÈ=ÙÂÕ½„É -q‘I¾Ö¸Ê÷G)ö —t“-^w¸©?Ÿ8Û•ØùSé{á~h*cìf  í<™'{÷oïÅn9Ô3ƪl—ù(äæÄG!ƖþJàbCxj£1@ƒèE|y¯Œ?ž’¥Eañœ—¦\yš|ÅUùrU†x󧐻r?ñ€@§Ùòçä“Ÿ\?•ëѵ³L}Ÿ;Á³߉gr´hÒßÿ°:Œß{ÊÓX?›+^D]þÒ]àË_(»‰2µñå{7gÓìpHÎ᧙¿:nNyÔ8&“Ììü+3û¼•Wî ãß›×€·½™FšD¶÷Q(®†î¥ÿò6N.ß/gÉd˜G‹Ìð÷Ï3¸rX¹a{€rI7•|Šb£Ì¬&Á$㷗ž`€*-’í%?†—æE¡|;{ªÒqxˆWåú-q–O–éO®7zËDgn~u†”OøÎà´¼%ž÷+Hª|iîM퍚þqv[ “9áô¿2M>øDPP€œ^ÇÐþ<‘>垪 ¾}9Pýâ¡E^"׀ƒŸ1>_ D*W“KÐÓe.;ú¾ûD³)õÀk•â"Ъt#uáCîî¹|€­¨ú.î,UúˆÜ@Æ\ů‰ïa±[ùöWÆáÆO•$Ýç¥Äàñ>ݾx~,¶Ê¥veܙý~>2€¦{éöy‚¾&F¯Õ>îï•bÏÅQù~ê—g߉pv¼¼˜å±4Ì%“#ZF˜êü,ÅVÓ× *ÞQƒ§ŽHk~ @àÖ¡{ÿUüᇔO¤ÈB¶Ë»7Üf{pâ*(!NÆ3ãAuÀ -j•a’wõut1‰|å®*ñ^ˆ">È}åˆ -à_À_¢ÓŸÚùRW9¹âdðìs5e7ˆNp4JRÝ4kÅþ Žø&ç_g¿ϸ*b¹îkÄ{þ™ã{¢¦Hb󐦏kí-Oóª¿"d~ëà…F¦SAF-€ÕµtÁy˓i•Mf‡ÅäkäI;íú¢§~Z«ƒ´Þ´¤çT£ л·#?6ùt¥Ô|™ëõ5U´«½$Ç`ñÀ«uj±Ûmöáڄ·½È•økğ¯}Á#ß䡁q ÇDµO–ÁVɞ^ïÖJøkí+}s£ei±êÑÅîôùÀhø%ëj€¾‹®`ò­ø0žºÁk®RÂߜ -¢Ó[»ë Ð_zʋÄjï¹.Jt€¡ñэ…Éå3”÷_•AlúT|¼²êv®âC÷m‘ú^sHºÉz¢‘Ð7X®4÷¬gD®†{¢þõÁG*Ét‹BtãØ`Sõ\þ<ɚGó2´‡KN@©ÎVƒÔ—?{͎üžÅKøfñVì|ݔ…§éâW!W/‡@“¯MW Ýô‹M7&?E¡Lß, Ì0ãâ§L¹P­ÜU«¼J&äv3¼Âž5~JX±›—Ë4ÿ‰à½zŸHñü@4è%ôõ ÷ áÃóœW¼Äÿ‰“ñOˆF†‹Ðð¯ÁÞt[ø…—QÍwEl^úñv¥‚–»Wõä-¯|êù„ø—Uq˜°; -P£F®ØŠ9U¶ú&÷œ&üÓ[ê゙ߊžJDC¸ìˆ^®Hý®•ãß¼™¿•€po¢%ŒZ& Âó꾃h@dI9f|]U¶—gD"O>‰#Ôs®à‘hž ;Íê֔¾:›"ã©»(°€Ý¾ ÝQÒ|‹à|ïƒ4ßÆm¹ šiÎåÑÄúS¤µ)íòàé ±ö"x' ‰8k"Ôԉ7q¥yÑ­T‘å¾!n‘  ”VS3’n!GݺTý‰ˆ;ËSX$+BÝ5*KõºUp‰ôìbsÄtäuË£Ñkª$­Š®zßit¶IU¾Ä)(¤€Äž¶—‘†µM 5ÑhÀâ•Z¯—VÌ+£‘‰ä,vEQ @ƒ(-r+˜Ðwµ­é+v{QpS]à_Œ#J½”.®€Vž4‰¯Û— áô…¦5ȤD³"xÐ;©2/<=NʳÏ~¡:œÿ¸x©°]â\Û؍RÚ8þ'7ÊW™½W¼­Ù¾ö¾ËÊTåçag…žÛ“.O7¯•F㧤R©OV•V¡óÉ €3¶Ä·Ðø‘Ë’¹Ãý\ð‹ åüÓð©÷ 8À½uuè†K‰@$¨pYñÒ`R¡|պ”ëÞlÒ2aÁê{OµÃUZ,À/†ŽuzAÐc=Às ¼¤Ã·ïEر p⯲G=‚¢Ý="d@íêíìA«ŽwØUž÷ç\öŒR‹Sæáñb.˜cÏ7%d9«I%€R{3¼9x|‡FãÍ Nû râE7®þF)ἃÒ}áÍWº¿øà ŽÝÔ𤩔.âþ|¢ª\'I åúWuÈнE³[l=6ۃeªíŒ‘/Ó4ŸHø¤uP+-“7Ï!·Š®R­Jm~AuvŸƒa•!øàjëÓA:íÏÆîÔp›¾Q΍°;‹‚¼;ùhðáÃU+Rxt¦7¹ë£½æ1‹ Cäu~Vž¾;3 Óý¾È!0àP£4¿õï§=Ž‰£Í@ä³4\:ågÛc™ÑrÁ©ºQy艑«¾‡¤å–$>?|gDuµùŠ\¤—)ž¹çá7€&•6oJ÷íB;â}YÞ ]ݼ\ïï:=èê‹ž¾£GÐ.,9ß ÚXsZÔØŘ£hô°ŽZdK¢À0ÓG„ÌÜ>]! Yì*ûË26N—¯À[ëR½۔0<ðÈ:UóðöYLgAéA7öšÁÓj ÀœÞÔ Ÿ7h€èzŽU`´êê ú^ç7ZÈ >W…§{¿+3õwf@!¦¿»+dõV¥¬Ü0¾/ ÓRtÚYÍóM¥•¬‚V·³Œ#‰¢KP‰ªe •ôöJŽÊñOy%ë-cEOà2^(=.ÏØY¢2¾[¬úSFðT!UQÜ{'Pæâ2Žâµrcšdð”óŽð¾´¹bãIú²q7ªŒ–é€È…žÓÊØ}…UÊõ3ž¤Aڙñ^g=]Æ3ԗ‹HUo‡K‹ÐàvV²-’¹{L}TûŸo|0eâ,ü”>=’ -›JÜdpâü#} uФ:¿ÎԖ ’ßo(t ¨ðæpÕíº#+s€FnšÌE«Tõ³5è‹% eÏØ[ú±÷b̓¾Òð)ÅÛþèY!wõèª\/go¥xï9T¼÷µ'Ň®Ÿ¨]Ô>’¥9>bõ—'oÀð -æ2\¹~kú ò€ZYëèu?Õuwˆþ™ë¥2$+-RçÊÇë‘MÁ¶˜\Ìẙ±éÓìø¼3UšMÖP«lÕïKŒ•úÎ׺_ú,ôÎ9NBÝÓ½Á©ÚÅýÙúí]n"*iU«ž/y7̶4€²Ô§wŽây™»IvV Я8“q¼Ø‰µ%çsÃvß¼°Q3orœ±@·ÜNy›ä*ñ\+ߕ{W’Á'ð¿§Â8߀Iýófºð£0¶ÀB€ÂOk´)£1n…y…ÚH$.‰Ÿz®²hÆeY˜ËÏ3geÜù¢Ë³Óó8àïX«¸Ê_Ó:Sæ¯E×éÛq‡ë¦•©6 -ÙÒZi– }Ëy -L0½ºPL~Œî*ãôW¸úJq. IÓߌ» lÏ—"=mù4üm1,Œ¾y—»ºuu­`£üe"ªÇ%éy±Ú-&ÓȞìWÆ÷lƒBgëH­•‹¢\˜<ÔÏ/ñëb:4e€—ÚSÍp ÇÊÛrO ”\mq»ô瓵záç5û"M’Уe•…[÷€G¾]…Þ¸»QÏ'n6•ÐÃ(XÈÜ}Ï–;øÕMœ«²°%$­ÛŸb¤YZe¨ÚXè܋ð”úüÉ-ôEê­M¥þɲ•À€¨æ¼ç€#_~JËV>¾Í4÷§@£Í_Kó,î/v ¸né›.üAl¼T,Åköã«vA8æ쓫Œi&¤Ã·i G'^¸éôL”ÇWÑíeô‘„1ሚ^Äùó÷ ‹ÄçÓJ-A»#à#ÂÃÞ++ÁÍžëÑt@ß¡´x®P¹OèHlüZõy¼©8“}–Rí­¼ÞøÕ¼Ë¯Ï”‹R´ŽÀ§QXc¯‰üc¬ZŒ÷PdàZ4¨ êç'éBNÓSR§DsUÆWu0äÕ¡—»˜ìÜ`^ÚEº8Þÿ }#…@؆áF6ÉÜú£oÅn×å´µd͸ Q-i?ãÀrX䊸¬õ…U‡/L¼R¨¯ÄÆÚz ž¡j/…ÚÖD&‡ÿòæUöêÞЦW“ø(-’…säi­ ¸ã‘ôm èxÈÇ9F«2Vq[÷b¥Åbý¥õóÕzí{.gƒê˹•F¶2Á?(.H -ÁM$¬ø@7¹J õ3 ¨ùF깬oWuxšø€œÖY8¢šz¨kLò§þÐDîtv¼t¹€ƒÿP›H«àÈïjHiÿF24²OUËí4ü êé±]þ¬ÇÆ9@M„LQ?r ÂË3´d k¡uL XË?å»jú‹W0yö5-ËJ4¤KϽ÷º/0ªžer‚¹+¶"ú‹pÌÄ¢|žT‹©ËÁ ú á¹ öÊøã’ÍR׌úÁ«DÿY -æåՐڝ›bj°ž(”¿¯÷d4–o(F+ˆi_%¬xCŠÔ ÎIüàé°Ä;Q˜ˆ6ݑ5'sŒˆ½„[ÀFO`¤än‹@ÌÍÄ·Ò0hu¸9íSÁÐ)dh`*&4Lôӊ*Åæ£Q¢÷øÑK%¯Êõòômt -½°ÓBî>úYi4r§Ò~¶öµ,Aºª…ìÇ#0G“÷~h D?C ô_ç@ ×ŇEüI%’Éçë}>­4n¢ÅÎYi­']Åä‚ök²Û߬@»òeeOœæ›÷”ù_¸I¾"G ¦”d•$¦D %È4Vð9Ú.ÿe!yZAI 'ådgDçjëóÏ ì‚4™ÑhØÍDH_»´âÝÚóëó -Ì W’ã|“»ÏÁ†øúØLafˆ9OÁU ۚsŒ#ь>ø¦þÑY`5˜°’¨SüŒ,‘VT䃨àö€]û¹4|¹"î~£~úTì>&»ˆ| ÓóÂw ~ù¤ -sBJ=µÆØ"–»[+©ˆ^%w®[ñÍÂÃ\à¥Q*¦×pF\3M¨45Ô'H0ýªÀÆ* ‹­FîçN^ 1"ª>ݟ]A½eÉ'ú»®~Ó,MϪŸÏ(üÄOðE§ýWâ±õö-›&ñnœðrYº:Lxã¥[¯w–\]ßû51lÞ#¸¶À-á\}þZ ¾¤&¥ØS4¨`Ùg`RìVX_â§A^]Ú¼¯®F(Añ]f™ùeåcör†ØMð=€ûtÐÒFô¾<-Œ‚•ëEùIc`‘û÷3ÂÓ(¥Ší×-_c (ÅÄ º©ñê [ËbR…úÚõŠt‹Á”×4 -¿ œ"Yö‹ñ´*ùõ(®®œmâËó‹â½rãcŠ -ÀûŸÙëVý!‘y~€ÑP„`;†äÆ 6ÆŸ`xçƒüRöC"söa+*žîû«·þ4X€þXK]¶:Ì×´G×ú<ýX};OOžб: è‡>‹Ý鐃]ü?ù©227r´Py «„H±¦$“qÖ4S䟊wÝWˆ`f&䀂g3Ð|Cí¡hJúG{uÈß©Û͂›­TqëL¦í:Å]š[a¾"} ¬ÂëcÁåWú)‰þ|ü+é¿ê ÂXØô_M¹(ü‰åî3QéÁ½ô =ÈF¯º\ ˜.µyýìᒄÎG^zñ_>$¦NO8ƒÅè@㠆Ý7NÏùëÀyAáE§ºt;WãP´™vúó5§+ÆFÏïþØUë+Õ¿n®`ïR¼]J1¥MÕÛ|ª4®ñie -³ñzú«[ƒ¢²úT¢ -av’Ë|´oӕ×ÊÕ4{…§B%ïÒÕ)\/*Õ·/?‰Ófw–½÷Ö‡‚'p|îu÷ǘ~×áh.œþè͈8ðüóEÜåúb÷Áñs#Œ/»™ôb•3*p]eޙT±ž ;`\½Tål´©V®|xöµq»È]„Ê`pZ1¸rÐ÷c#̈́Þl€°4e°¿çÛ­š,ÃdÙ.óþ¸Æ±ŽG9>UfS׋|Òs6rሮ-(ó±9€Om„™Ž°·âàRµXê'û þ¬-Àë/5Öwæãöý^k-ùÏ\†d¬ªÑ0ŸçwMC¬‰Y£v¡5çô0,~Áècmãp[(vÉøô†Ëº·A¬ñ©‡t¿Tõ±Æ^ž1óÝÊXùŒañ)1Jœñ~§‡#ºO¬‰³‹v§X4 -—'V;{}Ôîi-Xp_BϺSûþM&¬m·[Cáh–[ŒVÀ‘h—©§ö…ùˆÜÜA¬Þí© ½Å.oË~€5Fo1ÔgŽ0Ä -ÐÄ­SNF¬ÆJ2Ÿ®‹žVb˜X¹Q]¬lñ#*c…s£B\Ño/´>ÖÜ©‡u']ŒVfó…_x=WozX‘]–®æ †›8;ïô˜¬>ÖØËF|ÔtÇzJ°Ù‹y¸×AX!Ñ4 U lî ±º©I¡e0Vg˜a×ísˆÕ§Á -а©{Âw•,8oâäZ‹µ™,½X_‚ ÖD§9ïñX«ïsB5Ö×Ö|«ÆVÄišáÖØäüì>¡‹õÖÇÌ ±æýrQ+@¿y±N†bõ†Ëž6‚ïàt±vúWYC¬wïõ› -·S·†ûVÆzîç”>ÖæÙ¦3ŒRºX{MœÖà -%4DüX ×D~k`½u´`€õÊÛû|ú*êb}ºøV¤Ö¶‡Ûï¹'¬ï1ì£Õõêc½kM¾Ÿ+9Ÿ«¨¤±.toHäeÛïz6ÂJ`ýûŸœ>ÖVÁ˼YÈкí~XSuçÓÖ䱒§\M½x®˜ÍÓ[ bõËX!^BµÎ²ÞÏͲ°^2Z¬_¾‡së<íÓhv{GX#®ÆbØÉ ÊˆƒÛ²¢r¾Ÿ%€µÀnÉÅw:Íc½òT -;‹DËÍcýà27+BÃÙûèÏÖ/o Öð¶\|ăɦë`%6Z¬ÌìÊ+`Í܇Ôc­?–.\9ހª-¢WÍ¦j¸gol|ðֆX±-p—v>s÷×kdKV3ÅÁêÑÍÉOUJšaJ)÷ËcóýF÷õ éÌa×ï~Îà©;“lûLï)§p^”Î+°Á6SÖ«D’8ÇáSÿöÓéZÔmzOWL²õQó ­×€ãRxþ5©ÿôÚå,´žª÷O¹lãú挕Ÿj,›öÑôûãý׉þ]!¿q•¡axh#WZûµÖ óm@øu…] sã‘$Ô}Œ”˹í²ÒýV:A>”Pð)¿öŒºZð—ÂSªr! *oMÀ .JУ· -î+}°U”‡!‡¦òùê…â“eÉ×õîa?aVªØJ³Üiì&~q~AŽPù!BÇZÒ*þü ZWÐPAúÚc™ê_.h¯o|ÖÝbÍû·LèOR)NªqqyÂ77քG¿”®»Î¯ðFSô=õ)Œý"Ÿ+²¤7‡Ñ«^÷Ö|‘„Ü -|ûLšx)?¬ï9”¢ƒü4Ö:«Ýèe̵ž‚ç%mÁö†ôÂÆîŸgCþ’™KÁÐÆüEãä¹»nµ‚ÌHZ ~øX+¨6`5¤W΍%½4Rè%°ÒJ¡ê{y­Ä ŽmÇù¬âÕ¶&ÁˆêÓ°Öp ƚþò¬¾·8½IÝA¢>½)Cµ[ä«B?»¡^žJ9®»<½†ƒ‹žgMóÁ¡å©ßöàÞÏL‡híâגQO §QdÿÑ@?ÉãòºÐ¸ôyþ%°Vk íN~ӝ²í!UB*v—Ö£ŠÝ1ªr© ù–’ÓªÍûÏÁ´ÁÆÏ«a -t÷½Ä<‰¡ý&ÐÊ¡7#3@”FIkà Bk yÚ´1jíêâÐêþ’„ÔʀGÕÿK˜/\ooï*îSԄ·¡ÍfþD"Š~ë0yz‹2HxJû/yµ¦é[æÇ o‘ŸHé5}£?Ì@É£±Îä–‰¦™–yj­™ðú#cªôŒ¥z´¯AÚšj˚Ü2%3<ªÉ"VRûNò<µ±aT ùhZ»J3É û§9½àÆ}’v`xŸvK6óìõizf¢= òúµV&5ÙÖÓ·6ú·¹G šF+[ÏÞ¢u3O1’ö:jä&«PòÜì -ÍÊ-Qâ…4•yq(Ѭ ¾†©»‡M-Ýv'š Ø-Rz~ ª½Û:\2U–³l6Ë¢SÓ_.o!D¶®þb˜Ôå™0”i²õ½m@CR;ì‡,ÏI=ò±)5vp§c´!§qWöÝi£î˜K ÙN3'P­½´o0MžÕ“;N•Ê ÔôêëОXɳžVg}Ëêܕ,¨'z@&šžÿ8ˆzuuVé¹ÛÍy„[£J«s­ÊžÊ  ÷e®’§Âí†A -lY6×Юí Iô -tÔJ_Ìè²Û­­>ٍ¥Áõ}}°(·"¨Ý^5рæêB Û\7ÖQZ ;‚„.ª6†ñÑÌ)u `ÙìHílšA1ÞaG€öYŠÛPÞ$Ëæ0@VŠPð¤­u!‚¦ÞhÜA­"a£ ¨×:+­% -¿;d{B#l ´ã¨ÔYi×ÈþN¡!5»6¨©Œr¸œÏ¼–w£ö(çS'@W"­µ»¾s¬4øŒëÀ -æ¹mg‚-`£[ŒU®øåÀch¹+ÒÞ*Vù3vRm—6õtÿ1 UÛvþºùNaÛmœ¿nƒT2N¶Ë|¶SÙ|6ëý†}2Ü)4Ø}„º+ÖE|öG²\7v ¯­!ÒéӉíBL‹°™IŸ€ØQÛлÔïí$vÐh^Ì¡ ªy~‰°e3Å䳺çŸìIËí_‚§‡NmצóX–Ýí”_bØ=Ò¬?_bXËʍ²,»³—_ÂÇ:Mhc²E¼ƒ—"0ôÚf¡˜>4u‚plk~µYAðYª¦Af›ò‹<}6Nš}O›Î1!×½ÚÜÊöKh’0¬¨Ü9ÐF çÑ$@\°hSÇýÛ•Q U(¨SFö/î1>x@Ug¯í3·1vª)4;]a9;ªÉkΰþp°ã2®‘ËsW7}RšÙv2ïA·Œ3ï¥é3Cyÿfž>·RöçPõÔ«È·»PkÖ59 -Pb¸Û šÅA v:&lEÔÌ«tvæV&ÿAD³¨ØّhÆ;)ûmëÀ†] ©ãÅIF“Du"”`ÿ˜Ô ˧ä|iÙ°*¢4Àï­Mê–þ`çYÈjîJw‘ëäÜZûƒ[aÐè$‹HéåÔµŒíNôC–.®<Ýd±.Ù۞%mñ¤®ÝX1vԌËþlHkŠïT’Cî6+ØÓÓwFöL]³ÜOtϳ9³kaF>ØAHma^ëUê*‚):¦qmÖj—}é¨c‹Z=kd\–µ•œ´·údQe«ŠrX‘ŠóØ]·Ú'5§n¹C*M É4óHÉþ5zrŸ„¹1+¬Û)zcÐ'TJÂN£G"•QôæD*ö³O*‹ò<½>œ2r…ß°šèMô<½6ϕ7ŽÞh8 oà¸Ñ‹Þl ›^Åòf§è L1*Âîã7Æ)#öëálDoN¬Î‚õp¶ó‘ ‡t¢S$»Gô–™EoN¤“ú,ic•àoV¤²l $ª¨ éÂF6¤O”•^Vi:v éuã(’W¸y -‚®ç ŸÑÕØ3¤78”¥kžAlgp—^\*ºŒuÝ8üØ38ëpCÒôä3›%~yY’ÉaUâwXÂ<¯Ö`‰ŸqœÎ²˜UM ½°©CÛK¨Ïܚ YðG7ßK™ ioÇt¯Ê¼mo ç»2Ï:íú(•y¶8íðÊïØô87^¦™´áýšüÎÒÌV¹ÝJw»êð"Ù÷ŸcÉhG,’}ÿ9N‘,~?4ڄªÄ(F —–€v¢úQÈ⸛ÝÁŽR$k}еdC[‘ƒŠÉQ°–ùK‚©®ZO`k=f<“a;µW¨Ë3X‡åm©5;¹BêaÚ)Ê;±uÚõÁEyšå™ñØYž»åæ{Ú.Ê}O!v¬¢BÙbgâdëøõ„†meðš$CÀŠÃ>¦¦˜¨ [º–ø±¯ol¦» -á¢{þ*=]®V](Ÿ¿“•W¢×h -a®Ô¬2Ÿ—ýËneŽ—KᛧÊuÓ©\ù;ÝKú˟ŸjmÐÎ]&žß‰Qĝ?­ðÊ E‰qèÞvZêîJ:£K茺ìî¬÷ÒVF»T¥hùLùíŨìîÙ¬ØÞXˆbE—‘`MœÁ›È?Œ®Ð³*ö[G±Â›È ±Â›È'rE؉öžB¯IÙ];Q`Uס¡Û¹%¬Ú+ôxƒè ÎkRìwJ!C¬ÑÈÉóºUì—8»ˆÝU¾ŒÊîúfewç C¬PtÖîÏ^ †›ª_´f·¤Ö -ß5z2֓­b?¬Z}$ÔS{Ψ ~Š7¾Ë°­vÑ2¦)%1hŠ}ù2Eíüš«ÊÊŒú%&…í¶±['*S6Kõ·ÊïÝ6niã^õ.SÅêžK.*iüÒÆYÔöî@Û>1Ý<£Ë¸¸¨l‘¹ªÙ?3Œî½ÞvŸšM‚ÿ1®×ӛ¾Âv[§¶íPœ© ·]4fq^º:wÐän7e¶¶~îà¾7ëŽPar˜Ý…guъÕ…à}ÅF®¶ÍòSÚÎ+v o•£mÝÐV×è%@Üʧr -SاWÕ·OÌÆ¢°OÏK0Ûí]اWÕgfCïYاç´ðâ£ödB»°O}N§ó©°Ï<Ü}´Â>½ª>„>FaŸžï¿Ÿ’6-ìÓÛçáÍÁ£ömÏ+‰n•?raŸÉ.î1 û,*VŽUØ·Ã]‡ö© ÉWõo¯î]ا§œÄ8ô ûôú¤Í³9BaŸ^UŸ¸<÷´\õ -ûôæð„?Ì䘅}z ”›ÅG*ìÓ«ê3¨X9¤°ï ¢Ù/ì³C´#öéUõíC4‹Â>½ª¾m;íàÂ>=›ôD¯êû°Â>½ª>’>FaŸÞf‹ä{¯°o ÀË©ËÊÅÝ£°Oo®Í7Vö*ìÓ«ê³Ò7{ö™øžÇ,ìӐÃNAÙ>…}zC:ќœdd¯Ânà#J2íÊSa´—° »Ã°PM¤óTZ7jïê+s¹±mr|‹Ÿ“ã·øI¤rÙ09ì‘Êò`Nâò4!•¥µaƒ„öT8Ë;{mNŸP0Nð7¹r϶6’ú¤Ÿ2rmÃ*°Û'ä…î"lLHEY,c¥°y0r™tN—]Þ¨5„Nb“²‹|øÁêþ¿ý‹ç„ËÿÌòlìÚë6.ÿ;Ù¾cÅ` -ºüOŠr˜Þÿg¿Ó çb·|è½/ÿÓìßÜÿ·[©”Îåû!÷¸üÏ8©¼ÿoz)u  ±qÿߞ$Ñ«GÿÙágt­Ç«ñ¸ÊÜÛ*È5-n÷ÖÀø2ž«nÖ ÃüuÂ¥eMŸqŸýìîÆÁ×}ۙÆz 0–õŽ& C¶Ëã m)ÈUW< -ƵC$©iKšÚË풦öRÖ|ÂÜX(?#ÍëæBvfÓ*%¾sÔT«ÎñR­:vS­,2©ÛK[YV6 -1½ï¤ (²)kÈ6Ùԁf..h票åDQì·G¥½šá!‰Ñi³ÚWçøeðÝ¥±â>ÙíxC­l^;£k÷$‘h[Ùè -efHÍo -–+˜œ:©ëlš•P+ΫMÙßù-÷=í a –™]o»0¦GÛ5/ŒÒy4Ўu¹c–K(‘ìÜÖuK6 -1³¾C½%`É6Yì6ŸØ*.—O`Þ³;‚ƒ©‹:v¼ŒH³P4%nC›Ì·UBáþ±.Œ±¹w»÷Ï03E¼úï%M¨ -ïhëÑäÞ¿LõCîý;Ñbn]ý·Ç2ÒIÚØÇÅÝãÞ?µ&_ýw踶j£v»¬o·{ÿDac³vc¯{ÿlßs_¢¡$ÓvÎ14~¨¾¶>÷D{Š¢ýj_òtpf×Q5¦š¡Ú÷ý•úªw£ödü²‘ÑPí+Ë4èðj_Åôl»ÝªïŸÌ«ïõ -©`€Øl=uÖãóîa0ƒ<8zã“pv-¤ê3h4;ÔRYUËx÷'Šsm¦îh;{÷&ËóÙV|ÛN!"ÚNµT¦%™!C?_Ï÷4ª¥r_öŒÅ´¹Å¨~€Ý²Éö,Ær(ˆ´§Æh,‡,¯J·e1¾È£drRw[zžêÈ" …3ïM*Ó,ü&ý¹)‡l²Û8U €JØ«ú¶Sw«=êÙp7ÊÖ‚û]†©É¹Ewë2ÌMr։i9¶™í&/c,LôƒzÅr7 -Î Ã\á|Á`÷*ùRy%^º•×*S(Öݛr)4,—KáÌí¬EEt±P÷NˆE©Ë·Î׋7U »ºFî͸2/uŸi+JU™çÏ[ºõ€ 5ÝEÎI•j U5r£°!VŒè–îÕþ¦FNY­¦Åúevù_0­À*•ªA¢ñWÓeü¬4\m\ìyÚÌ\Mwê1¬‘c6_xHÌOÓ+Îóç²KãkøL®Œ½¼éa=A§Z!"/Ë1‚îv ±ºšÔtd„•BX•;ê’Àûgc¬Õ»·š!…U÷: -XÑòßoM-X£~ôI`÷ŒÍvY¹ l šÆޛ¶@Ƽm¾ 8› ý”q›…V™šÅ— zêO/;SvØ¿üۇäµ]ô.R¦×ºY¥Øhƒ)ÆeQ?†}RzÒvºµ[Š´Wv¢½˜¦rH▦OrÐINƒÛ3îÔv;mLŸrcŘTv· ·Oäò¸·LÊãô2AO~Û>²ÕWÑ;候d Uìæ†ÚèӖ·v@å¥I˜l§Ù¬K4>¢g×uc’V໳í©ð­‘['ÂEhÇð4>«†Û ;Dn9ùn‹hÕ£m‚V±M÷~„xÚgõ‡ÞYGËXiªï7$[iˆÆª$ñàÓu?ѵn6ëÖ,½XÝhf7ž¦IEDhíäiÓxÔ; ›Ads4OZ/Œ¼_ ™Å©~:ÏnuÁCԌêBÁ>xoæSG`øó+T 5ë“!ÜBݝ:;uië$ EûyŠ;ÎQ zç§ReeÔñ1\¹þƸ[”áQ 6LuÍ}kñ¿K]¢fÕ»’úç Ø®K´,¦PÍ!¿G`H¯^ð8Á3tϲðÈ6õt÷éżΝ¡Yޔ¼Ñ,/9ډh–µIö‡©{ÍÑÞD‹vl«ŠY³Y¼GI¢]³Q[³cIâöòÔ¯GÔ.ÏK·;¡_(ïF)hc¿$Ñn=¢RìQ’h·Ñ`oÍnI¢ÝzDC‡Ý^I¢ Uc’ý`»$Ñn=¢ ޝ";]4¸µ½º[I¢ÝzÄ­tµÅÂ÷hk\£Êú²Â“C.©³Yá‰éÕaG»¬p+çö×\V(eÛٕû]V¨#Ó~Åe…Šê¯¼¬P97¿ð²BQIÿâË -5™÷¿ê²BãðìV3öndW?Ú9ÕJºíP•wȅ‡JVݾípŸl;Ý ÍCÕÆDÛñÂC‘…7ÜGHí½9Ê©V6/<´<Õê8éT+« m×{vá¡jYlÝvhÀл_x(ׁéÑ_ãxìááeû\x¨ÃŠÛu`ö¹ðÐ|p'–÷{Ú¼ðмðä—Ÿ @ÓÛåàýÚJ†=üÂüém‡r¶Ýš/c•uȅ‡æšOÏ÷ÜëÂíÒÕm‡êœÛò…‡Ö{6R³¬/<´—v}ð…‡yÓÛOv¿§pŸª`m0eï Ío;ÜÊèÚ÷ÂCótµ‹ûl_xh¾#ç@x᡹/Ç+‚#\x(wÌî…N{]xh¾Ï#Jƒ/<4Oñæ÷¤pá¡ùm‡'¿Ǽ(›ßv¨´:ºðpG)°ï…‡*vÛºíðä·½ï)Ü弑Ó{ -,¹ðK·^J"\xhä -ß+7<üÂCóZh‡_xh~òˆÚñ8àÂCUá×VÎlj¶hiß mÊ´C/<4Ձ=äßãÂCsƒÿd‡{ -÷;ÿG›D~؅‡J(Û·®ZÛõÂCÓ+ -‘Õo,lv¼ðÐ<Íe¦ãÂC#&ão;<\¦ š?R’…Uu°Õ…‡æƏ&ûaÿ Õ׉ìÔ½ðЊþnÔA±{«¼Í ËèÒ¹ðpŸR})u腇[…WªÛe4^x(­GÝÛ2í° ͓¨ä<›/<4÷î•D;èÂCuÇl.ÏÝ/<<Ì÷´}á¡ùm‡hÝ«ðÊø¶Ã£õ÷ºðP¬ïÒ·OÕ«]xh^¤k¬¤w¼ðмŒ -ÏcœÂ•7½íP„ÜÿÂÃ}-›/<4¿Y—G¸ðÐv^çašë -)¤ªUÍXhËvkÆL:Í« ƒcY•–;zžž‡5aÓ½P‹|ù;$ӈ¾6¦y¹TÀ³T¦,#1-݅‚êÄ:¬”:Ð¥qXaešÓóæÝ8ƒa÷m(ÚLŸ‹Mš,ÃDØ¢Ó7aîÃÁ‹Œ+út/Æ~vz¦7¤»N¥Ò¾«·ó×Sç5çu‰‡ðéËg"Мwztñb¾ê4ÝÔtLtš?ýä|Ԝæ_wÓÕI§ïÞë?½¾nŒ;ÓûÙâ±¾Ýôú5¯§ß/û½ß/ñïÖ²íώ×þ×Ç\tžÿ0…UâÎùt×ð£áêŽuó:÷¹.žÛç©ì¢tÑîÔnÜ_ëËXÚu›ðKW:‚©z¯“M×÷ *óñì)qt2³0¬(}ª¦Å¨°²r}],”ì†l !J[’§º~WIŒ«¤;ã¢#±êSé§Ws¾J±ž¶üéø>U«…ñ#VBµÀÅáýWSlWj¢±FJ/þ*¿¾Ñ¹tùړnÏ üJàbCxê××xõ3“+ÏÈ0'hUÎÒXøyŒôë£&‚PïŸÃ$‹ |¨ÐKz½z< ¡ÍQΟ¹‘«„…ã1/ú“'Zßdüè°°~ÀŸ… ÿçKЧèy.÷Eô½o lüY˜²M'zÞð(úÀV_ÒŸüE ÊéY@ùÒ#>’„”&—cé¦x<¿žŠî¼h¬x­yJ4Ò×~EûÚgh(=*¬3ü.,hˆø‹¦–x=ÑLÀý€†Î n|Å%Ýd‹§§¾˜Ñ¾&m|€†T M#º)$œã&­0 -æçüùˆ£7€t]ràÏ·hø¶3‚w»~þ,wŸÝZ"ÑùÒ Jˆ¿D4_)>ñ¬„Éœ+3Y¹‰\5ö-‹sÁ€ª=ß+¼¨åÅ¥ÝLƒ.®Ê¼Gp,â’Að¼7©ûtªFÜŒªW®G—N$]À¸žq¢¹MÁGä‰xý3¿_Ș4t áÒ´o]“€—aä‚OÏðQ|мö‚?ÞpÞT>#ùôuÌ׀ŒŠŸF1C˜ßùDjüùޝ¿aâ§O\ê΀Ïèjæ…ÍGQùYäÓí£…ùºý¹F3_&Üˆ–RÑT–úôŽËÓÑ*-Rg)…Ö’ª‡Å“úø¡¡_¼ó"OÀ=‡$¬CÄ2à»O ¯áøDââ§QDn'¬oî;&w zçz„Ï›Ï&{ÁÓ[âëö"aÔÕg“ØMÍóõ‘ðW{Ïõbã;Sè}µÑ¨Ù.Kš:£ÉLÑÑÔ¾bã L¿ŸÞgÕ¸}®;ƒ©@ßé^wið)Øp‹QÊé_ĚP£÷œÀPn:}?g …I|@ðË3ìBrT\Ø·+a[”—•îˎ±¢9p¡b‚è|ª’¼°£È>ôHê$ çOõªógt¦è®H%øæRó2 ru=ˆ¬#ð]9½ªg>*~‰§µÆ‰°¾¿Æĕæu©r °p>æ’äX‚OFà¾| ÄÔÄè u4ýð¬£FŽ@’†+79 ™i> Ý·(-NW° -O+Vá,¡Ù‡²5$Œ°VðC¾¹E÷o ª£Faº-&°V­ÆâƒÆ• N!~ Nyȼ°¹ã' -|^m†<Ïçãï¬lܪ¡J«7êòáþMx'*Ø ËÅÀ=d –I`Ôü:ƒ“º:ü­,ü‹^lØJÔõõ•¯'*È[ºœ¹ZxÖ&0>¡×&ŽíÒ4ö³<ЬF¼W…$ÖȐ—‘¯»¯Žÿ*âÅpÿ¼P½sG5 PZÂK2-~u› © ,Åx¦ùʎr5(¤ðz!݄Qlì!.#Þ·`m $ ‹‚&:¯A™¶ß›Òk1Ð1~‚²§YŒT -ΈL"Éñ€æ›lîÃۙ;ÂòPÇPóg÷0„"Þ:}ºÌ#®Ö$ZÆ05-?Euü›|¼Ï°Œp=|¹Â"À&{¹+ÖX˜hwDåÊ¿)肝èl·¯»Ò×íS9]M Uæ3ó™}m®òµEï^^¬Çß°B˜]OýðŒ• ÖL󡐩R³ÒÜ㹯ÖÛ3P?Åp±r½œ±De—o)V™•ùÀA¿é:§þüÆåÜ5Ô7óÊ{¥V»œ»•èÞ˜  A†å’lÈ£hˆxjIø)éËv n•arÆVý³×i±Û{bvFF;~­ Bnc7@ý©„B¹'¢Ï}à…ìÍüÞÕžðWÙ¼kï9ߛÓ|vk󩿑+âæςÎ}¹]A=ä…8æ=Oa[Y•ZíÂQ‰Ç¿ŠÝì·™ƒo‰€ÝsZÈ]!iQþ ‰Ž–gþ±ï«Ún=‚#)°/Í9w(V/.œëÄ̇ŽÐì0ú]†®`7E¹Â¯d7PŒþ=­2óz?òÖ÷®2õ«lÈé’©P،»ël•ù´â‹Áç9xÖn w^úº‹tˆôYÔàe˜€3àürÃ`BOဢT/ª}é‡^Ê¿ö«ïďtÈ«µ -åáb -=÷3Üô*Ðuæ…èêgÅÖ$×´‰WÆ÷ì -³ÎwE˜‡Ë×3d3D‹Œ³¢µj!?Ç^%¿ªóÂê'üºððb×ÆO/è€9VäIëù¾2v­Ï €üÃþXWŒÚ¬PäCïoRÚ@ ÷=ðvu@cfR–Ü;Í´!Á¡Z;Àšü¥ÔîjUâ´#YQ…(l~¥! P4»ËÛ#:ìÎ¥tÞP”tžçݨݨ¯ÅocÔÒfñZÆéû\¬¥åæÙ¢z,ð€Ð?a­O§ÜæNïÝk*“üU‚ZãŽÿÓç>ËA‚âÐM¨SðAªŸü“pzswp³Ʋ±_¡o¢:ìûˆ_+ŸV#{¥öį ÔBÌÆTò÷¨B¯qy –b×YýJ´¦¶Uíÿ€¾ÑÓv»¢¶0 ¦HcFY¿$pc¥o€”ïW¶£';]Íi‘aßWȾOû•ÐÃS_®DZ¬ø½µUî“sû+xNL»>d‰Ûà9È»¬³=Œ ¨=ËAœ¶‹`Ùi‘Ù‘i¶gÚx‘Ài»,2€Æb¡xMƒIÑÕ$™ùhߦ‹õD•Ÿ+•¾îÎîПéjjÓGkñ Þ©>•:ÍB˜»jëñÇPå•èuÀŸ‘qѕLål”À ï5„#¦]1¢ñ«ölX[¦{û¹³{Òû[ØbT}[s'GÈî>fÐVÿá‘[[Œ¯OÓ1·tr §ÙÛ«9µO;ª§ñK#·fþ&ž6OûöŠ§¹gð&ý,¤â£I#ƒü›#ø2E¢?_øˆâ‚üÖ[éhÇCµØÑ'”ëÉl¾šI!Jtèvew·§ÁŠ¯wPûÙ]qW¾÷b÷ñûÓÖJCŸˆ¾|ʼ¾çЮ pxüqgÛäø%³o¹MtœÙ×±:Å싩½¿xö¥xÚ¯}4á(©ï—Î>šz€æϾ” ùkgߦ¾9töÑԟˆl†ÿêìH…âk>möCìG®5AS°Uà)f$@š{•-HéW?ã’Ѭ¾¨ÉòÙlP¡^]ÃTCÑUô“󰌶 ¯†<3ÑK¢}Ê¡‹W‡å‚·²ùñ¤_¢2 ЕM΋ҹäi ] S -+àÄs —«ä$òËâ›ð,ÿ« ÚtxÈä3ˆßõ~Äï^˜ð¬µòËùþÑ«Þ]Cµ´3xßåÊÈiðÆ+‘=¼ðš°ô™Pu²x¼SÎ4Jqæk<.#~©”ÃWxò‘âÒÆC¨Ÿ|Q‰çêm¡r£øYEóM¶æÂEM‘ ./OtËL÷=…ÝyQßô䕉öì¤ÃUþN/¦ôò&*i„Ø38xÇÉÓXM¾ïK¤¾–è𩨰ÉE&÷^•DÐ\º6O­E™€¢ -:\äœ_"ba™°;sÅ·¥ç— ®2óbž¾ 5‚¬ÂÝfhZx9cJ„KN\§à{òtpÆØ7—f¸Ê´9¿KކD„úGèôûQ$B(( ‘ù—wÙw‹„Ìà ¥„±à›òhˆ,`;÷îÞ u’yû^+C€ÎwØî@c{ |Yú^Ԕ¢ðNÑŠ :q"TzY ä1މµ4àºþÿí=i[9ÒßyþC'Ãach·Ô­>HHÀ6ׄ„c8Ç`‡Îؙù²¿ý­R©[êÃÆ6Ìî>ïîd7±Ë-©T*Õ¥Rõ¢óœ>Øìô÷RÿMŽŠ ï>Ç[Uåç -6=̺ñzæI.é7¯Õ½RÅ഑h³úÅ.æ’4«¦8-Ë­«çÞܳöíêݼpڈY›X¬ºçL“ÃœÈÚÜÊóК¿ÁzqÚ {íý6‰î»*K:ÀsOïÁÞ{kôqúeòiÖê‡Äéy¥’AB­79$îØ ¬•A"¥¤ÙÙD0÷,þ>›[°‹¨ à ,ÄÎüúH(Î~L^#›K_ß^ ç^y÷•æAã±µºQÿükô‹r±Åb|¯ý¥/û™ÉÂÒ*J•Oò`%}º aüg%qJqï#қxùnRy·ò0u¡´äbaL)ºXhúcèº\¢üûÏt˜ ÂKçÛ3NõpË6<㽅ùúÒÞԛ›Å7Îï´ovî$•ÄÕi{J¾è¹y•./Ž"6u?qš!ÞkBß7¾ögþ¥ë1¼»L]§Üߗ– VuÊ\hÒu9â«pkӆsŒ«O× üá‚+™u„¬µzºóí£÷‡êþ^ë羟ZŸ~ƒvɜœ¼g—º£f\P‹×FŒg ЖXår½îN-oF ØîVyyÛÝ ¨ÁôÂÁ}vhþõv•îÂ&%w@Ál/òews«òüTwjóZªÄ×HÍUۃË9É1½d|¨ÁñíiP'_0ÐÅm7à^Õ®UÑu^'™‚E›`„à-›ýîFo¹(á­ä÷ìÌv‚x å}jYÑ¥;íN¶§å_g"Ì0±\ý4Åk÷«ª\Jf†k8t‡P¦®ÕèƒËÝäŒãc©%ݞ{+•tL›êoßxùzs š/ÙÕï·AÝ­MM‡zJx–p êcSU©“{,UdÞn|õ~«zqØ^æå«/oÎå -žI»KG[ø€­O,òfÛߔk.à -i60*¬H³íà=Dz‹÷žµ.Û^"üPýþÍ[à_»;«È ¹ñ¾9Q—/ʚŒ°nÁŒÓ9õ‡ã_+²PI1+•Ëü£ì™˜é2<ô»ʽ—ܧýb”hM\ŸÐ%ðé…CAWŽkMY/`N‰ !~MªÀ®N -žË Ç)Ç·øÚLrÛXÞ?žU_붼l'}T5Y€Âwµø’°WÒ÷~åíaF_ Ö¿™Å&Þ-ÎêÌ ï©[Ä°ƒ¾,Æ?l8Æõb_³:/‹N”ͻ˫‹M>sèÕ]øà Ðp¯K7‹é÷ê–Cå&æ'ñNú¦,7_*nÅ·˜?UhSÀÅÝýi.‘š œJk£°0jTtT?9•÷¥F—­mɯê¦òÙÑ1KnäWW*IÕZ^öç“"»¶¹G¯v&—g£ò©GR‚ÔÏv‘^ Ø­>»#ìÅ1÷~õ—û·•½7]ÿݞ‡ùKÁçv‰ÂØ壝Wqí…c]2૎òòcû2žæ¾QÄdÔòá>U፣uF<ß8ÛãTƒ¾\íqõéñø Iþår«©>ñs\Ë}A}4±Ë#[¾·”7¯6jÛ|ÜV-$7֏$ hŒ¾¾iÿH~ó’MqjÌæëþ«zr±]»²Ïg–>ž}Ûh|Xµ£*͂5‘d¥U5›)£¢r¢wA®wâQ?W©–Àßóè²òԛc¡>5ZÉs®zî÷ë% CmÕw?¯4®^Ÿ-mïžL/ŸÎ-î£z}‹— ãýðpçk ãn"uѧB²6Ï­‡Ð¿‚d藨‡Ð¿‚Üž/Q¡1i ¼D=„Ja1„¥¾ „àV("nU·¯:Ý­îÅùō5;>öf|¬º´ÎØÞMûv¥Ûéìvþ|hܞ=^wn¬y«º´S__E£svÛîX³*?0¢¾Ä%ÊHq{ВkoÑêåÚ/Û ­Æ7çð]6`ún÷'&>¯Éë5gö$¦Sª@ií~¿R`Xò¹«£Òښù¥ÑéÖ—+¿mìg¶ ´»£¯»«X¥`y¿ÖÙ^¬ÞŸ¿•)d£Æûïo޳Ю•¯§vêŸ×¯ËÇ_+-i åëonD½=†¤‰Ln(¨F2³»äãäê¯fˋ œÜã¹¹%w çj”Vëo+`¢ãsͅl…X9>Ç\ÀV@uò\sa[‡Ù\(MÀ×=.‹0™E…À5’uš”ýq}NŸ7bQCÚ27lªæDþÊÇmw:ƒ¿Úøõ€ú…}scÓ–'첪Nt¸.W†©³7jTð9Óégʕ4ÕU·«EýIu2j—{Ngüµþ=øp·´»t³O¥ŸjÇ3_¡ÉR8;HÜ®›0ÙWs‘O7f -OTÀètÛ¦âNË'2}j½þ ->i…¸vä®É'`¨·ëò“ªªuz.¨š™F—{6ô±Ê`åBùò›9è|©DŸZõ…¸ŠS‹UœjG{ïµízyîÅÊìHÆÄû½•µÊå³%«¸ñ¤N&¨u“)Ž«²œºe3ôiùä× -}208w%,.'g¢ã]¯]5¾MÞc ®Å·ï¼8„óY YRÉÅä”4þž®•w—x•aâänêˆË¸q©{ -oÂxI½¦jˆ­WpîUeõçÕp²_ïïщl6 íå…C˜Nhgbq¶s§žjýD}ØÖö°V Å^ó!1H¦ñM£?ñäCBke2f¾Mÿ¬(ÿþð֎Óhøôâ«Ïªò]ݞ•ïk—…5D5¤¼pÉó¢GàN-¼aI3 ²°³ÜÖ§@Eio?PaÊ«¨ïžz©¼ -±öËOÿñ·8¯âëd¶ƒÇӏ?uþÚSGü×\ -ÈÂáu’²—O94oL‰Û•lîú±î`'I¦Kh´ÜÄ+Íi^¾®h´—Øê—s£==͞Ãó¦:(iöìCŒ>{¤¤yÓYkìœÆÞäˆVÖ\è¬ìÖ|?g’â´Ô¼rœV@öϬìÃiƒrkYsÚPû6E´Aaω˜œ–¢f†ÓúMDsÚðHqZ¹§ LÍÁ”ô«éÆÉ'Õ¿ÿ’îc&#‡Fb&¥¤{£?HA©¤ûáa²ç(l1“RÒ£ ±™g(i钃×Z¥3ÀÔ ¾ã}­#¬zt„~öÚ«Ù­ò,¥€ßÚ6„=¢µáéV›Ñ©•f3á|¼½Ð;6{~þN–«ÈÖåk;.Æzýà8%»*¿Ê´õéGgFk–U$R»Úòë|i®BU“å× OõñmoþAJ‰u#Xh†IR~³< ÖsÿÙ𩍘ɻúœ“4ýçõªy"ðæ|)þaKWÇ@— -/­.ÌG˜ÆÐàI?C£O ›aDÌI…¼ëÏ÷?á‡m&oªèªófHµù÷U§Ù¨Âó_ÕyʤR…ç_¦Ë¢ªó0Œ.<ÿ÷U«³cáù¿¯ê¼É§_Õù$#$¢zéªóEáΣ{œ>üžVÂKExËãÉKãAt)Z\V⃕/÷$µ.^œJ¤Ö},glrÔvYEúElmâÇ»ä`%9?F¿;tº‚¯ÈÁÒÔ¶ŒôbZÛ¶¼pôñ²ñ6OJZyx'oXeÞ­A‘ÀúäBúÝ¢ -%EibI0õN»ºŸ|šâLµ«‹ÃR¦Å“ܬ˜‡Ÿ*?oŽ²$VïæQmêHdG…€$ӝkq¿æôO8ñ=7xŽÙ\¾i›g˜žÐNçáñN>"šµÎùÅÍFë¯Nw|ŒYôǁ?øwYŒ‡¾„nœŽ•äÓ+[x¦Y]ê>4.Î.noZÝ¿¬y ;ømco½aÍ[ôtž~c•'§ ÃOey|ÚDL›ãcŽµ„ü1>öÿYKw܂¿ìÈ áZð!~ÀWpîDø¹,ðá ¸ðÂ\ü¢-ì‡æƒü…ß~…O?ö‡Åë7ëø³cµÇáÇíñ1Á\;ay,°}—…Öµt#ÇöYÄ,/bvè‹ÀrýÐ8 ,Ï÷ìÐsC 9óÜÀ97€v½êž ›Å0ϳ}Ïõ­¤Ï÷m?ëᶋ±J€z:qWù BÃo½ÖÒ±ªë7´xÖÙíõÝíãMÛºÿÞºëX×·íNv%‘Î\ÑY£(˜ÍB—!)½Ðµ]\ÄèE¡í†ø˜ëÛÌç&„Ptin -èF‘ÍD‰»rCÏvB‡kC°¡çÛ.w\ã1lJÇ Œ®bHjĘ w¥‘ÏÍÖN‘K{77­ëNÛ:ï¶Ú˜DÀEY±!’iŽ©D` îyC~°9ã°ó¬Úùø؜c;øŸkùàɅ0šAòƒÇ#5•xr×qCöC…¾Í#·WK[sïp¶v¦åð„ÍÏdÐÚPƒ"I9PRxBù 9§VëŃ%f‹À "¿lUwº7çV©V[:±¶}ûÐÂgÇ­,9${)r˜Õx‘ãqa»²ÎÔñ}Éü̇M³N€t¹‡ôö€Ã=d{à7Ç÷Âmø$!ŽãÃOܱ=`«ŽCø¶ç¸®nÓú,ä) p|;ŒPŽ˜@¾—ú¾Çôоw5zaÜՓ\Vz-^ –dç÷Õæ.Äî_w‘–KӀyvä‚^R%R1nG1©\îD¶‹BÄvòD%ñ8ì~lb‘x<ˆÒO Dæy«G&j9¢9pO2‡ íöz ‘ÜZA¿íñ1ß*•­ƒ}µG¤*†]ma"& -,yØæú÷Š&øƒâ†NtÒV“nÀ"ZÌè¹8Jj®>€œŠ`–¦ó¤F%îC 5D ìIOÀÖ¤V@ÂÕÂíiJxŽ¢WxÆcŽ‡ÂÖЃç#É41$ÆÆ@èQ­9WRÜEÕë‡Æˆ JÄ`')Ù.!êxœ¢ëÄg‚6{L 79FH9E-µ¾'Ù,KÔ~ªý?†»rrx+Ç- û™H$#K" -€ùp_¢¨r9L ¾yRT‘dó)ø1)i—Ç@µõI¨aSϕ&A6—êÞ%#Á­ŒäHµž@ٚ‹PƒÍåXL:ÑÎV6ghŽ€¾Œààx93 q",l1ÐGi½*Qs}n̸i€u¼ c Æ{6 ÀpEh£E1€»°Ç>ƒ†H3Øðµ!år x(ø vÀ ª’dÑLU"—WZä -¨ÔiJm"œy$’GI„RÞs=+¯5êĝÌC¦4õ 2¨p<£mÂÄIÿ9Üê},J`)èd, –òrKxK‰4KA°È'éÕÔG–òA>â´úðTñ¨’§Â4O 2*S<åý«y -=Ð'£˜#Ë O!}N€ ,A+€˜ $š3°4LJ-Ç•à ’Q஡8Ša’#`æMÁéð{t÷9,úø#.px-‚ùq–…ápÌÃsTp0ÂôZà–ô‰w´W‹d!¡WC¬y0K'畠‹„}ÆDÎAs¶6ܘš„`¿DÿZ¾y¾iö¨”g#ѝ±“‰¤3~«˜á>\Çöt¦ÝŒ<Ifظü€±ˆÍh `ê;X<~d,"ek‡q3WBÀ bŽ -tDò'~ª›˜ÅÀ"t7^,Dá…!˜F(‚Q.cˆD%8X¶¸a1JàFjƨUs‚14ëXoX¬¤wâÄÆ HÒÞ%BÔ À¹ÄµrÀ­’šˆP¤¯”)=€š£º‘ ^(æôäz…*‚́c$ÚÒ@n»>s5æ PLǓ#_Š%¨çV)3¤^£—bŠdݐ¦ˆ&‰¤íÈô#_¸9 fÇA¡ûQ$'Î"´\ÇBbùÚÿha°´©iÇÀÔÄSx  ¨B ‡JRp½üÈ(½€>Ï0J1ÐD ˜/¾È¥ÆÆéáGHe¬fLp“r©íoP.¿/·ÒÒ#"ž–„rQY:f¢†9(›GO‰+éԻ҆S¢ŽÜ|Cj€–™&åªÑ‹’¼y\ë/FÐ:Q¬B2ŸŸÐFý·™ÇÞJ(àà߆$xD>˜‡¡@ÿÌñÑÉ¢õgx("á`7p:èw+èj_ٙôÎÎÈã‘@™ÈÕ}4‡@Öx“ÎœÏl‡…~8£èA(¤«¯Ïv.I7×Gg¬Nè†+”BRz`}ùh?Ƽp)iɅ 0*@`»¡(½ºh’iÇqâȎx,å}šˆlã ãÊ'2Q˜ü% -Cø'b"¡ :`l  äe©°éûÝÇ -OÅ1t}%¾  #ÙT ’aj°¹@¡;– 0Îq,÷ˆe¹Œ - -¸à¸Q Á7€E'”\å -E­cYžPn@XÀŠEŒP͵ðˆ4ò"þÙ¢éNèÀ_°òn:¬€åŒ•>̟œ,Ÿ]]ÜÝwöo»—÷w0ÖÉÉMçÁ¾¾=ï¶î/®í»«GÀÂ>í¶nÚ0»““nëæ7Àåþääâìö¦ùÇ÷‹‡ŽÝº(㛆&×oήÛDvzÏuÞ·oÝuªçñ±*Š,ß´=ž¶(K*ãíÜtš¼ÉœfÿԖ^6öP£©$oÀÁbx–ªAÿlÉž¬=Ù,L1ÀæÈÀ–$ GL“–£&ÊL6{:`jÚæÙ V”àQ3aýsa é¨Ù0¸N#æÃL61\ùüœ˜ÉæÈY1qÓÑòbôÀCgÆ 3p67F1ÜËäÇTͦVuóöa»svÛm¨Èu¿¨nwZW¿µ`„?ña«T_Z_Uë¸ûí¶{M¿ÅBÉ"5Ü\ZP\í<üuÕijÒ²‹v -å˜YøÌ¢3„5b*ù¦$Ä°þD‘)‰ø¢iŒƒÚ×éÈ,…ˆ Ná0ÄN®6g0 æ0_`+»˜C»™1:HÄaл‡.xE‚aîl.‹´h 󢶈]ã9p'Y$ŠC•/”ôñ¨ÎM rðuðAhz膠ÌĜÜ7O:g&?°,¾ÂhhƁÞ-ÈT_$s—¡â’–N(²”ːmR£¯xîwb“0á#± -±La -®oAGJだ-¹HÞæR¹HÉ\JgÓ¹CO3¦¸Ðâ04ŒÅfòIV¡PA,3¨¢¨vÌ)Ia.-55m’ú&O½˜j/ ¤bùDÂê)y¸ ÒðLð‰xHãÑRñÈ#&ãAÓQÓñßòHòŒ”’÷\xa±‘Rz± Éú0Ex1ϔÛFGÉÃ+Bq£¯ë1b6žé€ ™—ø#e䥐árò†8“•7€ҏkŸò9z’ûßîn<Å Ox…I†±U—I3$ðH‰†´ s©†)Ù°¯»>bÂaÏ]ótÊ¡fޑ’{n›§Ó‡9“xø_»mžæ‘§6NQ&%Z}#æRÆ®¢›s Ģì·AFÌ©ÌîÁ³*upi”¼ÊÌî"³r¨qÓ¹•ÿ½[ã)îxbg¼á÷˜þ+sHKÜ¡ q.4öñ3¤*,?|iÏ!‹ÔÄÐHÌ*B\û_…™ –Ïå‚`3ñÓ ØÈþDh>'4 Õê;ŸJÀ‘2CSÃèìLl&‚¦¦Û,pAŽhŠÂ搅y¢%S4·Ž¹¡ÍUü–^#ÛÓ\x#íÐ)Š„m.ç“ÀÃf}šØù”)p£‚ÜOl$zÆ œÉÿ̀ãdO“Kz€ÓåxØLÐÔ^5)Z˜ ªV²0›3^2– œftªN²9*ž:|Vgˆ6¯SÍHJø(#ñ³ßŸÐ½$~Ÿs÷3Âç:/Ô´ Òà”`ɉ¡œ•Wy™–]“§ïÌó:à:Ñ*)¡µT^µäÕO_=¥ÕYFáe5c–ÅSŒY¬¼žž±>æOk}Ýa¼‹3 ȑ®^”ÝÜ=ÀQí»?²ƒŸN,¤Ò“iì3*©‡ë¡k‹ôò‹âÞ˪è¡!{èÓ6Ho¥öâè§9'§YDëÆbpšsr}ÿM蛪ñ:­ìÒ³‡jì¡H‹ÕnoôcÏêé'Cx›Ú<}ÉZ“%­2µ%cªå¼ñ‘˜,†Rd¿¤‡Z§qÎiÿD/d̈́Œ‘¶425m€ä†¾ çœF¿NCMş³ ÒFD½ÉÑÃ@ÉYKÄ° ²&FÎ`…4 -Ÿµ±ÉXâyc=kÕ×Ó¼˜62C?Wáåܕþ*£Øiëáâ»B/ºïŸ6ë˜UZºÁ†é³ùÆ"¬ò•$Ð⫋ðFÉ]ԕnëš%ÐÎÃm÷/„#S ôˆÊ€™Íy($EYÒ:l#Ã<Ó#QÍ{€d1±ƒŠœ²U­ßÞ|»¸Â}l=|'¹UÅi.Ý<\´®.Z÷HÕ4 ‡·Šs5А®f4&˟˜µeEÐ`e(F:*ƒ¦òEû§oJéoR?¦É§73IǓ͗I;†ù½xâqóïJ=žlþ3¡ŽN?Ìiú÷¥ Eê -«ÒIvØîÉÂû‡ÙËOå§:þ þdÁ¾Bñk<Àÿ§­©²,æ܍×Ô5€^ ܨ™’pnn|Ì|–Ó³òÉìs““ˆæn·ÔÕy~ßúGÇjÝÜà;wð“uÞí܃¡Ñ±î¿ßþl”4˜œ\ÞZû?›ÖZò -endstream endobj 5 0 obj <> endobj 25 0 obj <> endobj 37 0 obj [/View/Design] endobj 38 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 45 0 obj [44 0 R] endobj 62 0 obj <> endobj xref -0 63 -0000000004 65535 f -0000000016 00000 n -0000000173 00000 n -0000026899 00000 n -0000000006 00000 f -0000086484 00000 n -0000000008 00000 f -0000026950 00000 n -0000000009 00000 f -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000014 00000 f -0000000015 00000 f -0000000016 00000 f -0000000017 00000 f -0000000020 00000 f -0000086741 00000 n -0000086772 00000 n -0000000021 00000 f -0000000022 00000 f -0000000023 00000 f -0000000024 00000 f -0000000000 00000 f -0000086554 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 -0000086625 00000 n -0000086656 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000029537 00000 n -0000086857 00000 n -0000027307 00000 n -0000029837 00000 n -0000029724 00000 n -0000029037 00000 n -0000028218 00000 n -0000028475 00000 n -0000028523 00000 n -0000029183 00000 n -0000029297 00000 n -0000029417 00000 n -0000029608 00000 n -0000029639 00000 n -0000029911 00000 n -0000030085 00000 n -0000031263 00000 n -0000054430 00000 n -0000086882 00000 n -trailer -<<91CEEB81984C404395810B8A574978A5>]>> -startxref -87017 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai b/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai deleted file mode 100644 index c7480ad5..00000000 --- a/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai +++ /dev/null @@ -1,716 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - xmp.did:AD1F418A7C94E91197BDD9C8DFBF9319 - uuid:bddc7d4e-65c4-4f22-90c9-2f47cc2b6270 - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - proof:pdf - - xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - proof:pdf - - - - - saved - xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T03:03:20+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:AD1F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T04:28:29+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - - EmbedByReference - - K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai - - - - - - - application/pdf - - - Eclipse_with_icon_3 - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T04:28:31+02:00 - 2019-06-22T04:28:31+02:00 - 2019-06-22T04:28:31+02:00 - - - - 256 - 240 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqp3FzbW0RluJUhiHV5GCj7zkMmSMBciAPNlCEpGoiyxzUfzC0G1JWAveSD/fYolf9ZqfgDmm1 HtBp4bRuZ8uXzLtMPY2afOojzY7efmXq0hItbeK3U9C1ZGH0/Cv/AAuafN7SZpfRER+38fJ2eLsP GPqJP2LLWf8AMDWqNDLOkLdJRSBKexAWv0VyGKfaGp3BlXf9I/R9jLJHRYOYF931FOLXyBfS0fVd VlkPVo4mY/8ADvX/AIjmyxdg5Jb5ckj7v1n9Tg5O14DbHAD3/qH60fJ5d8kaLCJ7/wBCFO899KAp p/xkIT8M2WHsTTR5Q4j57/scLJ2pnn/FXu2Sa6/OP8ntFqg12yUDalkjTjb/AJhkkGbTFouH6YiP wpwp5JS+ok+9JLr/AJye/KyH+7mvLnp/dWzD/k4Y8yBpZsEHJ/zlZ+WyuqraarID1dYIKD58p1P3 DD+Un5Krxf8AOUn5YO3FhqEQp9p7dSP+FkY4Pys1Tmw/5yD/ACkvCFGuC3c/s3EFxH/wxj4f8NkT p5jorLtI83+VNZIXSdZsr9z+xb3EUj/SqsWGVGBHMKm+RV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KobUNSsdPgM95MsMfYsdyfBR1J+WUZ9Tjwx4pmg24cE8hqIssH1n8yZ3LRaVF6S9P rEoBf5qn2R9Nc5fWe0cjthFeZ5/L+13+m7EA3yG/IfrYfeX97ey+rdzvPJ4uSafLw+jOdzZ55Tcy ZHzd3iwwxiogAJxofkrV9U4ysv1W0O/rSDcj/ITqf1ZsdD2Nmz7n0w7z+gOFq+1MWLb6pdwZedI8 l+U7I6hqtxDCkf2ry+dVFadEDUWvgAK51ui7Fw4uQ4pd53ed1PaebLtfCO4PNvN3/OVflewL2/lq xl1eYbC6mrb2/wAwCDK/yKr8830NITz2de8f8y/85BfmhrjOo1T9F2zdINOX0KfKWrTf8PmTHTwH RLz68vr29na4vbiS5uG+1NM7SOfmzEnLwKVQxV2KuxV2KuxVsEg1HXFWWeXvzX/MTy+UGma7dJCn S3mf6xDTwEc3NR9AyuWGMuYV6z5T/wCcs72MpD5q0hZ4+jXmnnhIB4mGQlWPydflmNPR9xV7d5P/ ADL8k+bowdD1OKa4pyayc+lcrTrWJ6MQPFaj3zFnilHmEMnytXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYqxHzJ5+tbIva6bxubobNL1jQ/R9o/hnPdo9uwxXHF6p9/Qfrd1ouyJZPVk9MftP6nnl9qF7 f3BuLyZppW/aY9B4AdAPYZx+fUTyy4pmy9Liwwxx4Yigu07TL3UblbaziMsp3NOgHix6AYdPpp5p cMBZRmzwxR4pGg9C0jyhouhWrajq8sTvApklnmIWCELuT8VBt/M34Z2nZ3YePFRn65/YPc8vrO1p 5do+mP2l5Z+Yv/OUdjaGXT/JUK3k4qratcKRAp6VhjNGenZmoPZhnUY9Le8nUvnjzD5o8w+Y783+ uX81/dGtHmaoUHfiiCiovsoAzNjARFBKV5JXYq7FXYq7FXYq7FXYq7FXYq7FVSCeaCZJoJGimjIa OVCVZWG4KsNwRir2T8v/APnJrzVojRWfmVTrmmCi+uSFvYx4iQ0Evyfc/wAwzFyaUHlsr6X8o+d/ LPm7Tvr+g3qXUQoJovsyxMf2ZYz8Sn8D2zBnjMTRQnmQV2KuxV2KuxV2KuxV2KuxV2KrJpooYmlm cRxIOTuxoAB3JORnMRBJNAMoxMjQ3LzbzV54n1AvZ6eWhstw8nR5R/Bfbv38M4rtTtuWW4Y9od/U /sep7P7KGP1T3n937WJZz7uU48u+Wr3WrjjF+7tkP764IqF9h4t7Zsez+zZ6mVDaI5n8dXB1uuhg jvvLoGW+Z/Nnkv8ALPy/696/Bnr9XtUo11dSAdht07saKv3DPQND2fDFHgxj3n9byOo1M80uKRfK P5k/m95q89XbC8lNppCNW20mFj6S06NIdjK/+U30AZvMWEQ97QwbLVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVTLy/wCY9c8u6nHqei3kljexfZliPUVqVdTVXU03VgQcjKIkKKvq38o/z+0fzf6O ka0E03zGQFRa0t7o/wDFJJ+F/wDis/QT21+bTmO45IeuZjK7FXYq7FXYq7FXYq7FVk00UETzTOEi jBZ3bYADck5GcxEGRNAMoxMjQ5l5b5t82zaxMbe3Jj06M/CvQyEftN/AZwnavap1B4Y7Yx9vmXru zuzhhHFLeZ+xjeaV2id+WPLNxrd0RUx2cRHrzf8AGq/5R/DNp2Z2bLUz7oDmf0DzcDX66OCPfI8g n35lfmV5d/LTy7HFFGkupyoV0zTFO7Hp6stNxGD1PVjsPb0TR6OMYiEBUQ8dkySySMpGyXx15o80 655n1ibV9aumuryY9TsqIPsxxr0VF7AfrzcQgIigwSnJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq2rMrBlJDA1BGxBGKvpf8j/+cgTevb+V/OE/+ltSPT9YkNPVPRYpz/P2V/2uh33ODn09 bxQ+g8wldirsVdirsVdirsVeZ+d/NR1Cc6fZv/oMLfvHH+7XH/Go7ff4ZxHbXanjS8OB9A+0/qer 7K7P8MccvrP2ftYlnPu5THQtFudY1BLSH4V+1NKeiIOp/pmZodHLUZBCPxPcHF1eqjhhxH4ebL/P /nnQPyz8oibgslywMWmWFaPPN1LMevFa8nb6OpAz0nRaOMIiEBUQ8VmzSySMpcy+MPMXmLWPMesX GsaxcNc31y3KSRugHZVHRVUbADpm7jERFBrSzJK9R07/AJxx/MzUNPtb+2gtDb3kMc8Ja4UHhKod aim2xzHOpgDSoj/oWL81P98Wf/SSv9MfzUFd/wBCxfmp/viz/wCklf6Y/moK7/oWL81P98Wf/SSv 9MfzUFd/0LF+an++LP8A6SV/pj+agrv+hYvzU/3xZ/8ASSv9MfzUFd/0LF+an++LP/pJX+mP5qCu /wChYvzU/wB8Wf8A0kr/AEx/NQV3/QsX5qf74s/+klf6Y/moK7/oWL81P98Wf/SSv9MfzUFd/wBC xfmp/viz/wCklf6Y/moK7/oWL81P98Wf/SSv9MfzUFd/0LF+an++LP8A6SV/pj+agrv+hYvzU/3x Z/8ASSv9MfzUFd/0LF+an++LP/pJX+mP5qCu/wChYvzU/wB8Wf8A0kr/AEx/NQV3/QsX5qf74s/+ klf6Y/moK8981+WNV8r6/daFqqot/Z+n6yxtzX97Gsq0YdfhcZdCYkLCpRklfUP/ADj3+dTarHD5 P8xz11OJeGlXsh3nRR/cyMTvKo+yf2h/ldcDUYK9QQ96zDV2KuxV2KuxViHn7zIbK2/Rts1Lq5Ws zjqkZ2p82/VnPdvdo+HHwo/VLn5D9ruuyNFxy8SX0x5eZ/Y81ziXql0UcksixRqXkchUUbkkmgAy UYmRAHMsZSAFnk9QtU0jyR5VutT1SVYoraM3GoXHUkjoi+O54qO5PvnovZXZwwYxEfXLn+O4PFa/ WHPkv+Ecnxn+Yvn3VfO/ma41m+JSI/u7G0rVYIATwQeJ7se5+7Onx4xAU4bF8sV2Kv0B8kf8oXoH /bNtP+TCZp8n1H3oTrIK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxX/wA5Ef8Ak4vMH/Rn /wBQMGbTTfQEvOMvVUgnmt5o54JGimiYPFKhKsrKaqykbgg4q+0PyR/NKLzz5b4XjKvmDTQseoxi g9QEUS4UDs9Pip0b2pmrz4uA+SHo+UK7FXYqhdU1CDTrCa9n/u4V5U7k9FUfM7ZRqdRHDjM5cg3Y MJyzEBzLxi/vri+vJru4PKWZizeA8APYDYZ5rnzyyzM5cy9zhxRxxEY8gh8pbWb/AJc6CJZX1eda pESlqD3f9p/9iNh/ZnUez2h4ic0uQ2j7+90HbWroeEOvN43/AM5OfmUdU1hfJ2nS/wC4/S3D6kyn aS7ptGfFYgf+CJ/lGd/pcVDiLzbwrMtXYq7FX6A+SP8AlC9A/wC2baf8mEzT5PqPvQkf5y+bNX8q eQb7W9IZFvoJIFjaVA60klVGqp9jksMBKVFXzn/0M7+an+/7P/pGX+uZ35WCXf8AQzv5qf7/ALP/ AKRl/rj+Vgrv+hnfzU/3/Z/9Iy/1x/KwV3/Qzv5qf7/s/wDpGX+uP5WCu/6Gd/NT/f8AZ/8ASMv9 cfysFd/0M7+an+/7P/pGX+uP5WCu/wChnfzU/wB/2f8A0jL/AFx/KwV3/Qzv5qf7/s/+kZf64/lY K7/oZ381P9/2f/SMv9cfysFd/wBDO/mp/v8As/8ApGX+uP5WCu/6Gd/NT/f9n/0jL/XH8rBXf9DO /mp/v+z/AOkZf64/lYK7/oZ381P9/wBn/wBIy/1x/KwV6T+Qv5xedPOvnC80vXJYHtIdPkukEMIj b1EnhjG4PTjIco1GGMY2EPecw1fFf/ORH/k4vMH/AEZ/9QMGbTTfQEvOMvV2Ksk/L3ztqHkzzVZ6 5ZkskTcLy3BoJrdiPUjPbcbr4MAchkgJClfduk6pY6tplrqdhKJrK9iSe3lHdHHIfI+IzUEUaKEV gV2KvPfzJ1kvPFpUTfBFSW4p3cj4F+hd/pzkPaPWXIYR03Pv6PS9iaagch67BhGcu79XsbOa9vIb SEVlmcIv0nr9GW4MJyTEI85Fry5BCJkeQZ9+Yfmm1/L78vLq/t+Pr28a22mxt+3cybISO9N5GHcA 56jotLGIjjj9IeDzZTkmZHmXw5PPNPNJPM5kmlYvLIxqzMxqzEnqSc3jBTxV2KuxV+gPkj/lC9A/ 7Ztp/wAmEzT5PqPvQwr/AJyS/wDJSap/xmtf+ohMt031hXxnmzSioNL1C4sbq/gt3ls7Ixi7mUVW L1iRGXp0DFSK9K/MYLHJULhV2KuxV2KuxV2KuxV2KuxVGadpOpakbkWNu0/1SCS7uitKRwQiryMT QAD8TsN8BICoPCr2v/nE3/yYuo/9seb/AKirbMXV/T8VfWGa5D4r/wCciP8AycXmD/oz/wCoGDNp pvoCXnGXq7FXYq+l/wDnFXz6Z7S78mXstZLbld6VyPWJj++iH+qxDge7eGYOrx/xIfQmYSqV1cxW ttLcymkcKNI59lFTleXIIRMjyAtnjgZyERzLxK+vJby8mu5jWSdy7e1T0+jPMc+Y5JmZ5yNve4sY hERHIKGVNjNPy10oS3k+pSLVbcenCT/O4+Ij5L+vOm9nNLxTOU/w7D3n9n3uh7c1FRGMddz7vx9z xn/nKfzkdR812vlq3etro0YkuQDsbm4UNv8A6kfGnzOeg6SFC+95p4fmWrsVdirsVfoD5I/5QvQP +2baf8mEzT5PqPvQwr/nJL/yUmqf8ZrX/qITLdN9YV8Z5s0vff8AnFLT7LUZPNtjfQJc2dzbW0c8 EgDI6M0oIIOYerNUrB/zl/KW98h616luHn8u3rE6fdncodz6Epp9tR0/mG/iBdhzcY81edZcrsVd irsVdirsVdiqP0PRNU1zVrbSdLga5v7xxHBCvcnuSdgANyT0GCUgBZV9VyfllpfkL8kvMtnDxn1S 502d9TvqbySCM0Va9I0rRR9PU5rvFM8g96HyLmyS9r/5xN/8mLqP/bHm/wCoq2zF1f0/FX1hmuQ+ K/8AnIj/AMnF5g/6M/8AqBgzaab6Al5xl6uxV2Kp15M8zXXlfzTpmvWtTJYTrI6DbnEfhlj/ANnG zL9ORnHiBCvvuyvLa9s4L21cS211Gk0Eg6MkihlYfMHNORSGO/mJqBttC+rqaPeOE9+C/E36gPpz Q+0Go4MHCOczXw5u37Gw8Wbi/mh5dnCvWuxV675WtBpnliAmNmcxm5kRBV2LjlQDu3Ggz0XsjT+F p4jqdz8Xie0s3iZ5HoNvk+Rdf/K/83tb1y/1i78t3huNQuJLmXZaAyMWoPi6CtBnTxywAq3CQH/K lvzU/wCpavP+BX/mrD48O9Xf8qW/NT/qWrz/AIFf+asfHh3q7/lS35qf9S1ef8Cv/NWPjw71d/yp b81P+pavP+BX/mrHx4d6vtDyla3Fp5V0a1uUMVxb2NtFNG3VXSFVZT8iM1czZKGC/wDOSX/kpNU/ 4zWv/UQmXab6wr4zzZpfQv8AziF/x0fM3/GG0/4lLmFrOQV9B+ZfLekeZNEutG1eAT2V0vF1/aU/ suh34up3U5hxkYmwh8SfmV+XWseRPMUml3wMtpJWTTr4CiTxeI8HWtHXsfYgna4sgmLSxLLFdirs VdirsVVba2uLq4itraNprid1jhhQFmd2NFVQNyScSVfY35Ifk/b+R9J+v6iiyeZr5B9akHxCCM0I t0IJHUVdh1PsBmsz5uM0OSGSfmz/AOSz8z/9s25/5NnK8P1j3q+EM26Xtf8Azib/AOTF1H/tjzf9 RVtmLq/p+KvrDNch8p/nd+WHn/W/zQ1rU9K0O5vLC4+rejcRhSrcLSFGpUjoykZscGWIgASlg3/K lvzU/wCpavP+BX/mrLfHh3q7/lS35qf9S1ef8Cv/ADVj48O9Xf8AKlvzU/6lq8/4Ff8AmrHx4d6u /wCVLfmp/wBS1ef8Cv8AzVj48O9X1L+Ry+Y7XyDZ6R5jtJbLUtLZrdYptna3ryhfYnYAlB/q5r89 cVhCF/Mu89XV4LUGq28VSPBpDU/8KFzhPaTNxZhD+bH7/wAB6nsPFWIy/nH7mIZzru0TptobzULa 1H+75UjPsGYAn7sv02LxMkYfziA1Z8nBAy7g9qmUUhiCngXAqu3EIC4+iq0z1ACngCVbFXYq7FXY q7FXYq8w/wCckv8AyUmqf8ZrX/qITMjTfWFfGebNL6F/5xC/46Pmb/jDaf8AEpcwtZyCvpbMFDGv zB8h6N528uzaPqS8WNXs7sCrwTAUWRelfBl7jbLMeQwNhXxH5v8AKWs+U9fudE1eL07q3PwuN0lj P2JYz3Vh0+475tYTEhYSkuSV2KuxV2Kvp3/nGX8sNMh0iDz3fcbi/uzKmlx02t445Ggkff8A3Y5R h7L8zmBqspvhQ9+zDVif5s/+Sz8z/wDbNuf+TZyzD9Y96vhDNul7X/zib/5MXUf+2PN/1FW2Yur+ n4q+sM1yHYq7FXYq7FXYqoSHheQtUBZQ0RFN2YDmm/gqq/34VeSebbn6x5kv3rXjKY/+RYCf8a55 x2rk49TM+dfLZ7fs6HDggPK/nulGa5zWQ+QrYTeZrckVWFXkI+SkD8WGbjsLHxaqPlZ+x1na8+HT nzoK/wCc35vyfl7e6P6GnrqMt9Hc843lMQRUaLidletTXPR8GHjt4551/wBDe6j/ANSzD/0lt/1S y78mO9Lv+hvdR/6lmH/pLb/qlj+THerv+hvdR/6lmH/pLb/qlj+THerv+hvdR/6lmH/pLb/qlj+T Herv+hvNS/6lmH/pLb/qlh/JjvV3/Q3mpf8AUsw/9Jbf9UsfyY71Y1+Yv/OQ97508qXPl+XQ47JL l4nNwtw0hHpSB6cTGvXjTrk8em4Tdq8gpmSr6E/5xD/46Pmb/jDaf8SlzD1nIK+lswEOxVgn5ufl Zp3n3QDD8MGtWYZ9MvSOjHcxPTrG9N/Dr7G7DlMD5K+K9X0jUdI1O50zUoGtr60cxXED9VZflsR4 EbHNoCCLCUJTCrqYq9N0f8n7pfys1rz1rSvAqQRnRLU1Vn5zIhuJB/Jxb4B+116UrRLN6xEK+h/+ cd//ACTvl/8A6PP+o6fMLU/WUPRsoVif5s/+Sz8z/wDbNuf+TZyzD9Y96vhGmbdLMvys/MafyB5h uNZhsV1Bri0ezMLyGIAPJHJy5BX/AN9UpTvleXFxilepf9Deal/1LMP/AElt/wBUsx/yY71d/wBD eal/1LMP/SW3/VLH8mO9Xf8AQ3mo/wDUsw/9Jbf9UsfyY71d/wBDe6j/ANSzD/0lt/1Swfkx3q7/ AKG91H/qWYf+ktv+qWP5Md6u/wChvdR/6lmH/pLb/qlj+THeqa+U/wDnJ258w+adI0a40KKzS/u4 rcXK3BkKNK3AUUxqDXlx698jPS8IJtCPv5TLfXEp6ySux+lic8izy4skj3kvoGGNQA7gFDKWxmP5 ZRA6tdS/yQcR/snU/wDGudJ7NR/fSPdH9IdH27L93Ef0v0PGf+csb31fPum2gNVt9MRiN9nknlr/ AMKq56JpB6T73mHiWZSuxV2Kt4quphV1MVdTFXUxV9Cf84iD/cj5m/4w2n/EpcwtbyCvpTMBDsVd iryn88/yci86ab+ltJjVPM1klIuii6iXf0XJoAw/Yb6DtuMnT5+E0eSvkCaCWGV4ZkaOaNikkbgq yspoVYHcEHNml6/+Q35Mt5rvk8wa3CR5ctH/AHUTCn1yVD9gVG8SkfGe/wBnxpi6jPw7Dmr3f89I 0j/KLzBHGoREghVEUUAAnjAAAzD0/wBYQof848f+Se8v/wDR3/1Gz4dT/eFXo2UKxT82P/JZ+Z/+ 2bcf8mzlmH6x71fCVM3CXUxV1MVdTFWmGJVbgV2KuxVMvLV41l5j0q8WvK2vLeYU61jlVtunhgkL BV9IZ4c+huxVnP5XA+vqJ7cYt/pbOp9mPqn8P0vP9vcofH9Ceaj5H8oa9qV1ea1o9pqN1GywpNcQ pI6xiNGCAkVpyYn6c7IZJAbF5tD/APKpvyz/AOpY03/pGj/pj40+8q7/AJVN+Wf/AFLGm/8ASNH/ AEx8afeVd/yqb8s/+pY03/pGj/pj40+8q7/lU35Z/wDUsab/ANI0f9MfGn3lW/8AlU/5af8AUsad /wBI8f8ATD40+8q7/lU/5af9Sxp3/SPH/THxp95V57+fPkDyTo/5aahf6VodlZXsctuEuIIURwGm VWAYCu4NMv02SRmASr5XpmyS+gv+cRh/uR8y/wDGG0/4lLmDreQV9J5r0PKPzx/MLV/I2oeVtUsf 3ts8t1Hf2RNEnh4xfCTvRl6q3Y+1QcnT4hMEFXonlrzJpHmXRbbWdImE9ldLyRujKw2ZHX9llOxG UTgYmiqZ5FXzx/zk5+WulRWQ87WFLa8aWODUoAKLMXqFmFOjilG/mG/Ub52kym+Eq9T/ACYAH5W+ W6f8si/8SbMfP9ZVD/nt/wCSm8xf8YYv+oiPHT/WFQ3/ADj1/wCSf0D/AKO/+o2fDqv7wq9FyhWK fmv/AOS08zf9s64/5NnLcP1j3q+FaZuUvWP+cbPLuh6755vrTWbGDULWPTJZUhuEEiCQXEChgG70 Yj6cxdXIxjt3q+kv+VT/AJaf9Sxp3/SPH/TMDxp95Q7/AJVP+Wn/AFLGnf8ASPH/AEx8afeVd/yq f8sz/wBMxpv/AEjx/wBMHjT7yrX/ACqb8s/+pY03/pGj/pj40+8q7/lU35Z/9Sxpv/SNH/THxp95 V3/Kpvyz/wCpY03/AKRo/wCmPjT7yrh+U35Zg1HljTa/8w8f9MfGn3lXmWeSvobsCWc/lcf3+oCv VYjT5Fs6n2ZPqn7h+l5/t7lD4/oTHXPzL8jeV9WuNP17VY7G8lKXEcLpKxMTRqgaqIw+0jDOzjil IWA82gP+V8flJ/1MUP8AyKuP+qeH8vPuV3/K+Pyk/wCpih/5FXH/AFTx/Lz7ld/yvj8pP+pih/5F XH/VPH8vPuVsfnx+UpNP8RQ/8irj/qnj+Xn3Ku/5Xp+U/wD1MMP/ACKn/wCqeH8tk7ld/wAr0/Kf /qYYf+RU/wD1Tx/LZO5WBfnf+afkDzB+XV/pej6xHd38slu0cCpKpISZWbd0UbAeOX6fBOM7IV8y 0zYpfQP/ADiQP9yPmX/jDa/8SlzB13IK+kc1yHz/AP8AOW4/3HeWv+M11/xGLM/Q8yry/wDJ381r 7yJrXCctP5fvWA1C0G5Q7ATxD+dR1H7Q28CMnPgEx5pfZOn39lqNlBfWMyXFncoJIJ4zyV0YVBBz UEEGih5j/wA5Mf8Akrp/+Yu2/wCJHMnR/WrIvyZ/8ld5b/5hF/4k2V6j6yqG/PX/AMlP5h/4wxf9 REeHTf3gVD/849/+Sg0D/o7/AOo2fDqv7w/jor0TMdWK/mt/5LXzN/2zrj/k2ctwfWPer4Xpm6S9 Q/5x481+XvLHnW9v9dvFsbSXTZYI5XV2BkaeBwtEDH7KMcxtVjMo0O9X0P8A8r0/Kf8A6mGH/kVP /wBU8wPy2TuQ7/len5T/APUww/8AIqf/AKp4/lsncq0/nt+Uw6+YoR/zyuP+qeD8vPuVr/lfH5Sf 9TFD/wAirj/qnj+Xn3K7/lfH5Sf9TFD/AMirj/qnj+Xn3K7/AJXx+Un/AFMUP/Iq4/6p4/l59ytj 8+PylJoPMUNf+MVx/wBU8fy8+5WF6hEYb+5iPWOV0P8AsWIzyjUR4ckh3Evf4ZcUAe8BD5S2sx/L KUDV7qL+eDkP9i6j/jbOj9mp1mkO+P6Q6Pt2P7qJ/pfoeNf85ZWXp+fNMuwKLcaaiE+LRTy1/wCF dc9F0h9J97zDxHMpXYq7FWwaEHCqLpliupirqYq6mKvf/wDnEof7kPMv/GG1/wCJS5ga7kFL6QzX IeAf85aj/cd5a/4zXX/EYsz9DzKQ+b6ZsVevfkT+cL+Vb1NA1qYny5dv+6lY1+qSuftip2iYn4x2 +141xNTp+IWOavW/+ck3ST8rJXRg6PdWzKymoILEggjMTR/3iGR/k1/5K/y5/wAwi/8AEjleo+sq h/zz/wDJUeYf+MMX/J+PDpv7wKhv+cfP/JQ6B/0d/wDUbPh1X94fx0V6JmOrFfzV/wDJbeZv+2dc f8mzluD6x71fDVM3aXUxV1MVdTFVCf7QHtkJKpZFXYq7FUz8s2bX3mTSbJQS11eW8IA61klVffxy MjQKvqfzdbfV/Ml+lPtSeoP+egD/APG2eQdrY+DUzHnfz3e17OnxYInyr5bJPmuc5kHkS59DzNbA mizB42+lSR/wwGbfsPJw6qPnY+x1va0OLTy8qKO/OD8no/zEutJI1M6XJp6XHKX0PrAkWQxUWnqw 8ePE56PhzcF7PGvPf+hP/wDv7f8AuX/9nWX/AJzyV3/Qn/8A39v/AHL/APs6x/OeSu/6E/8A+/t/ 7l//AGdY/nPJXf8AQn//AH9v/cv/AOzrH855KrD/AJxHoAP8V/8Acv8A+znJfn/6P2ptv/oUj/v6 /wDuX/8AZzh/P/0ft/YtsZ/MX/nHv/BvlS51/wDT/wBf+rvEn1b6p6PL1ZAlefryUpyr9nLMOr45 VSvH6Zmq9+/5xMH+5DzJ/wAYbX/iUua/X8gpfR2a1DwH/nLMf7j/AC3/AMZrr/iMWbDQcykPnGmb JXUxVm7fmbqV3+Ws3krU+VwkM0Mul3RNWjjjYloXJO6gH4PDp0pSjwAJ8QV9R/k5/wCSw8uf8wi/ 8SOarUf3hQh/zy/8lT5h/wCMMX/J+PDpf7wKhv8AnH7/AMlFoP8A0d/9Rs2HV/3h/HRXoeY6sV/N X/yW3mX/ALZ1x/ybOW4PrHvV8O0zepZl+Vf5c/498w3Gj/pD9G+haPd+v6Pr14Sxx8OPOKlfVrWv bKM+XwxdWr1T/oUj/v6/+5f/ANnOYv5/+j9v7Ft3/QpH/f1/9y//ALOcfz/9H7f2Lak//OIPJi3+ LaV/7V//AGc5A62+n2qt/wChP/8Av7f+5f8A9nWP5zyQ7/oT/wD7+3/uX/8AZ1j+c8ld/wBCf/8A f2/9y/8A7OsfznkqbeU/+cXE8v8AmbS9bfzEL4abcxXItTZelzMTBl+P15ONCK/ZORnqrBFKy/8A MyzMeq292B8NxFxJ/wAqM7/gwzz/ANpMNZYz/nD7nqOw8t4zHuP3sOznHeIjT7o2l/b3Q6wSJJ/w LA5dp8vh5Iz/AJpBas2PjgY94e2s6ssciseFQRx35BhxH0fFXPUAQRYeBIpUwodirsVdirsVdirz X/nIn/yVWp/8ZbX/AJPpmVo/7wK+P6ZuUvff+cThTUPMn/GK1/4lLmv7Q5BS+jc1iHgf/OWIrp/l v/jNdf8AEYs2Gg5lIfONM2aupirqYq+2fyd/8lh5c/5hF/4kc0ep/vChDfnj/wCSq8wf8YYv+T8e HS/3gVD/APOP/wD5KPQf+jv/AKjZsOr/ALw/jor0LMZWLfmp/wCS38y/9s64/wCTZy3B9Y96vh6m b5L2T/nFgf8AIQdQ/wC2TN/1E2+YWv8AoHvUvqbNSh2KuxV2KuxV2KrWFZEqKhasG8DSn6icVY3+ YWn/AFrQTOorJaOJNuvE/C366/Rmj7f0/Hp+Ic4G/wBBdt2Pm4M1dJbPLM4R652KvWvKd2NU8rxR s7q6o1rK6MVdSo4gqw3DcSDXPROxtR4mniesdvl+yniu08Ph55dx3+b438xeb/zP0PXtQ0a6806x 9Y0+4kt5D9fuqExsV5D950alRnUxhAi6Dgpf/wArK/MX/qatY/6T7r/qpkvCj3BXf8rK/MX/AKmr WP8ApPuv+qmPhR7grv8AlZX5i/8AU1ax/wBJ91/1Ux8KPcFbT8y/zEVgT5p1cgdQb+5/6qYRjh3B X3B5RnluPKmizzSNLNNYW0kkrkszM0KkszHckncnNTk+o+9DC/8AnIj/AMlVqX/GW1/5Ppl+i/vA r5Cpm6S98/5xQH+5DzH/AMYrX/iUua7tDkFL6LzWIeCf85Xj/cf5c/4y3X/EYs2PZ/MpD5zpmzV1 MVdTFX2t+T3/AJLHy7/zCL/xI5otT/eFCH/PD/yVfmD/AIxRf8n48Ol/vAqH/IH/AMlJoP8A0d/9 Rs2HWf3p/HRXoOYysW/NP/yXHmT/ALZ1x/ybOXaf+8HvV8Q0zfJex/8AOLQ/5CBqH/bJm/6ibfML X/QPf+tS+pM1CHyR+fPnnzlpv5p6zYaZr2o2NnD9V9O2trueKNedpCx4ojqoqWJPvmzwQiYDYJef /wDKyvzF/wCpq1j/AKT7r/qplvhR7grv+VlfmL/1NWsf9J91/wBVMfCj3BXf8rK/MX/qatY/6T7r /qpj4Ue4K7/lZX5i/wDU1ax/0n3X/VTHwo9wV9Z/kLba+v5dWWoa9f3WoahqrveCS8mknkSBqLCi tIWPEovMD/KzXagjiodEPQLiCK4t5IJRyilVkceKsKHMXJATiYnkRTKEzGQI5h4nqNjLY309nL/e QOUJ8adD9I3zzHUYTiyGB5xL3uHKMkBIdUNlLazL8ttVEOoTae5+C6XnF/xkQbj6V/VnSezmq4ch xn+Ll7x+z7nR9t6figJj+H7i8e/5yp8mtYeZ7TzRbp/ourxiG6YdrqBQoJ/14gtP9U56HpJ2K7nm HhmZauxV2KuxV+gPkj/lC9A/7Ztp/wAmEzT5PqPvQxD/AJyH/wDJV6l/xltv+T6ZkaL+8CvkSmbt L1D8jfzH8veSLrV5dZW4Zb6OBYfq6K5rGXLcuTJT7QzD1eCWQClet/8AQzP5c/761D/kQn/VXML8 hk8kU8v/ADy/NHy153tNIi0ZblWsZJmm+sRqgpIEC8eLPX7JzM0mnljJtLySmZqupirqYq+i/IH5 +eRtA8maTo99Hem7soBFMY4UZOQJPwkyDx8M1ebRzlMkUql+ZP58eSPMfkjVdF0+O9F5eRosJliR UqsqOakSN2XwxwaOcZgmlUfyt/PPyV5X8iaZoWpJeNe2fr+qYYkZP3txJKtCXU/ZcdsOo0k5zJFK yv8A6GZ/Ln/fWof8iE/6q5T+QyeSKSTzt/zkD5E1ryjrGk2cd8Lq+tJYITJCipzdSByIkNB9GWYt FOMgTWyXzfTNqr2L/nFwf8hA1D/tkzf9RNvmB2h9A9/61L6izUIfFf8AzkR/5OLzB/0Z/wDUDBm0 030BLzjL1dirsVT3yR5XufNPmzTNBt6hr6dUlcCpSIfFLJ/sI1ZsjknwxJV982dpb2dpBaWyCK2t 41ihjXYKiAKqj5AZpybQq4FYB+ZWjFZYdWiX4XpFc0/mH2GPzG33ZyXtHo6IzDrsf0fqej7E1Oxx n3j9LBc5V6FWtLqa0uormE0lhcOh91NcsxZTjmJR5g215MYnExPIvQPPflm0/MP8vLmwiKrNdRCe wkY7R3UW6Anw5VRvYnPUNDqxOMckeReEz4TjmYno+HLm2ntbmW2uIzFcQO0c0TCjK6HiykeIIzfA talirsVdir9AfJH/AChegf8AbNtP+TCZp8n1H3oYx+fNje335aahbWVvLdXDS25WGFGkcgTKTRVB Owy/RkDILV8r/wCDPN//AFY9Q/6RZ/8AmjNz4sO8Jd/gzzf/ANWPUP8ApFn/AOaMfFh3hXf4M83/ APVj1D/pFn/5ox8WHeFd/gzzf/1Y9Q/6RZ/+aMfFh3hXf4M83/8AVj1D/pFn/wCaMfFh3hXf4M83 /wDVj1D/AKRZ/wDmjHxYd4V3+DPN/wD1Y9Q/6RZ/+aMfFh3hXf4M83/9WPUP+kWf/mjHxYd4V3+D PN//AFY9Q/6RZ/8AmjHxYd4V3+DPN/8A1Y9Q/wCkWf8A5ox8WHeFd/gzzf8A9WPUP+kWf/mjHxYd 4V3+DPN//Vj1D/pFn/5ox8WHeFd/gzzf/wBWPUP+kWf/AJox8WHeFer/APONnl/XtO8830+oabdW cLaZKiy3EMkSljcQEKGdQK0B2zC184mAo9VL6SzUofFf/ORH/k4vMH/Rn/1AwZtNN9AS84y9XYq7 FX03/wA4reQWtdPu/Od7HSW9DWmmBhuIUb97KP8AXdeI/wBU+OYGryb8KH0BmGrsVQ+oWMF/ZTWc 4rFMpVvEeBHuDvlOowRywMJcpNuHKccxIcw8Y1PT7jTr6aznFJIWoT2I6hh7Eb55rqdPLDkMJcw9 zgzRywEo8ihcobmafl1rwguW0qdqRXB5W5PQSU3X/ZD8fnnTez2u4JeDLlLl7/2/jm6LtrScUfEH Mc/d+x5H/wA5O/lo2n6ovnPTYf8AQdQYR6qqDaO56LKadpRsT/N7tnoOly2OEvMvBcy1dirsVfoD 5I/5QvQP+2baf8mEzT5PqPvQnWQV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kviv/nIj/wAn F5g/6M/+oGDNppvoCXnGXq7FWUflx5Gv/Ovmu00S1qkLn1L65Ar6NshHqPv33ovixGV5cgiLV91a ZptlpmnW2nWMQgs7OJIbeJeipGAqj7hmpJs2hE4FdirsVYr578tnUbP69bJW8tl+JR1ePqR816jN D252d40PEiPXH7R+x3HZOt8KXBL6ZfYXmGcM9YuR3R1dCVdSCrDYgjcEYQSDYQQCKL0/TbjS/Ofl e50vVYlmWaI2+oQHaoYbOvhXqCOjD2z0TsjtHx8YP8cef6/i8X2hozgybfSeX6nxv+Zf5fan5G8z z6Rd1ktWrJp15SizQE/C3+sOjjsfamdTiyCYtwWKZYrsVfSOgf8AOVHl/TNC03TZNDu5HsbWG2eR ZYwGMUaoSK+PHMGWkJN2hH/9Dc+XP+rBef8AI2LB+TPerv8Aobny5/1YLz/kbFj+TPerh/zlz5br voF5T/jLFj+TPeqKi/5yr8tyiqaLdHxHqx1+7LY9nk8pBNL/APoaTQP+rHdf8jY8P8my7wtO/wCh pNA/6sd1/wAjY8f5Nl3had/0NJoH/Vjuv+RseP8AJsu8LTv+hpNA/wCrHdf8jY8f5Nl3had/0NJo H/Vjuv8AkbHj/Jsu8LTv+hpNA/6sd1/yNjx/k2XeFp3/AENJoH/Vjuv+RseP8my7wtOb/nKby+oq 2iXQA6kyx4ns2XeFpCSf85b+WlNF0K8f3EkYGVHRnvQt/wChufLn/VgvP+RsWD8me9Xf9Dc+XP8A qwXn/I2LH8me9Xf9Dc+XP+rBef8AI2LH8me9Xg/5m+brbzf531LzFbW72sN96HCCQhmX0beOE1K7 bmOuZeKHDEBLF8sVVtba4urmK1to2muJ3WOGJAWZ3Y0VVA6kk4kq+1PyV/LCHyL5YCXKq2vagFl1 OYUPEj7ECn+WOv0tU+GarPl4z5IehZSrsVdirsVdirzfz15UNpK+qWSf6JIa3EY/3W5P2h/ksfuO cZ252X4ZOWA9B5+R/UXqOye0OMeHP6hy8/2sOzm3eI7RtXutJv47y3O67SIejoeqnMvR6uenyCcf 7Q4+p00c0DGTM/O3k7y9+Z3k/wCruwjnFZLC8oDJbXFNww8D0de4+g56RoNdHJEZIcj+KeJ1GCWK ZjLm+MfM/ljWfLGt3OjaxAYL22NGHVXU/ZdG/aVhuDm9hISFhqSrJK7FXYq7FXYq2CVNQaEdCMKo qLUrhNmo49+v35YMpColNVhP21Kn23GWDMFVlv7Rv92U+YIyYyRVeLq2P+7V+/Dxx70rTe2g6yD6 Kn9WDxI96FN9Ttl+zVvkKfryJzRVDSarIdo0C+53OQOY9FQkk0shq7FvnlJkTzVZgV2KuxV2KuxV sAk0HXFX1N/zj7+Sp0OKLzb5igprEyV02ykFDaxsCDI4P+7XU7D9ke521+oz36RyQ90zEV2KuxV2 KuxV2KtSRpIjRyKHRwVZWFQQdiCDglEEUeSQSDYeX+b/AChNpcrXdopfTnNdtzESfst/k+B/zPDd rdkHAeOG+M/7H9j1vZ3aQyjhl9f3sXzRO2Tfy55ju9Fu/Uj+O3egngJ2YeI8GHY5sez+0J6adjeJ 5j8dXC1uijnjR+roWRfmB+XXlf8AM7y9HMHEOoxI36P1JR8cTdfSlX9pK9V7dRnoui10ZxE4G4n8 fN43NhlikYyG74982eUdf8qaxLpGt2xtrqPdT1jkQ9JIn6Mp8foO+bqExIWGtJskrsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdiq5EeR1jjUu7kKiKKkk7AADFX07+R35Afop7fzP5thDakKSaf pTiotz1WWYd5O6r+z1PxfZwM+ovaKHvmYauxV2KuxV2KuxV2KuxVqSNJEaORQ6OCrKwqCDsQQcEo gijySCQbDzrzV5EltS97pamS23aS2G7p/q/zL+Izju1OwzC54hce7qPd5PTdn9rCdQybS7+9hmc0 71NNB8w32jXXq255QtT1rdj8Lj+B8Dmfoe0MmmnceXUd7h6vRwzxqXPoWZa95e8l/mZ5fNpqEQdk 3jkWi3VrIw+0jb9af6rd87/s/tKGaPFjPvDyGq0k8Mql8+98q/mZ+TXmnyLcNNOhvtEdqQarCp4b nZZl3MT/AD2PYnN9izCfvcdgOXK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqm3lrytr/mbVY9L 0Sze8vJN+KCiovd5HNFRR4scjKYiLKvrD8pPyG0XyWseqamU1LzKRUT0rDbV6iBWH2uxkO/hx3rr s2oMthyQ9VzHV2KuxV2KuxV2KuxV2KuxV2KuxVi/mPyNZakXubOlrempJp+7c/5QHQ+4zR9o9iQz XKHpn9h9/wCt22i7Vni9MvVD7Q851LSdQ02cwXsLRP8Ask7qw8VYbHOM1OlyYZcMxRenwaiGUXA2 p2V9d2NwtzaStDMnR1/UR0I9jkcOeeKXFA1JnlxRyR4ZCw9A0Xzvpeq27afrUccbTKY5BIA1vKrb EMGqBXuG2zsez+34ZKjk9E+/of1PM6zsicPVj9Uft/a84/MX/nF/SNS9XUvJsyabdvV202Uk2jk7 /unHJovluvhxGdXi1Z67umfO3mfyd5m8r331LXtOmsZjXgZBWOQDqY5Fqjj3UnM6MxLkqTZJXYq7 FXYq7FXYq7FXYq7FXYq7FVW2tbm6uI7e1hee4lPGKGJS7sx7Kq1JOJKvavy9/wCcYvMermO+81SH RtPNCLNaNeSD3G6xV/yqt/k5i5NUBy3V9KeVvKHlzyrpi6boVlHZ2w3cru8jfzSOas7fM5gTmZGy hOMirsVdirsVdirsVdirsVdirsVdirsVdiqjd2VpeQGC6iWaJuqOKj5jwOVZcMMkeGYBDZjyygbi aLCtZ/LVTyl0mbj3+rTHb5K/9fvzmtZ7OdcJ+B/X+v5u903bfTIPiP1MN1DSNS06The27wnoGYfC fkw+E/Qc5vUaTLhNTiR+O93mHUY8ouBBR+iebtX0kqkcnrWo628m60/yT1X6MytF2tm0+wNx7j+N nH1XZ2LNuRUu8Mxj8y+UfMlm2n6xbxGOXZ7S9RZImPTZmHHv3oc6zR9u4cnM8EvP9f8AY87qeycu PceoeX6mAebf+cWvJuqc7ny7dy6NcP8AEsP+9Fqa77KxEi19np7Z0WPVnru614/5k/5x0/M/RS7w 2KavbKdpbBxI1O37p+EtfkpzKjqYHyV51qOlanps5t9Rs57K4HWG4jeJ/wDgXCnLgQeSoXCrsVdi rsVdiq5EeR1RFLuxoqqKkk9gBirMvL35OfmVr/BrHQblIH3FxdAW0dP5g0xTkP8AVrlUs0B1V615 U/5xLoyTeatYBAoWstOHXvvPKPvAj+nMees7gh7Z5T/L/wAneU4fT0HS4bRyOMlzTnO4/wAuZ+Tk e1aZiTySlzKshyCuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KrZI45UKSIHRvtKwBB+YOR lESFEWExkQbCQah5D8vXdWSFrWQ/tQHiP+BNV+4ZqdR2FpsnIcJ8v1cnZYe1s8OZ4h5sdvPyxvFq bO8jkHZZVKH7155p83s1MfRMH37frdli7difriR7t/1Ia20Xz7ox/wBDEnpj9mN0kQ/88yT+rKce j7Q0/wBF15EEfL9jbPVaPP8AVV+YIPzTi185eY7cBdT0WZgOssaOmw70IYH782GLtjUw2y4pe8Ah wsnZuCX93kHxITE+aPLWow/V9QgZUfrBeW5ZT232dfvzY4u2cJ58UD5g/ocKfZmWPKpe4pVc/lZ+ Uet8m/QOnSE7sbVRA2/c+gYzm1w63j+iV/Fw54pw+oEJNc/841/lNMax6dPbCtaRXU5+j940mZA1 U2tAv/zi1+WLOWD6igPRVuEoPvjJw/m5qiIP+cZPyqjK87a7m4ihD3Liu3U8OH4YPzU1TrT/AMiP ymsSDF5ehkYd7iSaep27Su69vDInUTPVWWaV5c8vaQKaVplpp4pT/RYI4dv9gq5WZE8yqY5FXYq7 FXYq7FXYq7FXYq7FXYq7FX//2Q== - - - - - - 1 - False - False - - 119.000000 - 118.999512 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Standard-Farbfeldgruppe - 0 - - - - - - Document - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/Shading<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 119.0 119.0]/Type/Page>> endobj 8 0 obj <>stream -H‰tVÉn9 ¼ë+ôM“¢Ökœ`NÁ ÈarHâÃK'ÿLQK/^l¸›¥nq)Õ~ø÷Ñ?|~dÿáã£wώ½Hë›]þ|wÿùߎIŠz\Õ®ŠëŸŸî៯ìþuÏ^<ãW°-’0‹Obö·_ÎÖíº…B,Š»Pãä·X©É¸…²àÍm%Q‹uÞ -Õ¤Çö‰Ù^vüÚyu¼ûq浉»§î ~Ÿ -e”fɧ†´'Ž WÍÇL9ù€(\}N`$.tsW|wU)·²p«T$.GÍ07wÅ÷…K¡ÖütÔùÊ -;Ñvâ»9N8Ó~®µÝzWŸ÷nLl?È.´0$M'óôÜB†š$Ïê«X«?|ó_ŸØÿ}òŸ¾ùÁè{jj¹Áeª&)©ïˆI)*K9¥„¨5¨—FÚÐÐBM”CöIˆ^v1v»@JZĐ0Z¨h]èæ ×ÒÂ[%ÓS¥èBëÖÖדï[¢ßúž¸<.ˆÐPç̅¹´žèxÈ©X£Š­—azÜzyé¤L1.Œ¢ƒš(  ȁ‚V=رÝÜÌϽےtÇîWaªí@jìã1±’ån(!Ùl¾E˘§uwO=½#«fL«‰©ævÿ±¡çÔ­MÌeîR5ú^¯Œ×A=¿Q,@Ùi@™PJ/0ã(™ªÕ“ې‡E¯ý4X®ÆÂÉw0Uæ#Ó7q櫽Iwl¢‘•PN²RjxiЙ]µ¼¤v5¼&8ÐSᛔkçvšRH’°P,Œ^’†NvƘ²iƒfŠ+(‡ö&8Úí½ ÷µÀÓÄË'sŠÂ*‡t^¢ÓNâî· $§ ÆJ6ñη€iŠºW`XÂYbçp/÷%‰öub®õ±áº Omsƒž„]óy̬6çe˜s”èS6^îãwýÐØ¡Q“× -×bgB-uÝæ¹Oý냱Äq²1 rTq•QððB➴W˜úÖ̖@§:¾9šâefÕº“ÑÍê§` -:`Ù/½&œ1¼‘"ܕØÏÃìIÚSœˆÇPiÉÆMÚ("Jí÷é3þaùâþ`I§°™ -endstream endobj 12 0 obj <>stream -8;UT3d1$(!#XdW+I*n)TEYph=lWDIX;+X<'.?nF.`PGr7D'0;'C-cJa))@!lGl10> -SVI*;>8s'Sl1D@Ghoas$iEm@/.&inSS-&a*08^n~> -endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 11 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 5 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (Eclipse_with_icon_3.ai) -%%CreationDate: 6/22/2019 4:28 AM -%%Canvassize: 16383 -%%BoundingBox: 404 366 514 469 -%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%%DocumentFiles:K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 399.6704 358.1719 518.6704 477.1714 -%AI3_TemplateBox: 639.5 400.5 639.5 400.5 -%AI3_TileBox: 43.1904 129.791 843.8301 705.7915 -%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: 1 -%AI9_OpenToView: 60.5 670.5 2 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 22 0 obj <>stream -%%BoundingBox: 404 366 514 469 -%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 -%AI7_Thumbnail: 128 120 8 -%%BeginData: 22177 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 -%524C45FD31FFCFCFC9C9C2FD04C1C8C8CFCAFD6EFFCACFC8C89FC1BAC098 -%C1C1C9C9FD70FFCAC9C2C1C0C1C0C0BAC1C2C9CAFD0BFFA8A87EA87D7E7D -%A87DA8A8A9A8FD58FFCAC9C1C198C09EC198C0C1C9CAFD07FFA8A8535328 -%2821280028002100220021002821282853537E7EFD51FFCFC2C1C0C1C0C1 -%C0C1C0C8CAFD07FF7D772828212800282828212828282128282821282828 -%21282128002828537DA9FD4BFFC9C2BAC098C1C0C198C1C2CFFD05FFA977 -%4C0028002800282128002821280028212800282128002821280028212800 -%280021002853A8A9FD45FFC9C1C0C0C1C1C1C0C1C0C8CAFD05FF7D532128 -%212821282828212828282128282821282828212828282128282821282828 -%212828280028214C53FD42FFC9C198C19EC198C198C09FCFFD04FFA87721 -%220028002821280028212800282128002821280028212800282128002821 -%2800282128002821280028002100537EFD3EFFC2C1C0C1C1C1C0C1C0C1C9 -%FD05FF532800282828272828282728282827282828272828282728282827 -%28282827282828272828282728282827282828272821284CA8FD3AFFC998 -%C0C0C19EC1C0C098C8CFFFFFFFA853002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%2821280028212200537EFD36FFCAC8C0C1C0C1C1C1C0C1C1CFFD04FF7728 -%002821282828212828282128282821282828212828282128282821282828 -%212828282128282821282828212828282128282821282828002853FD34FF -%C9C098C19EC198C198C09FFD04FFA8282100282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%280028212800282128002821280022217DFD31FFC2C1C0C1C1C1C0C1C0C1 -%C9FD04FF7D21282728282827282828272828282728282827282828272828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828280053A8FD2DFFCF9FC0C0C19EC1C0C198C1C9FFFFFFA828 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%0028212800287DFD2BFFCFC1C1C0C1C1C1C0C1C0C1CAFFFFFF7D28212821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%282828002853FD29FFC998C19EC198C19EC198C1CAFFFFFF522100282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%00282128002128A9FD26FFC9C0C1C1C1C0C1C1C1C0C8FD04FF4C28212828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827FD0428A9FD24FFC9BAC19EC1C0C19EC1BAC2FFFFFFA92828 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800A8FD22FFC9C0C1C1C1C0C1C1C1BAC8 -%FD04FF282821282828212828282128282821282828212828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%28212828282128282821282828212828282128282800A2FD20FFC998C198 -%C19EC198C198C1CAFFFFA921282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%28007EFD1EFFCFC0C1C0C1C1C1C0C1C0C1CFFFFFFFFD0428272828282728 -%282827282828272828282728282827282828272828282728282827282828 -%272828282728282827282828272828282728282827282828272828282728 -%28282728282827FD052800A8FD1CFFCF9EC1C0C19EC1C0C198C1CAFFFFFF -%282100282128002800210028002200280022002800220028002200280022 -%002800220028002200280022002800220028002200280022002800220028 -%00220028002200280022002800220028002800282128002800A8FD1BFFC1 -%C1C0C1C1C1C0C1C0C1C9FFFFFFFD04282128282821535353525353535253 -%535352535353525353535253535352535353525353535253535352535353 -%525353535253535352535353525353535253535352535353525353535253 -%282821282828212828A9FD19FF9FC09EC198C19EC198C0C8FFFFFF520000 -%282128002800217DFD43FFA828002800282128002827FD18FFC9C1C1C1C0 -%C1C1C1C0C1C2FFFFFF7D28212828282728282800A8FD44FF282827282828 -%27FD0428FD16FFCAC198C1C0C19EC1C0C09EFFFFFF7E2821280028212800 -%2821227DFD43FFA8280028002821280028212153FD15FFC8C0C1C0C1C1C1 -%C0C1C0CFFFFFA9280028282821282828212821A8FD44FFFD042821282828 -%212828287EFD13FFC998C19EC198C19EC198C8FFFFFF5300280028212800 -%28212800287DFD43FFA828002821280028212800280028A8FD11FFCFC0C1 -%C1C1C0C1C1C1C0C1CFFFFFA800282728282827282828272821A8FD44FFFD -%042827282828272828280077FD11FFC1C09EC1C0C19EC1C0C0C9FFFFFF21 -%282128002821280028212800287DFD05FFA85352534C5352534C5352534C -%5352534C5352534C5352534C5352534C5352534C5352534C5352534C5352 -%534C5352534C5352534C5352527DFD05FFCB280028212800282128002821 -%2800A8FD0FFFC9C1C0C1C0C1C1C1C0C1C1FFFFFF53282128282821282828 -%2128282800A8FD06FF002821280028212800282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%280028007DFD06FF2828212828282128282821FD0428FD0FFFC198C19EC1 -%98C19EC198CAFFFF7E2800280028212800282128002800217DFD05FFA828 -%002821280028212800282128002821280028212800282128002821280028 -%21280028212800282128002821280028212800282128002177FD05FFA828 -%002800282128002821280028210053FD0DFFC9C0C1C1C1C0C1C1C1C0C8FF -%FFFF53212827282828272828282728282800A8FD06FFFD04282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827282828272828282728007EFD06FF28282728282827282828 -%272828282128A8FD0CFFC1C09EC1C0C19EC1C0C0C9FFFFA8002821280028 -%212800282128002821227DFD05FFA8280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800227DFD05FFA8280028002821280028212800282128 -%007DFD0BFFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828212828282128282821 -%282828212821A8FD06FF2828212828282128212821282828212828282128 -%282821282828212828282128282821282828212828282128282821282828 -%21282828007EFD06FFFD042821282828212828282128282821FD0BFFC198 -%C19EC198C19EC198CAFFFF7D28002800282128002821280028212800287D -%FD05FFA82800280028002853280028002821280028212800282128002821 -%280028212800282128002821280028212800282121527D00280028210053 -%FD05FFA8280028212800282128002821280028212152FD09FFCFC0C1C1C1 -%C0C1C1C1C0C8FFFFFF532128272828282728282827282828272821A8FD06 -%FF282827FD0428FF7E282128282827282828272828282728282827282828 -%27282828272828282728282827FD0428FF7D2827282828007EFD06FFFD04 -%282728282827282828272828282128A9FD08FFC1C09EC1C0C19EC1C0C0C9 -%FFFFA80028212800282128002821280028212800287DFD05FFA828212800 -%282128A8FF53210028212800282128002821280028212800282128002821 -%280028212800282128002828FFFF7D00280028212177FD05FFCB28002821 -%28002821280028212800282128007DFD07FFCAC1C0C1C0C1C1C1C0C1C1FF -%FFFF53282128282821282828212828282128282800A8FD06FF2128282821 -%2828FFFFFF53282128282821282828212828282128282821282828212828 -%28212828282128282827FFFFFF532828282128007EFD06FF282821282828 -%212828282128282821FD0428FD07FFC998C19EC198C19EC198C8FFFFA828 -%0028002821280028212800282128002800217DFD05FFA828002821280028 -%A8FFFFFF2821002821280028212800282128002821280028212800282128 -%00282128002800A8FFFFFF7700282128002177FD05FFA828002800282128 -%0028212800282128002800217DFD06FFFD04C1C0C1C1C1C0C1CAFFFFA800 -%282728282827282828272828282728282800A8FD06FFFD0428272828FD05 -%FFFD04282728282827282828272828282728282827282828272828282728 -%21A8FD04FF532828282728007EFD06FF2828272828282728282827282828 -%272828280077FD05FFCAC198C1C0C19EC1C0C19FFFFFFF4C282128002821 -%280028212800282128002821217DFD05FFA828002821280028A8FD04FFA9 -%21282128002821280028212800282128002821280028212800282128007E -%FD05FF770028212800227DFD05FFA8280028002821280028212800282128 -%0028212821FD05FFC9C0C1C0C1C1C1C0C1C0C8FFFFA82800282128212821 -%282128212821282128212800A8FD06FF28282128282821FD06FFA8212828 -%2821282828212828282128282821282828212828282128007DFD06FF5328 -%21282828007EFD06FF28282128212821282128212821282128212821227D -%FD04FF9FC09EC198C19EC198C0C9FFFFFF7EA87EA87EA87EA87EA87EA87E -%A87EA87EA87EA8A8FD05FFA828002800280028A8FD06FFA2002821280028 -%2128002821280028212800282128002821280053FD07FF7D002800282100 -%53FD06FFA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA8FFFFFFCFC1 -%C0C1C0C1C1C1C0C1C1FD1FFF282827FD0428FD08FF7E0028272828282728 -%28282728282827282828272828280053FD08FF532827282828007EFD1EFF -%CA98C1C0C19EC1C0C198C8FD1EFFA828212800282128A8FD08FF7D002800 -%28212800282128002821280028212800280028A8FD08FF7D002800282121 -%77FD1BFFA8FFFFC8C0C0C1C1C1C0C1C1C0C8FD1FFF21282828212828FD0A -%FF530028212828282128282821282828212828282128A8FD09FF53282828 -%2128007EFD1EFFC898C198C19EC198C198C9FFFFA8FD1BFFA82800282128 -%0028A8FD09FFA85200280028212800282128002821280028002821FD0AFF -%7700282128002177FD1BFFA8FFFFC1C1C0C1C1C1C0C1C0C1CAFD1FFFFD04 -%28272828FD0CFF4C00282828272828282728282827282828214CFD0AFF53 -%2828282728007EFD1DFFCAC1C0C19EC1C0C19EC1C1FFFFFFA8A9A8FFA8A9 -%A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FF7E28002821280028 -%A8FD0BFFA8280028212800282128002821280028534C21FD0AFF77002821 -%28002853FFA8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8 -%FFA8FFCFC0C1C1C1C0C1C1C1C0C8FFFFFF4C282821282828212828282128 -%2828212828282128282821282828212828282128282821FD0DFFA8280028 -%2828212828282128282853FF2828FD0AFF53282128282821282828212828 -%2821282828212828282128282821282828212828282128A8C8C098C19EC1 -%98C19EC0A0FFFFA800280028002800280028002800280028002800280028 -%0028002800280028212800280028A8FD0DFF7D2100282128002821280022 -%28FFFF4C21FD0AFF7D002800282128002800280028002800280028002800 -%28002800280028002800280028007EC9C0C1C1C1C0C1C1C1C0C9FFFFA228 -%282827282828272828282728282827FD1428FD0FFF7DFD0A28FFFFFF2828 -%FD0AFF53FD1528272828282728282827282828272853C1C09EC1C0C19EC1 -%C0C0C9FFFF7E002821280028212800282128002821280028212821282128 -%212821282128212821282128A8FD0FFF532821282128212827FD04FF5221 -%FD0AFF7D0028212821282128212821282128212821280028212800282128 -%00282128002821280053C8C0C1C0C1C1C1C0C1C0CFFFFF7D222128282821 -%282828212828282128282821282828222828282228282822282828222828 -%FD11FF52282828222828A9FD04FF2828FD0AFF5328282822282828222828 -%28222828282128282821282828212828282128282821FD04289FC19EC198 -%C19EC198C1C9FFFF53002100220021002200210022002100220021002800 -%220028002200220028002821280028A8FD11FF2828212800A8FD05FF4C00 -%FD0AFF770028212800280021002800220028002200220021002200210022 -%00210022002100220028C1C1C1C0C1C1C1C0C1C1FFFFFF7E7D537D537D53 -%7D537D537D537D537D537D537E537D537D537D537D7777FD0728FD08FFA9 -%FD0AFF28282153FD06FF2828FD0AFF53FD062853777D537D537D537D537D -%537D537D537D537D537D537D537D537D537D539EC1C0C19EC1C0C198C1CA -%FFA8FD1DFFA828002822280028A8FD07FF28A8FD09FFA9282252FD06FF4C -%21FD0AFF770028222821227DFD1DFFC1C0C1C1C1C0C1C1C1C0FFFFFFA8FD -%1DFFFD0728FD08FF5328FD0AFFA80053FD06FF2828FD0AFF53FD0528007E -%FD1DFF9EC198C19EC198C19EC1CAFFA9FD1DFFA828212800282128A8FD07 -%FF282228FD09FFA2284CFD05FFA84C22FD0AFF7D00280028212277FD1DFF -%C1C0C1C1C1C0FD04C1FFFFFFA8FD1DFFFD0728FD08FF5328284CFD08FFA9 -%2253FD06FF2828FD0AFF77FD0528007EFD1DFFC0C19EC1C0C19EC1C0C1CA -%FD1FFFA828222821282228A8FD07FF2828222252FD07FF7E2852FD06FF53 -%28FD0AFF7D0028212822227DFD1DFFC1C1C1C0C1C1C1C0C1C1FFFFFFA9FD -%1DFFFD0728FD08FF532228282853FD06FFA80053FD06FF2828FD0AFF53FD -%0528227EFD1DFF98C19EC198C19EC198C1CAFFFF7D284C2852284C285228 -%4C2852284C2852284C2853284C2853284C28532828212822280028A8FD07 -%FF2828212822227DFD05FFA2224CFD06FF4C21FD0AFF7700282228212828 -%532853284C2853284C2853284C2852284C2852284C2852284C2852284CC8 -%C0C1C0C1C1C1C0C1C0CFFFFF532221282128212821282128212821282128 -%212828282228282822FD0A28FD08FF5322FD0528A8FD04FFA92277FD06FF -%2828FD0AFF53FD0728222828282228282822282828212821282128212821 -%28212821282128289FC1C0C19EC1C0C198C1C9FFFF7E0028002821280028 -%21280028212800282128222828282228282822282828222828282228A8FD -%07FF2828222828280028A8FFFFFFA8224CFD06FF4C22FD0AFF7D00282828 -%222828282228282822282828222821280028212800282128002821280028 -%0052C8C0C1C1C1C0C1C1C1BAC9FFFF7D2828282128282821282828212828 -%2821FD1428FD08FF53FD0628224DA9FFFFA92253FD06FF2828FD0AFF77FD -%1528212828282128282821282828212853C2C098C19EC198C19EC0A0FFFF -%A80028212800282128002821280028212800282228222822282228222822 -%28222822282228A8FD07FF28282228222822280053A8FF7E2852FD05FFA8 -%5322FD0AFF7D002822282228222822282228222822282228002821280028 -%21280028212800282128007DC9C0C1C1C1C0C1C1C1C0C9FFFFA828212821 -%282828212828282128282821FD10284D282828FD08FF532828284D282828 -%4D2253FFCB2253FD06FF4C28FD0AFF7728284DFD0E282128282821282828 -%212828282128282821287DC9C098C1C0C19EC1C0C09FFFFFFFFD04282728 -%2828272828282728282827FD0F2822282228A8FD07FFFD04282228282822 -%28007DA82853FD06FF5328FD0AFF7D012822FD04284CFD0A282128282827 -%282828272828282728282821A8FFC1C1C0C1C1C1C0C1C0C1CFFD1EFFA9FD -%0728FD08FF5322FD0A28532277FD06FF2828FD0AFF53FD0528227EFD1DFF -%CAC198C198C19EC198C19ECFFFFFCBFD1BFFA828222822282228A8FD07FF -%282822282228222822282228222852FD06FF4D22FD0AFF7D002822282228 -%7DFD1EFFC2C1C0C1C1C1C0C1C1C1C9FD1FFF28292828282928FD08FF5328 -%4D2828284D2828284D28282277FD06FF284DFD0AFF53FD04284D227EFD1E -%FFC9BAC19EC1C0C19EC1BAC8FFFFA8FD1BFFA828222828282228A8FD07FF -%282822282828222828282228282853FD06FF4D22FD0AFF7D002828282228 -%7DFD1EFFC9C1C0C1C0C1C1C1C0C1C1FD1FFF2828284D282828FD08FF5328 -%28284D2828284D2828284D2853FD06FF4C28FD0AFF7728284D2828017EFD -%1FFF9EC19EC198C19EC198C1CAFFA8FD1BFFA828222822282228A8FD07FF -%FD04282228282822282828222853FD05FFA85328FD0AFF7D012822282822 -%77FD1BFFA8FFFFFFC8C0C1C0C1C1C1C0C1C0C9FFFFA87E7D7E7D7E7D7E7D -%7E7D7E7D7E7D7E7D7E7D7E7DFD07FF2829284D282928FD08FF532829284D -%2829284D2829284D2877FD06FF4D4DFD0AFF7728284D282922A2FD06FF7E -%7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7EA2FD04FFC9C0C0C19EC1C0 -%C19EC0C2FFFFFF00000022002100220021002200210022002100227EFD05 -%FFA8FD0728A8FD07FFFD0E2853FD06FF5328FD0AFF7E22FD05287DFD06FF -%28002200210022002100220021002200210022007EFD05FFC0C1C1C1C0C1 -%C1C1C0C1CFFFFF5300282128282821282828212828282128282800A8FD06 -%FF28292829282928FD08FF53224D2829284D2829284D28292277FD06FF28 -%4DFD0AFF53282829284D227EFD06FF282821282828212828282128282821 -%2828282128FD06FFC298C19EC198C19EC198C9FFFF7D2200280028212800 -%28212800282128002800217DFD05FFA828222828282228A8FD07FF282822 -%282828222828282228282853FD06FF4D22FD0AFF7D0128282822287DFD05 -%FFA82800280028212800282128002821280028212152FD06FFC9C1C1C1C0 -%C1C1C1C0C1C2FFFFFF28282728282827282828272828282728282800A8FD -%06FF284D284D284D28FD08FF53284D284D284D284D284D284D287DFD06FF -%4D4DFD0AFF7729284D284D227EFD06FF2828272828282728282827282828 -%2728282800A8FD07FF9EC1C0C19EC1C0C198C1CAFFFF7D00280028212800 -%28212800282128002821227DFD05FFA828222928282229A8FD07FF4D2828 -%292828282928282829282853FD06FF5328FD0AFF7D0129FD04287DFD05FF -%A828002800282128002821280028212800280028FD08FFC8BAC1C1C1C0C1 -%C1C1BAC9FFFFA8282828212828282128282821282828212821A8FD06FF28 -%29284D282928A2A2A87EA87EA87E532829284D2829284D2829284D28537E -%A87EA87EA828297EA87EA87EA87EA87EA85328284D2829227EFD06FFFD04 -%2821282828212828282128282821287DFD08FFCAC098C19EC198C19EC09F -%FFFFFF4C22212800282128002821280028212800287DFD05FFA829282822 -%292828222822282228222822292828222928282229282822292828012822 -%2822282828012822282228222801282828222928287DFD05FFA828002821 -%2800282128002821280028212821FD0AFFFD04C1C0C1C1C1C0C1C9FFFFA8 -%2128272828282728282827282828272821A8FD06FF2829284D284D284D28 -%4D284D284D284D284D284D284D284D284D284D284D284D284D284D284D28 -%4D284D284D284D284D284D284D284D22A2FD06FFFD042827282828272828 -%2827282828007EFD0AFFCA98C1C0C19EC1C0C198C2FFFFFF530028002821 -%28002821280028212800287DFD05FFA84D28282829282828292828282928 -%282829282828292828282928282829282828292828282928282829282828 -%29282828292828282928287DFD05FFCB2800282128002821280028212800 -%280028A8FD0BFFC2C0C1C1C1C0C1C1C1BACFFFFFA2282828212828282128 -%28282128282800A8FD06FF22292828222928282229282822292828222928 -%282229282822292828222928282229282822292828222928282229282822 -%2928282229017EFD06FF2828212828282128282821282828212877FD0CFF -%C9C098C19EC198C19EC09FFFFFFF28222128002821280028212800280021 -%7DFD05FFA87D537E537D537E537D537E537D537E537D537E537D537E537D -%537E537D537E537D537E537D537E537D537E537D537E537D537E537D5377 -%7EFD05FFA828002800282128002821280028212821FD0EFFFD04C1C0C1C1 -%C1C0C1C9FFFFFF282827282828272828282728282800A8FD44FF28282728 -%28282728282827282828007EFD0EFFCF98C1C0C19EC1C0C198C1CFFFFF7D -%00280028212800282128002821227DFD43FFA82800280028212800282128 -%00280028FD10FFC8BAC1C1C1C0C1C1C1BAC9FFFFFF4C2128212828282128 -%2828212821A8FD44FFFD042821282828212828282128A8FD10FFCAC198C1 -%9EC198C19EC198CFFFFF7D280028002821280028212800287DFD43FFA828 -%00282128002821280028212152FD12FFC9C1C1C1C0C1C1C1C0C1C1FFFFFF -%53FD052827282828272821A8FD44FFFD04282728282827FD0428FD14FF9F -%C0C0C19EC1C0C19EC0C9FFFFFF2822002821280028212800287DFD44FF28 -%0028212800282128002800A8FD15FFC0C1C1C1C0C1C1C1C0C1CAFFFFA921 -%28212828282128282821535353525353535253535352FD0453785378537E -%5377537E5377537E5377537E5377537E5377537E5377537E5377537E5378 -%537E5353525353535253535352535353525328282128282821282828007E -%FD16FFC998C19EC198C19EC198C1FFFFFF7E002800282128002821280028 -%002100280021002800210028002100282229222922282229222822292228 -%222922282229222822292228222922282229222800280021002800210028 -%002100280021002821280028212800280053FD18FFC9C0C1C0C1C1C1C0C1 -%C0C8FFFFFF7D002828282728282827282828272828282728282827282828 -%27FD04284D294D2953294D2853294D2853294D2853294D2853294D285329 -%4D284D282821282828272828282728282827282828272828282728282827 -%282152FD1AFFC8BAC19EC1C0C19EC1BAC9FFFFFF53002821280028212800 -%2821280028212800282128002821280028212800FD04284D2829284D2829 -%284D2829284D2829284D2829282928280028212800282128002821280028 -%21280028212800282128002821280028A8FD1AFFCFC1C0C1C0C1C1C1C0C1 -%C0CFFFFFFF52002828282128282821282828212828282128282821282828 -%2128282821FD042829284D284D294D284D294D284D294D284D2828212828 -%2821282828212828282128282821282828212828282128282821282128A8 -%FD1CFFCAC198C198C19EC198C19ECFFFFFA8280028212800282128002821 -%280028212800282128002821280028212800280028002821280028222822 -%282228002821280028002800282128002821280028212800282128002821 -%28002821280028212800287EFD1EFFCAC1C0C1C1C1C0FD04C1FFFFFFA84C -%002827282828272828282728282827282828272828282728282827282828 -%272828282128282821282828212828282728282827282828272828282728 -%2828272828282728282827282828272828282128A2FD20FFC9C098C1C0C1 -%9EC1C0C09EFFFFFFA8520028002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002800287DFD -%22FFC9C1C0C1C1C1C0FD04C1FFFFFFA95300282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%280028A8FD24FFC9C198C19EC198C19EC09EFFFFFFA85300280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%28212800280028A8FD26FFCAC1C0C1C0C1C1C1C0C1C1CFFFFFFF7D002828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827280053FD29FFCAC1BAC19EC1C0C19EC1C0CAFFFFFF7E2128 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128007DFD2CFFC8C0C1C0C1C1C1C0C1C0C9FD04FF2828212821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%2828A8FD2EFFC998C098C19EC198C198C8CAFFFFFF532800280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%2800282128002821280028212800282128002821280028002128FD31FFCF -%FD04C1C0C1C1C1C0C8CFFFFFFFA853002828282728282827282828272828 -%282728282827282828272828282728282827282828272828282728282827 -%2828282728282827282828272800287EFD34FFA0C0C0C19EC1C0C198C1C9 -%FD04FF7E2722002800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282121 -%007DA8FD36FFC9C1C0C1C0C1C1C1C0C1C1CFFD04FF532800282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%28212828282128282821282828002853A9FD39FFCAC99EC098C19EC198C0 -%98C9CAFFFFFFA87D21210028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002100537EFD -%3EFFC2C1C0C1C0C1C1C1C0C7C9FD05FF7D53002821282828272828282728 -%282827282828272828282728282827282828272828282728282827282828 -%002853A9FD41FFC9C8C0C098C1C0C198C0C1CAFD04FFA8A8522800280028 -%002821280028212800282128002821280028212800282128002821280028 -%21280028287EA8FD45FFCFC8C1BAC1C0C1C0C1C0C8C9FD05FFA87E522821 -%280028282821282828212828282128282821282828212828282128212800 -%28287EA8FD4AFFCAC99FC198C098C198C09FC9CAFD05FFA8A8534C002800 -%210028002800280028002800280028002800220022004C527EA8FD50FFCA -%C9C1C1C0C1C0C1C0C1C2CFFD08FFA87E5353FD06280028212821FD042853 -%537E7EFD58FFC9C9C1C198C0BAC098C1C2CACAFD09FFA8A9A8A87E7E7DA2 -%7EA8A2CBA8FD60FFCFCFC8C8C1C1C0C0BAC1C1C9CAFD78FFCACAA7C9C2C2 -%9FC1C1C8A0CACFFD40FFFF -%%EndData - -endstream endobj 23 0 obj <>stream -%AI12_CompressedDataxœì½×vúȳ0z®g-¿8ƒDNÆD 6Ø`œˆ`‚°$&]|Osžá»:wûÅNw+ %Âoïùï5ãõó`Ԫꮮ®ÔUÝÎv'XÑ* aŽ“ß..Ê Er4“q ¯׋ņåø•çÁëÀ! ¶*^§úBËÅ°3z•AÏBQø”€ï{ÊSfÆr3rå ¨%häux¼ðiwÆ-(ð¼:\ÌÖ,ÕÿcÆMû³!½êGCäÌ+u­h™G"ᆧ±L$å(Þ¢&äêw’egSs4…—èÍj4[MJôŸG ‹9¢‰„#ŽÇ±D>¯Ï(VÛ(ObQØ2O¤b y4”LbqðN -|ˆÅà‹z¸YR+®ÍÐCŠeËô‚f،£üÝ-9OHÇ µXÐ8J r8W¾CÐ+´%6܆!KÝ`"ÿKÙàŽ¢FÔȲ1[Pl¦‘y÷D3svM©÷Ņ–ô„!ÙÙ2´^l&³UhÀh”ï ùG _}G4þc:ã(@g¹xïC `º–$çÀ#hn‹×x¤_ÚÌ£»Ír@™L¤qô}´ÆýȂƒ±ÃÏèûdÿz ¾êP‚1 y¨•”ÔߢÏ[L02sjõá!3ô~ގ¦Ó¡DN^<“`ÚãxŠÿ&–LÂobÂK]j¹^A3™ˆ¦C`Ò0 üV|›‚qò ái -¤CÉ4îH/RQ w€)‡_ˆ/È3Ný>£þÈ8îè%­Èpžñbÿ[xô°YPÌãj§2¾KóT»¥GÔ¼!ƒ $"úÁåßB‹.ÉL(ð+½Øph¥$,`fšä_dA\@ÒZS«.ÝC]M $áƒ5“Žƒ§Ž8@ƒ'$´¸ü[!A8"†$œÍ6˜à3œ•»˜ìטÙHžõdđâ¡a„RŠiñŸÐ[0vŽ£Vb÷Ǖoüƒ…n[ku5*ÓK8 ,ZÞÀ˜jAO„§òè±YŸüövò[4þÙÐň ʑN„ÁòøӞ -W7 íÀ£˜¢Å€d©ðLÓlÅ;ð߁5 ÖÚ  ÈɄb„ÿçááŒ<2^P†×ÃMé Ö\¸3$zž€%„`/¨1nU›ÄyØð }$rJÔTüƒ4؀o¹0µ‘ì4L-Ñÿ8°:©0Ë# -.ŒÕ å_¦©ðˆÒÈIÀéðËhF1`Ĭ#Œ$œ±ðpÃ0Ôjøø#04X–¬l<‘ -‹íÃCzý—“©ål5[×“‘0 ÿlH.V4žþµžR«0¦‚C£Fá%9„Ýd“¢‰onØ0÷ÍnÑf4æ¦ EI‘à G…—À®Ñ0ún4ó  ©Ñl± $°¥7@‡–$;Ü,PR)øðgC2àøqJ.Æ<áKց§#á"âªÈc,*f³ÈÓ·(¾.VÃe¡ á*z=\E/(UÅëUé½k¾Õ5âZÑæZjSå¦á;„€iñ/´øZŠZ|ŸZÒ{Ë͂›­…[ìòÄ£8 GþåGÅˏÒ[/üÃî”f·@1¼¬Æ†I1)Ž‡T¼Mò¨I ‰ÈARá¡HŠâ¡SòË%½7ã[ÍøV3Š™Ô†äXñi¾9-ö‰V¼@ M¤÷F³ßgð žþÕ i£êÏFzç/þ1‡ˆñ—øõÉoÝ*/ -ã7ý. ´€BøGûHÐTWCj׌£¯VØ[úû-¬iÖ¼À âîë ‚dšÛÑe6T÷¯µ¨uâ>èIŸC+ênž¥úm¤ôk ½Y_¯ÆôÉoÞ|ëQC`¢]5r´ßà`„Ý‘Ãé„ú›š §Àp XG |/µÖÁÚkp†rðOÁ»èOðÿ1ü¿÷+ÔX2þÛú{4òn|²”û{I6 ð´ºúZÐkʸÕñD2k;(Ú rE2ô@Ä „븆b…œs³ßK š3 #Ú$ ¯- @˜¬ÕÐK¨›YÅ#[¨Hn -LK X zª60‹›Õd‹bh |{;à;-ôbÆ.%àÊo¤Ï6{ -Ⱥj­ø.3vêèÒôB‚|»Êa=[±ÔBÓk`ñïý£IõÀÅó¢LSˆÅõt6ÔÃÒžg”.2ƒ÷mq×M•ÖΚú{F.t1n¿öC&ð ¨| ; „€i›Î$7œ:š3à°13ÊbµÂÉÏV#ÐÑÎ8r8h(O(–âþ怀âŠð¡xA‡ºF©N‚A`ó9J+¥º©1Pë¯8à®?®Vä葉ð•#€t¿ú,â(!ž;ù­­ÆÀOü$ªÉj -üKƒßiðS¬–пRµŒ~*èþGü'üàèNDÀpˆ(ø”ÿKþwò[áC­#¨E”ˆ¡Ÿ'’à'A¤Àï4ø–~…O)ô©ˆ~—ÀoñðY„'b;á-žÆKx¯‚.à‘H$IDR‘t¤)Gª x4EãQ¤HG‹ÑR´‚Ç"±X,KĒ±T,+Ÿ -ø©ÆwÇâÀm‹Gã±x<žˆ'ã©x:^ña1 4Àà'‰¥°4V?%¬ŒU‘0<‚Gñ8ž€ž3^ýªàÕ‰Fâ¨_r¯¢ W°On´ z„¡%@oŠ±2ßèaü€ÎÄàà5Ð2F€Ç0Hâ(˜`0¦ -€R£+1ÁHSà' ~à ¾p‚Ž| ‹Q,ŠÁI½©F*à§,âÛz ¾‡Þ?Ê7åwÁÛà§~Šè' ~Rà' N~#O€ñÃØuü'âK¥RÉT"OÅ@—#)<…V©&+Ér²”,&ÓÉT2™L$ãÉèX$‰'±‘¨$ʉR¢˜H'R‰d"‘ˆE<çÌ^‰—ã¥xÌ\ -Ì`"GøbŽ‹~‰AK¸Ã±d2…~1hL‚Ñx$‚AO4 Üôð±â1ø Ž¨ñ€kïH@w>…0;`Ýö²ÄÂBÚ¤#\ N)ø€¥Sq~ƒá‰d$>D’©X‡ð8 ø׀Ã<DØ¿REe¢¨2·–£öœžtûW´ý+Úþmÿ}¢-• EŽ.ÜÐcŠ·(ÄqtÇCµ#æL­4}#í_Aö¯ ûWý+ÈþsYTWEÿdÿ -²Ù£ K€ÖǗdêÿQ¦W³ØÀIóÏ`^÷ׂ‚»ÍýÇ -ýåÈÀpãŠ^yá; ý¸k‰v¤çá2½\üb¶€QLøJyJÎV¾ ÿµm5……6î ÷fìl°à–Hv6T@·ø˜£í쾯ˆN¢0£#Ì0aŽ‰ØqZ¥!ԕÙ&9Ì_Ž &Í=PCšQÏ£)ÑôÂá©þÉ1ä{\­á 5ò§˜ø´Ëë2½úb¸ò†åè%ÿ8„ÅáŠZtÁ›]zA1äjH‰®*ñÀTr% EÔoMgÃùŠbÙm”ÀÈò ¤žn÷Czô@-éß©6 úÁCÃ1S›¡†3˜M%ôAêÂíìO᫘v,"pùÛ[òO遧>[ý½Ã}µ Üá -w8¸yëðTfìzAþÅÿ¹ £ˆ6§Ð÷YšGöä70£$á Óa¸Gç1è =§vA-FxՒ—Â|CaåH™7˜ãù/8¯7àÓ7ø[ÇÛ杀‡ð!øÿ§Ǝ¬Pã€eB*í(oŒ63ÎÞÍAÁ±ïDqsÚ@pÇ¡ŒI½^Yªú;µjFÆô21ÚÓ<␼=Ƭ« ÂtP0KäOjˆ’¹ø‡„¾¬wàÉT*­”øÙr½%>æhñ„Ó¸pÇ3 ¿ÙaÖp~ÖÐ~·­¥±uЯÑAøÿ°‚É‚Àúÿ…Š¨3œ®f‡ö(˜½ó¯:úWý«Ž,ÕQ䢎Òø/þÿc«û_ÅÖKû[zGUÿã«øŸbT¦#ÿ®âÿäUüŸ§@ÿ7­âÿi]üÒjD2£}\C8µ¡d‹Àg"™N¤¢è‰ È(†'b"wò%qc_…7««‘"¸i%m“ ŠƒIÿ{{`¿ßÚò2Dç¿!é´ugí!øW’{#áÜ-Xۜ±œzf¶ÇÌ·Ù38ŒcüC> ‚úÄï0í·F„^‹em’#a`<,~þ©Xè‹çÛæ=¢ gž?—‹h$9à» 6Å;” q‘aÈÿV0G¢h7œG•¡VB«ˆà¥‹á/î¯5%<ö¸Vlÿw’a³ -ÏVÙöwr±‘ìAC¸Ë)´zêÿü'0G(;TZÐÃ9 ²Ø “Ø4ðà`†êoq;ƒ<Ó¡¸;4U6?&SNܜ(öH1#~¶µ2ìÌôÿ8#ì.2¿Û °í?ƒáá8‡(Öø¿”E3, .¨CÁ:´Ï©ÿëtèŸÖŸÿ]K™ÿñàïÿIÎ.fÃÿ=bÇÒ¡†EÄ] Ãaÿ1qS[ó.´üGHo‹€á%pËáM)x -€­ñ‰Mÿ”Îw±à_¶Æö×?dXÒù5VÃúӞ(ú‡ KÚ¨4π急ѤÆ,‰­ám¿ô1*´ìÐfH¡ŠþVPvÿˆ~,)ŽsëIܙ³‘3±ÅsŠÖüëXCÿ9Ä -0^­ÏÞ)Ñ>¿/Héi ½.2ÉÇìõlí2M¦ã8pR -Çc¡T$%lð£4Z:°HµD|–ü-ÉÌÅ®_Qâãj6ã;­pD%ýÑ.>_I‡7IÇ9É]x ]úÇÎw§M³38ô8"ÊnñD(ñü'û pyP¼@¹f‹ 7 IfT¡Æäf¡v£ÅIÛ êŠ¤Ö’7*¥K¬ÉÑH‹hI²s™*üwìšæ´íÈÅL”5IQ*ŽÖ³(à…¯†ô‚‘™ªxí(n8Úñ@Â#fSZ¨Åkwˆœç˜¯èáœÞpŽ _unÖvÆÒðL-dž®Åd Uë´cM®)ÆÁΖ›:§M³ÎaR  cO¿ÒH}؀cÈ»&ù£‡&Ìlä`åqÀÔé”!4Gônc»í„¡¤Õo٘‘"H‰x<7nŠ+û`ÙVÙËÆrÐÉvRS1V˟}בɅ«¦²ÍP,ÅüN9ºÔŸ:v€Ì3NddÏÛíŒãÀ²§ÿõÙÍjò±½®0)>ŒÎÖrwÙGX8‡rñÇ¥DV8¬[ŠJ ŠØÄ!Ÿf&®lLõJkí—Z¼„IÙî_“\M6ä„r´éµ‚Óƒq‘Bô)Ž`'™õ(!á晹š±S@ô‚¦‡‡âŽTOˆ)Qfð ù O¡¡ÊÔbQý““•€8ãWÐ6šµGr"‰Sxv ™Žá;u K¯UãàÁ¤b;‚)!ûI)‘Dx€¶ éR©*۔…܎„•ÕÜõjDýÙ¡€*íø1cX+DˆyLfÐè=iHǘx ØAó.AٞödßaÚ! ÝYWÊ-Ì1–dËZ”`ôï³f¤,Eè§*V¿òɌàïè+ǀ\H©•Æhà9š@èÂXޟxj-Åa<üi¦ -Ól^¼&6‹…(o„cOÁSQ”E’‰¤Ù²®)T€éú/éëݶ’ª…¯nÃ֚Ê* 7mLC -.eÙNíVë”aW m ¨ LKN1?»±%\¢ygƒöhA*HjÙÖIQC5I#0»²oIDð˜ÉúWrH<•Ná&m#Rr {“+nææ%)1u2>G,•Òøз>G]±ñ$ÀO§`Žè·~Rį`€åÄ É…•„G§*x߄v¦ yúªY²˜Ññ˜¥$ádÈôP딁“ÎIse¾öT*jØ‚Uu&Pá¸T@#Æ4¨Ã3ýè•jjcñT҈!4²JWz¹É¢L'Öfkؤ"ƒE£Ñ0Ì"±Pl á£>¯IÞ°$ˁᑞí -³Î€`PYº"—©ÚV— - EnP™Â…@x|ꖏ£jö4 §Û eãVÕº³.Cç=?@Q&¿‘…íå $Ï¹•¡$PªÒ­h$øRõµØOòM$DODá‚DÀÙ5s;ÔâzÆPî¡Ü“G®4Ä2ÔýeA÷?¨tÿVۖÀ»CNW5ëÊ,ž”ý<¾ OÖ0Ö¦£¤5STm[ZãÇÁpGµÝفb°µÉx˜6iÆ7¶&šºÕøF6É&@Ü2•±‹-[•ŽÙ -Ù0b$EÔ,–œLë°,ӃÐø ð?µÛjQ“‹…E3v>[À@ça¦mÇðµ?°‹ŒEÓ!½XÈ>…gÛå×¾ †&v–øŽbKSK@ŠßÐx–¡RÙ&ÅÕY&=†Ã£(uHr«»,·øðêµD8 ’À÷„A^;/­GKðx±²ß¯õÈ>x>íB~Eoþ×kFhgÒØHè€h…¤ã!iÓSÛT¹ƒ™Æ{ʨ¡j+0JBœÁ›BðtQe…ҍ9ZŒóÄSqKЌ¢#),’kÞôÛó[FâTT6Ìpêè2Ôl$+ Ôl5£Î|† °•Jún#jÉiÜJEK`´Ò˜5§m·Å¨ -×Zˆ—ÅÎ&+=ý¯++Â>—)LÔVv’ì`Æ-ɵ} §ž˜í±/˜\¹M†|©%Œï› 6•”Ï^"j¼ˆnsfÖ;¼]D'ü©m9ÚyJ3‹‹Á ÙZØ1e „x2gF¡‘˜€¦0wµÍXèùIÐ,þn1Rv¸^ ÿ2c|£áj+Z§mÄoA¹Åa0J0e rmƒBC³¬'ËyˆZÁÜ(Sq ›±Rå€%/£ö¼|W,;/UÀÁh±3Šªã­¶@âAcM#¨ô;h=Â!C¯­Ú@»jl«vü½ŒÕZáñ­–É°fS*ÈH¥R²ÑšSŽËª±R)éë#Øݏ£é‰ÖrOl4VöDoeW\h´°ˆ|£53¦W¦â¶c3,…Fôf‹Ãý23–A“Á Zf“ΆVԄT윴nyü† ^ZY@[àC–b?úÌÀ†Ø)9‚×O˜ƒzFT¤3šfI=mðç:¤Ž“G1=¼ Ãh÷àÐ^Ÿ^ÓÉVSƒ†‚ÊTăôæVnȇ™,š.ffÒ´€1QRíç´¤×C3‰ƒZ°fӏZŒ6ú¾»á¦«‚…y<3ֆ2AÍƛÕЌkøFBØ@â ‚^"W+)¯Aß=FÍ,½áRikyÊ4ðUG¢U{(FӎwÏu§åÀ#‰X2ÉD0,öîµð—À*Tڎzæ(h:Õ¦”^#qOj¸üËÌ#W´¤¹©¥GΛ«zkÆJg¨’]Õ^WŒªÀoXªBKðO}G¾(¾©tå•á¸¼7ߞýI-Ú3¦†œR€ˆ;ÿ|¼K Áˆ6¡o8ºA1ÚQ p‘e%ÄçíÁ˜òd¬‹¿ÝÏv”HqWeðØ#0™±v…è‹kÂdYCƄMá¹5k«–8l‰.,ÉƨAP[)¸i£-ê)àX3y%¶%H–{¢pƒV -vÌ(ÖåÈVŠC¤(”,GRÃ[‡j¶„÷ªÌ†SxÇ xH1ÊKCƒð -O¸ É:–`…ž£årô(æj5 :8@ÀRŽªtÀžKO<vý_ÿ/,垭”Hôˆÿ¢_‚Eö½á€äŸ0äréø¼ýwÈQ -9®W¡½&Ðs èËÿú¿Ã)ü€`À W“ÿúÿÜlB‰½bÿþƒÎQ¾+›Õ€šÍ3渐9›‰,ЙÙÚJЫæïÁÂ"—™ˆ7\‹Œ™Ó+¶~ &0±ÓÔýQu£¤TÖÍ»¦nØÞ*ymîىM»Ìl©ì±)™EVµÝÛ¦ìPéZÊ»åšö‹Ooù›dÇ™dmz1“Âú6¸ØÛ[zE§ ½Êù_†¶­îÌ(.Ø&ŠÕǖÉ5Ÿ&8£ìÐXèÿõj¡t Å ^´Þ=Öµc$ч•=àñ?hf^²2iÄ7²ÿK±•{¿!›ÄN™ý|D}_H%Ü÷œ-½én̤¼5³ùAhùඦg7*+GÌt¤°·r?ѝÀÅ-9Ü -+LKg;©¢û8P’rãÙfŸ¡ÍP…²OXM‚o”¤7¥ä·Ý§Ünjš=]Ãó.Q»K]~ÏG¿Bðʪ,ù¨¢'\š‰^p±S¾¾NÅ+z»j¹Þü¹§Kw–|ÜD]­`©ÀԖÓÌdå¼!œ»<#Cìyâ±^Mœe -µümì*Ó|wߘÍ0IT#·© <;Ã0¶ò]™°óBö3ä+äk¶À6"a€¦m:±Õ WšÔ\Œê”g—ùa%rO¶p5G/a²B\d’¯5®òýQŠ½Å%Ýd‹×nêÏ'Î6D%vþTú^¸ŸšÊ»èB;O¦ÇÉÞýÛ{±[õŒ±*Ûe> -¹9ñQÈ°¡¥¿¸ØžÚh Ð z_`Þ+㏧diQXoF¥Åŕ;Èøß7ÅfÇõà-do¦Q€&‘í}Š«¡{鿼͆“Ë÷ËY2fÇÑ"3¼Æýó .VnØ \ÒM%Ÿ¢Ø(3+‡I0Éøí¥' J‹d{ɏá¥yQ(_çΞªtâU¹~Kœå“eúӟëÞ2‘ÁÙ‚›_]€!å¾38-o‰§Äý -’*_š{AA{£&†œÝVÂdÎE8ý¯ D“€>Ô Á§×1ô‡?Oä„O¹§jƒo_T¿xh‘—È5ààg̟ÏW‘ÊÕäRôt™ËŽ¾ï>ÑlJ=ðZ¥¸ˆ´*ÝH]ø»€{.`+*†¾‹;K•>"71W±Äkâ{XìV¾ý•q¸ñS%I÷y)1x¼O·/ž‹­r©]wf?…ŸÌ )Å^º}ž ¯‰Ñkµû{¥Øs±ET¾ŸúåÙw"œ//&Dyìà ó_ÉäȖ¦:?ËF±Õô5ˆŠwÔà©#Қ_¸uèÞÕ#ø!å)²ír§Åî ·Ùœ†¸ -Jˆ“ñÌ8EP°‚Ze˜ä]}]L"_¹« -F¼¢ˆr_9¢xÄð—èô§v¾ÔÄUN®8<û\MÙ ¢’T7ÍZ±ƒ#¾Éù×Ù/Â3n„ŠX®ûñžæøž¨)’Ø<¤)ÂãZ{ËÓÄüêo†™_Á:x¡‘°éTGQ `u-]`pgÞòdZe“ÙáãC1ùyÒÎC»¾è©€ŸÖªÁÀ ­7-é9Õ(4ÅîíÈ„M>])5_æzýEMíj/É1X<ðjZìv›}¸6ám/²D%þñçk_ðÈ7yh`\Ã1Q­Ä“¥D°ÕC²'„×{„µþZûJßÜhYZ¬zt±;}>0~ Àº ï"„+˜|+>Œ§nðڇ«”ð7§‚èôVÆîzô—žò"±Ú{®‹`h|t£Darù åýWe›>/†¬º«øÐ}[¤¾Á’n²^€häô –+Í=ë‘«á…¨}ð‘J²Ý¢Ý86ØT=—?O²æÑ<… íá’ÐAª³Õ õåÏ^³c ¿‡gñ¾Y¼;_7eáiºøUÈÕË!Ðä«äAÓUÂ_7ýbgӍÉOQc(ÓÀ7Ë3̸ø)S.Ô@+wÕ*¯’Éy†Ý̯°†gM€_£ÖÀGEìæå2Íâx¯À'R|?Á z }}Ã=@øÀð<ç/ñâdAü¢‘á"4ükð7Ý~áßeԄGó]€—„~¼]© åîU=yË+Ÿz>!þeU&ìŽԨģ‘‡+¶âAÎG•­¾É=燆 ÿô–:»¯ç·"……§Ñ.;¢‚+Rÿ†kåø7oæoE% ܛh‰£– ƒðß¼ºï YRŽ_W•í呈Á“Oâõœ+¸D$š@ çÂN³º5¥¯Î¦Èxê. -,`·oBw”4ß"8ß;À Í·q[n‚æFšsy4±…þimŠF»8d‚c75<©C*¥ „¸?Ÿh„*×ßIRC9þÅU2toÑì[ Àö`™j;cäËð$Í'>iÔJ‹ÄäMãsÈÆ­¢«T«R›_P`Ýç`Xe>¸ÚútNû³±;5ܦo”s#¬Å΢àïN~|øpՊiÁMîú(@¯yÌ"èyŸ•§ïÎ èt¿/²ÀG 8Ô(ÍoýÀûicâh A3Ðù,Í#—Nù™ÄöXf´\`pªnTz¢Däªï!i¹%‰ÏßQ]m¾"éeŠg®Àyø  I%‡Í›Ò}»ÐŽx_–wBW7/Åû»Nºú⃧ï¨À´ KÎ7ƒ6Ö\‡5¶E1æ¨=쇣ْ(0Ìô!3·OWC»Ê~ADzŒÓåkðÖºT/Å6% <²NÕ<¼}ÓÙFPzЍý„fEð´(0§7uÂç Ä ºž€c­€ºz ˆ¾×9…ÍrƒÏUáéÞïÊLýPˆéoÄî -Y½B©+7ŒïKÃ4‚vVó|Si%« Õßí,ãH¢èT¢jC%½½’£rüS^ÉzËXѸŒJË3v–¨ŒƒoÀ«þ”h< V@Vç:zÝOu]ç¢æz©ŒÉJ‹Ôy rãñzd“G°-&s¸nflú4;>ïL•f“€5Ôê[õûc¥¾ƒóµî—> ½sŽ“P7Á4Oœ ®I<”âÝPP~À³€Û‰]¿Õr Iå¢xñí÷xœ™¹ïo­(•—ºOopªvqöƒ~{—›ˆJZÕªçKÞ ³-  ,õ靣x^æn’Uô+Äd/vâÄGmÉùÜ°Ý7/lԌěg,Ð-·SÞ&¹J<×Êwåޕdð ¼Äï©0Î7`Rÿ<€™.ü(ÌF-° ðÓmÊhŒ[aB`¡6‰K⧞«,šqÙ@æòóÌYw¾èòìô<ø;Ö*®ò״Δ†yÆkÑÃuúvÆáºieªB¶´VšåBßržLo „.“£»Ê8ý®¾RœKCÒô7ãî[àó¥HO[> ¿@[@ £oÞåîƒn]]+Ø(™ˆêqIz^¬v‹Éô²'û•ñ=ÛàE†ÐÙ:RkåâDŽ(&õóKüº˜ϋšVB“¢ï»Ðë^“D®Â)ºäòÙi!óDM -©5ÓW„HUhª¯Mà¥öT3\ñòöŸÜ%W[Ü.ýùd­^øy;HS…$ôhYeáÖÁ=à‘oW¡7înÀó‰›M%ô0 -2wßs…å~u§Äª,l Iëö§i––@ª6V:÷"<¥>¿Dr ½@‘zkS©²l%0 ª9ïùÅ#àȗŸÒ²•o3Íý)Ðhó×Ò<‹{€Ä‹]®Fú¦Ë/Kñšýøª]ÎF9ûä*cš éðmèщn:=åñUt{}$aLø¢¦qþü=Ã"ñù´RË_PÀîH'øˆð°÷ÊJp³„çzôÐw(-ž+Tî:¿V`F}o*ÎdŸ€¥TûFë/E7~5/äòë3墭#ðiVÀÀØÀk"ÿ«ãÁÆ=¸ j‚úùIDºÓô”Ô)Ñ\U‡ñ@ yuèå.&;·˜‡—v‘.Ž·Ä?DHßH!¶ax€Q…M2·þè[±Ûu9m-Y3îhT @ÚÀ8°œ»«"¹"îk}aÕá ¯êë±q€†¶^‚g¨ÚKa¶5‘Éῼy•½º7´éÕ$>J‹dáyÂFkîx$}(:2ÁqŽ‘ƪŒUÜÖ½Xi±Xiý|µGûžËÙ :Àrn¥‘-€LðŠ ’‚{%gp +>ÐM®hýŒDj¾‘z.ë„ÆUž&> §uN†¨¦ê“ü©?4‘;/].àà'Ô&’Æ*¸ò»ÒcÁ¿‘ ìSÕßrû ?ƒzzDl—¿ë±qP!SÔO…Ü‚ðò -èZh“ÖòOù®šþâLž}M˲ éÒsï}î Œª‡gg™œ`ˆþ"œ3±($Ÿ'ÕbªÆrpƒ>Hxn‚½2þ¸d³TƵ£~ð*Qç–‚yy5¤¶D禘¬' -%Äïë=YF eÇŠÑ -bÚW +ސ"5ˆs?xº,ñA&…bMwdÍÆ ä#b@/á°ÑS)¹Ûb'Ps3ñ­4 ZnNûÅT0t -˜Š “ý´¢J±ùh”è=~ôRÉ«r½<}B/촐»~VÜ©´Ÿ­}-K®j!ûñÌÑä½Ú‘ÀÏý×9PÃãuñaR‰dò¹ÀzŸO+›èG±sVZëIW1¹ ýšìö7+Ю|Y™Ä§¹Àæ}¥@þÇWn’ï‡ÈC)%Y%‰)QB 2|Ž¶ËYHžVP’èÉG9ÙѹÚúü3(» Mf4v3Ò×.-‚x·öüú¼sÕäøßäîs°!¾>6S˜âFÎSpèƶæãH4#À†>©ô@X &¬$êT ?#K¤ù *¸=`×~n _.€ˆ»ß¨Ÿ>»É."dHÁô¼ð݃_>©ÂœÒ_O@g­1¶ˆåî֊@*¢WɝëV|³ð0xi”Š©À5œ×Lc*ÍA õÅ L¿*°±JÃb«Q‡û¹“HŒˆªO÷§@WPoYò‰þ®„«ßÀ4KÓ³êç3 -?ñ|Ñiÿ•xl½} ¦I¼'¼\–®ÞxéÖë%W×÷~M ›÷î-pK¸WŸ¿Vƒ/©I)ö *X`ö˜»֗øiW—Àƒöï+‡«JP|—ÙAf~Yù˜½œ!v|O äþ´4‚½/O £`åzQ~ҘXäþýŒð4J©bû5@Ëã×ØJ11ƒnj¼:èV㲘T¡~…öD}„"Ýb0å5Â/(§H–ýb<­J~}Š«+g›øò|Dà¢x¯Ü8ǘ¢ƒðþgöºUHdž`4!؎€á¹qƒM ñçÞù ¿”ýÈœ}ØʆŠ§ûþê­?  ?ÖR—­óuíѵ>O?VßÎӓ't¬ú¡Ïbw:ä`ÿOþDªŒŒÀÍ-TÞÃÂ*!R¬)IÅäCœ5Íù§â]÷"Ø£™ 9 àÙ 4ßP{(š†þÑ^òwêv³àfëUÜ:“i»€NqW£æ–@˜¯È_+ŇðúXð@ù•~J¢?ÿJú¯zƒ0ößýWS. -?Eb¹ûLTzp/}B²Ñ«.W¦Km^?{¸$¡ó‘—žFü—‰©ÓSg#Î`1úÐ8ƒa÷Ósþ:p^PxÑé†.ÁÎÕ8m¦þ|Í銱Ñó{„?vÕúÊcõ¯›+Ø»o—RLiSõß6Ÿ*kgG|Z™‡Âl¼žþêÖ ¨¬>•¨‡B˜ä2íÛtåµr5Í^á©PÉ»tuÊ׋JõíËOâÀ´Yŝe`u‡Á¡à Ÿ{Ýýq¦ßu8š g ?zs"D<ÿ|w¹¾Ø}püÜãËn&½XåŒ -\W™w&U¬'èW/U9mª•+_#ž}mÜ.ráŸ2\†V ®ô=ÄØH3¡7›0 ,Mìïùv«&Ë0Y¶Ë¼¿®±p¬ãQ¤O•ÙÁõ"Ÿô܅\8¢kKÊ|`l ÀSa¦#ì­8¸T-–úÉ~ƒ?k ðúKEõù¸}¿×ÇZK~Æ3ן!«j4Ìçù]ÓkbÖ¨]ècÍ9= ‹_0úXÛ8ÜŠF2>½á²îÀmÐk|ê!Ý/U}¬±—gŒÀ|·2V>cXD|JŒç@¼ßéaňîSÅkâì¢Ý)°Âå‰ÕÎ^u‡{Z Ü׃гîÔ¾“ kÛíÖP8šå#„päÚeê©}a>"7w«w{jCo±ËÛ²`Ñ[ õ™# ±4ñE딓«±’̧ë¢g€•&VîDT+[üˆÊXáܨ×côÛ ­5wêaÝI£‡•Ù|á^ÏÕۇVd—¥«yƒá&ÎÎ;=&«5öòõݱžlöbîuVH4 CÕ›;C¬njRhŒÕfØuûbõi°4lêžð]% Î[€8¹Öbm&K/֗ Gƒ5ÑiÎ{<ÖêûœPõµ€5ߪq„qšf¸õ69?»Oèb½õ13C¬…y¿\Ôà -ÐÄo^¬“¡X½á²§à{cD8]¬þUÖëÝ{ý¦„°Âíԭᾕ±žû9¥µy¶éL£”.Ö^§õ°B ?Öµ…‘ßXo-`½òö>Ÿ¾ŠºXŸ®>„©µíáöûEîÉë{ ûhu½úXïZ“ïçJΧÁ**iìƒ ÝyÙö»ž°Xÿþ'§µUð2oE2´îp«ßÁ„ÖTÝùt‡5y¬ä)WS/ž+fóôƒXý2Vˆ†—P­³¬÷s³ì¬—Œë—ïá\À:Oû4šÇ…ÝÞÅֈ;ï©«±†vrƒòâඬh†œïg `-°[rñNóX¯<Հ†ÂÎ"ÑróX?¸Ì ŠÐðDö>ú³õˈ5¼-ñ`²éúX‰+3»ò -X3÷!õX돥 WŽ7 j‹èÕc³©îÙ¼µ!VlKÜ¥]§ÏÜý5ÀْÕLq°zô_DsòS•’f˜RÊýòØ|¿Ñ}}C:sØõ»Ÿ3xêÎã$Û>Ó{ -Eç)Aœ¥ó -l°Í”õÁ*‘$ÎqøÔ¿ýtºu›ÞÓ“l}ÔãAé¶FÒ*Ÿ®Ÿ#I¼ÀvYrޒ -Ñ©õÆÛ×ÈâÎ@åáÉè}v ÚuzÞ¼ø© ÜÐyÙlô‰ô “q·¶ƒ¦º¢i댲ò´ué´ÑŽÙôç¢LãE¸*ž¤\Äàõ€Ç_¢Ù;~íOeh^#ڈĕÖ~­õÈ|~]a×ÂÜx$ uccårn»€¬t¿•…N%|ʯ=£®VFü¥ð”ª\À_gƒÊ[0ˆ‹ô譂ûJßlåaÈ¡©|¾z¡øÄdY²Ä5A½{ØO˜•*¶Æ,w»‰_\ _#T~ˆÐ±–4†Š??ˆÖ4T¾öØF¦ú— ÚëŸu·Xó>Á-ÓúœTŠ“j\\žð͍5áѯ¥ë®3Â+¼Ñ}O½A -#D¿ÈçŠì#éÍaôª×½5ŸC$¡·ßð.“&^ʏ0ë;d¥è ?µÎj7zsD­§àyAI[°½!½°±ûçِ¿dæR0´1Ñ8yî®[­ 3Ò#†¨>Ö -ª X é•scI/z ¬´R¨ú^^+1ˆã‡DÛqF>«xõƒ­I0¢ú4¬5\‚±¦¿<«ï-N¯GRw¨À_oÊPíùªÐÏn¨—§RŽë.O¯áà¢çÙFÓ|phyªÆ·=¸÷3ÓÁ!Z»øµdÔÈiÙ4ÐOò¸¼.4.}ž ¬ÕZC;¤“ßt§l{H•ŠÝ¥õ¨bwŒj‡\jC¾¥ä´*@óþs0m°qÆóªGh Ý}/1O@bh¿ ´rèÍÈ Ð¥QҚ8ˆÐÚHž6mŒZ»ú„8´º¿$!µ2àÑ@5Àÿæ ×ÛÛ»‡Šû5ámh³Y…¿‘ˆ¢ß: BžÞ↠žÒþK^­iú–ù1è[ä'RzMßè3Pòh¬3y†e¢i¦ežZk¦¼þȘ*=c)¤Þ#ík6„¦Ú²&·LIÅ j²ˆ•Á¾“šÖ®ÒL2èþÀiN/8°aŸ$‡Þ§†Ý’Í<{}šž™hς¼~­•IM¶õô­þÆmÑÊÖ³7‡hÝÌSŒ¤½‚ƃ¹Éª”<7»B³rKT xacMe^J4+ƒo‡aªÅî¡DSK·Ý‰&DÂv‹”ž_‚jﶗLՆå,›Í²èÔô—Ë[…­«¿&uy& ešl}oÔû!ËsR|lJÜémÈiܕ}wÚ¨;æÒB¶ÓÌ Tk/íÆŒG“gõ$ĎS¥ò5=úƺ3¨'VòÀ¬'‚ÕYß²:w% ꉞ‰¦ç?¢^]UzîÇvsáÖ¨Òê\«²§2hÃýA™«ä©p»aÂ[–Í5t„k;Hý…5…Ò3ºìvk«OöD@cip}_, -ä­OÕµ'áµ#¼ÊÜßjF(mWÂW8+ëAŹ¥ù`§øqFÈ{Ò/ë]¤F®û÷56ÆO_ô8‚w -w¤—áb×_éb”>½âÐK½Ò/9A­©;~³±áœ[Ç¢nä•nL1 :úܼ;²q‚÷fö}ô<# -V®³E WP7Zû~¯Áy çÆ:"PZ£©w„(¤Àò£ØùӁCºÙèõ4Æ­e(zžþ‰ÙàC a¶ô ¤MŸÙ%\bÛԑb;æ ­ -ª„Ú̆©Ð˜ÚÌnhÌlE0ÅÄÒ֟‡Ìý™]òI›^Û¬Õ0ÛÖÚ²’Íô⺵§J5„{-­d8¸c¬›†V+îÂÎÜ;Õ -ÑN[ËîWQ½!‰{¶‡¤ÕöD*ç͖Vî! -a4áEE¢²‘ò30s!’võ’˜Ÿ&$ê*?¯Ç¯N -ãzîhý\ÓÕ§LQÜ6òHÞ}wC3j´j·WM4 ¹úƒÐÂ6׍u”BÎ ¡Ë€ª…́a|4sJ(X6ûR;›fPŒwØ }–â6”÷ɲ9 •"Ú:¿¬‘C¤›¤Ö€Ái,’v”nì\»k$'Y캡EŽ`@Á’±Î顋÷I·#HGÒMà4k@‡I7ޓF€ÞÅEPúºÛo‚·VÀ(î1,ð’*f0iYÌÐÏF;¢ìQF9T¶‹ÀBgÜÀMÎû49c†¹{dt=÷´‘µ=vøÁ”*ÃÝî Ch¦Wë´º/k zG-Æî}K-ƒTß+~›ÂÆPp§î(Y@è ¬ - JØæF¾% ã$CA›ÅÖë@Û1N¨VŽš¬¡/o@G?>ídýë)G9ÊdÚáÖ?pÁtó TN¡mý éº˜†ÊÑ,r ¡a‘§ÔùÔړ˜-µö´“õo¢ÖžŽbý?*Ç­l;k@úúÑ\9 òô6²“~4WŽhcå²ÐèÇ­œ{©N:ãFÊQŒ ˜§fÉ©†òtìÓÐeEEK -‚Ê+Ó ¶} [So‘ì@h¶V¦ #€Š[†L%¯šh+㕾½‹kê2=یyk·aµNaŸ1‹yï”ü‡ú$¬VŠ3¬PÒQS/²š²‡6t㬉šSãø幕§C‚m -ÿ.‹l;4)=Ï͝'»©½ÔϹÉÜì”Ç¡qZË~0åÅVÚ`WAËÐÖV¦¯ÍÀî(‡ÂšL_ eÒdX¯[Ú>™D“•l¡ÜaWÑKÉVŸˆ®ƒPuNÎÃyž#Ӂ5zMg0ì£Z>€æ8å|æµ|‚q{x9Ÿy-ß :æå|æµ|'êÒÅýËùÌkùšã”ó™×òhJ÷.ç3¯åƒ¶ÀQÊùÌkùN¶J÷,ç3¯å;A¥‹G(ç3¯å;Šý.ç3¯å·¾.ç3¯åãݨ=ÊùÔ ÐƕHk­Ã®ï+ >ã:°‚ynۙ` Øèc•+~9ðZ„·ŠUþŒÝ€TÛ¥M=Ý?@ HÕ¶¿n¾SØvç¯Û •L§“í2ŸíT6ŸÍz@¿aŸ w -M v¡nŊuŸý†,׍]Âkkˆtútb»Ó"lfÒ' vÔ6ô.õ{;‰4š—sh¨jž_"ìFÙL1ù¬î¹Á'{Òrû—àéáƒSÛõ†é<–ew;å—Äv4ëϗÖ²r£,Ëîìå—ð±Nژlïॠ½¶Y(¦Màۚ_mV|–ªiÙ¦ü"OŸ“&DßÓ¦sLÈu¯6·²½Æš$ +*w´Èy4 lÚÔ±FÿvDeTC -ꔑý‹{ŒP•ÇÙ«G{ãÌmŒj -ÍNWØAΎjòš3¬¿,ǸŒkäòÜՍAŸ”f¶Ì{Ð-ãÌ{iúLçPÞ¿™§Ï­Ô°í9TG=õ*òí.ԚuMŽ”î6ƒfqPƒŽ [5ó*]‡¹•ÉÑ,*vv$šñNÊ>DÛ:°ahêxq’Ñ$Q%XÇð/&uÃò)y#_Zö†0¬Š(Mð{k“º¥?ØÅù_²š»Ò]ä:9·ÖþàVDØÄ4:É"Rz9uíc»ý¥‹+O·Y¬Kö¶gI›A<©k7VŒ5ã²?RÀš"Æ;•†äЄ»Í -öôô‘=S×,÷ÝólÎìZ˜‘vR[˜×z•ºŠ`ŠŽ…i\›µÚ¥@_:êØ¢VÏZ—em%'ím§>YTÙª¢V¤âKÚX%ø›U©,H Ä‰*jCº°‘ ée¥—UšŽCzÝ8J…äÕ#nž‚ ë9ègt5öŒé eéšgÛÜ¥×— -.#F]7?ö Î:ܐ4=ùÌf‰ŸE^–drX•ø–0Ï«5Xâg§³,fUH/lªÇÐöÒê3·fC|çÑÍ÷RfBÚÛ1Ý«2oÛ[CÅyǮ̳N»>Jež-N;¼2OH†Õç»2oÇdØ}+ó´.®PœwìÊ<µ³c•ºýÊ<«T«#Uæ)ÒG ëDŽP™§È¼WçÙTf¶+óLæ昕yz;…öö…`ÐÅö.߉yÝaÎF¶S/‘öÔ¡¼êåVâŞRàqÏêmÂe>ÂѪŠ*\¶çf1¤q±M¡Ålx@‡ÀC‹QíF©vyvJ±~4—k3ïm¥XëlÂZ:³MÚ±HÖÆz“±oY–2ÖY>Þ)ÇTϹ³L3\Õ÷;®¦: ù§qÈ5‚:9Pû2? Ǧ‹‹í²Õtøz„P¶•£&fcÓðç¡©Ï;6=΍—i&m8B¿&俳4³Un·ÒÅÝ®ƒ:¼Höýç˜E²Ú‹dߎS$‹ŸÆ6¡*±€ŠQÂ¥% Ý„¨~”²8nÀfw°£ÉZt-ÙÐÖG䠅br¬eþ’`ª«ÖcÆØZÅdØNíêò ÖãaEy[jÍN®z˜vŠòNlv}pQžfyfý–ø©r.,N¿XÀ¬ÄïGÂID;Và‚Ú>q_ËfÀªP¶Ø™8Ù:þC=¡a[¼&ɰⰏ)‚)&ê–®€%~FlÁë›é®B¸èž¿JO—«UÊ'Çoãdå•èušB˜+5«Ìçeÿ²[™ãåRøæ©rFÝt*WþN÷’þò'À§Z´s—‰çwbqçO+¼rBQbEº·]‡–º»’Îè:£.»;ë½´•Ñ.U)Z>S~{1*»{6+öƒ7â†XÑeäXgð&ò£+ô¬ŠýÖQc¬ð&rC¬ð&ò‰\v¢½§ÐkRv׎GXÕuhèvn «ö -=€Þ º0(€óšûdÈ+F4rò¼nû%Î.bw•/£²»¾YÙÝyÂ+µû³Wƒá¦ê­Ù-i„õÁ„ÂwžŒõd«Ø«V õԞó*ˆŸ„¢Àï2l«]´ŒiJI šb_¾LÑF;†æª²2£~‰Ia»íEì։ʔÍRý­ò{·[@Ú¸W½ËT±ºçÀR…‹J¿´qµ½;жOL7Ïè2..*[d®jöÏ £ƒû_¯·Ý§æF“àŒëõô¦o‡°ÝÖ©m;gjÄmYœ—®Î4¹ÛM™­­Ÿ;¸ïÍz†#T˜fwáY]´b5B!x_±‘«m³ü”¶sNJ]Â[åhÛ_7´Õõz зò©œÂãöéUõí³±(ìÓóŒÃv{öéUõ™ÙÐ{öé9-|€ø¨…}™Ç.ìÓcŸÅ鋊•cöípF×!…}jBòU}ÆÛ«{öé)'1}ÄÂ>½>iólŽPاWÕ'.Ï=-W½Â>½9<á39faŸ(åfñ‘ -ûôªú *V)ì;ˆhö ûìí…}zU}ûÍ¢°O¯ªoÛN;¸°OÏ&=Ñ«ú>¬°O¯ªO£¤Qا·Ù"ùžÇ+ìÛðrê²rq÷(ìӛk󍕽 -ûôªú¬ôÍ…}&¾ç1 û4ä°SP¶OaŸÞN4''Ù«°[øˆ’L»òTí%ÅìÄÂî0,TSé駌\Û° -ìö y¡»RQËX)lŒ\&Óe—7j ¡“ؤì"~°ºÿoÿâ9áò?³<»öºËÿN¶ïX1˜‚ƒ.ÿ“¢¦÷ÿÙ¯Á4ȹØ-zïËÿ4û7÷ÿíV*¥sùß>AÈ=.ÿ3B*ïÿÛ£^JBhlÜÿ·gIôêÑvø]ëÆñj<®2÷¶ -rM‹›Ä½50¾ŒçÀª›uÃ0¿CpiYÓgœÀg?»»qðµBAßv¦±^Œe½£Iíò8H›C -rՏ‚qmÅÐIjڒ¦ör»¤©½”5Ÿ07ÊÏHóÁº¹Ù´J‰ï5Õªs¼T«ŽÝT+‹LêöÒV–•BLïÁ;)Šlʲ€M@6u ™‹ËÚy)êA9QûíQi¯fxH¢FtÚ¬öÕ9~|wi¬¸Ov;ÞB+›×ÎèÚ}IäZÄV6ºB™Ró›‚å -&§Nê:›f%ÀŠójS¶Áw~Ë}O{ÁBX‚ef×Û.ŒéÑvÍ £t ´c]îØ£åŠC¤;·uݒB̬ïP/A X²€M@»Í'¶ŠËå˜÷ìŽàß @ꢎ/#Ò,M Ł›ÅÐ&óm•P¸¬ cl®ÇÝîý3ÌL¯þ;FIªÂ;Úz4¹÷oSý{ÿN4…˜[Wÿí±Œt’6öqq÷¸÷Ï@­ÉWÿ:®­Ú¨Ý.ëÛíÞ?QØجÝØëÞ?ÛÇ·Ãܗƒh(É´³@ ª¯­Ï=ў¢h¿Ú—<œÙuTƒ)€æG¨ö}ÿA¥¾êݨ}Y¿ldtA@TûÊ2 :¼ÚB1=Ûn·êû'óê{½B* 6[Aõø¼{Ì ÏŽÞø$œ] ©ú ͵TVÕrÞý‰âÜA›©;ÚÎÞ½Éò|¶߶SH…ˆ¶S-•iIfÈÐÏ×ó=j©Ü—=c1mn1ê„`·l²…=‹± -"í©1Ë!Ë«ÒmYŒ/²Å(™‡Ôݖž§º²ÈBáDçÌ{“Ê4 ¿ÉpÇGonÊ![…ì6NÕ öª¾íÔÝjz6܍²uà~—ajrnÑ݁Ǻ óE“œubZŽmf»ÉË ý B±Ü‚sÃ0Wø_0ؽJ¾T^‰—nåµÊŠõD÷¦\ - ËåR¸óE;kQ],Ô½bQêò­³ÇõâMU{3®ÌKÝgÚJ†RUæù³Ã–n= @Ã_Mw‘sÒF%ÚBDUÜ(lˆ#º¥{µ£©‘SV«i±~™]þL+°J¥jhüÕt?+ W[#{ž6³Wӝz kä˜ÍóÓôŠóü¹ìÒø>“+c/ozXOЩVˆÈKãòGŒ »]C¬®&5a¥V厇º$ðþÙkõî­fHaÕ½ŽV´<Ä÷[S Ö¨€}Ø=c³]Vn'ƒ¦±÷¦-1o›o'(ÎfB?eD\ÄÄf¡U¦fñ傞úÓËΔö/ÿö!ym½K†”éµnV)6Ú`ŠqYԏaŸ”ž´ní–b#핝h/¦©’¸¥é“t’ÓàöŒ;µÝNÓ§ÜX1&•ÝÄ-ÃmŹ갅â¶Cݘ}.<4܉åýž6/<4/<9Æå'¨Ðô¶C9xà…‡¶’a¿ð0ozÛ¡œmwà…‡æËXåFr᡹æÓó=÷ºðp«4BuÛ¡:çvç@„|á¡õÔ,ë í¥]|áaÞô¶Ã“Ýï)ܧ*XLÙûÂCóÛ·2ºö½ðÐ<]íÄâ>ÛšïÇÈ9P^xhîËñŠàʳ{¡Ó^šïóˆRàà ÍS¼ù=é#\xh~ÛáÉoÇ1/Êæ·*­Îƒ.<ÜQ -ì{ᡊݶn;<ùmï{ -w9oäÄôžÂK.üÒm‡‡—’¹Â÷Êã ¿ðÐ<‡V Ú᚟<¢v<¸ðPUøµ•óq¢-ZÚ÷ÂC›2íÐ Mu`ù7ǸðÐÜà?ÙážÂýÎÿÑ&‘vá¡ʶǭ«Öv½ðÐôŠBdõ ›/<4O3@™)ǸðЈÉøÛ—i…‡æƏ”daUlu᡹ñ£É~ØÿÂC5ÁµE"ûDu/<4‡¢¿µÇ…‡FPìÞ*oóÂÃÃ2ºt.<ܧT_Š@zááVá•ê¶ĆJëQ÷¶C…L;ìÂCó$*9ÏæÀ ͽ{%ѺðPÝ1›Ës÷ ó=m_xh~Û!Z7Ç*¼2¾íðDçhý½.<ë»ô-ÆEõêAšé+é/<4/cCËó§påMo;Ô!÷¿ðp_ËfÇ Íoä¥À.<´×y؅‡æºB -©jÕE3ڲݚ1“NójÂàXV¥e㎞§çaMDØt/Ô"ß_þÉ4¢¯ ‚©C^.•ð,•)ËHLKw¡ ú±+¥tiVX™æô¼y7Î`Ø}Š6Óçb“&Ë0¶èôM˜ûpð"ãŠ>ÝƋñ„Ÿ^‡é é®S©´ïêíüõÔyÍyEâ!|úò™È4ç]¼˜¯:M75]æO?95'…ù×Ý´AuÒé»÷úO¯ƒ¯ãÎô~¶x¬…o7½~Íëé÷Ë~ï÷Kü»µlû³ãµÿµÀ1›a¢çÎSš¢ÃØù4 Ðx_›Ãž?í¿õäΗMlt±ª0ÌU¦íô}Ôn‘RkáÏcŒÀ®òÑ}"°Ú}‡ÕZwS†™]™Í4ïf݁»ºS¨üÌÿTý—©»78'ðPmT€‡U{É>ÃNnΰp‹ÒNÂÜô©2ÃäY®òJ›Äeñr(_‰JG½îÒσL/D,€F ×u¦ç?La•¸s>Ý5üh¸ºcÝ|…Î}®‹çöy*»(]´;µ÷Wçú2–vÝ&üҕŽ`ªÞ«ÁdÓõ}‚Ê|ü{J\Ìì# +J€ªi1j#¬¬\F_ %»!CˆÒ–äÁ©®ßUã*éθèH¬úTú霯R¬'†-:þ@€OÕjaüˆ•P-pqxÿÕەšh¬‘Ò‹¿Ê¯ot.]¾öäÛ3h#¿¸Øžúõ5^ýÌäÊ32ŒÃ ZU‡óŸ4~ž#ýú(€…ÉŸ Ôûç0É"_*ô’žG¯OCh³G”ógnä*aáx̋þä‰V Á7?ú,ì‡ðg!ÈÿùÁRô)zžË}}ï[&…lÓɀž7<Š~°Õ—ôÀ'?@¨òÅ@zP¾ôˆ¤!åƒÉåXz€)ϯ§âƒ;/+^kž’ôµ_ѾöJ‚Êë ¿ "~‡Á¢©%^O4ðÆF? ¡sƒ…Û_qI7Ùbãé©/ft¯ D !UBÓ…n - 'Äx I+ €‚ù9>âè ]—øó-¾íÌ£àݮߟ?˝Á§ÀGw…–Ht¾4ƒâ/ÍWʟO¼+a2çÊLVîG"W}Ëâ\0 jÏ÷J/jyqi7Ó ‹«2ï ¤¸d<ïMê>ª7£ê•ëÑ¥I0®gœ¨FnSpàyF"ÞEÿLàï2& h¸´°-ě@×$àåÁcùàÓ3¼F4¯½à7œ7ÕÃÏH>}ó5 £â§Q Áæwþ€@‘>‡…wço˜øé—º3à3ºšy¡GóQT~ùtFûh¡D¾n.„Ñ̗ $7¢¥T4•¥>½ãò4A´J‹ÔYJ¡µ¤êañ¤>~hèï¼ÈÇpÏ! ë± øîÃkxÁ>‘¸øi‘Û ë›ûŽÉÝh„Źáóæ³É^ðô–øº½H#AuõÙ$vSóÇÁ|}$üÕÞs½ØxÆÎz_m´j¶Ë’¦Îh2St4µïƒØ8Óïgg ÷YunŸëÎ`*Ðwº×]| -6œÁb”rú±&Ôè='0”›NßÏEaR üò »öíJ˜Æåãe¥û²ãC,€hŽD'\¨˜ :Ÿª$/ì(²=’ºIè9ÁS½êü] ):…+R ¾ùÔ¼ ˆ\]"ë|WA¯ê™ -_âi­q"¬o„ǯ1q¥y]ª(,œy€$y– Ç“¸/ŸAñ51zCÆM?<ë¨ä…#¤áÊMŽÆ@cBfšh÷-J‹Ó¬ÂӊU8Khö¡l #¬üonÑýۂê¨A˜n‹ ¬Uk†±ø q%ˆSˆˆS2/lîø‰ÂŸA†!Ïóùø;+·ªp¨Òꍺ|A¸žÅ‰ -vÃr10A¨e5¿ÎàÃ$F€®Îã+ ?Å¢¶u}}åÀë‰ -òV£.g®žµÉ́Oè5†‰c»´}À,4«ïU!‰52äeäëî«ã¿Šx1Ü?/”AïÜQ (”–ð’ÌD‹_Ý&hêK1ž©D¾²£F -)¼^H7áFA{ˆËˆ÷-XÛ È¢ ‰ÎkP¦í÷¦ôZ t̟ƒŸ ìi#•‚3"“Hr< ù&›ûðv掰<Ô1ÔüÙ=Œá…ˆ·NÄAŸ.óȀƒ«5‰–1LMKÁOQÿ&ïs,#\_.…°°É^5V&ÚQ¹òÇoŠºàE'ºÛíë®ôuûTNWSÃ@•ùÌ|f_›«|mÑ{†¤ëñ7¬f×S?<ãE%ÏÜp ~4`á¼ è IgÁ ñ›8[—Ë¥¹{õ^ %Ýl–J3óbgãœ&êÍ*IºCMõut:E²ô© /5/菲ÆT·5Ó|(dªÔ¬4÷xî«õö ‡ÔO1\¬\/g,QYà%Á[ŠUf`e>pÐoºƒÅ©?¿q9÷D õMã¼ò^©Õ.çÅn%ú£7fÃCa9„$ò("žZ>GJú²B‚[e˜œ±UÿìuZìöž˜QG€ÑŽ_k‚ÛØ P?E*¡Pî‰èsx!{3@„·Au€†'üU6ïÚ{Î÷æ4߄ÝÚ<@êo䊸ù³`„s_nWPy!ŽyÏSÆVV¥V»ðATâñ¯b7ûíAæà[â`÷œrWDHZ”?H¢£å™ìûªv§[àH -ìKsΊՋK ç:1ó¡#4;Œ~—¡+ØMQ®ð+٠ţO«Ì¼Þ¼õ½«L}Ä*rú„d*6ãî:[e>­øbðyžµ[…0ݗ¾î""}Ïéó‡Qùã欞ÝLòR(Æô€éí«Ù¥„¿9hÙ[°à : ÉpÎρ¨ýyÏD˕~±[þ|·»ì…#Šö6{XÛiEݨm ˜÷P8ŽsWÁÔB -tÝk~Ȩ¡’68lësóe·§í-åmˆxрÚI³ï®ÖU]GT0ž;Ži;¶)cÈi»’{§#OÚlÌzì¶;jèxì6Óºëë`N;Ԋ㙘–7^”³:a‚@å!Ýÿ;§ÿÕS€ÑÂènàŸn?øpú‡!ðôþ4 £-§{ýxî ü¬aÎ-Œ€?"Dòð׈5x&à 8¿Ü0˜ÐS8 (Ջj_ú¡—rÁ¯ýê;ñ#²ðj­ByF¸˜BÏý 7½ -ty!úúY±5É5mbç•ñ=û€‚ƬóÃ]æáòõ Ù Ñ"㬨GmZÈOã±Wɯ꼰ú .<¼Øµ1ÂÓ :`ŽyÒúc¾¯Œ]ë3(àÿ°¿Ö£6+ùÐû›”6PÃ}ϼ]ÝИ™”%÷N3mHp¨Ö°&©µ»Z•8íHV”E! -›_iHÔÍîòöˆ{„s)7%ݟçy7j7êkñÛµ´Y|€–qú>ki¹y¶¨ < 4äOXëÓ)w‡¹„Ó{÷š†Ê¤• Ö¸ãÿô¹ÏrP£ 8tê”|‚ê§ÿ$œÞÜÜ,†±lìWè…(€û>â×ʧÕÈ^i‡ýñkµ³1•ü=ªÐk\^ƒ¥ØuV¿­©mUû? oô´Ý®¨­ ƒ)ҘQ–À/ ÜXé å{ç•íèɎCWsZdØ÷²ïÓ~%ôðŔǗ«Áq,+~omG•»;§ëäÜþ -žÓ®Yâ6x²À.ëlÏ#jÁr§í"XvZdvdší™6^dpÚ.‹  ±Xgh‡^Ó`’Dt5If>Ú·éb=‘€GåçJ¥¯»³;ôgºšÚÀôÑZ|ƒwªO¥N³æ®Åzü1Ty%zð'Fd\t%S9%°C‚…Æ{G áˆi×GŒhüª=֖éÁ~îìÁžôþ¶UßÇÖÜÁɲ»´ÕÃxäÖãëÆÓtÌíÈiööjB-ÆӎêiüÒÈ­™§‰§ÍÓ¾½âinƼI? ©8ÅhRãÈ ÿæ¾L‘èÏ>¢¸ ¿õV:ÚñP-vô åz2›¯fRȆº]ÙÝí)Ϝo^ËÈ­Ln~¦á§ —)gøTÑÒóhcCóòÛD*勻)®¼b¾ÞÇw¯?k¥–4”<ÎËϑ8lî®fŔí´‘ö^×`d¿^mTÃÜßf{ö/í¹Õê¯bH´û×+?Yü蔳^?Öm¾ž}’KÍku§PÒ8m,Ú¬~7ó¹$ɪ NKsëê¹3ÿ¬}»z·`Fœ6æDo–ÊÃî9ÝäÐ'Ҙ_yžj¸M֏ӆÝû›ü $zïË,êÏ=sçÖÇÉ÷©§Yk'ç¥R - E´þxd¸cðV -‰„’f§o¼ùgñ÷éü¢™GMfh!vêÖÆ@aöƒ`òÙ|òúvßuêÔ?”Z{õÇöj³öícð›r±ÅRx¯ý%/ûéÉbe¥ÊWy°’½>“0þ«9¥¸÷éu¼À|7¥¼[ù ˜q¡´èbaLÉ»X¨ûcèºî]¢üû¯d˜ Ä 盳VyÃÔ<ãÅ…ZegúíÍÒ[ë÷7´o¶î$•ÄÕIgZ¾è¹8¥?ørö–?^öÎ3Ä{Mèû†×þô¿âz ïÅ6S×)ww¥eƒURšâºáU¸ÆŒæãêÓµÃ8çJfM!«z<݅ÎÁ‡}u¯ýkWO­Í¼E » ONÞ³KÜQÓ.¨…k#&Óh ¬t¹V³§—×lw«¼¸i7)j0³¸wŸšß®Ò]بä(˜Í%¾l¯o”ÞƒŸjO¯E«S•ø«¹j»w9/y#¤—ŒÕ90¾9êä;ºx½ãâlàUíj]ç5’)X´ FðÞ±¹vó–‹ÞJþÀNMË ×PÞ§–]z3öTgæ#?ž 0_@Çrõë4¯7îWU¹”Ô /8t†P¦¯Õè½Ë6Ýä ãc‰%ݜ'•tH›òç³¥E^¼^߀æ³üãÖ«ÙÕé?žž%ì©úØTUêèKÕè·_}Ø(_ìw–yñêû;«{¹‚gÒvåâ`_â±Óµ7K¼Õq×åšË°B’Œ -+ÒêXxϱhã½g`­ËŽƒ—?•œ9‹üøóÝiI^È ÷͑º|QŒÉëæÍZÝðx8üX’… -H’¨øˆ^©„X6ç‡ðeG¿ÀL—á¡ß%_î½è>íw­´@ûÍõ]ŸYÜt帺גõæ•(âרúìê¨à¹¼pŒ‘p,q‹7f£ÛÆòþñœúZ3åíd3꣓(|W / ;…øÞ¯¼= ÃĈãßôbï—æâô ï‰[Ä°ƒ¾/…?4-íz1Ž³º ‹Nõ»Ë«K¥˜|úЫ+qáƒï@ÝÝ,¦[Ü«•gx³0…wÒ×e¹©ðRq;¼ÅüµD›ö(îî¯ó‘Ô|Ê©Ð@……Q£¢£úÕ*}(Ô{ì´±!¿ª›Ê§‡,º‘_Þ_)EUhxÑ]ˆŠXl›ú½ÚšZž Šß¥IhR?›yzX`»ü쎰KßûåßîߕvÞöÜ÷;æ T¼o…±‹[¯ÂÚ ‡qɀã8ȋËpš»ZQ‹È‡»Ty„×Öñ|ýtCLR børµÃÕ§ÇÃï$ù—‹í–úÄÏq-wõÑ:XÂ.LùÞRÞºjZÔ¶õ¸©:?.îE7Ö$ Ä¿íüŒ~s¢Mq¢Íæx÷U-:ŠØ¬^™ç³•/§gÍú§µW[±‘B¥Y°&’¬´ªf3­UTŽô.Hõn8ê·2Õ˜æ;]Vž~{(Ô§zû"zÎVÏý~]‰Ña£Úö·•úÕëÓÊæöÑÌòÉüÒ.ª×wx :Üwnl`ÜM$Ž"CˆÖæ¹õC ýõCÛó%ê! .† m—¨‡PÊ-†PùçûÉ Onø"àFyóñªÛÛè]œ_Üs“o''ʕ5Ævn:·+½nw»û÷‡úíéãu÷æÁX0ʕ­Úښ/êÝÓÛNטSùûžõ%.QFŠÝπ–|X­Ÿ«—ß6Ûõ3kÿ}:`ænû&>7äõšSs -Ó)U Ð¸ŸÃ¯ûŽ ùÌÕQimÍþVïöªË¥ÏÍÝÔ”vwp¼½ŠU -–w«ÝÍ¥òýù;™BV?¨øñöóÍjñzz«ömíª¾|x\jK[([³ô÷¢R$2¹!§ÉìvÅÅÉÕ^Í—ê8¹OÚsó»sÕJ« ¶0Ññ¹æ¶B¨Ÿc. a+ :y®¹0„­€ÃŒm.ÞÀ×.‹0éE…À5’uš”ýem>>oÄ¢†´e¾4MªæDþʗM w:ƒ¿:øuú…}scÒߘEUhM®& ScoÕ¨às&Óφ, ”)iWÚß,çõ'Õɸ]îX9žñqí‡÷鮲]¹Ù¥ÒOÕÃÙïÈÐd)œîE -nێ˜ìX_ä“æœVበ-lšTÜiù¨^¤Oí׿SÁ§XG¡®Ø ™â õnM~RUµNÎUs"ÓèrDŽ>V¬œ/_~3W -ô©ý¦¶Vqjs­ŠSõ`çCl»^ž;¡2;š1ñag¥Q±|V¤ÄB7Õɵ®3åÃaY–sC·l–>-},Ñ' ó‡s[ÂÂrr::îÁuãª~6u%¸–Þ}ØsÂÎ7þeA$SÓÒø{ºVÞ]äUú‘“»G\&µKÝÓxƉê5ÕQCl¼zS÷ç_•V5©†“ùzw7Gˆ¾Ig“Ð^^Ü'Œéˆ–q6g[wê©ö/Ô÷û=`mK`Pìµ"ƒdß4ú Oþ0$Ô(’1s6ó«¤üûý[3L£á3K¯¾©Êw5sN¾¯]ò\ùbïÁ$[ðbn¡$‹eÚoÞ.Ì«8,Ý]­š•®×Ò·“áâ5ÙJ‚èýb)DúӜ²^vä±À'PÞïÚñe¥#¹5–©¡½ñ‰éÅ\º÷r¾vÇl4Ȋ9ª¨U]­Í¬ýºõ¾®Ñ#hhý$Ó¨1¿‚!Çu½óƇMt‡¾ÎÊDŽÉäÛ§°†hÌ# /\ò¼è¸S ‡°¤PZÜZîħ@yiï>QaÊ«¨mŸ8‰¼ -Ñøí—ûø9Ì«8žJwðxòåWœÿ¶Àôÿ˜IYÜ¿ŽR@v²) ûú iq»’îÀ^;Œ;؊’é¢-7ñÁJk†¯«í¶úýÜÂ(OQÁÚ¿fìòu UR,£: Ò«òhÏ8,—Îå:Ȅ™uà¿é©W;ëZÖA:û¢P˜}ñdցyûܬt(G:€aÒÙ(ê÷[Žt:<nDDØKa.t¬©ÓÁ^úZ((:´?l$è°pŸ—Š3DÎdôòkùÔñO—ÐA°ú¦ LªÒSqÔÛè´ä™<†ԁdè˜)Çê#N(êÛÎfpËGïg‡Øý;#¥m¼‰èl9¨ƒÛs&N,s"ôòí(/l¬‰PIê!S¼ä¾Ééc {>DAçͺ”Ð#ïó‚Λà ŠHD}èì9Ž°)è¼v ˆ6ìŠ${æ ñ­ûñ…û°˜=ç¬õKX+輙à«ÉðêÓÓ‰ÙstÞTG…˜=cÀ)ļi5ê['aû7¢c.´V¶«¾ûßRICqZb^N+!gVà´a¹µsÚHû6A´aa߉蜖 fŠÓM$æ´Ñâ´b?NššÃ)éW3õ£¯ª~ÿ=ÙÇlJŽŒÄlBI÷%Æ`$†‚RIÂCgÏqØb6¡¤Çb³ÏPÒÒ%¯µLg€‰üÀûZXõèýìÆ«¹â¥€ßÚÑ„÷8DkÃKÒ­Ö£S+­VÂùrz¡[wlîüü½<,W‘­Ë×fXŒõúÁ² -fY~•iêÓÏî¬:Ö,ªHdìj˯ …ùUM–_›ŽêãlgáAJ‰5-X¨‡I~³< Žçþ³æSk1“÷µy-&©ûÏkeýDàíy%üa#®Ž.^Z]œÕŽ0µ¡Á“Ö~ІFŸ6Ã,ˆ˜£y×ßî>›LÞT‰«Îë!ÕÖ_Wužf£ -ÏÿuUç)“Jž™.óªÎÃ0qáù¿®êüdX ÏÿuUçu8ùëªÎG!ÉÕKWÏ w\uÝãäá÷Œ^*Â[œŒ^¢KÑrﲬ|¿'©uñúËt$µîC9c’ ¤¶›pÈ*Š_”Áo~¾V¢óhô»E§+øŠ,MmÊH/¦µÐaKÎ+@ñ+>^ÖÞæII+ïå «Ô»5(X›ºSH¿_’B¡ ( B, -&Þ©qW³Â“O]œÉ£¶IuqXÊ´p’ë%ýðSåçÍS–ÄêÝ*¢õ8ÙUG! ÉâÎcq¾æôO8ñ=7xŽÙZ¾éèg˜žÐV÷áñN>"ZÕîùÅM³ýg·79Á úcÁüÛ Æ}ƒ _B›'“ù´ÁŠFoÀ´Ê•ÞCýâôáâö¦ÝûÓX°½Ï͝µº±`ÐÓ-xú­Qœ¬<?åñi 1mMNXFÿÚûcrâ1ü3*w܀¿ÌÀñ§ŸûÃ`–ñÙ8üfIøqsrB0ÛôØK(—C`Sځ Ö»ð¨åUsÚ¬ÀL6·ûÃB ½“¡HÚ[ Dˆš8—¸V¸•BRÓŠô•Â"¥ €ú¨6LŒR–œ\ G*KÑ+¦##Á–rÓv™ã…t85ò¤X4ÿZfRCÆ+ôR,-ŸƒºEð$K„@@ÒrdñWØ ‹FÃA»A 'δlË@b¹Zÿh_x°°‰i‡ÀÄÄu<$$U``‚T¢Å§æ}€–¯Šx'¨£¬Wd€R_ãôð‹%¤*V³G–ö¸åÅDJl~rÙÕx¹•–þ¸ð¤¤E ’r0jÆ lÙ ¸œ{±¹Ê*¤*d _ < ƒN¸pm’8–"?Šb±r&"-T4 s è›cD@؃\î®ÀBþ*8®HÈl2^]ᆃ¥¦ýíûŒø]²Art€µwÜ°ðÈÁ¡8§åá:€Áږ àé+#5P'…€¦/PéƒÐáÜCi(S,,/ÁMtò¤u« ’#ø.žÄď }Œ™BWàҙ$&• ÜrŒ{$æTDeÁxSǏ ړG…ƒZHuÜ>³Éø†qY M%p܇Âq0´Å‘©`_aÌY"ã -‡  Öò0^Šþ> ¼;ðˆÉÎðJ Ô( e„V¸\‡€(e^4-Cɑ“@‘‚f@àŸœkäW͛Pëø>E™m…ë‘m'÷ÌÚõ}d3жkkYJi`?‡u1ÐËÔpŽBV—V ‘rÑ<8lá’ccˆ%j¨€ ï´Íâ»qpݱo!Ⱥ l‚êu`AT||Д7»í«Ïmáïø°Q¨UÖVÕ:nŸÝö®é·b,®PÝ·*k -Å­‡?¯º­¤ì¢]ƒ¢?dþ³ÄùVÄ!•\]bø"‰È”D| QHGAÚñíëdü—Nˆ Σà 0O.=g0 f*0_`“Û˜©»™1:®Äa0Š-lð¾à Ø\6:0IÑêgE+láÛÚs඲@Gû*+<5éq⁠ ® ÔçàSáƒÐÂwÐÝA™‰™56¸‰ŽtL±`i|…%Р '¼h©®ˆæ.CÒ E--_¤)—9†kæR¿9P<:Š˜ð‘X…X&7Q ×7'UŒÀc%‹á@9éb$o3 cH¤œ”1¥€ÓIc'mlª5VòSDÉܜ0•FË‘É C*åd†•2¹aDŽtvAÇÉ{.‘žŠê†¶„Ù¡ÜGƽœ™—6b䎕1“0û†Ì>ÜÙ2‚BJž2ÐîGùÆò]‰ >Å0T-²Álr“[Ú0@k¡Œ'ÀÀ -È&ŸÉPp4U-=Œ]p •Ás.C󲸈Åa iŠÍè1’¬2C!‰P§PEQméS’Â\ZjjÚ$õ½˜<µ|ª½€ -å «g$þávÌIöÓÁ#¦û!ÇKøC"™òMÇMúC|ÇLû#É3Vâßsà…ÅFBé…2$íÃäåù!xÌL?]nk¹~'Û/Åæ@×c̜?Ý1ë/òÆÊûK8 £eþ6p*÷od×>åsô%÷¿ÝÝxŠAžðmaG<’²Ã³¦zÚ¦¯%y1i¤†~®ºË¸*F‡­{—ï½è¾Ú¨cF¡rƒ “ç6òHXG,JÒŗ#áK’¢Û®+½ö5¥bF ­‡ÛޟG¦öé•ýà3“s_È´°P9>­#Áš &ß—Gl®š÷k=Ère{%9e£\»½9»¸Â}i?ü ¹QÆiVn.ÚWí{¤j’†£Ûę*kHW½Î“Ö<ÌØ2´2k°Æ2Ç£œCZS©ƒ³Q¥ôשŸ -ÑdӚ[©Äæ©ÖK¥6à _<¹¹õW¥7OµþÑ'NqÎiú÷¥9çÅér+ßI†ØìËÄCû‡9Ò}s–#ƒ”ù?&üDŽãÿVy¨UþO[Ue-Ì󮪭ylVõ I=8??9¡?kѳòÉôsSSˆæv¯ Ôz~ßþ[×hßÜà»wð“qÞëރ¹Ñ5îÜþl5˜šZÞX™œø?ž‹uÓ -endstream endobj 6 0 obj [5 0 R] endobj 24 0 obj <> endobj xref -0 25 -0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000029195 00000 n -0000000000 00000 f -0000031822 00000 n -0000088050 00000 n -0000029246 00000 n -0000029600 00000 n -0000032121 00000 n -0000032008 00000 n -0000031322 00000 n -0000030511 00000 n -0000030760 00000 n -0000030808 00000 n -0000031468 00000 n -0000031582 00000 n -0000031702 00000 n -0000031892 00000 n -0000031923 00000 n -0000032194 00000 n -0000032368 00000 n -0000033545 00000 n -0000055932 00000 n -0000088073 00000 n -trailer -<<5C6B5E0266BBED4D88B3C749965F7285>]>> -startxref -88269 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png b/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png deleted file mode 100644 index 0bdea555..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/icon_black.ai b/net.mograsim.plugin.branding/raw_files/icon_black.ai deleted file mode 100644 index be5ef960..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_black.ai +++ /dev/null @@ -1,1414 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[5 0 R 22 0 R 40 0 R 39 0 R 67 0 R 66 0 R 94 0 R 93 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - Web - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T01:30:22+02:00 - 2019-06-22T02:45:18+02:00 - 2019-06-22T02:45:18+02:00 - - - - 224 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AF/8AOLv5/m+S28g+armt 6gEeg6jK396o2W1kYn7Y/wB1n9ofD1pyVfT2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KofUNQstOsLi/v50trK0jaa5uJDxRI0HJmY+AAxV81eTfzuvfzH/AOcj NHtrJng8q6dHfDTbY1Bmb6tIpuZRQHkw+yp+yPctVV8lRySRSLJGxSRCGR1JDBgaggjoRir7e/5x s/PpPO+nL5a8wTBfNlhH+7mbb69Ag/vB/wAWoP7wd/tD9riq90xV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKsx2AA7nFXxR/wA5L/n4fOF8/lTy3P8A86vZ Sf6Vcodr6dDsa/75jYfB/Mfi/loqkf8Azif/AOTt0f8A4wXn/UNJirx/FUXpWqajpOpW2p6bcPa3 9nIs1tcRmjJIhqrDFX3z+Q/51af+ZPl3jPwt/M2nIq6rZDYP2FxEP99ue37J2PYlV6hirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfKf/OUf5/8AM3XkDyrc/BvF5h1GI/a7 NZxsO3aUj/U/mxV8r4q9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVTnyh5t1zyj5hs9f0S4NvqFm3JG 6q6nZ43X9pHXYjFX6EflR+aGh/mL5Wi1nTiIbqOkWp6eW5PbT0qVOw5I3VGpuPcEBVmeKuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV8/f85M/n6PKlnJ5R8s3A/xLdpS+vIm3sYXH QEH4Z3H2f5V+LqVxV8WkkkkmpO5J61xVrFXsH/OJ/wD5O3R/+MF5/wBQ0mKvH8VdirsVZd+V/wCZ evfl55ph1zSm9SPaO/sWNI7mAmrRtsaHurU+E/SCq/QryV5z0Hzl5btPMGhz+tZXS7qaCSKQfbil X9l0PUfSNiDiqeYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkn/OQP542f5daF9S0 50n82aih+oW5owgjJ4m5lWvQbhB+03sDir4Nvr68v7ye+vp3uby5dpbi4lYu7u5qzMx3JJxVQxV2 KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXpX5HfnNqn5a+ZBK3O58u3zKmr6eD+zWgniB29W MdP5h8J7EKvv7RtZ0vWtKtdW0q5S7069jEttcRmqsjfqI6EHcHY4qjMVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirA/zh/NrRfy28rvqV3xuNUueUekabWjTzACpNNxHHyBdvo6kYq/PvzN5l1r zNrt5rmtXLXWo30hknlbpv0VR+yijZVGwG2KpXirsVdir2D/AJxP/wDJ26P/AMYLz/qGkxV4/irs VdirsVdir23/AJxx/PibyJqo0HXJmk8pahIKk1Y2UzGnrJv/AHbf7sX/AGQ3qGVfckE8FxBHPBIs sEqh4pUIZHRhVWVhsQRuCMVX4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWOfmB590DyL5YuvMGt S8LeAcYIF/vJ5yCUhiHdmp8gKk7A4q/PX8xfzB17z75oudf1mT95KeFraqSY7eAE8IYx4L3Pc1J3 OKsYxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FX0t/zi/wDn/wDoma38i+ar n/cXMwTRNRmba2c9LeRmO0TH7B/ZO32T8Kr6+xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVAa9rml6 Do15rOqzC306wiae6mILcUQVNAoJJ8AMVfn3+c/5vax+ZPmdr6flbaNaFo9I04kERRmlXenWSSlW P0DYYq8+xV2KuxV2KuxV7B/zif8A+Tt0f/jBef8AUNJirx/FXYq7FXYq7FXYq7FX2F/zi/8An9+m YIPI3mm5rrEC8NG1CVt7mNRtBIx6zIPsn9obfaHxKvpLFXYq7FXYq7FXYq7FXYq7FXYq7FXYqwD8 /v8AyTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdirsV diqpBPNbzRzwSNFPEweKVCVdXU1VlYbgg7gjFX3N/wA45/nvB590kaHrcqx+btPjrKTRReQrt66A UHMf7sUf6w2NFVe1Yq7FXYq7FXYq7FXYq7FXYq4kAVOwHU4qw7yP+Z2h+dNd8xWGiET2Pl+SC3bU FYFJ5pRIZPSp1RPTADftb02oSqgfz+/8k15s/wCYFv8AiS4q/OrFXYq7FXYq7FXYq9g/5xP/APJ2 6P8A8YLz/qGkxV4/irsVdirsVdirsVdirsVR2ia1qmh6taavpVy9pqNjIs1rcR/aV1PvsQehB2I2 O2Kvv78kPzk0v8yvLYn+G28wWKqmr6eD9ljss0desclKj+U7HxKr0jFXYq7FXYq7FXYq7FXYq+X/ APnKL8//AKqlz5C8q3P+lODFr+owt/dqdmtY3U/bPSU9h8PWtFW/+cHP+OV5u/4z2X/EJsVewfn9 /wCSa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/OJ//k7dH/4wXn/UNJirx/FXYq7FXYq7FXYq7FXY q7FU+8j+ddd8l+ZbTzDok3pXlq3xId45Yj9uKRe6ONj94oQDir9Cfyx/MnQfzC8rQa7pLcH2jv7J jWS2uAAXjbpUb1VqfEN/bFWW4q7FXYq7FXYq7FXhP/OSf59x+S9Ok8seXpw3my+jpNMhr9RhcfbN DtM4P7sdvtH9mqr4jkkklkaSRi8jks7sSWLE1JJPUnFX1n/zg5/xyvN3/Gey/wCITYq9g/P7/wAk 15s/5gW/4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FXYq7FX Yq7FWa/lN+aeu/lz5pj1jTyZrKWkeqacWpHcwV6HwdK1Rux9iQVX6D+UvNmhebPL9pr2h3AudPvE 5I3RkYbNHIu/F0OzDFU4xV2KuxV2KvLvz5/OvT/y28vcLYpceaNQRhpdkdwg3BuZh/vtD0H7TbDb kQq+BtU1TUNV1G51LUrh7q/vJGmubiU8nd3NSxOKoXFX1r/zg5/xyvN3/Gey/wCITYq9g/P7/wAk 15s/5gW/4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FXYq7FX Yq7FXYq9T/Ib87NQ/LfzB6dyXuPK2oOBqlku5RtgLmFa09RQNx+0u38pCr740zU9P1XTrfUtOuEu 7C7jWa2uYjyR0YVDAjFUTirsVYX+bH5o6H+XPlaXWdR/fXclYtM09TR7ieleINDxRert2HuQCq/P jzd5t13zb5gu9f1y4NxqF43J26KqjZY41/ZRBsoxVJsVdir61/5wc/45Xm7/AIz2X/EJsVewfn9/ 5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ//AJO3R/8AjBef9Q0mKvH8VdirsVdirsVeveWf yOuvN35Ky+cNAR5tf0u+uY7qxWrG5tY443/dL/v2PkxCj7Y260qq8iIINDsRirWKuxV2KuxV2Kvd /wDnGz8/JPJeox+WPMU5bypfSUhnck/UZnP2xU7QsT+8Hb7Q71VfbiOkiLJGwdHAZHU1BB3BBGKt 4q+A/wDnKHW9U1H85dbtry4aa30ww21hCfsxRGFJCqgeLuxJ64q8nxV2KuxV9a/84Of8crzd/wAZ 7L/iE2KvYPz+/wDJNebP+YFv+JLir86sVdirsVdirsVdir2D/nE//wAnbo//ABgvP+oaTFXj+Kux V2KuxV2Kvt//AJw2/wDJRzf9tW5/5NQ4qwL/AJyj/IH6s9z5+8q23+jOTL5g0+If3bE1N3GoH2T1 lHb7XTlRV8u4q7FXYq7FXYq7FX1H/wA4s/n48E1p+X3mecvDKyweXb+Q1KOxotpIxP2WNBF4H4en Gir6xxV+e3/OSP8A5O3zT/xnh/6hosVeaYq7FXYq+tf+cHP+OV5u/wCM9l/xCbFXsH5/f+Sa82f8 wLf8SXFX51Yq7FXYq7FXYq7FXsH/ADif/wCTt0f/AIwXn/UNJirx/FXYq7FXYq7FX2//AM4bf+Sj m/7atz/yahxV7o6JIjRyKHRwVdGFQQdiCDir4j/5yU/IR/Jeov5n8vQFvKl9J++hQV+ozyH7BoKC FiaRnsfh/lqq8IxV2KuxV2KuxVlf5T/+TT8m/wDbc03/AKjI8VfpTir89v8AnJH/AMnb5p/4zw/9 Q0WKvNMVdirsVfWv/ODn/HK83f8AGey/4hNir2D8/v8AyTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9 g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdir7f/wCcNv8AyUc3/bVuf+TUOKvdcVQ2p6Zp+q6d cabqNul3YXcbQ3NtKOSOjChUg4q+Bvz5/JTUPy38w87YPceV9QYnS71tyh3Jtpj/AL8QdD+0u435 AKvLcVdirsVdirK/yn/8mn5N/wC25pv/AFGR4q/SnFX57f8AOSP/AJO3zT/xnh/6hosVeaYq7FXY q+tf+cHP+OV5u/4z2X/EJsVewfn9/wCSa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/OJ//k7dH/4w Xn/UNJirx/FXYq7FXYq7FX2//wA4bf8Ako5v+2rc/wDJqHFXuuKuxVJ/NvlPQvNnl+70HXLcXOn3 icXXoyMN1kjbfi6HdTir8+PzY/K3XPy580y6PqIM1nLWTS9QAolxBX7Q60dejr2PsQSqwrFXYq7F WV/lP/5NPyb/ANtzTf8AqMjxV+lOKvz2/wCckf8Aydvmn/jPD/1DRYq80xV2KuxV9a/84Of8crzd /wAZ7L/iE2KvYPz+/wDJNebP+YFv+JLir86sVdirsVdirsVdir2D/nE//wAnbo//ABgvP+oaTFXj +KuxV2KuxV2Kvt//AJw2/wDJRzf9tW5/5NQ4q91xV2KuxViX5n/ltoX5heVp9C1VeD7yWF8orJbX ABCyLuKjsy1+Iffir89vO/kvXvJnmS78v63D6N7atsw3SWNvsSxt3RxuPuO4IxVIcVdirK/yn/8A Jp+Tf+25pv8A1GR4q/SnFX57f85I/wDk7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/AIz2X/EJ sVewfn9/5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ//AJO3R/8AjBef9Q0mKvH8VdirsVdi rsVfb/8Azht/5KOb/tq3P/JqHFXuuKuxV2KuxV5t+eH5NaX+ZXlswjhbeYbFWfSNQI6MdzDLTrHJ Tf8AlO47gqvgHWtG1TRNWutJ1W2e01GykaG5t5BRldf1g9QRsRuMVQWKsr/Kf/yafk3/ALbmm/8A UZHir9KcVfnt/wA5I/8Ak7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/jPZf8QmxV7B+f3/AJJr zZ/zAt/xJcVfnVirsVdirsVdirsVewf84n/+Tt0f/jBef9Q0mKvH8VdirsVdirsVfb//ADht/wCS jm/7atz/AMmocVe64q7FXYq7FXYq8U/5yN/IiHz5pJ13Q4lj83afH8AFFF7Cu/ouf9+L/utv9idt 1VfDU8E1vNJBPG0U8TFJYnBV1dTRlZTuCDsQcVZP+U//AJNPyb/23NN/6jI8VfpTir89v+ckf/J2 +af+M8P/AFDRYq80xV2KuxV9a/8AODn/AByvN3/Gey/4hNir2D8/v/JNebP+YFv+JLir86sVdirs VdirsVdir2D/AJxP/wDJ26P/AMYLz/qGkxV4/irsVdirsVdir7f/AOcNv/JRzf8AbVuf+TUOKvdc VdirsVdirsVdir5q/wCcoPyB/S8Nx568rW3+5WFeetafEu9xGo3uI1UbyqPtj9ob/aHxKvmv8p// ACafk3/tuab/ANRkeKv0pxV+e3/OSP8A5O3zT/xnh/6hosVeaYq7FXYq+tf+cHP+OV5u/wCM9l/x CbFXsH5/f+Sa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/ADif/wCTt0f/AIwXn/UNJirx/FXYq7FX Yq7FX2//AM4bf+Sjm/7atz/yahxV7rirsVdirsVdirsVdir5p/Mf8gP0N+bXlTzz5Vtf9xE2vaa+ tafEu1tI15HWeNQNoWP2h+yd/sn4VX0tir89v+ckf/J2+af+M8P/AFDRYq80xV2KuxV9a/8AODn/ AByvN3/Gey/4hNir2D8/v/JNebP+YFv+JLir86sVdirsVdirsVdir2D/AJxP/wDJ26P/AMYLz/qG kxV4/irsVdirsVdir7f/AOcNv/JRzf8AbVuf+TUOKvdcVdirsVdirsVdirsVdirsVfnt/wA5I/8A k7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/jPZf8QmxV7B+f3/AJJrzZ/zAt/xJcVfnVirsVdi rsVdirsVewf84n/+Tt0f/jBef9Q0mKvH8VdirsVdirsVfb//ADht/wCSjm/7atz/AMmocVe64q7F XYq7FXYq7FXYq7FXYq/Pb/nJH/ydvmn/AIzw/wDUNFirzTFXYq7FX1r/AM4Of8crzd/xnsv+ITYq 9g/P7/yTXmz/AJgW/wCJLir86sVdirsVdirsVdir2D/nE/8A8nbo/wDxgvP+oaTFXj+KuxV2KuxV 2Kvt/wD5w2/8lHN/21bn/k1Dir3XFXYq7FXYq7FXYq7FXYq7FX57f85I/wDk7fNP/GeH/qGixV5p irsVdir61/5wc/45Xm7/AIz2X/EJsVewfn9/5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ// AJO3R/8AjBef9Q0mKvH8VdirsVdirsVfb/8Azht/5KOb/tq3P/JqHFXuuKuxV2KuxV2KuxV2KuxV 2Kvz2/5yR/8AJ2+af+M8P/UNFirzTFXYq7FX1r/zg5/xyvN3/Gey/wCITYq9g/P7/wAk15s/5gW/ 4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq+3/+cNv/ACUc3/bV uf8Ak1Dir3XFXYq7FXYq7FXYq7FXYq7FX57f85I/+Tt80/8AGeH/AKhosVeaYq7FXYq+tf8AnBz/ AI5Xm7/jPZf8QmxV7B+f3/kmvNn/ADAt/wASXFX51Yq7FXYq7FXYq7FXsH/OJ/8A5O3R/wDjBef9 Q0mKvH8VdirsVdirsVfb/wDzht/5KOb/ALatz/yahxV7rirsVdirsVdirsVdirsVdir89v8AnJH/ AMnb5p/4zw/9Q0WKvNMVdirsVfWv/ODn/HK83f8AGey/4hNir2D8/v8AyTXmz/mBb/iS4q/OrFXY q7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdir7f/wCcNv8AyUc3/bVuf+TUOKvd cVdirsVdirsVdirsVdirsVfnt/zkj/5O3zT/AMZ4f+oaLFXmmKuxV2KvrX/nBz/jlebv+M9l/wAQ mxV7B+f3/kmvNn/MC3/ElxV+dWKuxV2KuxV2KuxV7B/zif8A+Tt0f/jBef8AUNJirx/FXYq7FXYq 7FX2/wD84bf+Sjm/7atz/wAmocVe64q7FXYq7FXYq7FXYq7FXYq/Pb/nJH/ydvmn/jPD/wBQ0WKv NMVdirsVfWv/ADg5/wAcrzd/xnsv+ITYq9g/P7/yTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9g/wCc T/8Ayduj/wDGC8/6hpMVf//Z - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e - - uuid:29dab8d7-5b1c-014c-8e3b-a6adb016ac80 - xmp.did:66A6819719206811822A897E387FE54C - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 99 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 96 0 obj <>stream -H‰|SÛj1}×WèVž‹®` ö6.B)Ý·úВ”?´ýèh$e×nŒÐŒ4šsÙñîãlw÷3ØÓ»Ù°õ÷ëÉìÞûôÛü´¨Gh9$KÁ~»hÑŔ"ÛKÝ|$‡T$Ë>;Î5þaͧí{NÒœGŒk—)¢8È,o4c -RDÚn“ÜöCæ+>SJJ¨îÊÈ£dHRÅä|ô=xÇ´=…äRxm~w/ìš!Ø 9-¦ÁUOfúZÃåÑ%QlD—…z—Q–‹ÙÀ ü,+I,ËË’¬ ÷³Æ"à ‡åÙW‚¢K9‘í[?E” ‰Ïìˆ u˜ÚÚgYÇ©1¶¶d¯hZmͱÈâûÒîBèyèy§«ï£Äç~Î #ÄJy8@!ÞÈGߥæÞãVè95GûË[Žr’wW~ŠŸzÏÜóq_㲞)ïyco·uº¶—²wX¼Ã"sØd ªƒJð±Ý©éZªÒ7’Îý<ý-iH©VhÞûý´\?i•Q힪ï>9Ì,¾Ëøùp0þÏÌ zwlù`S‡yRKY ›ä‹ïíDbIvùn¾ì¯'Dµ {•ÒeÔ/8&Keäuʶ À›é:^×½ÕcÅ:LìÒ~Æßz}xX>˜»¥ýÏÿ0J‚ý -endstream endobj 99 0 obj <>stream -8;Z]_5n8N$$q/KmrsR+pb-FV*b(FC? -endstream endobj 100 0 obj [/Indexed/DeviceRGB 255 101 0 R] endobj 101 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 94 0 obj <> endobj 93 0 obj <> endobj 104 0 obj [/View/Design] endobj 105 0 obj <>>> endobj 102 0 obj [/View/Design] endobj 103 0 obj <>>> endobj 92 0 obj <> endobj 106 0 obj [108 0 R] endobj 107 0 obj <>stream -H‰\“Ûjƒ@†ï}Š½l.‚§=$ Bb*xÑMûÆS¡®²š ß¾ëþ!….(|̎ÿÇ0†EuªL7³ðÝ͙fÖvF[š†›mˆ]èڙ N˜îšùNþÝôõ„®ù¼L3õ•i‡ ËXøáŠÓlötÐÅ6Aøf5ÙÎ\ÙÓWqÞ°ð|ÇêÉÌ,byÎ4µîC/õøZ÷ÄB߶­´«wó²u=7>—‘Xâ9†L3hšÆº![›+YäNβҝ< £ÿÕS‰¶KÛ|×Ö_OÝõ(J¢ÜÓ´ ½§8• ô¥è‹9( PR ځh’ž’tZ)N}BZ Æc_Ï äIäqäIäq JAH—HçH—HçH—÷„H0 ‰IpLBb¼ž¬å O O™IÌL`f -3°V°°V°°V°°V°°V°°V°ðTÞ3Ù˜ òJx¿÷ XWÄm2{ì_s³Ö­ž_w¿së¶u†Ä8ŒÌu­Oð+ÀøJÏ -endstream endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <>stream -H‰š a{ Áÿç÷  J `Já«Øå -endstream endobj 112 0 obj <>stream -H‰\U P•×þι÷"ˆâ‚ˆŠ>|ˆ ƒJ 0X%bjô‚hAÁ…ºcM£I´Ö­Æhš8­ˆËCͤ©N"“ŕb\f´©©UF¤1¼ÿö€N›ôÝùßîùÏv¿³\€¬†BÌÄÉÏ é³G8§äñÌ,[ä<Ø>¿ @=6 -JfOۓÛð;8¾œ]´´àü£E‡€ €áͅù¹³î. < -¼4Oô‡ -ÃÿÕÈþÙG/ZriÛGËdÿVT4f®ê“9ȏF^*Î]RÒ9§í{Àn-òÎy¹Åùۚ“ïË>Bü7•,È/9z:dp 7àJ×Ñ&Xð³vZC%Ê°§o•‹îdYÜFµe¶Xë;dNcI’Xm+2ҒœH„Ó4ë{ö*9KÏNcD;OoiñŽ`}º‡¼{©<ôÌígÏ×-Z-ßmŸ1|­Åä³çé/CÖïZÿ3(íé³PblÆÛÂJP!t~=²­ø%þ‚Ló­pñáÆQ›Vb/1X´âpùØÄñ*J7‚0bT%­A´XÉÀv„à¢XhüeœÃ8^´2pNÍðs›óÖµ&{(žôœÇCê£a¿f֛]æ]´Ç÷*ÌwÆ 6Å¢• c…D°²y4jޔ˜²$†r|„s¥¡=è„WDú×؁ñ .â+|CD¨?­¦«ToÁWcטq&ÏÌG -^F:VË×0êKc8Gå¨ÃêšïoöÓKlg  K°¿Å&Tâ®ã&)öç ÎT‡Ñ£‘ƒE .á²ØüV0UJQ”IÓh%½Nií£Ct„¥p¾RJýJ¦íãovš -ñÛ=¥6Hfâ0AòY‡r¾ä¦è -G±[‘nç³í¡æ%SnΚkp¡ŸÈŽF²œ9 S%ê¥x 'ñ™èÖáþŽ JŠü©“`á$½B“i±Dq˜“»Jþ⸈q½ŠRuzª>â;aÛÇìǶ1•ÆkΘó­ù&~’$¯¢ [3ö¡ø9‹»¸'âÃA½%ÖT/çÝ!öoS³”“¯âClÔhµIÕêP½Ã~Ù.¶wØÇM¬I“ÚRÒa¡ˆ•5Rª)Ùb{ ¹%3Ç¥zðˆºQ/Š¡q4…²ÈC…4ŸJ¨”–Ó -Aµ‚NÐIj ›ôˆ5;8XpŠâ™¼†·ò ®á¾« &«,Uª–«­ê„º¤þ¡ƒ´[Çè4íÑKõ2 –rtõ;ßÒ\ìËóíô±ÙÉö/ìõvµÝ`m̧æ8#1fc¶Ä¸Rοñ¾ÔÇA‰ñ¯¸‡FÉùw‚…¢¶Ô]"îݚ·$‰;M"ŸJÙT «æ -þ«©’ŽÑ):MÕTKçè -Ý¢ÇLý Y£¤ 2¹@ΰ“+ÙË×e=á«HåVCÔP• ÁôÆ` %HT2­Žê --?Õls Y§ïY¬®ÈM¬¾¤zHéÜUÐÅá’}=”÷8éÀëRùÓTÄé;jÿŒo -¯[©ZÎxE|’öH^â¤P:½«c• -#0—·¡—p©çLü“ÖP°tn“ä&‚  U ÏD=gKÖ/Q'D«¤N‹±žÞ‚›|tçy3†Q¾ú¤9Ôן©ù!U©TTQ“®Õµ¬ÅRµ #Ó#Q*d¯ÌˆLéÌp)U‹ÝRÿ¯Êœ€Žü„VpæÐuŸöñLD¾ZÈci»ýDQC±?É4IrŒðƒo…éXÝr‡$H5Ζ;¦P߶ִÐêªúÞd›p{†ÕÞ¾…e‚NªL·õÒK©¸A]i:M҆Çkc¦ ’ê[&„ÚQ8.é0ûCŠ§ã¤R@“¤Â§;*|ïèõúu½X¯»©I¦æZlÁNüYn“äÞê'8N4§Éì™#wD †ày9]^”©4N¾¥cŠÌSLÉÌC©LÞßãªä†/xL½ÌþB¹¡–c•ôÿ:l°ûq™òû*œßà³\Æsp7Ôç*‘¦ ^¿©Ë1˜DÅópÉRoÑÛ`®Š·è!Ó?VºTêÞ4šsÀwQìí—Ø·8^D£# ý1‘~ÐÝÉJLÊÊÌH|!atü¨‘#â†?;tÈà˜çE»£èß/²o„«O¸³w¯°ž=º‡v éÜ¥s§ŽAÚ¶ ðoë×ÆaiÅwŠk¬Çéôxu¤+55ºeïÊFSXc*ãuzZŜ?•Lɂÿ“L|*™ø_I -rÆ#>ÚíLq9½uÉ.ç)gR–пIve;½[é´VzS+(tx¸(8Sº&;½äq¦xǖ¾•âIsUþI®¤|ÿh7ªü„ Êâ*©¢j%8$edÃ/P‚òvw%§xC]É-xUߔÜYÞôIY)É=Âó£Ý^JšéÊóÂõÆ«>¶©ëŠß{ígûÙ/ö{/þz~Žóž_b'qB$ä£ ~MHF¥ã#e6!•C@@7:R[ÚI„MPú`ÒÖ?¦}HÕ j7UzNYê„QåI¨Cýkü±ibSÖ±ªžV(+8Þ¹ÏNJ¤iÚÍËÉù¸¿{ι'÷š¾”Õ Y˘Ž!Ói-£¡»Aç•|ë¢q¡À£ý¹w@;0µ/cÚ¦²t !ën3C¯,…¿arq(óÚãVÙf ‡(T4Œ×óâÎÌãV•Òl怱¤q$gŒÀÒÀ‰£»XœÉfL|–TèNè®*û;¨ SMîyÅdµAí°ñ|B1L´ë¤:‰èóåÛ(2¬ãM5Ó²–ÚÍû‘±ëä{’®Hë-m­y^¨86ïõU®æqæàšÍâ¬î”ݵæYLiOAB˜Ê´H2쩇’ƒ=ȘînвF™ "GLv(gð}TOǛL#¯)Æ= ?]¯™ªjü=DYš'k©öUÞL¥Ì–š"Î!ˆ)`ÜjÉ]m­/Èí¯ÀpÚ¾ÊöµƒûU•ø|AGûA0gvf*²‚ö˳HoOeM’£–ÅUKàYj™Yµ¬ ÏiÉW}fLWbíóñÁÚáÃ}&þóÁŠ}t·6ºsoF6rUߎŽ¯“*öž5[•3k‡26™T9"Û,+$å¾µÎTÈp¦½>‡•Ô -Nd¥¥ÁʈÉç¶WhÖ­ªÿç Bù_t”õçËaU˜f_j½üÄ:y<ΰ`{‚ŒŽï5 ÷:ÛT Ãє#gLÊ3û5…׌y¸‚$ŒcùՈÊ çesäB6q÷A¶4˜×ð¹yŸÛ½73ÏÃsçÜxf.7C¹Ál¾l™y!ÝÒª¥J*(T@£}®Ž´¿<¯#4cYí–Â’§ Y:ת£é©èøÊB k!.¯Ó{Å¢¯ö¶ƒÎUÑÍTz7U{»ÀÂSËÜ{àJC•F«ÆÐxæñ|°™U0ÀbbÍ|U{YÍà ó[ÚI‹1Lj ô2§£YÃPàGƒù§÷d*Üoâ J­Ïš0¿iQ˜;K‹¼9³&0ö{5jHÌRQ©TôF³Ö ‡Eá0Àfá6`?ÄÀ9ÑHÞá,`î -성SƆܘ9›DX'ÕÍa$¹¾új8õ ¿Ü?Vꆿß?ƗúQº¿ÔO7vlT¡QÔCvôH±->Òô)öE„ÉäÊ#¸»ý^.;ôd3×Â&ä­u‹A‡ƒáCÁÚÀÖZfŒek/zâž½±€ÆÒºâäXi¹Ÿ/òK°\º_{{1%;ð$îÅî-›7Áÿ['\ëý"ýÏëÐâÉIÉþ_$9¯(9_x’èåßÖñݘà]š',¸¹+…K—W -×9· yâøé„qÛÊ#rªŠ¶™%lD"RÄN³¢#ä u»4àõÁu‚ HÝ¥<¶Š÷>Å»€-¸ëÐú qºDWg÷±«“$ô¡ $§þ+ÚÏN¬”Wލs ½Ž·_ºŒ·ß´aO|eТË_³}·ÕûX6ˆ%ÖփzÙü;Á~}¿Ì¾îzý!þ1{¿ÃΡ9ü[|ýþÿƒ½°!‹=ü»_Ù<[Ñ[À³ºO¸®µÛ°í–PÀWó¿§ ¥ârq µa#Ç''á-WÙÞRq¿íviŸ ’›üÜã÷ -ÓðE¦QòqæíWòyÀM+ÿÕv‡¡o¹vüî{"qk å»ÈV^žms5?ÉßT^FÉòç(¿òçsQ/ëuyÉBùâËwgë¼mtDKù®®53Qo½7.uÅ¢"ڀ“LM\óªbë#2LMdȇs¼RǛ ØáiµÒi¬È߇ؤ!£ŠŽÐ[‰ÐÐI}/ÙÀ'ÂRH -JÉ/1Ž¨\'ÇäzÙîH&š͉–„ÝááÜ˹8'Ç8l‰¸Ð #¥6¢ã”£QGmövk>UDz$Áµêh’‚†)Iµ@KF=Ն{oPÙõ€«•Òþ˜J ”c11/”ê:0IT"ó@$7­Q’ôk€bóC?[Lô¤ÛÜ@‚”«óK*äS=ŒÏª§£êÓÄÍ [C”TЭovx+o“ øººxëȅ‚ð9;A“LhqøA7o»lwNüÉÓßÝP7ì 7ú ±m|p|¨EjêýÊ÷.¥ÂM½Û/\$üh峟}û‰.õ='>Â<åãoôï9õÒï4I[¹½8ÿÒ́¸Ô€ÕEÙ¾%ëŽýœÍü¬è’ åºOp +ëòq‡lg} äÄáŸê,Ïq>þÖE¨†ˆ†à\Õë¹S”ý 伪½ÖÅIÄ•œF -‘›º|ñ˜¿FŽ¡(z߬dœïb?_*òËÖ/áx‡z_{ÛØ¿·ü›uÂÆ4iEYP7YÅI[§^˜ÕRÐM¾•X$+}ƒR¬¬üÓÏú$·K²?x¸/T+†ÃbmÈÞ±Ç! ¾ žø%x✥îΓL*£óÍ5B£=î–eÿ@œñ0ðڝ@nÔ^úpsº¸¹bìØ(ÏÃÑú³Þ*7tn÷½â=›<Ût¶ù­¦·š¯rWZØÑìâzZìÍZK,åOƚ4Îï¡ #}"ƒ_ˆ¥ ½ÉÕÔ"†ŸMYtÕ¹z¿ê[æ^B,òਤWXÖÍE -øßW(&tA½ë/Â@ã“5ä›ð 6ý=ä(jÅ?X=¨üýezN€›‹Å4¸|‰/âªgõ,¤+8m´¾A •D@ ë¨Vtª÷ëXlR=t§OW ÇÇSÙnÕª½Á@@íjèÞJº:!‹NGµ@W˚ã?|Wkp×¾ww%­´’vµ»zìZ¯•%Y’eËÆØ ‚DE8!úÙWÏ0HYüwÝì®·¨õ‚ ›¨N§–÷Á›‹#á,>ß/(eÆbû×îøFΚ®ƒýFFÓ#ˆ ”Ø“Ô°Ãá'òRÇk0{  3\ŠŒ>+¬¬j¢Ð©°¥3Ø1=âcn[„ªI5ˆŽás‚Lð3÷wÕo=síýÕ+fêQà^ÛûÒÑë×m`*î'˜d6åځ }'¾®ŽLÑ\¢"þò£·_xïÁã¢Ê°¡'EÈ® -|RŒ*p¯n-ÉáÉ!©_óGò7Ê_ÒíÕL-;ƒidg3-¬1 Þù Žï¡Â^<9œÍŸÖ-p‡o‡Y[¾ù Ã0¬ÌÈl”‰² iºÔ(µJˤ5R—Ô”úÂg¹³âU›Äak -£ -F´¶àBm¶&¶*µ²b_h0ñ™õ’å²UlaA\‡”ä€Óïò¹Ác ¡°Íá¢\‘¢Ê“@SqSiÂà6ÚmáJ葞¾²zš6eñݨ— %õf›çoÆz”ÁDE‚I¢þ„&¡0#+µ£?T_aÇv¥rOÅën[‡t!¤Ñô(XÑ`%RëaReB¯d -í$ƒ# ¼ƒyÚhµq6ʘd:J¡,~Ww¢¨4ø¬ o`–ÒVdMž²×ÆYêk½Èæ9Eõ1Í"†/¦Ä‘ïø‘’ ¥€oˆŸœPÄÂ/¡¿qÇTÞ*h"ý2¹ÞSý¹dåN¹%ÉMqÔEúŸLT|½^µ„ýÛÅÒfÎlâZ$ 2›Ìœ©•BÀ¨à™!¦Œ4/ÀÆXÍ¿Cºq€¦Á>(º3ˆvÓ¸n§_¤iZ•à×xüóÃÂåt))µiÔ3¬B›»§ ÀsöòRxvO! >ãñRܶËÔ"œ”]¹“¹“0¯("“ÏUºí¢GŹŽ"ðýn˜(ÑÆü3‡î@1TƒÕì5mô–ÓQS$P˾qÞPFè̺֧Y8¾Á™Íßԓ|è<ùKÉÅÀEíjäJ‰)ì,q};Øi*™LGZJ–ñ˔¥‘ç+x“¯ôU’iˆ àDm‡-n´ôá)NŽ{eÙçՂ¬GËgZYdƒîüÚodU Až%Pê$½ -£¶àBYØ_ µ£6¯ìï.ˆµ››Ä}¹%³?i|±PüFȽìƒÇ˜ »àéӞŒ º4OcÄLùâ<Ð¥ -y«rÇ?éÓ³¤IFÉìlð(ӆx'¤œ=MÊVh"æû¿øáΝn½sÔouõý„<sR™e薲=ü©çþÏV}Аíä|\⋽ƒcCÀÕ÷`—I·::núÁë'Þ«Kº$·›+]ä+o#rücï«¿8y)ˆø=AXW e–ýzD·/²µÛ^¶ï-é´wÙϼSp³€õÒ.ÆÞÇqSVL”€’h=GZ1¤m=@×ý)wV¾FDZ£¡‚àU©¸ÈG24‹Bâ~­ -ê0¤yDwÄE]Ü,^­¢T¾ýAðú4w4nžÂ–Daa<¡E9Öä½8Z‡ƒe4Î̯Y‘–L~­*Åãpy¼¤¼¼´D«j4²FóóÑqWVŠciF•†|ՉzV5RKz ˜èížÝüÜõ±—8ÃQäãïa÷c?“þOøÕ/IظñŒÿ¦[žU†²ÌÝ.·¿ uyφäü²"#²MR€Ÿ -˜–DžDJá'‹9>rVµ+‚™~ž­Xn£ œÊ¨“Ö5s,õ_óÉhñ¢Ž•m¯´¬R$Iû.«^ÞÞÒß°‹b̐ÆjÃÙ(.knúÞÂô?'ýkY¹«Hݑ~01aF%äÞ_!5xln‚ì=¦I¥’.-–ÖHÛ¤ïHT¶ƒ[. Kڙå6›f÷¤#"ʱ–wa8|.@:ì,.‚Õèï!jCœV«M -@ržÙcB§T.mœRmý—Ï€n:ç=Äpyö ¦…&6|i˜‡?wڇ?%˜÷EPö+6÷G=óðói¤BY3ÿ"údÒ¹hÕËÚÄ­âË"‚…}9f<¢úrLtÞ'q»5@NÕÍq ¹^ÎÂIÒôÕã…?aՏ]ñ¡G×û9^ïD©Ÿvh­"Zk/bh -ÆôZW¥«Ê9ÛUíªuÍqé®FWÃçÚ+ìgä®Bk¨pi j l£¶lTi ‰j -,¥l ºrŽá¾¡jPª«®žS§UŠ.<Ty°ˆ¿Îßå?ã­Ïñ:oáSNžw951¢Æ&4NƒZ*¨iJP‹T$ÌÉ$—„ÉT<™LĵŠ”Ž'× 5‚ÆT}c£^¯ÅÉ`nqQ~N€T¬R¯!Rd,dñ‡ÆBUVTD""ëpª^®”'<íèy˜›Tórñ8·=æ>¬#âj}n<‰ºÞº:KÔ;å›Ö㠇‚ÚÉ: ìt“ÖõµÃîLÇÉÏ&ãî'ŽZ·<Îü$2¿Ç0ÿLd( æG}k·Ú²"Qkžl¤Äzo‹)Àg÷c* ,pµ˜ ˆ ­­r ,ÁŽJXы¿þ×m›µlilA+ ð -üudyÇ+éBwc 5[Ä(ñ©s -(aƒ$S Ï$Ë̞ëÏë74´…ª¶V¯¬hnÆJ}í«Éâ¯5¤ŒÇ…%E…sé?à‹ùKÛÒ­M©TSÍüé³XÍ𘾤i]ú†ñ|¨qYNt­9˜ -HåÊ—!•W}zå-ò /‘—hx‚î"»h˪‚k¨µôZÙòšü ¿¥tƒ3ÐP^P ¬‘_Í$*"S’(ú$ŸYƒÜYf rgŠu:³XÍmÖ Žˆp8£9ÊSf!*­©"Áp—PQ’²R¨&ñ¼›eXÕ?$ —#Î(G¨I¸M!.S‰Lq¦GP¢ø_*ÏÿW‡9`£)š¤!°!ÁÉtŽY‹bF-š[ׯúØ&Î;|ïs¶ïlŸïîõù3¾;;‰“æà $Äé™ø)kÕ]VRHéPéšÐ* ƒM6ÖIãcPV í†(S骕ŒP jÆ`0Æøк…­‰U…‚(C*YaŠ¶J«íýÞ³C-ӒÜÏ÷Þ½Îïóüžçù©¾zñ­0.ЫŒ®nPÜiÅ ø9vÜÉ¢ÏÙÑcó7w=9'µÀâÃe"s³~ðÜ£+û'»Q‘+kºÚ«¢Ê~2áF]«fþ0{ë.‚€m)' á)?zÐLIŠMÁ~…9ƒÎðïÑï—|`g—Ú{Dz ½ÄÖãèázÝϊKä§ýŸÎº“áv—N‘~‚ëÓã·>M·¯i…¼T=õ$˜Õ0½Î H:kÂ6ք=}ìQv„ý½É–°ÃèʁHÐxÎkÍv÷‹…¨AtÇ -…üíP¨@(Äù±ƒ^ìÁþCù+”œ¿rÀ£ùN´µÉ+ØÎ`RÄáü¿LYˆfx ÅÁA±“Ïo˜¥Ÿ±c^‚—P,ú[1)20Ùq”à†ã\^ø&šÔ4ª&ê0ù§ ajbžš<•¦s£ÇOäþ¤ǑÜyy×®ËäBƒÇr7‘xôs7÷³‹—v¾úá%À¦r>éÞrjÍL'´$àjª‹:én÷S0a—º—£U÷-«ãÏã.Ø/8ÿ–¸Ðpýˆs™f•}³`X%bµl0Y FJcJÁ¥xéô–4#–,ºrW%Ã1€©ž¤ÎsU:Úf³SªQÎVè‚9BSk(Jç”.*í+µ•§<±y"ô“M“Ø?M[ÿ‹òþ½»ñ®A`¥«þ ^ ¨W»Ü"¨7ä?x+¿¹…8¦Ðed ÷l©IРûX±ú¯ßÌe\ÞôŽÕRÖ¸Öo\ô‘ü%&ÝԎn™ëq&2ƒ–¡º¨žöm ùç©wä3måóÊùÖ÷Û>–¯6^oûLkü´MâeV)iu¶©²Oñµ†Û6Æ^nüÀ?&?žêIõ+Sß36¤6¯ãý˜Ûl ©ô\GuU¼¢Áœžn Ýçj¡§ÔÇmuӏ‹á(F Ó§ë¢>“FM­Õ £WÌHÅ4]§ {g‹>'º(Úe¢¡Y _‰U>Ý$Šª€vš]}U¨*øÀL;ÃVp:ÿÄ÷ =G&² "ðÎCÕ£ÞìU«ù²ÙQŠ`Ü %+¶$I÷À·#œßÂ\j±Ì-ÕÜ&i‘r¹ÜßêS)#Ü¢¢f ŠÔK%P) uúý¥i𽐑N©ÓT -Ï­ØEL¸PPA-?Gÿ ¹Èáüß)þ՞¿±¿7ƒäˆ)éHj¢»ûad³’X -ôØ ÕÀPRD^¬ ´9nÇ Àí˜2òàdȦ·‰ aR&É18A£E¶q¶%¬|æ£#¿&0K^65¶Â;" M‰Š² -‹…S˜ÕdÐ ÈÀ)65oÝ Ƭúµƒí_[ôçS§Ö8|n"RÐßÞ·{×Üy¹Së9·m/S] -L}1R‚éDª¥º)]ä@|õƒKßXÞPôW@__ZŸYÙޑLjÏ¤Ÿ]C&”­à̆m+UC1ËþFîp(Lï憸ãÜ»ÜU®ä[žµž—=¿ðœäÏó¬ßìDAlh™ésØlvG y±Ó' -^QÂ%AWÕ0zÍ£FY™Ý@ˆb]zÇëmÃè—&®©q8µ -ý$ñF´È7"G#%à¨%Cè*ˆ¤­«TAÁa¶´FÉbÐ]‚ ,ò„Âχœ*Ņ]*EÂp n4Þá¢%ºÍ…£¶N~¼Ý§!€hxÚâԊþΓÍØí ¸µ÷oۻà -Ê f1iîì_Zò(j€týË"&‰&§(MÆX–±,!Š#^ –öcpN6nàaÔkò2m$Ō8(2â!ÔKÉÈiºM ÕK}Ò.é¬d“Ž A`T9ÒÁëŸVŒu÷_ëõŽ)Ò£¤·È_&L®+©«^÷Ýëêä#@9n³àVwH1i}×òî×dMt°¡žÄ£n=ŽŠÐ›1Ž¦Þý„Þ·9÷ÆW ²È u#j,Gu›¬i5T;7AØüK…i"PÄ:•ÏÛ^¬+™s_¥’ð¯eÞT^÷Ó¿Vúí¥×(?V•ß*—”œâØEïû/ãUÅq…ßìÏííýíÞþÜîžíóÞÞÚ·¾ßù8 [v𶍥U Ń¹(?NH„µªÕ4ÅRA•Rhƒ+¨”–¶4IEՒ@Š\‰ÔRhPKAj*ᤆ¤ -V‘J¢4ôLß®€¤BÝÑΛy;3»Úyï›ï£Þ¤è TuFWª‰qÔ¬ÖÆ´©+™•ê:fÒ«ö½Îv²“éWwh;ŒÎS̐z(ñCíêó’zD{•:͌ªÇµ×Œ×œs‰?ho%.jÿHLiùp¢&‘§ò‰¼¶ÇØãü*q:1ÁN(K¼GÞÓ>¢n%>ÒâŽÎÇýøšõã Œ_؈Ê~¼ˆbAEY±¢ŠšÎz®E6Û´]›¾áµŽØlzÀ¶)Ñ^eS¶}رí¬c¥ˆ¼ Mð»ùý<-ðõ|7Oÿ“'¿áÇù+žƒðüa–ç¬a3éÇm]]Á¨«K–iè#TB3Go?ä–T†6–aLUQð8s0,u#Ö ES×°j"´©&pD‚'“(í¾Šñ6‰›£’I7Ã@!tÊv¤“¦Ü tDÒ¦F»t¢Ÿ5È(ù®ÛÏn±Õp|Ùp²XÕ¥°2’X ñ²Ñánrˆsš¼ˆZE#ϺZb-嶴—)o卣\1^¦Fɋn”57©D=«0Ï)ø›÷J±Õ3'ÚÚË~7?ÛÅ×øWð-Î÷-.æYWJheÖU[w³ûY -Øn–bϐw é®œú°RY8û§§ qª’«^§ª_3Äj%©OÏ>¼yÍ{z—ÅKòÙðÍNqÊkT§½ >-¾ŽV¿ÓðìlVæóú}ò°P©T?íû´s!?ï(ÜW dÄ;¤ˆ<™æh:KÏÃò\¦ÊòYþ„ÞÛ?6Úÿë&/]ßõª#'¶Žî,U“¬¿æg‡PµÕ)rWo§”êuêGwçñªÏC˜Ç% ™Ïè Kº•¦µVÒÚ-ùßV˜—?/?dõ“þø»6ã×à'Vl¸]Áw‘JR¼$ÏBx*-,`w•N‘Ôa+…r´ÆÊä[pÈÉæ¢O”57\jnn)Yù’ÌS~z²ìa²±xIÅÏ­¨­ kš"[I¹”³=ïÙl!“ÍÚ+—±äRÉÌXJ&cÅ%É¢€$)á)N ˜b%ÞCúš¥#™D¤§<¤·;r-ù|.©U)j 5™ºáÑôò*–+²&;ÀN²7Øk,ɝòCÿ/b˜ ¢à\P\wa½O£´ö=Áæ<;ZhîXÿ/þÏwÅOŽæ‚bg°“, -é9ü¿B„ÜS<#îÑfiêñ™o©dTM\ó"l¬#_ò©ÁÕú¤¨4W¯Û§nµþ‘Áa¤IQ•÷C­›zy6Ì¢ îÖï}™&ËFYKõÓ_`Yh‚scà`Ò#ów0^NDߺ‹ÃRïζÌLýÇ&Šj 9jÓêìÎØÎF.fêõ‹êÿ{£ñìUàØQªú -!‘QšsyX‚°¦Â£”ìZéÙ£þeyiHχûbËÄE.r=[Շ(Ôe?sÅ|¢/µ, }‘HØÈ}0„Dn«·—7ý=¼9íQ:±RņÏéªS—ÎêU„ï¯>Yñ4I—=–«¡øH·ÂR¾ÔÅ⓮ò<æä(y˜ ËR„›áÉæbmeÅ$&‰ÅÃÁ=mß+Õ=ó ê§5H˜‹n%Q—ÙéҚΖ(Ãñ\¨ùkC6¦ŠÏbñS˜¹½¨t-ÔŽx{Òt»üe²FØJ¶›EŸ0ʎ™°ËìH¤Ê‚°ûd½‚X¶Ýˆ]ÞÜzTÒ’ös”N’“™.ò.&ÿd_¦l¹‡ï oå·F˜L]JKl‚L]¸§)­ª—IׅMç­XcºP7õ¢¾Jߤèô#ú}Réz*–¦éE)3. p±Xãm=ü==_¨ "A^‚ºu 6§©r¡Ë×!Õ)lÇÛ阈œº³ù<îC%Ï6R~<—|u¡ŠlÜïIªøߑÏY­rin3TŠ»°þc·®ÙLZs«G.ÎL)f.×s᭗íYžD;1tfx±V›ýú̹2þü¾3ÿ:uy¦Jf¦–/'»®¼ðü¥á㈚ýÈt·!j6>we7×Íw‡ºÃŒ+ºqWr¦‹ëâ»B]a¦(ãE©¨0®ÀB…0#p‹áz®ž¯›¢7%S A4V“nð1És¦™LXéÀ,ì¡Üc -„aø\Øs‰EÞå)~c„çË3k}Q“*Ô¤Rµ5–©øP+vIÝ%m$I,E5}~}¨ÜÚð­#0MF¨NrÇıìÆõ½7­Á•î”c8o¶œš+Þjó¥o®ü‡¬Æ¯ø&ì'»ü¯ö 9Mºð=~ë¸Ò8ˆ÷8ÿe½Üƒ«ª®0¾Ö¹ i ¤!DÒ  $\Áˆ”Jkr­`‹TD åph-A‰dìXƒ01 --CIÐ OK•«Ž¼ ´„‰ Òœ–Øê` /iUŠ·¿µï=—K þèùf}û±öÚk}{í2D~+iPóäfó”œÖ2ÏŲ]Æ2³ -ڙN%Hº,œgþ'õ²æÒÏKh^Œå;I©7NRåër Ké+9˜a½(JÆ:ìÒc†´Àݬ»´Pc½ Œ¹Ë4ÉY/¹,ÏÓû Œ—Ïê¥ê3:^‹c+nëRNŸV»‚yš<iñ³ÚÉjÞ/3z¥“JzöåìfR‚ÕŠhgbý,cELÆbE´pRÁ 'c¯íš-µòžÌ‹´h:Ï©âi¹/v—W±Õ*©örÌA½/ÇîQñ/-ç¯ÕvW[Ïm_ÞtÿtÉ¬wž€§Ãä-fé1¿5Ú½¿Æªð™õÚÍ?OŸÐ'ä |Ãlä[ηRÔRåq)ÅwKå»Øyw‚ì¡Å6Ã"ÿ–þ‘ãò©‹ÔDZÉEé$¬a1úkô˜†ß4 C1#äHˆ¿Å2•U[¢»e¢vûu‚,‘­^W$÷Koð ½o”ùÒWÐj)­OöÀÛdpä+6‡¥Œ\K„’¯èd:ÉÇ«{¡À|Ù¤‡ñíÕÚ]6ÈZ-ÓXݝÉZm“}°ÆBâïòCž?•/å/²^ÈkrXÖ²Ê ù»Wþ#hõ_ˆœœ¥Þaìeòžƒßót-Hèw¡ëÓzŒ÷G«ù÷¥¼æ}O«ôQí«õ \ò*mÖ¤Y7 zRÿ¤Ó`¶ÏØ?Çé·5I;i?Y©çå´7RéMÑ~šÆÊ^‰¿F/à©Ðõ$„a}RÄ·:ªâ{¹®Jg¹ÉÕì†vUcy‹-»’]›`ÊO¤ù„Z«‰€&ÆÓÑï5º@›Ðüm¤~ë0 ^úÏÿ‡ Ýë4YM« ¢­×ϝžŽ,xŽÍOé/âsõ¿ÅæzM¹Zǘ8˜ÜµM¼l}u‰Ù'VjOÖ7¡ôm‹÷žpå6âÝþ'ÉÏ]¹E·¸ï_áÕö~]íb>n.›ä÷>/ë¤&A¼›YmüB~*£°ÇI|#؀%¦È­Ò‘uhM¬ÆþÚ(uR§ÿЋz‘ø.Õíú™žÒ<¯«½IÜ “<ý/§ôœþŽb…ÕŒõ>yûrDgè,4<"õè—ãiro¯åEøc‘Noƒz}QÿzÅÚq+˜§˜sœ?ˆŽErAþ¬Ÿ³^ïòÉøÞD‡UZ« úŽîƒà¹;u‘‘¥?ÖïÊåk¿F÷èot¿î‚‘8°@âûÜGm$¾Þ¨$îדXÉö w¸Qi½s$J±Ë;¢b:Øm´Ñš!¸~΀Gç8)Sio2Ͼ nµýî>t¦/ü¡Jѐ—ïån(sQdžè{c«(ºÑ²Íhk' -¯+5ÈK ږ´ŽÜv"øšˆm¯´ˆö¥#°ËgÍX”_SúlÚNg‡6JŸ-Ú+ãö„UÈ:/¸gJäP|]ے®DiŒMcëe"+'Ga;§‰"v•}º–ž‰¿%ë9/¦Ù§3õ°Î¯Ë Ç -çt_ëUð­“oqÖ °Ó×ÉŸç…þË-ôÒ½ltX*_hŠËEj\®Ò<(Cöѱ,:“¿ùN¬F˜üؾTÊv"õi†­ä<ҝh:岻ݰ`w¾Zf"º2i·Õev äN+`V˗CDÙ=Ô²LyÃI²‘|n…äs¦9#q¢HÉè“D¼vɌEäêÀxèçœ6²Ïë¤ -_‰¶µÉh`Ùfkî‰rÌ®«2PŸüì> ¢9í"9ã4ö{±ˆ^Å?Æ-%œáú» lOvž{Øíð%òKPÂò2udzM—=䒖!ïæT™†åºÇ¬W@‡Ùe–ËL‡0jæ¾åœe8†vv|‹õ°3á0ÞÎr2«’×ñ°mH˜Qç1ªÍ`§üŒÌ®ÒýIŽajüéUN“éàIÍ×þ _þÆn¨äFœÚô²—ê¥rÞêNse®7„¥ž{ˆ}ªÞöW£Ö!„§ê`}H'é]:”÷§?ììv/±S¨!Z7Q#7p³ë+ÚÙ+½Ù\­ ùü.=îÆìm½¹–œm7–Ìý4íBºI{é~O¯=ƒôždíðª&zŒîo3tG,€úñv§ŽÖ<í¡wk€•8† -ÙîŠÎA6+Èrù&{µ­uë° åDPÅ®l+õ•ÙØz''‘ýX;LÆ~†•îüSÂý |'È{q¾’¼ünǟivâ‚oc_±òY"2‡…Ô“Õ5éE~?T~B» fj­+èsVy)^Š(ÒïDyÜEn®|‹­v;Wòþ4LM$¾í· ÞílëW™´Ä÷»>œ'Jc°Yr Y¸E}ì|®…³;Øø&~DՐãó:<Î/½„tIüA¼Œ[ÿ7 Ç"D—odÛmÆV`7™²b€•®g^\Ù<ý*«†m·ô•æé—æZœèºCxi#b—%t?VáQqCüHÜȼä²ÏÀmÆOÂúºqÞǨ>£K¨hïy -à,åÃs‚b'¾Œ½ÍC$4%ý¼;¿F:N+x•¯ ö́™ ?R„7ÁAx°ô:⁋©cƒhuLüü ±ñ’ŠŸ^þ!rÚ/þ(þ†5Š(}ƒÞDêš”Ð]7á ø1²i–áÈqÖoðuúÕÔS9ýSß¼êûFÂ.àäIØÚEñSqHœß4Ja'GR¾× üLŒŠWÄ+†H%ñ"ÝŠ¯ñ;ö¬8K·|ÐNÇ¿ÿ^sÂZ!|çgޝ%¸‘ŽTNÍxï|6ۊóôÄx%ˆ–æ`?î@ߛ0ÓÙx¡ÕC*n'}Ž®ÁbòaåO‰Óèÿ+¢A|6¼~ýóԄwU;Ÿ×ˆÎ»($æOþ'ìãؽß!"þ"Úޘ|•Þ@Éìàk¸õ?†ÓV õ0Nx1­Ä øiÌþ<Þ êÝZ¢Ò\`œïŽúÉsO>Îþ:ý¥}nÔXÂgáE:<919Ée‹07ÅÚɁYáÏÏd<ºm鰒­·½9”gNï]Ö^gú\3Ӗ-É­´eƒ -s7Ù²„ÞgË9÷Ùr.ä㶌ùä^¦gȤZª¡T©“úÈßH - ¤(kš‹AVÔ}k,G‰‡BH&u@·íçœn¡ö.Ð×,@jA®Z‹vCÓν‡1nzœ è}} ýFÐgüý£(‹eÆ13³¯¡:H‹3¹zªâ9øÐCuMŒëÃ8ª?õÛu×!×­*Àã™RëäÿÝv>½¼&­A¾%Jë㕸ùSýDì?5y””úùU®}ïFÛkP+À+gBŸÞVÌI­NÛ…ymWs{‹kX´cª•05í¥ëš¬C£Ö/šÙÁ·þC•'0‹ ZƱ -Mö<ƒö\ÚnúÏNÙB€ÇV³ïçÿì}'vôŒY[³¢Þìì³Ì‘p$1µÌ¦H,‰ùÁHx¹é …ÌŽàö¾DÜì°âVl—Xn´X=1k·ÙµÂªÍß`d a†"ۃ~Ó‰ÆTSu_Sg.V¬¾Êìð…¢}f‹/ìøû¡]é ›-¸©³/7CSûéÄÌ5ÁžPÐï ™öˆ¨Á f<2ó[`½‰Ý¾˜e„VÌL¨ÿhí47ýV8n­6ã–eZ;z¬@À -˜¡”Ö Xq,U?Èc¬„/Š/oòn^ßä]ڄ®ƒV¬ÍÚíÝ´±ó¿P¦rf[jš>3ó¬¾X¿é½ý¿Ï®`C»ƒÿwà¥Í´žùÒ,çr ^ڄ™uò~oGiˆÿáí·{oj¾Nl‚:'OÉSÉÍu'Àîe6^XV»Wñ™̓ùunOµ—,sbècã%eµ×=óä8M†<(÷ÑBôýÍ»m> ¾üq›û’«O>ò‚®ƒNþm4¹¶½ö»,Ô»XIkFÆ¡qzJä(f5ŠYbV£˜ÕuP^G ~ú֏à®VÚ]ÙÂhÒ1×Ö@ð̐]r N²S>hó­rK²ÖyÒ³MnF×G™ŽÉNÐa¦ÝLۙqéË–#,»YvÛ²¢ÕS¨“©CQÙ!7Q%4‘ë˜{åý´¼yÅÛd+ór-ó Ðß ¾õŠÀ×É8ߊ|3x òŠ¯•$›5ž(òÝ(30žÒ7c͘S3Ii†1à2kºA‡€ €äšB6#5!y¤-ÑG#JIÊF$7Rƒl@É}¨{h£tñ?ºP˅‘\X+zva{\ØåI¨)WR ÐxmÀ4ôS…vU˜WF¨’˨ }-4öS1¸is§±€/0ö%8=ùÆ1òۀ(°×8–œVä𣞪[ ´ÝÀð4p˜NîTIãLÃm¸e»Ñ.s`ݕã.W-óºU)þ¡ù)>k^­Ã“•X¦JzZªøØZ ¸39'`ÀtÊé$p¸ ¨/Çb”c1Êñƒåh_εr¹Þu`0¢rôsiÜÚ TOéEi+ ©@®m*P·ÚË ‚[¨r/0 œ´ËJ٘KÙ8KÑW)f[ êfÉꔥI#ßqë+îuxÜX÷v…Ƭæ¬ÛåJ uˆL«my?¤ý”n1 ýãÕóÛF…gÖ&»u3Å1QjՊ½Û¥M›I¹I¥]¯×µä•4î’Uk§²RN ÖîÁ‡@•@%m/ qâZ!¬Î¦­Ër„ .9À¿ÀKxoÖ%I¡Î·óÞÌ{Ÿß[ï¼í@I §S€S€ã `ESEXÍ{€»€;€ À€Û°:ãøc®\-¿_þ¨|·üMùAùqYýQišJÓʐ‰ 8ÈäÆ´c•¬’&aô)ûR~(¥%åQëXÀþ Øoû:`_Ì Ø»°WÓUë(gpv³w8;ËY™³×9;ÍYeŒúô2|Xü"¥-å)K9I/o2rè'ºB Þ:õ½ñqé/#NÓÍÒ§F¬ú$™­$j?”^3ÖJ3‰åd¢^6~NCò6ýŽ¨”[3êïêUÕRÏ©¯¨³ê)uJ5Ւ:®å´¬vDÕ2š¦hiMш6ïl[Nd|$‹j$2-ÇY%ž#áì§PMñRÊUÜ%›ºâ×kÄ]ÕÅßKfL3o½+^0m*r.q—í¼˜ãn¬î\ó܇Þ\ñ"Jïø0Êg1%Ë^LwÐt« rUo@(¹µQjßÇßxQšnlødâƅü…Üù±sDs(ùnË󽸓Iñ•»ä‰o'}q;“¾ OnI¼2¯œ­9e•ï 2ëÊ|íÚ3뎿Ë#:؝1PIёGô§xEey'P%¼¢ä÷ñ¢E£æD†ñ„³(9‹û9kû9k’³6䤎±‡£nCr uûNñ98'äìyšm›ÿO£Ò [QµWk›µ¦YkCoŠÛ7®çÅúª®H•n¡K©“ÍÕk×Q·Ú1Ý2ێ¨šŽ5zÏúEÝ Ó‰H¯¶ìE=«íl6¬FÍl9þÃzkº¿/ÝçOÒEÓ­‚µ0Ø4æª÷p÷Ñ]Ç\}ÌÕÇ\u«.sɪ‡²ÔˆíWƒD?Tg €›÷'²œ—Õ¼`äo¥ ½Os_Œš¶`ÐÑ5[™­  Þ2tó‹CWþæ‚QxDï]Y0™6É×Þsà -Ãáà9¯[çJxEjy….t\(øä ;þCeTîÊ%؟¹3㎌»v* ý‘«v Æë Ø ÿߨ ‘i¸· HøtÃÚà$é.ìR`!±;,œ‚¼ÉÄö¯³v7 -endstream endobj 98 0 obj <> endobj 97 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon.ai) -%%CreationDate: 6/22/2019 2:45 AM -%%Canvassize: 16383 -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%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: 2 -%AI9_OpenToView: -497 224 1 1518 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 67 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 115 0 obj <>stream -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 7069 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 -%524C457DFD6DFF52A8F87DFD6BFF52F8FFF8F8A8FD69FF7DF827FFF8F8F8 -%A8FD67FF7DF8F8F8FFFD04F8FD66FFA8F8F8F827FFFD05F8FD64FFA8FD05 -%F8FFFD05F827FD63FFFD05F827FFFD06F827FD61FFFD07F8FFFD07F852FD -%5FFF27FD06F827FFFD08F87DFD5DFF52FD07F827FFFD09F87DFD5BFF52FD -%08F827FFFD0AF8A8FD59FF7DFD0AF8FFFD0AF827FD58FFA8FD0AF827FFFD -%0BF827FD56FFA8FD0CF8FFFD0CF852FD55FF27FD0BF827FFFD0DF852FD53 -%FF27FD0DF8FFFD0EF87DFD51FF52FD0DF827FFFD0FF87DFD4FFF52FD0EF8 -%27FFFD10F8A8FD4DFF7DFD0FF827FFFD11F8A8FD4BFF7DFD11F8FFFD12F8 -%FD4AFFA8FD11F827FFFD12F827FD49FFFD13F8FFFD13F827FD47FF27FD12 -%F827FFFD14F852FD45FF27FD14F8FFFD15F87DFD43FF52FD14F827FFFD16 -%F87DFD41FF52FD15F827FFFD17F8A8FD3FFF7DFD16F827FFFD18F8A8FD3D -%FF7DFD18F8FFFD18F827FD3CFFA827FD17F827FFFD19F827FD3AFFA827FD -%19F8FFFD1AF852FD39FF27FD19F827FFFD1BF852FD37FF52FD1BF8FFFD1C -%F87DFD36FF27FD1AF827FFFD1DF8A8FD35FF27FD1AF827FFFD1EF8A8FD34 -%FF27FD1AF827FFFD1FF8FD34FF52FD1BF8FFFD1FF827FD33FF27FD1AF827 -%FFFD20F827FD2DFFA8FD04FF52FD1BF8FFFD21F852FD2BFF52FD05FF27FD -%1AF827FFFD22F852FD29FF27F8FD05FF27FD1BF8FFFD23F87DFD27FF52F8 -%27FD05FF27FD1AF827FFFD24F87DFD25FF52F8F827FD05FF27FD1AF827FF -%FD25F8A8FD23FF7DF8F8F827FD05FF27FD1AF827FFFD26F8A8FD21FF7DFD -%04F827A8FD04FF52FD1BF8FFFD26F827FD20FFA827FD04F827FD05FF27FD -%1AF827FFFD27F852FD1EFFA827FD05F827FD05FF52FD1BF8FFFD28F852FD -%1DFF27FD06F827FD05FF27FD1AF827FFFD29F87DFD1BFF52FD07F827FD05 -%FF27FD1BF8FFFD2AF8A8FD19FF7DFD08F827FD05FF27FD1AF827FFFD2BF8 -%A8FD17FF7DFD09F827FD05FF27FD1AF827FFFD2CF8FD16FFA8FD0AF827FD -%05FF27FD1AF827FFFD2DF8FD14FFA8FD0BF827A8FD04FF52FD1BF8FFFD2D -%F827FD13FFFD0CF827FD05FF27FD1AF827FFFD2EF827FD11FF27FD0CF827 -%FD05FF52FD1BF8FFFD2FF852FD0FFF27FD0DF827FD05FF27FD1AF827FFFD -%30F852FD0DFF52FD0EF827FD05FF27FD1BF8FFFD14F827FD1CF87DFD0BFF -%52FD0FF827FD05FF27FD1AF827FFFD15F87D27FD1BF8A8FD09FFA8FD10F8 -%27FD05FF27FD1AF827FFFD15F87DFFFD1BF827A8FD08FFA8FD10F827FD05 -%FF27FD1AF827FFFD15F87DFFA8FD1BF827A8FD07FFA8FD10F827A8FD04FF -%52FD1BF8FFFD15F87DFFFF7DFD1BF852FD08FFFD10F827FD05FF27FD1AF8 -%27FFFD15F87DFFFFFF52FD1BF852FD06FFA8FD10F827FD05FF52FD1BF8FF -%FD15F87DFD04FF52FD1BF87DFD06FFFD10F827FD05FF27FD1AF827FFFD15 -%F87DFD05FF27FD1BF87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87D -%FD06FF27FD1AF852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD06 -%FFA827FD19F87DFD04FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD07 -%FFA8FD19F852FD04FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD08FF -%7DFD18F87DFD04FFA8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD09FF7D -%FD17F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD0AFF52FD16 -%F87DFD04FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD0BFF27FD15F852 -%FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD0CFF27FD14F87DFD04 -%FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD0DFFFD14F852FD05FFFD10 -%F827FD05FF27FD1AF827FFFD15F87DFD0DFFA8FD13F87DFD04FFA8FD10F8 -%27FD05FF27FD1AF827FFFD15F87DFD0EFFA8FD12F852FD04FFA8FD10F827 -%FD05FF27FD1AF827FFFD15F87DFD0FFF7DFD11F87DFD04FFA8FD10F827A8 -%FD04FF52FD1BF8FFFD15F87DFD10FF7DFD10F852FD05FFFD10F827FD05FF -%27FD1AF827FFFD15F87DFD11FF52FD0FF87DFD04FFA8FD10F827FD05FF52 -%FD1BF8FFFD15F87DFD12FF52FD0EF852FD05FFFD10F827FD05FF27FD1AF8 -%27FFFD15F87DFD12FFA827FD0DF87DFD04FFA8FD10F827FD05FF27FD1BF8 -%FFFD15F87DFD13FFA827FD0CF852FD05FFFD10F827FD05FF27FD1AF827FF -%FD15F87DFD14FFA8FD0CF87DFD04FFA8FD10F827FD05FF27FD1AF827FFFD -%15F87DFD15FF7DFD0BF852FD04FFA8FD10F827FD05FF27FD1AF827FFFD15 -%F87DFD16FF7DFD0AF87DFD04FFA8FD10F827A8FD04FF52FD1BF8FFFD15F8 -%7DFD17FF52FD09F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD -%18FF27FD08F87DFD04FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD19FF -%27FD07F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD1AFFFD07 -%F87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD1BFFFD06F852FD -%05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD1BFFA8FD05F87DFD04FF -%A8FD10F827FD05FF27FD1AF827FFFD15F87DFD1CFFA8FD04F852FD04FFA8 -%FD10F827FD05FF27FD1AF827FFFD15F87DFD1DFF7DF8F8F87DFD04FFA8FD -%10F827A8FD04FF52FD1BF8FFFD15F87DFD1EFF52F8F852FD05FFFD10F827 -%FD05FF27FD1AF827FFFD15F87DFD1FFF52F87DFD04FFA8FD10F827FD05FF -%52FD1BF8FFFD15F87DFD20FF2752FD05FFFD10F827FD05FF27FD1AF827FF -%FD15F87DFD20FFA87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD -%27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF -%27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F8 -%7DFD26FFA8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD27FFFD10F827FD -%05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF52FD1BF8FFFD15 -%F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827 -%FD05FF27FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15 -%F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F8 -%27FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827A8FD04FF52FD1BF8 -%FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD -%10F827FD05FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827 -%FFFD15F87DFD26FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD27FFFD10 -%F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF8 -%27FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FF -%A8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD -%1AF827FFFD15F87DFD26FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD27 -%FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27 -%FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26 -%FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF -%27FD1AF827FFFD15F87DFD26FFA8FD10F827A8FD04FF52FD1BF8FFFD15F8 -%7DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD -%05FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F8 -%7DFD26FFA8FD10F827FD05FF27FD1BF8FF -%%EndData - -endstream endobj 116 0 obj <>stream -%AI12_CompressedDataxœì½ër$Ǒ&úŸfýµ?ÆLZ[¢33"2#u֎Y.ÎJ"M¤ffwÎ Bƒ$vº^4ZZêeÎÜ;þ}îá™U…F_¨ÑîA6P^™™qñðËç÷¾úúó틻?^NºÍ³ÏþîïNï¯/îîµ!yóÅ˗oß<܃ô‹ßÿrӏ'®Ú~‘¿µ+ÿñúþÍÍÝí¯øÝIÀ·¸ÿ§?Üß¼y¸¹¼Ý\\¿’‹~¹ùÅ/ñí77/¯åû›«»Û“Ë›_z«RËÙåƒ|5>†çC×ϛáW1m¶¿å%—·º|óææ/×h*d¶´»{{ûâæöûÝÝÿúÕ&›Ïcž6 ßÿýÍï¯ßÆîd;©4Ɠ^FxÓ§ùdÎvGƒë?Ý\ÿùW›ßÝÝ^[mï¾Ö±±ëô_ûê÷o_^ßÿáö;’6kýöîÅõK¹£Vqñò’ÃÒ×íŠo.ï¿¿~)s÷òí'uöVd~sùã5&Å`|ùúúö›»ä£~çi3 qƒwêófNògf IéGo´¯ÿZÕ¨µ”úÇ ÷•Œå—÷7ßßÜþª<áôí¯ïo^Ôž†MÖø'¹ù.ÿÛÃÊ«?<\ߖîÉuúÛfªt'¿ý­žß¾8½{…QxÃv-íËüyy÷½}[?ð;©âíëgŸý˳ÏÂüü¾½{¸~#5¾¼ÞÌãóïï/ÿt-ó9??{·éC×\ñÇË7×Ï¿“Qº¹Uê‹?*MÙÍë77Òüó—ß}o¿äûçW7÷2E¾{yý¿ž¿¾¾øáîí›ËÛÏ¿¾º¼¿»}þ½¬Öýòú»‡ç_žË,IZ7Rÿ–.ýáÁ›ä¥åƒ~õÇ·B}x~}ûâòÍϯ_ñ׃,Äëç _\c}HeoVêÍw×Ï_Ü ƒN…Éýü¿¾µ.oüfóüÍëË+éŽ1>¿z{}{õ£|ŸÿñþNVà/e÷c~^®~u÷úG«óþÅwׯnnonåöix.ýsuùòöîáù?¾þáúöù½ ÅyµëÏ_]^ᱤ[ež¿ö-w¾}óüáÏwoÞJ§ÝÜÝ?øáþúÚ?]^½}¸~þê­Ì×ðœ´W2þ¬íêúÅÍ˗—R“,E¿CèÕ囫·/ùD9ãËÿùöò^îÁŸ?\¾üNÛ0â›M?Ï·œRÕV[Ü6£¹ÕþÝúÛoñÏ·çÏO힟óöçç¼Yj9on?÷û¾Ð«¾Ð&¾h®ù¯9øáùïØ Tó¥Þð¥Þðes×úL_ú}¯Þ¾|¸yýòÇç_¾y‰9ñ‡òBЛÿÐÜü¿ë¿ê—ßüpw/³÷V¦Ú›ç—ÚðeyŸËæîKmúÒ+¹dw\^?¿*Ýq­·_kí×õf©êÚï»Ñ«nôª›¦‰¿æZºãV¼ÓËïÊ3Ý57ÜÙ%~ߋ›?݀ ñVo}«-½]<Ï[¿çGýúñc!?ûì›så…é¾ýæl ïߒќß^ÝaÿÕæÛ康¡þËóÕÏW7('þæ¿=cíÂÓJݛoîß^óãë²é°áoåI¾’îàŠúÝk~—¿ýêå[ùò×÷wo_qûÝݳÏ~¡Ó?^_‰T$[Ջ͗üòAäžß]^ýðýõ_®o®~¸½þ·ÙIW -ݯ9èõ/ßQ±0ðûë~+÷ò£üþ¿ŸrÿÙõw"`Ô -”ú÷ÿO˜¢ð»ÛÏÿ›ð҇¿¼º{ñö¥|{~û§ë—w¯¯72[7ÿtyÿú)M|õòòöò~Ã/J m½›/ÀV.ÿõáæO›W—Ò¨\ô›Ù#¾º”þ}R ÂL^K¯ñ&^³lí± š¯žÔÔåÃ"ëÉ6ðÆkßbk“Q|{ûý^ñEôú§Tÿõ¯þx÷òæÍ+¯¼¥øßO|RéÖÛ/oõ‘ïß¾ùaóÍÝÝK¯ù·o±9¼¾¹}sýrõÔ"é}S ùŇÁâùߢ‰ÓKe„-¾þáæêP+ÿžÿîæú`cGîÒìºâPjõë××¹¹|y°ÅýÛþæ³9¸‘-_xç&ðè5_ÿùòáê‡Íonþx/Ûêõ;V+û»›Ûò _¿½y¸öFð2”¿¿~sýð—aÐÂ^Áf䆋æ†Z}Â^Ón'ŸþøF#ZÃä×÷ nD}þõÝË -¤êú·èÓf÷‚òx×üחÿâæï¾Ý‰¤ùŸ…¼þéWehJ°­$þ_ʈÿ¥ÆqQ&/¹›e۔”S+gM9ï.¤Æ‹RÖþ M M‰‹’´Hà÷ԏR&þÎM™eÛ<zÙõgRʧ3©ñ¬?'í¬¿hKÛ}|¼òš›’†åÙgú{˜š’‡YŠþ»mÊN˳ÏþïÃczlTÃb\c3ºuŒ¥Heœc3Ú:ºí(g)øÑ͋qž›‘–¥Fó2ê;oýÑ>oG]þ՟îà˜‹2¾ñ ã‹ßaŒõȒ9ÚÓj¤·V–cŒ1Åïs–³Õh–fDzŽŠŽU¹ÙÆLÆIÆTÇ -cvjåŒåÜÊJYfxÕ˜ö­hýŸÙ¯;®™ öÐÀùŽ3ßçŒOÝÛSŽœ=[̶¶†B c˜BsØI9 2ì} 1Ƨ˜ã·qÏây¼îRH1iJsÚ¦]:MçIÖ©ËçùB&ŽŒéæ8KEsžçy7ŸÎçó…LŸ~¶q›¶ã6oçív»“rº=۞sJ ò -q—vÓ.ïfùj·;ݝï.dšIo²ÓÃižOçù|>—ÆÎOÏe–œŸŸ_`j\H§]¤ yÙ yü‹­iôBn½XýpL;«ÓΛr֔Ӧìe۔¹©q–æk™š2.JjJlJhŠÌF©qðÒr¶Ê•»öáÏ۟³E9Õ"]†ß»¦l›2/JnÊԔ±)ÂÐϓ—¸(¡)CSú¦tmÑnö™ @ûíÏiSvZÊR]Œçr—cWFm9RËё‘c;"ÍH,ûÙëÖÛ«f¯JÍ«>µž\ôá²ßV½µìé¯e¿hŸl­Ì,ÙÊdedIV"K°"óŽ‹ÑöTÝ|)”—ÓÆÊώekefÉVd±ËâŸNG+ÉJd V”'—=@øj3¦çÇÇ-sœÇcѱ÷ÏØÛ[öíÄތ콞½uÎÞÙ±7²¼ÝÄwÇã-;¾ÕßbËçžø”‘O%Ï"Óæ\ºôTØÙVØZö6 -“‹Âìáóò¤2¥Î¥³O…n…-æí$ 2 £ ²ßô²_ÈПI§ìæ­°Ó©À¨"” -†§ïÏ¥‘ÞDw}Í"ŠWћ* k+u՚X;Jï?ØIþüí`ê@. -AfÈ$3eÇ9³4ÚîI¶…fÕ²«:­*Ëj™ٖ÷þf¶deïbd>«¥üIòÎåëRªÆ”ºÔdú•–´ÐÁL/“ƒ1ýQ™¡/µ½²[¹.èÚ‹ôâB‹<¥„^4üžW%¯JÕXõ¯ÑtٶĽöÊp ØÔØþ쩎X­ìç¿Ïa-2 O½ì¼l”ùhÉEÔ§UŸXªöšÚ"5.>»…£þ½_‘©!5O,‡:ù@‘Ÿvå“Ú ->êçÓÕØl¯½w¬J¿EŠ?³¢r[±…ÛH6Ý»ØNlÝ˪V=½¬öb©Ka½¶‹ì[Ör»zw¶ª‹aíNnu­$·IT»ThW«[3Y§ò—ÛBªmlµ6Ëê<ãÖTl,­mwpmî–¹ýÕYl8ë՚V¾j*–¡CëÕ?/l‡i¯Ä…µñøª\Z®Ö6ËCëö±Õ¼Z«\ÕG¾{ÿýèªþXƒŸ¾Æ#Bo«^í+X*µì+XEV騰ŸS"™MÁM&\½ºh¤’i!• Šu*JU¬gŸ‰’5K•,¨YU,U²NiuRE+»¢Lтªu*j֎ŠV¦ Kf#•­ž å‚ú÷š -²¨ZªlAÝTÝ¢Âuf -׎ -W¦Â• ¬L掩]Ô¥¡x©êå+Sù‚ú©~õ\VTÁN©‚A ƒ6I³¸T4-QÑ•1QÇh:§Bv& -T2(ePË ˜M1Q5ƒrȺ:*h¦Ãï´DùÞD)oÄ ?=¬ÊÙ!ë€T9Ne·Lõ %’ƒ·¼»áڍVì¹ú»åÉ­ EyIømܓœ³.xéB²Yp͏”ÓÊ,(+nwÏ="_'žÆ5Žr“O¼ª]ÕÒZÈڟ¥Q°1u.ípeÏ¥ÊћJ[KX”¥Í/­Ê¸(",,‰ÓÂƘ©c-ËvUvëbͶœí•ýŸ‹ýRf›0Èv'ï”á` K±"î—t¤ŒG‹Û“¥ÆiUò£e~G‘baÕ>\vO,äøRãéËÙӊԸO=4”O.Rã±ï>ðçÀöúÁ5¹¨s­u0'Š–hEí©Å¾:Y)ö×يYg¥FµÖ–ŸÂ*ê*ÃRømÑ­‹Ô_,Åj7–ùMó”–ÑK±5g/³•­—ÝžuóÒÇ:Ä«ªá0wjøÒÂO±àIG¸Ñ1.ÔržíAÇyÏ#xdU?^þŠ«ú½Ì¶ ív§jK¥£²Xˆ²E ‡ñNƒ:;sÃqœè:Î"x÷ñȲé¨9Pd…Yö -²Å• gò9ÝÉêPBéTÆË[ŠÊp.c1©ƒ.fȟt3?ûŒ®æ ©œî杰§3w:w"%Bâ„ã9ÊB–ž(ÂÏ"Îoé„>öqn®èn++F„þÂ?œÒpKÛ‰jÁܸ§é –‚‰ y±§­2ÐY w5d÷‰Në,ªÇL×µ:¯Oɜ°Ð/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“Ž^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïäOÝý?|Us8 _M°I¿ä¯q“»“(kg3ã ¸øëgŸýÝ·O¹v÷æ@'I®LÝ&÷'¢?ŽÇ+\_ÈÚNúqšc/ßöPŒ‡Á’r¢ü1¥Á¾ú4Î\ µ '¡K±6÷Ñ5éót¢Ô¦Q.ëdُ¸Q4sQÝYÙS73²F8eLòǀß}SY8é„Ó4õ‰*´§;᳨,õ]šxcþ¬•‰n™µAø,*“áKó¢²ÔusûtŸ¦ÂËa:É!̨*§iþØ]WwhÎÚÃÏó‰ðù£vyêٝUüf`eþýÍ«W×/Ê´¿¤âX ™ÿÙYç…1ÌÁXe27ßdŒqk¬ð¬õÙ›‹†6¡ˆév.|¬7ún=—ü™ä3ƒñA*ËÂGYL|™òä.H]Iz’Ö©ÌÁŽÒU2°ÞÙäÞdíeC5T\ÃaƳÎ݂§4©9l2³W4z_ÂOƦ< —âžôj Võ x"Ý9vhkˆ¡bN† RDPÇíþ|ÏéÜ7º©–Dõ—ž%è‘RôDI:Ó4º¥<½£:-£GÁ邒u•­Š‰qTùZ%ì*cSÊ6p¦Â3!gCÒ‰—Òv¦´]äí³…Ì½’ºMæÆ\(NÊÝEò–U¶”½1KfƒužRt Ö;»Þ‡s7å݀îj6±ˆ[7¯A̓›š—@æÊl¥2Kk0óÙÌ||~f3¬ËY*3»™[sçsöÂl+úrÚÀÎg¯Îߙ[!g±ÌlÉ#·Ê:ŸƒÁì”Ë«ë³Ìísë²ÓÆC®ó\ŠÌlí“Íø‘ZååÉäíº‡¨#UWÀ9Wׁã9³Öá ërØe6왽÷:,A÷{A2÷BV üÃûA֗…BL+ç¸rˆDÓŠèYEÇÖÐÁWÒ®q·ÔµÔ®§fUí²NfJì#ã¹Z¿p õ¿ë……%ÚB.;Eš‡>M %^®n¬]ŸªB5|äqœ{Üg³ä£Û*ÔÎSí&ã‰HZ¹yž®BŸ`ŠAX",4a’]ÁnîûI”¼$þÂÛæ(¼´y4Ê­}cµûèšÌ”»ؙ)̙æ/يs¨ùi&T#“v±Õ3Ÿ¤Ô!INcúتÞÓtóåýÕ7/®¯a¼ñ¿¥š¡¨=E2Fô›¢—´(û?yUæE„Íi»WN”³GŠ;·`>âlïÞ»pB‹B1|Šr0¸¹†7O༫k¶_ÆÖd®Ð] Õƺ”¨ö„EŒ×ÜEc¨þìÙbƒÎ«[,k¶6Y/º>NéÌì< :Y t¦-uk3ûœv5Ìå@ër²Y -«ÚŽsòŒs±ø²ΨêÇÞҏmãH(hO.ÐêYìh™æ}ØÑ ª ­3Z¢MýÖ³{­ÏÌà–8PÜ®4æ³ÛÐ详 í1ŸuõZύýì”×°iŸFÒýÕ¢¦,=Ö#U™Š*žkÕO*"¨"*ˆFÜO\à~ZÄϼ‡÷Yx±|#{L\byŠø¼Fìì#uöQ‚§ >ð.gÈ9ŠÎY('‹¨ìãØ¿cJÒ¡àa-ÅÖÒ/c¡Kt‰~.qÏ5æ¹Ú³…éuaxUo­ûk‹Çvëã<Ù8i¿«@ŽS÷NΫpŽP¯f~=Ÿd.’ì¸fóZNc‹[M±Õ‡½ôb×0‰R°Ì öPoö°ø8'[†}̔Z&7Ù&“å=Ddúž†ø¢¡ §fÌ]„hHˆJL%0DCCT ¡³Iä¨$raúŠ2Te{;€·f.a#màÈhŠ‡)5Af%µ¥³Û<0XÂL–!Ã"ë™Æ67¢ê±°áZâ¡b$Þÿُì;Kvüì檜HyfŒ˜š¼´¾ ØR—E+$|H¤ßÙÌ ö£¾Z’Ün´6p|ÀíïicøÃííå«ë›ï´éao8@m>‡20%WQš,LýñÐM"pQÐLÈín»Ì‘°Ú* @!Û¼v€ÑÉÁµóž[³K➂Už¾$/¨ï°~‹³b¹ù㩁Ëüó·z¯§ÞÙSׄ m¿/zÞ\Ïf®ÙKßðH–ŠÃpgéë:Ë|N?Mž˜O”%f+œ£f‰ùɳÛüüÔ˧^85BœR‡äìä^è÷Mî'j×:ðÇaÆù êÕ¤ô$ÕÊďæµ]w˜Û -Iò×üv0¤!Öû)!0ð”™ë\(,2Ó¬z.ëWÍ:™+VáošÃNÀáoùäD³äY“µ®ÀßJAÍY7Yh -°éÙgmZš Ô´&Hf’Y´†™ó&œbžQÓ`ÊO4CM /M…*JUÕSʏ)cTˊ’V”¶¥³±ÆË,Ô´—Ë"`Ø+á`‰GJZSFkŸT¦ã…¾ëÃ%X±hð§•Úä~± OX~®ñ؍TQä·Ñ¹ŠJm%‡i‘5s m¢Œ Æã*ed¯Ò„R.™AhódˆGƒ^Z “.+ØÒÛD…+@ËÞ´ nr€å^x“‚,G7 ?µk‚œŒ3Y¨SGTø°xJôTJ1kèÔh¬¦to5¢ÓJ5»Ô(šj¦éׅˆ§Z”´WÈ¥Æñh9à_9RªÑ*vå}ʞiY¤Æw\ñ¾åÉ5>ùGjüÄ?ÿgÔøGNrn±‰ZÈVSžøm4£dß?1]O8Ê)µ u@iî]hyÚO‹¼»êj*ðíÖÍt˜£žR`ÛB&r•ÂW&¦…Tî²]pµÁ¯yKå/ƒYt*—Ifú”ݺá4å§N×%ŸY€‡Ö0©ÂqTŽZpcÜg8RVheŒ>ΑÞş¼H|ûåq®÷AåçÿZ5¾g\ԓ­q B{v–ia2Ësr“–šÄ–m”­AjW)rSq¸fÕ"\E%'†—¥-mZ.?E§[çúå§`K™9¦ñì3ºÓ„ÖS»úkbt¤'Ãa€í¨O~\å]ÁèIy“pý9µ¸9xz;s¤k)k¾Œia`Å-VÔ¶˜°÷¢Ñ¬ZͩՆ–úËZºm~ ‹~v ìç¬QÏt÷h,_úÓJ|J1œò»ËøÔ"5>ùÚO56f²³½tÂ;™¾Óy’%ˆ\ºg–7md¾´Ž™Òv4y4wõ–m'óMk0rÁÄóÜip¥©MãΘýL£RÉzFW™§—ÎS ቢÄ%<%µô:¹´§—®ÑÏ>37Wqq÷V°¨„ޝZgMl¶ÉmVÝXta 9Ζ®«â¸ªN«ê²jV¡:«,³e ³åÚMµvRqO=ûlå :æžZ8§sLIGS‡œROpCiØSËéSŠÓñîrÌ µW˜Ïó“–ÿ3jü™£üÌQ~æ(?s”OWãÏågŽò3Gù™£|ºnöG?üð/齟†˜û™Îô8OŒ€J2 A™¦¤Îø¾Cøށ?øçxȑÿI«->}„ƒõa“ú“N¸Ý³¿úÊïf囱?A¢‰Mˆ'cߤÛzä’U “Tœ†q3t'a˜§C5¬/©5LÓ!0BKÿx<Âp0<‚g|;_°ÏV@죥ìvÛ³½rú~ÅkZ®ñó˜çgÏKå1óÓ@þ́ñûGxåýx£Æ‚ÙžR85¹öœÏöŒÏUù›­©MÙtꉫ}ÍfˆÎrÔ#î×Ânl vÃù‰Kv¨‘ŸîÔ¤¨©i–r“`©I¯ôI®Y2Á0feRSH}&Ûê"óÝåØæ¶ëRœ»áÀG LŸ®N‹NÝг:È´^xö1íú1žÕ¬ApΨ y «ÀZÿ$oóéûçãYçaÆ9|löܜÎËrȬÁ6y0.Á¦O‹N{`ÑC0×Xׄ ûh ‡ßæ0„vñ^v ԙá¯?:úN0#øq ¨ø 7؊´`aïhá=@™Ë6jhÈ>ïÉ 0qÉAÖßüu áàzëõ`Àºa•÷·Í@¦˹çú­™~Ss<ŸfÜ1¥‘eömâ#k>ßÑóøn-îÑç5lÓ=PñLTB'ƒ,Ít¹í,^ûÜ ¾šHl¸áD˜5ÞþDUŸ[u0 e¢;®omó -ê:ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£!8~²J ÀÉ%çBŒ¬É§CŒÌü÷M²Zr»îfrc×!ýGèûÀz«ð·1mÞÔ¶Á÷¹ë£Wa>¼ ó:«g,ùیÝ>kb[™{ ¤·BWÖë÷œ;¸k1õîr¿ü”{ù9OÍå¸Ævæ䶖¼#g¨I¶õW¼§šÑ5mDê:½Ô¡SýS–\Š -PUyJt)ƳĒúæ·¸ê=’PYéق-m1Vv´S‰í,‘C ô¶k;é`kÃ#)¯¼ÅÊ -¥íe$â`3«s–èãEóè ¬äœ[Í<Ð*ìzéÏ3æ«åIiVÍ4…©FP?ƒ°K˜q½&²Æn`‚²4ö=üI/JSÔ²p”Àpà¯sNfQçÛgý¤õš±èãŒÿ¥ÎþÛõ§s*¬êµ~íû¯-̆ï–ú.Ì¢nÌúþdßsþí鏪ñ°b¨"¦¨Ð~½,{JÎ*×v‹”«j“«RÂÏKŽð²³iŽqÝyT,ÒÔç0ßQ›,ûc¤L8P âBÔ0ʇ§–éq2p9ó:Z6GØLË!ì†㧢rª¤¨ÖB•w̋¨"eC“! Bþƒ¼)oKòšûÞþí%¤÷5.U; û6`d=“,8¾©ý·*‘ûüŒ®¥š:S-Šj^)ªÓBŵҨ8Ù?{?¥W(Ž_j…Úúþ±oëcÛZ5ÈÕ£½Î¤:%5Φ`íVØV?„°9Fph põè‹ìç·î,{bqg¶ÍÇ\šû9,kK=~bvwÕ2#Û)s$ ´Tá GêgÜþ› ÒUã•ãH1E…Ù –e_ÉY*A‚tè -©Ñœ°²³,0õX‰ó&Lç9aË -s̍Û:qÇÅÁž§Í¡žŸi«‡yn-s]±–f+Ït<žÒBÞÓõ˜ä‘aw(Ì¿½ ý“Ôø¨J—Çûd~hñê‹Óì]•*IçW -W«ŠU­dm¨jÜhþŠ©î 5Î~ÀC9âátáÃXz1Ê!Ê8šÏ¼"Z¤qï<í¨øøÅYÚ§çgÐt“0*Àބ›á#‡Ãÿ",)™‡iÊ'8ñh3œ>M­CðãêQ§Zꆙó®Fž³%Ì´OšÇ3†yè óô¼u$öa§aØÍã|tUv¶Ù{½Už6C<™–OòÁU|¬#/tä¥5"÷ Fg½¥=91pŒ{h5^§oNhF2¯eÚãrjl9áªü[O:]ž[e²°þܜïº>åu-N@BélyÊw­¾?hÕôÎUV\Îåié5 ÿQ ¤qÛ³@.šc÷Ï™›—§D? Džäè‰ U£ß6¶/•S×A€¢3ñðÀnÈÓTË;Y]Ã1Dš[|ë:iïûßmçëÉz¡?\fI&»5—`Y¼Gà¸póG¯ÄÃàøô3:BáÏèøŸÑñtü8\‡B>µÕ?!jëøq¦0~zÐrzâ$|BøfZ×3«Îì”ærnU=¹*ûÉUcsŽV=h˜§tØ3ޛý.ççÝn‡sìÜ±œŠÇ.øØY7Ħ=IÌ *Ãâ<ϽøºGŽÙX ¯ÆïUyh<4¯›Šy$-#‰ ¬uæULàúˆŠ½g> x|b篋éý(Ï~*×~|ÑògÏüûÁ‡þ0QÑñ9S¿&;YUgMMw]dìšò²õÌ ‰"]ŸÛI¾OH£¿JwmFÍG šO‹K9p¸Ç‡F¦,C4‡{¬SƒœN3ñ¤9ñ!*uŸêH¥ö(Ÿ‹'z0Ûўµ[æC“ýÑ9ñ®DèË4èfî¦'ùc¢Ö³ã¬‰[zïx f®43Æ*8œì‘VäÓIäE.ÿ+ÖxÈ©vè$øiÉñ¤Æ}Žw@s9˜Êz™ÈÚ"°ž}ö‘1X“FaÕ,™e…e®Z=hïg²«ËBY&‘9?œFæ';SëC¬‡OÕbÚì'Û¿XЋ%ÅßYMò'ý­Æ&úó4gOJô·Lóg±["ó|Tô–FOj—Ñ[2Ë>8~‹ˆ] 4FC꣋µu±Jö3N ôóœøyNü<'~žÎ‰eZ°÷ȘµŸÿëýoþIÍ[Bùöww·_ÝßÜ>ÜÜ~ÿùç­êÞ~óì³ß½æwA¿ûêòááúþV´úíËß¼¹„6omæùd‡nà8Ža3ÄxÒÉèl†~<‘É5êoõ×?ÿ¿ßê‡â@ýçõó?ÈßÿC¨–®Øüvó/ÿ½Û¼xÆ»~ JK¥âÍ+P÷ÚÛüfA.Ïõ›¶ŠƒÄe·øçùöþáìæêáæîöòþÇͯÔ(ò|ww÷Rúâ ë—oÏ_Ü<ÜÝ»»¼úWé½o¿¹yyýíﯯ~¹ùO¸ãÿÂ?þÞÿñ­Ör¦/ý¥Î•Ç^ª1´gM”Ù’-K¤œË¹—qÎ]˜7ÿ|©u-{2ôýIÆ~“òI%Á:JÞsŠ6i>E&Ûk8AmiÂÅq3d¹\˜Á&¥“^Và抷åt"‹†Y‘C¹o>é¦0l‚|;±ú‰Í ù$ p;äî$͸: 0ëmS<}f3Œ}–ÖFiE„ÒMô¡@¹6A^C$d»M¨½h8öÜË,§Y{@f„àŠN%ƒ›†ËˍÔ:ÄMOpDÕfÎég™±?‘WÂsØ!D¿«?i·÷'Æt"|2iÒ<$§ǓØçyÓ'Ùq,÷'³p£ ÚÀ·x¨8Íi#õåˆÓ S±`4°0$¿O^ -=÷y"ü =òI'úÞ&JW -³‚<É8 -+ ×IvŸtýˆé'{™(¬gƃËÈÇÄÏqÂscäç2r /Ü óÝ ÑEóFE!ê¸Åt"l­Œ[èOäƒÌ¹Qú·—w“ûE]7c”LòÐq‘çÍ(aˆõ>™}ý0n¦ñ™])ÜzÆm²‡ AÖj h#7 O¯³kÀšÊ[½ ¼Ò, Gðyƒ5ÀÉ,“Sö9y°“±“ž¹¯˜Ì*4'Íd¹=IW™xœÝÓ Pb”û4b6ÊõyLX<]Â,_¯9Þ÷®ñ3ý|’c—q ×Í«Uæ²TrêÌY֋L2¼ÈÀŽèü³Í$yºYÎ/’µ›:ø±4äS4™ÆóˆK¬™q¢µB¨SOS/+oá­^«¾xèó‰péË ,@¦×«%5ê 2=e Ȧ< AVã(Óºlìd¾‰rÚ\µåZQ!X{v_¡'¢ËØyEýI”Yдg»¯<–_VÜ+Z½_}õÿøüû‡÷ØC¾xóío/e>½{ýã·wßqOùõýÝÛ׶‰¾å÷ׯ¯/®_|+¬w›yó‹_nþùŸŽl<2SÒØV%ÒÉL·m'L-pÇ65 ©Ýq&=¯Þvœ˜O„oIß`E›Ë•Šôðøʬ 9„ð¹1 î…ûò -äZ¹Q{¬†3Ì:aõ>Y¦ZQÒê0Ûz_¡öÝl7Ø؃PúÑ(Âeso(zk[\(Z/ì²>›Sæ¬rÞY¨Â¸ü­3øá¼Ùë›=N sOºe^5Hÿ -Óyµ¤Šä–Ö Ì"F–ÖcO’ñ±öȓ=ÖkЕAؗWâk«ö8©½ lF[¥žNW±7Ö5«º>‘_UžÙëY½ÚzI¬&aßëd+¡÷Jöµ~´”ÚSÀf…Ès”=Þ¦à {­t¯0Ür2vŠµ=0 ¸l®Â®ºˆ„±Â¸1Å°Áw²-ÉV„'îúÂN;áâع«€©õÂçEùÙÌQ6â,¤,õYԈÍ,û…ˆv6‹ ý1 ‘=bÃ]°—‡™EXÝEÂ+dzbÙç¡ì^BíJw,ï0@(’Ý +‚ r}–Ö҅Xîj¤uÙ$a€e{¢]LØusœqߪWö·!,šNš¶S'-¼ZRñâؾå…SädÃ4„âÈòòùÊ;[4Åz‘HÂ&šJ -ÁÚ²Û -UF[ºaãõLèä8ÖÖ -ÁîÓGªW•gözV¯¶ž|ýfûú0¿¨ë#ëÁJM2b2Ò2UOúÌÍ!cJƒÓˆNœ`<,©|R/“Î!y=…`ÍÙ}…:@ßßԊDîN2j{F°ûì©üªòØ^ÏêíšN4½M;ñ¬á^&Nšr+ÈÃڑP80ö£Œ’ˆj½ð|نù„ý4` šd•Êšž±XlvȤ›!€%|™ù"@Ÿ Xd²$ÆNKŸáþ!¹´C 9tc½J–ù{ec0‚(@í6`TFŒCù”l?Ú}"På ۇ°fßzè!S‘ŸŒˆõS.Ž:‚Œ+e ýV'‹h ó w¨c¶ _ÍÕÏ"œVŠÞ*;²ˆì¹¹PsJ1rƒ¤BÔPDû˜ûTn-d²– _ 9ÉPÉê¯Ðc¬ÊË: œÓ²¥ŽdOBĶ$“³“íDF Ûf?5Ý4t2V/45OØ°Ü1¼pÂb—™7áÆnnöYNƒ¾ƒ&à0Ø4Œ Ã0EèZ²O²ÔÀ£sחõ$Ÿâ((JqÍBUzRxêfîô֓u[‡.ÂÛ£©©HE• 1S^iw›”C¹÷Âϑ*§R|®ÄŒ¡©Ò cßÔåkÓît²tG%­©KÄÙQ–QÓ¨QìV:¿Ð_À+[¿iíŒ~f7Nð. &õcœsÂä.dQ³EŽGÇv2æ´ ˆ˜—'c­å´i*“Òã«ÚªQìÖp2«o/” h³¦2§,[u²?žW毰~צdÝ°DMYZ~µ¤"4!aÕíîˆÇQ¢u#`Z‚s)d ª—YGØ+r‚µwU&ŸRƒÌ€°½¢ÁÞÊÛ3‚­úòX~YyðRÑúýÞ!é}” ZhSUkÐ÷…ÂíYP.p§Å ÕG‘ÞD…[´ ي6»AKÕ™MÅ 1Wæ[\´PÛa"0ƒx)Û+­ž–á! ‹Ù)xb1iÉëŸÀ´î&-y …E«"$À\,Z`¿a>(-rFŒü¢EÆ -û•´°©tã8»A«\ÐسÀQcÄNiÏ-‚.L<½Û³úACžÇ¥= Ô)ˎPìY.;{–@K{X3;Î Z²²`Ðw{Vԓ…9Kd¨k–°…†ˆgnmY`¡«Æ,©# „ÇlYÂÛ9` S–ˆê“ì4nɂ™4K'C–ìjaÇêUü¨†,ôa—EŒ,†,iÿ~Š¥!«—¦¹ÐŠ!«—Ù›×.ðcNâ…!«‡f<ÍnÇÂVÛey±bÇêEç¤^ر°©Q2.v,iY¶pYQŎµ·Ôö·95õqiÇrj±AardL&3QõL.ÌXØ׆1×kz˜Maë+•¸T©fƒòzŠ•ª4¶°eùիʛ”zÖ¯¶dç"EÅ¥-«R;æä6*X¢6/MY่¨j.ë´áZO!´¦¥J5 T­ÈlTµ½Ö”åOåW•ÇözVo÷¿•%ë#Œ† 1´‹óRnMqh܁ðÀEéh÷öXJ'™?ª;”÷Br•}kh‚ÝRĆê”-Oß«¸{ì¹2hÕ)H‹FêݙH¯ ^_ý>Å-å0݋cÝØEgŠÅ3HmiÆ{× (øÂDŒqß ðV‘–ʾUœƒ]8¹¯ÞAޙ@)îAvë4*îAԗ'©Âýƒ°Rßq¡ì€"à;’»‡J¦<“û°ËžÞ?sÂÁiºôÂôDÕ݄ÐX£túf™wâ.³W+r–m€…✃µ„ïäN<§,݅ͅô6UÙgk±u‚-ˆD;WŸ!tcZ—½=§,½†Í…þð^Ùú-8e¬å ú´òÂÈÃIè>º¡—}xê«+¯–®Ãz™ù›šœbM.‡é»Öݦš&°ôÖËüὦõ[þ;‘º„é™ß.ÀY&8öM*‹ø^´Nl¹ùä ÎBE¦Ù›ጤ¸«5Žˆu¡nϏ0ïQó€4¦•Š)`AõBø©€Û$ìßÉZŸÀ˜ý֔˭²k±U¹µ 0ÁD ¡aïU÷õ© –¹Ô5wCîuSB]0ŒÃ<÷X†Ž,¡B1='«Ò[/Ɣ¡;Öº*¥kØP%ˋP˜«•EaC›V åª *Ÿ®^W^ÀëÚ{ÓwÈCŸÄE ï§ÄÒG {²wqRïÐEص‹—ºá ‰•›š6kÞZÐà+:íœR;ɜË$+žê!Å2?ÍS픥§º^X<ÐWEh)ajfY%cXSë›Æž×%®e7wW¥q0Ä«›÷0V‡µï±Å‹ì„¥Óº^Wüѵ®J±F—ŽkîÅ4xe²iÏ+ÂÒwÝ\ç/àu­ßô's_ƒ£ ÛÈ+ÍÓÉEót[dÑ<1MhÂYhž`/¢3 ®yB?™svͶ ݪ§‹êé¶À¢SÂ*>ÁºP=¡Ov‚ -ÛdQ<Ëç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgSÄÓù…Þ}EëÜïЖ«Q#K­³’‹ªH;íE™Ätè/µNڙ ßÔ ûÂ/½2§,´À†lêb­¬¨”µÕ…îY¯^èo敭ßõ¸3ü£Ló1âVpø«_­ÈàHô<ÆâÔU#Ájë ö8Åíó´³6B €±VækÕ‹‘g˜)Æ¢•É®%lnlZ-·î›sÕ/ôWðÊÖïúúÆ,àqPõ°Ã -V-@”‘yê”1PæëÝy±Àî§ r á(³£Ud¶Ðk;ÿÐ+oqe`W窼°üÃÒ4:£‡¥ÇÊ<‡!  ‘zøré”ˤÀÑýH¿=ÜìŽýPö’‰Þû€ ¡ ¦¡W§¹’Eöù”Œ#‚*Êd챂Dµçk`—Ê걸²B`G?£ÄàÞƶų̈Ð(yðiœÕ]G»<,yà ž'ªS®]÷c¡ðtY‡&Ù^_ŒnÉý±¯:°)ÀZ"7Å)èw%+¦Qk‰ôτ jÁãX 6g‚"ŽšëX3Úª -Áš´ 5¸Ö4èÞZ[šÍ¶y2¿ÎŸÞëZ¿æO(H à ¦Ft2ð„ÓÇ^‘ ¹,LŒ 養 ó+0öÂxCÕÖ)ø»r#”Ò‘òe߈sXiµ…0 §;&¹b' ÚP4Äú(êF#CÂ;„‰[/œæ”œµ ÎPÅpÌ rZ‘Á)U“ªB¯Sd!U²’§PäTóóIE'ôaÊ"Pf^Hړk`hÔçËóÊÚhîìU ÅyÆ´ «±ÛŒ•ò>lL+›[¥ |‰Ï E@_u¶¡†D‡¦ƒo¹SCUðV9Û;à΃i‹ š¨C¢ <6¨}’æT¿S™Ëԟм٠ŽíS'–Ô©UɊ¨:/Me‘ÛR4k? -¸¬3¶7¥„ÅãFAR=¥Ð'ù`“uÚïsLOàöðJ´Ú½Z‘eûÉ4»ˆ¡Ùß(ÏÂí#ò- ŇtøÆZ/”½,µUÙçÐÚ 1áĵ~ÓTCLwµ=£Øþ`~¡?¼W¶~ËÆ+(ó—þ7Ì|ne¯VäYM¨€ßÐsE0-ÇAáyN1ÀF¯¨¤æBY¼CZTækÕo5ò¤p­ î]Zk«…b·–Ç«ú+xeëwmúA†gNؗE$óՒŒ vR®Z5Ë`@a9œ2QNpпP¯‹H3šºœRµ[ Q‰®ƒR!bJ›öÙ8Gy´rU}©RÑÞkÖ.€ÍWD¼Ì¡Cñ7äÉYq‰"¼©y‰’9¬²YC¡?‚ÝÆúB&tmÇZYC±VíV'ó¦© n‰ÚVrUØÏ/ôW°Êöߵ釗ô h-ÑŠkÏÉ°éA†‡ìÆ!VFé(h‘þÆJ¹*ÒKJãØ^H8Gn*sJiՅ #›a¤V&\•1\Þ¨ÌiQ®\V_«Ô´÷¢?™±ÀQÝØL‚lùK°;ö³‘yg ÚÛԘàÈ*pwX=Bv‡@¼CU KÊïÀ¦§‰oƒ¼"4 ä£AÌ;TÈRŽyGŸ©çµ€ÞqmHî@2Ð;Í-qŒõN™ˆQö¦æ5ìïG@–ãÞaŠÀ¸ö»èÀveðpüA…n }‡6T R 9wuÀkî”+ïì ͅmoê*”Ò¨+TFÎ'•Õº¤­a¢X-—S íuþZ¥ªõ{Wý? žî¹Áñ®•¬¨“9Ç“¹4WdºSÌ"böæB¹×ªœ`MڝN–즩k2stmtjÍÖþp~?¾×µ~φÛÁx!È\5·Hœ,r—ÜŠPK@”ð -°1öæóìpà«Sl™Écß\`-ÏM]…PÚt–E*Lz³Õš0·âÜ6Y(&–gó ýù½²½ý mµÆÂ"Â|@aŽÆÊ€Õ“ŸÅ@Yj¢LKpݏàiž†¡†8ÅD#¨×ä?$v3ÈÊÜ/T'#“ÛB¦öʝª×X˜lÐ=J®~UE -øA)´RF˜/üV'‹Ô 9×(€–4ð(§˜ädQõÂþ&LTJ±h¸Ðeäþ„é$0Ð Æ$°ÑXŸ· À5¢†¹$G˜Ì{NEJI£Æ” àˆñ j/F“&€ê«ãa€NФcQ‡¾ïs À^ƒ|GE²²8h÷cnâ°›ñ!ögï¾%ºè1š=ÂN^­È¢ÒáPnGãóÍç&T |¾Ý_/³€¦&§X“v§“û¢O—º -Úð§Ø­åÙê…þü^ÙúE¥¡ çc‹½G‘p¿“=«>œ†’Ú™J†…Œà¯ ;¬µU£Ø­îo.´€¦2§,[u²?žW毰~צ -’SiŠnB¯danÀº8(_dà“ŽˆóÞwŠó,‚üë…% VV)ÖêU™‚FîÍVS+ëìõj«F1àçú+”ÊöÞõBó' XBâJ܀#âà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q~ÉçD &pD\NÐ"â<žÀq5   â<¢`ˆóˆ‡Ä•ˆGÄyHÁç1W‚ -W -–h¸Wàp¸Xàh¸Z°ÕØÇ•à‡Â•è‚%Îà  -çñ…óƒÎ  -çÕý^b –P¸dàH82p$œ‡,‘pgàH84p$Üþê<à°5<þ א ¾æÐ~¸•€%Îêu%– ÖU)-0­!‚Í+s”[it‰†ó‡k®ó(uí½ér 8‰†kȆa+0ÿ‚ró`€ÎcêeUÐT䔙֐ ÂVë2”[m²ÃùƒùUþè^Ñúé¬ÕÝ ;Ÿ0b_r2¬“ -h)ë#ÍÅғ{6f³.`¦öBaa!Œm]N±F«aBɲÈÚS¼2šV[¡¡>]¹®¾@©kïM›òQšû:õ5ÅuL`¯Vä^ƒ“`óÙ(éÀuAõ‘B¥¸±Ç43¿{çÚʜb­^K¡‘ƒF7•%È©mÕ(v«?ž_è¯à•­ßµíՏÐYá®ì&U_Ò4i¶’aNcZàﱝwO"u8,ÓäJ¿Šil*«k՘~!Ï¡ÆM­L(ÓL¯wiµP¬ÕòxõÂò -µ²õ»6Ü*f“M°Aañ¼Z‘ш²›S²ä.=„-=¯k®{@|òÐ^HyßVækÕ7?'瑠ÅRlv¹iS?ÛmåÑÊEÍ;Y5ë·üTksÌ -i4pQS¯Vd ¾h¦À¬&b^4H€Ô=7”ºÀÆ~qa‡8Ï©­Ì)֪ۘœL·ÖÓìܶ©gölå²æ­´¢õk¶ú1ZÀšÙ©JH…¾Z‘¬ Sè%•1žÛ×#…øB1ж}¿.°×U)Ö¨{«<ÁpÑoj]0ó©mÓ(WEy¶‡ó ý¼®õ›þd“–Q‡D…@^Îâú2bÔý .(ÑsÆ ”‘¬ú9±}¶÷9qyÝ/BÄJžšZ -ÁÚrÍ_©²¼#]÷¥žIÃÓkkSïÏdTh«gýf­ïwPÝzF»<*]֍ꬥÆ5cöõS;.c»³*Æ~°Y ­È ֞ÝW¨˜&àU^„voÏî,ÖÇòËʃ—ŠÖï÷S-Hîȝé-#Ž’|µ"C6-Àh€ -*O7¨ôÑe˜æ Å9Ühåõ Ñ s[W!X›Îߔ:)ƽ©)[m27¹Nšgó ýù½²õ‹~"ÑcÝ¡CR#8vXe_-É°èÀ u/ö³‚( 4á N0Y¾˜šË:uå55JiÒîtòÀ×ÙÔºh- -¹i³PìÖòlõB-¯lý¢?•„ ž:ZRŸÞ‘.•:2ÞeÀ°{ TÖK#I!˜Jp*ÚÔ^‡e×Ïm]N±6]›42œ5€jÔʐÀ¶ÏM£F°;ýáüºòü^Õê5š JCOG½Ić);ÛÉ0k%ÒÔ¤ˆ\OH¢Œ=6ÌÌAc{7fWŽí…›jeN±VýV#Ê,jeBí<6­Š…>^½Ð_Á+[¿ë'ۄY -êð øþՒšKjˆÑŒ– ’ŠjPƱ•bÂH,ÙýBΐ ª©Ì)Ö¨Û{”,]Çüxµ²¡Ó©Új¡\•çÕÇ«ÚÔºV/Z{ðSFȽ#ðíú7sIí¶€vâF UAvËkwSŸ+°4îÕ \wF¬J®¨nX ;f 1P÷„Á¡ÙµÅt˲¦1UH7²vgìˆîi1ñn݉é²cÅsÃXK§rsÃ;BôÝÍ xWð[í"q™¡b¹ùT8[(·´§ É=šŽâ@î¸ØIZ÷´Z˜+Œ{šeQ‡PQܔ´Áô n˜’ 5f î^–}q‹åÄ ÐÐY^6ú!ÌQ6/߳yfØÀ‰‡kܕjFu$ܜrƒËF<}ØÃoOpOÀøT¨“xøæ_@*+¹À èÛS.+HIÙÇó”ã -Q {?N•š‘­›¹á­&',°N-H¯¨À$½½œ²>W!×g/Uí¿äO£Ó|T֏£7Ï¿¸}8p~]þñåµ>Ïoý/×?Z ©Û<ÿýõ塃sÎn^}ûÕõýÕõíCsƒÅGoã9;ÿtóâá‡ÒıçúêþúO7×–ÇzùæxÏ4O#Ïsý¦}˜£—ÿæú»‡oe.îïnÞyõ7w¯÷.pï‰Fõè{þýõÍ÷?<<õE÷ç7GGöü™žít~ûÂnv𰧸ùÓ5ŽzâoªyŒ–Eœo˜U…È32«‡ÜӒõ×â¤'ƒ›¿ï‰O¥ÉÒ@Åo-ÚÕ›œìø›¶ŽÃÔeÕ3Ÿh —ý¤cvԈƒÔ åä~èôðî¡Þ—És’Æl#wdôìó "¬YãØ‚È78}¾) ŽÖ‚ò‘§ªx÷Äês1 ÏÀ‘kBÅ:UI¨×ðjÙ*¤c5AO€î=!¹L²½‹jFgÈt~îÄS%½;ÝlÇs0GSÀé -Á6Þ֑TrÔÞc#†N 9L³ÂPßNO - €ÈE[3x»î¿”Aàó}YßMvõ9洘Ù³"%óìý<2ô€H³òn-9Ž½Þ⬔ÄQIÈ©M †Í­ 5 •Ý=¼.YxܤÊfŒc=¤¤Ÿúž‡°% vÇ{ y•/ŠáøVºØ…XDž0¯5²{ša—õ]&’ÂÔ5KœhZSðP‰q´øs"ÃII3ñ¤’‰ÆYÀ³õšº‰©}ÝÛ¤¯Ñw6`coY„!˜¤XP\HõÖHM¸Ç¹yÑLé#sCP™­Õ™B Ýyk ªj7@X½ièä6ôŽÑó8:á‰A.Òh5!{ìÝhqt0³ñ:ÚíÊìês -:Â!g $Í£ÓÁ¬  ÜÀè9¤ ê=å6]Â6 ° %éG.Íl‹‡”јÂÐم‰—å>«P'Š¨‚ƒqÌ#))øQæ*¸BiaDìWàÜ%u ¾çDbò°vžúÙfx>¦ö ˆb†;52³Œ|˜{Ȉ:zla§«|† Ž˜ÄNuÜ΃º_ÌAÅaÍ}a`Êç) Z;¼rDj¥Èq£~Žî–‡×{$¦3NèOx2gyº9ZŠ¼GNDa¦¹ !3E —ÐXƒ¹ô43݊…Œm’ÚžIÆ)S_À2qn[oÉ;@û&ŒŒꤘ¦Iªe=ÄiöI»™`zOçÁh¤‘œ:tÁ‚"¥s†Á.;Õ°{¹ ±>P±;šW²^ƒH6^d¶`trq‘ŠøÀ©Ó5BÀÁÂ3gMt6‰Ï£÷Ig9@ v›(ss[Ö¦÷Š¯ÊpAÐFCÍÊÃíõzmošt†Ò,4÷<Åkr…Ö#ä_@˜CçyEò-æñ”¤3ôjŠ½rÃÂD®ÒM³&æ‚žh)‚f•î¹©vªòømD8a{J°â“^Lüÿ¬÷aǙ:}=cs½.nj¦ 1ÀÚtl£›°"çàl1sÔ=t ×j²§ÌLÌWWžFÐÖd}sôËDˆØÆȖrIÓZY’ÇEÉ$Ái/\1àØùæþX€!#Ü؞›6  -£ 5ó÷q¥!HµWóy# -Bžß7caÅrTÈDÃÞé5çaFîk²Giô&§¥NF\»zÄãäý"¨²ÉÞ¡¾eýŒºä•…˜ÔìU,sCŸK2Š•àÝ8À‘¢ !vÎ;;t‰Q‹Ì%Ÿxb­"ö!EnB§ßÄýUõddCàIË¡þ#™´æìG´'EÓd'o ¹±‚<¦^“ Žè/PRèԗ5ÔJäÑ t~Dg„5ÍË[y´‚¶‘£QfÍ3}™°9–„$vpEšétËV{šÌÔÏÝA_5d•ì±ÓS_‰ô~j04-gH›»Yƒ)X—6 -Ã# -ø ‹ÃúSìõ ¾tç£ ÒnÅpôVcâXb¶ÓDMJ̃mšcÓèÐk_r}\G3³>/â/é’âR)¯Ú­ÀôÏ&›LšÝ)d˜Á£Sæ7ØÑ?Cª©aƒ-(Ff'M:ð$ÒG#÷n hxnl¬oÔsQ°DF›Ê -¥a êSffØ^5D{\ŒCÔ4µä¨ /"€o’fÅíë¬G¶­ijpúœi s°²0é­Âÿ4|’hRf?ўêA”ƒ:6˜/)š„-CP×EV3ÁˆÜËúÞ÷4CÎþÙc¾[7…³~T¯ËU±¹)›ì*‚:¥h!ÄÑÅ ô–‚‡–P¿3æNÉ´ªñÂ!©ÏyR WÉ -ws.\t ¡K‹‘ …ž‰Ãy£†ÿr?º`fA›,·-ÌdŽ-˜þ躇,Ȉmœ2g§mÆÎ0£F£ öf,‡±{5ŽW¥6Ý1qB“zÓdöÙb^g“µ¸ÝOÉ(lrýì[Ü2%}ªe ã:O4}'b·gKf>BTÐWE€uA- PnƒÅÀ SmºÒ4­U^à`æN«#˜ïÌ|Åö9Gž?ûÂî˜@hq"«F-´3çrh pT™·uöÀ{ìœ,…H¯y`gc8XÓiÔ]ÃÔ²úvHÞ¦Õujv¼¦Ò<óÈΙÁ¹4 *çlþXÃ@í{ ö±Ï¦·‘«,Ò'L%}©0uÀ›m’ÙI»aŒ#LÃ; }³®¦ÆäΝ¾ gËlNA†ˆL²Tg`LŠÉë‰ÿ•:hÿ’F>~Qø3WŸ-ß2ږx'ý ß“àìJÆ~û‘iÈJ É •¡+ÚN­jpšEM’0ρW4öw&"m K€3z£)€FØ?h*½Óñ3쌺áPø¬¨!ٖ…sþBë'ŒŒ£h@íxH„í<+œù°ø~Í]9ÚäH©Í7S¨A²bF)ߒa;‚ @c5æ!Ä+v43èJD‘|RN÷¤h¬·Á$ƒR{&ˆ²­);`;UO.肧Q$žƒ['ëá2ˆ*̱9X5Š/ÊîÃ×çü01üT ˜spâÛô“²ö23—TCŽS6y‰ê‰‹>¹ÉT@¾@LðÉ ÷V7ÑSFOA -xûY­êõ. 3ü¸ÜGR1~vnE ŒiÖs­9ñìNˆØ=tŠ÷™‚½ «?3é›psƒÀAYŸn@HÍLˆ)´à‰kV}ŽÖ5mq4<|£Â43/LiVŸ/mœJ êî¢O´‘@¨[•¶`V¦V˜N•2¶Ê¬ ÔVaáãQ­ÃjE¨ ЬìÂÉ>iµ4ñ/éœÇ«RéÑÎúÉålé¢hƒcýÎó®ú éT1ÇæŽY£zõ̶ ÉIǹl… 'ÚÜ@&£¡éR'/4ŠÁ™”Éç1 ½^GÇ)<œ’?|gûº@£'€§Ç¢/—d!L/‰-`Kk€À´§ÉÄ;œö={5nÖX3➄ÝÁ¤§œ¿×UÂSí>îY „1Ôû:H) ö¶ÓÌØÄP½ª©yÊÆFÓan¨°ú¤ ÞIN)œ‚ÌToðÂ÷x|w‘YÌÌK»(}˜´«+rS ‚Š H\c.\½ I6Ð!cGÅÞ6šÿÂ¿sÛ(¨ØRçÉE¢Ìšéx*ö V -|.óDnÈÁ@Sá4¨Qή¢gÙÿQk…/ çžìŸÄjæðN½[Iíº@`£³&aÊ5ÌTDÓñ̐@û ­Ðû¢ÐzÅ!€Û´(”g  AÇ>[Õ=êUŠä-BVï–pÆ`škÇ+1ÚȜ™pQÀ'ÏeçêgÝ Z2Çý/ wšè;k㬩®½ raêì*òjìT'#³Æ¬·5†ìŒÓ.`á™u®15$thQ ñ™²**Ñ#jIf -"@,Öð˜PŒ³'±³Í3ùá= à{ F6é4²z²÷aªùgõÿæƜfuìq¯êõ1™­·u>ð'v‘Þ =é‚g(§©7Ûb…€…µ}Z¦cĬ@¸©6שí) Š,'zÅQ$ö$ғÏÛà»b*ˆI£=iannã¶óº¦ÏéÀÔlúÆ!TÛ8 Gˆ3¬pj¨‚‹<ól*õ7±k9âÐsÝûxö2z¥hi25 <ž6ŠŸS“1“Æt¸XèÞnŠH8×@QM³:œ0Ûëô£môȚIµ¨’‘3¶%ª–Öžy{®¡Èס£©snÐŒN§òk:ѕ¨°¼ÑpXy.¨+%#ˆ–&µ\†È((pHJ–²&¿¢JÈÀbe:´cÕ/øY6äÎÃRçgx¸»[| RƒgàU´•!E퐉±j Îá`Íæ‹u|'՝{CO3µàڙša”8°‘úEpàÕu£ÐÍÊX¨í-º·‡¤#%qBʓ¡ CË™ŽåI ˆ®ÕÐ ¦V7|$¸‚6L8zû95žSM\4k]júèœt göÀü›·š")ÛÒ¨ðR˼BŒ“tҙøão—'ºaÕ·Íôrz‡ŽGAˆG/Í~ˆ ³Þ0¥nŽ<0 Òð`Ê1SØGqÅàâ*욡›´Ï!O€Ñ»²ò­¢ý:©ÿ¼ Þâÿ¤×`塄Yü\"ÝqŠì‰=§.NÆ.#ŒeƒÂs— ̈…ë -s,œ5—EÉ - ûõ*w,׉b½¯œ -ˆ Àš#ƒÜñ2µ@Ãö‡£~ ÁµEž› ' VžI—Šæ³˜é¬ä&zêÒVPQeŒÌBfÚ*B×(Ýž×s#ªöXcŦ‘9ÅázÅsG7QFµÆ……2ªi£a´aí10’‘l`†!!7FÆ Êj'„¬gžÂ´¡Í’9ü[ØxU3Õ×3QrElJœ´ÜH0;ˆ€Öì¼²¥b[ágˆj<o²,3ø…«ä·QêÌâÕ`#¡ïxgWŐӒ'~Òè”}ʄ!PzK$K²wììmÎ6= Q\„Lø4yêãÖê -ÜÅè`â<´6&ôïˁ€ª°›Á5-2”ÚêgÑÒ9Sà´v궮·gèNÆ%&ÏòÆeØ©Eݞr&=ÊW€¾•yTÎ+`d'Ô­ iJœ¢}B†™“*;%2Ö+>ó¬~ÝîÍÍ^žÕ,+¦ì0*˜’‰LáBcÉüýH À“4œçG'aŽ*‚ÛT ‰–>5u0ÛAd–;¶’ÀÝ"hOûmt`ap u4Û}è `ƒ£‰€‚ÿmtÑ ÷AL@¨¾î%jâe4™åK³K `Ðê¹ùOf–Ä2çŽ7™\öŸ]ˆší àÄ:ÕqèGÆt@ ½ž÷ˆM¥H8iϝ¢Ò„Õ)þ™²‰¼èt½é»ñ¼t¬æ¤üqÜ -àv-ðŸ~t ìz?òTˆ$€Úї·ËvF½ @âóÛP5[òv¦/ƒ9å@€ÐM䧋±iRV - -n#Ú BӖscŽ˜àz·×ˊ—€zC]¢@‘í€X,€Äˆ½Á• š'gì b ¬EåŒAARc¯²®ÝÔrtõ<"ØÄ4/î#ÛbÍ·9*e“ëHµ I L“šh’±±Ó¢L°½TÎ'µtŽî!`*ç€7'׉Aˆ„¦úÏ„óãLa -¢<ëɭߏ Þ9ªúÏTð ¤È쮞'֙²ßÙé†SV¡ŽF¼N £}!Íjè0QÓ£Y0õ0ÃÀÄX^Œ¼Q&ÆÒ²0zðp‚ÚÂäpÜÆÜŠÜQB Pg@=¹ódUlm¬G"]¾Øè(~˜¯ŠJM¼ýx}ã˜#%Sä:$Z½øO =ÂÆM,͍»¢NŸbeg*à±Bž‘î8 †{'muŽ†4Ðaws‘±Þtd"} rƒ‚Z%1qpÞ Œ¹Z4¼®QCrô|6X›xø­úüh–· pÉÌîÀõOœ'*EÓ¥œ9-ôD›€ÙÝ:TYÅ;h™ ²z€ò;™!`OL¬öºCáf¿øã^Æþ—›ç_?ÜßÜ~¿ùÅn·½ºzûê÷w—¸xgV¹8Í¢J“Á«BVœBßYk² ½´)Cè9K]/¢ .Úiì´J2ZDҒÒYØlÕ©‡>1ë}_ÏÏcšpÊ90 Rý+9FÅÃÔë`¢,‹ê]æ5ôë´Ü§:'"§ÀH¨yõå`à™§ÄôŠ¤;0 ®±õ„Bv*°)˜£›Š³7€øêÎN7V ö!…1?S‰é5Dr,×÷4‚++‡ÀóSªG”0 û Ô<8Œ‹Ä܅ò¬p¸2‰öG.Ù`ÒNÀםõÐó™TËDg¶rzup_Œ©ÞG<³*F½èj€±$aâgîÆövA$ä¤ö/¦œ†e*¶m0/ð]lfcÒYT&`¼Œ€éLÔÆ&Èã@@ñrs N<<¨:É-z¸^Êîúapï}Tz±ê“áÙ'õ2Ž–ƒÅÎ2¥ÛŒ{Ý©ëÀ#¢Ç;“‡Añk?™c¶c.È7«ß7ÊθaÖ ÌcêE3-á*2e:cךÔiÒŽÙ¿„ˆˆ4\Ʊ¤ÿCy…z×ÖY½gc”)!@×c=@÷Ž¶“Ûmà‰cÕ^ˆcÂ0#¸‚ÉJ*†Õ‚˜½]VD7èYY!#ç€V7!¦š4O óX/Ž /HêK†ÔÒõigàð#ûÑ@M5î™lßÅñQ6†Öù«ÿe8—µ ™š¡&-Çefê¡iHaD!¬áÜ A†§lÊû²ðd8Go/+‰ºhô`š‘Lø´‚ø®!W Oôø +…´M•‰y -m ÓyŽ:aµ¹¬¹¨ðg2Ÿ**¯!N È*FK¼ ½PR[¢f– ÜŒ>*€µgÆVô:pwê†WŸ‘}ù‘r½ÝeD³â]h2ÁÙ"z^Oo÷¾ ¥˜+ )£—…¤à‰ÉÁ•0+ÆÆî3jNê蓐ê‰À2Ði ×Çì‡׏<^½ŐK~ˆ‹ gƒ²¡=ä°Gúþ€‡s®¿±gdMvôßM*éÕHÎù¬xÍ,:%‡cЁ {³Ê¹°Ôa:‡o·,®¾‡‡¤+†H,X3íæ§e¨5„¿cT1Þ³ ƒÞ¥+‡ rVo»w¸oÈê™çk a~`<¥J̟’õ‚Û<Æ| "5ñèDÅg8@á¨'3g<•Öë²A_Ãь˜RÌ>ø‰+@1jÀԇ¬)Gªj±V$cö1Ž2*󀟍Ç;â˜Á!Kïê‚À]ßÀœ©Oa:èސÉÍcHªˆËÔHÄѬ`cR00ô’÷´#^ Sy«Æ±Æ<ª¿{P0bÖÙB -ß3dµ¯‘Ò€ýÔ{Œ¬s³“M¤=ål7z&bêu·wh‰á't„†{ãY9Žè¯¡Óóö*@'aqrõê©!!Nz²RÜI,R›@|’9R°ŠCºça‘½Þ©¦$@úÀIiÌq“:\{ʳ&­u¸÷ª8 a¡¾Ï’‰óT=frTÈo…F—°u#TãšÂûí2É̜æÀ’É8zĜ›ÀN#º‹)Ø«‹_§âž|þéUÆ 0|ʼ¤žõŽ [Èà óïËY&”ñ¸ ý¢Šmª'–4‚6˜Kß,<mÕ;SU7?ö¦íÞL*´’‹³”q¦ ¦ˆõ>Çê}¦U•ê•@?Q•Ù£T &ê“þÆYMcŒžœ)o©IN߸yžO£þ{ø=`GÍ°¶2]›Ó‚9—´1†Îx¤Îs_Ò -¸Ú5Ȓ®ê@ÊCJRq„õª XZ?Ý&MÛhEÃ酹mvñÄýC“y@·©O™oÑÛ±µzö¸Àüï´µ ¯Xð b{g‚"Aí®¬&àÙÂ$ÁJN 4@{à@›‡ßfKd®H Ó×AŠF³Ñmeމ¼ óÐUÝïgúÔ0{'4}Â5ÈL謅É"GE¬F³q!7k¬q0ÆÁ¦ôywb þÀ¢Ë|B%ÛU=À3´—å‚xÒq2Ãc5-,¯ìlã(r=Œ­XÖ¥HŒkRh ‘GKª]ÖïÓùŸª/›ú@_øMc`¶£ÎùjYã¨N%Ç æ¢Þ‚µ˜gŽç}ªÅÖ •Qgþ0èp”‚·„Q-ê.èah yhQjIæ¨X"PcP‘pj‹XPiå4†ŠŠúƒž„ËŠè§Q“¼™ò¢ŠÖ°ókç±s¶XÌd±*Æ«OËà©}Ðk„(0/ÁŒ®ô·C‹ C£/Ó¿=Tb¬ ôáL£bl< úÖÕàx_ô< ->«ïd 2pîE3Wzµ#{£ç=V9èãi„(Ý£´ØëÛEcBIAk,ôô ÖP&QÇi—]פVaׇš?šÐL¥ãðgë9ÕÓ&{ÝPÃlÙ£…«€@”™alÁe~ÚСñìӃ¾E`þFFÊc 1Ì6xæÆ$è5W^²°`1“E®Ú*〴À4ãÄQ+)+¨›‡ÁÈDNë·yª†ÌݐÔ#ǏØ.“¥×°»& WI‚f4%ƒO´ Á’§ØÐ p5ê†WaÛ¢ñ–çܙ±7M­™>8ŽðPätÁ@ 0´ øv@p³¨Q¯Ò¸è`2xšjsdfÈQ8ŒI4Ô>–ÃÒC~C|o胲°`¹)ô6Èl™§€¢Þ‚›# •Ìþä÷q³-„$Z6•hØ@>7ÍÙéᡘiöEDáhVG ¶9Ÿ³‚KM jæ˜!,uó%¶wddNn‘¡ƒ9ü¹ ¢ÇFÀYo78¿{iü>š™-,„O‘>êg‚‚Åš€Óë|„V¢Òh2ŒÒ`é˜ /+8ߘs†HYã5ɾM ßÛžßn?€¹(àÄP ÐÎdGb(aÒÃ6ÌS ‰­1Ûñð½eë ê4˜9ÄßNϪ™õqûrÄûPÐ5 VÊ11õM~uš#€™iJÐi™Ê‰‰­Wé_?ýØÛ¤,¹R‡âÂÍTßki¼_“RVèøXôO€Á«t AsôÔ{ à)\Áä!’QÎÆ}YTŒ66!­øñ¬8Z -íš_,üÍ"»̯u¸LV+-yø›pÈá -8gaªì° ÉÄÖl€¹qåƒxçÅáϗÁ˜©*ě)­ò‚.c/2ç „'äéάù“F¿îyŸû‡êqY0Ðcì.)ŸûñVʏ™•t8ˆu™Yõ˜Ð›ÖÀ”¦âÊ"ÿ30©¼¿ -zXýà 4¢ f-ŽF,Î`pCE¬Ÿ®›Ø[§ÆV1ÕI1Ôòáe£¶hŒ•„óûÊ>õøƒëÖåF©¢Ӕ¬ö³ô-´“Uo–°Œ æ5L„Á—˜OQ¡;¿ÇëQ)ªÜ´Ê°x h^„Ì ‘³¹Ý©¨P¾Ô­®‚ª/ÀÙP ‡T®Ä[L«,3Ƅ٬§!±d©Å»÷ÀHçÝUǪ^ºKÍõ’Üf ‚P䖪W×Â(f—•Çßi¯˜[VƒfN’»¼ª¯,`¢´ä¥–¡N_8 ™ôA6UÐ1?m}Sq¤àèrÞ´Ì¢”.¡DcÇŸ¦ç7UÊ žÚiP 7ámdz£—«.P©ó) î•³u÷;u]G¥@’PÃVZøi3¶Š Q•ù†¶ô/Ä#‰ ÒUJ ½„Ëë:²n“P¨Qóž9\i»ÿ¨Ú¡Ä ©È<»0™?}qv™P"Dƒüã Ì°ÐèÝmúüͳÿóg9ÛŸ£ýoCÿ>þ{?ô ¬*¤;Èøz¡?þq®ª¢ ü1‚Ê$*îôã{(Áðc´¾å‘Í>†O Õʎ>ƺ¼ß}’±´E1a€±úçàC‚L䡱ÇøgÔcüÂ®ƒz̝ä0l†#·@7©ÇñÒJˆ—xŒX.¤â?˜áóÝpÇÐ~§rOÚ1ªE/)D(H)Öm°ãÝJŒ/º¶B=QÇå6b÷ —1éL~º$:.Îş¤cfúœe KAœ¤@ǏgÚt 9¨°Bæ3 _Òâ# ¤aÇ#‚ÊßI9f3§^ä˜ê€ÜßÇeˆãG Ð 8æßõ oLã‹nŒÃäþ,¸ñcÁÛÉ6F÷$r<Œ6†lófÑhc,ìĜØÉÆ¡i`ãjþ÷äW•ÌTc¬îg1ܪÚ'ÒÓô•Þ€ÆœÍŸ±xÆ,WKi­­›?‹h܂"ž1ŠãÚxΔŒœ4cxÄJÁfŒÆ@w*‹e܊bOÊîõ%F¶œýçå™Üc‚Œ‘ùG¦þ࣢´©ÿ£I¯¿ê÷‚bŒ¿S;Æ؇…ßB㸨=0ÁÎê,€q¯Êˆ¿5jn_ŒsÇrЋ!$ÃÕ¼˜%Âøt^Ìœü^¬yR­ƒŒì@ú  /–äÍ4ã o â-iÜÔg²‹ù7•—ý€UIY‚]ŒÛÀN°‹Ñ~ -ï]ŒË¾…ˆ¥Tök£ sG•ÍA.–µ— †á‚†¤N`Ù¥1ï@ó½Yàbº8™n;ÕTóÉ-ÆJ¥Ú-肪%KhQ”­Ì-(ÿžÄb®^¾d‹G·ÌkçÈo+pÅóPЊq8È+† -`³Šñ\:.“âöQ»‘ŠÇ­O%@Å|‡ð%‹SŒÉ.ò)%k± ?CDß ?ƟâÇjŀî€F1ØÐÚˆâÇQµ £ä¿„bü}‰&º…ÈŒ|bªçï>ñÄð*àçïtbbºRŸpâªüd ‰aGZã@³Ä¸æ C:…úëЩ|\bäk!.1rMµ -Ôe3XûI%F ˆpÌ -\„ªÇÌ$&þnâ]¯hN ƒHÌÌ -ô•—"ñÁ#¾=nŽao¨vL#†Çõàã;ä˜Y¥ÚcdOJ"~wåVÔÓrfLâ=×DŒÊȏ„!aãa ҔôKÖ²SˆÉÓ`}£òL -`Çۏ²þ}U?Ö¶¿Dâ¿ÉÂO6olç³d,J1‹š f}És,?vø0Šñï6&{Uíº[,ÊTºçƒ¡Š÷˜á‡]ƒ·¿(ð; Ã€Lc– -æ0þv¥%# ø›¥ª;qɐ18̯U/ Î?wÜ0Š1_møµò"õ+`ÃèÛy«èt±†‘s‡“¨a€Œ«;™Ý>ˆ8@Ãðzàlgc 'Æ ãßñ0Êð#ÀC0†‘°ƒãˆá§Ès†aäGæq -#±|aŒ*å„ ÃC#ŸÕlah ñ}Z`pI²0òŸ„†´RÎà -÷¥8°ÂÔY\eR…¡y0F”ÃÓ;”éd -b ![ …¹pÀٚ( (?î( ÕÜ]ò -“øù<“'Œ¿9Ûí8á<„÷ špVˆ1XÂØç~N’0z^âÝ6HIl¸vÁ¾-p=0ÂÈÝe±ÙùW1&¸¾¼sô1ÝÂÕ((Û.ê¹á› |ñM¸ÇAøõö6"€pÕL<ñÁДòF¾Äá›ð`WNvð¥lê‰6Ñn’ƒq‹Êâ_þj0=¤Z'4êÍ[½,U“W¸X8ÁÿbޘÄ`$DJ]Àà!NÓÉ ¶ö;pÁ(*“œ­#<&^äTñP̍î¼HÁtëw7PpÓ59ÁUɉ Ž¿Jp<0þüUúJ"8Û±‰M¼v@ðü{ç‡1ðÀ¨pÂq'دÜÌc—ÉjM /.§õõ.ååTBøâJ ä‰¾(r»û‰Æ÷*–µÙÀßágE¯5øbqºO80Êa)s 60ü°»M40ÓÏs’”„ß`à×{ñqr¹¿ß°Àh‘x¥I¾¨0/yR1j0°rPqKé¸ø"[Š;.>Þ À"•¥Å¾ ì $0‚7w?‰ÀˆQ#f@`hz°¢1£_–‘A……RQ„0Ô}Ÿ,àì^F³â›h©ð7<׌ÝO›`$»Åe²õQÐh§Ãqñ,(À¸ÕÒs+ˆ¡$‚;8Œ¾Ù!:M0ï -Á%›¢(¼6†Rƒcðñï–îüßÛ¶ÀÿÞ®qú/òÿTPmxDu#bö/$Íý ¤0ý½ü ÿ#P€1⡾#˜¾" ØyÿÒÙ¿—‘yï üàßi4ø÷ÁÔQÆäþ¾»¹ËF<Úà³û«F'-Mîo¢~È\z®¿ —͙‹ þMÐ^Qhà_lG _€ÑKóí þ¥9™ñ.!1ÊÉ~ ðobyä“ßÀ¿i S~½'–hm,î/-=õ7î/˜Â{Íý¶ÕÔ4%h¨ôÈõûKüÝÇäþbϛ¼àþeÛÒýÆý¥™í¿‚û‹ÿè­.ì/ÿ£–ú†ýí÷¾ö—ØûXØ_þSò?-FXFî]ö—I0¾$ýå"îÀþ"S%Ö°±¿¸Wû1öW¯Ôö—º\õ—˜Y@,‚úËöƒ‰Îú‹_èÛ šú‹Sºˆü ê/ -ÜÇIýM9°‚Aý¥J+»5¶2XÔmüFýå®,ª&ƒ¯PaI=ôC“úKZ.hè/¢Š3õ—ñÅú¼A™¨Óweê/ÃGBQ›ú;^ÿφ8õ˜Šû™Ì_ð'sj ù‹îd<уø +SeüåfõY¼_èö;Ü c²~ôR‰q¿¸N9'îw AûIÅ ûENBe%;ë±È˪0¦Ü;u7‹ô‹¿s~Þ@¿kÎEùív™&ä—Y“6Þ¿¨_jZˆ_ÆænÌÃGJ å7Ä/¯:_i1~ùøøAÎ&r·"Ÿâw¨&Ӏ_ÄÁ˜o0àœ³ó}aCMà}qºA¦û’‚Šˆò÷MT\uÂ}˜wjC- ›Ö‰'ݗƒZuG5•" ×I÷åÝ€~Ð}ÃGP)è¾40ëå X!t_åJ›t_%hæ[œÂ}ö ûâ´Ù "辬2B!iÐ}q)]:¢÷ewŠ¬‚<¥ŠQ؁ÏÎt_Þ îx_Záaïˬ=‚݁÷…©‹ï kP«jݛ貁÷¥Ù‡ïKåf{êÄû²» Ƃàûb4ÁúêäûJË ’ƒÁ¯ÜŒ%¡æû¦ìdÉø…•kŽüJò©ÍšFi4i9ø¾0ÒÛ¾/ ߗ,èÀ/Fr±‹ øU} †AÛxŒAàVVà7‘ÝzßðKÆރð+k“ð˱ú҄_Hß?¿ìak~U‚šv~Ù6K¸¿j¦ö”IøE"NéAøMddŠÊ»¿z–&â7C—øåß|¿wÄ/­%O¯ôâYyÁæK€ÿ¯âIé*IØÖi¨0’„_i¿¯~~éÿ=YCŸÄªh¢@w'¿¨ Ýídüœn}Éø…Åӗ¿´D¾s1~Óì?aÄ/yP-²€fï@üâBåŒ◓5=ˆ@üÂbýåø¥6‹³H´5Á -G lMøÅÍhlÜp~!Ò7ºØ„_¼cO½ŸEøM—X'á—EBtƒðËÞkJ›ðKç]-6ÂoŠ4ü$üÒÒ¬'é£Û¿- 0Îâ{>¿âJ¤g~1ð¾&þ„_½½ž„_ZñáG·¿$üÂÀ‰ë ü2ß…XAç2n>¿2Ôr~ñ{äíá—_ÉuOÀ/&«ÕƒïËLßÓêäû2MšÒ„÷b„ê -À.Ä/†;ç9ia÷ÀߊÁçºO¾/Œ—A¼]Û0Ã#º/DÇp2w¸/»*ŒÌPÒ_¼ þÄhq}k› 2›á¼fö¢³03חÜ>¡#ûâyÏø{ÇúN›±¾ÝÓsðzÁ°Åòö ú¶GQ깑IÓÁô¿w¤ï´™èû:ÿ5‹‰¾ýRÿэçÛ=dÏ·_ú狿qSš/vâòÜ4ßn­KÀ|û¥7ù`ù678 -”o³8H¾@0 3p€|Iu-÷äøòoÁB¼i‡ƒâ #Þû€øâo¼4ÁðEPœßáÛ.'GðmnM_†Ås:¾Èìá܃ߋO%äÁïmÑøaÇ÷ËUÚTHë¤R'¼·f ãwv/m¢3›}Hƒ4¹4¥G½í¦ܱ»>“Û‹ü*2âÂö‚9ìÒAí¥æõ¼†ö"c¬6‡bö6/-d/{ß²WÄÞêuR{q Þ¼^ž ˜fÆõV¯ƒÖKDP;¬—Õnx9ÍêeM”JFõ®ƒl¤ÞÙ½Ô Þè(~ͯۜ^Ð=ষèÝø](ì1ò^ˆÑ¸Ð‰^Aè%Q ɶÐ+Êá>/þ¬¬MŸ·[Yqàya¢ñÏ u?â÷AçnÃêçEÝÄÅ«›«W6îpõtü½“y§Í`^Ðr*A5SÏˁåfí•Ë:5§µ‚”®ôw*/¬j/ ˜…(OŸT^®V8ýïT^"§Ø¨7ü+Ô5¦òr Òýw*/&;†ŠƒÊ 4‹ãȲJ¬¢ñð&/–]ðŠƒÉËsº´•ê£á_tStWÁ|ŒGw€Ý 5 )ŠÚ}2yåaä>™¼0p¸ &/ lv°3yé¦ñäÍä%ˆt0y?8*Ÿ§óÇdò2X‡¢ˆƒÉK+³ˆfò*„—ÛDð20ÇrНÉ˸ d3Áä%7ƒ‡“w½’—ÎÕ yç -3jYa#å@òª1¦<"yiÀi—>¬ -k–#zhöG y¿ð7«ígå0qyÁÂûD^Æ°v "/ƒ$˜K"ït-Mäå iQƒÈô‰‘8ۉ¼»5»7ðAä%%ƒ×Aä¥Ê¾ø*|©È©M"¯P yœD^*©]HKùÍ@cyñ(¹p:ˆ¼¨QÁê4¼(³"ëZõ¿ì7uâx¡¬ªúézçÅè0^F©ŠJ'Œ—•Úó¤ñN1mÐxi`G«½ˆF²ô$QäqÃwC\Ë¡ù ñ2$ø>éú)¬3l3Ž—Á¬”N/¢=¬ž4Žˆ¬AdD#¬QÁxQBUŠ·!)ÓÒDñ¶ßïÄ ÛMôŒtý¬6+}rx›¿‹à •ò¦ðâOô5/Tj˜¨os۞@ð6$Pó3 ¼ˆä 6rx›ƒ­Áß­p1¯4ù»Õ±½¿ È1%ÆïV ƒ¾K*T;Ù»lՋл•QàîVgìn5?(Š~Ñ ¡Ÿ îâÔo5_Ð]ö¯FÒÎÌ]Ö¨§>‘»ÅR¯ƒ¸KAÀh¸‹’=o Ñ'¿ñv±Å'¸]¬ А*h»øNüۅ -áý`íB…ÜP v†-'g¢ˆnf÷A}édìB‹ƒ÷Ø…±» ìBøM€r¡ñ1'oÞ?EùÀë>ê9ºíó:ñ~²uQJO™º Õ!Á 뢪†’í¬ h~(¸º›VAXT]ñU÷ñ¤P]œÉm8ßL!CðŽ¨ž‘ºHp6v᳀©p«}Îààz¹¶6P+$¼·ÁÓEU-\Nw$ .îÌ0]H–É×Ûaº0bØ –.kŠF™(]h°ìÛIºk?Ïé‡Ðƒ£‹¿ã‡&G—‰Ë‚­¦ ¿¦pctQëØÕAÑEýb¹Ew¦Ýá8òÁÐEVB¯IIJ“˜ó¡Å=+瓡KkW{AKˆ6Mc2tJ‡{{@tÙ*±Æ€èbÞgØ/ º4 ηCt×ÁjôaL|9ÅAÑeÑ‚E®N¼ʘÁs‡‚"(º3_|Pt顱·R[e€œ‘£ûÁ³[A±oŒÑÎu]„|/ƒÙ0,"âÅ\ +N‚.j .wCS]܈_æçb?&s|.+7oùߤçŽ@à—±9ÆØx®*#JÞ6Dß.¼ò“ž»M;>—>—y@ƜG€~†Â!@D3fÒçfp60/@y¾,@ÖBÊ(ºà/с‚.RF A]à°v ‚. tó‚ K®A—L¤¢p5gGA’&?—{±ìgçç¦Ç¾]ðsQÌEIðsÕþ ç2›–äSÉÈs.rÔ? !!ß?è¹°êÇLÏM„ÝcÒsi@8æ çÂZðÀƒžËÍxLÏ呓ðЋž‹ä$Ǻ çâùRXøÜi8ø¹Ëj€.ÏøFqUÔù>ºHêÒS››e/€ » ;@wZ ›Jƒ›d€î|1„.³³ctYpn-°ÛÇ̃u #bº¯ÞZnñKÉäÛ霗ç>üšÀÜ¢"¬¼An©€¶ÂŒ[pPðq‹»€÷ë ÜÂÈ®)܂‰°}ðmo'^¾mko‹¿2Þ"ÈpÐmqKà¬Üö®ÖIÚrsp mQÅz8••ÜVØ5Vø®-‹°oÑF!€ Ú"iZÛÉ´Ív‚i‹¿Ü ¤-þFú Úæ¢ÅßÚ¿@âÙ>€Þp¶È°¸¤Ì4öDnÀl©cèÏɲ}Јì*³ê s'¼È Ù"ò„èÃA²,»O d[r›Û¦Þ'ÆöQx}Rl“çTCl»ôÒÃVui"l;ßæE°í$e¼lÁž üÞüÚ®’Ók»4CoìZÉ~&º¶Y¬crmv}ÔI®­âLp­e±“[Kó;¶–ጲ¨µšY&³×Tߘµˆy Y‹÷–í!L¬¥Þç~ÖÞòr‚W›={®–µÐO9iµÐÔ6YµX{O¨ÚªZ“7Tíë”2Iµc‰)@µZ÷”|‚j%¦ÀzÏ Z*ÝÁ[J—‹¥Ár@©–ÙþGVÃûÓ%ê¿iH\ãoï}cLm^êNR-„ x…TܪàÔ"™F 莩ÅÊ.VPjQ1w6 µëF-¨!½¨Y - Ö¡7ýóZ}ù. I§Â‚Ëö¤;8‘±­˜ w eÁW!u0¬HùŒÅ•¥Zº7¬,H# ûU–è—#çЮUµ;…ÌíZ…»‚Þ]ŠðO¢ìË JÖ([cž@ÙzE¥© –§aGÊ.£˜²Õ<œ‰4Ų“ íƒ(K± 7óbå6Ù£#R\!ve¡´W]µ²”ç;nˆ[‹5L´[©L¤™Òíƒñè=àˆF—§èO–ìcÃDÉ"džâ ÉR¶Ä¼óN’Eb«ŸÉraå­PTKX¥sÌSý‚©Ûw€µÉ%Kˆ51²X¶(&·Sd –ì)¯;ƒêÊ͐-–'YtIԙ;™§ Ⱦ»3Ÿ¿¹ÃôÙ¿A–ݺ˜Ĩ /æÇi¦ª\ŸÔä° % ³¢«‚9ËÍî=áÉú‰n¹D¤#r͌o5¶ €íö¨) áUiN|XPfCá)ÜR‡ Öf÷”»CA1̄¢¥› å涧¹ïŠNߓösKÇªI5p|q^)‹!ù`¥€ä$¾ðHø@à•Ý‰œÉ'¯OÝZ"_Ž†‰ÝÙi\e°ã9h—¼tž›9+r”È­²(©ƒ@ ;#Ár§mWŠM“ë,`p¬y!ÙÔ1ð>›2`Àf©”3`EøP‡dJQñˆ¡Ï`·â)[‰«Tä§H$`µ—z;`YU)Ž~„³À‹í‘°A[ë›#h5¨ ­¯IŒe&._Sš‹/õq‚Ð5»$ŠÐjÊrÁ{þ›rZÙ®ý‰Á‚“¨V -/X¸RâO²?#,5êäÔSìÖO²ŠÝº.7ã¢*7ï93uQ ÃÆñìj í¯@7UÚ[X¤*FĽâ 'ÔúŠÎt -…ø›âŽ¦Ýµu¸|àÎs4÷.ÇÝU7³†.«ó{ o–4ÏÞ"»rF -…•ð$+À’»ž\šL|¾\¨ãÁû7PyyÝ|7n¶…ìYÓ'ÚBn—î8šÚ\ã#‹’g¶¸ìÜíbøxXǧ¸$IDJ_F/ÒҚ6d¼Ã3 KVóÊKóÌô)rhA 1³4"-³|%<þÃ,É™´Ü£¸ð×Än¦!+RD„ê!ö§9t ƒÄð ]Åf,¥jVKLE= øà!X€…}$ðˆ ÐB^À¼. -|””ŠE{ÙÃa]QW+–éx ")±Ks®¿52ž0SŒR‡…h n( òv!Ðß=¡s`&Vʁ B úÇ·x{±kT¿r!žÔ¯Kø×R€uöS[ìw=nà27DÐV2 £fSLáÚô/‹„Q–v¹Õ‰š˜±K\v73UÞ·$×>áË/êmâ5NÒôÒ8p×9͓­ÙtDÙ ¢&XX&Çm¨ªFUQkS VdG³Š‰põ|óW7KµoúÒ,JàÅÙ´KªæK4Ga^lҧܭF³t§`UGìì{²Æ ÜÁ"ÒÜSËm¬yÓО\Á"Ø›Øw=NʾÔnYû«P Ú¥æ`\ \ْËæ”ï¸ô=w%·iá:¼u7€‡´YÍÌ W›»ê2ˆˆ¿ôªþd7 ®F°êË³Ö - ÕºÞÚ¢÷ºqÕI¯Ï±äû‡/[QïáÐi‡ã%Û¸zÅÚ -ï -ä,+À!í~4R©çis¨41é—5_‘JåaÄ~ôã%ïÉXæɖ’Ôy`v'KvÝuº#ñ²p|¿Äá®T‰!†¾¾›’Â{p}^*&ø'ÖÈaýX²ï[ÍÒ=`Þî`Ö¬×ç]4„2-¥˜[Ûâ„XQRvmˆvŠœ,[¼×li»û¸SږžµÅ>•£8Q!4Îüʑþʯ!² 2}˜4M äÍܕAtsnaùÔ£¯”:‰ôX­¼kxŒTÑ\.™Åƒ&AÙ"å~,s7œD·—Z´[QöBàH=݃Ø%0¥/±F`Aù£0?¦J+ ƒP7¢ Û»‹‘gƒi@´]–…ÈKT(«»¼kõ˜Ií‚T‚’#SžÏ³˜–[eåÞsš]JÈ8/£ hÍÀ”´ r#mñ‹~ÞÚÐ+4úY¤L.‹1Þ3¬ Ýdò'ðõså<ß^ aàuø™6)iÔ´Y^È4’ùVX’¼kÏ¢ ¸·®:ÂkGoPå„ï€*_XÊbõ¨ª‹‡^ÝxPLÀµ žèAa££Nå~W‘„ÛÉ ³\ãw[\v÷9^©A§O­»µÍÍ¥ Eøá€N¼"6øFs2Kä«áD<-ޕ*vîZf`,n8–—¦2SZÈs@í(5}ؕá*Ò]Ö§–T|(zßÝëPøm”jçæ¦ß ãÌe ԍÕp/“5ñ(h ~¼õâ0q³J!1zb¸T#¸*î8„zìxGþÃòß S/¯›ò]$K»F«?fÏ箪›€ È.зß$úŽŒގ‚§çñ^Øõƒ.½SÁ/¢1Þ¢31¤i& ‚*YJÙüå!jᏲÃÉýh²À†t>t¾økàpɌFyOWýáѳILF-¢’ør…2Jî„k€kWÆy]ɧ™‹Ñ?¢ê<3½œt+ÀÌ÷Ll‡¡œŸ™(r^ê%Q9,½„äf®khF$µ{AÛ¬`à[Ï¡d¤µ'W˜03âÈcA^ ½Xþ(䅲„†,³9 ¿%)¡Î¨}~åˆ`oÂçà†3:?ŠŒu¡(Å%žA¯›$KZ8ü0*Ž‚D²1€3©T&?ÂãÒf,5—µ'%\°2XÈí2?æÇüËòZf߇|¹ç}&G¬) ýðsQs™äيOº…6ñí¹ ÂaÙӚáS€¬Xõƒ&hOÖ6×8¶œÔ^Fց ¿rf`xJ‡€©²{O—2sîɺ’LWñX;i°8ÝeÍ,uõ #ä™&DH(F¿dÀΛõ(9h])nÀ£=Y†ËǙ}§è1±Sïu+þË8É -DòE¹ W a¥œ*ù6—Ób°<ëㆹ1;ÐUQÌc)¬Þ9=0WºöÌób³¼×ãˆ:?g¹0îð!*C¥Ë̆Ì1ÏÅ‚Df€®GHü“Ú<Y3æø‡ˆ‰Ñ]£„3[$‚i‰HC-‚ÞEs¿µÐ.8VoڐqíÌFŠ=ے·¯Œð8Þ«œ†3:EÍ¢™,Å;-ŒÐõ¨lÜOԎ:Jèøm ‰Fa@ûY\œAå¤è1áQ‰$«Ù_´¸ÕݲP~¼€p›Õ\3zZÝu™²æ¬ Ù†Û°«Z€®˜?„ò\ah±ÁÎPê®‰'©Ç¾rBÁýL‡×Ó QÃaÈ´Î.îÍs`á 7wUƒÑ¢Nä¶ ¾¹·“k;×½àÙ©ppZšŸø…e.ž—óö…SÙ§o‰jåZ³¬Ãºyð'ΘÝwÿ{˜©»33B×ÕÛIŠ®QÝÝBTYf”¾ƒœËà“¡ÌÄ3æ‚ɋ2Ó0àæêIá ä\Ô¹(â;´ø|Y’Fm'lè‰&N ֛ú§dR¨ µCS„i#5óžK'¤•¢µr¿`¤0ýI®Ú­ÓU%ŽU&² -½I—BZŒÎ3¹Bv ]÷øÖI¡ŒË„ÔÞÁ¶¬Ÿ¼ÔP‹)&P›_Þ¡žç·r9 ¢ùÅtôe -fL^°(V˽ïêÆ·ú#4MI´ÖI!lVéÁ²'X«;•ÛÑ46òf”,„ä죝…ââۗê„ÌÞЋ?Z¨ÝƉ±¢½b&ˆ§çP–’xœsü€…µïu,êÏ3÷¬ÑöéZ°ÜNÀèåݏ•¶ûë¦ì›ž›Þ¥Ý臤m@ ƒ®”Y®GvÔT©xÞ_ÂW)o1#{Z<¤÷љŽ@ݐnÖ¬â¡þ…x®gbâ±@î§Ñèv+¥ÛœY˜ù瞷ñ»b5 ;§äö2F‰rN?ÜfŽcèXQžæçÒìŦý›vCvLJ °yX¥Ê¾3Ãagf³€n¡ð‚e¼Q‡iàQƒa®okR‹.‰uB%θlj›„ŠCdDa`[ç aÄÌ`›²É¶ÔÂ;‡s ê -fP(…T"#;æ€Ô´å¿“ïÉÈ<©d”¬±M†ƒCó:©Æ„Ö€ºE¬$y·^¦#–ÜE÷ìŽ.ñ43çÍÊ~†“<ZJ×qÕ1_§’Î\´Ð‰„ÊFqáË=⨻¹ÛÚUž`à”(3f·•Û5t´$‹µþ>".7ÛÐ!;£`Û#½1>WR4‡c-1®S-‚@#aL—Wʄæ éٕɸóñ0VÀ -BåÀ²—"X[sl!eàR´é¡R‚¨x¨˜˜.U@u­L K3̌M8À–޷𛇗E½p!I!vü$‡|XÚ\xR¬_Œñ:/ÂÑw"›ƒ´…—˜e°*v„B4¶DCrŠ•(ZåٻÑfSTZ’dwK¨WÈáZÉ»añCRÿ×Lê> KÁ¹«·-ôšY;ÈLd&Äfî(4àíxq…R–`IN@&gqmŠ5lnZ­å¤p´8=@Ý*e9…° -;²5RIþT¡%~”;”H¾9”Š‡²®¹hÒъÞÁe°M¥ÍAJN&yzs0s*-Å׉Ÿà;ZJ8=‘@†eå)›À%ÌWR±[”j-*A©y).ÕӅB£—=(R‡õåh‰ ü:ÁXì=ÓS™Eâ-ú÷!ÇI9SsÅ,êìz m9÷”¤E{@¬+ÔÝ5;I!k¬0—Æ+ÉߞV¡[¤gE¤?®°•ª˜µãKí*÷æâŒëŸêZcÖ1hòɪYÁSۖN0£Îf)ña¶H-…¢¥ y¾‚Õ¸KšŸGª: -ï]Õ_™‡_ZÝj<«‡~Ìzžl%PshŠþ$Ÿc¤_…4“EÐS«ÒT»¯Ð -C”ÉOºÌ­Y…;:&QhEü-5•ÕwAAu©•{êXR­0™:ߪb}º+\i(¾}· éStàQt«Z–6*Õ=Ýåa!‡v1ÔKýb*³½ìþxK™?½O©'îÍÄäO"àc°8KUTý3weY0Ì\g2SÀßĆLzpzў\ÏñZ͍Èf†&Uóü)¬gç^HÑêTÊ€Öõò²k_ž]0!IR\¸ú ¬}I਺y÷LS\Š›,M<Ðs¹4÷Ïü>²;ú[ÆÉø°‡,v]o‰G°ÉT—Â*ýs3I˜aÊǯ‚zU“•Q]”1ã8뀢fØGߤû@Åqy^‡fN\Tyl4Ó½gÖ¾+ÆD=Mfkâdi×*瀯)YtõoÀ-’´?ê˜ôî·®¸æ7ÆNÓ{a¯o`E ú1Ì]EM#<½¦e6-µ¸ -EÝÃǦýb|²ØoS;qXj·°P×Íj±g™>ÃgϜõRF‰7“!VælÃbǦª…ùÚÎÁzÖ¼im‰ÆªÞwŸcGRÎTÅGKM‡‹IÌ$ _¬Ðq³Ï¾xš¤ú<¹–†-YN#µöï»^N«&‹®hyŠwiQråSR/ë¹ u•`s¶ÿŒŽëF¦UŠÉPúbOqU”ãª'YrÅTíð#m*™2À~>R.ÑY4FÇåvˆ´<~Èp×^Óڕ<2š)a59krÀb׏ޮãÜî ½Å4¤w¨ êaŒÆ8ŽÓ]¦¬‡â½$+¥ÙÊVeýPv‚õ8ÝÂøSêš:ɀ7$oÀ™†Ïñ(HÂìj’îÓE¸ÉŸéÿà -ˆyƒ°,҈|»“8‹,äŽWƒ ­gëJIE#I¹ëi†‚bh”HÒkø½Ÿªœ?•ä¸!‘7aÝoö—¢ÆRˆ(ϵU|hH6Pǽ*Ս(åQï¨ -C>‹G¿á¦\ÍcÂÃ%:ð%AÄ«vùbeùb·[ÐÁüèÅí~TT-ܒºJ£“ÆV Æ#2J OâÒnAü½€2”Èmf_zºÂÌès¤+ènq¸xÖR¨©tvÓ@ø9”4Ýßé¡Þñ¢]à,VȔãf§¼h¡N »2Œ»RZ–ˆ˜ ™ BŒùxCs|…¬ -O÷RJ -Sh7× ÿ^³ž]«–lÉ -ä¼XHÏɛ׍#K)ürÛ¸LDì™tn*ÝnKliYÃklfªw2ïÍ-pò ¥M™1Ýe®.:‡(I}¡×òÊàÛ/>XHÂå#Šsð¢«t”]‰Õâˆ\!û£`}ÈÌ&TçÔI`›4׬¹8XÃ'éáF;"ç¢jXIòÄ¡u=ÎCt/ÕùR™ÏŠŒì‘éŸBÈÐDAˆ-×®ÑJ(~CçÔfÀ™?ʌT2Í -¹ZTÁÔT–¡¬7 —ð°uÈƸ2D æjô{DpqU -Õ|VëWcó -²ÊhØÜL]o%ÖT®ýĽëéÃìŒ:D?ñêÞ7¸Ê6±øQ¦»£a3fçÖ¹v+cðu_«‡Ãeïâ&ºÐ꙲(\-ÕjÐÿWEª>÷N&ÈÂr©¬Á {٘ƒ±N¯ÚV€¡ü\Š’ ÔÊT'‚E¯AˆV0{³V¼kˆt`¦Cˆ4bÉ}v¸ ßx(ÔÒVÍ(5Ìž~!ÛÀéâÆnL5¯|1ø?÷¥z#¥šQÌ¥ ¬_46Œšn÷òٔ ò7•²Èâ‰à›Q(út1©èõï#®©|Ž0!ºF/*¼há g×NÌ]E‰Çb&Jä'Ð/ÝÐT¨VÓÔ¡Ô'u  Mvâ•w”‹Ró2̛×å@lñׁϫ™ôÐ'DLY…Ëß?jVpe­©« ‰Z HXÈ'bSFiZDL¸ú˜©Ã!ãÖu³ä¥ÀóXMÙœ›,êBÃä”긷&-. -~¢¬ÉCýçx¨ªëÂ%0D–H©8¼L¹ƒè%o‹{i™œ5f\b §¾˜"–n„Í<²b'+–Úٟ «¬e&­™CËö&%G¿kÎ֛¸Æ>zNƒ&nç.t¥Å½?8HPI„þ&Dq€‰\9¯ÙÅÌå ±ëñ5º­¯6¹É`ò½ë´Öž-ÀÄràÔ h˜ „"|V.Ó²z½4wï.KmR)ÎÝr~VÅhO?ÓèÜË -Ï[à(}¨5ðйò-­(\KµÊµYÔf—jy«µ˜¯w6­º»ÆÜSe¥0«„­ -ôRÏ¤Aí'š1Þ³U`ŽNŽ"O¯J0]Pµ…„Ÿ)>JÖ²ºb‹V§IŠkµùÅ׶§<QeŽ fÆîP€àt©Ìâ‡NÝ`SÞbîZ¼JúïèkƒVúIK‘§U×lx#AÖȕÝ¥èJk„ÈÇÀbL‹vELK• Íº§ärޗáèÜ°¸h2±Ø†ý°ë–æÍlnºª.!,EҊx²#¤™g¦xìaEsóêmxÉ:Á‡­=’ÚA"<6«tvHD²cϐ‚nwó42UÝ9ÚqÍ=é -ÀL±7-äo¢éÖ,°cõy{ӈ\x¹L+Y€ sÓWŒ!eZ|¥‰"–­s;|µ¸½,·¤O…­Ãâ!¥™];7Ä샕+ƒÄ㪚¡ªöqÕ´±ì¡ÝÞÆ=ݼƒE“ËPÙÄÉ­° «a6kÏo«1Ø«†:c`=··™«2”|w™¡d\‘꼪xš’…[ N“{'63ÆX¶Ç–Õã?9ŠÛž¾äJDð0N¼ªñW½]êCPƒÁilj0.Æ&$+;!n‹ð -áËeˁ“ÁåÇ4BœÝln7É$ܒ¿Î)›sß݊$䙪çl߅ÁG°xU—$Ãg ;µM¯îPé¾HÈYuŽKpÄ¥fâjúü{7kpɔÞa~|«Û59z\i{ϥі?!yŸû\P1Ç>.} š÷ecý)U}o.ØçoîäýÒüï†4Â‰“hŽèë hŽÀyžørö]TåÀ™ßùߠ™߯£f™ü̃eŽÊÔ~ˑÊ-äñþÄ*ÄàqT/s9pÇÁtæb/°ãÏ¿ÌØñY]~PÇëIM¹„?ÐqKԗcgŽ?ö äøc<ïDŽÃ¼Ê…EHÕÄŽG;ØàSI½ÞŽgB$¹üÚêäm°Æèg -ç`#Å×'P㐫]õ^C?f,Ð8ÒV¬ô ÐxqjrÆQúXcº0ãȈ”Rú×(ðGõKÀñ†ûbâÑXïbÄ8SÑUŸeË,b dŒca¨WÅ|qd3Ue¼8\;ʺx®«NJ S<ÕM¶øÏqEl­J‡g@‰üAGPWš–ÿ -° Ë‚+G€Cè'D&)HNØ -3¨Ùåslq)ȃ)Ž¾ÇïqÁ p6s¼ž7 8²/|}ÂÊò¬¡<&aoÑpø¤‰#ߣô²aâE¾ÒD‰#HËA¬œ¯a`ÃqV;X>r1|QÄãÓ&D†¨îeî -v„8ԏ9Ýbàr9•@|v~x‚N|øñΠ‡?H'<ü‰®dÁž¼NÂ6|çj2Á,ÜfA q¡‡cE©”‘¹á¤/=„… ÇY=yAÃÁà`ý~0ßâœÙ ‡Uߦ‰á0$S.bÅؤ|Ñ pÉfˆóRŠ‘ÿÁ -ÂIP‰Žt±Æv“ÂK0^RÐçwNx µN`‘‹»]̑ø€„C@^p0‹¥ê~<þ „ß!~ B8ZÔªnӀpö¬µbñÁóp«ÂÀƒg5kœppìvë0«rﻦs“ÁPª¬*3ü±òÎL Gó²fqiÀ¾«ÚxŸPð¤5/®S³è^]ãMq¯Š ÎÞ³ˆà5 -Å¿œ5œÎ9à!úþ7—? þ?©¾8fûlUûds3“c”`@3Q»ùÛáÀ þ®ª©_Üïi8°ßÓÔïáPG°¼‹LmtšáaÍÍìOOâ÷2lÀïi Þwž•¯ûŽ×ò }Šʧ€}c­E=\°¾/F= õ^òYCb1±¾År(y±¾/Ö ßýõ}‰IqŠaßß!ëgö´iß 9h>hßpSªÛjH²V£·g+ ~ ¾±bgŠ$H߃>®dRø†X¸?½q¾QntÔ; áNցF=½x-æ”Rˆù¾ç±ÅÍ6ÕMB€ƒò}9*Ÿ†ܯd­¥ -*¤¤?ßÙ´†Iø¾³J3&àƒ™ÔO;ߢ‚[ï}g§Çƒî œºÄž;Ü;G#Â`{g·Šžho¢ÍêJâh¨Y°7Ä5´Ô?ŽXoø’ÒHâù®ëe $‘»µ:¡ÞÓå?Ðk°¾:˜Þ¼OöÚVQù0w[DïÛ5Xè-¸Ä8€ÞwÄƒç •‹Çç °„fÕxÖßӂyßÃG°¼§(oGyCEÇ,HÞ( a5P ºÁdâå$o®OîÍZƒµ Øi8HÞËj’÷3§÷G|¹ê˜\³µs¼Õo©¥ò¦ÂMæƒäMy# ’7>^Æ&É -›$o (í2Æo -¨X'¾S¼Ù9>+… \Þo„9ž’NŒ7Âr÷³ Þ+¬Ô*½y¢;Â{˜h6 ÞÃjú ðÆqÞéÝ£ÇÓ5¼›Á<™ƒßëà„tò»QA}‚F -à’éÝ$ߪdšðnD] úx79Ýašîw ¢wr7¼+¢M2p·¯5©Ý؋ïííF@Šƒ`v3âÈZæ`v³7›¿IÐðIìf„OòA»Õ¥KÃ#òâVÝ- ±›«*µ! ("ÑË·{°lÕ²[æ«·6t1¯Ý0ˆ~ »Ù܆ø€@vkÝ`ˆ·ÖÒwô;9ÝêþHX‹‘ÝŒ‡éÙÍeN¶²›ÚsaiÌì¦>]߈™Ý´ècؙÝ4g~l‚Ld7”•‘²[’ÿ¤RZ»²¾Ù--ÿå¬ÙM÷‘a‚€vã¾=¢~Ú­°ˆ b7‚#·Ýæ@OíV¨ä1édB»ÓìGcf÷ ´Lf7ƒ3L|Ìn\ªœ¹`vÓW¤2¼˜|YÀ{0»±€(<¹h„•“Êa‰ì&êŽ/ҁìVdyԅìÆGÄÏDv§ç :ΆìfсÔáÁ°!$§â@vÓõW‘ٝ¦Š!Ý´05È†mE‘™ßùìF&r -®”§)DåQá ‚¹Èžé²›f683²?AÕÚDvÉïDvÃL8ÏDvӢ중ݲ0é¶#»ñ£¤tNd7R¤o±)Eõ.܁Ý̈’tÀîá\ÚdqcdMÄÁìnwä‡mFK÷ÇÄîZ¢HivÃz9òÅÙÒN×]˲¯%Au¾gºkŒM±Y5èêDuWwJŸ¤nðê.G×CvÎC¨›¤ë>–µ· ™™Ó= §{YÍéî9Z†¿ 6–öî˜îö8 ?73g~Bº§á`t/«Ý-š¢ _w@7iå÷èF”[qæsàidÇsc?Îûçî!3 -:w¿üöpî Ô‚Í ŽÚEÍ à ‡©ƒÌMsQw‘†¤Ëá´Ò’ñ•;–FR.ƒÊ Cq™]WĔƒÛ½˜ÜíZÊ?¦I›»]M$7 ÔDn ïX@n„YÉ" w‹yãqYWM»et«Få qƒÑʒ‡ÆM«!æT `?aXâ~Y;HÜ5Öq#ô«ÞmæILùá¦6•mþLáF^qC¸›»'ƒ›MÂÇXîµÐAàÆ ±äèpó´0n·šBà·a w¿Ó·8áÛ,«,m±·÷ã,ôöìâäíy¬àlÏâo7ëÕ&w»¹UĤi£¨‚£üAÝîÕUs³ÁÕâDnCŽH­ÇNÜ]t,à6 œc¸ÝCìrð¶aåp¼mÔu0ƒ¸mPÅU·Ó¶QEÃ@À¶±ôfúͬíù÷Ú^V“¶AÇ©nµÈ -¶Ѧƒ³=?˜m,MÝÑ;ºSÁŸÇff­„"®G¹ÐáRzUSwÌ6¬µf -[&f›Ûðfs­ÂâÙfKMÊ6–Gjû¾C¶_©Ê—€lóÄx—²MB$öªžÓÉkÈ6)ìKm>ÐîÝ ²ÍÇÊÚlC¶ù~p È6-Š‘îm6 «P€ýê.01dû£÷ôyzVLÈ6# –mš•}5d[‘ÉÜR›G• ïm†Ä¨n -È6³Ðmà0ùÂŒmÜ×q›±½–ÉÁØÖ·î†[ 8G?é`lÓÂ+xf„´*r{2¶SÐm&c‰‚±ÍÛ®MbW*‘] ¶ñ -‹ˆmx….õÞÛËžÊ -¼¯!+##E•ÓØÞÌFl³É33Ø†E*·±MbãØNäŸ'•Îª=ÄÂxÄ6^a+GŒØ¦ÄP‰ØÆsèî@l£\ô´`l£nMœ{—¤³{Þ§“¯ œRQÆkà çtm¼.òäwº6ƒHÎ¯Í ’:¡{ ¡…k֝®-+IÆkóXOÀ´Uœ=¼xmÆEÙ¡$øÚxîŒ9N¾öèÁAßÛ¨'Šr]&sz02¯Íú¢$Œö¢k£ÍOÙØÚ‚2’lmtíèJk¬èc‹‚Á k³|±hEËÞl˾sµ±>rÆA -W¼œ¥Z ÀB:T»¹ÅØdj7¯M¤6€lŒmDm4â¸@mê?.SàzV;Ož6°hŒÑO»ÞÂ0N› 5¥«L›­(H2KÇÙ@Ú5µG»¯5 Ñ©Ytþ˜AQ\†òg;EJ -Æ¢¤!?«`h—îm2憴ˆŒmÀÀa9Ú¥)ªr´¡÷Ri°çÐö³þ;ðÙ%ô=%‚Yž ‘]÷yÒõÙ¹¼³Q¢,Ѕ¹Ù¸AÍÆŠ…¶3V¹b+è{ 9–è/;0ûq Êäe?îÁ¼íFÜæ ˞ —‚•]+¨lè_8‰¤l\.@ÙO´WN6jÌÔêjÇd?¨LösZP²qF·ñ˜+7©†Á‘`dczj†fÓ'z\ˆw"²áô+œàNox²¡Ë¢¢zçc£ÞZ!ÇQÇíMÇÕé읎 #ÃLÇÑÓ<ØØÁÌ<ÑؐIÆÎCL06 ñs ŒÍDËeÕCg‘ -™\l¨Ó"Xµ°Ø½E; c±G`NƒŠ="¿C±‘êÑKTg2 ¹OEˆµ¹x¢ûw@±ifà# Ø‰lâ4>M(6sô¹*6ÌÊ+›®ä×Aš 6·é.X¥•ëˆÆbâüV`±SŠ*ü‹­uÓ( ‹Í8]¢Àb‹a´ûÖWþ¢šÇ‹ÍijšÇE'°®æ -~c.6\68<°ØCÅàŠ ր:њ‰=¬ ;‘ØÃø$bà X ØÃ蜇Íêá».ö¦uP®½dô aŠArõÜNvu ö–ÉÛyØ\W¨ƒˆyØ\Õµºp،ªV×u.¦5c«Ôw›gwߋ†Mÿü÷WöTÎ2hØ´ˆÚ¢¶%»ìfÇa³E¥gÆaóÒõÆaOˁÃƞ†<‡•à‰Ã† VT²³ã°a¾ÕFµ…ˆÒԉæ×ÎGuà°éԑ]8l€.Tù'6·à£;pØ<¹û^4ìt¹RrÒ°YÃQy§aÓªÀ4lZª`°XñJ -+ž4lº¤Ùu ·–"®\š4lXT™qà°¹˜¾Í=Ñ8ÁÒÀ,ͲNƒ -e›ËëõîŠrÜ9‚‡­”3þéàa3“̽ÐRë+!Ä&”ŽãÑÄ&(H’j± ¥S‹±•¢)Rr. 6Å/üw±i¸¿®ê÷˽ó°‘Kõsˆ˜EŠ2Ôàacݶƒ‡MÈeô®PnIWEêG€°†£;›3êHç†Oð1ƒˆµ§Þ¤ƒˆÍ°¶pÀ&bÃ5•kHlD#h;Ø"Hõ¼ØÔ1꫌éJš$¶´¡õ^HlaÅ›;ªâlb36xtB‹ŸäµR±¹UFgá°%÷Âaóì™x -6bc*ý8pØ0û'‹WOOÇM‹À;f#J„ÃævºÆaóà±v6×Fä®O^¢Hó°—ábof±ñ -Úèša¨Ð¹oؚ;\¹aŽ1>ˆØ›e'b/s±¹*”¨ÀDìùîžLl¦ÇdžÄ&8€‡@b3©™]Ž¸ôŸ4ó] (6³š|›Åfb’Q‰Š-Q~ ŠÍÒ¥ŠÍm¸v>¨ØR\·º¨Ø«/YP±ëýy£b§ªž¦b3Å AÅæ×⃽k‘â𓊠oá¤b3fÆN›'¶W ,6-šè„ŦA¢ˆ‹ÍÇ Ng#ð}O4¾6qºXlâĊ;2ªü©b–Òƒ ¾º‹M- -5TÁņ³éææb3C´ËÁņ™ øÉŦ…+¸Ø´¨ýâÎÅæ)( -.6Ã1*Hq­®m:¹Øô…™6.6Ù|ì\lf0ÔPsçb/sp±9²`p±yãØáàbÃìÎ;N@Á"­Wp±¹ 5\›f>³àb uØÒcSYß°ØÔy²=°ØÐq¬™\l憲;µ,.6cäd›UÍcÇ]Ãëhjƒ¸s±‡q$Ó:›+*u(ö²šû…þGѵœïä‡ÕÀaÝÁû~=ŸN$öÍ»œ>M"66)Zˆ]=<ìêðËÄaW‡¦' »Û×8aØÝÑÇ ´v‘ÿBa÷xvWo…m7á‹'»»¸æÄ`÷HƒÍ÷åÉAÁ†ÚEù‘‚Lâ Á†c]p¥³Å|FA7MÀF -êê‹ÍdÖ¸ßð×¹F2Ïôk†»äjx¬ê;p¯‰Ç*Hìkô:¡BmžãˆµôŽ¾F½¾ _‹j’¯ïh~€¯!ÿB@:°×T?—{Q¯ª'òú~Âï4ñúŽNμfŠëêo¼ë;.»Fƒ×»¾?9h×0ÒE ØõÊŀ]#-ƾÞëµ@#/Ò5ÒZøUBÅ ;ëœë2LVÌ5ƒ‡ã^”ëÊÔrÔQ q É ézA¸®Öž€ëêEÁä[c?âo3þwЭŸÓû'º±Ûúñv¢­Ñî0²Œ:AsÓZðnÒžóÁµÆBMÉJa­ch¨u3jædZcíèø=Ý(®%‹²ô•±ßÒhPÎ,ø`Mq±61p֐ jÊÜiÖ¸âêþ®L˜RPó(‚Ï@¥"Ì~í,kÐM’5E N01 [99Ö5º¾Æzr‚b]Px@¬Ù%çÖ„ ÓUØí‰ópÁ°†•“b¬TfÂ3֏ùB¿šÄþŒ¯~‚ ôê'¤¸¼Vä»TÆÿ]_K“e×÷£ÐQ€«áӑºÜjfÔǧ“Zä #­3ˆŸ]0«o˅Ndõ=9šXºN ¬¾#Eu«'ò)xÕ0hbtrFJ\õý‚V ºGƒ€UOXûÁªF…ê0]’t[ŠnRu®þ|Puapªs((S 磶7Hu¶'2!Õ00ˆ+FuŽ¾©¢úå hq: Õ%Þ/ªŽ`ï|ê‡ã䆧f!H•ú—Ë+JJºE½3M÷ ôï*«ÜÃ)‰Ç¦FЊLäM=˜—MŸ&™º¸ÚS7w°:¹Ô K÷I&/œmó ÆI±Ð7˜Ñ㖠ùdFCY&2zDeP£÷-`tLq𢻓dÃÃI‹†’—0ƒ z©ÀÁ€nѧò`EC¨@RhX‘X(šû6Þ8ÑÈc1¾iL4þfŔ)ÑíŠbóüXTœ‹Syˆh¤ÚX€}¢«Ãë“]£ì.ÑÓp0¢—Րèj–Ô$c…̨ӁˆF·õQö`…B¯crT,.\<Ñàu=¾™LÊaá”ëâCcE¥Æ…;Ë2øqÕ›ê­\`V,{8áЏU$“ ª“š MISù ]­öšdh.ó\üÇzpBfµ_rúq)-.t,'š‹çÚÞ°ÐXh“÷¼ä€" -]¬4=™ÐàvŹ󃉬ÜDB¿»FŸ¿¹óõ¿/úk¤çŸ=~ùôÿùO¿ÛÃýæ·ü¿¿üÿþúý̗ß|ÿËÿ÷‡ÿî_x®Oÿø/~øË¿þÊnÿׯüåŸÿðÛïøéwÛ‰á¯×öçvûW¿~ýÒ¿ýõ¯~÷Wñ?w^þÛþÿ_ÿðû×iýõßü<{;›×ùÿú‡¿ÙOæg7ÿòÃúÝ/_wöÿþío~úÝÜú_ýæ¿~Ø8*Oþ§×ùÏ~øõþ«ßým/ô/~óû¿ùÙ'û§¯¿þÉ?¿ù§?ýÊ»ÓðÀðË?ûÍOþzû~÷z¿ûÎöúÃ~óö/¿ø“?û¯ü·®û§¿ýoóWóXÿèÏ~øý'ÿõ)ý¿¸>ý“_üÉõéßýþòßð;öûúôÿ¼þ뿼l¿ÿT>ý‹Oÿá?^Ÿ~õÚãßýÅ/þä»60ôã~\]n{û…¦Ë…‰?oíôå8Ö믟ðÃÿòõ?¯‘‡™¸ mB³þ«]”)4xé3½–—¯5þã5€WZ!DŽKŽ ÅÉ u¶$ó¤ÝcìeDÆkÕp±hx8Òv ¥íõÇaéF½†·ã¨#`GñÜ8)üuvÏsØìë„×a·Kûx^GøO¸É ýÓ´{­ûáÙ±‰¦gÂá_îPGÕÈkÁ}?7AXþnoº>ý‹_Äãl@K -–|!iºžÝ£kÚ^FÊúï7£%º¾Í^„æ8 oìõ:œç`ã÷ëU;Îí¯yÝñOõå† øYH£8þ½Û}&¬^å՚ތÌ»Ù‘ÇËõÓyXÒ9îOç9ØøýϜÛ<íx£ÿÐ]zÉFÚu†r^KýqÙv•‚—ùa«]Ôò¶^ðRßD¬ÃnwlÃy{ñ#pÊύáÔæ·xßñ²oïÃ<ìþæ|¸ßì~ÔÔó}dËâïöï4ð tvŒl›ñÙ6ûٶî‘m;‡cdÏ -qnÜ y?ì2žç°ìÛ ¯Ãn—öá>|£(æ™r¥·óÌu¿SJá'³ýâf܇ï?º+$âµçƒ»öÃ!;§½ù0™u–탻‚‡Ó êj>uº -6¾»+ûÆËY‡]Æó6û:áuØíÒ>އo2™®9ú¼½Ë©ØÎa¹ÛÙnÆãÒ6f݇ÍZwlóŽÛ»9ÛÆËý؞Ú4¾=âeßއyØýÍùp¾Õdº¦éó/¿b;ål'¼«Ûܘu+6/hÝ´ÍU8îðæWl/d{pÓøö”—}{%æa÷—çÃ}ø&/ðú.ð-µûãøö㓿Ý/÷4^S~Žhïuµs|È֐Ÿß¦ïãþñúä×a—ñ<‡Í¾Nxv»´÷áÛ/gÎ;¼¾åí4ÖW¿ðf<®n:Ö­ØFžuÓ¶Ïó¸ÃÛ·¼m¼¾úíÁMãÛS^ö하‡Ý_ž÷á/gÎÛ»>äíÖ'¿íf<.m7Ö}؆uǶoó¸½Û‡¼m¼>ùí©MãÛ#^öí}˜‡Ýߜ÷aù¨=ÉÛ - Ã—€ðêŠÃë،‡‹²Ù—?³vy>Û9nÒÇs[‘–+(ú~[Añ$´öXÞöf<\ó;üøí°Ëã¿?.žŽ_Öyþk‡zÿô§_Þ¿Uøþ`ßÀ÷(ðëŋ÷sÖØýËÇ#±àÿõ0åÍö€œn±Þ~½Xk¦É -2ÚîÉHR/ãÓófÄ(\žm¦‘‚V>‡e(¡çOÇ9„qÍ4£µ·­‚?»Œç9löuÂë°Û¥}¼ßr¦Áïw8Erœ†€ÞÏy›ñ¸ºeßnÅ:ìvÓÖ9œwXîM~Û8K¥w>¸i|{Ê˾½ó°ûËóá>|«™†….ï·÷riÒq¼Êûíތǥ-ûvÖa·;¶Îá¼½‰}ÄëÛÆfTOmßñ²oïÃ<ìþæ|¸ß2p͋Ù{l!È,—ý; ͹•öïöfıÚ8³½¨Äæ<ì-èy÷¤§yØXr߸I |vÏsXöí„×a·KûpŽÇ#ú¸EœŸ·ãpª­éüÅÍxœÞf_ײv]õvÇ-‚ÃÐûxÛؕuça—ñ<‡eßNxv»´÷áÛ¬çç{²VBËd7áxu¡8[ß_}ãù6ì‡]ÆçÛû2Mßh=¬µžX¦uÀõü¶Ÿ^÷î<Ïu£÷ç#Ù»ŒÏ‡×gžç·âß„°wŠ2ʛÑWý~[㝇=c >‡1P=Õ·¨à~Øe<ÏaÙ·^‡Ý.íÃ}øʀpÞ¢õä·ã¬‡´ýâf܇o2 ÐS¾?Þ^¤“ Ûωg¼çÇÙnÆãÒ6ûºÛaÏäºÏáCrý<·#¹ÞêÌ+ÌiÇOy·ûLjÎQw3Côf_ãùvØ5òoçpLÏí[ ˵gñ}‰öcÕ@'ÒéŠe´ù¾Ä×;ƒÝ^¹Ø?>Ý{ߗûÆkÕ°»Œç9löuÂë°Û¥}¼ß,Ø-¿ú¼½k!°ÃZ2lg»KÛÖë>l˖uÇ6ßþ¸½ÛB`Ûx-¶§6oxÙ·÷avs>܇oì¶k}ÞáµØNc­¶ތÇÕmKu+¶•Ëºi›{Üám-°m¼V ۃ›Æ·§¼ìÛ+1»¿<îÃ7 v×ÿõ–ê‡ñ!ìÇ'ÏÐ[~§{ú‡ñWú}Ž ÿ½}™4½ kÃõ±¯.ãùë›}ê:èvQïÀ·>œ÷v}ÅÛi¬ï};áÍx\Ý6h¬[±9q˶Ïr»·Û<7\_úö°¦ñíÉ.ûö̃î/̇;ðÃç]ïvë3ßÎv3—¶ë>lCMܯíkÜnìöáÎ ×¾=©i|{¬Ë¾½ó ûÛòá|ÿ÷Œ½þëŸ~úËøÕ§öwý»…^ËŞÆ%Ò]™îïîÑXè²Û¿¼ÙÑUXÛ/oÇù9ûvœŸ|žßFœ{œ,cl\íh_¿(ãj¹ŒÏ5ê>ÇêU¼q¹ûÇÛ¿øEëËúú©Êƒ ïÚãdÐñ9eÙ;v–±Þ(oàï¾^7Ÿûòɔ~ϓaÝ­4Õ×'f#ªÁt¨Ø’1µËçðb¶#\¨´Ó9ô+®} ×¥ns2ú ©ì·cà÷½Ë·7}Uód›^Kßø+åm֚èÞàÙú¤Ú4–§ÆeùÆ_X*ÜÛ=@/o_A™÷|)a݃·çð9Q…2[Ø\͏ ²×ý¶½úY“LNƒû×i9:´íãz­5ü{(ºóûéþ¾6b‰Ì/iŒ¾Œè¨Mcíq;`omnìM &k”¡Î¯Á:94‡å³~¢¶rÇÉ¡²ÎV´³²é~R_ߋoÚCüJS»픽ê&EeœŒ¨|ýêümžÔSº/2%7²×;žU.ÕO¦ø®ö?ð¸û-Üz{_/ÛÙÎÑ냪"çÈÁnÏ0²ß€·$÷ëó<¾ÙÁF‰ÃöØEK6öøÖ÷1öxÀÂã[¦~õ*Ö]EqTŠ·ÚÒ§ýzjØӈ»ŠÏ¹úQŽ¤FÏÒØkoa|’߶øøü3¿¸ÆKíÅûórÔjÜ펬uªëU1§êG‰!ÎÆòÄ£ë^uK{ãöx㫏){ÔáŠ7¹òy„x¸—ž}lŸÆÀ£ùêUì¯ÓëD»rº½N,’”uÀ_¦½L{ñ>Ä cŒÜŽ¼1Kã}>„Éý8íw¶ 0¢xÕOMWÔٰď ›x”»½£â>Ž‹Ï:ìy>=Rå…FG—Ã:¶ Œ …1Þù×hÁßÝxn*ÚÞy&s d!Ï=þ´yOÀÏ<½¹qžãm_ƔcÄöÐêŸÃ¨é#ßwœC‰¯£ÃøêU¬ D­«m¿øã´_kŽ{Ýëˆ …K [܊q÷yU½\mÏ56ÎӇÕ+ ŠÜlÓíÿê©}™S -:æ]öwèüöt%¯eègÚxßþÖەK5´ Ï\š¯*ì9<)–èÈX<{ûÖò§¯žÃéTÆ/ÒgŸãכËU´1·Ýûû¹Äö;´Ä½ØhßGÏr*[\8û|‡±Ú©Ä ñé«W±t^5Q‡d牢k¾/a·Ë{Ÿ¯j½"ìÀƒ|õÈóGï<4_QÏ=^Uçª¸c¡úeÚ¯Ò¶äƒøø0^õÓW¼®ôí+W -ÊZõêX+7§Ã>¨’¤1ÁI’ñÚ_ïÔ¿?#?q„×g—ùÙå+^b*>ÿ̹íq›~½çlóöÚk¶ùø-üû?°ñqäÃEë8ü3ª¢ ö~~ {~4·ÂÞùå“?/ÌãÉËx×6âsmá!ñ¡8îóëK«`èž>9›}\1Bå+…ƒa?Ç M×å)11H$cò×Õ<õìúÚ5Ãæ-óúùØ9]û¹†½ Èo“–Šô*^_@·1@IxH!i½YfüÍÆl]%ÆíK+TûÚ»#¦¡½ñ} {íq¾œD}ˆZý¿fۏÆçÉyÙ+#ÆÿFœ×]o_.=.SŠ+ËÏÚÿu›âÁÄä“‘Ó Zý ¥íõb¸d;ƒ1—ñµ¬k+óã¡'å;Öï9Œ0¾ÖLcÛr9_±þIM#.£Ä;ڇ/"œ7bæ¡}{G/_"¹=¦Vß´„Ša—˜%=ÊJÜöä%RA$kø¼î®ÛSàå¦øvî4Ö^ë¦9‘?Õ¿¾õxM6€9¯éçS¸÷yáåiĔн çöO‰{c1˜©Ol|ەX/^qÇ£4óžƒH)śÖ'AOÆ¿ôÌ-«p¶>nҝÄë©Û[ØÁ)b=¥‡ñõ•¥Í8p]ó½..® `Î⃄Gò5W/~WKÝ®âzÂG®Û7P³&Rô «q+)ô–ë%qèöçu·Z‹^ošÝÍG¡‰¸”ùiÂO˜¯/Z÷6ýºÞãÚfö¡¾¬ð f*6®Ok´¾¹´ùiōø¹Ã^ó.´Ú·#”ö§ÞÞxå ¸(ñ–£ÆdußuaE -c™[æª o8d0bæ›scZ_†gJŸðë¾ ûb°f:OÆüÄ­Hqdä)Ò L¦ùÅ 7°f¡{~1WDìx՚²Ì-qz·—/„‘G†£çÒ|dÐ|k|ò9_Æ&잇òõðÉKž÷í)6®Nb$ó¦/—ø8H^ëþIóÍ.ì¹ÃŽ¢+óÇ·¦qÏk µŽ¾ÆК—óÙҜ¥1#Nû3]ÍQRٜ՟qbK)‚(lüO°eEÎÔ5&ÞC$e?ÇR›OvhÔDÔ9[*4hã“ÇÕâ ¿ÙZ7Þ:DF¿„}²Zaó Žò•»ãç^ó‡:eèñ‘¼æ‘ûÏ!@A-nóÌëÌòW°ÿ̞Gã -6~b9ß{%¯•áœÀ“' žG¨#6¾®>½JMU7{gÄaQ„ã# Z|×ÒË»ˆ»ï«úUNqnÉD3Ç!e¼Tð÷}^jþbjW#\sˆ}îÑãs‰ûú˜UЌö‰§#°ò%ìõŽw"Ftà{ŸxrN|„é…–zµuäpI¼@•ñ¹Ÿ9Õø…¸">ÀQoúólQ;' yç¹Ýs~‹á[MZ"Òë£ú¬Ä}C„v9?qä!§"#‘¼Úä "cLñ‡»û­Õëç†>éöÞáFiÌ9¸5/y®GO$‡Ÿ€qeú °æH µª‰ÿù5s€„]¡ÃÍ}¼–½Ì yízHªîªç‹ØåZ«ôé~C.™æäf_Hòé“W8…2ÞW¼¥Íø5Ž0×01õ£¥ÙÜø5ÄVº«9&¡-B‹ÕsC'3¡ÏïVC]Fç•x¥ê=—!¹({èÏ@Ã<¨æsäfØƹRG¢báéñ–p­&cI}~Hóån»ÿ3PÚ¼iÏ\Š@9ZÅÎ>ÐzÇfžÓ°“O\E¯sV}͙xƒ¿„ýÎW¬ÓœmrLÔþ•fãì+ÐA.ygóÌ듙O͍"\à -zO:Úäa÷;EËáëÎþålÇk9Ë-›{ð¬ìñ£)‘Ó'¬Âajà<;LS_žæ͌ùÆü:BHåHpäˆLëëˆ3H}…Sz‘q)-3ȊFó9FýZµX,©Hz‡(걫_4Ç%ö -÷˜q{ª…Ž¨ÇÇžRJjcç6×薞㯞}â|~É<UZ9&½×ëÉÌ/¾;¡cûԘDØá[€btMˆ]­XUŸÞó…¦1Îåì(áçcÞoþ=_òký<Ã6Ç=S°ñt!GOq„üÄØ͗láºcäÍY ô‚Zã[+a¬ Û¯Ôù–k‰±ÛI¨ÅçÆCÓ{]1_cᚺ¡ø½½ãç.{yì{‡} -ñQ×9Ù\èE3ú>a,¯bÞ¥¶â»ÿI(ä·{NN/8‰qóÒÐÛ2Ö}uÅd®5 gIº¾SÔ¶×9éŽÈ%²ó}Þ´+Çfœä©eËÄî¹(¹vת£I©ŒŒ§Û“ØÍîjŒ"O³›A{sbº%C‡²vMßc„qÉÏz©‘%`ÇÛxpšPhL {Œ”ªm É —4óÍø²æ±ßÕ×RgHÄ¢"|Y±a€v;ÂZvø„›D¬Ë£µqƬø€Ö¦ź•™\*¶sŒ×œ/ìf£o;ñ¤íÜòü<#å2궖¸þ{ï¶äƑ$ˆÎs›é`vLǤ9]`Æ-/-ë²(²5]¹$[­ÙÙ¶2*‹…! -¨Å…õ3ó2ß°Oó¦ÚÇ9áá‘@È/³/,Àéááá÷йس¬bK`|ZKµ¼•œ÷¦ Žìl ®¥`ážVš{]Áîjê0r$m§ª ¾á¡e…‰úÔ2ž£B SZi.D¯0ädEQ0a &6´¥7f‹Ú+Ú £f­Å÷G‚SI–I¥|d”ò'\ƒbÀ|¼΅ “‚ÆÙqà’MÆ}€;+ێ}l\¾ÊqÚ;bL¹¤ä`K¬ñΦvÚ/±kA‘kÝÇâ7c@£¨Ÿ8%h­BÝv¢qZž°±NÌx‹<%  p’ó¨!<ˆ”C´å<ÈG˜,Åð`¾’&j]pD©ñ´“<ÈÄ)G¾¥¢Ð-±N -‰` ÞÀ#¨qJ@›–F> Ïbø:ÐòŒŸ©1ɯ‰“ePyó—};o‘s-ÉÃëðn`7d P²æ |ˆ´dSd7°µEl&‘¡Lâ€ŠMlùpð”ÅùLR‰b iJ+0CZ>Ïî#;Rá]˜±ÇC¨H‰‰¦<p¯‹9ªÛû—yY/qÆ×ÒGBHwpfWB¸±0X-;Óà2„à òw8xw-sx-уX¨Ùã#LFçgžS´ò$#—;ë¹#v,?‡ËyYò"iáÁ\¨}`ož¹òç~\nÖs{>ОJ˜+æ)Å©@Ӕ¹´öAR)Fô Hñ!§¥' (ÞÄPtg¼BPcËBµoŽú‘¥Q Æ{ †b@R2'"PjҒ$ÅÜ6Î -ÁËn2as$’‘£y5L‰YÂÝ̘1˜ €`4$^«ÉC,%`6ÔX3[•iF@Â-:[<yåÐÇ÷❩J>ÍxhÐGZ!ÊGšåޗèé踴d·1ûyâ¤"×ÛBS˜(À9ß/ÇÄEoúµËqº…¦mVd: -ÉÍ}%X -Ýy"}1h^ڈs+õ,÷c ±øؘ¨ I@ÍÒ²¬`ЬI D扻4Å3!Æ  -2öaT;cH G©HÁeí3 -ÖÅmo¥äð™ÂÕÓvô+dΞ)âô.î -&#ÙϲUéÊóŸÕÀ˜ƒ«UpÂFˁ9qüqùÎ0tÇq‚ñǹ¦pvŒañrv¬Cš‡*œ¶êN$È ¢-ʈ€!¥ %ùu…"IUjMqØkU¸RC–’ì'óŒW†×øòÜ2ÀÃöPZGp:cÁ!í3h¬Ü|½Â÷gFžRîGê*»øÆipsùø{¸ã‡ºM ôvdØÁ!T*‹|2ªà>ˆ4gÎîÃI3×w d|’eP,A°ëÐSWêLNJX¹÷̃+ψr˜i쐥`š]ºT€p¡97 w<g’¹xÊ@vœ(Ÿ›áàÁ¥ƒÇ - ÈÚd È|.Ü?Åç®ä8òLG¶~¡œÂ÷ 埊v¡ :ËýыÄÁ0P>紟”ÂÖ -UЂ‡³è_¹1‹]Â+A™r· ùɝRÚ«mÛjÈo¡X8J%7ffBø^šÇŒÇi!’O#ÉÉŠ¢o /e20wÃD&SijKC¹&9çZ9[Ɩ”à˜w®}cŠÿÁ %´voÒçyÔ»¬Yâç|—à‘Tړò"‰yé(…Kº›eýYP¾W8ºHLÍDäÊ۝<0³+¢¬<´%úQHN æôÛx ¾meô¨o9Y’ï0_„4 Lƒž‰€!ñ¶p“k>Nðæ:ß7UÔO³_;’Ö)ÑÚ¡ã c$9[DIæå†56XÚ ¥9ω–[ ËÀ/᜘%º‡x½EJ‘ -ByZdWš åû Ó82•\f‰»¾É%‰¤ Ôf²øݬi&sî#)*x ú%åAKNxÄQ2ó‘)9ўô~kNÀ´àì¿(fV;÷ŽƒƒŽëûfØ.8גkL!X‰KPs-ɶ™8§æ)a@§*‘0fòðc¶Žà!¥„’ÊŒ kö$òñ¿VNÏè*dge`±!Fj|JOf8è+q®z´%àM|á8HirÎRʍ ñg©3b9º…´"¸PÒûéTâµLñRœº¬ÓCFôÁ+üüiË9$,°_‰øZ‡øh–^և›d½®àÜe4aÞ‰žÄš ÊÔ7²}¡ˆBCKDH۔r&iýhÊYÎ9Ž#qaÉ^äË){ÉÄrÎpõ褻4¡Æèbó¢oJ»ÍYA$aú@V9ȓ„™Õ,l”eg Az„ɈÛ ü©¦+¼Tﳂn¸ŒlP BL«CrIÈL|°œÓP4­¡éi “½^Q¢„% }<#λGãìGôµ‘¥¤,8J Y¶ž ^ó†ô½Àò2?§¹¬ðaœä“å:£Æ±]£3Jº ÙÔ¨æƒ ½ƒ„Æo2LéPI©²’ÑÆ}àtJÌ;#¸Jˆ—b1afŽқoÉ\Bç1fŪ¨ôâh.)§ ÷M{M¹V&` $ä…ZÉˏŽ9l’wž° —í4Ë$åÖ¦5z¸ U+ñùc¡1¢uç¥æŒVäa–ƒ½7ñQxظ©³Á„ás)Ž1HÅ;×ýb¼mŒ€¼  ö`I5ïPo¸QäÅ4sCҐ“.L„!+ˆK$^ûSŽÌ3Ú¶’€RÑò“‘¥LÃÜò™Ë -#À Jä¦ÔD@’d¼¹”!  –‘™‰Dפ¯jš­·‰ ͸3Y®Y ÷ï5Nz©RÏ°# qa–l6£àªÄY?Ø *ÈL±M0Ò¥"[ ù1ý)ï1g@øŒáøšé@Çnx "qUWØ% o0Ž¡´€ÝZ™fY¬ !É­ðJ±æ9%$Þ —±¿1 >O×6 '€_2©w˜•¬É + "d’†Ý;uÆ'ß ²úú(À@û)RÛò ¤‚58ãÔPl¼FÒÉI[*ôÔħáç¹ © [‡1ç9¥"¦ÁÓ—=»ÓÒoÉw’DÌ[AÆöÔøaÙædx'9•b)ïðI(€y€÷ž%Ñ|rüÂ3ѓüIʹ™ä锯ÀØûb8”’ǘҪt) èéIå ãbf vs˜µ>¬Ô(o“_‘&yYC´û(| ‚½?VÆɆÞT%3˜9%I„Á‡#§÷<#àuívø–òÞ„m Øû0óRP:K ­Ê€ÁPÁ ÜÁñ–¤†Ú{·Ž$×}ytéQ.&ú³7PՍ-|`Dµ¨¸ÝQŠÅ< •ñVl,¹ìdž!©¦sÅÅ>:o¨³èQ)jÉóM‘&A;¬ÈɊç‘[×ÒwL³µÑWƒ` & g[JŽ^oŠ˜D¡ÝuŒ~9pU Iízâ€^åÝáé`1é{‹ÒMÀPÐ,gÞƒ>lš —k‚@£hñDµ. ± ³…²pHžÜküÈN³1’yŒs|ÝHn)#̆+[`Xcö -0À}â*\«îÔ-fŠ”ÁŒjCpógD7J¸G´Ìàia'û£ x]SÅ !¥ìÑOØh1’ª•d[·!.!$mg7ٚ…6ŠƒRJ× m0A+Skï… À´…!ŠWèÒƒwxÜWU &vKfâÚ2 žå´éȓ œMžz™¸È"v‹»š1•Ï…Ébcd¯óvsὌ)kþâ3VžQ½ÏŠÃ×q¼|ƒg8‹} ”0?ñ"8ù”s iª>;ß7v* -&l:xF‚&3„Ì ùÓÏS8T8T<æœN?XTԉ\Óó䂃Ê’\øyrxåɽÅg¨ `ž|‚uoC‘’â˱Z¹‹w[ˆøuNù90—Áã¡a¹'!^,#’Iïñ+à ¼Ö£°š‚Äœ!_*¡p~g$~]¸Bº~g†•Z@a-¿R>Í -Îåð†“C!HTˆ‚OŠË(¨«MGcÖd I¼M€’t’Þ-É»ŠUSèAAU¬rš¢‚“†WZÁGãe$nȄ Ҝå&̸=#¸Q¼—} p’eu*—8–p‚Î| -K9¯”,¡¼¡$\ÁìÄ42"ðÀ „F‰OYðI’Ü7.¸ -zÛO¶—÷H>—¹@ˆt*õ ɛ…*+gºXx®©o™ä £DQá.x£tI‚å™Py$I1š -œj¬2I*U΋í÷h–Süh(’ì )—Ás9`ÈiØc^–"ÓÌϝ¢ãK+y šLi†J©¹ÐؔD”$+(^vS©“Ñn¦u¬Ÿ@¶`+yŠIb ž‹"WÌ9À7K¹V\üWn\EâB„Cæ`\ó®¥?¬SïÞ÷¯3ó‹*¥˜fÉ fÓ\_>$‹l£IÂaܚCÈš¸ ’ÒXqÕYdŽq.yߘ˛ù¢SX՜[†ô©$*ßäÒo,ò²›LPÌ»fk2C!œ¢e¨¨˜CËõ½Ð,åßÙ5˜d2Šq×.ÂÙ³" ~ùá ŠÜ—†k¼cÍc((øØIY\”£ œ*Ø¡DŸ‚ :ÆĜ™07Ñ!cVÁ]ˆžoÌÅÁ@Oø™köØ yÓ'0²t¢ÇƵ u[e9gA·Ùý -ö…’ ĄL(Å; ™Ã9æê BDVÆė l݇í)›?uÆááPéU²R¹@{á"›(æl$Ìþ0ì‚1øKÔ9ÿS°çÒx£€OüŠ÷†¢<™‡“ dª€±3ð)C§B’«OOdÉ¡ý '' -à¶Ì# }Ïc§!‘¸ 3M¨È•ªœP%ù´u%68æè¼å’d/¸jX!5÷XG…ÿʸI™®”ç'X°ÁË§ô|Æî×$w\Â}Aâ3è¸H›Ë¤éÞÅñƒ ”ù, ÌSš(3|ҙ0Š‚v¥½‰XO,BJ`æꧮ¼%¦#Q2oâjò8`(„‰žÇ`¨*ž×N6ÀK؄—¹ìo £À8!#ÌxPú-ž»è:ǑRIÅÆüé€úçCì”eìDQy³°„Ïx -Ȑç•Íœ.‡Ý5\x_€0'A¡ß=.ªÈƒ™p""Ý¬KHoÄÒ (™ÿ† – ñkT –I´ž¤› eFu21·&`¬ÞÃåžhéK¨): /^€†Î¹âÝlrÂ, ]ÁJ -È(èä³Rªô逺H©®`ž1Ý| ”71Ȥ/ZãÚSN!œ¥L•=,0ã²l˜8í1CIIz£ K@ O@bjBë3$P çe-Aþ£9u–iÌÅ$µ¤ð‡¤åJÅ£^G Kœ<¨18 '˜”ê]·N¶•è=t¤y̆bƒòI”ÆÕÙóIhÃ٩Ù* ‰H/8µÖðR£º'ÒPґIi¢-‹®|?ºÔY˜Ý2œö›²ÒïJyb6±ì„JÃÌe‘Ù’*ìȌ2ÌÝzåŒfÉÕ*“ÖʙÎÐÍ9ž4Û¬XY@iÉ %¡–öÔâ›øyÍË‹hF5ˆ¸Ê²/ -À„=FQwó,‹µ6YSyTö#P‡xŸ «Á>À¢¨¾’¦ª2HEgúJ’tRAô֑W-”Î% îZ»´‰CŽ -֮ζÌ«bš“ ‘¼nËk¨¾H¬%ÆJ‰âáï€2㢪:'´* ’mõ!ÀI<´Š$ã³£¡%‹u2ªÅd¨„Š-¾ôSJµ4©Ã¨ § ë©Wl*ή·¥Y8¥2S)3ŒP -ÏKòb -íÁɁ~0dîI<Ë}} -0gJ³ØœQcb…Æ—_K#NTaªŽ±†8ºÎXrÒºŠØê°>ÀúC; }ŒèÍwr¬"ˆêŽ<㽚ùZh™cª~)ꕿ“ÂøÚéŒA²ð˜kn\u·;"ñ,fŽ'ёŠEP‡ €ÝJhIa ¾(GÜ8$~ª¼ÓÀp.ãõQ°#ŸjZ¶&r!4˜rÆË2Î>L\iGOǔT8‚Îìē‘§Tá¥\ÇfªÜsÁœâÇñ,QÁ½Œ‰“ú҅:6h¥Tt l^xê@9BNä‘ZPã‚cäÈBÀÕʸ†`㤝}+ fa~ƒ¬n*P?± ¦K‡ZL9ž‡ŸQŒf’¹³Ú$Qjâ¢XyʹŒ“I¨´.2fËѐnjr*ýÊ1ŒTÞRÅa¡Ž‚QœË¬Û4d¬Ã0X vm -Éf†¯¯ªjœÅÛ圴`b½„£JĦÜsš;æ+‚fÎFí£¥Ø ðà2¡x{û-笰F%y€g†l¸Ä Aæb§¦ñå¡Üg»p¨Ajá4ɬÑÞóbŠ³›»`/êCê»3a -v4ÎÓܑAIȑnZZ{µO±‡mݔˆ†êoC€"¾5KE©ˆè,•›)Ì.aG‘t"B*(Ó ¢ÄiS,Ÿ4o×XrþVÂåX¡Ø‡¤E( ų̂&>œRˆ…¾ÈÈIeŸ¨æ¦gðýl¹B).‚ëOR,{äF¤"ª¨–§lÚÃD,*ãé˜;ÃUù@‹exÆ5y°°|Dd*1—(Ç®I¨SçËha—N¬{QšŸk싃¦‚/A -e™1‰Ž2犔]ž)$XR-ÌY8#xÆcÌgKÁ0EÉÃTôZ†â«9k"©ª÷ã×´h£Â¥¾Ò0 C®r(1‡[ÊQC)Á ®îõfô?„šlkÂE•BÐ~è\!#W)¡UœsÆ®|/{SXæýÇx`p•ybn™Âú`ó;jˆ”h‰Ÿž«p²³ñ…2͖{R¸IÀ&w¾z7äÄiTJ—aBÇ)q¶Âó -éSòÕ-õvú‚mҕ ¼4åŒÞK¬[S¾sAüĖ°VɐÂý 4Æ7-¸&+‰ÕT”Sœ­Ý„¨ZÁ¢›I—Ëõ䚀:çr¡™Ž0hÞÏhÓtÀP/Ý‚˜-qz †ŒýÄö<†,Ü9àV$uTZKdÌ;^„Òynñ×ø5~zLT6;ÆBöh.ƒâÚ>™W…-PrI7¬6ÂB"$ÓpÀ¨p˜vê¦ÑNüöûŠ%@££ªAX¬Ø7TQøêaP#>åچ&”ƒ÷—²ÉPB|­ôü¿bezÑ{Lbo`Úԛ:8kV10—5À"ÒkBÊ;ňT -$ãm€'± -–úšÞCÆÀ£Œ‡dåíÊ(N©è?jž´1¡ñ†àg{kªl(š)©Êè« -#Í<¡ iÏ3±1UӑR0Ú4yûCã„#¦‚ùŽqb±ÒaXE`æ–…Ó á¤à, -2ô’/€lr)ÎÈ6A,žºŽÁ• Â×%,@š”u5,Á”ëH-£À>—P耚4q²a#äÕTJUÁ ×_Ç1ÌF°Î»BG¢þÜ´ù˜U´ª{Ãp_νüƒ@6û¸ -êJÈQPþÂ:ÞRŽ¯£È' -fÚ¢>JíÈ?…J4kÆ딛”`™x&ùu¬{é0Š5Ež/\IIÙu5¤¢@Î0ÒàšåœSÉÀú„”š¼’PÇ@¬}*emúÌÙÏCE`ÔTo¼®4uÝ ˆòéÙ>stream -¥¢+ë=›e:®(øÆ>ϱ4«y¡êß«`(A€´Ú UÅQ)¾Ì¢îñmÎ+„ÎpÕeÔCg¸ÚÂ=0ca‹*«Ôu†_Ê£c]ò/ÍX9çÀãË ×ðžFד¥:¨Ë"¾¤”U4,{.)5T² *!!Ö¯é6ë5Ìá¥ÚU©r?¥|»o¦åÂÁs¾‰1gíÖÝ àóˆ¸víÖn‡j^t­q_Oàë[èvêö†;w“ÐmC®1:ø¹@C¡8˜rÏ|}IÀ Ùàžˆ¨¼‚ -ɂt“­ášgI¨Á´Ö·øpJCV2N>\œ…¾q0d*iÂÒ° -G™ºPäH³‚.¶[ëC¼2Ç4›?o.ØÓ§œ(i»b%e³J€¡^¯#ï,\X­;+S¾û+¼7U”ö™s¥IwÎÔá ¬6‰b$L”Jtz4À•Z A¨3œmÀsÝ×ÄY,Ê÷хÜAΆq%£Upº º…S~ðÕ×bæs@3Ž'3|ƒ/Œ -r$§:„€²8õΡ\ñôŠî‡¶¿ÑrR«/ˆ½Þ‡ ëÈs„YY7÷4cR½„+r1¤úlGv«U½o¾íýò÷µÏ_?ü!?ÿ~rùh¶œ_?,ål‚PÐ󟦓ç³Ñd1š¼>9ñðGåëÑ$þå«?üt‹¿‰Äýøòç§OFc‹ê«?<àϽ?Ùo¿üxöÓô²ÄϏGÃÅh:ÌÞïøé»Þ7¿ÞŒ'öÇÛÁÙèb¹(çßöþh>œÍ«m†×£ñ嬜` Ù{ðÃd~„ïoKüñ¡“¯¿í=øÛd4´ð—÷äuµíÛÁxé¿].®··ž n\cÛßüÇ0´ërôúzÑ|lÔþ®w"[ î}óq½?’!ýÚ|H¿Þݐþpþðâuy5 ¯å_“Eùãhñrx lfr.wti›î(4úc³áz9]ΆåÃñíõ 9M&Í×Àhrw‹àb¼œ5Ô¬œ/Ç-øµ¿«ÁéÆ#›/.—oGèVóñUŸj¸º7 ElJýþŠpU>,çóÑ`òhçŒFCØ>3>i—-øìå2Ú#jq^Þái؊k +œ^]ÍËÅîíóqâ]²Šg8ÒcfcpAëNÇÓٟÞ]e fÿ~¼£u•Ëcó;Ó’æ»-‡Ëñ`öý¯·ÓI9i±0ן¼³á¶íét2_ ömxò®Fkšv9» ˗ÃA«µ[yª;.>â `=[îXuŸï¬84}"ûŸûf0mÆtf€Ùj¢~k>¨ßî\Ðy>Mg­Œgüt½y鏝3/¼³¶ŸMD¶aíòîöÄ®3(Ôô¶œ Óæ*wôı]ݑ|PêÛéôæv:ß©ñ6i.ç¿iÁ5ÞÜ!Óh~†¾Ù1øʈÄQŒh‡«2"} ÚåÕbDêxxÞñƒÙhq}S.FÃ{};Iêélp{Ýb¤Çr$G‹çƒÑ.ãLw&ï3#‡v¤ïa@ßcßå,ÿXÎ^—@×c–¼ZoÉ/a’>ig #ãÕ¸—W½ï¾:ôð°äþ†‡µÚ±…‡Ý»à°{¦½Ov7ÒÉÅ¿—ÃÅ£érriûøhºc&֘§m»˜7Ÿ½ÊC OÄCc°‹åìb9.'Ãæ¾u÷pS"ñ«îdx“éËÅh1Üq*T ù«Ñ¸l±*݇ê'Í]̓yùdVþ諾ù xå±»êóF4ÎÉòæÙp1xÛf6ãgîj„°-ï»>ýª!ë9lU«ÕLeÇ>›Eîè VrÚ)§rÚ)§‡¡œ6«ï”Óû§œ^ÍVÿ4Í;õôèÕÓ憦ãÖN›ó¬N;í´Óš©N;í´ÓN;ÝݏãÐN­ ý¸¼ž”“óan_PšsJÌ—£e‹c™Úß˸-ò#;®x \ñÇéìöz:ž¾n.÷vlq?¶˜vlя¯9%:¶Ø±ÅŽ-ÞO¶øýlz9*gÀøEŒ¥íŽ1vŒ±cŒ-c'2Þ‘±cŒcìc#Æøt°üý?æÃërö÷r4¼þ þ™”³Oäµ?F6ٕ§ì6ÝgÚtY·éüøšS¢Ûtݦ۽ž„¹¿qžm†vlqž'âÞEz¶ÒÑÄzþe:þíf0/gË]Óº€ÏC½Ÿíªˆ^¶PHïpÜïê/Ýí_º$yhLdÚ ôù²‘î҄†#ê.MøT5Ÿfåe»r°Gû}ü—'\§ÓKsÂÅx0|ó]ρ¦·ƒáhñþOI¿ÍÙvL—)à ï÷o7ª#ÝwO`‰ó¶›_.§ïNïå -ü€c K,9ÏoKÞØ (Ê(ïEyðËÑÕÕ²Ebï±0Êæy®žío7Z{ððÇêvNË»*ÝÕÛÝíVâA®Dñ¥±ÄG‡"„ú”y5LæW-nË9Àݱo¢Igñ9‹Ï^"ñ1Éûn}’Äߙ}¶L†O>e²>{.é.¢÷;s¹—ëµ¹ÍìÈ.ÖÓ÷ùb½6ƒ;’‹õLóͽzýý¿®Çå£Y›XþîZ½êPïõz-|ñÇRT­ßÂq6¸-[Ì8µ¿«±]ŽÆƒ5-Qï¼Ï¡÷>XéÇéìöz:ž¾n~² ªÙ"¬ ã‰O<$¾q,œðއZÝNØ<›éXXa› ö#‰ø¾ap-Öݑò‡ãë¾÷åZ` óû‚*$-DÞã®pÐ<–öX ´CŽå„û,ÑÝwyÂݏz;já!°#ú3öfœ^&“rü²—ÃV:óú“w5ڇͽQ{výÉ»móÕÚ ¿r¦ßñ½?-d±£‰ »ÇZóx¤ÇÚãÑüv<–7ådñãàö˜Ï¶{\«ç¢¹•çXŽíPb¨·öQT>6ú±U j#Œ Ãl¾P”aޓ’CÍÕìcá(m˜ä±l§æ³ttIÓ-ŒvŸ-eúÐvéÕ¬,knŽ¾í -(_‰÷Ãü_ͦ7-F…­ïjTÍ÷ëbÚBøœÞ¡œ¶C ŠíÎåë6ŒÕ7¿« Æïï›ÎòËÅ`֎Áºîl-6Üe‹J®ñ] ªùa ûð£é@W»«!G“rÐüšèá`<üqÚ"¥$z⮆8+ÑÑ|B//G‹ÑÛ6sÉOÜÕ'ÓI‹‡Ë›åîH°Ê£gîTILF7mzþÇOՑûS«fx#—ò.réàÐëîHí9]äRƒ¹º[ë÷°‹\:êÈ¥îr–õkìRAäXθ.vé(ιa»ÔÅ.OìRsõæ¸b—ÚHcG»tµ.véxζ{»4üb—Ä»ÔF;†ÙÅ.³Þ¿Ø¥6LòX¶S»Ô]÷°ÿÌ3Ói¿Cïr‚÷*ByhÓÓ&žµ›žÏ>=Ÿ´äËÑÍÎ'íÌtä>Vp}øÃùóѯåx~;*Çç-Ã1Yô4IÏ4×SÝܾh£ªFÜÕ»Jš­I6+o¦»ìŽ4ô|4¹,¯F“ä+Êm9Xžuöñãc!ÝwG]T»Ý p$\rHW½=[î`÷Á9®µkn}ӂo¼¹C¶ÑÜ4úfÇà+#G1¢Q •é;Ô]šhGØReDêØDßc9Š³Ñâú¦\´3ŽñHÞëô:Æ£ùÞ'‰~ì³ùBûMxçÎÿÀÎ@Gî¿;¿e‚ñ!Í:w~çί!YçÎïÜù›×¹ó;w~ûQ}iîü®[çÎ?w>ŠàЗÉwíDÂ΅ œÎ…ç°Î…-;þÁ°ËÑÕÕ²E¸cá"Í͍ž§Ó‰•ø'-öÛڃ‡?VÇ"^¶+Syè®Æø¾§ït¸rl¿µ³`EÜ±ùêñmgpp@¸í*Mgþ ?ê ÒBw¿-‡–3Ͼÿõ֞mlOëOޙDÙ|ÇP§Û›Ú֟¼;‘d‡ô¡Ú¬äÎ -uXV(Ú1”uhŒº³Du–¨ÎÕY¢:KTg‰ê,Q_ˆ%Ê۝œ%ʛ¥Ð ÕY¢ŽMÑï6^càJg_sM;ûÚGìÏK¯ÞÛýNt¿ç5gö±Kt6—{ŸÝ~èUMŽ¤òL‹ª&]å™ÃёTžiC~4‡ñRufß:~Çq,G‹çƒÑ.wcw&ęÜUƒëÎäƒ^uGr&ï§guçòAË­O®c;’»*p-ÏäcŒ³h?Ù]¸ìÌtäžV€{9¼¶HËÉ}ºÎ­«¶§ÆÜ©8º"ÍË6vE*f·5¿éü²ù-õØö®–a‹½o1¢÷GÂ5Ž…N¯®æå¶Ï¬¼lÇíTay†#þ‚µ•˜ò/Am9´éúl®‹£›©NÁ<>SèäëƋøÝè²MìŸo~WG©P-†v]¶ -œãöw5¸aš®…@w‡ò\«!µºïPèŽÍ7÷¨|g¾éÌ7_Šù&íÌ7Ç'£ç÷Î|ÓbDù¦3ßtæ›c˜ò/Á(phÓՙo:óÍý1߀‚¹°²ã|¸Ã.Ó©—÷Z½¼š †‹Áø§é¨EV„{¼)™øew2ÀaKóIS^}‡Ë|2}¹-ZlÜ965·Éý¯EC!ñH=:_”û#ùRüÍãԎÕýÛòP¼~Úé§÷T?mµÍ: µÓP; µÓPkGÕi¨ŸNCm.ÖvêýÓPï}Ôᥣ6¯sÜ*jóqv*j§¢v*j§¢v*ꪨ_?üA$çßO.YUE˜ÐùOÓÉs‹/Î<ñðGpÿjüËWøéÖáÑîǗïo.¦cÛ¥Gå娜\•ãK¨ï0•¿ÿG99RãÅÕø÷ÿ^—ÏÞÚ>•ô~õ‡¤÷Ë»¯þ°¤ÿýó(òàÏàÑKð¿¿¼‡oÿb?ý»…½ëéޏ½ûGÒ»üJô~y¿Ù¥ý$ItÑ;)z7öü=ûê'ü!ë§&“ -¾Âÿàk* ~N{§¶AÑK±aÑãßèlS@+øs^†_¨9| Ÿ)>x†é—èÅQ—mÛ+ˆ|n½?Y_$FgøWÛfðCŽ]…¿nLôËIh~’»wÛ¿îåð~”F÷ø÷ëIîu’»ðoÑ#¹'Pîèóè&雿M`e]ö^Ï0㋞úç꤀ys3Gÿ>²Ós’À`“DôN„Å(e/²Bê^VhÝûå¦ÒRŠú–©é=6Åù¨N™"Nœ…GìbüL[ÒÏ¢Eˆ„ºq«ª:'8ÌD´Oµè/ÏS4{+[ýڅ‡ý{¬4ÓQ¢ŽÑ4oš9Ù|æ,*™Tig€ÊjuæDQß2•k3·ç£f8eV9œ¸o¾íýòwïCË©’~Zè&=Uv¥Ø?Raì“«TÀáÿ¿ ÖypÙÏe.TO÷¥V÷è |–)¬=ÿ#L1|.l÷ðG,‚>ڟ”@­¢;Ã|}nO°EõœþúüK…,7ªÈ#SÁ£G!€ðÅtJd|}üýÜ÷ ÐÒknÂë:V7€¨Ùºí½•}eRQ覽ýÛ&T$fؓF=‡jA³É÷¿ÞNg‹WtH~}žô<šNÇÕF“ÁŸ|º]z¹àës±Žê…=ºæ‹v(B¨û¦'ýß`!¸môó B…HXªpûݼž×g$Ià.Íøo淁Eš•jx™Lµ!Þaûg;¨28ET&©á-©;íO2>À¹àx?ý%Ö`¥ž¯ ¼û&ê |@vbÂß­Ç´ÙÎìí/ÀiM•ËæÀòø؇ÙÐÄôÝÁ¼Ë£]X’*;ǑÝDC…ڏUÇcßS4ÙÒÛd÷˜õî1';ǬŠê˜—n”Â2ðáÌ}PDþ ¶<-ÂÐuýÐQvH 'v¡Úr²Ý•_tNã\äQý#je*íÒIú%~ôWîΉ@.ÕzD± ¡ª-ì†Ý:²-ÖŒÐø?Bš)ú»u©âՇŽ/]Ÿn>¾tÇø­JA«RÐbTч¸*ueUfÕ´©š®,ʕ'jF$ý€¤OâGA?îšÔw™Þ´ËôÆ]¶aDƏÈøѼÐߏ¹õÎ=¦7í1½sÕ/ñKPúe&ýºKÂߏ¸üDeºtõ-kF%*³µòÄú`¤‹tCIÜüŸ»òĦ$6í$±i'ÕŸ¡8ý¦ç'Ãÿù˜KNlÜBbÓ·PÝP•Ýà_á% ú‹Ã!V÷Q–˜“jæÅ U룡'ÖæÅý°6\bÆ­&ã֖¢?u‰­ E¯ ¥f·¬ EïŠqCñ²®Ÿ ÿç#.±O='±"2{&ýBJ!rì(/¢Â€ -4gítòàM-x‹1Qfhñd» 'Ÿl‚ÿJߌ^ÞdÚK/è) yÅu•›]…”˜MSíP>VΑUåÌ-¡5a…ꚶ&ï¯Û 7ã]“„6á•ÅÚ\JÚ|Bÿ¨»PégÓÛËé»I­BïÍüN¯ßÛØ_ô‹D -;GhA¿YÐIÚ×ø!†å}aÒL÷ò~jLnß(¥8E;/™êªxP0О+ÐÎì’FØõu+Œ±Ñ ߈ûE°æûþ‘@D»J»Ó­Ö={dIV¤;­{cïÁOÓŋr8]Zžà×>*öOªrÑOU -»MIº¾^OþðÔó‘WWÓٍû–©]ϗӋòüáŹíóËÅûqyÞ^]ÍðÚ_.›’û˜ `Ó§´%‹¥yÈ„5˜"e˜]&®QÖOñDtgX¼hÅuàPÛ~åñÍÃ:KÃZgTð¤t+Tû5P@¯îð2¬o-ÑP-5åF¶J£¦›-ËğpàÔüü}à%èÃûAá Üb¿XjãS‰}•Hòè1\ºMØdþóÆ3¸£T•R°rsµ«›û&€b´Æ&VØȯ©œšª®3´U–·Æw2Ëø$Ýcv¼Æ°W9Ö.¶Êì"6K u~¹vâ6rÏ6à…Ù&þä$ؔø“Žy¡Øȟð©D3/Ô1/lù®GMÞ¥õÊk¾x^¸ÃA¿²ÃcÕò£8¾O4í2áwXFh¿‹°óP7°å¸î©³n\ÉûŒcÊ<ýZŽŸ—³«r¸p -ŠS®Þ°ŠÓDIßïšgYO🼄þÏçWזÃ7ådUQ[ Ʋ ]¯BçڇÄôEšd9x=Ó,19,¯‘¦Y}%sQAƒ]õ Ž% -ƆvwKÊ~ڗ*sx ïgYªCO -cŸP¢_¤™ þqÖ!„çÌK~•W¬vædµÃpÊԌë$:~_¥ÍIL¹“˜ªÀ¬á»´}ÀØ#ûÅvHYÝï_ÝOv¨if ’Åc6 *§Léã) ÐçG¨ýÚdð¥ú¦¨¡w§n9P¿ã1½ .KðÌ@ŽÎ¥J•bmŠ: ™õó¤@SÕړŽI™ÐGr@8¹®¡=þL ž£MB|¶þ.×l½þ¤`DÎ>^¾ú½ŠÔ’ßöèzã§Æ¥™ÊàiY„©]„N6÷­o´*d‡sXˆ¼ Ï¼†ì·¾‘Z 8'Ö¿îR@±‚=¼ú”í–‡e†iOç=mÉo„Fn»ÿ¹yû÷£É›ÁòjþnðºžÃæ.ìë¡%KðBN„³9%’—2Ša±Ùu›)¡aiä–I }úWHZià2¹€•–Øݕ¹ƒäȤûãvOñõfyK’;Geuhßg$œ1î»´ß-‡±ïVørå,v®‡:‹A©3ÒLÈ ¹h¢SÇ~ -‚­}«Î-›€­É`à9@ïˆÄ 4Ò«~šË'à‰2öÀ(w¡%P 7ŽËÌö*…0{¤x<îeôÝ7n,:tÀÀ£Ðw€=·,+. |°;±È3…c…‘ ԇ<ñ3C߁ò¾/âûj7‡VJ_¾×†¶)L/=íÖRea96 Á_¢rXIž$žsZÝ0ѶßöÜȍ -w œ¯Üy^éÑcs\4µp¥Rnjßai’åóž ~¦sGS~2uJY†g‘UÛuk9ˆ]ËJCü¼%÷(e_f™BÉ°¨ßôh ˆ°¹—€Y'JÅCal=‹:^ëvñË\Uölô’5lÁ§dUk·í/ ×à{¤OæÅzBÏîJ+r¥á»Æ‡ê¦‡äôwšÜKü÷!*!™eZÜÂêtij™N@A€è-¢ŽxÔϕ¡8Õ>Ÿ™xxöéB%ü”ý“Û #œô•ßJß/zÚ÷Ûcã²íð˜÷%ð%ô4}eìðo§§}ߪ}wã9°ÃÔvMjÓ3V̔cUšÕÌ$ò³«OFã›ú–ʱÚüD§–UÁž;ð·ðæö3Æ[ì,‚Á•Ž øgë`ѳW^§ƒ­“9º $,)- -{T¦ö ­ѓ[¬øÚÛ-t½ÝBëÒx胇¦Æ@à„NMŠáö ¸]S87­t+ ]Í2<•Ô²þÙÌî"{RÚg ŒHw~[ËûÓÜiJÚÊ3Þk;—Ìò&ë' -r n #KEöF#T’oxVf‰QO`ïÃG›uY€Þg\,mbOìñ²ñx1ww0ùƒó7+æ&oËÙ¢¼\ݤ§ãÑí­Ý«ðÇ£9lYjÿ˟áß%üƒIav”âo¸?^ æ.™ìÜöOô~yêlnåÛÞ+ö¾÷ËOù7^'†ÿüt;[ù—ë-äºÿåѺÒ= XÀ>}zø?ÿ÷¿7þçÿÂï›þïÿþ<¿oèx÷{÷û?ÂúÜþû®ýõaÿ¾`Ovà -ÈÑþÂìËBóúiWÌÀEïÉò·ßÞ÷€ÏV%‰¯Ï‘+âü—ÿÏ $þv‰љÕϙÃ~‡ˆÏ×Q:ö&¥î$t%ÄހU9d¥…gêÿ¼t=ƒ¸8ž¹?¯º.™|}^'›DÐX ê¡ Wͺ€A#yÄbYR0S¾>AÆØZT±rïþÂÊ×ç"®|}þ!Ë×ç ²4íx­Ðòõù·‚œçÎyè7 ,œ·o…‡‡?ô.Ӟے£ßÊàZ÷®=»˜—³·å幕éÏ]«yuûØù~8™Nz…,܊_ CK"7G¢2pZÙVð+-|€àL «Õ¿- b &§*Ï06LʐÖÍÀ2í߂`/NëhFÊ ‡žd ˜êðÜÍ -С¼0q¬ê- !?î¼ÝíEšçÕރy QáÑ¢/²,Sú½ÀÐû -ÐÏ«GÏÓƽˆ§œºÏ8Š ÷ØcÏøͼ]HÛ&:UZÆ@7XmÙ¶6*"ˆ桳*1Mß }¶BLÓw6µð¬é[¯„À¤dXDɆCeÔL îALHîkLI?†íÑǦäÅÈÂfŸA¿ZLÉè}_ä´ËüÆ°Éõʞ‚½. -%íÇBeѶ cþ´ Àˆ˜10q™á=S„{QáDÔß -'¢aNÄC'N'Z¥ÚÙwó -ƒº©Âp¬–‰ÜDäÀsLQ¡¤åC>ñ=¢$XeU…¼Á+Umð -„(%+@j@OÔ½ˆ(ÉݍÉc"XµÃ'*®Q‹|›ªHWˆÃp˜Æb11ÍìÉ.tZå’Úž–‰Ì*4TvH‰ŠH¨ú©†´_Fˆ€èÃ`ˆŒ™hÀ¯ˆÇ݌ˆÇc!X­Ã'â­QÉ/·< |Dċa8Â<âªHƒÜ¢i^!^æbbÚY¹Mfñ1šös“j0Ç¢]€ÚÅ0!c&ÐÛ#Òq'#ÒñHÆêÇ߉tk4ògµp^÷˜t1 (D8üÝæV0Í« -ø´®ÒÞ¯bv LUD»@´ °@»CdÌD~}¼i©›ñx,ü ÖcŽ¾ñÖ¨<5ˆÌþ&Ï*2caÑÜK(^}+YäAd¤ï±ÄH°X` Ïy¡/`öz},.¢R–fiþ:}Ï£_Mæ)|?"Q‘@±¤ž#0æÀןÖPɏĜ˜xã!’ ÅDð‚VL<Èbâ‘ØÆϑ`ǘ añ"˜"¡f"ÐûcâùnÆÄ£¡ðsL˜x«TZ‘c⌇Hb„«˜z$…ÅÔ#YôÂcößcÚ("]¹ñZ¦½;¦õ1& „äáêÀ¤[¥ÑŠðWÙ´¶–?¦Ãæó’TL:¹bґ`Æ’èƨ aõ"˜#¡f*Ðû+»Ö÷³²mý`¶%𶠀°mWèT•ö"êI¦•!ÉED’"Ò±Œ‘Ž%1‚±¬Fˆ‘.ÀébŽQøý騛åh$’ˆ7úNd[¥OU¼‹¨F  D4zš"ª‘lä/‘|FXé{D1‚E a¥qӋ#jQ÷"jÑăöX£ïD­UºT幈Z¢qå|P¸q“œQËKS±Hà" d„”¾GÄbP VÂaV¶oD+ê\D«<°zñ=Òè;Ñj•*U.¢hX$òð~ôbQD+’ž"b‘„ÅOy Œ±úﱈœQÙc¥qӋã}è»Q‹FÀOÑ  køNÔZ¥ËÙîÄOëŸM¼ÿ£úi“þ󏞴ªX²ÁOˍ些øióL°›Ö»’èÿ¾èÿTý}êþÓý‡ÿS³†þé㬾Í?îûŸÎZï u~ÐZ'Í -¸¹›Æ{.W5¼«Æ=¹æ¬Y·q×À£ë7â½\6u4DŒwD‘O.'“ë½9öé:Î -¸…GÇ>YçÓ±à}½:øèº_gܳƒƒ[óí t/ïN ·Î@­ÛgÜÆñc­sý xç>¸æþ©B[8€pdë. ï媣àv‚×y‡VÀmüCöÑ:‚÷óá£ë^¢p ?ŽnÝS„à½|EuTÜJô:'RÚ܍d_PçHðž®$x´Æ™´náN² µÆ¡ÞÃ¥TC½­´®ó5U¡Í½M5»îo‚‚Gûxœà¹uŸSÚØëCZ÷;tÏS Õ¶Ò¸Î%U…6wJA¸Ðš[ -€û8¦ riÝ5U…6uNÁ€ÖÝSÝÃAUC³í’Içª -mÏÕx¯º‡ÿ -Ÿ[ó`U¡}X8¤5/BÛû±j¨¶ã(\wpEÐ6.®HڎŒL‘°ÝÊÍÉԑ±© -mîê -bvdsŠ¤lÑÆÝUCµí4®ñƒEÐ6ž°Hœ®Òx/oX$3Wi¼—G,ÈÑUïå«¡Z3ºJã½f‘ü\%òN³ %W)¼ã,œ«ÞËyVC³fBó -§Øǯ ÌU -ïå[‹¤â*‘÷ò¯E’ò -¯ØÇÇVC·FRr…È{¸ß" ¹Báý\p‘\¡ð~n¸ W¼‡+n^Äâ -q÷ðÒ‘¸BÛ=¾-qBqGªHê!g’E}Í}å¤:XxËAïk@ p%ÚÕldº (ƒäêôPÏ¢v+=Øm–õ•åP)$:7:ƒ -!©«#–~þ\ϧ·»­\[[¿ýÍ·QÝ•úÂNÂUæt¸YSÑg>ŸÄNTÞÏ~;ÑpiäÌ&yÂ_}Œ+|vñ¢øáù‰ÃӈU`5&úxúç¿åP® ¿UÐxô{è_zF© = -=}*"ANT¸n裿žÂ}Æbø`ÀW9– ëám0ž ž.Ò&ª‰$>û‡ñYÀ›Ó½¾þå®S¡'Ü(—=|­°<÷æè RU?úþp?Ïâ‰ON¹Cgã"_xr¾Í<ñyäÊ -Ë@W¯ò5›Úfbõ’Ž­xW¯ó݈WêÝúƼ©7&z4Ñ ESQŸˆOSÍ«!Z‰+³Ï[ԡӏqe¯LV/ÍÍ åhi*sR1ÞOXß:+Ö/SيûQsÜÒ¬^`Fópí´ÞjÑ û$¬ìÕ oU?}§•oø“xl¢¿hEÿ4¥Qc±‘ÔÑßWÜÔ:Këé¿÷£æ¸WéÿU£¡¼˜ín(7ë¸æ}C‰e>s†swâQü/]×*cÄ:,‹ Û›D}‹«hŽ©ô)=,ªË`}El+‡v ŦU¿È,ãL¡¾® ½ý¬"Ћ—/·Þêû ¸pÕ¤)ކ^¨œÒØÌò t±Ry¦ šrÔàõB ½Ô†(`§Z¤¡Má-¡Œ…ôª!&t9˜}ƒÖ.ì ±@r!›0ÄT&×nDf,«£n)¬þà—ÏþöÃãޟzß G³á¸*{’y LyAw’,¾H^dõ/÷˜H°\.àsڎûpƯT Y&Ñ#¦‡X½™1#C"üV@5u÷ô*C¤M;Ãc\8+a:)—ޝP4}‚¶™äJÏ' Þd†¨q܂Õ3Ivô0J}HHzÛÔãě\R–¡E¸(Ía?õCùhZOšWä(¼ä¤^ç©kY¯ñlÀY£ïԵܤíTîú‰hvS¥%K¿>ƳQ™'&ð Q¸2ÍkkÀ-Óx¡Ô} ¥5Sëf–Ô*¿|xõē/†hÈÏ¥O­HÑ`Š«‘æ¡øX]Ë4o ÇÎÕÙ߀sU‚?jyU÷ÒDUõùŠ¥= Öêäóÿ>ƒÀ -u ­ÈG¥}µ ¼/UÎËÂ`¡ðܙe!àL¹ܙÎ7)„ñòªÐ:ØפY†7òdV&‡1Mà+±òI‘Ú“Àœ] .Y€ZqV\˄r‚¯ý,¬œ|A "²lO@ÖÕÒK_™J4¸œÝ[á©|«VϳŽ»€Äv×.WN&™ ×%¨hœã)K„«Xd*uÕ¨1‚Š$,a<¦*IªËø)*Ù?õÅ}Úä3™Òr‚!¶f}ÞºÇÌadÝÚܹðµÖ³g«™?ŒHÚc]Ðãêúš­g±†jˆ U™¿¹ q³õõy4_4K9Ö¥‡ÛL‡ðG¸ ŠÛ+Y˜0¡ ÄId}.ýïš*±ð*MÐ*ÚÍÀ+Ç/y,‹ýò'ü<^9ÓèïY°k@9Ç˜DF°¬_(¼~¯lÀ[ee* ܏,5^À‚Wiœd«Åhpr+•àmEI^‹ ütö 3ZêÜ?#S«¯ipíºpgXeºi 0Þ®Êèû©«?jd_«¢€Jq¡Z•)ƒù³=—RP¥âÐö-°ÿPD(Œ»mÇ®C)p×8E"I \Ö}êtԉUùÛ};¡¯5ßèËÜ­Ä4z50èÜn‹w_eà\Ötx‡ogô턾Ö|£/ó#_€îÍ´BޟÙ+àÄsØóäóGÁýÏeïÉàít6Z”“ÞõhòÛòê÷ÿª¹‘òóØØ  •p©¨½ÕÙà¾ÄçEwу)Üí`"Á$-ÓwØ¢ŸŠœâ£ (Àå˜d$8Ye2÷gÞǘô]*8 9æaC¨¢tBª´pÎ_Ъ3ôh è½ÒAœšmÀFcLÐ5³šºNwO£.³ÏÕ/Èû¨Æ´%Ô¾½ª4lž"¥§CÙpƒ;¿ ÿøåCÔòÜ-•ÜÈؙËeš€‹- -Y!˜R :‘Éþµšx( ób0ÞÓÛ ËFãÃ?t“eRaÜÊUQ1‰ÎQ6vQ®…íÐ΋ÝIŽzV‡tNf¸o5ÍáȹB_|fr(: ܽ&hó%â]|Ÿú{O] õ½ða´ -´£€<2q¾œ»P„‰T N4ìÁr\maZÁ c@ZË 2'bUB—N0eI"Üm½0Áhç aç:…‹¤í6¾ ²p¾{Beô:XÍH騄" ýÆ{Yµª ¶r&O _"õ ©t¢dØwqNTÞ¡Šœìðl*áÞX™ÀÍ&(éb¤§ŽÆL݄…1 ïTL%Ø7À¶â‚©!Ó'µ[D+b+itÌ3(q7~£ßþ:GÙm*ŠBâõ’¹(@®Ó©Â[°UÜâN§Û_Ÿ×ò20>îÉÍÀðYÃϼ'GsÙ‹§¹ôö=¸ZL—˜¯Aºägƒ”¸¶¼Í¯{q7ûÜ^üÍÊ5ÎAÛó8|nËYh Ÿ³’ì^œÎ>WÃëÛÜÒgöáw˜¶¹Çäô}xž[ïûp=·Éöâ{àæ©á|އ÷A6s[îy­küÄÐ5¾›=x &ToIÊÞoÙÃ˳ŠÜ¬#JKÀÔWƏ@v† ­kÀ ÎLÔÂèÑ3'˜¢…º, Ð*~´„4ÌRzŠ©EâÌ”­ƒ¢^¬ŽólË©QC“Œ)à3[Wè Ñ˜Gn•64ê~@P ŒÈºU ¬<^C§¬ô©†Vñê:H«{ -^­¢§í†Ls´ºgÇ*µüä¬ zþÓtò|6š,,Š“G=/þå«?üt‹¿åî·çã¥ý÷ÙÅ¿[õØj‚˜²Ü{4[ί{?&ƒ×å¬÷lv Fû?öܯ§ƒñxôz6¸½ }ÓW–Òz/–“ËÞIOõž/úÖÛ³=þ¦þ«!Ö>³Òú‰Ã1 ¯íC&~Æ®’gKêëʝ^Ëùbtµ v—lTi:XüVZµxòº¤¶~æjð:•£yùàÛ^ߓÛNQ•ØŸ`â.­tf&ê<|…Ïà0pÿWÀÝ!öÓ~S½‡?œ?šÙõ=.ÅÙèÂn«óӗ¶ezþdÕ$؎JÀ?ñ9‡³i»Ë[†óSùŽZ÷Dõ«Zû -ÿ…m¨íœ¹½ÒØoâEnEZéh‘l¤Å'˜ÚÂýfgñå⽝°¯þðà¯“é» ~ƒƒö›‡ã÷óùàüéËo{~²ÇՃ‡ö,~[r£§Ó›Û©] OFc;d|îôz0šô\vž¦¾Íá ðóh>²Ç1"­Aòr1¾i…äÑ`>V0̦oÊ6($þ4~6óÖXø°d˜.^”é=/ñW×ÐS£×ÂJBáƒÇåUï»ÞWè}áBÉ໾¼gåƒÞƒçƒÙ¢v”§ÓÉår´h6Àí¨`ì­(¾6€.Pæ/¨o×WwïßD?ó5÷ɀ“ÎäèûËrÔÅþÑ»mef†¦+$æ.!YFüÛ¼üþm9yvyقðŸšZpr'¹ÆXã4‡!ûÁdÂ]„›Z -ðVÇKróB ‘·5Å\m'Ø£qiϱG1Ä·Ç֋ÆPl”}æû_Ëá:ã~D5•—c`–¥'«3ìRÏ<Ÿ]]ÍËÅ·8/Q|óÃx¼Dmk:뗿B‰%w¸Á¥)DF+QLËÙÛr6^Ê +çþ©wf {òýÕUùƾãÁ«ÑbOþͳåbn5Â(@ìñh~;¼w_¿ýä|ž·˜ûÁÑ퇉ëTcvt¼»ëÓnŸdrž¿Éˆv8ÇÞ}Xg÷u„­Î©ž0RLJÕËÑÍí8V^Ésù‰•Ê -‘FÚÙÞëò¹Ý…‹FÝ3Ü=4€w'}wÒw'}wÒï£Ý}«NèD€F"æ¼}âC¬þèxx{§ÓÙÄòúrt|?|SNzƒ‹™E\Nâ“bû䈾PF:ç]ïŽ_ηl†ÎTyïM•B™ÎzöÁ,)?¹ºÛǼ‡QÄJT}öƒ4 ZÉéØY4TîXý{Àöswpƽn?5±%èMÃE0º­?5ÿ))e﯃ɢl~fBæ¯ÉéÌ|±ëÌüryYÑñ²Ž—ÝKyä ¸Qµ -:n´‘=–v$?•ÓÉlp}S‰“òØ&d*™¸+¬D&³Âg߆lÌÌH¸£)8á×Ò2…xi™©©IÉ‹¥Ý…L’fWۗ™ÌS‰éÖ")0ÓʄWÆ£ €Pª"ÝB(q_ •¦)Ü¢aה1™ÈýRR–@¨†L€YŸ¶Pê#ßGeyŠë¦¯%^âM£˜ñ ˨D‡ØF·JbÝK -å™R¹À ¤Ȩì€%˜ ²Q³…2úc’å“ ïn{ªÔ(Œš6 -/ô†*Žã÷•[q–îYª3ä÷»)·Pú“.ÀO,¸Ø:ÑåÞ. “ª¼€E¢%PýÖtç\Š)²Ô]†© `ß楓õґ¦[;­×ŽÖy'Ÿ„ˆp·p )ÔaÇrÂÎNµqÝdǽn>˲é,g¢þü/VAîò :cÞÇqLàrªÍ‚€ì×‡cLˆÒ2íõÚ=QXy´¯ŠäË˂HDZ ÂœÒÉæE‘éãcû¹U¨S Ö{n¾y6^ÃPN¯gӛã䓇‚¶=/t‡¹}Ãc›Mïõ\ÊÛÑd^Ž?,Ö²š±Û{ð·Éh8½,[^¾hQ‚qK¼DjQành/?xúìâß_؟ÿÔ[ЮÙyçhÂmOø#b-rU<œ¼ÌÆ{/`Mʹs`?ÙyÂ5仢ðøãòÖîäù³Iþöó`6 -5Ž+½(Çؘ¯¦•ßè=°rïê1óÏ'ìÕ§Dóð×"}nÕã î²ZgV&Ã& -cRÁô ú¨7ׯ~ضáLžåûm·Ïh_t»×`C¶öõG A|~5¸ìqðz› D*iòï“Å-ÒBӞ¹n¥ÌáŸ^Í-¶Ow˜ío·Ü²‚U*óôX ÙŸåȐè×ü,GÆq&8´WÅ P¹¬+Tž$ÛK•»²Ýǘí WÊËw‹èÓ-"Åܽ\Cæn²¶ŽhþUþÙ¦ÿ‹7½^—–³L@ü,ÿr oGhê,è;ì_Ì+”Køþt<}÷QôÉê>ú_Jeûè”ãÉe՚t1^zµ -’By;~» ·º -åCLðóáØõŒ¯cXÎËç/ÏQEJ* Ü÷¾ÿõv`™ê£òj:+{?[ ü€4…ƒáÉãÁëùðJÓuñ¿¾Ï|øñlzÛ{y=¸üxŒ¸ºyšæ{f5œÏoeóÝõtö›cÊlê¸ÌÞT½-g‹*7¼Œ˜?v̽cÿ›å­»~.ÿ±³bN¯bÅ9ý(ž¶Ú!‹ÞÆ¢:XôûÉeTtw!Óçƒqiw Æó‹æýþæߞæórvc÷X9ùÇ·H_~ÒUøêχuT‚Ô¤ßÿƒ~n±e€w¼ØÍΘë+|}óâé£Þ‹é‚_‘¤nùÄR#tÞ#͕›?-ÇÜ>•YŠɠ܆†³ßÿkÂ-È -wZ_H£\’F)4-5¾BÁÍÚ]`}Íða1–îìE†]zÌÒRëéŸen1«4šÈ̶V8éiž¹Dã$nP0¾âÎVQZØÓ?I%æ~~¤á*oÆ]šˆ¤iæ¸aŽ×£cN—Ò!0oŽY?gãhOpK “â& -|V S`ª.Dî8¾²ç®©"/0š† -skǀ` Q8^RØêO¬\Ì©Tnwd:A̹Nìg<]RàáàRtfûs§rpá¹1Ke%6œ½T[6‡«²Û”ìîaÀ©åšX™=Xº(D¢Š2—„hÑ;2Û]!q£Zꃱ~Çڍ‘¹R8"ë,sÌ3³‡Yêvi&pߦVžD&©Ç‚6]âã’b¤±BFM[Í»…PŠÿcdòH̯w­>PAö—ÑÍ „¶ìDâV~6^.˲ÁãÜ4 üÑ5"{9µ/˜5@ånDôt:¾tQ4;QqS‡lsP{„ƒ×]KÿÔ¶+VŸóméxüæél°œ/–W`‘½ç¯[*fî@Ž“Ò8†¦)rx«yy†]|.8D;Qó8=,> «:’4ÒB;V§\¼å È6ŒU­p‡ÿ“Ð"‹ÞfÂq‘•áe¬ê§¶=¨1Tϲ8×=E½Zýàñf¸™AGÈ"Vlù9Š.FOI–!>iÏt<,5ÿ¿"À¿À%/³ò…ÆãØTaâIf¼|A[ý@¸%r`T¹ì¿;HËÌq¼:Ë{µÇ’q§ºm2Â¥•ãÒlF­—VµD^-­b˜:!ËξSf2êØêBš¹3%—,ð/{t¥ØC²_†ŒòêvÎÿ§Å’h”0à8°ÿ+צpW?…ëÏ -òYêU.êÑê–5Ô³`iËXܯª–(i˜jûo؂//®³‹xú%nY¾¦$PR±"A¿¨H©bI_F¦=E’Œ, ¸aP¬ò²@F†tHyé8¡ ł,’ÚìPK–T©ò–’Ê´15ʴ뉛Ö¦Wz,®óA!µ¢9,Æ¥â®Ø½š¹œ%3Hït⩻ԝr=«=‘¸z³°Í¤åšÌœ€ Dš¥^x¤´ÑHÌ%úäEXr‚ð=ìolekwƒÐÙh¾¨Ú"×-çۃ¾ª«T³–\òUÈÇû*¾¤hݦèz´çýH"‰ïPTÿäz?/®Æ¿ÿ§Æùô­»ïÕà⬴-Êû)@Ë_å j?™¾YÎø|zû·Ûz,൸œ¾›0àQ ±+Wåøòè8*Z'•‡ŸÑ³ƒÅòfŽMéé'£1ëÅK$ÔË¥m>ñ·Y]Žo³^iõýhòf°¼š¿¼v¿?öRœ¼zøòÕ÷ðmóÕñÐã%T]ývíÒBO®-¤÷‹çñt¸´³¼°ýà}‹5|]¹ûñÁ/?žý4½,7üü]ï›_oÆÛàÄ.¸Ùèb¹à»<œÍŸÍGzKÔÎ -‚Vê*'¾¹øégøgî¬üæÿÌÏßfóçqÛ·ƒñ’Ãó !˜Ê·ó½™W¿=©&ÓIلJã©]ñ—ÈDMÿx¼M.m‡E“AÚ5ó²\ü„£i0иùÇ\N±(ÍH1‚kcíŒ&3}ç ¡=SøÓÛælÚƂ‡q­‚8½9ö÷I—èŸæðôÂj÷aó•ú9öÍK¸ä°ús¿¶òüêݬï#àäs¸ûÞ֢̽ŸçÇ -mö»Ñ%¤76˜wßò ¸·bçȬùúºwá¦1¶“¤;÷¾Ñ¸ÞȐ4X¤Ú9ª_›1 Ç©mÏÅta勳òjñl6²êl£á­?t0¢òȗÓålX>‚ðÝÐ%ìwý¸)ƒK+d}„ÎܙÿçÒ[J­¹¨5‚8êôѸ,/a-þ!§ìÜÓÙôöᬸñºcuOfàÆÿóéh²À}ób9.g•2ˆ1ûGŠµƒûŸX|â\püjÒw¤mòIñüá >>dïþ ½xQŽ_M_¸¸=ŸÎGÐyüYr§’æ‰UFñÃüálq1Ì.—Wƒå¸ªÓdP$$Qu•’ŠÏˆÛÁåe ™{Ñ –\¯Âæ·ÓÅ*l0ɈÛ]ގúÄ·)@yêCs]ÿ~è=\.¦½ƒù¢œ~+W±>üÁÏ´¢zo&Óá›érÑ{=›.o··ͧãÁ¢ì]@,¥ëWZ½ÛÁm9ëÍG7ËqHùûš <{¶ãS까,fƒÉüv`7Üð½í×èÒâãq©e¾[OÚÞ-·}=+yWïlìlú R•+nJ–×ÓÁäí`þ2KT¦òù¬œ—³·eÌÛ½ï/G‹ÁÅhLÊÓr<þþ×E…‰c÷7?‚Qí8;/ƒÑ7‡ŠH:5ù«ém¥ÿ€«š£x„rOKšY,€ª–ZJf…iHI8åZ2œY?L.Ë__–Ãéä²åCOF³ù®áBÙ2c›žã!}èD3¢½ç™1¬Os–‰†Óì‘šYŽyPÒ»bæqKܼ^·àbâã.0ÁÊ3ä 'oí[-;¼Ø.ë8]üÌp<ºµüŒl¿ZþùÚ²y˜™HrcE©uÃAU”YŽÿ2XXÞs6ÆÀç±`Ck;²röÃãJÛø÷W`ë‚WWºŸô“HV|óð‡'Ëñ˜¸žÏ«±¿G•Yšmc0O£Cg+'zT’Õ¶}Á‡S8j>» á£ÍÖÆOÃ2TÎÙÖàZë|cW~•ï,5­»ˆ–QóM›•„ÉtG6‘sgÛ&äĆUrÊ 8_ E¦U°™+Å«ÃäE.¶´}TџM¯Fãò¯åû­x©=DçëŠV¥Ù߯­F¾Ž2ˆÝ•Ö/—v±>™Úãøp¸ðÄwÐ>dS®kٖ¡7göÜ&Åù‡Çt¬ýۏååhyÉöÿˆÎ8X=«ÍnS6ªT_`5Õý4^Fˆñ$‚S/¼¨HkmŸùÕórãZ«4{Y,Ã`§Ð<øÙ /V…—JÛg«Ñnb‰Þ÷Ï_¶ ´ÞE.‡³!½\ãÝ«¶Û@1ר!É<ÆUš‰Ø01™1³7š Dæ ZY¯f)Z?Þÿ>½èßZEsfÎՎ­µƒWÆãÍæoF·v oV˜Äj»Y Õ*KèâlGÓát<ŠE’¿úÙÚ ‹ž‰¼Þæÿ—éÅ“«i/kwQøqj9è?¶†["ꪡq­ûóŸél}8 -&äÁsþÈRÛä¡ÛËûóxÒ¼_·—ÍÑ»ˆ‰ðHÝz¸½ùv[:|èØ+LŸËS®69ø675¬¸òŠ~¶ãèÆnªþ؊#$Yô‹S2ô˜ÜìD=‹:’'¦oÒííß‡¦âñr6¼î½š•£ Ëi-¥F“Ö{Ø6C€lRáÆë/®’ss« --· ›Æ²çt«íÖ6CÛìvsYÎG¯'±ùWnãÞYµ'¶D¦IÃÁüb´¸Ü6çxՉYûxÖ¿ ’é¦&Ãéê~€1ۀ )F–׉×g²¶ùì²o…mHºhº©å•=­¹B Ê«µÍn½/dëÂÀ¿îo_Œ¾ŎEbåj³9ètŒmg÷;F:ގ‡ï·°1×h8Y3á­6ZX©<ögl¥²ñà¶9|Ãm¸}}ó¦_NÀÔ³•]C³9WÙ¹–±½ãïÑfiòÝ ¨ŒCkÀêX"´µ„·FUßù P¢v5Φ·»Ú€œ5²2Ä®v`ãê@Û÷Š{/¨œƒÙšE°~–GƇRƒÖ‹x\»LJRýyÍ¡ÜÉ|¥' Z‡ž4h÷¤ng]MýËñŽèÝή¦“­ìÚÍ­ÒɖŒºÙšÛásK­Ð2ï_Œ@šÜ6éóþ¤|=ˆ<âZ ×4ë í¹4فm,†¨þ³©¦~1ÌûóëçËmԂVåì\7ë ™êìDþI&‰þ_ßîÐo¬Tˎuâ¨m -]ÅkU׈œVÛ÷Û4ô¨åtq½SCwâjݞÙufT“œ½Ò¾–VÐ/çåãé ¡õŠýCz2Víc³ Îùç£_Ëñór¥ábB¾gûzJeŸ¡rœ‹Ø1àž:cÒÙ{ -Ã֞ª¾ËZ¿Ì=Öàmû(xª­ùB&ƒÝm®§ïþ2º\·Ž«ï¾LøÝmƒ‰j,žÄ•ê>†ýÅRF?üäœVؖMÓ M_Í··»Z -h‰Þ„GA´ÛÐl˦Ãm]ÐÝh«}ŽÚ>Ì//ÀÓȦƒQ9ïÙcç²g×](jùÎ|QZRO^—“ÞE9ºé½¼Å8ºÙ¤g,g½x"[Ž.µyϾåäñô Îo -,¾+'—ÅK‹Ü¾`^ö¾Qÿ±gç_{Ïüö÷ÿ„ÝÑ$~IÏÎ.Âàõ7vžŸ.–¾ž nnzïìÓ¿õ{ú½&Qß·½†lrL5½ùýÿ@ÖïÄá€ÿÛ^½þý¿Æ‹Ñë’zi;4ÿí]9|ƒ \W–“‹ò=G جº%a_?œnw±ÍÊü½Ø!߆EäÄÀ‡³m*$µþÿ»û®ìÖufÍ÷³–æ°%Ëʁ¤rŽT–eåd+˒­|ÿû¿ô zýÒéÑô03ERTØ}{õÚgùH"ˆ -…BU¡> 6_ÂDHEgBЌ$__/ÞPt’˜¢ï@¯ä•ý$¦hã°úá·X†ˆÍŒ¨ªnm‰sO$íÎÛr;dÛE¥‹ÁœŠß½ÇÕÎûv³bƒÒ-ÓÚòöw;…ðt°Ôýë—Âc].J§WzÞ쁹u@bSã•a·š«á1ÝþüïT„r xyñúΨ¤UÀª>öˀÞÿ×ö°N^3˜7ÁÒùoÞ$½+®ìâ¨Ïï“ö,ÊýÎђîâŠM SD6…‘‹á¹Ë¼ÉáVì)l-×Î< F'&[Ö}åÙ4b>«I½¼Ça76#‚Újä-öÞkCǓ>ë9åíö!W™ -vÅ¿*xÊ7 -žæÁR{Z-V¬}›¨_…„,N5‚Ñ®\»·ª‰"3\*TbbzØNÆ'`=Ì÷é#nÑSî¨H%\ôô¦¾XN˜&x®Šv¼QäÝ«ÕÚ¼ˆTŒo“ˆ3I®éiiM§¸*ri ( D )uýG¼nçȉlˆÂïòö4ų  †ËÀ¼l|&¿ãÕæ¨BM‰V7Ûd¨˜ñ¦h¯Q;ÉÐãåè©×ìþ÷›ê}hžÙ ,”±:7Mü†`å»Ow^Ùg›¨íù-ÊRRÞCÀkNg¨Å*Åú¨Œ'œ\1^p¢žÊçýžôö=uÇ*†¾5܎C㎭à2TìÉø!ûó\þj ­ÍdL­ÆŽ£ÞÛ̑ޗ`¼™–ݱ`éÃXŽÎS_†$ÊþWÜí~Á°cú;½´aúxhà°ÄöÝ1~,N@&*iL©Â)¹ÌUKñ°{^O­"ÑiÚá0./h•f]@Зμ}½ì)ýý™t÷ì¶Ä϶tLäë§/kÔûrΤÝúvò{cl2éV˜HÖ¦÷¾Vµÿ‘h¤-yªürÁÏxxùŒŽkÚözΘ²³ ƒø•qO/>Û¾ä&¾éɯSêË×ÃÒS¼´‡cÆ6Uhô15X¶à“aŸÎÏòÚ¤Ýÿ­OÔí/¿T#:ãِ |›¬Sr꩚R_îa(œxu¬É7ÛÈO›™Ôül‰¶ -/_¡ét¼†ŸVVrQú¢Hã˜sì;¬ô£àjP˜%7¯1£ý`ý8'JuÃvÀ¾\€Œ7ÔúŒ'~§Æk¤rú~>"+ŸÏy\¸‡i·®ƒ8[å4]8¶ç|ƹ¯íÂfÁUÊ9ƒŒ—#&»mžÜøÞ¨>tK¯ñT>üÒ&m¹&à¦H –š»Ñom2=Dì:&æöö¼ßÓD#ýmM/œÅ=9õIï¤Y ¼¿vš‰J*ùž^ÔWûøþ3¸d’încH1´çõÈ!nm%ݝD%“þnS«o¯3´øy]fR xù|µÙ–#è¯ïŠ‰JÉR̤ͳ"ņ×Ô€"pÚ9ªÖXk¼§ºõúÇñPã¤K4 -§óeçDÌåq‚ŒÎAËTU3¨’‚ÉÐdoöº$FáXË|Ä]H£p& dÄb³&·x¼„Ìå.3”øľŽgÄ'Ø>« -¥lbXÀ‘Ü„­»Ð(cZ ,Üèfý LµDÈ﹘gL†9õå­­Ikɑáä̃î)›:9ƒ‚³ëÇ:÷bN-¿È£/4m־яÃ{nÓT®Ë’vÛ$ 5,õ¼˜dòÌ -”M4N–ºk©ö¢¢¼rÙ®o&I`DÖ]¾ŸÓ{Æü¾ eҞafGðì3®k _ÓE†L{|I¯½ÒBºÇçZ6D5íí,ÉïÓì'¹ùmm¯ŽÔQ´²ìHÛöÈì¾~¢¶ø2‚×> I¯µôE«NszaÌyA{·_”J$[£Ñ…âgՉ/#¨ïGé‰û«h¾NÂr†D­Ñßø¿7ö0ÒnܺÉp¶,œ\›v«L8‹›xª¾W³Œùlk OuãØäLš"û6·òˆžB6|KÐÀyý¢€d å  ¿§/ž$~ÞôõQ!E? $Fñp.åEF- J†$Þ;õsÃÍ=E…¡N¿üÄÓ 2þDµU±Jê×ç+Ž_°Âºʦ]ü™%±">K`…n$@}¢˜c5ðiÌ<€ŸàH½„~.œ: "| ê0u¢¼—¨¯ø8Î|…d¸zê5øÀx§ÿàß)T„"óf -€—èvôc‚ÚÂUAKúQþSÓÒÿ!™nÂæðªš%)2\w™RT•ëYú¢m\˩Ρn¯æd~·§/3¦Ÿ²LC´hêˆ_¨^†û…S%L½YX÷üŠPåfo…aè5ÇD¿Ð3¾A2tEã$¿ÏøŽä—çF„eÅ>V"„cΓ†i4ƒ:ñ›FõbH{Ú#xÂ&Ò" ¶mtsø<¿`8Õ: ¥þâ+‚Ɔs®7‰ª -}ex­HF<=(>°¢½±¿Ñdm–!ƒZ‚ÑgfxÀÍ®mHZØÚhN ¹I*H‚˜^W"‚¯ˆ °±‡™Þ°º”œ£œÎ[ž”°¯Á&–f‡:7o)2REù¬ðUê7‘àƒÆ–æé3¤Kž`ÅSõ4‰6â ä&¯0ê ˜¼¬@KµòšðrdXF"}À©]FðÈ N3Ò -ôChkZVñ77ÎÀ¿Xüu)ø«ò²”•»ÁŒÖâøÂ擠Ÿ1+ìz@ØIéu¼ýÒ\¦Vƒaœœ®÷jÍäÙ.žÓ»¼Å·q¬m7ʒ^ÚÍ1ÊÖ|ϛ?¸ÅTàça/ñ–ÑH}k½t±¸Oò»”εßt%^&ÀûÁ/ÈX‘Ë|Ã6ð}”Ùr¨§N¹à֎œÚΤ×FØy.+žœ,Ós ™ã™rÂ9À1¡­¾…×]¾ÅübèX6™íBªPAÇ ^³oåÚG6ÌOóˆ Gp³St»G„ ¨[¢›="huÂþQ»Àó¬9ÏÈ¿qrô84_×´9Ö)$‘å,d]•Ð›¡ÌÁç;4"oIÚ_phϸq¹èx“^# `ž$«ñ¾%Y}ýh¸÷ŽU<%mñƒ®ËXÌ67 TW8V¶Ù/X®j™ÌЬý‚ÝuÅÓÁo¼]µ‚_Öú -,ˆo$î<]}BÉÙӅƒe$Z €FkÉ(U”É‚Úrj¦1áMè%Q0á"}9“]\ü“›ÉRӘ×8º]¤VǕ7½°÷-FîS¨>AHUE”WoU sf»ðlª¸AE‚¸_û–1wßO‰bŸ±:R|›¥g?#…&]zaŒaéTî…b©}«:¨@µfµ#žà|d˜Ó¬Ê½;“G õÖ9[$øÖô’ÃÁkŸ -¦,µñ}r`b—°/Vú€öê_3y¸-ɉ³·Z6H÷Qè€^ÂKK Uå][Ì®¨/ì"çä 2‹%uÏÂLN­ØGÂm -T6lû)û€¦ïz‰‡cMC:ÿ³ê'=­Ž#Qµ¼/µ†5“}Í~ú’k|v@Ö œž”C-0g:ß/Y RC¥€®×¥šïoôõÌðÅÐM/˒¿Þ–.˜Ì&Îä¡m‹åëΛÕ1  -ôõ/¾ÙDSuƒeµv$­ÞÁñÚ “ƒxK:±¤K`˜—Z穀©%= ‡{@‰€Q‹åûÙ0]»ä¢xqù{±®ŒÕ2°õl‰Lº›³HuNPÎc }nû\f‘”jY|oÓPETQh>0¯QgoéE`ä${ó“AÄÒÀ÷ÁضÀ ›Ø~U,"y¶F¿|pÍ͊åybx]RRX'ÈF¨!{r˜^TEJeЍ͡e-•ø\fRñe-§àùDÀ¹NˆJÑE–ïx«‘gÂé¯9@/¿èâÁö|÷ïC^ˆT@†$Ì4d@–Þ¿Dݕí+eÿq-µ„³›ò5êËæâû^¨ËÒгò·ª@F¾ ñÖ¢qæUõÎiGmfß¾×<Ëüixu™ß½%ÄÎÛ}‚(%Àb(ØXäŒç×|0bØMô4Gr•s:78Ó¶I† ›õ¯M ‘Ý}ò§õ\ -MUV´u/¹á& ñܯÀ€k8ÑzÓ8[üð¦bþø9ʾf´ÅøáepJ/¶‡„ÜÀ:º4ÃM§N&µˆ¹.§Ñ§Ƅ  4½2úÎ÷ -#<ë¯t6ú:vGÀKE„§­Þ‘­7”1ågmè€~@mÑIÏÃèHœ­b…鲘Ì~Ï!Ô–RöÍ<éÞxlGw/üIÉXGàÓÌÉ«;ÚzÞhÓM&<öbª \LAídˆ”4©EJ—)ý’SÏ/ mw˜%øeLøêå ‡î{b›X\¨H°¾èG@¸¬ÃŒ*l,[]ýD£aÐ -¦lr{ûWF§ f»)€Àœnü&0"–©ùaä´{ð¤ã¹Ýž)lÛBƒÏKIU¶ß ½MdwX#…^A°Àµè3¹ñÅõÈÝ w[½pÛÃg9CýQ ÚáÛa~À¢œ3cÉÍf7;ûìb·¾™õ|BN°°‘oiÓUz©‰Íx7L^àN–¨mK§´­²Ÿ1VÔúÌ.·è 2Ðä §:ï'ðx´‡ é¯åD«ŒoŸ«•OZü ÀËÿö -í$‘iPJœtˆ$‡¿Þ°ÖF¨MZ+F+àáÀ.µ˜0å¢e0)‹z@:ãP$ÝFLÛdÌ|+]\[]a‚ ½O½‘µÊD½§0Q—"¦ª¹ ƒ)Àys®^‚aÚæeJe†§hMï&îë,Ʉ?{<Á]z{ÆT°·Rxóçš ? ×53ŸttÿCۘ±é\ ÐPžþÉnÉ[)îUÇ9` n±Ðâd+ϘO¡-9õš=ɲټòýæ«V. ™ÆA9cR­ï‘ö®™t·]vž¬¶e¢‘>Z¼ûâ8n´ ¸`a\H­Å M‚ëHúsÕ}AÞëù²¡Xƒ~äêpUS_ñ™=ß¤Ú"[#ª/S1éO¼÷l[ÔZÒaS+è«zÈIƒôpjR@ºŠÜ …»™ˆJ/€b0(±é~¨Ó˜ M¾m‰ß˜ö=32}pR|¤ ÚÆk ]ùpÊWr5o°Óœ€ÞÌ3´ ŽÖl -@3¨þÃ.ÌOó_>U¥DyC+Y¶À´ÚÀ\jÉi4g‡š†>Ð$ûúÀ²} ËÁ¨¾c€Â_Ólå‹jX¼!úSA0Ÿ#D l ¼Jžwz¿/Ք˜m's„—jmËñdO<ØRÅǎñëà%G^CËIey®~כãÉ1åëgúßÿó¿ÿ¯ÿ¡œ4I¿vœ‡½x™ÿ]ÿ—ôñ—¼¶êãÿ˜—Ï›Ój·™'.eºluHÃ^¾(ºÑR£®úƒGæ¡æ”kÉÿI:kÒõŒ|ÖXkâĜֲÝû:¹à'®]ìƒ*û =¹bSVÙuî¥Cÿ(Ê>%¬‘š÷Kk²ÍZ{é?­ÈZ»ÓèÓZ§ŽºÖüÖÝjÍ®ìÃU -h­Ñ¬Öà>ºôUDß«Œ¢XnTˆÁÖù)«y~HžIk¹ÔNóÚ:ó4½v8ž\`ÔÈF þk'絸ó¸ ?ßˁt/û -Åp¿#iþ1ÔSŸùMšì¬c^¿mÊ\¥©ÞÐ9߁ý3î{­íë;»z8œõa7ëZSîhƒ_»tç"»W®sѝ9¼-/üÐÝג‚S]ÚScSß]”ÎSGæ·A˜]=63à¨#Žñ‡ãÒHûÏ4_‰c™©×ŸuµC/ ð5»ïvӐ ÝûÒñp{‡ÏÐ{sºë&þ` ªYüÃÝù*Ù$©~.“9Yª0—øvj9ÂBª“ÃÀimKS}Kš_š»MIŠêñeàMrTa^@8­ú~[ÒTÝæŽ54­”¥¨Σ Éò֎¤¨¢ø Ët×û¢÷‡ªÝ,ÓHV%ûªË삯•U¹†¨2"ÂXöe[’¥j,”Üe97S¢©šET0Bº¶ëÕs2‚7Ýۋ¡ ê£4Õw£Q4´î†/»ATÁ¬šBªŸ‡ÏÖ¤†¨"I TpèiΖNIª{ãM–ªÏ¹¨¥¨2‡CXk>ƒÖ£Twþw߀ã ªGc´‹ËPõ|™ÉyQ…ûpâîºÍŸÖpè§&IU—{^öÞsYŠ*–)V“RT4´¯¿'&Ídwwˆe¶†4Õ¬>b(Í¿š’T³U QEÊæ‚É9ƒ]ëø¢¨’ë ŸjXg>ã6ÄaËÕÜðdz·ì0@Õ·ã¨2ª+åß>éîví&‘û<GOšª»—ÄJ?UŸ4Õ¼îì/u§~8=…„)ª•Í<'KµèØïl2TûV¬^ڟET!ŠpÑ5(e21­$ÕF~•—¥Z/{#9ªi¬… ŒdwKö—Ælh IRm "GYª-Ó|¸QEdhÂe¬m%e¨’ÖvÜHIRíÙYªßºF)I-kRÝýðbŸã‘Ušê[sµ¾¾Ù$©¡ˆ*E†&¼ÇLK9ªelD–ÒÒT3M\×9UóRT‡7;tRh—Y4y¬ 風Žu§¬`òhƒ‡³+…Aª¶ ª•ˆi? ;q@5r@Tá²Æ¶·]Mu°ˆ¨¾.ú:jy'’]Е‹0ëξ8W‘‰Ì%yôWƒï¥ÐÆÈ»ZS $´Óø„=_ÐÚJSuw;òTu™™S–*r£€+ÄSú|ªÀê®ÐXŽêHjÖÚi3ƒá…#Œ|–ªKÄd脪ٍ€Ã:Ÿª»®ç¨Âõæ<¼î -©"ß@†ª÷úÒTÝ]Þ¸Òæ ^ÀäB–*ò d©Bß`&E­žîî\¶»`á®vä©BCC–ÃÐÊòì4qw«Cû´ÑôÑ'Z܃*˅(;ízQ÷GI]9ó;UŽÒDÉËSLŒ7‰3gà’û).˜ƒŒ;JÏ0Ìåæ~·5qû§Ï÷é) -²v'–Ya5^Ä.únØÂBS½G3ˆG¿ày}Eà¶ùÖ1¨Thu‚¥¡{˜A¥DÁªh Û|_ ¯ôŸq‡gMÓ16fƒÂý4N~³\‡y(Øè(ùJÿ±•·ƒ(«^}r˜ðÏú¤ókž~…€XÆ°¼À’j*Åq›l¤úC³— - V)OÚpVÁxô‡î!ò½%{ø®•ê!$#è$úS“FÞº|m ‡g Óvߎ–4q'‘h±#-Ã/Õc²ÂÞÜÆ/…Úl²UA¸.ö|™Ïvwjå‹.Žiù¸®{÷eYÏ臹)³žaš¿„Zȱ½ÐB]ÛN@í¿`p™ë#BŽdyu°h!³ɦìôìÚNÊ-Bªý¡Ù'µ=ÙG~´´RJ\qzR®Dçbx±tSçP¸[$]û‹ -vców‡ÚŠdsöý‡ë—PÒý2Pý’Ö©›×mµ]’U6@‚„k†KZܳEƒÈ UډC™ƒðf(¿pcóSӉ$G(Д#YÛ䨢6¹ªv¢¨úß]LÀ ±W!ʳè 9åtx6#°lcU¢IF6Æâóœ,Š†”6 £ -ÿÐͧ"ؗz(\½bKšè61 £Ú*Û6l‘rôeºY©JYg¢aºFîýÅ°¬ýeÍ«V A×éåVª+Ö¤P"³bË.S€Ì­ƒ<Ëâc½1w“Q%«Öí5~E&&m"’½@Avõd[tÝփmz‘m§Ô #`éZ¯hm¼\óøÃxÅÖ»a ±ùxØd6½žPÛ÷¼¥Ü0J UÖ&\`ni˜`³˜ªmaÜwžÄ4ÖÚ{ -ÓASïyLi·›™FG˜˜Í)ºy·D²3ÕGò–3×Xfÿ´h™9Œ -¶®ôšƒÛ39eÆ·¾% Ð¥µîYÓ37QŠ·¸Óf™Ñ\æ\úP±„¸Ã:ì·3èÏ°ÆYb ªã r½áԃì¼Q3TÃ+^ ×ƀ’lÌ} ª%„Ø꼋-WÓž'ÜK¯Y§è­€êG´·)È_âÇlì¨Y\(´è;ôÁ˜TOA&üuÚçñW2"§Iä&Êw^ÖÑüózS³@›N/·«¾¤qs/ÿ4UðGªà¦¸€lOV£2סe£’ñœ¡.òÁ7ó…ÑÁ˜)}Â-ÉïÌzxü"8Á¬7W<#×xDُ½ -)E‹ôu~©œì²nëFA~Ý8Ùü¢ ú ‡h¦S«çOA8Ùeœó«±(—>¨Ó© -¦(~ - -® R W"˜éˆÂµ`Êõ@.èNM(N ïˆ¨ü\±V£¬"B/’«’KØc‰ -€L (½PÝ%ñ*+$¢’,âz`¨ -g¡‚¿#HÈ@Þxn —ÈÄv -²± æ”¨ $!4³cÁ÷“ÈÌvŚ¯’ñGT=­¡¯XÚ §wÅ;clœFµW–y+YȾ¢h]P·.»"g%?0ob͈ùAqßÑjÈì{ÞƆöºV¸Jv ‘Q’x(AîGUA‘"#\ïãhå2†Ò¢ÅOÆ̅ ®|W×%ÆÌeì4áâg¤_Œ¼M]ð)~3ý\ïµäì‡:õ‡w7PÜ^´üIm¯ª oÁÚ$¢´R!Zžã!¥µ©…JÎüQ‘…#g6ÉÖ"Ø)¼^‘åÎæðwØQEÖ§ôË&ªE ¡o©È~ÓBÈå§I×æx`Yåí2Ò¶€ùÒíì4ž¶=Ñ¡ì4¡gv÷ò&³k¤¸S(Ë͙pÞd˜" }éÇsÚ ¸6³H»ß‚Û›´›|0¥Ó|†vk]n}«¶ï%kSÔn¸À5íÖÚީ݄Ós~\»Öp__¬”îÒ— ך#å@©Q'כãxÂ..ªH8ƒ[7_[kÉ™H˜pЬ -~6Ò)e¸pV'3e Sd猁ßÔ †ªŒ®x–—ÝÈVi±uZR—¼¿Mé¶nÒ¸´Uº­Û*.gu -´Z§[ÖlA#'L˜’W6W+RaøËւVO¶¢G³*¨Z$Ün©ü«]ËÀ»´×e¶"¨Ú rs‹#eÙd­âõq¬+©ðy®ûޝ6Zu -¡ ¦"øEé4ë#¨M¥õ=r k{Øú‡›ªâàÌ}ËÚXW~β*Rc×^oÎ3’“PEj"{ȍºV®b}T^9eƒë쏬‹cÐdãGŽLÐt£“!“h˜-éŸDS›¿z -R³¸Ô9û4LÞep“šžW¶ð€/qg[bÕöÀ<5L4ÉUdw+0Í«v4Õ)ë2m©wgeÔt‡ -tµd"{¢6IŠ#Ð*æ™h¥"’®]´L]$c¨ˆCË®T]%7N:5N).Úö%Á¾m’A¦-RŽ+ΓÚl,X•ä>«lnÙþµ©–eLëê ·Ør‰Ž.%Ðïªc˜2Ó~rTÊô­@[€“ ÍRŒ&ËO2þ"½ãO/x¨Mf()Õô8 Ü^´ò•Ý´ÆÃôËìLfúø ӈ¾“", ó8Ÿ2–O#Zº ׌åƒÛDOó)cù™çÀù”±|tñn8Ÿ2–’y -œO˧¹€.Þ çSÆòià 0πóIP­Š ‹Ï€ó)—CdžçSÆò à|—(>–³Ó®Âù„ Ð -<‰ š+™÷ò`¤ýMm’ƒf]Ë/oU¶Ö¼Ð“¾;ñ¶ŸÆâ6Ý ~7ޔ¿®°SØO R÷³êæs™Ê&pÊ@iªRþ„;… -µ]ËòºÚCÚ¸UâSÝC)ÍՌ*WÅm’EE@4à•@—B›Äà=:¤z~OÚ\´‘ö¤ïƒqUÄ~¹l~ £äRLÈçlðQipòáðèÜNjlçø颳0µ÷6ý5!Îj=c6©O÷:Ö %S5o½jXL¡:D¥Š [¢n -ì4Q¬ME¬Á6aD% CŠ Œ{7½fY…¥îŒFy²x4ÿ隍q ¦pp¾ð"œ¼Yñ&¡$¦ÐqÉcäæ² y3[:xŸUʼ¯ÔD˜Qå1T‘y¯Sxå0ÍM˜BQÔS½D0LÖvásKÃ.v<ªíú1·Ô&¿÷qӈç1Íõ ӄñbêÀKAÕ2Çò9@™*37' %Íy´ÞÜ -ݻв0ºG#ÄDó¿:ϗ9ePè^ñO±+󜳫¥*@dN1Ã#u 0¦xŽ “£µwç(Im¬(8E²`»+óV󏎨DȱmE\CìZTìÁ.¹e»Äd© -0%)}#u?Ë“2×)[€³0e,¦78ľπRÀêI* yXÖ¥Ýq¯öW1÷¹‰OihyV©ž·ÊP±‹ä¤ûY%Úȁ†û©‘ƒë=™6iÄ8éü­Ñ¥6±"¥rYS`•ªèÍõ”x5ð<…6]œ29‰£7õŒèÍ<0ãát1—>hÒ+Goø;…Ê^Eá‘è8.ðSx8z:ç6)¤Œ¨ÇÃݽÑHA 燣7 ÇÛOEÕoà -ªÞÈï@¬ @H=:p.k÷„$ iç¥!½+"CúJ®ºCº¨"u^s!¬¾^SWý&lçŠ5}Ƈ#@4Îï2KW´H«ÂÙoOûXoŠ*“!®BüÉoí6ˆß-W&BüÔ Z•!~Ü¢Çetݛvq~òçkñZn&‹ÒÂ4ŠsåÁoW$­|"_6ééqd“gópڞ22ïÊ.yri×OFæ=˜ «™w5ö9ÈVµ×« -Bª<ÃÚNWì#õ–MW|„ò-;\o88Š= ¥“‡¡bwŠÖ@™ë¨kQ›DØȉ?¤*µ\pÞuA"APp|Mïƒ×¬×µÀŒ*ií~ûPk)†p ¼U>]kkm­A^·ÞÐZ /üô‹¦´öâЃ9;km,F¶k~£™ø”vg!†è”v÷îÄøœàŽFý–M¬vgšèkkô›ùC£öÓevYªX&é­ÈPõ¾°Y`¿ìN둧šÍº,U1" QÀ…µŸ -×ÊUã5UÑz¡M󍣪¹¼§0Þ¶ìä h]%ØÝ“¥ -‚ÌgNì÷ºv¶&rTÇ -T³XPhuŠ±Ë‹,UíNj·)Ça›"ØO—ÉDC §®ÑGŸ˜;þÎ3Uå*/sQ9z#ÿ¢¨®Ѫ¨òp®ùÇ0Â^_˜¨`3nxÝf­±J1çëù½—Æí»áGœŸ/ŽÃÞ .Ú]Íë¼°ÈßéW>‹ú"£K¾YW¯¨QJṸϺ^Oên=Ì 0×cQ²×ëݶ{7êžÎÔP'\*—.ÊTºYïjîà R¥p³žl%÷oà]x×.ZQÛËÓàîf¼ŠŒM&öz³®d£ß0o°EÉý¡ŠUü} 5·ò©ß -ì»?fs°OÊKà‡ížì“Bõ‰lègû¤¢ˆ’óæ1`ŸªOóSØ'ÆWHð¿Ø'…êî>Ø'U•æúa&·ûd2!Ÿ ì“Ú笞ÏöI¡ú.6VöI…d4¢³ížì“ŠÒó]Ü'û¤L.@ü4`Ÿªï"Kõq`ŸÔ:NˆŸ -ì“j“æòàæG}RcÈ-kOöI¡LªÕ#À>‰ªb[à À>eÄÊӀ}72í^`ŸDUÄS™æzi7û¤\0Ƹ}"°OjÑ×P¨ïgû¤* ÓGŸ ì“Úl‘ȼØ'…ê»tqöIÁØÄ+OöI¡ú.כ‡}Rì™êÏöIùˆùû¤P}ò)#°YûˆÁ#ò…Lƒ¥çÕDwxJ¹QjÑWjõcr<÷?©6]19î¹ÅïŠÉ¡ŽUWïˆ*Ã'FÒ¬ú’_Ôo’¡‘‡cK6K¢MWqõ¢¥+÷„{[7·‰IÍºib+µé27CYÙ(°Ê{“þd—5¡ËäÒÖN¡ËT»L—‰Ýò¡<Á²&{ÿßMà9© QžJ{ýæËÿ”” wÿß#C)V|OúNLß3Ž/ܔð(Û%Hæúý_þ§.ùðå|ËFþþ?Ux)¥Ëÿe£|ÿŸêí'°L¼HõšMƒS{ÆcW|RúèÜ3ÐDEUù@J)¦)`ú”3ÕH)u×Õà½:LßµLc:æêµ}ò™!ªáqèƾ+ tê’Ô ƒ|êZÅ}cíÒT—]ù4r§ZÉlÁ¨þø²ËT+ÐT÷•¨²ÚT+ä<-Õ -M𸤞«œ…W˜OØIAµÈœzΉ€ÊŠî[ʼnc°¢§"]‹ÀÏl¯Þ†´§j»ŠöU¼¼^Œöýž›.оßó+»Q\ôLsíxCX›ªû‘3 Xej³¨Rl¼ÅL–›õ_7edžïl*mN+î2e»%:ÎWúQUYÛù(wcšÏ»Ü±)á°ß!mÊB(nÓ­í -ˆi}ØÆ@µ(§ÞRÑŽ1 *zô†oê¦>ñ’7^F$š(ŠŠÛ7‹Mv9ÁoŠ -õÁû‡îýã…¤¯þ»o>ŠïýS¥Ó¿÷OÑT‡<ν ™‡+R†4©sq¾÷]Öä®þ»½_R©¢˜ZtÊ­÷þi®Þ‹{×½ªoÏ~쟂/SD¬ÜˆöÅuWð¹‚ÜÁkh_\wïýòs®|t˜: æ%ôþb7JeE7¿$£¨¢ÇѾm.‰êš·v½"ù³íx);4*âúþ"kçÆ[¹Ä1Ku™µ![MåíJŒS6 ÷*°T*TÑ^•xY»†¥ºD¦M®Dûü,•1ò¥"'QÞ»LOPÛZÅôT¤êˆ\ü‡|ÏáA-JÃÞÀ, zt(,¾7XŒ$«K¥ÎbœE#EüüÜm²3;K .Ëq+î6åP“Ê'>ó^™öœSµ¦= w;9Jnï´lRɐ¦l"s”‰Þ˜~4·`eÎù5‹]ùTfgš˜Þv”úékW¨©½]ìݘmz]ËFR¸,P˜¸%Û&|¡Ð¬·d÷ʨé™Q>CHí.WZ6kK¹Uwê§e·d‡î4ë¦Ä-šåyð¸+™ ìĪ¤J¼qvK…ˆÐÉ«‰ðj€›\jÞ¨g¼êt9ZÙ(5K>¾|ë¼ É§ÑÒ-ºÌê.‰Ã=äō1wz¤Úsv•#·]ÛIÙ¸U ƒL#?ZÊN·ÚMpò9ÛD]»d®Îñ4ò‡PB<âåþ·(EQ%$ñæ èe–*„$^9‚ôzR yníšWC*怩‹§ SQðËÍ¡ ±¿&î*•Í8óDOzâÒ© (ý±®,yP³qãA]€_ -ÿ_Æøh¦)E`Öþø^qLòª‘B-Òr8;I÷ M#¾Çせêü⣪óVÔDõQ \›¤ð7ë€üQ *LuA›è)ëû^\¢XýK`K5â3ºp‰×nýQCÑFþÚ¸ -R-5·Ç©¯íêEB—_¥ÚüK¦]E©ï&§vŸÁ´«W -ÝÄ4dÜŠYl6ò™v$Q-õæ~H¢Z<"“dq'$Q-‘2ï†$ªÅ# -’ao‡$*H¤öÖî‚$ªÅ#JåÜÞI”[jä²î„$ -Xª€Gär9î‚$*¸‡âíUÞjw3$Q¡M<¢Ø“®4¥ûõàe…š›.©»û²B$û—.+”?<ý²B^Îíß¼¬šžßù¿|Y!½!yãŀ7_V(¶{úe…²)Š·±êÚe…µ÷{>tY¡ ü›5—Éqª9×ËÒ·^ƨ½ðð§Z©¸ðPý©V]x¨|Ûá]©½Rޑuυ‡’À'œj%ºðP9„¤‘?Õê¶ eGéÊ©V7^x¨|Û¡Àä¸~¨µü…‡Êé&Â@ת”=éÙÛùëÍC*wN"Êq߅‡l~Êå'*wI.öæ å°ž§à=¯ß{­žÏ¸ðPù¶CÕùȅ‡Ê+e§=áÂC«âm‡~á¡ä‚Ù]lHÞ{ááUВz”Ò…‡Ê{חi w^x(WáÒ÷šê*×ÂtITôðù?ôm‡ -Iä·]xø„#&./<¼áŠB)ìý*ßvÈm¬}Û¡0žöÀ…‡VÅÛùú¡ •³Ç¤–µ».'NpWk¿¹µv§±‘Àiˆû­hõi~"µÖª.Ia­w‰-WÒZö/ ¯ã½ŸíÌjr -•¨·¤ðPj5vâ°_°7ñPI{@”!‰²|ªïpÛrŸZ{äþcε΁^wé?' 39œè+Ԑ&úÓ÷ÜÞș© Mƽ~µ¢¯pl€Åb‡¿Øé%7]Ð'rºÞ0§'%~¶¥c¢Ønb¹I¾“šûE܆ýŽ˜v-Ö´íõœ1åòyܖz°-À{ÖÄgì3ÿÁ2ÂŒ–xó´KÒ¼ÉÍ`Ð^ÌØÌd -2¿Å­¨0 Ëpr 3Ï2v¶¢ʲ¿•œ”íäÌV0>¶ºôÁWhÎuí+>¼Ž™&V­è*G|²Ã!Ÿªv~€XTŒ ÚUUjêMð+†Òði®‚¾ÒõN{}œ¹nÆê,××.ð´aCO ³7È2¦á`É`f½#6õWÒ0â!¬¥çÇé€SòÜ£KӗÕË §T}HÒî®ãU‰;_Žak3tðF›î·„ïsfBZ›0÷êZ@†ÚnŸ`Gdä҇Ã#$K„ù<[3½oÛ8± Ò¹ˆþæ ¸”îåq$ DzZñП6M}‚Û«és€Ö1‚4‡ô'b Ç·í¡êöâ°Êž]¶E 7ÀøG Ï5ºò‘¹óÅ4§Gðš3 -;yӳ綒­NöfÂëͨ­MÁyrŧZrãXZïÓE)]Ìk뜉1÷¦Ø0‰ÛKáG9’®×s~ÎPýt¢Ž¸ DÓM)C¨ï¡?¥Ç+¶œ‹.×úIˆ›SI5>3én -çM­ña$'öxØ ¥0:ÁŸž#§—R@×u*s÷jkÏœß̘ƒh-Žz_Sçt/3ï¤_fg2õYxɑ‡~xèÙLb[òðÙ*fúæ<1­ŽJd;¹oe=Y‚ý·¬CU`¤eÓSøa÷= -5Sju¬+ …aeJÕ x qÕGøÔɎáøê:ƒ›ÐÆøف¯> ¢ê«»IƒªsÏhȸä¡þìK¬u æùüݦŒ* Nû’žébÿ gû>ÀmÆ/'Å´¢™¯&'¨Â‹Vþo%+TNEJ‰CMêLÂ[ hҌƒ§Iõõ&¹Ñýfp»>ÏÊ÷›™Q6”™•-éDÚÞ·"Ý -G° ғñ-Ò©HuZÛSêÔ3)B~Ã(ú9o‰«œÓ©vQØîŠ}¥ÄHd˜º ²ê\EóQ¬ðýë§úcœÚ“Žb®¤³]„›1kŒ ¼ø¤”7ƒ™¹é¡"PQP.äs%ýŸ¥Û‹ÐÉI>ùÒ£ÍÕ`æOœ-êv%,®A†§1^•× ‹ºw<ø/Â~É¿yÓk¨76ÊòðòŽe¸`Dºu øUŒ -I¯³ì?EñÉr‰9WïúF"ý“¬P;…N3žó…³.Ãaہ‡AÁòڏ漫B)l €|Œe³÷ÃO® 7NIP¾ÀՎ<, hl„¥þ†0Çæ¯ \=¥Þ¼WDÖ¥Ý6=op&Ñ=å8‹RÚ}’e]úÔ?=Ð, þT›\s\­·è\e›ºêJ<<Ï劙ö ú…]â½{Ãvê—Ê7oyhñKTïé-ށ(p15³Œhw^‡[×ùÕáan†Î`qÌ®”†~q /t4@Ê凜 -¸­¥O¤«]¥(‹÷  .·ËàŠ½Æö P—øñ젓¢ú‰"P1s(˜a/ÒEI²Ûfs%æw|Ú+Ñ/-á; ñI„](+#¦a…Îc^ª–áÍá°Ð“€Ó^’Gæ–×Po›×õ:³€7G€ðMœaÐg µ’Oð†×esù&1"! »h ¡ -‹z ó+ç2Œ>CUyçj²«`…ã©K»Ó‘®›svqKr–¦âÕÐñA– §!^b&´ìÇñls‰c‹ÔwŠNnn”wêÇÀ⃑PâÃôàf‚浀“‹7҉U1E˜_µE~as( Z®bR…¡¨.¯ß€!9ñ %‚zŒÃ[@,ìkT.‡ê7qºë3ò LÔ¬›~ÍÒn°ýωÈyØ×r®¤Áã˜v뛷ðšõo¤TYË@ÏÌAŒ\dô:a`>¥„¹Ÿ,Zc!ghRÊexË“cá‹å5æ0>ÀT6ØbèʃDG g;“Á˜Á -وU¤(`ŒH9`.Q)µEø 畋•ÑêI³;ª¢—:“¼Hb -w‡íԞ -ò© S ëâ,&*ÜûšÔ§™:¦‚Ð'ª éäU€g:Yœ ·S;d͙P؄MÅ$+[0Šb’Ìo­=ó[÷à\U~­\4Äk½¾¾n؀ïŠëjè­áÐO‰êš;ðÙ dn¾ñ7Päv ºÇžÚf‰·-cà£Z3àî@íD̦X#H‰§FƒËWYӇÞgRÕÑT§•2Œ&ë.ÿcÎ5BLëh·N’ -·’]:_Û=_¦‰¾ödߝ¥ZÄw^ÐÑ,¼ø6<Ž‘eBÏÐŽ ˆ :G„âCÜÅãÃkX;bøàvr|€ÍYó®4Gû®ŠL €1ë_†–W!ì,hªÜYˆª˜€@yµ ÞÂZŽZ÷±oP# ÔUgH¾“æ"˄ܧC÷Ýd˜à°#&hÐAš´<ðñǵ™ad—(ºÉ -ƽ…“HJT %¿\g½©€ÌEA“í±Ž¤vÑÔb˜¦¾#Í SíˆÈMO[àdyD´á„Uª@F-3àF…ýZGÆá7®Wƒû[߸m—Â$;¢’›0N‡£ -Žºl.ie²´ô®½iÙäÞL…g¯²E_ÝoéÑè1I£nUzDÒJn‡¨IIS¬cÇ–4ã—é1IÃ~Ír’¦ºŽ’ÕvUJøpœà$mà3ô&n¢ ±l(íúzْîú¼U¨’É6M·)‹F ÒÜd×åÉ.ÝWç¾r#vAäx<ґœ>îT!›ÌF¾dGröÌs„_·D) Šiw͑\¬F\iÄ!êÄù‹tÎ}r4ü:&ƒ×ǖ„ÉÒjåÁ_¤%Û!݈~E´DdÄí˜ê}ö‡Äbj8DÜd˜¦bi¢ëð¦ä'»JÕ9åcü¯¹JœÿµÚLÐ[<܄lMQ>Žß®ºÓ1밓>³¥ÔgØxtÖÚQ£7®:؋U˜?Ä÷`€¨µm­µgªhmæØTkˆTz̬3ŽÚ® —¿*Gš«Esq¥8lÖÞ -½ôjȂ7¸õ¼ƒ]/éOÔþwvM¿ç2É®•¼ tNm¼í/X%pݵÌÙ­8Ðk0þê÷6#ÁT¢iý2›õõâ¡g3™Ò½L:p[ÄË6邮 ^n›YCEmÕÓ;š“|z·WŒ/y(Oº»ãgÍxF¾WénPÜK|Ø6ýÉDoõ™fMÖ»F»Óou®"2p«>Ùså8>øÞƱJB#òЦóÞ}AÆ¢•æ–)&ª ïRŒô Jí<##LÓió³%FÛ,J—ãrn ÒâMQd¢ÙO ¨`§Só.ße²íT½ÞYC™kí ù­Qoš@l&LËq´ü;­Î7O0@ û./ø±¡ìû B ga¿vÄ|õx•(†ôÈ¡$*˜òfƊx?cžðveW¬évcóu3A£˜~ÁÞP][ÑR&c±»cbõ`òŠzã±Ë68]‹…ƒ0ÇP’£ÞY·Ð…–®D¨æƒ™®@ªˆ†¥Ý.}àDßM ¼¨ÍŠÁƒîºô!²ÀßqY“ æ|^³îCL›éÁ/“|m,ÀMû¨ãè…âùq!_ÍY [˜j06nð€ÙêÍê;a+ë\Ùp?1*裂¯9—W@ï{ڝ_ wîÃ;–­;è6N8 -p³ŠŸWIk—Ëü$TîH#ä?m×ZÏÁ }5[tc®ž6?;{­­5¨ƒ§Æw­a¼$`âZ ¦÷uà§7ø©•hCk÷Û[ðk‹JpÓ¥:.?NCd!L‘cÄ Òç_‘MÙ¸|ZMvúžzˆv'{¾Ba’äT’¡£y©¤XȽª†C*C)¸ü563aÒ½e¢Zã®i .óЧ}­¡3vi U[žGŠ;ÁiŒR;ä x@uwp&g¯±¬PÜQÎT²ß.HwÈÙZЂ,L»Iò7?™µ…J,GÙ"0NÊD‘® Îz±.£!TIxÞ‚^ ¿˜ÂÓFíQ èˆH&…؝†7¼;x.0Ûj©‹Y²Äpšñ2e7Ò®pÇÅ òà S0p˜€­ƒ[ÿ¸5f֝€ÊÊâp_ :wÓ’Z—¡¼ôíí1À„´ñyz ¢7¡šŽÐEBýÜ<ð1g…|áo¬ïÄ°¢é'Om[¿NwP»6`!°çœ«Éa£@G|ÀrþŽàö×XRë0ª|!²”nOE@».ܖªYú²”ÅîN0²ÉWÎH3#TÄ_Uά²1¸ó6¨b´B˵AåYE<ÔÚö»Ì%ŽÁ¯M­m8íi­Ù}TkO¸&P%'èߦŽ}õP¹óÁ©i ˆù<5}ЊÔô-dPÓì²öwÕ4µSÈÛ!BjšxXMS)ö¬šf<•jÚ|©¦%’G€‘$«¡‡ÞVXçCðlt ih¬PùhÞ¢¡qè–$ўÈbV§¡aL–JºÏàihÆæ}‚Á›ÝÁÄ·`²Ž´ÀÖ…ÁÅÁe³ºD•qwœ”ëLe˜2é˜ÊQ°4#ZxÊfÀ'¥fæ<ÂÅ¡ƒ®wÜâù>9@T¿ (bBµ¶Ó³P»{í<¯0ÉÙCYñ=ÌZ#ŒA†~"P‘ YÏPßûàW„µÑÂOA@áõì2˜+>àDB"…ÍKg‚ºÏ6wn´‹k!KP]'a^v€ÒÕÙT)A-ØÉÑnL— ›ƒ0@@ -$bƒZۋgK¥0´L†JÏCI‰€Û,Ÿ…/Q·‰šÁW”³à(€·‹{Š½OC< ì`{‚i •¾“Òß6"Sgv~mð6ÒÕ¶¯U^7„O߀M¨ë\¦0ŒÜ -/‰»X.øÛÁék}{˜<Ü<½Ÿ²šY½…Në²,ðŽòx«•—ÄMíØÖé ys,b¥:é9½ëçÙÏÞ¦Ä'7þ?|ýni f Š`½#`T†€{â'ð‹ž*–/BÓ¥‘ì[h+PÓ -←Œ9{&ÆÅb êd &Ä·¤ú=XG{ã2¿˜^å™è `î¿wy1Áì&©uhøqÁlaò8cQ#¾ÊE^˪KH){´Pú^¤ÎZ~¾J¤²4yÚÐ4S LñTÅJé#ˆq)û@®{†§dyàç„Ù¡-Q‰óc]ÂÉÙSÈ£gí)çX{=ub‹´>/³Ñq¦,ZDPŠ"ZG„Ö¬h úü¸¨Šƒƒ†ù~¡€ÒàƊ,º5{±”Y=yÊf14¦ b#Aç>œâà" mâeðÂÐrvæ~áf†”8Deø)ÚÿŠ d˜/aÊ·à›¦3T‰¤«Úü5Â7ÃPÕ{AE6(R°{ý]‰Ñ— -X @³0Ü)tQÔ7q³ždµ(4»1Ò¥‘öÉÎE‰í´ÖbÔ4¼:DZs&‰EdŽk ÝtÄ®³Ñ»+èkÊCÀ9û&ŽÍ?û!êfY%DÃü4öL 0zÊ>°ó |,š¾ÈüòL0+8Ç@ó&±p?óîȦl¼c}*Â<È; Ámìû°RAöÏã÷<¨á(§fHÁt¢*uˆ\=Q+'K+äM•^ò€J ÒjÚVÞRP¼©=Í«ª“>€"–‡ ªâôÕ&ªÞÃ~Aë´¬^ÙÓÌv74n<Þcσ8="݁‹‘¥†›ØDÌÇÊKÛNŸ8QMÁŒ®¶Éåã“wH Tº¯ŸàO· 3=>qöÁ/W^ºáonQÊÝ¢jfÔê¦ÒV¿9“!Ë-?½~<Àû zh‡ôÐé"§˜>ž"Ò¥ºz>a¢ŒÛ ÃKàNS¥Æ{(ä]x(ƒÛ•¾…:XÍk„¬ía¤ÙJ+b0—ø‡åt·Hd$Œqí'¨¡ê‚'„½Û€h…óÎUç䠜h`1 ˆY9Rg£ÝKæŒúRÓôQ\¸£èØU4båý6ÖåwM¡óL@§LÖÔéí†Ê×Ê¥FëÄLt”:ځûàVuø t õ»¬ðÍí¥ÛÁD>¶Tn*}ÄD¶‚!ÆWÙ&F‚=ЫêÞþ7à|ø.ÏôÇY;oæ‡Êaµ\ýþ±iþ iþq&ò8Þüm3‡ù¼1ÿÏSz;=ÿÌO‚œ‰z*Ÿ÷{Òóév6ÿC/èqRa§Eˆvo]rñnJc¤ì:÷R‹ŒÓ ¬íWj»Æn3ÂKµ`Üÿ³ûT´ß”;Úà×.…Vá¢?G ãØò’ž’gÒZ.µEÚ¹_Q# %àhÍkqçqvæ½"òÅâζe|ç àšŠãªDgUÁÞèÓ~'ÜԈß p‹ù öð >ˆÁ‹ÜIÎÝt\•è¬*Æ1öqU¢³ª­¬â¸ªñ)À,è>3Fq}M+nåsK0 ÝŒ1ÏòNþÑ*Jvƒ -£AÜ^¥Òn ¦\¬©_ßã\åCtÔ)ø-ƒ 5 㮦×0¤á§g»èŽ -ß÷Š:36tt$øÚDõZ¨r¾÷]ì!UVžA¡»%îl­‘À+îA¦¥ã°ÝÂÿ¾ºëCŸÈÌíú0ÇýÑUJÕG´TWÉøBß=nœ7ÒùYD{™Ð „‹±y3|aα»ÙޏùB6© ul£5ö¤é¤¥ÒÁÐÙ -àS§¦É€ˆò¯É؅¶ƒ¨/37ªƒßu UiGP‚¯æp¦uc> 8™›pÉBàÁÌÅ{0к†ÌòEŒÊ{æT®õ—ç6ÎæEê˛©Ð[zr¹Üj]ãr+NÞLi‘9 0مKðg>͸Á¦tôåôí¾hŽçÔÊXÌѐ¯eו3£òk€±.]†áч²VxÆק—‹tð¦Ô”Œ­°7ŠVËgŠ•&ik H !Û­ù­g¢•è9ølŽÊâ1¯6Q­ý·úk@¸É+o¼ ‰Ç…€þ–ñÂl£þeㅯÓþ¢ñ‚,*<÷WæÄqê|TîàTAZ˜2’œJxºŽ$×pç þM$9Kø«Hr ulò/#Ééd -í_F’k.I®xèd·oý»Hr6yïï"ə使Œ$×pÇæþM$¹†¶û{Hr BÛ©?ÞàN$¹Fÿd$¹æ>Hü­Hr‰éù7äšÊw"É5B òßB’2Lþ—‘är’öd$¹¼¤=I.%iIÎJÚßE’‹$ío!É57¾ð’\Ã@âÿ.’\ÃAâÿ&’’`ò¿Œ$×\…Ä?I®á ñIÎ_¤ÿ"’œ²Ó®!ÚF’3Zà/#É52ø'#É%Tçß@’sYb$¹ð¤Rw݄[×>#ôMŒÛYþåâiÜp¬7*AÞýì¢Ë¨ðã—Ó^»Çad>á&´¯E{Á¼³¤¡ì‰Ø(ç‚mÀהƒy-ãd]|†åo^¿Ø˜ëÅVè#û "2»Ô’}†óûFißøGþeËùÿfã?XºÙcí¡Nm -C•D¥”CÅ'À½e)Ü -}d”hU[¡ìƒRá•û–÷ïƒjþQ½úÈ>(ë¼¾j}`TÃü¯o…>²z±ñxõ…»öA)ISµúÈ>(³U§6šxg(é´¢‰w†5ÿÜM¼3”ÈO QM¼3”H¥†Ü°‚ÑÑ<ŽÉß³üü -~ªÏOç*â&çËÕoiüï9Xnð?Ô? üƒÿ'ßàÓ¸ýÄϟhæ›ùEEë›ín><¬–_'™–š0‡ßãvù<æ?Îúé°ú]þ1%“‰)`im{ʅ}Âÿ$s‡ßQ9ÜåwxqÌÏþ@^¨è~rµ¤Æi8ÝnÎ?W‹ê™Ë‰^{ü~7l• ‡ý @Ê躨4ÿ3û¦Ê&ÖƛÍ͍Ä].–ƒ<2üó}}Råqyqö— I<ª† ‚ûz{K@®†ïãӗš&—’´úÚ)»]BŸ`<}‚Éê“Äï/-›Ç?¦Tå­Þ¨5S|åíìRÏðªÿ“ðùµ€CZˆÑ?ð/Jš’Âþ8aÖ́o¡¯ãŸyþw6ÿOú‡úi{ø7ûl-|±¹IŸáDàÝƒy¡ÁóÄ_KÜWwH®)*-þNÿeÆ©c‹Ágjû»XýuǶøㄽKüžVãÍj|„š‚J”‘ã6Ë)ÐÖhГù¼Åø&NáJœ"ÃëñA‰û¸›@ŒÀ±€ÃE¸ÁdôÑ÷…ŠúŠ9€|=êó€ô#áò:Ü^T®˜ßá#hHÔJ1Hº›Œ -unS¡Ïcôí-xlL¥1q{<ÌÍJ%R9´Œ¡Ï<ùcŠJüôÿ¸Tº9@€îà ?^—¨SjÀu€úw9<­ã„s`@·÷Ñë ÆóBƹ˜Ïƒdõ²VE¡ü/—Éÿ»"éV Sà1îÁ©éN¯š.æð`žÅs ‚ìonÁoÔ{nÄñ‹ºGØ> ØCÿe£pk¢²ö¹Ýa‡úՏc8e\¹ÐÔf¥{=@wSfˆ0: ø ½ˆù)]rQÛÿç!m?½¾—óÆa¼Ú@ëiyÿÇüϘ2mæ;ðèÏò0?‚!™ÿ9~mÿ/±/ß®’Ñüó7íXP -endstream endobj 5 0 obj <> endobj 22 0 obj <> endobj 40 0 obj <> endobj 39 0 obj <> endobj 67 0 obj <> endobj 66 0 obj <> endobj 77 0 obj [/View/Design] endobj 78 0 obj <>>> endobj 75 0 obj [/View/Design] endobj 76 0 obj <>>> endobj 50 0 obj [/View/Design] endobj 51 0 obj <>>> endobj 48 0 obj [/View/Design] endobj 49 0 obj <>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 95 0 obj [93 0 R 94 0 R] endobj 118 0 obj <> endobj xref -0 119 -0000000004 65535 f -0000000016 00000 n -0000000248 00000 n -0000042339 00000 n -0000000006 00000 f -0000183270 00000 n -0000000008 00000 f -0000042390 00000 n -0000000009 00000 f -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000016 00000 f -0000184311 00000 n -0000184342 00000 n -0000000017 00000 f -0000000018 00000 f -0000000019 00000 f -0000000020 00000 f -0000000021 00000 f -0000000023 00000 f -0000183340 00000 n -0000000024 00000 f -0000000025 00000 f -0000000026 00000 f -0000000027 00000 f -0000000028 00000 f -0000000029 00000 f -0000000032 00000 f -0000184195 00000 n -0000184226 00000 n -0000000033 00000 f -0000000034 00000 f -0000000035 00000 f -0000000036 00000 f -0000000037 00000 f -0000000038 00000 f -0000000041 00000 f -0000183479 00000 n -0000183411 00000 n -0000000042 00000 f -0000000043 00000 f -0000000044 00000 f -0000000045 00000 f -0000000046 00000 f -0000000047 00000 f -0000000052 00000 f -0000184079 00000 n -0000184110 00000 n -0000183963 00000 n -0000183994 00000 n -0000000053 00000 f -0000000054 00000 f -0000000055 00000 f -0000000056 00000 f -0000000057 00000 f -0000000058 00000 f -0000000059 00000 f -0000000060 00000 f -0000000061 00000 f -0000000062 00000 f -0000000063 00000 f -0000000064 00000 f -0000000000 00000 f -0000000000 00000 f -0000183639 00000 n -0000183571 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000183847 00000 n -0000183878 00000 n -0000183731 00000 n -0000183762 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 -0000044681 00000 n -0000044351 00000 n -0000044281 00000 n -0000184427 00000 n -0000042772 00000 n -0000065709 00000 n -0000065596 00000 n -0000043349 00000 n -0000043716 00000 n -0000043766 00000 n -0000044563 00000 n -0000044595 00000 n -0000044445 00000 n -0000044477 00000 n -0000044819 00000 n -0000044846 00000 n -0000045310 00000 n -0000045583 00000 n -0000045653 00000 n -0000045928 00000 n -0000046032 00000 n -0000065784 00000 n -0000065985 00000 n -0000067021 00000 n -0000074284 00000 n -0000139874 00000 n -0000184459 00000 n -trailer -<<1F85C3F3F3281849A05EE2E218B76CF0>]>> -startxref -184640 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_black.svg b/net.mograsim.plugin.branding/raw_files/icon_black.svg deleted file mode 100644 index b61a1330..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_black.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_black_512.png b/net.mograsim.plugin.branding/raw_files/icon_black_512.png deleted file mode 100644 index 25c717c9..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/icon_black_512.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png b/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png deleted file mode 100644 index 18b26e33..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai b/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai deleted file mode 100644 index bf34ead9..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai +++ /dev/null @@ -1,1441 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R 6 0 R 33 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_blue-orange - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T16:29:46+02:00 - 2019-06-22T16:36:11+02:00 - 2019-06-22T16:36:11+02:00 - - - - 224 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Ann5Hfmx9aWHyprs3+kqA mlXkh/vAOkDk/tD9g9+nWlev9oOxuG8+IbfxD9P6/m6Ts3XX+7nz6fqe25yDu3Yq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7aztZru6lWG2gRpJpXNFVFFSSfY ZKEDOQjEWSiUgBZ5PF/Ln5mXPnH84tOhti0WhWaXQs4Dt6jei49dxtuw6A/ZH051uq7JGl0Eid8k uG/Lcbfjm6XDrDm1IA+kXXy5vAUd0dXRirqQVYGhBG4IIztiLdC+m/yZ/NVfM1mui6tIBr9qnwSN t9aiX9sf8WKPtjv1HennvbvY/wCXl4mMfuj/ALE/q7vk9L2drvEHDL6x9r1DOcdo7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kKCzGgG5J6AYq+afzp/NY+YbptB0aX/c HbP+/mX/AI+pVPX/AIxofs+J38M9A7B7G8CPi5B+8PL+iP1/2PNdo67xDwR+kfalf5C/+TM07/jF c/8AJhsyfaP/ABOXvj97X2X/AH4+P3PPc3rrlexvrywvIb2zlaC6t3EkMyGjKymoIyvJjjOJjIXE soyMTY5h9W/lZ+ZNp5z0ekvGHW7NQL+2GwbsJo/8hj2/ZO3gT5r2x2VLSZNt8cuR/QfP73qtDrBm j/SHNnGadznYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/PH82OXr+U9 Cm+HePV7yM9ezW6Edv8Afh/2Pjnaez/Y3LPlH9Uf779Xz7nRdpa7/Jw+P6v1vC87J0T0L8hf/Jma d/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FUx8veYNU8v6vb6tpkvo3ds1VPVWU7MjDur DY5j6nTQz4zCYuJbcWWWOQlHmH1x5D88aX5w0JNSsyI50ol7aE1aGWleJ6VU9Vbv8655h2j2fPS5 OCXLoe8PWaXUxzQ4h8WR5gOS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkv51 fmuNBtn8v6JN/uauFpdXCHe2jYdAR0lYdPAb+GdP2D2N4x8XIP3Y5D+cf1Op7R13hjgj9X3ftfNp JJJJqT1Od8847Ch6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxVkHkjzpqv lHXI9TsDzT7F3ak0SaImpRutD3U9jmD2hoIarGYS+B7i5Gm1EsUuIPrjy15k0rzHo1vq2mS+pbTj cH7aOPtRuOzKev8ATPMNXpZ4MhhMbj8W9bhzRyREo8k0zGbXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwD82vzOt/J+l/VrNll1+8U/VYTuIkOxmkHgP2R3PsDm77F7JOqncv7qPPz8h+l wNfrRhjQ+s/i3yvdXVzd3MtzcytNcTMXmmclmZmNSzE9Sc9IhARAAFAPLSkSbPNSybF2KvQvyF/8 mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVZn+WH5j33kzWQ55TaPdFV1C0B7 dPVjB/bT8enuNR2t2XHV465ZB9J/QfJzdFqzhl/RPN9Y6bqNjqVhBf2My3FncoJIZkNQyn/PcZ5p lxSxyMZCpB6uExIWORRGVsnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8xPP2m+TNDa9uK S301U0+zrQyyDufBEqCx/iRmy7M7Nnq8nCNoj6j3ft7nF1eqjhjZ59A+Sda1rUta1S41TUpjPeXT l5ZD+CqOyqNgOwz07T4IYoCEBUQ8nkySnIylzKCy5rdirsVehfkL/wCTM07/AIxXP/Jhs0XtH/ic vfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV6X+Tn5pyeVr8aVqkjP5fu3FSd/q0jbeov+Qf2x9I9+e7 c7HGpjxw/vY/7Id3v7nZ9n67wjwy+g/Y+n4pYpYklidZIpFDRyKQysrCoII2IIzzsgg0eb0wNrsC XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk/m3zVpXlfRJ9W1J+MUQpFEPtyykHjGg/man0dTtmXo tHPUZBCHM/YO9pz544o8UnyN5w826r5q1ybVtRf43+GCAH4IYgfhjT2H4nfPT9DooabGIQ/tPe8l qM8ssuKSSZmNDsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdir sVdir2j8kPzY+oSReV9dm/0GQ8dNvJDtCx6QuSf7tv2f5T7dOS9oOxuMHNiHq/iHf5+/v7/v3XZu u4f3c+XR9CZwz0DsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLHStOudRvpPRs7SMyzyEE0VfYbn LMOGWSYhEXKTCcxGJkeQfJX5kfmDqHnPWzdS1h063qmn2dahEPVmp1d6VP3ds9O7K7MhpMfCN5n6 j+Ojyes1ZzSvp0Ylm0cR2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f+Jy98fvdj2X/AH4+P3PP c3rrnYq7FXYq7FXYq7FX0N+SH5sfpKKLyvrs1dRiHHTbuQ7zoo2icn/dijof2h79eF9oOxvDJzYh 6f4h3efu+77uh7N13F+7nz6PZs5N3LsVdirsVdirsVdirsVdirsVdirsVYn+bH/kudf/AOYU/wDE hmz7G/xvH/WcTXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv +/Hx+557m9dc7FXYq7FXYq7FXYquillilSWJ2jljYNHIpKsrKaggjcEHAQCKPJINPqH8nvzTi812 A0zU3CeYLRPj7C5jXb1VH8w/bH0jbp51252OdNLjh/dS/wBie79T0/Z+t8UcMvrH2vSc592TsVdi rsVdirsVdirsVdirsVSbQvNFjrV/qVvYn1INPaOM3ANVkduXLj/kjj175h6bWRzSkI8oVv3ufrOz 56eEJT2M7Ndw2Sz82P8AyXOv/wDMKf8AiQzf9jf43j/rOl139zL3Pj/PU3kHYq7FXYq7FXYq9C/I X/yZmnf8Yrn/AJMNmi9o/wDE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2KuxV2KuxVE6bqV9pl/BqFh M1veWziSCZOqsv6x4g9cry4o5ImMhcSzhMxII5h9Y/ll+Ytj5z0b1fhh1a1CrqFoD0J2EiV/Yen0 dPn5n2t2XLSZK5wP0n9HvD1ei1YzR/pDmzLNS5jsVdirsVdirsVdirsVeXfmn+YPpLLoGky/vWqu oXKH7I7xKR3/AJvu8c5ntrtSrxYzv/Ef0frey9nexeKs+Ubfwj9P6vm78i/95dX/AOMkH6nx9m/p n7x+lfa/6sful+hkv5sf+S51/wD5hT/xIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C /wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXYq7FXYq7FU18seZdU8t61b 6vpknp3MB3U7pIh+1G47qw/zrmNq9JDUYzjmNj+LbsOaWOQlHm+uPJPnPSvN2hRapYNxbZLu2Jq8 MoFWRvH2PcZ5f2hoJ6XIYS+B7w9ZptRHLDiCf5hOQ7FXYq7FXYq7FWB/mX5/XRLZtL05wdWnX43U /wBwjD7X+uR9n7/Cuj7X7T8EcEP7w/Z+3uel7A7F/MS8TIP3Q/2R/V3/ACeHszMxZiWZjVmO5JPc 5xZNvogFPW/yL/3l1f8A4yQfqfOq9m/pn7x+l4j2v+rH7pfoZL+bH/kudf8A+YU/8SGdz2N/jeP+ s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4nL3x+92PZf9+Pj9zz3N66 52KuxV2KuxV2KuxV2KuxV2Ksl8g+etU8na4moWhMls9EvrMmiTReHsy1qrdj7VGa/tLs+Gqx8Euf Q9x/HNydLqZYZWOXV9b+X9f0vX9Jt9V0yYTWlyvJT0ZT+0jjsynYjPMNTpp4ZmExUg9biyxyREo8 imGUNjsVdirsVYt5+872/lrTuMZWTVLgEWsB34jp6rj+UfifpprO0+0Rp4bbzPIfpdz2N2TLV5N9 sceZ/QPP7ngF1dXF3cyXNzI0txMxeWRjUsx3JOcJOZkTKRsl9Ox44wiIxFRClkGb1z8i/wDeXV/+ MkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/wCS51//AJhT/wASGdz2N/jeP+s8Frv7mXufH+epvIOx V2KuxV2KuxV6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxV2KuxV2KuxV2K uxV2KuxVnP5V/mXd+TdW4TFptDu2AvrYblT09aMfzqOv8w28KabtjsmOrhttkjyP6D5fc52h1hwy 3+k8/wBb6tsb20vrOG8s5lntbhBJDMhqrKwqCDnmuTHKEjGQoh6qMhIWOStkGTsVSXzb5psfLelN e3Pxyt8Nrbg0aSTw9gO5zD12tjp4cR59B3uw7N7Onq8vBHl1PcHzxq+r3+r6jNqF9J6lxMasegA7 Ko7ADpnAZ88sszORsl9S0umhgxiEBUQg8pch2KvXPyL/AN5dX/4yQfqfOr9m/pn7x+l4f2v+rH7p foZL+bH/AJLnX/8AmFP/ABIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc /wDJhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXoOi/lhP5g/LWTzDpKtJqtjdTJPaipM0C IjfAP50qdh9r50zRZ+1xg1fhT+iURR7jv9h+x2GPRHJh44/UC8+6ZvHAdhQ7FXYq7FXYq9S/Jn81 n8t3i6Jq8pOg3L/u5WNfqsjH7Qqdo2P2x26+Neb7d7G8ePiYx+8H+yH6+75O17O13hnhl9J+x9Mq yuodCGVhVWG4IPQg558RT0reBXz/APmlfXVz5zvoppC8drwit0PRE4KxA/2TE5wfbOSUtTIE8uT6 f7PYYw0kSBvKyfPdiWap3bsVdir1z8i/95dX/wCMkH6nzq/Zv6Z+8fpeH9r/AKsful+hkv5sf+S5 1/8A5hT/AMSGdz2N/jeP+s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f +Jy98fvdj2X/AH4+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8WK fnl+U/oNN5r0KH9yxL6taRj7LHrOij9k/t+H2vGmy9n+2brBlO/8J/R+r5OL2loa/eQ+P63h+di6 N2KuxV2KuxV2KvcfyM/NZopLfylrcpaOQiLSLpjUqxNBbuT2J2j8Ps+FOO9oexrBz4x/WH++/X83 edma6qxy+H6v1Pe84p3z54/Mr/lONV/4yJ/yaTOA7X/xmfv/AEB9T7B/xPH7j95Yzmtdu7FXYq9c /Iv/AHl1f/jJB+p86v2b+mfvH6Xh/a/6sful+hkv5sf+S51//mFP/Ehnc9jf43j/AKzwWu/uZe58 f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc/8AJhs0XtH/AInL3x+92PZf9+Pj9zz3N6652KuxV2Ku xV9N/wDOOf8A5L+T/mPm/wCIR5557Uf40P6g/S9N2R/c/F6gyq6lHAZWFGU7gg9QRnOg07R8zfnP +VLeW7ttb0iInQbl/wB5Gor9Vlc/Z2G0bE/Ae3Twr6D2F2x+Yj4eQ/vB/sh+vv8Am8z2jofDPFH6 T9jy3OkdW7FXYq7FXYqnvkH/AJTry5/21LL/AKiEzC7S/wAWyf1Jf7kuRpf72P8AWH3vs/PJnsnz x+ZX/Kcar/xkT/k0mcB2v/jM/f8AoD6n2D/ieP3H7yxnNa7d2KuxV65+Rf8AvLq//GSD9T51fs39 M/eP0vD+1/1Y/dL9DJfzY/8AJc6//wAwp/4kM7nsb/G8f9Z4LXf3Mvc+P89TeQdirsVdirsVdir0 L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/wDnHP8A8l/J/wAx 83/EI8889qP8aH9Qfpem7I/ufi9RznHaKN9ZWl9ZzWd5Cs9rcIY5oXFVZWFCCMnjyShISiaIYyiJ CjyfKX5qflrd+TdX5QhptDu2Jsbk7lT1MMh/nUdP5hv409K7H7Vjq8e+2SPMfpHl9zyuu0Zwy2+k 8v1MGzcuC7FXYq7FU98g/wDKdeXP+2pZf9RCZhdpf4tk/qS/3JcjS/3sf6w+99n55M9k+ePzK/5T jVf+Mif8mkzgO1/8Zn7/ANAfU+wf8Tx+4/eWM5rXbuxV2KvXPyL/AN5dX/4yQfqfOr9m/pn7x+l4 f2v+rH7pfoZL+bH/AJLnX/8AmFP/ABIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+ TM07/jFc/wDJhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/AJj5v+IR5557 Uf40P6g/S9N2R/c/F6jnOO0diqX+YNA0vX9JuNK1OETWlyvFh0ZT+y6HsyncHL9NqZ4ZicDUg15c UckTGXIvkfz75G1Tydrj6deAyW71exuwKLNFXr7MOjL2PtQ56f2b2hDVY+OPPqO4/jk8lqtNLDKj y6MbzYOM7FXYqnvkH/lOvLn/AG1LL/qITMLtL/Fsn9SX+5LkaX+9j/WH3vs/PJnsnzx+ZX/Kcar/ AMZE/wCTSZwHa/8AjM/f+gPqfYP+J4/cfvLGc1rt3Yq7FXrn5F/7y6v/AMZIP1PnV+zf0z94/S8P 7X/Vj90v0Ml/Nj/yXOv/APMKf+JDO57G/wAbx/1ngtd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJ mad/xiuf+TDZovaP/E5e+P3ux7L/AL8fH7nnub11zsVdirsVdir6b/5xz/8AJfyf8x83/EI8889q P8aH9Qfpem7I/ufi9RznHaOxV2KpB538maX5u0KXS78cW+3a3IFXhlAorr0r7juMzuz9fPS5BOPx HeHH1Onjlhwl8jeZvLeq+W9ZuNJ1OP07mA7Ebq6H7MiHurD/ADrnp+k1UM+MTgdj+KeSzYZY5GMu aV5ktTsVT3yD/wAp15c/7all/wBRCZhdpf4tk/qS/wByXI0v97H+sPvfZ+eTPZPnj8yv+U41X/jI n/JpM4Dtf/GZ+/8AQH1PsH/E8fuP3ljOa127sVdir1z8i/8AeXV/+MkH6nzq/Zv6Z+8fpeH9r/qx +6X6GS/mx/5LnX/+YU/8SGdz2N/jeP8ArPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz /wAmGzRe0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45/wDkv5P+Y+b/AIhHnnntR/jQ /qD9L03ZH9z8XqOc47R2KuxV2KsM/M78ubHzno3pjjDq9qGbT7s9idzG9P2H/Dr7Hbdk9qS0mS+c D9Q/T73D1ukGaP8ASHJ8n6lpt9pl/PYX8LW95bOY5oXFCrD/AD2PfPTMWWOSIlE3EvKTgYkg8whs sYJ75B/5Try5/wBtSy/6iEzC7S/xbJ/Ul/uS5Gl/vY/1h977PzyZ7J88fmV/ynGq/wDGRP8Ak0mc B2v/AIzP3/oD6n2D/ieP3H7yxnNa7d2KuxV65+Rf+8ur/wDGSD9T51fs39M/eP0vD+1/1Y/dL9DJ fzY/8lzr/wDzCn/iQzuexv8AG8f9Z4LXf3Mvc+P89TeQdirsVdirsVdir0L8hf8AyZmnf8Yrn/kw 2aL2j/xOXvj97sey/wC/Hx+557m9dc7FXYq7FXYq+m/+cc//ACX8n/MfN/xCPPPPaj/Gh/UH6Xpu yP7n4vUc5x2jsVdirsVdirzT84vysj81WB1TTI1XzBaJ8IGwuY139Nv8ofsH6Dt06DsPtg6aXBP+ 6l/sT3/rdb2hovFHFH6x9r5glilileKVGjljYrJGwKsrKaEEHcEHPRQQRY5PMEUnfkH/AJTry5/2 1LL/AKiEzD7S/wAWyf1Jf7kt+l/vY/1h977PzyZ7J88fmV/ynGq/8ZE/5NJnAdr/AOMz9/6A+p9g /wCJ4/cfvLGc1rt3Yq7FXrn5F/7y6v8A8ZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/yXOv8A/MKf +JDO57G/xvH/AFngtd/cy9z4/wA9TeQdirsVdirsVdir0L8hf/Jmad/xiuf+TDZovaP/ABOXvj97 sey/78fH7nnub11zsVdirsVdir6b/wCcc/8AyX8n/MfN/wAQjzzz2o/xof1B+l6bsj+5+L1HOcdo 7FXYq7FXYq7FXjH53/lP+kI5vNGhQ/6fGvLUrRB/fIP92ooH94P2vEe/XrPZ/tngIw5D6f4T3eXu dN2loeL95Dn1eL+Qf+U68uf9tSy/6iEzre0v8Wyf1Jf7kum0v97H+sPvfZ+eTPZPnj8yv+U41X/j In/JpM4Dtf8Axmfv/QH1PsH/ABPH7j95Yzmtdu7FXYq9c/Iv/eXV/wDjJB+p86v2b+mfvH6Xh/a/ 6sful+hkv5sf+S51/wD5hT/xIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/wDkzNO/ 4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/wA45/8Akv5P+Y+b/iEeeee1H+ND +oP0vTdkf3Pxeo5zjtHYq7FXYq7FXYq7FXi/nH8p/wBHef8AQfM+hQf7j5NVs21K0jG0Dm4SsqAf 7rb9ofsn26dboe2fE0uTDlPq8OXCe/0nb3/e6bUaHhyxnDlxC/m9ozkncvnj8yv+U41X/jIn/JpM 4Dtf/GZ+/wDQH1PsH/E8fuP3ljOa127sVdir1z8i/wDeXV/+MkH6nzq/Zv6Z+8fpeH9r/qx+6X6G S/mx/wCS51//AJhT/wASGdz2N/jeP+s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv/kzNO/4xXP8A yYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxV2KuxV9N/845/+S/k/wCY+b/iEeeee1H+ND+oP0vT dkf3Pxeo5zjtHYq7FXYq7FXYq7FXYq7FXzx+ZX/Kcar/AMZE/wCTSZwHa/8AjM/f+gPqfYP+J4/c fvLGc1rt3Yq7FXrn5F/7y6v/AMZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/yXOv/APMKf+JDO57G /wAbx/1ngtd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJmad/xiuf+TDZovaP/E5e+P3ux7L/AL8f H7nnub11zsVdirsVdir6b/5xz/8AJfyf8x83/EI8889qP8aH9Qfpem7I/ufi9RznHaOxV2KuxV2K uxV2KuxV2Kvnj8yv+U41X/jIn/JpM4Dtf/GZ+/8AQH1PsH/E8fuP3ljOa127sVdir1z8i/8AeXV/ +MkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/5LnX/+YU/8SGdz2N/jeP8ArPBa7+5l7nx/nqbyDsVd irsVdirsVehfkL/5MzTv+MVz/wAmGzRe0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45 /wDkv5P+Y+b/AIhHnnntR/jQ/qD9L03ZH9z8XqOc47R2KuxV2KuxV2KuxV2KuxV88fmV/wApxqv/ ABkT/k0mcB2v/jM/f+gPqfYP+J4/cfvLGc1rt3Yq7FXrn5F/7y6v/wAZIP1PnV+zf0z94/S8P7X/ AFY/dL9DJfzY/wDJc6//AMwp/wCJDO57G/xvH/WeC139zL3Pj/PU3kHYq7FXYq7FXYq9C/IX/wAm Zp3/ABiuf+TDZovaP/E5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/nHP/yX8n/MfN/xCPPPPaj/ ABof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+ePzK/5TjVf+Mif8mkzgO1/wDGZ+/9AfU+ wf8AE8fuP3ljOa127sVdir1z8i/95dX/AOMkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/5LnX/APmF P/Ehnc9jf43j/rPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/AOTM07/jFc/8mGzRe0f+Jy98fvdj 2X/fj4/c89zeuudirsVdirsVfTf/ADjn/wCS/k/5j5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0dir sVdirsVdirsVdirsVfPH5lf8pxqv/GRP+TSZwHa/+Mz9/wCgPqfYP+J4/cfvLGc1rt3Yq7FXrn5F /wC8ur/8ZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/wAlzr//ADCn/iQzuexv8bx/1ngtd/cy9z4/ z1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVdi r6b/AOcc/wDyX8n/ADHzf8Qjzzz2o/xof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+ePzK /wCU41X/AIyJ/wAmkzgO1/8AGZ+/9AfU+wf8Tx+4/eWM5rXbuxV2KvXPyL/3l1f/AIyQfqfOr9m/ pn7x+l4f2v8Aqx+6X6GS/mx/5LnX/wDmFP8AxIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7F XoX5C/8AkzNO/wCMVz/yYbNF7R/4nL3x+92PZf8Afj4/c89zeuudirsVdirsVfTf/OOf/kv5P+Y+ b/iEeeee1H+ND+oP0vTdkf3Pxeo5zjtHYq7FXYq7FXYq7FXYq7FXzx+ZX/Kcar/xkT/k0mcB2v8A 4zP3/oD6n2D/AInj9x+8sZzWu3dirsVeufkX/vLq/wDxkg/U+dX7N/TP3j9Lw/tf9WP3S/QyX82P /Jc6/wD8wp/4kM7nsb/G8f8AWeC139zL3Pj/AD1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/5MNmi9 o/8AE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/AJxz/wDJfyf8x83/ABCPPPPaj/Gh/UH6Xpuy P7n4vUc5x2jsVdirsVdirsVdirsVdir54/Mr/lONV/4yJ/yaTOA7X/xmfv8A0B9T7B/xPH7j95Yz mtdu7FXYq9c/Iv8A3l1f/jJB+p86v2b+mfvH6Xh/a/6sful+hkv5sf8Akudf/wCYU/8AEhnc9jf4 3j/rPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c// 2Q== - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:73FE812EFA94E911B987F622BD994B0C - uuid:004ce5b9-fc7c-4b0d-93ee-bf4717f6614d - - uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:73FE812EFA94E911B987F622BD994B0C - 2019-06-22T16:29:45+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Cyan - Magenta - Yellow - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/Properties<>>>/Thumb 38 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 35 0 obj <>stream -H‰lK -Â@D÷}Š¾@:ý™O²5Š« âãÂ,Ôûƒ=ã' -20Ý5¯Šiw¶ãÀ¸ZL¬™L£ß½*Þ&h·ÆéWd?‚3ºã8CÑ3ô½K!)‰ö.-td]ÙÏp‚=È\ _0Ëd -"iA6I°ÉÞ§3Tåoݤ•ý%žð¿Í—1ûiÜä\+—Y;q%ê.S -)¼”w"³X35fÊñ“¸ýà Œ[>¤ -endstream endobj 38 0 obj <>stream -8;Z-Q9+lk"$jPWQ],\i6ZcXl0:91<&O?ajCF]t))bSU7-g/@oZJb=TD4`>/`f0_;N -8C70HZV1@\[_^QkYh(XZhc"omWBGXj"MjeZ8*Do-[FJI3=#Ahc:OcT?i2RIgeHAe+ -eTESII-RNAZO,\Bil_dEc,:DoOCXu,(2q'cVX^Jhe38'i1)g(1JrG!;\,&'M7RVCu -irj;VlI-Cj3d`.0dN -endstream endobj 39 0 obj [/Indexed/DeviceRGB 255 40 0 R] endobj 40 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 33 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 37 0 obj <> endobj 36 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_blue-orange.ai) -%%CreationDate: 6/22/2019 4:36 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%%DocumentProcessColors: Cyan Magenta Yellow -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%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: 1 -%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 45 0 obj <>stream -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 20905 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 -%524C4585FD6DFF7FFF0885FD6BFF5B0EFF0F08A9FD69FF850837FF080908 -%A9FD67FF8508090EFF0F080F0FFD66FFAF090F0837FF080F080F30FD64FF -%AF080F080F30FF310F0F080F31FD63FF310F08310931FF080F080F08095A -%FD61FF3009080F080F30FF310F0F08310F0F5BFD5FFF310F0F0F08310937 -%FF080F080F080F08097EFD5DFF5A09080F080F080F30FF0F08310F0F0831 -%090F85FD5BFF5B0F090F08310F0F0837FF080F080F080F080F080FA8FD59 -%FF7F09080F080F080F08090EFF0F08310F0F08310F310831FD58FFA90F08 -%310F0F08310F0F0837FF080F080F080F080F080F0831FD56FFA931080F08 -%0F080F080F080F30FF310F0F08310F0F08310F0F085BFD55FF3108310F0F -%08310F0F08310931FF080F080F080F080F080F080F085BFD53FF37080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310985FD51FF5B -%090F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F08 -%85FD4FFF5B080F080F080F080F080F080F080F30FF0F08310F0F08310F0F -%08310F0F080F09A9FD4DFF85080F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F08AFFD4BFF85080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F30FD4AFF -%AF080F0F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F -%080F080F080F080930FD49FF0E09080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F30FD47FF300F0F0F08 -%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F -%080F080F08095AFD45FF3009080F080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F7FFD43FF5B0F08 -%310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F -%080F080F080F080F080F080F85FD41FF5A0F080F080F080F080F080F080F -%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F080FA9FD3FFF850F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%37FF080F080F080F080F080F080F080F080F080F080F080F0831A9FD3DFF -%840F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310931FD3CFFA93109310831 -%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 -%0F080F080F080F080F080F080F080F0831FD3AFFA931080F080F080F080F -%080F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F0831085BFD39FF37080F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F -%080F080F080F080F080F080F085BFD37FF5B080F080F080F080F080F080F -%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F0885FD36FF310F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F08A9FD35FF5B080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08AFFD34FF310F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080908FD34FF5B080F08 -%0F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F31FD33FF -%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 -%0F30FD2DFFCFFD04FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F080F5BFD2BFFC2FD05FF300F0F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F08095AFD29FFBBBAFD05 -%FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30FF -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F7FFD27FFC2BABBFD05FF310F0F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F85FD25FFC2B4B4BBFD05 -%FF5B080F080F080F080F080F080F080F080F080F080F080F080F080F30FF -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F08310931A9FD23FFC9BAB4BABBFD05FF310F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F0831A8FD21FF -%C9BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310F310837FD20FFCFBBB4BABABABBFD05 -%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF -%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F -%080F080F080F080F085BFD1EFFCABBB4BAB4BAB4BBFD05FF5B080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F085BFD1DFFC1B4BABABAB4BABBFD05FF300F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F087FFD -%1BFFC2B4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F09A9FD19FFC9 -%B4BAB4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F08A9FD17FFC9B4 -%BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F0FFD16FFCAB4 -%BAB4BABABAB4BABABABBFD05FF310F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F080F0EFD14FF -%CAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F -%080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F31FD13FFFD04BAB4BABABAB4BABABABBFD05FF370F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F080930FD11FFBBB4B4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F30FF310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F5BFD0FFFBBBABABAB4BABABAB4BABABAB4BA -%BBFD05FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 -%0931FF080F080F080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F08095AFD0DFFC2B4B4BAB4 -%BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F31 -%080F85FD0BFFC2BAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F08 -%0F080F080F080F080F080F080F080F087F3009080F080F080F080F080F08 -%0F080F080F080F080F080F080F080FA9FD09FFCABAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%85FF0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 -%A9FD08FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F -%080F080F080F080F080F080F080F0885FFA9080F080F080F080F080F080F -%080F080F080F080F080F080F080F0831AFFD07FFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F85FFFF8508310F0F08310F0F08310F0F08310F0F08310F0F08310F0F -%0831095BFD08FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FFFFFF5B080F080F080F080F -%080F080F080F080F080F080F080F080F080F085BFD06FFCABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F080F85FD04FF5B08310F0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F080F087FFD06FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF -%300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF08 -%0F080F080F080F080F080F080F080F080F080F0885FD05FF31080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F0885FD04FFCABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F -%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F -%0F08310F0F080F85FD06FF37093108310F0F08310F0F08310F0F08310F0F -%08310F0F08310F0F5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD -%05FF310F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937 -%FF080F080F080F080F080F080F080F080F080F080F0885FD06FFA931080F -%080F080F080F080F080F080F080F080F080F080F080F087FFD04FFCABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F -%08310F0F08310F0F7FFD07FFA90F090F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABB -%FD05FF310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%37FF080F080F080F080F080F080F080F080F080F080F0885FD08FF7E0F08 -%0F080F080F080F080F080F080F080F080F080F080F087FFD04FFCABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F08 -%0F080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F -%08310F0F08310F0F85FD09FF7F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F080F7FFD05FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF -%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F080F080F0885FD0AFF5A09080F080F -%080F080F080F080F080F080F080F080F0885FD04FFCABAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F -%080F85FD0BFF5B0F08310F0F08310F0F08310F0F08310F0F08310F0F5BFD -%05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD0CFF3009080F080F080F080F080F080F -%080F080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD -%05FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30 -%FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD0DFF300F0F0F -%08310F0F08310F0F08310F0F08310F0F5BFD05FFBABAB4BABABAB4BABABA -%B4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F08 -%85FD0DFFAF080F080F080F080F080F080F080F080F080F087FFD04FFCABA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F -%080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F -%0F08310F0F08310F0F7FFD0EFFA9080F0F0F08310F0F08310F0F08310F0F -%080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD0FFF85080F080F080F080F -%080F080F080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BBCAFD04FF5B080F080F080F080F080F080F080F080F080F080F080F080F -%08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD10FF85 -%090F08310F0F08310F0F08310F0F080F7FFD05FFB4BABABAB4BABABAB4BA -%BABAB4BABABABBFD05FF370F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F080F08 -%85FD11FF5B080F080F080F080F080F080F080F0885FD04FFCABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F -%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 -%310F0F080F85FD12FF5B080F08310F0F08310F0F08310F0F5BFD05FFBABA -%B4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 -%0F080F080F080F0885FD12FFA931080F080F080F080F080F080F087FFD04 -%FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F0831 -%0F0F08310F0F08310F0F080F85FD13FFAF3108310F0F08310F0F08310F0F -%5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD14FFA90F080F080F080F080F080F -%087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F30FF0F08310F0F -%08310F0F08310F0F08310F0F08310F0F7FFD15FF850F08310F0F08310F0F -%080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD16FF7E09080F080F080F08 -%0F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B08 -%0F080F080F080F080F080F080F080F080F080F080F080F08090EFF0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F85FD17FF5B0F0F0F08310F0F -%080F7FFD05FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD18FF300F080F080F080F0885 -%FD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F -%08310F0F08310F0F08310F0F080F85FD19FF300F0F0F08310F0F5BFD05FF -%BABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F08 -%0F080F080F080F080F0885FD1AFF0E0F080F080F087FFD04FFCABAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F -%08310F0F080F85FD1BFF0F0F08310F0F5BFD05FFBABAB4BABABAB4BABABA -%B4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F08 -%85FD1BFFA9080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F080F -%080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD1CFFA9 -%090F080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF31 -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F -%080F080F080F080F080F080F080F080F080F0885FD1DFF85080F087FFD04 -%FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F -%080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F08310F -%0F08310F0F08310F0F08310F0F85FD1EFF7F080F7FFD05FFB4BABABAB4BA -%BABAB4BABABAB4BABABABBFD05FF370F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F08 -%0F080F0885FD1FFF5B0885FD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F080F -%080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD20FF31 -%5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD20FFA985FD04FFCABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F7FFD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F08 -%0F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F -%08310F0F85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F -%0F080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F -%080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F -%080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F -%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F7FFD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F -%080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08 -%0F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F -%080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F -%85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7F -%FD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85 -%FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F -%080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F080F08 -%0F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD -%27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F -%080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD26 -%FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F080F08 -%0F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD -%27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F -%080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD27 -%FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F -%080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F30FF -%%EndData - -endstream endobj 46 0 obj <>stream -%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´Ù243wdEÂÝ#؜áQBöµ;;’’Ì -c:’Ì,rɗهÙ[ý>U(`æG±9ӕ +34ÌÃ¥ÐãSÅßýo_ýöËë¯_ÿîîËp5ìž|ñwwxs÷ìÝë7?ݑ¼ûù‹ß½}÷¤ýæÇ»q¾ðÔõÏËS{òŸïÞ¼½ýê§üÝUÀooñþxsÿöÝý³W»Û»—òЏw?ú1~û÷ï^ÜÉï~õôw/¾»ûòõ›g¯¾¹»zvÿcÿ©ñøì<6ÿdš~2 㲋? óî«_ò‘g¯þøìíÛû¿Ü¡ÙPØêþõw¯¾¾õÍþõÿóÓ]šw_ƒwÿ˜"~ÿ÷¿¹{ûÐCW%-|òøúùw/ï^½ûêÍëçwoß^¿xýæíOw‡?K_~ùìùͳÝÿy÷âÅë?ÉÓ×?OOoï_ÜI§_>{·'ŽÐõÏÇééþ»û_ÿ껗¿»“ñ˜—‘ôð”õýÓ[©HêÄ¿IÏOþRH¿½{÷N¾Ošã@ÿægûþ+„Êò£ÿö•ôÿNZ|óow¯þûkÍo^ ÞÞ}™Æi‡ÿöÛ¼{ùí Tö}JóU’^ó¯þ‡ú°t‰~Æ«’—e÷凫y¤Ò¯F™“ݘ–«¥ØmÔîþx÷§Ÿî~õú՝ Ðõ›w¿Õيqô¿ö«ß|÷âîÍ?½º'=“¶èýòõ×w/äVÅí‹g–±ýמøÇgo¾¹{'“üúÅwï¸$‹·"³ð‹g¾Ã4ŽÖȯ¿½{õ¯ÿ™Ÿúå8Ía—Ç°d Æ4•Ý’ân,l$I;ãìíŽí¿V;ªBEµ‰Œ©ûJfó×oõÓúùéÏÞÜݦ8O»¢ÿa?®J÷ÿ¥þß>W:ÿîÝÝ«úý²¼¿ìËpõË_£Õ›W_^¿Ä<¼å¦¸“öe½xýý¶ýÀßIß}kÝ á©LÛWoî_¡â'_üJWž~õâ;ùåÏÞ¼þî۟¿úýë'_üHÄ?ß=& sûõî׿ûòƒló_={þ‡oîþrwÿü¯îÞݽÝíeݟ•­þíßS±ô÷ÍÝN+ïòGùû÷øû1ïï~/;²U Ôø¿CŽ/^ܽúòÿúîí³wyùúëï^Èoo^ýñîÅëoïvÏ^}½û—go¾}L_½xöêٛQ[èëÝýüÕ»»7ÏþíÝýw/ŸI£òÐ/îÿ(/>“ñ}T ²œ¾•QãK|fÝÚCt¿zTSÏÞýa·—üú­×~ýꛘÅï„=oGŒÑçSýoÿüòw¯_Ü¿}é•÷ÿ÷#¿T†õÕ¯_é'¿ùîívÿøúõ ¯ù—rdݽùöþÕÛ»›¯.¢ïýM5äŸk›çŠ&Ï^¼¸ÿæͳoÿpÿü\+ÿÕ~ÿûû»³]xÿQ«ë9§ê\«¿ýöî/÷Ï^œmñôµ¿¹Æl în¾¾Þy <øÌoÿôìÝó?ì~qÿ»7ÏÞÜß½g·b²ÿêkùÐß~wÿîÎAgp®|s÷öîÝ_Þ ƒö -6#/Üv/´êÓS9núãäË/>häŒÝ¿êùٛg_ßËQ&ÒâÏ^¿øZþFªnÿ–c3ïö_?ùâ¿=ùbèþ7ÖÿÅÝß=݋|õŸ…¼ý3nÊԕ`%ZIü-3þ/5Ϋ’½”aY•ë®ì¥¬»r3ÜJ·µ¬>­ÿ3u%t%®JÒ"c€¿ó8KÉü»teY•ëqïåàe?¥ÔŸŽRãq¼!í8Þö¥>~^ýº»’¦åÉú÷”»R¦EŠþ÷º+{-O¾ø?ÎÏé¥Y «yÝì¶9–"5ÖyŽÝlëìö³\¤àoÌnYÍóÒÍ´üWjÔ9¯³¾÷ùÖ¿1Û7ý¬ËõÏpvÎ'™~ƃÌ/þÆ c®g–ÂÙΛ™¾¶²žcÌ)þ¾a9nf³68—mîPt®êÌ-6g2O2§:W˜³ƒ•#ˍ•[”ºÍН͜Žœ­hã_8®{î™[ŽÐĘÙDžý9ò«Gûʙ«çk…m£­)„òhŒKØK9†[™ö1†cŠ9–¸Ä븏Çxoe8§’h‡)§%]§}:¤›$ûT>i”%ç4Ïs™—ùzÞχù8ßÊ¢e0bNy΢6å}>äc¾•3–©Ä’Ê\rYÊuٗc¹)·²pdN—°ÄE*Zʲ,ûå°Ü,·²|Æëp¯Óõ|]®—ëë뽔Ãõñú†Kj’.Ä}Úç}Ù/ò«ýþ°¿ÙßÊ2“Ñ䠇C<¤ƒ|Âa9\ö‡Ãáx¸•e7r2â1ç£|Þ±—ãþx8Þoo™žpoæ›|Sn–iìæp#«äæææKãVí6ÝJgoåóo¯¥H£·òêíæçtà´:í¦+Ç®º²_•ë®,µH‹4ßJîʼ*©+±+¡+²¥ÆÉKÏÙWú¿éÿWå E† ï»rݕeUJWrWæ®C¿I^⪄®L]»2ôE‡ýÉ6}ú?‡®ìµÔ­ºšÏõ,®ç®ÎÚz¦Ö³#3"5Æ~Fº™XÿzÔm´7#ÌQ•ñZ6cj#¹Ãõ¸mFk=>2^ëqÑ1¹¶²°+ÙÊ̒¬D–`EÖ7£©z*øV¨ÓÆêŸ=˵•…¥X‘Í.›?f+ÉJd V”'×3@øj7§7œÇ=ç­pžçs1pôíkŽmæhFŽÞÈѺáèì9Ez—Ùwô½Ø«#{qÍïÎüÊȯ’o‘es#Czvv-l­{›…ÉEav“ðyùRYR72Øa†×ÂËu™„Q9oF9ƒoeê2(ûåZØiY²0Ö$ 6È 5ʉ}+ â(ƒµ6¼ùFaɳ°æX‚0éQÎö[Y*GÊ}¾&^rvž„­aî£È·²ˆŽ2¼{aý‹Y‚$BcaœåeIßÈdäи–ãÈ2§$‡ICeùâVÞQ¦d/Î"OŽ³AQŽ¢I¤A¶À,ƒR×rXÉ7ʱ5‡$Xƒl‰æVëQ¦Ç,^ÅIŽ>Õ0Ï)ûíD`{ÏÖ'ù¬l0=ú!îA@X(@¨@!"F]ZeM¬£ÖÐއ€2­øÅmw(§Xd%Y_£¬­s+kꎞRø£'ÕÈ ‹Ó*q[×ËÎ,œXr(‰ÀP?g£Ÿ‹³,½ræd ~2â\¼F›õ}—1‚I°¹Ê”2n(gŒ&i$—5®·SaŒ7ÜzÍò3eÁc¥`CévêÏQ?€ëc†ÏÓ5E››p²(bŽ.>©À¨"” -†Š÷7ÒÈh¢»v³ŠâMô¦ÊÂÚj]­&ÖÁÒ÷Ï’?™:‘+ÁƒBG’e¥ì¹f6‚F?<ɎÊ¬zvՖUcY=Ó"ÛòÑ?ÃÌÖ¬ì}ŒÌ§c³•?ËFÞ»|]KӘÊJ—ʦ_iI+Ìô2©13Ð?*ó¯T⵶WO+×]›`‘Q\i‘JèUóÀß˦”Mi«þk6]¶/ñ¤„“2)öGjìÿœ¨ŽØ½ìçÏa-² -^ö^®/”åb)UÔó¦Ì,M{M}‘W?»…£ýû´„ …KCjœYÎ ò™"5>îÉGÿ9k+ø¤?Ÿ¯Æîx}`Uú­RüъÊmÕRm#Åtïj;±}/»ZõôºÛ«=¦m…íÞ®²oÝËýîÝÛ®®V„Ó½›Ýê0[In“hv©ÐïV·f<°Oå_n i¶±ÍÞ¬»óÈ£©ÚXzÛþìÞܯ,s§»³Úp¶»µ¬¬|Í*T-Cçö«ÿ¼²¦“WÖÆË»rm¹ÚÚ,Ïíۇvóf¯rW_ø݇ïèwõßÀüü5^z{õêTÁR©åTÁª²Ê@…ý†Éb -æl2ÉäêÕm'•ä•T2u*ÖA”,ªXO¾% j–*YP³ªXªdhuRE«¸¢Lтªu5kOE«Ð†%«‘ÊÖȍrKýûˆ&¤‚"ª–*[P·&U·¨pMáÚSá*T¸ r•ÉÚ1µë–º4/U½ |*_P¿"Õ¯‘Ûê–*؁*”0¨aYšÅ£¢i‰Š¨Œ‰:F{Ð ²£(dPÉ ”A-ƒb–c¢jå,u TÐnM‡ßk¾P¾ƒ„—)åÍx!àÏH«qvˆÁ:!MŽSÙ­P=C‰äà=ïî¸v'…U{®þÝóä^†¢¼$ü6žÈFÎYW¼t%Ù¬¸æŠGʎée” ·;Ëç/Îȏã¹ÉgÞÕ®Šjé-dýŸµQ°3u®ípõÌ¥Ê1šJÛJX•µÍ/mʼ*"¬,‰yec,Ô±ÖåzSöÛb;OÊéŸÛÓRW›0Èþ$ϔél gKµ"ž–t¡Ì‹Û“¥Æ¼)åÁ²¼§ˆH±²jŸ/ûGr|©ñðÈr|\‘O©ç¦òÑEj¼ô»üsæxýèšÜ@4¸Ö:™EK´¢öÔj_ÍVªýu±bÖY©Q­µõOem Õi©ü¶êÖUꯖbµËú¦yJËì¥Úš‹—Åʵ—ýžu„yé„cãU͏pž;u|iå§Xñ¤ Üèê9Ϟö Ë¼çž³â1ÆghK»ÌcÎp–÷q©ñA>ò²áôr9×øhNÑíþ‹|â‘\á”<°«.Å]ýAfەáV»ƒÚRé(†,¢ìAçÎa¼Æ NãÁÜÆp'ºŽ‹žÕ}|„Yu Š¬p"ËCA¶º’áL¾¡;YÊR(ÊøÇò5Ee8—±™ÔÁ 3äOº™Ÿ|AWsTNwó^ØÓѝ΃H‰8áxŽò¥3EøEÄùk:¡Â>nÌ=\ˎ¡¢ð§4ÜÒóu¦Z°tîi:¨¥`aB^i« tVÃ] Ù=Ói]DõXèºVçõÌ ý–nìÁ¹p忕óVŽÛ8­ñXᷕ»6®Z¹i㣍{6®Ù¸eÏ#f¡v®¸â†®e²žÛ­9œ Œð²ÆÙÖ¼lýÎHF§ü©—yÎË5—¸ÎF*é‹Ôøy/×xìéÿñ»ºšÃýê Ùãn’Í»2\EÙ;»€^ŸððoŸ|ñwOóìþí™:¯’<™†]¯Dœ/W¸}µ]s^â(¿¡OðJ™¢ü#§É~=i^vx@k™®Âbkî“kÒïD©M³<6ȶŸñ¢h梺³²%¦a!]8eLò ]eájNÓ}ÖgªÐ¾n„Ï¢²4)óÅ"üY+ݲh“ðYT&ӗ–Uei–þë>O…Ÿ0—S¾*!,¨ª¤¼|ê„n«;·fíã—åJøüÅ»~ -õì ¿Y!˜`™ÿpÿòåÝ €2í_Rq¬Ìÿì¬óÖæd¬2™›/c¼6Vxì}¶Æ梡f(bzœ  OyÈQµçávKó‡j3³kd7äpÀSáàÒC뚶­ã4¡"«gDm»j#Æi2öR]ž;IÇ©#ÐÒÅs.£Q{Ëmêì4Ž)"˜G%lÍcÙÐ ŠO0„ d7†Q8$w{>Œ½èÂ]l—~²æ†ïñÍÐÓ»sÇG?­—ê’?úÄA>3¤²R!|”ÅÀW(Aî‚Ô•dD id ”®’õŽÙ½É:ʆjh¸†2Œgƒ»4©9,›Ù+š}lFáGcS…KqOz3«‹zR<‘ሎŽº6ÄP5'C)"hàqsâtÝTK¢zƒKωôL):S’.4^SžÞS–Ù£àtKɺÉÖ -ÅÄ<ª|­v“±)e8Sᙐ³!i‹ÄKi»PÚ®òöq%so¤n“¹±*„“rw•¼e—­eo¬’Å`ŠŽ7îœ(yWˆg/y(yß@䒹WÉ;t’w6©{O©ûH©[áŸMގ¼ YÛ¥m‘ʏ”¸«¼}*q'“¸)s»¼½§ÌM‰Û™•AÞ šÜéN;ý÷ÿ{M5C2qfV6—ÝMsÞÕõ;º¾«‘ºÂŸG7[‡Á·¿ÃêïhŒºB¥“ƒãÕ$.Œq<¾‚ä³ýWéú_u{¶ÿ^¯LïGƒQWùBÅ%ó&n— €:)®T,ØG¡ÁFgקpÐÝÌÁf âÚÍÆ[svSóÈÜA™­t@f©q f>®À̗×g1Ãú¼^¥²²¹‡1¾foͶ¢Óö¾zuý.< -¹ŠeeëJžyT¶õ f§\^]Ÿumßؐ:¹®s)²²uµg[ñ3µÊ1ʓÉÛõ QGªî€îîÇœsfmöå¼Ël:1{Ÿ8œ tXƒîO‚dž„>l@ùç Nƒ ¬/5ž …Èç¼q^ˆDӞŠØE—öЈà³;iß¹[Ú^ê÷S·«N YW‹¥ö‘9Cî‡Ö/Ü£@ýFaa‰¶„K1WÁ2)¯”xyº³v}® -ÕðQæyñj\Dt.fHÝV¡vžf7™¯DÒ*Ý÷|tú9a‰°Ð„,§‚½<ŽY”tÿBoK^Úõ#ÍòêØYí>¹&3•!f -K¡ùKŽâZ:‡Œ -`dÒ!¶z–«”¤”èÌ@ŸZÕšn~ýæù»ƒñÆÿ-ÕL}DíÕ,’1¢äkÂ$‡g¯•£±ŒÏÀ”·µÈڛ»ú¢&ë°·vö’`‘`cz ÕG¼m°Ç¾‰±‹ó•ΫiøØ ->pð‹o0ôö/šâÚÀ÷rz•ž{ ¸LÍF¬0ƽ‡ßT}ËàÎPBªN”\ïɮݴÐÐâÛk/-œ—ʺL+ì´ÂP[ ®BVÀzÙfh5 îÂ(—ª½¨Í`鴘½I7ÕrnŒeWVDë„.ªù²,©¾Î¥–„jMØWùÅNŒêBQÑ|2”¹™3’U›DȤ½è4Z–ŠÙ´˜ Qî’KK(GÉRÈÔ¼$/íOöR¼\{Ù·"5ºÒ`k·PSW%t…Ã÷䋽¤U9ýS6e9SDØÌ×'åp¡(î܂aø‚³}øàÂ- -Åô9ÊÙàæޜ=Àyßö츎­)Ü¡ûª});Pí «î¹ÛÎ>ÐüًÅ;«[¬{¶6Ù/º?tf,ºÐ–zm+û†v5¬å@ër²U -«ÚžkòȵX}ÙWTóc_ӏmóH(èH.ÐêYíh…æ}ØÑ ª m0Z¢Mý֋{­fðKœ(n7 óÅmhôWӆöÏºy­—Î~v`À5lÚ7†‘tµ¨)kõLU¦!…ªçZõ“†jH †â„÷W¸Ÿñ³œà}V^ìßãÈS ×Xž*>o;§HS”à¡ÃžÃå¬9Ñ9+åd•}ûwIIZ#tâ|à%làƒ¥ÚZÆu,t‚®ÑÏ5î¹Å<×/iŠš)aš¥JÕ:ª¹E‰WU¨©=-~ÙšN9Êk¯ÜԒÓ(å¦ÖoTú^•7¬ÅZ•?oh:Qã7*¼)ñ†¿[«ñkE~­Ê¯•ùbVîì¡Ì’«ôM­¯ŠýäO†N½¿í”ü×å<ÜZxEm¼ýY¼/íXk‡tò[‘CWZL߸*=îz Ýè5hNªpÈÆ«²?)כrîhä±ërö`§ÑîrqAIjLJü࣍i4>Cù¨Xø‡£áB*;pDz¿%]GÅ÷qñ杕Õ=¯<´ÍG{\™^W†WõÖº¿¶zl¯}ž³Í“Žë´ ä8¸wrلs„f|5óëM–µH°çVXÌk™)ÆV¶šb›{íÅna™R°¬ öPoö´ -ø¸![‡},”Z²›l“Éò"2ýHC| ÑPƒs×!¢S ÑÐÕBèl9ª‰Üš¾¢ UÙޞàk3×°‘>pd6ÅԚ «’ÚRÙτ ^ -¬a&ëa‘õLc[:QõRØp+ñ\±Ÿþ9ì»Kvüìæ¦Ü|LyfŒ˜š²¶œ ÚÒPD+$|H¤ßÅÌ ö£±Y’Ün´5p|Äëhcø§W¯ž½¼ûz÷‘v#ì g¨½Ñç\¦ä*J—…i¼ú¯Inkš ¹ÝÂm×9Ö@[…(àz¯`trpírâÖlƒx¢`Õ¯¯É Z¶½Ø3+ÖÑ͏ÍøðtX֟÷ꃾzo_Ý.ôã¾ys=ߚ¹æ$}ÃY*ÎÝe¬ÛL¬ó9}?yb>S–˜ká-KÌ÷žÝ懯^õÊ©bNrOY½ Ðï3MîWj×:óóŒó3Ô.ª)œIj•¯ˆŸÌk‡á<·:RJoùídHCì÷!0ð”…û\(,²Ð¬z#ûWÍ:…;VáošÃN&Àáoùd¦YòØe­«ð·dÐrÖe -``A6=ù¡MkX“šVÁÉL2ë`‚Þ0s³À„SÍ3 -ršLù‰f¨©á³©PU©jzJýcÊÕ²ª¤U¥míllñ2«-íåºÈ˜NJ8[⅒ÖŔÑVæG•|¹Ðw}¾”+ þ¸rF›<-äñË5^z¢“*ªü6;WQ©m¢äWY3'ÂÑ2e57é¬ {•&”rÉ Ò@Ÿ'3Ð@<ôҝpÙÀ–Þ$*\ZÖð¦up“ó ,O›d9»qXø‘ð¨}ädœÉB¢Â§UÀSò §ZªYCÿHÆjêð6#J5­4³K‹¢ifšq[ˆxj%œ)ñBI'…ÜQjœ/–3þ• ¥­ŠaW>¤œXÖEj|ÏZ]ã£ÿHŸùÏÿ5>ÀQ “ÜX,D¢r­Î)Oü6›ÎQ³ï‚Ÿ˜®'å@-CPš{ZÞ­ƒöÓ*﮺š*|»w3ç(•§TØö™É³\¥ò•Ì´Ê]®WœEmð[ÞÒøËdÆe’™>å´î8MýӖëšÏ¬ÀC[˜Tå8*G­¸Î%î3](´1F_æHïãO^¤Æ~ûåa®÷Qå‡ÿZ5~`\Ô£ÿúÙÿH5vf²ãI:á½,ß|“d "—îÑò¦Í̗60Sڞ&¯™æ®Ñ2£íe½©s F.˜¸`ނ; ®4u£iÜ‘ÙÏ4Z!Õ¬gt•yzé’kŸH5.á1©¥·É¥=½t‹Fxò…¹¹ª‹«º·‚E%ŒîÔ:v± ×]n³æÆ¢ KxÔ´Êq¶v]UÇUsZ5—Uï° -ÍYe™-Ç3™-·nª­“ê‚{êÉÕ%÷ÔÊ9õcJj¼à˜:ç”z„JƒÀ[)vOÇûË%ƒÖIa>ÏÏZþרñŽòGù£üÀQ>_?p”8ÊåŽòùj\¹Ù¼üðãIï}žb:Óã’•d‚’sRgü8 |ïÌ?øÏùœ#ÿ³V[}úÃ.Wƒp»•gó+Cš•ßÌãMìB¼šÇ.Ý֏ljÈRqšæÝ4\…iÉçjØ>ÒjÈù¡§:aº€G˜€GÁ3¾ÝlØÇ ûb©§Ýõñ¤>¬xM[À5þ<äù9ñRyÌ|ƒÆ ?:0þô -¯roÔY0û[ -s‡‘ëïùìïøܔ¿Ùšú”MOÌØìk¶B|vÖ³¶šqævãºb7<‘߸d—ùíN]Šš–f©t –ºôJŸå™5 sQ&•Cµð¶†È|w%Ž¹í†—a:ó P¦ÏW§ÅF§aYdZ/<û€˜ã ÏjHÖ ¸TÐ}ÐÇU`­–Þ|þñùtÖyžqN›½1ç™û²2k°M^ŒK°é#À¢ù,zæº뚐Á+`lá|oÎChWý²k Ž†¿þèè{ÁŒàÇ5 â{Ü`+҂…m¼§…e®Ûh¡!§¼§tÀÄ5Ùþæ¯m g÷CØîÖM›¼¿}2=Xn<×oËô›ºëù4+àž),³oÙòùΞÇ÷Úâ}]Óɦ1ÝÏD%4di¡ËmoñÚ75hð¥ÐEbà 'ÂĬñÖð? ªúÆ"¨ƒ)Ýq}|kŸWP÷ç;Úf<êsMD ÄÔ¼G}æ£.Dz Áñ›UjN©8Ÿb|aO>b|fåh²Íöø˜×õ4“‡é?Â8æ€ÐW…¿Íeîó¦ö ~È[Ÿ¼ ËùmX¶)X={`ÍØgì®ðYÛêr8É^!½ ºâ°^çÆÁÀCˆio×÷åO}g•Ÿó`.ïÀ=¶7'w°½äí\¸CõB²­¿â;½ÐŒ¡é#R·é¥Î%˜Ï$˜²äRT€šÊS£K1Ÿ5–Ô¿ÕS„ÊâH+¶t¹²«jlg œZd ·ÝÚIg[›Hyå-6V(m¯#'[Yƒ³DŸ/šG'a%7¼Øjá…Va?Êx™¯v–/™¤]\XµÐ¤Aaü Â.aò\dµ%YuÈʁ˦ö²³ðþ ›ø–‘…×¼D -«Ãï0=/Á=êzØ÷ÝØ Ûûâ趻½ÖeNõû -<´ Ü.qÀ5dÈcYÖÙTG“dZ@ïïAú‹w®V`å3w1<Àk·Ü–iáZE@q>„böþæT×a]ÎڴʶѾñWßòõ™Ö¹èa‹  Ø€ˆ§á¨Ùò:§DµÉðLðԅó#œ FÉÌ•…:{Ø醧H8 L,‚’B!ôÇ¿®¿ïûÓnûÖ ‚ ‰ýè+‚ëíÛ?|Ý'~ÝJe?L´<ŒÃBËÃ< ¢ä•ì™ˆ¦ âNÿђèû+#>s½&²Æab‚²4#üÉ(ÊSÍjÙ ¸J`:ó¯sž®Qçûoý¬õš±èӌÿµÎñ -Çõçs*lêµqûÝfþ¥q §h˜‹öŸWHœùÇy5á3Õø©*D<«AÄ­?€É°Œ©Ø- ·¼a¡²Nܯpki–ÀÀ5=¹§7v|3à€DÓuK=¾º Úuý…~µO±OwQšìmÑ6WW¤m.G[_ŒÖÃêח¢u×£­²{>|±ãã -îmýÀ;¶ÞWþjtá¦Ç^GšÁ(S …D«h¸÷eÉÿ2ӕì ×Xy=ê!Z:2Oû-_5Ýx„Übz¢Ñ&zÊ<â¦åЩÍk5XB²‰&jv½biìZhXƒ%wŽ mº¹íöLev¾¤³%҂s®Ì[x Øg-^£¯‘–]¯f¬—dèM±5•e¶ÿ/½¦Q‡):x -ö‰›>azÿ_üÝ'¡ºtô}lÀãb>êÏ5>öv¯Í Ûó j®uƅίqÞóúfȅeBH„! F^Ë<ðBfȁ½¨ÐžKR`'º$x4xʵÝúP¯P®w¾†ÔëéëmíŒþ²äþ*ùådù{*PÞ&pþrä÷^Ô~þ’ä‹—­ô¥ë3ËD/7ÐËÍm>=$®Xn -ÍLáY)¾­Èl\ÍøîÖ­•á}ß彪†÷šûª7½e Ø4ð`¸q#üѲ™îÍí9±ªY¾˜q¾þéR¾òƧ¾Ä“.”é|áí6çÊø±…×´Öòá5:У¹+z‡EuYŒ'ð -þ(ž ±Ï„!sZeAl×<&ÿá:"s»yˆPð҇­s›¥³½Þð†­K嬤ûžrpÈg+ 5nmˆÿþ‚ô÷Rãƒ*‰Ôxþ7ç/ 9½è ¿ð€êØ§W‡Ì'™E×ÙEǓ]U÷Ԟ·g_›Ë°ø…5ч-;ÑùüDãæЫ9pún ­Þ€ Çý­|øž~ž>?sþýéOªñ¼b/¨"¦¨Ð~½.'JÎ&×v”kj“«RÂÏkŽðz²iŽq=yT,ÒÔØï©ÀeËþ)NȀ¸5ŒòáÁ2=f—3¯£es„íPÁä°Ân80~•S%Eµª”¸g^D•)šDIòä=Hy×TP ¯¹ïíß_Bú_ãZµ³°oF¶;ɂã›úÿ6%²bŸ‚ßѵVSª³UQ-E5¯T\+Šó‰ãsòç¯Tãà -Å¥ûK­P[?½öm{m[¯¹zt2˜T§¤ÆŬýÛê—v×N®]}QüþÖ½eO¬îÌÞ¡ùKó4‡eË`©×O,î®Zgd;0GÒDK.ràu¤~Çí¿» ýI5^P9.ST˜Í`]N•œµÔ)Hç. ý +{ËÓ®•¸éòÁ ž桬0—ܸ½w^]ìyè.õœèøL×z™çµe®«ÖòÉl兎Ç-ä#]I>q‡Âüû ÒßKª$py|H懯¾ºÍÞU©št~£põªXSÐjֆ¦ÆÍæ¯Èír©qñ ꇕcíŨ—<4(ãl> óRˆhmÆ“û´£âãWwinŽgÐtY`oÂÍp…‘Ã᪖‚”ÌÔËn<Úåx5¦Ü;?­uª¥aZ1Æiæ=[ÂLǤy瓫²»Í>¨W%ï¦x•×_òÑU|ª#/uä¥-"÷,Fg{¤=:1pŒ'h-^gìnhF2¯uÚãzkl½áªþ·Ýtº¾+¶Édaûsw¿ëö–×­8 M¤³õ-߶úá UÓ;7Yqe:×·¥·,ü-Äíï¹í®Y<½ dé.H\ßý6ù’‹7‚4þº³}©œº ‰—Sɹ^–7²»&†cˆ´ôøÖmÒÞÛîדýB¸¬’8e{µÔ`E¼à¸ñò'ïÄóàøô:BáèøÐñtü¼œÝ‡B>µ5>"jëòu¦0~~ÐúŒzä"|DønY·;«ŽvKs½·ªÝ\Uü檹»G«]4Ì[ºÎœÌ~×ëó£^·Ë9NnîX/ÅK|êªËç±|"‰¹AeZÝçy_÷À5+äõÅø½&ÍçÖu×B5¤u„àq­Î²‰ Ü^Qqò͗£//ìËüuµ¼äُåÚošÇºŠáÜУœjThdAC;e˜—ÅÖ¿qgßÛ Š·»è“+û^¢ -ÿåîþÿûÿÓî·Ïÿð§goþ‚m³¡üµ.¥95é}äµ4O¾8I[\“ ×¤Å}Ââ£ß‰¹N€^0»±$ÅS‡Ô_G\¾„¡¿‚aßE|J„Ä¡»V”d?2FŠç õäž[CÐƌó}_ùsbþýèK˜¨èòš©‰_“ݬª«¦¥»®2vKy ÙzaD•®oì&ßG¤Ñߤ»6£æƒÍÇÅ¥œ¹Üãc#S։!ºË=¶©AŽçÓL‰¼ÊåÅÏ9ÕÎÝŸ×Oj<åxg4—³©¬×‰¬-ëÉŸƒ•5 -«Å`É*ûè(,s…ìÕêA{G8Ê©.eDææ|™ïíN­±ž½U‹i³m?tübE/ÖǖäOÆ[!LôçiþŽJô·Nóg±["ó|Rô–FOj—Ñ[²Ê>:~‹ˆ] 4fC꣋½u»Iö“ϧúaMü°&~X?¬‰×Ä:-ØdÌ:Íÿõá/¯æ-¡<ýÕëW_½¹õîþÕ7_~Ù«îýož|ñ«où» ¿ûêÙ»wwo^‰VýâÏoß>ƒ6oÿÚ-ËÕ2O ÜÀqžÃnŠñjÙÙMã|%‹kÖ/¾Ö¿þõOøû;ý¡:PÿõÏúó‘ÿ¡þI†b÷ËÝûïÃîë'|ë7x ¶T+Þ½õ¤½Ý/Väú]¿è«8K\Wð -ÿùÉõ›wÇûçïî_¿zöæÏ»ŸªQä'ûׯ_ÈXüÜÆåéÍ×÷ï^¿yºöüßdôžþãý‹»§¿¹{þîÇ»ÿ„7þwüÇûý÷ßi-Gíô¯u­L¸öR¡ã”¸j¢¬–bY"íÒàRlK²û×gZ×z$Ã8^ aw©\Ql ¤Ÿ“T´KËÕ,2ÙNXÃjKWÇÝTäqa»”®Fف»ç|­¤+Ùäa—¦«¶¢E\Åi.»¸\‰þ€K“ç«1Èó1\Ɏœê{ËՐô òÛÌê3››ÊUšàv(ÃUZð~¾ -0ëk9^‰>³›f„>Kk³´"Bé.LúQ á\» Ý Ù^ê(ÎN¦½Œ² -ç|%"ëÀ‚\Ñ©drÓÂJíÜØ¢)¶‡D26ÑUR ֖½V©2Û2 ;¯'cãÜZ«{O?©=U¿ÙëÙtm»øÆÝõ·Ÿù@EXÏŒl5ɌÉLËR½ ‡‚% N#:qp‚ñ°¤òI{Ls†DäõT‚5gïUj¾‚¾¿k‰Üd)´öŒ`ïÙWùSõ³½žMïºA4½Mñ3ìáQNʹäaH(˜ûYfIDµQx¾ÃüÂ1OØÂ…²ìRÙÓ 6‹­Yt °$“/+_è« ›L¶Ä<Èf Üß"$W‚4‡anOÉV"¡ F¨?Œ*âόy!Ÿ’íG{Oª’q|kös`„’ƒˆüdD¬ŸrqÔ„`Ü(“,èè¯:YDk˜_xB-˜#°]øjv¨~á´QôU9‘Ed/݃ò™9ÅÈ’ -QGícS}µ’ÉZ‚,Hh`ì6r’©’ݺ0b®êË> \Ór¤Îd’¯Bı$‹sãDf Ç昻aš™«‰šš'lXÞÈ3ÌØì²ò2^–îœå2hBžƒ=@ÃȘ†¡kÉqže«G—a¬ûI~Š³|¢(ÅA4 ùTIá©»eÐØ.ÖÓcºW숦r•Šb¦tiwËÊ!ÈÜGáçH•Ó(¾VbÁÔ´'„yìêr‚µio:Y†#ˆ’ÖÕ%âì,Û¨kÔ(öª?èðʶ=mƒ1.¦À>¤É¤~ÌsIXܕ,j¶ÈñØAÖ’VóÊäSãd쵒v]e²AFüªµj{5\MÂêûå@Ú¬«Ì)ëVìŸç•y¶}íÆAö ÇHÔäP¤å—k*Bv]ÐáŽø%FQ7–e%8—B– öØ\t†½"'X{ÏëâSjõ¶W4Y¯¼=#Ø®¯ŸåÕ¯mû÷Iï“ \ÐB˜ªzƒ¸Ÿ(nςr‘€;­­1Šô&*ÜÚ ÉV°Å Zª~Èjª-ˆ¹²ÞâÚ …Ú–´ÀKÙ^µh´”YY´ÈNÁ«IKºÓº›´@˜äƒV­qŠKµhý†IÆ Z´È1ó+‹+ìWfС2Ìóâ­ú@gÏG'¥}·º0ñŒnÏ'Ù e™×ö,Ps‘¡Ú³\v¨ö,l;€Öö,°fœ´dgÁ ïö,ì4¨'+s–lȄY©Ö,a eæI@c–ü"¾¹·eQ„¡³¤Ž€³e o焭LY"ªg9iܒ3i‘A¨†,9?&|Ôʎ5ªøÑ YáˆY YÒþükCÖ(Ms£UCÖ(«7®]5:áÇ\Ä+CÖÍ8/nÇÂQ;éXµc"ƒsQ¯ìX8Ô(W;–´,G¸ì¨jÇ:Ùj§ÇƒšÆ¸¶c9µÚ °8 -“™¨Æ‰ &Wf,œkÓ\Ú3#̦°õÕJ*ae\jT³Ay=ÕJU[Ù²ü‹ÚSµ'µžm×Öì\¤¨¸¶e5ª™ À7ÒÜF%+BԖµ) <UÝcƒ6Üꩄ޴Ԩfj™ªµ×›²ü«ü©úÙ^ϦwÿSY²>Áˆ `*C‡È;gª«ÄȲÕg1îâðZ!Œj§J©³¡¢Dilfà ÚR0k)8y@X™;/Ì7“R¤¹ê`…ÛTLùðqv‚ù ì«ÑFƒÁ? [/ż•°,hÁÍFÅ6f|§}’Tã  ûðĨJ±Q_ÀáýABìÊ)÷”:¨§Fˆ<¨Å'†HQfkdaž¢ODµ.Ó±1¿fµ‹´07Š!|$MۃÜ]UúsmÑ é‹êƒˆ¶»V ”1N¡·W)öbý0°õ©VvÒËïQFrÄe9ðãÆ뵇¾ºýð\˜€¯~?¸)ÍîÀ3ǟœí"CâÍêùåQ}¶/pþˆ®POÕ÷G!1° uþáx‘ÃylÞ?¨!"MùR÷”g9Û§æÿïãǹgWgS«@œqr@‘0d ˆÂê 6Y÷>—æナ'’dnn@a†Ò<·d}†šXµß©Þ ÷RƒÐ9ac(îÃ1o åÖ§Î\”vàH¥’ù©ºC©q $W9·¦Î!1,UlhA9ò´_Õ%8â̕IkNAZ4ÒèÎDzÑ}õûT· ”ÿeÂr¯ŽA ã)VÏ µ¥ý¬®AQð…ÿˆã¾Aá­"-Õs«:'ºpÊؼƒ|3R݃0ì¶eT݃¨¯d©Âýƒ°Rßq¡œ€"àU;’»§ J¦|“û'°Ë‘Þ?sÂÁeºöÂôDÕ݄ÐX£ úît›^vân³—r‘c€…꜃µ„}r'žSÖîÂîAz»ªìgk±w‚-ˆD»4Ÿ!tcZ—½=§¬½†Ýƒþñ^Ù¶—g‡2×òcÚxaäá"tÝ4Ê9œÇæÊ«„µë°=f>Á®&§X“kç!f:AÀnuA·§®I#¬½‡í1ÿx¯iÛËÿ R—0=óÛX#ëǹIe¿­Gî`>9¨³P‘iö&E8#)®Áj3bf¨Âó#Ì;ÂCÔ< ie•b -XPçc{¾Aªà6 çw2†6&0f5•úªœZlU^LD0ÑBh8éê©> ¡Á2—†îàîÈ£J¨ †q؁—Û0Àñ-T)¦çUzۃ˜ -tÇVW£ jdé…¹VYV1±kµRž×Iå×µçj¼®“ž¾Gú,.jx—¸$Ö>jؓuº«“~…!®]½Ô£O0HlÜÔ´YóÕê€_Ñe甐úEæäXYõTO)Öõižj§¬=ÕíÁꁞ¸+BO ¹[eŒiM½ogސlºÖÃtÙ]=A”ÆÅ/7dÞÓÜÖ~ÆV/²ÖNëö\õG·ºÅ];®yÓDà•AȦ=¯6Z kßu÷œwÀëÚöô{s_ƒ£ Û(ÍÓÉUót[dÕ<±LhÂYiž`/¢3L®yB?™sqͶ ÝVª§«êé¶ÀªSÂ*ža]©žÐ'‡NA…m ²*žõç•ÞY‰®vÂlS—+“ôN8ŠVZ'Lg9âëüA¾ªužèËլƑµÖÙÈUU¤ˆöǪLât诵Nڙ ß´ÇÊ/½2§¬´ÀŽlêb«¬ª”­Õ•îÙ>¯=è=óʶ}½ì ÿ$Ó|L†¸þê—28=±:5gÕH°Ûˆ=Nqû<í¬ÝƒàGl•9ÅZuÆbäf -…±herj ››»V+Å­ûæ\õ½ ^Ù¶¯ß£o|ž'Uì`ÕDYò Œ2Çh\Ÿè~ȋvŸ3äÂQG«Èj¡× vþiTÞ*âÊÄ¡.T3xa'ø‡¥yš²1ÁgŠ#\Í>qŒ™’N!®W]ùޑºjgÜguΤÇjO5iâ«ymB¸Îa±ºÎaFhCä…¾\:å -)p£ÇDtÀ8Óo7»ãCE?”³$Ó{ð 4Á4ê4W@²Èþ"_€RpEPC™Ì#v¨öìN©2 ®›«(vÆõC0JLîmœ`Ë @ÀŒ -r’Ïó¢î:ÚåaɛðIsª¿©Ì%W4o“†£@ûԅ%ujU²#šÎKSYä±ÍÚOƒ«ÅŠƒíM)aõ¹Ñ@TOiôE>Ùb=]ö§Ü˸=t‰V»—²?…f‘c"4{àå[x|Dö²RlsȀg0Öö œe©¯Ê~½°n\w]50DÁt×Ú3Š½èæúÇ{eÛ^v^AY¿ô¿aåó({¹!/jBü†ž;(҄e9O -ÏsŠ6FE%uÊæÒª2§X«þª‘³JÀ­2¸wahm­VŠ½Z?¯=è]ðʶ}íÆA¦gI8—E$ó嚌vRîZ5Ë`Ba9̅('8ˆ_hÏE¤ ]]N©Ú«N†¨D×A­ €H1µMûÙ8Gý´úTëT­è¤›m`ó¯pªçP=Ä9BrV\¢oj^¢d«ìDÖP)Ə`7±¾’ ]›æ¹UÖQ¬U{ÕÉDÁ²ë*ƒ["¤¾U£<¯lŸçz¬²Ó¾vãà’ž­%úOuí96=ÈðàÃ<%ÂÊ(Ý-ÒßÜ(Ï«ô’Ò<÷ÎQºÊœR[uaÂÈfi• We —7jsZԏ«µn՚N:ú½ ՍÃ$ȑ¿»ã<›™w¶¢ÝqLÍ Ž¬ -w‡Õ#wTÀ;Tº¤ñlzÊ´xä}¡h Ÿ bÞ! B–rÌ;ÆL=¯ôŽgCr’Þin‰sl¨wÊDŒú«°w0Ý°laïèYŽ{‡)nã:¢3ǕÁÃñ*tkè;´¡ JÍyª^ëxt§<÷ñÇÉÐ=hÐö®®J©ºBeärPY«Kښ2¥ÀÚh¥¸ü˜bèŸónÕª¶ý¼¬ú<Ýs“ã]YQ'rŽ%&kiiÈt§˜EÄì݃roU9Áš´7,ÿ<„]WW6stk4÷fkÿ8Î?ßëÚö³ãv0G²–EÍ­'‹Ü%¯"Ô%t6ÆÑ|ž.|uŠma8q»¬å¥««j›Î²H…I`¶VÖV\ú&+ÅÄÁúmþ ¿WvÒÑïÑöáPkl,"ÌW‘æh¬¬¡Ø=)ñYl”¥.Ê´Ðýîàѐ‘–¯KÐÈ£ÙjZeƒu¯µjãþyþ w¡VvÒ×÷͟%l` ‰«qŽˆóÀ‡ÄyäÀ硉ó؇ĹÃn ‰óè‡Äyø€câ<~`‰óÅyƒâjÁç1Ž‰ó(ÇĹp‰«a‰ó@‡Äù#+Dœ;½Màˆ¸.œ GÄy<#âZ@AEÄyDÁ -牫Žˆó‚ Îc -*®8®†¬Ñp5®Àáp5°ÀÑp5´` †«±Ž…«Á…«Ñk$œ‡8Îã  -ç+(œ8Î# šû½Æ¬¡p5ÈÀ‘peàH83X#á<ÎÀ‘phàH¸ÓÝyÆakxü5®#|Í¡ýp«k œ -´çj,A««Qz`ZG6›Wæ(·Úè ç×=ç¨uôt}>œ¿FÃudðU˜E¹y0À - ç1í1‹*è*rJLëÈakuÊ­5كáüÃü)ÿt¯hÛÇK:kswÂÎ'̣ڗœ kEV-ý¤¥ZzÊÈƌbÖSîÂÜ×åk´&”,›l¢=Å+3¡kµÚ×ÕçZj]'=í6È'iîÛÔ[ÔCԐÁ^nÈ£'Áæ#²Q҉‚ê-"„Fqcifþ ÎÎ9ô•9ÅZ}^-…FÜU– ¤¾U£Ø«þyþ wÁ+ÛöµÕOÐY᮲ª/)/Ušmd˜Ó˜Vø{çÀÝS…Hƒ+Å4¹šFÅd„bš»ÊÅZ5¦_É E¨y×*J^èõ®­VŠµZ?¯=X»Ð*ÛöµãV±˜l‚ -›ç册Q6”Ý’’%w!lé}]K£Xgñ)Sÿ äc_™S¬U?üœ\f‚ke°Ù•®MýÙ^«ŸVêúdÕl{ù¹öæ6™Òhà4¢¦^nÈ@|ÑL;Yeb^4H€Ô½t”¶Áæqõà€8ÏÜWækÕmLN¦ŠÛê‚ivéÛT‚³û¶úX×+­hÛÍ~@?E Ø2;U ² Ð—2€uAcʽ¤2Çy²s=Rˆ¯SíØ÷çJ…{]bº·ÚȆ‹q×ꂙwJ}›Fy^•gû8Ð;àum{ú½-RXbDy9«ëˈQÏ3¸ DϙwPFŠê_äÄö³õKäÄ,òº?„ˆ•’»Z*ÁÚrÍ_©²½#]÷µž¬áé­µÜÇÇû7Õ?ÚêÙö¬÷ýNª[/r—§SeȆYµÔ¸¬Þ `jǕ`lwQÅØ–¢¨"¡9ÁÚ³÷*˼Ê+†‚ÐîíÁÅúYþXýðZѶß׆ä‰<˜Þ2ã*ɗ2dÃÙŒ&ø¨ ò “JCi¾RœÃ́V^ƒ°ôuU‚µéüM©Y1î]MÅ¢ø[“¥ËuÒ}›?èßï•m;ú™Dí€NIàØa•}¹&â76Ô½8. -þ¡€>ф39ÁdUxøbêԕ×ÕT)µI{ÓÉ»³kuÑZJ×f¥Ø«õÛڃÞ-¯lÛÑïKBO-©ÏèH—F ™ï2`Ø£Æ*륑¤L% ¸-÷ÏaۍK_—S¬M×& g  ­2$°KרìMÿ8®~¿Wµéæ÷³@iè¨7‰ø‹± ³VR!MMŠÈõ„$Ê8cÃÂ4F±¾1»rìÌØÔ*sŠµê¯yRfÑ*Šhç±kµR|.ôóڃÞ¯lÛ×Ïv³Ôáðû—kj©©!f3Z2H*ªA×>4Š #±f[ôE8C&¨®2§X£nïQ² óãµÊ¦AC¦Z«•ò¼~¯~^{ÐzÐêÚt´à猐{OàÛgôo–šÚmíč@«Šì–ny, Ø Ïê®» V¥4T7,3¨;crhví1ݲ-„iäéFÖNàŒÑ=#-!Þ= ;1]vlxnkéT®pnxGˆ¾[¡¹a*~ ¢]$.34,w2Ÿ -gå–ö4¢¡"¹gÓQÈ=÷;IãÎ@«…¥Á¸ó"›:„†â¦¤ ¦·qÔl¨1q -´ˆ› X,× n¦Áò²Ñ×aŽ²yÅpŸÌü‰Í³ÀN<\ànT3ª#áf..ñô῝កñ©R³|b±t§¬¨z(u£äºUd¨ìÖ^ÞnŸUó·ŠNú÷Ч!TD]lXA·\¡Û ²èÈϹ ŸîÛðpƒUܶ0x97Sƒm3Yc€Ï†ŠLEm§Es,6örٖ-¿04ªR’v0l„sm±Ú¡'  =lÙCƒd- ÀUEdOPw¶xlhï ‹=ٗT€5òa™TٚˆI±ý•ˆtüSˆ „­–Û$$_Ç^ñ]C¯±Rs\ò p^*ð+ŽÑÄ+àu.Æ w¢%©Â®™¢8¥ êZ˜O™ÉØ@×0\󱊹.Ù+ÈõÈüP«*äº-Î -¹>]®'ܼ+bºVˆëF5”4“Iuàê\Íd+´5V0¥> ñÃÜêi„úܨ‘nŠºµ×£­ý«ŒØ>Ûê9é]ë? })¥ кQ+4Ú¬êžFPCÞb¬EÈedMƒXËù<÷Õ8a °®Ô -‰®9jښ[ƒ«í›*±}´UsÒ·ÖíÀxìâürE­PhlA\þéhé-Yæ -U ÛÜXº§pðAôòz*a…onTÃA×z (íõpjÿ¤ú÷¤V²íZë5Òo1Yã -Jݨ~ƀŽ=l ŸÔ¦U€HˆéEõ괊œÐÙÕ`Ï­"CF·özuû¬ú˜x­hÛ¿ÖuØ¡à§_§+±¢e¿hÎ -ˆ†qŒùUWÀia|돉(4¤ƒí„„¹Q êìڛë!ÓþQõ¡Ú“Zɦg—|ððOÌ%¾‚T6r…A"Ðw¤\V‘’rŽ—\âQ û8çF-ÈÖÍÜðV“VØF§V ¤WTa’ÞÞ -NÙ¾«’۷תN;ùýè4Ÿ”õã⇤a÷“ßÜ=;wÎñþåÓ¯îÞ<¿{õîé½û³Õw?ùù«wgÇ_Ï~÷âN;ð‹×Ï»—Ò¥—¾zs÷Çû»?=ýÍë?½­ý p‘‰Vré»x'Ï?ÜÝó‡w—‡¦>ûúÛ§2¦·o^¿zÿÿ¸ûý»Ç?á‘®Þß½ýŽ^¿ðŽjPÝüpGÿåþëw¸8³7Oôn§›W_ÛËOÎ^öô_îÿx‡«žø7ÕçÂLò¹, -€ÆfÃk8sô”e+„eiáRvjÊß¡ ë:D\ÛGu*1#-ø¢œÔÊQ0ÏE¦§àD^Ô½W äÅ®X˜‘ÐoÁ0;©ÕÙÏH¿=ÍÎ1q§(«Œ²J‘8ãÜ[jй –ñ«˜F¤2NÔ9(sqb)¶&ÀÔHÀ‘„ÚéæŽE“QGÞÜ°˜C…ÆVÌÀâÃä¶úÙzÛRً8¥“Õe2*¶&FFÃÛÕQ3Í6>Ïí¾¤€ÁzP· ϸlüâD‚<±2RFÀ1*Œ÷ôvY &^” -ˆ.Oÿ‰©6qý& ÁÛ%côPô™‰ËH%¿ a@À×hòÜb£òk{O˜^ÁYT촄¯e ö¡*˜ð©„çU Ðs·>†{¸“%"BêHa·ÂÒ8Ô×挳dя!Jâ¼h³%dà?&tÈã$æAW ê™p2€Gw?ˊŸùÖèG/ä眵. -P3ã…C˜¦ÊGšÁVÝc¨éà „lxì-Î:ã¦îç¢3è"­è ·y$Fµ'€Æ"¯œÍª–/")BTž}fÐçaá#ªy¦av"!,z­LdPñÞà—! ¾pmÃFYߣ¦#rU¾‡Y -QÏJëž|–œÌ`)f„Ex­óÊt&å"Øà%w‚žnLˆJIMo o(f²!)ž©ô«ø{üúy©Ý™ô!Yþ„ß3C“׳®1dvN–¢)ÈÇL©€ ™0͉u¨b>G;59Siª •L.2‚·u0âÝޓ³ƒK}"úÉ·˜Ç[’B1Î0ª)ö¹E2¹ÊMÌ5½ÑRÍ*=òPTåñ׈pÂñ”`Å'¼˜øÿEßɓힱ¹Q· -5SÇ`m:¶1LؑKp6‡ˆ%ê:Ñk•í+ 3ÀՕp§´5Ùß<ý1$"Ž1²¥RSAà6‡^–äuQ²HpÛ w øN~@…y>Ö`È7÷÷¦åIXa´©fþ>î4©ŽJ`>oDBÈó÷l¬X¯ -™h8:£æ<,È} Bñ(Ñä´4è爋ï%çX4!3ڀWƒOé`ŠÈ9#½ŒƒÖ.Œ†Qc†Á‘ú?ÎñÆ5' •i1°a@(5a©,¹õi"¦(jf>ãS  9qH(>šH v‡… Õs@m[¨¡*pÔW@ ƒK¼dò Ÿ¿‡„¨ jFÄ &E38AÿЫƒ:&†„áYfC GæJWíŠ&#ìD¦ u‰MÆӐ"ÅVØÄ  “è±Ãha )ǛþCfAØræj/ê2™žkmnñP†øB*–$̲¢â~‰jÙã4"ö¯Û@#€H¼­œßI- AMŸâvçNÀ¬««L7ªñ7& -¸Ÿ`ýàÕX¡òèhy¼p2++÷D|žY¸° -ãÂԉšiÅצ([µ -×fÐY–+jHvdឿÐûI #ã*P^Òa», -çüXü~ -Ý[%ÚäH©Í79´Æ Y1£”É°A ±ëâ.;Zt%¢H¹ª·{R4Ö×`‰A©#DÙQŠ”°*7 ÁÓ‚(ïA€­“õpDæجÕeïá××ü”™ˆ þ‰*PÌǽ¸ñm ú€ÉGEG€™Kª!穘¼Duæ¦Onr/|2Ƚ5dzÊè©"H½_ÔªÞÞÂ4ÏËs$Uãç0èQʜ½×š ÏބˆMÐàñ èOzõ‚ìþ¤oÂÌ V]x'e}z!53E ¦Ð‚h&®Yõ9Z×´ÅÙ ðð -Ó,|0¥E}¾´q*%¨»wŠ¾Ðf^¡nUڂY™ZaUÊØ*³R€ÒZ…„ŸGµ»=V¡‚`üI³² $û¤ÕÒÄ¿¤k]¥Ò£œÙåbé¢hƒPœcýÎû®Æ éT±Æ–Y£zõζ ÉI祅 'ÚÜ@&£¡éR'4ŠÁ…”ìk˜„QŸ£cŽ^Îɾ³S] ÓÀÓc՗k²¦—Ä‘°%‚5@`ÚÓdânûƙ=Ï7k¬qOÂî`ÒSÎ?ê.ᭈöÏ,ÂÚ{¤PG;ib¨^ÕÔÁLڂU€¹)P+AÅ$®1®>†$y boÍHá?¸mTœiðä"QV Ít¼{R+~®ëDÈÁ@SažÔ(gOѳ‡ìÿ¨µÁsOÎOâN5sø Þ­¤v] pÐُ&aê3ÌTDÓñ@ûZ¡E¥ŠB,iQ<(Ï@@ƒŽýl#T÷hOA*’^„¢Þ-'àŽÁ´´Wb´;ÜeQ¸2ᢀOžÛ4.ÍÏ -"†´dŽû^8î4ÑwÑ!Æ]SCÿäÂÔ;ÙSäÕ8©NFfE_ë Ù·]À³èZcjHèÐ0¢Ⓥ**Ñ#jIf -"@¬Öð™PŒ‹^'q²͓ýòPpÈ££ƒ@›tš Y­Ÿ 䖯qQÿïdn̼¨cgÕ¨ŸÉlõxmð€?qˆôéMÌ8“xA9M½Å6+,ìíC]Ž«á¦ÚÜ ¶§0)² JœGa8’HO>_ƒïŠ© ²F{ÒÂÒ½ÆcæuMŸ3("€©ÙôG‡Pmç4œ!z,°Â©¡ -.ò»©ÔßÄ¡åŒCÏuïà=8Ë蕢¥ÉÔ,H@T\ð=øÚ(B|I]ÆLÓáb ³z»)"á^E5-êpÂjowÐÏvÐ#k&Õ> JF.ÌØW”¨ZZ{æE¹‡"»CGÓàÜ`¨Aå×t¥;Qay³á°ÊRQWJ0F-Mj} ‘QPà”,M~E•*ÅÆthǪ_ðg9;[?ûÀØÝâK`<Ÿ¢­ )êhÿƒLŒÓ P[pk6;6°Oª;¼†žfj'Àµ“»a”¸°‘úEpàÕõ ÐÃÊX¨-ƒº·§¤3%1#åÉT‘!ÈåLÇrV¢k5ô‚©Õ ?\A&½c‡ÌçT-Z…š±:³$ðΘ¿K—àVS$•j›@^Aj™Wˆq’aC:S¼w%Ó «¾m¦—Ó§8u¼"BAÇÙójÈiÉ?itJŠ>e¨ -£¥F’-9:vö¶Œ{MÏH!>Džú¸·ºwF1:˜8­ ýǺA  *ìfrFM‹ ¥vÄ°ê]´tDNÆø­ƒƒº­Ûkź“ñC‰„ìYÞ¸ µ¨ÛW.„#cDÙè[…W…á¾Fvò¯«v”€!åÄÅ!Ú'd˜%©b°S"c`½â7/ê·ÑãÑÜåEýgÀ²bÉN³‚)™ÈþÇ)t–P‹%ogú‚9˜SÝD~º›²â°RPpÑnr˜¶œ{tÄ÷»u¯(^ê u‰ - D¶b±B öW6ižœy4ˆ5‹•3Iͣʺö^PË5ÒÕóŠ4bÓ²zl‹57Üæ¬@”Mî#Õ€$™ €’³šh’±±CU&Ø^ª÷ÎY-ó g&˜Ê9àÍÉubP3‘ÐTÿñ3á<À8S˜‚(ÏzJï÷Æg‚wΪþãgªø!+2{h÷‰ ¦ìv»a.*Ôш7è%a´/¤E &jš#c6 ¦^f˜cƒK‹‘×!*ÂÄxXRæBnðBûàAX< ЂۘÀC‘Û!*Bê ¨§ ž¬Š­ÍíªC¤Ë7ýÕ¯óUU© À‚·Ý7Ž9S2E®C¢Õ«ÿÚ#l`¤0æ'×XQCT@!Çr}O#¸Šr|?¥xD ²Ÿš‡q‘˜§PYW&Ñ>ðÈ%›LÚ)¸ãº³^z¾j™èÌVÂhsK¬ދ1µ÷ègVŨï] 0–$dþÌÓØz4ABIjÿbÊiXQrµmƒyïâ0k“Á¢2ãeÌ`¢6A^ç*@ˆ—›c(pâãAÕEnÑÀõRvÔƒüì£Ò‹]Ÿ ϞÕË8[»Ë”n3žuׁgD& N“â×4<>›cv`.È7«¿7ËɸcÖ ¬cêE -á*2e:óЛÔiÒ‰9¿„ˆˆ4<ƹ¤ÿCy…z×ÖY³wc”)!@×c=@÷Îv’Ûkà‰cÕ^ˆcB˜‘W\Ád%ÃêAÌzWÀzQVÈÈ9 €ÕMˆ¥æ?š§€Æen᱗N¤ õ%Cjáڌ´3qú‘ýh¢&Œ÷Lvîâz(‡Cë¼kÀÿC.uoB¦ƒf¨I@ëõG…YA§viRQk8H€aÀ-€ò½"<NæÙÛ+ŠB¢.=˜f¤>­ >¤kFEÈÃ?TÃ=~ÂJ!mS%ÁgbB€ˆ—Át^¢.Xm.k.*ü„¯ŠÊkH€rDÁŠ‡ÆCÄÃ(ÔԖ¨€%(7³Ï¤ -`홱£ܝºáÕgd?‹üH¹ÞÞ2¢YÑšLp·ˆÞ×3šÇ}ìBiæJ“FÊèc!)x"2¸ÅØØ{F-Iý}R=Ñغ,áúXücâú‘Çk4 r©ÂÂq‘álP6t„öHßðp®Âõ7ŒÌ£ÉŽþ»¬’^‹”áš/:‰Ï,¢Sr:&ÝÈ°‡9kœ [¦søvëæGxH†j€Ä‚ý·Ðn~¨S­!ü£ŠÑÏ!Lú–î2ÈE½í>ྡ¨gžÝ@ÂüÀxJ•†?%û¯yŒùDE*óèDÅÏp€ÂQOfÎx*­'¶mƒ±†£1¥X}ð W&€bԀ©ESŽ4Õs­HÆ!*ìbeT\æ?¯wÄ-<0ƒC–0Þԁ5º¿9SŸ8Ât0¼¡(’›×4 –©™ˆ£EÁƤ`bè%i-F¼À òV‹beV÷¤`Ä¢«…ö3µ¯‘ҁýÔ{Œ¬s‹^“M¤=å7z'bõ´wh‰á't„†{ã[9¯iÐûö@7aqqê©!!f}NY)Þ$iŒ] >ɜ)XÅ!Ýó²ÈQßTS }à¤t測ב²Ä¢IkçIî£*S…FXh‡Ÿ³d⼕C¯™œUEò[¡Ñ5lÝ͸¦ð~{ W23§9°ƒd2N±”.°Óȳ…îb Žêâ×¥x"Ÿ~U€q Ÿ2/©g½#èò0ÃüÇzW… e¼.ˆ@¿¨b›ê‰5  æÒ7 B[5@ÇîTÕÀ¯=i{÷‹J­ä¢Æ,%Ü)¨)"B{Æ±öžiUµz%ÐOÔdF6Ç(Ղ‰ú¤¿qQÓ£'Ê[j’ÓÞ7ÏûiÔ¿ì¨ÖV¦k3pZ0ç’6ÆÐÁŸ4xîKZw»YÒU¨SyHIªŽ°QµKëG [Ö´V4Ü^Xúæ`OÔÐüلÆ`*Ÿ€?XÏÜn›õ@ ‹EdÏ®Qg†±—ùiC‡ÆpNOÚ;Š ÁüŒ”ÇA -b˜lò̍I60j2î¼daÿÀ+ÆiiƉ³VRQP7/ƒ‘…œ, Ö_#òT ?š™»!©GŽ?â¸L–^ÃÞÊ®’ Íh$?jŸh,‚%O±©›4à2jÔ ŸÂ±Eã-ï¹3coʽ™>8ŽðQätÁ@ 0´ øv@p³¨QŸÒ¸è`2xÊ­923ä(œf$jëeé“!¿!¾‚7ŒAYX°Üúd6‹ÌS@ÑhaÁ͑†Êfò÷xØÖB-Ë56ÐD‡Ÿ»æìöðP͎4û"¢p6«#PÛ\ÏEÁ¥&á5óL€HŒzx‡Û;3²H'·ÈPȃÁþ\Ñã àª7ˆ \ߣŠ4þÍ ˆLŒ¯Hõg‚‚Åš€3êz„V¢Òh2ŒÒdé˜& /«8ߘs†HEã5ɾM ß;žß?€¹(àÄP ÐÎdWb(!k€a橆DÖXìzøÑ2Œ ušÌâ½Ó»jýܱ^ñ>Ut ƒÕ£rL,}“ßf]æ`fš Z¡rbb+ÄU:OÔhs°˜s±˜×7Œ+¢Š¾é–uié%*ØO‹~å öÝb™½…õ@°nC¸ÄeQ„!2²MÝVdÿ´0i…ÇӐl¹ôd©aQñ:ÖY½¨<±rªÙÁƒÏ&Íå`GÀ =y‘L0/Bºž£ú;™øSlå.w¨–ƒvdԞ*½Ô©G¨Z"üރ倥S‚WŒz»€>pd }³æ›c§yÓ%¸é\è`…5 æøÜ嬏-نE£iÛ½A£šþÜ_H±¼ú ð5,p‰õ4{{hÂÂbhÔb¡˜t;‚ÕÇH§A=¯€ªK6]“×Kb¤³y˜™h¿É«l4¹Pòñ§ð>œT„bMWB‰«×ŒÊ´ùXñÅÎx4x'XI*qU‚ÉyE÷?¶ -“Cxãŝ0t3§–šufW,ÀRãݐ+âG™zq1;A±Ì$@Â*v5< ùÊZŽ vƒ”A®ô†âÈÇ4íå±콬HPãcÐ$^ >+®‘&hrO]—HøÄ,\5'Ïb Dæ(çÅ}“fÅÈKÄ!›sEnµ¨j—maágjˆ¼íÀwëba Ғ}ÄÏL¹XêiiªL`“‰W³!™5ØÛx..¶}iŒqT!V¦b à´9:€°yfÀ< #O1Ϛµ8*÷+vîó½h¦zt JŒÅBÊý=5¨Ø̌¤Ãç "ÆeNYS蹡‡1°H”¦Á•QåGœÀÌ:ÁñU£‡¡¬ƒ–¢ dUŽ–ªœà†2~zîÀÞúi¼*f6§b 9y“¥Ú"e1ÉҜp¶^yO=~ þøܪ¨ÕduVÛÜW÷-°“³®,À҂856Q ÖÅÑì)èÎý8$ EUq§Ôl••bŒ"›âÂg즢HøR1t€P¥%8[ÔÐìÔÄs=VfŒ3ž†KZ¼âéFç]4ŽQ½—²ÅKò™BÛ8ÛtP»Ö4Š“…•×ŸÇ>b¢Ò&½Ä [ž$8wÙ¢¯i, £4N -Cœv&²LÌMU³cÀ~šK‡>¢¤ÆÑESÎ[¶Ì¨.]&%"O Õ/OYçÏQÊÈz¢I;-Q !˶#5et°èƒÁX#PêœĽò´.¶¦†a)0*Plڟ*~ú¯Š`FUúrÿ0=’f)J -¥„Áô:æj– …5{&‡aìÆQ;„¸ø (2;]èÌwYœ·L¨#D™|2£Ìb@£­Øtøì‚Ùß_̳ý1µýÍd?M|ü‘Oî œ5n•»øóšÿxš5Š®¦?†Q™ûìÇaQgM~Œ«oY³å>†L ÔJŸúzy Å3CµE0aM|  zÏ*ï1 ÈLyhiñ3¾¶f=ÆÏìZe=æK*Ðl†šsMqœí¼l2Z ðrMx [. šï8`†íÛ¥;ö{ŒÁ³#ZtP„)Ñp[ëdÇ=•i|qk+0ўê8K±»Êtk"æšé9ù)’ÔDÇÑ|ñëLÇôôiÂY‚  -â#5Ñq²“v•èpPM+dyŽé†cËs 3r„>Í1,!ˆüõ,Ǽ̩Ėä˜è€©lr ÀT&5ÅñÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc§@¡ 8æßã oLãóLº1SïsO Þv¶1º'‘ãa´1d›iD£±°sb%‡¦5ÁÆÃüïä•ÌíTc¬Ú9™Æܪq'ÒÓôQހƜÍÏgòŒY®VÊ\[_þ,v ñüñŒQw=çÄÀ’‘f X)XÌѨ•>YÆWWìiCý>ÄȖ³¾<“ö$È™dê7Ž1*J/õ`4éõ÷ƒú½ ãïrí cìÃÂo!Œq\Ô˜` g uÀøʈ¿5jn_ŒsDzы!$ÃÕ¼˜%Âøt^Ìœü ^¬yR­ƒŒì@ú > /–äÍ4ã„7PñVŒ4¾Ô3ÙÅü›ÊË{ƒ IY‚]ŒÛÀN°‹Ñ~ -ï]ŒËnBÄR -ªûµQ‹9‰£Êf#Ëz÷ Ãp@C2XvhÌÛÐÅ|o&¸˜.d¦ËN£Œºs‹±’@©v`‹º jÉZ%@+³A‹”'±˜k§—/Àâç¶ÌkåÈo+pŏg¡ ã}ƒR|²AŠO«R ¸~8Å`;@k·!ŠOGՂPŒ’güRŠñ÷!šèD"3l@ð‰©žowâ‰áUÀÏ_éÄÄt•;áÄCùÉ@#Ž´Æ†&f‰ñ¨A&†t -õסSï.øظÄÈ×B$\b ä.Õ*P—AÌà¸w*1]„cŽPà" =f&1ñ÷%ÞõŒæ°0ˆÄ̬@_) qïâo<âæq3pÄ{Cµc1<®ß&ßÀÌ*Õ; {R -ñ»+7£ž–3c¿ëØAĨü€üHb6NÖ ¥¤_²–•BLžëg’P;Þ~ìTõﳚø´¶5Äø%ÿM>«yc+˜å Ϥ³¨™`6ч‘<Çòc…£¿]O²‡QÕ®»Å¢L5 ;wð0ªx¿Ì>Ù5xù‹¿ : È4f©`ãoWZ2’€¿Yªº‡‘ü#€ÃüjQõ"`þ¹â†Q,ˆù*hï•©_FßΦ¢ÓÉFÎNB †2îdÖ4| °†áõÀÙ Î0Æ&NŒÆ¿ãal”áS€‡` #aÇ=Ãgg# ÃȏÌãþFb+øÂUú†‡F>«ÙÂÐâû´0À4à’ldaä?9 , i%¤œÁîîK±a…©³8zR…¡y0F”ÃSc_ʲ3…±„-Â\8àlM”÷ -†j®õš@a?Ï3yÂø›³ÝŠ®ð>A® -1Kû´s' £ç%Þmƒ„‘Ćkáfë†FÍΗxˆ)tàñòÎÑÇte£ l;¨ç†Sl‚ðÁ7¡=oá×ÛK؈ÂC3q⃡èý|ˆÃ—ð`W&;øP6uG›h—ä`Ü¢>¹Á‡¿LiŒ„C½ÙÔËR5y‹…  ð/æ$#!ÒÇ?â4í¼`k¿Œ" ž¬àjá6ñ"§Š‡¨`nÔê$#Эß]@Á—ƨä$o”à0$øQlÀø_ðWé+-ˆàjÇ&6ñÚ!Áù÷ÊcàQá„ã&دÜ~˜ÇîÉjM .§õõNåe*¡ |p%Ðk¢ŠÜÚ½£ñ½Šem6ðwøYÑk >X@\ÚF9,e.Á†Ö®D30}ž;HIˆñ ~½7“ Ìõx{ãEâQ’ -|PaÞkR1j0°²QqKé¸ø [Š;>Þ À"••É> ì $0‚7íމÀˆQ#f@`hz°¢1£_–‘A……RQ„0Tk; ¸º‡—QÀ¬ø&Ú@*ü Ïuã@í¼’Œd·¸L ž -­`8n ž·ZznÑ!”Dpgc‡1À¢K"€yW.Y¤ðEáµ 0” -ƒÿ‹'°tåÿ6GØÿÛ\ãô_äÿ© Z*ðˆêF6Äì_Hš5úHaú{+ùþ F ÿbÄC}G0}OD°ó -þ¥³ß¦‘yïüoàß4ü{bêèOrßÝÜé#mðيýU£“«$÷·P?d.=×_ÐK<—3 þ-Ð^Qhà_lG _€ÑKóíþ¥¹˜ñ.!1ÊÉ~ ðoayäYßÀ¿i<¦üzO,Ñ®gri¹ËýÆýÅëIx¯¹¿Â¶šš¦ •u¼q‰‚o÷“Ü_ìÙÈ î/Q¶WioÜ_šÙþ+¸¿øûûËÿ}¼aEûmmby÷ýLì/ÿ©øŸ&#¬¢F·õ‰ýeŒ/I`ù€È£Û°¿ÈT‰5lì/îÕÁ~́ýÕ+5džýe†®ŽIý%f‹ þ²}ÀÃDçJýÅ/Ü'Û šú‹S:ˆü ê/ -ÜÇNý-5°‚Aý¥J«º5¶2XÔm=õúË]YT4Lþ_ÿ þÂRîÐ%õ—´\ÐÐ_„Egê/ã‹ã|ƒþ2Q§ïÊÔ_†„¢6õ÷yý?âlÔ_`*ڙÌ_ð'k¹&òÝÉx¢ñV¦ÊøËÍÆ9y¿8Ð;ì÷qƒŽdý2è¥"ã~q!œrvÜïóø›ÚïSQLØ/r*+YY¿ˆEV…1å~Sw3I¿ø»Öó ô{cÍ9)¿·]¦„ü2kr=oŒ_Ô¯Ÿ£LÄ/cs -7ֈá#%pÕ7Ä/¯ºe2~ùøøAf¹¦Èç†ø}T“iÀ/â`Ì7ð‹¿ÎYù¾°¡Š&ð¾8Ý Ó}IAEDy…ûªŽ‘p_æÚPKÃKëĝîËAm¸£šJ‘p¤ûòna@ß辌á#¨t_ƒõrŠ¬7º¯ò?ýJº¯4óíNá€>»Ñ}qÚìt_V¡4辸”[:¢ ÷ewŠª‚<¥ŠQ؁ÏÎt_Þ ®x_Záaïˬ=‚݁÷…©‹ ï kP‡jÝ/ÑeïK³+ޗÊÍë‰÷ewŒÁ÷Åh‚õÕÎ÷•–$ƒ_¹KBÍ÷-Õɒ ð +×ø•äS›]¥Ñ¤eãûÂHo#ø¾4 D|_° ß¿ÉÅ.6àW}ô%mã1m€_XY9€ßBvkk ø¥cïFø•õ~’ð˱ú҄_Hßß¿ìak~U‚šv~Ù¶J8 ¿j¦vö$ü¢§ô ü22E坄_ -½Ÿ«$â·tC—øåß|¿WÄ/­½&áWzñª<‚`ó=ÀÿáWñ¢t•$lëô¨0’„_i¿{'üÒÿ;«†>‰UÑDîN0~Q'@ºÛÎø…¹4}Éø…Åӗ¿´D¾s2~KöŸ0â—ÇŠ<¨Y@ 3·!~q¡rÆñËɚD ~á±þrCüR›ÅY$ښ`…£¶&üâf\lÜ°~!Ò7ºØ„_¼cçhç$ü–ÓK¬ðË"!º‚Aøeï5%ŠMø¥ó®– á·D> ¿´\ÖÇÈôÑí_–gñ=o„_q%ʙ„_ ¼¯‰ÿ -¯^ƒ{ì„_ZñáGš¿$üÂÀ‰k#ü2 ±"‚ÎaÜ|~e}'üâ÷ÈÛ Â/¿’£%à“ÇqïËLßyäû2MZJÂ{1BÝ -ÀNÄ/†;ç9ia÷À߁Áçh;ßÆà Þ[Û0Ã#º/DÇp2W¸/»*ŒÌPÒ_¼ þÄh±‘}Ǖ 2/ÃyÍìEgaf6®/!¹÷6ÙÏ{Æß+Ö7mÆúޞžƒ× †-–·Õ÷:¥ÎLš¦oü½"}Óf¢ïëü/¨YLô½õ]x¾·‡Œàùއ†¾ÀùâoÜԍ拝¸<7Í÷¶Ö%`¾÷¡7ycù^np(ßË"à ùÁ€ÌÀò%Õµ·äøòoÁB¼i‡â #Þû€øâo¼4ÁðEPœßá{NŽá{¹5M|¯eø"³‡s~/>A”¿÷ŠÆ+¾X®!ЦBÂX'õ‘ðÞQ%Œ_Ù½´‰rÌl6ö! Òä^ДNõ¶K)&¸cmœÉíE~qa{Ávi£öRóˆz^C{‘1V›C1{//-7d/{ß²WÄÞáuR{q Þo¼^ž ˜fÆõ¯ƒÖKDP+¬—Õnx9ÍêeM”JFõ΃,¤Þì^jPot?òë6§t8€é½ônü.öy7H/Äh\èÄF^Aè%Q ɶÐ+Êá|^ü9X›,>ïmeņç…ñ—x^¨û¿:/pÃV78/ê&^Ø¼X½²q‡«§ãï•Ì›6ƒyAËÕ¤$ž – Ëû˜µT^,ëÔœÖ -R"¸Ò_©¼°ª½€bb¢œwRy¹Záô¿Ry‰œb£ÞðCŽPטÊË-H÷_©¼˜ì**/<Ò*Ž#Ë*±ŠÆÃߘ¼XvÁ+&/ÏéÐVª†q›¢; &àcœºœÐè^¨yHHÁPpµÉ+£ÞÉ䅁Ã]0yi`³ƒ•ÉK7'o&/Ap ƒÉûÁQùœ>Ì“ÉË`Š"6&/­Ì"šÉ«^½ÁËÀËAW&/ã.Í“—Ü ^LÞ§ëÝؐ¼¸t®þɛ+̨eE„” ɫƘòtˆä¥§Ý3|8Öì[ôÐì@ò*~'àoUÛÏÁab#ò2‚…÷3ˆ¼Œ1`íD^I0—lDÞt-Mäå iQƒÈô‰‘8[‰¼«µº7ðAä%%ƒ×Fä¥Ê¾ ø*|©ÈåJ"¯P õى¼T>R»P¦ò›Æ òâQrá´yQ£‚Õi yQfEÖµêÙojÇñBY5ô=Òõ†O‹Ñ!`¼ŒRu•NN/#*ã®IãM1mÐxi`G«µˆF²ô$QäqNÃwC\Ë¡y£ñ2$x>éú)¬3l3Ž—Á¬Rv/¢=¬ž4Žˆ¬‡È ‰FX;¢4þ„ñ¢„ªOÌUÅ ØþÝv/lèéúYmÖïäð^þ.6 /TvÈ?˜Â‹?Ñ× ¼P©a¢Þ¼—Ûö‚÷BµžIàE$±‘ À{9ØüÝó(Éߎímø]@žˆ)1~w8hô]R¡®½Ë&1P½½;Õ îîp¦qÃîóƒ¢è Jú ê.N½©Aø„î²5’vfî²F½Ü‰Üí–zmÄ] -ž+»h!‰ÐSðv=ëo«Q|âÛŚ ©‚¶‹¿áÄo°]¨`ÞÖ.ÔYÈ jhؾsvQ Šèv`vOԗ&cZ¬¸7Ä.ŒˆÝaÄm” 9y³ðþìʇ^÷TÏÑeŸ×‰ß;[¥ô”©2 ².ªj(Ù^Áº€và‡‚«{º9p`uQ„%ñFՅ_QPuOO:Õř4Ãù2… Á;¢zFê"Áy™° ŸL…¦ö9€ƒëåÚÚ@]¬ðÞOUµ@pm8ݧ8ápáãÎLӅd™|½¦ #†Ý`鲦èé‰Ò…Á¾•¤K±öy&H÷q=8ºø;~(9ºL l] -úk -7FµN€]m]Ô/ö6)ºaŠÑ}GÞºÈJè5‰Xvs>´¸¢gÕº3ti½ÕÄ^ТM˓ ]†ÒáÞn]¶JG¬1 º˜÷ö ˆ. ˆó­Ýy°}_NqPtY´€`ÇFх«/‡2fðÜ¡ Šnæ‹7Š.=4öVºf g¤Àè~ðìfPìctçºvŠ.B¾‡Álñâ ®‰+v‚.j wCS]Ü-¾ÌÏÅ~Lælø\Vn6ùߤç>À (.csŒ±oð\UFôºlˆ¾]x哞;M+>—>ë³ãs ê@/®Àç* _Jòs‘$àp³ñsIKéìh¬öq›àç*¹ Ñlòs)º@µWðsihâåª=ö)|ïŠÏE‚O÷Üø\‚Y h|.¶àmÚð¹Ðg°¹}às™dÌù ÐÏ£pÈÐь™ôÜ ÎæÅè"×eèÂÚI%@ü%:AÐEʈ!¨ KÖ®AЅn^ti€Âu#蒉Ô®æì(HRòs¹Ë~V~n9íÛ?eÁ\”?Wýà7z.³iEþ0•Œ<ç.ÇAý“Ðòýž «~ÌôÜB(P{’žKÂ1=֎ô\nÆ;`z.\„‡žô\$'9Ö=ϗºÀç¦aãçN«º8<ãAÆ-TQ׶t‘Ô¥§–›U/€ ; +@7­Ð-¥ÁM2@7_Ì ¡Ëìì3 º,¸F=ºL¯U•~Má ­XÚC—É5¬k‚¡Ë ÍC—¯=Ö´d貘)(3tù¯X‰n]âÅàJD—ÉBu_¶$xÑpè@}ùxªR¹¦è2Ì´uPt¡¼cÅàNÑÅ—,0(º$"\j$KŠ.eh˜•7Š.µ XFÑÅKÈ6`;Ff£K Mbti¡6oÃèòˆý6V•/ä¬ã Œ.,Œ‰­]ú¦LÑ£KˆØuÚá!›*9„­VŒn£Ëéêqw[=IÜ06Ü0º0ëõ2F†£ËM$;Y1º4óQFW¶Ë`]Ñ-Dú´St©¤T (ºP®püHŒ.áÕ­Ù'F—áaVvF—ݳðqùðÊWŒ.W>Ç4>)$D7 CwZ5B›’è¤Ë÷ðƒoþGX°F‹… «âü’]8û\­?wh´Ùñ¹C±Œ¤ç©Éž{Ë/ØÙ¹/ã%R® ·J¢“œ{G»Êœ{“‹¼ìs±ê*¨¹Ö²îÔÜÛéSsÑLE´÷“ªN¬Ì\h̑ß53á5D;F[-øڈ¹0 `.bÇ¸\Ô`¶Þh¹Ð£+-%X.þVFJ°\ü:³•Kê0:í• Å=^Ÿ<;7)ßH¹ÌÇÀ£M jrÓ»è ´À‡ÙÂɅ~Ð* ¶íÑàÜ6Øp}%äÂß@ò'¹ìÉw´äã6ˆ0÷ŽÇmÖK$òw„q³&„v8.¬˜±‚Ûܼ Ù¸­I•µ£qÛC,Á¸HÒ"ªo Òálƒ±bqûca©¸ µ=-¡¸p¼2q÷蓈‹ªÍÏRÒ Æ6.ŒL‡‹(†6 W±”g‡ážk ÷tcÂ@áž1-$\èe½7à ç†ÁEؕ¹6Sp¡3x&5²X3o\äékO.þ‰#ø·ØoáÆ¿…L§ºÍ‹6ѯs\A¿…ª¬ -;á·¸H£û7ß‘£¡Võ%œ‹]Dø„²d²€éô~'÷vy°ao‡[6õ6j«z; Sؘ·ìjÑz"o³@ÖÄÛæªîx %b SR4n:{ðn÷Å »án è(OÒnO·– -Øíi æƺ…1‹@݂×o-H·ø¥bòm:çÝeÁ¹…Ï¿&0·¨ëo[ê# ­0ã|GFÜâ.àýÚ·0²kŠ· d"l|ÛæÄËÆ· `Màmñ7â@ÆÛâO6º-n œÕ€Û¶a„¡-͘ƒ m‹(Ö鬤YU`[ÔXáSܸ¶,~@ÀþŠ>0 -ÕIÓqíLÛj!˜¶øÁÍ@Úâod¡7¢míZü%жûÏöäô†³E†Å%e¦±ŠpfKÃ}î,ۍȎžUo˜;áEÉ‘'D6’íòû2A¶]!·äØ^êý°clO…דb[<§b{K/½1lU7Pa{ómžۛ¤Œ7€-Ø„ß›_{«dÁôÚ[š¡7v­d?‰®½,Ö1¹¶º>j'×ñF\kYlrk)b~ÇÖ2œÑ'µV3K2k‘q-ãY‹˜÷³ kñÞ²=„‰µÔû´7`m“—¼ÚêÙ;pµ¬…>ûN«…d\ɪÅڃxÂ@Õ՚¼¡j_Ï ÷$՞Œ%–ÕjÝÓ몕˜ë=ƒj¨to)]–˝¤ZfûOY ï/‡¨ÿ¦!}p¿½÷1õòR7Iµ.à -Pmp«‚S‹d% +¦+{¸XA©EÅ8ÜـԞ®Gܵ éEÍR`°6µøûÒ?ÏÕÇé|ði‘±DÈ?ð´ä´Œ¾ÓiOxFp€*ŒˆVÅù²‰¦½K¦fiÄڛ÷Až`ay¿qia¼˜å<¿‹r݈Ø≲ªJ‹:fǀҢ.ˆá3o„d]’ö¾µ2$-Y¬÷•¬Yz0ol@ZDñàŽ„qܒº6þÞp´a íåy8(³Ð bIº±h¡ edÅÆ»(’$Úü{ц18´ÄçÞObh¯S¢B mš–BBæZ-‰sê[¶ø§ŠÙ‚@{Y¼Y¼êM;ÍH3®Ò~qDö3}²½¡Þf“?‹ ^Sl’!þ]GÒg³<Î>‹@¾°`ÏÞî¾ìÙÛÝÄ7ô,ƒ¤ý ò,3°âÕrVd†¶<w6˜I½o7 -êìí/r‡Î‚3Œ7 ˜³@Ú" ÈYü]¢žÄYKKàìƒE‘ñ²X=¢jžÛ†›}fW9–¾æ;FÀfY÷RΝ5 @SUê9ÊúTH¤ÙÛ«Á4{‹¦•˜Ù'=A™eeš{éL-2iÂ,p5cçÄÊÉ@Ì¢ç4œv"fƒä¤Vy¿T¥€ÙyŒ•/{GrÓxÙÛɞ€ÉÆ'¿Áe!éTØApÙ»è&2öê&ÃmhYðUH +R>ÏäÊR-}=oXYFö ª,Ñ#.G&Îá:fÕn -™¯cî -zw(ŸDٗA•¬Pv8Ɯ@ÙqD¥© –Ó°"e§QLÙaN"M±ìäB{#ÊRlÃͼ˜@¹M@öèˆtWˆíDY(íUWm ,åùŽâÖb -Àf*i¦Ò|0ý8¢Ñ%Ý)ú%{Zà(YäØP@$Yʖ˜w^I²Hlbõ Y.¬¼Šj «tŽ9Õ(˜j¾¬MîUB¬ÄÈbÙ¢˜ÜJ‘íX²—:ï8 ª+7C¶[ž¸!dÑ%Qgî`dž‚ ûîÎ|þæÓßdÿnYvëb£.¼˜ÓL1„C¹>©Éay”4¬Š®Zæ,W`4oçè OÖOܖKŒÇ‚täOŽÌøc›Ø¾N5¥!¼ªäće5žòÀ%uÈ`muO¹ -ŠÇL(Znsá±Ü\ö4÷]Ñ閴Ÿ&A«&Õ|ÀñżRCò'À4*É)|á‘ðÀ«º9“O^ŸºµD= úf§q•ÁžŽç ]òÔy.æªÈQ!·ê‘EIJØ –V–])6-®³€ÁmL°æ…dÿTLÄÀïlʀU›¥R΀à:$SŠŠG }»§\l%®R‘Ÿ"‘€Õ^ê}ì€åP¥8úf;Û#aƒ¶Ö#è0¨ ­¯IŒe&._SÊŗú8AèZ]Eh5e¹à=<þ›rZÙÎý‰Á‚“¨V -/X¸RâO²?#,#êäÔS¬é'YHŇÎn]‡›‹qQU/º¨„aãxvµ„öW ›!í-,R#â~â 'ÔúŠÎt -ø›îŽ¦·këpùÀç¸Ü»wWÝÌ.tYE ˜ßkxk´”<[x‹ìÊ)XV¬K½õäJ2ðùr¡Žïß@ååÑøn4¶…¼«¦O´…\4.·ãhjs,JžÙâúaçn7ÃÇÃ:>ŵ I"Rú0z‘–ë҆Œ7À`xeaÉl^yh~‚™>E B-4V–&ãC¤%ËçQƒà?̒ü‘IË=º ïqMìf²"ED¨bÏ÷JbßN7žSäZ¼’w]ë ¦™….˜ã½á DÑÖáìõ¸÷Øæˆ0Û®S;)âÅ ÕÑ¿±‘†‚$ì]#-|GŒ’~FÑ3B,}2$ЊC…/µ©ù#Ûo@d‡=µámF/;aE”Á&š‚*\87@gÚ2 ýM† -þ,y‹ŽG”¯Bh²÷S…qì‡*q†“|äïã±°€‹_tvÁ¹Bò\X^,Îý(¿à«,þI,˜ Óƒã)î ÈhŸ5^,Û{æaf§Ã«jµD çBhÞ ¶à‰ñ`W•Z+weU%ÍÌÞ@cK5Çåt;,·zCTQn¼kŠ­€Ø–Ë'vi~˜Í܈@ ¥(‹ê±¬Š,€÷M D–%Þü¨RÃè¯$ñ9ÖQf&³fǟ:L2¤Ñ@=G¹,-gnÔzè.3^ì!‚4Äµ§—Gç™± x/tµáÂDOB¶èÁ1oG©ðޒà©Ñu$Õ`ȕ‰Pä¡G¯E 4Â|ªðžñ/¿\·ÉÌâVþ¨8÷À}_.W³ŸñŸs9t ƒÄð ]Åf,¥º¬–HE= øà!X€…}$ðˆ ÐB^À:.<( sÕÚky@%?}l2W=‹+E1‚^"ÇÍėà+ãJ[:“”›Þ®ÿ>½N±Ëº|Zø()‹ö²›Ã:£®V,Óñ@ERa—æ]Gdü¢6¯qz”¦o–ÂÁ€»æ4O¶æ¥#20Èf5ÁÂ29nCU5ªŠ®+•`ÃHv4K ˜WÏWà4u±Ü¢ö¥/Í¢~Pœ}@»¤j¾G£qæ°áÈ&wÊÝF4«Ax -ÖXuÄξ͐5–hàvqrO-·±æ-öäj ÁFØÄþÖ³á¤ìK½-ëa -To©9ØWWµäòrÊw\úžo%·iá:üºÝÒf533\-wÕeè7TýÉn@·ÁªO,ç\7\ÑHhÄÐðÖ+z/`p 7œôúK±ø²uõžv8^²«W<¬©ð®@βÒîS#•zž^•&ýªæ+R©<ŒÀ~¼ä} Ë<ÙT’:ÌîDϔÝEwÛ‘xY8¾ -âpWªÄCŸßM/á=¸>¯tü kä°~ìÕ÷mTé0›;˜]ցëóîB™ƒRÌ­mqB¬+);7D;EN–W¼G¶´]}ܔ¶•ó‰ÚŠnŸƒÊQœ(‚'¿r¤¿*FÀkˆ,C†LfMKÇy“»2ˆ.bN–O=ZñJ©“È வ‚w ‘*šÃ%³¸bÐ$([¤ÜeèöR‹Öu`/^ÔÓW`o LéKÌAPþ(̧é‡Ò -ÃÇ ÔèÂëÝŨÙ`ÚmWe!r€ÇÊê.ï:ìÊpé.óS+*>=ŒïÛëPøm”j×ËM¿AÇÉe ԍp/‹5ñ(h ~¼õî0q«J!1zb8T#¸*î8„zìxGþÃò·†©—×ÍNù.’¥Š]£Õ³ç¹«ê&ಠtó›DߑqÃæx ,xzï…ýW?è.Ñ;µü"ã·Bt&r@J3aTÉRÊæ/猻Æqÿg&ç½q0U€7†> - ‡`1å€+ÌÜS Vž;Rüš³óÄ]]:BýâÚŠï{¹ôș+BI´Ê#°ñòC܈¦v?9ƒ³riÁ\÷­V{3Š ŒN½¦!Wvѧϛ©›³Ê è~Ûaâ3Òÿ kwrŒÝJšòTz?, æê¡Û*d†x1ÝN Ù/D󼘬æºULbø[Ä&œÀµüï†íÕfÝJÅwÆÐ+bky½4LÈÔvÏÈ)¬ -mÀ“Áƒ…9QZ¨ÀD©Wӎ|Ž¹'•÷۞„ÓñŠÿF3éfÝ@îH?¨RN‰È^pÜÛZ½PÅupˆD–ó‹®|2¼£ë”Æ«2»©¶Ö\*±äYô}Â,©¯’f·–»ÊÂw–Ù0FÿpDyè©W:hp‚‘š—z†¨…?Ê'íÔd é|è|ñ/ÖÀᒍòž®úãg“˜ŠZ D%ñä -U”Ü ×ð®]IçuŸfíFS@üˆªóÊôrÑÌ3ß3±å<øŒ(¨D‘óR‰Êa¹{H`溆fDÒaQ»´ÝÀ -¾õJž2÷ä -fFy,È+`¡Ë…¼P–АU6gâ·%Ôµï_9"Ø/áspÝπ"c](ŠFDD1@Ä_ „gЫ‘d Ã?ŒŠ†£ ‘l àL•É§ð¸´€Y˨}îI ¬ r»Êù4ÿ°¼…–ìûP÷¼¯äˆ] -HŸü\Ô\¦x¶â“¾B›ˆøöˆ\á°ìiÍð)@V¬úA´³j„k[.j/#ë@Ð_¹2 ðxJ‡€i°{Ï-efîɺ’JWñX;i°8ÝeÍ,cö #ä™&DH(F¿bÀΛõ(5h])nÀ©=Y†ËÇY}§è1±SïÑÿeœd"ù¢†‹«…°RNƒ|›Ãi1XÎùqÃ|1;p«¢˜ÇRXýæôÀT\¿µgÍwˆÍ>ð~§G êüœå¸Ãw„x¨b •.³2Ç<_|™:N!ðOjód͓ã Fw®l‘þý¡%" £»r zÍwÓvB»àX÷¥ ×®l¤xW[êò•Ç{UËãŒNW³h&KñN #tœ*÷µ£Ž:~H¢Qp?ûY\\Aå¤è1áT‰$«Õ_´¸Õ·e¡üx=à6³ ¸fô´n×mTʚ«6dÿnîh:cþÊs…õD‹võ¨¾5ñõ8ÂWN(¸Ÿéãõ4hÔpj‚ÖÙÅýòœ¿9sGÍ \Ê9ûêç.íHXTÓKŠ‰aÖÇyKÄS)Ho:Vþ&1HîFNÞ¥s¡EQ%^ÕîڞJ¤î7ÂN¬1äõS`Ö¿Ñ[õ4؟#!(0²<³€V ÒMº'K_LãYò7cÔ~–ßìrÁ‘c˜§«÷î03®’:s¦P"ØWÑ«üˆOW{ɃÝö²Îàa}“Q!˜o6ÛyTz !BL 1§‡M”î{”R˜{²¢<¯ç<#‘òHéWÌ{t0j±½«µ¢0»ÅؐsɑŒÃ;Èޑ2ŒÌ'ÜǪÁSÂ-t¡0º }RGЮŠiúÍáæ{4«ãoۗ1ñ\à lX֚ƒªì73Òx§y0 -³‘PWkë“h™¿z¢¤¥&¥>I´Ì©ìX6<òÂíµiú & a«à×`5SÙõˆ¶¦,%ç]CŸŒáJü0„R¢Œ¹÷ÊÐ/œJñÁ÷áëS\£mBeä>+·³…X8Èå®j‡j%¾pðJÎýҏîK‰e™© çÊüõfk™ÁŠ¯CA)v„E²ô"4 _\C¥’ЋDw =rÎ(æ_îÞ çk˜évgf„®‡·“ \%¢ºo QeÉ(ý r.ƒO†F0Ϙ -$ÊLÃD€›«'…3sQ碈ïÐâóeIµœ°¡'Jœ¬ú§bR¨ µCS„i£\æ=– &¤•¢µr¿`¤0ýI®ZÓéª -ÇꉬBoRÆ¥£³ÁLC×w|ë¤PÆeBjï`[ÕOj¨Å¨—_Þ¡»æ·r8 ¢ùÁtôa -fL^°(VK[wucƒ¦þHMS’­uQ›Uz°¬ ÖáE½9šÆFތ’…œ}´«ðQ\|ûRÙzñG µÛ81V´³WL‰xze)‰‡À9ÇXXû>žIý9sÏmná KsF/ïz¬²Ü_÷0eßôzémPڍ~HY”0èJ™å:ÕaGMuŠçý%|•ò3²Óâ!¥»Nnøê†t³Ë*ê_ˆç:ç(& ä~š[)5s6žÈêÄ̟{6ãwÅjx윒ÛË%Ê8ýp›Çб¢Ÿ—ŸËe/¶”èß´ª;>d$ÀæÇ*Uöyvf6 è -/XÆÕy˜æNéN5æúvµè’X'TâŒË–k‘PqˆŒÈ! lë\¢!0,13ئ/²-µð®á\Á‚ú†‚*!•¨ÀÈŎ5 5×ôßÉ÷ddžT2JÖØ&ÃÁ¡¼Nª1¡5 n+IÞm†—éˆwÑÀ=kÑ%žfæ¼YÙÏ0c‘C‹‚§ÅÀïӃ†;IuOÓ»E«1ª§(ŽþN ú™?z¸;U?¢`¤Åêïƒ/ö9ý´?&—™QNE¶‡ÜëÓLÃÁ1øy «ŠšÃœl–\ê;Eñ,}ìâÚ)j®SK<½3àêÔhÏM'°Ùiâä8—ÜÀÞG@Tˆs 77:1W©¸sw…Á™QØn-ʹGa»eµg4•ÄoP‹reJA[(v`ÇKÕÔÇjî"W¹- ÀÙµ”z+Æg^køÔљYolÕ[MåIe î©tWù:=! àÌE H¨l>Ü#Žº›vÍ]å N‰2cv[i®¡£¥X¬À¨õ÷qilC‡ìŒ‚m§ôÆø\IÑ`ŽµÄ¸¦ZF˜¯” Í{¤gW&ã8Í?ÆØg(•«^Š`mͱ…”CѦ“J - â¡bb:Tukej€\É036áGXú½„ß”8<,êE€+I -±ã'9äÃrå“2`ý‚`ˆ×±xŒ®¸Õ¤(<Ä,ƒU±#¢±E ’S¬DÑ*ÏÞŽ4›¢Ò’$»,¡{@×JÞ ‹Šúï̸fQ÷ÝX -ÎÈ]m¶Ðkfí 3‘•›ÜQhÀæxqR–`I& “Î9¹6Ý67ÖrR8ڝ n•²@ˆœBX…Ù©ªÐŸÊJ$9”Š‡²®\4éh] ïàŒ2X ‹¦ÒËAJN&5½9˜9•öîëÄOðí=œžH Ã2ó”—À%ÌWR±[ôa-*A©yé.ÕӅB£W=(R‡õåh§‰ ü:ÁXìé©ÀÌ"ñ+ú÷!ÇI9ÓåŠ-XÔÙµ m™{JrE{@¬+Ôݵ:I!k¬0§Æ+É7O«Ð-Ò³"ÒWxõª˜µãK½UîÍÅ×?õƬcÐäSU³‚§¶,`F%ÌRâÃòØ"µNˆrD”6Ô|‡q—4Ÿ§TuÞo»ª¿2?µºÃxV>ú1ëyª•@—ëDKô'ù+ ý*¤™,j„¶˜Z•Kµû -­0A™|ÒÅ`¾.+à¡pGÇ$ -­¨€oRSùX÷*(.u£rOK†&©ó*váÑÓ]áJCñè»MŸ¢§¢3XÕ²´Q©ît—Ÿ 9´‹¡^êS™íe÷Ç&e~zŸ0ROú¸7“<‰€Áâ,UWõOîʲ`˜¹Îd¦€¿‰ ™ôàô¢=¹*ÎñZ—‘e†¦ óü)¬gç^HÑF*å@»õò²k_Í.˜$).<üŽ{J਺yw¦)ÅM¦&è9Š\.÷Ïü>²;ú¯;'ãÃ~d±ëÚ$Á&©.…UúçË$a†)O¿ -êUMVÆpQFÆqæ#DÍ6°§¾IöŠãò|Ùí·©8,#‚Û§ X¨ëfµØ9 ‚LŸá³gN„¿z(£Ä›É+s¶a±c3ÔÂ|nç`=kÞ´6ŒDãPï»Ï±#)gªâ#È¥‹¦ÃÅ$f„Vè¸Ùç ¼—¤ú<¹«<¶T9ÔÚ¿ïz8­Z,º¢åT(Þ¥EŕOE½¬sAê*ÁËÙü3f8®™V +&Cé‹=ÅUARŽ«žbÉSµ饒)ìó‘r‰Î¢1*8·C¤åôC&°€»Þ£Ì]É#£™V“³&,výhsµçv_hӐޡ.4¨‡wd0ÆqœÆ蒲Š÷Š¬”f+óäQ¨;䎛0Ô±ìه+>šÞúÇ]raáâpÓMrþäsM÷ÀWĬc8_'±EÑV3`>çš]qÃ¹àêNS¾8rZËŽ7Ê3rWQÐKy‰ç På ‚3!ÑÜQˆfŽ­¨`Xï:B¤Ó-~»ÌÁË¥js0â、“<â’ì)ßܒ–k¾óÍmZq“´¢ªn\J]µ²Z4º,E>‚ð -¥Šœœ ŠÆL‡!Õ§Tv ™;uu…{›!‹ÄBå—+¢Œ>\¢bÏ~zS•¬òªÊB†Fq0ödG±§ñÓ\ŽÂžy¡¨‘L$¾e 縄æ°°³-&[F{sWQó àL {´ ¤> »Rl Ëqç¯Þ#[t>V£o!Ü+äUß} ¥ºtw™T½$oW÷0"òsjaÙ΅܎+ã!¨ÂЏvU=Ce¯“‹²dX˜¢’Ó`à5(xô܎w¤+ÝÀƒSü8¡é=Oc`xcŠRĮ€• 1ߦõ{¿°F ,ÖMtÅÁ.Br¬ö"ˆ²TiAP%ÁPn´6¿ÑÛܐłâì\6§ù1i¼²‘%£²êÙýæ2×Î̆wËaÀÀ§¸À­ o—V"'è–êUæ\e'߃ûþՋÚMBjüåWü2¢ô—Ñë:¬'à3¢>V}ýPv‚õ8ÝÂøK¹5u*’oHހ3 Ÿã5P„ÙÕ"ݧ‹p‹?3Òÿ+ òaY¤¹¹“8‹,䎃 ­g{敒ŠF’ò­;¤Y -ŠG£D‘^Ãï}^¨rþT’ã†Dބu¿Õ_ŠK!¢œkª ùАl Ž zUªQ8Ê£¶¨ -xù,ý7åº<&´.ÑÁ€/ "^ã–/Ö§/Ö܂æS/îíGEÕB“ÔUò,j<"£”ð÷$.½-ˆ€¿P†¹Mö¥§+̌>'Aº‚g}!…šJg_?‡G.s±Ú‡’¦fñj‹í³X¡RjŒgXò¢…:êÊ0îJiYí b‚f>2H1æãIp ­ñ"°öPxº–RR˜ª@»¹Nø÷Qð¼µj©–¬@΋…tNÞ¼nYJá—ÛÆe"bϤsSéÖ,±¥eg1S½SyošÀ ӂ–6=cºÓ<\t)P‘úB¯å‡Á·_|°„ËGçàEWé(»ªÅ¹ BöGÁú™M¨Î©“À6%׬µ;XÃ'éáF;"ç¢aXIñÄ¡u=Ώè^ªó¥2ŸÕ#'Ò?¡ ˆ‚[4Î]£•Pü†,ΩeÀ™?ʌT1Í -¹ÑUÁt©,CYo@/áaë:‘qeˆ2̍è÷ˆà2⪪xVëuWcó -ªÊhØÜL]›k*׋~âÞõŒôauF¢Ÿøpï‰Æ° ®òJA,~”éÂîh،ٹy®·•1øºÙÃá°÷ ñ]hõL Y®öa5èÿ³" UŒ{da9TÖà†½lÌÁX'ÈW×R€¡ü\‰’ ÔÊ '‚E¯AˆV0{³V¼kˆt`¦Cˆ4bÅ}v¸ ßx(ÔÊRÍ(5Ìž~¡ÚÀéîÆnL5Ï|1ø?íP½‘RÍ(æRÖ/Ɵ—n÷ôٔ ò7U²¨â‰à›Q(út1©èõï#®©|0!ºF/*¼há W×N䮢Äc1%êè—ÛÐT¨VKêPƏú - Muâ•w”‹Róò˜7‡/ˁØ×eÒÃÍ8!ò`Ê*þþQ30ƒ“(k-· -’¨•€„…|"6e”¦EĄ¶ÕÇÀL·®›%‡¨¶˜Çº”}`Àɱɮ.4LN©Ž{iÒâ¢à3ʚ<ÔŽ‡ªº.|QCT‰”ºÃ˔;0ˆÞ벸W–ÉYcÆ%Æpê‹)béFØÌ£*v2c©7ûT•µLÂC"Ð.SchYÞ¤âè7`ÍÕz×ØGωnÐDsîBWÚÝûƒƒ•DèoB˜ŕóš PÌÜ7j»þ?1¢ÛJ÷j“›X,ÜxƗØJ… ˜»›«øë(Î/ã—8åóBG4ô*¢¿ò`Ä1 þ‰Iú ´»ëNíSK×Ptuå\sJs#ÄYuñb¤/Ó{´‰UnŠ×ÉÉ¥L†Ý#]°øšÓæiv¤n‘®ãÌímF|eQÝi9תcµðãz&šwÓï͚×#yrðÐZ„é¦~ +꒼Ð5ìÞQo!*É)ÀŸâlX«q‡ÖJѓÕaLëÏ9˜UTM€%o!7#OÅôe=¾ìÂNgÑãÛíÎU‹ÂèqWU¿šØÃr¨XLZªKXx¨P]éø̺K‰?Âr…2S—`\.Xe˜odt<•À "hßë.~‰§“cJ«…}ƒÞ>›¢5¥Ú4oÂ2¡»Ði‚9(1Myäî¦H°(ڗ~CR„ÅpRHØRö‹†ãT5!íE&:g¦t‰Iãaîãí²r4¾I!È#r£%=!Ä¥•Í÷f€ë¹È›A°Ç±;.K2×ÊAü9¢´èñ;ÿ¸,,¢wÀ2}´,-Ö· c¼-ÀؐO8|J\x¨ ñÚ—KJ; bÓÞÑbòÞ0NDt÷e;vÇ;ɇ2aAÐmÙsD­^ô -»íG(%Ìb®Óa€°Øϼ•›˜2…p*¡söõïc‘ ¦™Ì©jõ‹'×ìÞ͊¢§®y÷;ºyÁŒŠ Z¨xªâ/´Ãðìþ´A¼Œ§o(ÞÝã6-üÕ«,ïzh3רÈ쟮f†*Ïä…^ÛÇÅ)Œ<“jELuÑÉ*ä7š£±ö9É3´Ìú:wà}Ô¨ 7ÃH%µa~ÙěRð(bÊ;J} ,Ä¸R;Ý֜92žÑsGÞá2㰝ëñ§^Ùl"DÈðA—Ž(ã$…›UX…ïH±JçqfÒ¿ZìL?v+¸kwò¢TKîêã -ñÜSÚ¤4XãsŽÎ »‹& ‹mØ{,iÞÊö覫jà. ÂR$­ˆ'û„43ð̏¬h¾¼z{¼ŠdàÉÖEí ËꝑìØóHAŒ·k<JUwv\¹']˜)ö¦…üM4ÝÊÛ8֝··<‘ ï‡iEO ƒÅÜôcHI‹¯´0@IJun‡¯·—å–ô©Ð€£uX<¤\f×憘}°rExx\U3 Õ>Κ6–=ô®Û{qO7ï`ѤÅ2T6±Dr),¸Õ0›µçÍj öª¡…ÎXgó6¹*AÉw—JÆ©®³ŠçR²p)Á cqïÄˌ1–í±e5Äøgâ¶óžr%"x˜'Þ -Õx‚«6—ú”Å`py5c ƒ•·]xŽðŽÕ¾äÀÉàòcʟg·šÛÄM*IMòל²91÷}[‘D‚­†—wwTMv9ðdêlèr ¡à%º¼·hfåøM·ŽaG—3ãix4‡„T¥mrùSòJ.‡„WpmÓ©`èJþ1ÎËr‡.S’ -ÎȂ¶uãÌ絜ڊz¿AËٍï¼'³õj b9ÿ;¯œ¶ç™¸r£Þ礕Ÿ–î°ò³œÆ¬r„µÔYѬr,/“&¤—yé^&©|˜òŸ ò¡’ÌSŽ>F͠㠗¨/ÇÊ?#ìÈñÓxÞDŽÃ¼Ê‰EHÕÄŽG;ØàSI½ÞŠgB¤¸üÚáäm°Æèg -gc#Å×'P㐫£Í -„¡O³ &hi+Vúh¼;•œq”ƒžÖ˜NÌ82"½„”þ5Êü1üp|€á -È}†˜x4Ö»1ÎTôÐgFÙ2‹€YãXêU1_ÙL•D/׎€ò.^Ǭ“RÃOuÉÿà9Έ­Uéð (‘ßÈâ(º•¦å¿,Ã2†àŠÃàºaÅ ‘) -’¶Â juù[ÜF -rcŠcÅD o Åñ{\0(œÍó (Žì _Ÿ°²<ëQ“°·h8¼ÓđïQzÙ0ñ._)QâHRDz‘Ä+çkØpœÕ -‡Ü ŸñÓø´„ˆÃÕ½Ì=à BÁŠ‡šâ4§›B \.§’ˆOÃʏBÐćŸï zøyJ€´ÃÃÏèJìpàɇà$lÃw&dá6 Zˆ 58+J¥ŒÌ '}ùÑC˜ØpœÕY'4 Öï3üìΙmÈpXõmšC1å‚!VŒMšÁ'-œ—j†8/¥ù¬p œ•XQáHkl7)¼8@á½}~å„÷Pë&¹¸æâ`Žt-¦â ayÁÁ'"¼<~#„·¿!-jU·i@8{ÖZ1ùàõq«ÂÀƒW5kL88vk:̬œÃû®éÜdp”«Ê o!V^¹à€ ÔhÞ@6@—ì{¨÷AZ³ñà:µŠnáÕ5Þ÷ªXà\ᝓ>¢€Q<ðÃYÃîêÜI:愁NBï,pÓ$' -ü ï;AàðÂÊœ¾ÚÐgj¹³w¯ýªúìÊ%o ð›!oÕJ ~36 àÓ9;½q¾QntÔ» áNցF=½x-æ”Rˆù>ç±Ec›êKB€ò݈•ŒOà îW±ÖRRÒïˆïjZC¾[UiF¾1˜Iý´ò½!j!¸%ðÞ­:=toàÔ%ö\áÞ5Û»ºUt¢½aˆ6«3!ˆ£¡f!ÀÞŒÐ:P_|:B¶a½áKJÿi ‹æo]/k ‰Ü÷§êÖ(ÿ^ƒõÕÁôæ}²×6‹"ȇi×$z7×`%Љ±½[Äƒç •‹Çç °„fÖxÖ— ón`y§(oEyCEÇ,HÞ( a5P ºÁdâån$o®OÚbÁZPl6’÷´šä}>ŽÓÈûƒ#>]u L®ÙZ9Þê·t• ò¦ÂMæƒäMy# 6’7>^Æ’ä …Í ’7<'õäM+ë ‚Ç­×½ö$yVãžõä÷í1¶Û;¦òæß·iÑÇÃwF3AސrÖà*vLýTUQÆy“!‰Aޔ…ŠÄb7éH,\Ù@Þ4  o>©kLŽ7E6Ìoo -k¢ÜƒihHjp9Éñæ&üd7Ž7Ìl~oŠnþ$Ç’!"7Ž75ûšºÌñ.ä,_Ïäxã UÅÐÆñ¦VÛ%ـ™aŒÄx 4e„ùÒ'2 –ã ¹ÔAg`¼)|&ågÃxì`n`¼)•c ×oiçX­¶b¼¹'«jã]xoX¼Û1Þ¸°Ëå¡]ÆØãMëÄWŠ7û/Çg¥pÂb‚Ëã0ÇÙˎñFX®âý`…U®‰ -FoEžèŠð~L4K‚÷c5}¼qœwz÷sÇÓ5¼›Á<™ƒßëà„´ó»QA}‚žÀ%Ó»I>nªdJx7¢®ý¼ŠœÛaš¾[ ¢Wr7¼+¢M2ðm_+©Ý؋ïííF@Šƒ`v3âÈZæ`v³7Ëß$hx'v3Â'ù ‰ÝêÇrKÃ#òâV·[Lb7WUjCPD¢—›{°lÕ²[æ; -V›6t1¯Ý0ˆ~¿!»Ù܆ø€@vkÝ`ˆ·ÖÒ-úlÈnu$¬ÅÈnÆÃôìæ2'ÛÙMí¹°4fvSŸ®oÄÌnZô1¬Ìnš»3¿ - ^‚$²›?ÊÊÈ Ù-ÉQ)­·²¾‰ì––ÿpÖDvÓ}d˜  Ý¸o§¨†v+,â‚ØEà„àH3¢Ûèîé/ Ý -•œ&$´»d?3»3ВÌng˜øܘݸT9sÁ즯H$¼˜|YÀ»1»±€è<¹h„•“Êa‰ì&êŽ/҆ìVdùٍ7ŽˆŸDv—ó :΂ìfсÔáÁ°!$§â@vÓõW‘Ù]RÅÈnZ˜d÷ÇUò¢ÀÈÌï|Cv#™‚+å)@ -QyT8ƒ`.²gú†ì¦™ ΌìÆOPµ–ÈnX8ñíÈn˜ çId7-ÊNÙ- “n+²?JJg"»‘"¥x+ˆÝH)ªwá -ìfF”¤ëv?Î¥%‹ k"6f÷Õ"?l+0Zº?&vEJ+°ÖÑ/Î>0v¸îѧ}. †ó= ë16Åfà«Õ=Ü)=IÝàÕŽ®36†6윇6P7I×÷3­÷43sºÓ°qº§Õœî»FË0ã·ÁÆRÃÞÓ}ÃçfæÌ'¤; £{Z…è¾¢)a ºâ`ðut“VÞ@7¢Üªˆ3ŸM#+žûqÞ<÷2£ s߇ßþ Î}Eµ`sƒ£v‘FsøÂaj#s“ÅÜÂã]¤¡èr8­\ÅøÊË #)—A冡»L®+bÊÁížLîë˜Ê?¦I/w»J$7 ÔnDn ïX@n„YÉ" ÷òÂã²n˜vËèֈÊA㣕%Œ›VCÌ©À~°Åý2(²¶‘¸G¬ âFèW½Û̓Hù†á¦6•mþLáF^qC¸//vw7›„?ÏDp¨…7Nˆ%G€›§…q3øÛ¸Õ¿ ½û•¾€À„o³¬²_“½½g¢·³‹s·¯Ècg;ˆ ¼}Y¯–ÜíË­"’¦¢ -Žòuû®ÈÍ®¹ 9"µ+q[tÑg·aàÀí;Ä.oVGÁÛF]3ÛU\µq+mU4\lKo¦ßÌÚο7Ôö´š´ :Îp«EV°ÝmÚ8ÛO৳¥©;zGwc*øëó†Ù†Y+¡ˆëQ.tF¸”…^ÃÔų «@­Ù†…–ÄlsbÁlc®UX<0ۏÙRIÙÆòHmßWÈöë"Uùmžïr@¶ A¸‰=«gàtòÚ²M -ûd›ôv‹î Ùæcem¶!Û|?8„d›ÅHWÈ6›…ÆU(À~Ü.01dû£÷ô9=«?&d›HË6È6Íʾ²­Èd½&R›G• ¯m†Ä¨n -È6³Ðmà0ùÂlŒmÜ×q›±=—ÉÁØÖ·î†K ¸F?é`lÓÂ+83B:¹ÝÛ%è6É؆Eâ†`l³ÄöÖ&±+•È.Ûx …Å -Ä6¼B—z¯ˆí駲ïkÈJÄÈ(Qå´!¶³ÛlòÌÌC ¶a‘ÊmCl“˜Áø@ ¶ ùçE¥³êF±0ž ±WØÊ#¶)1Tcb#¶ñœºÛÛ(×#=-Û¨[çÞ%éìž÷içkC#§T”ñÚpÃ9¤]¯‹<ù•®Í ‡óÀk3ˆ¤NèChášu¥kËJE’ñÚ<Ö0m•W/^›qQv( ¾6ž;cŽÉ×~îà /€mÔE¹.“9w02¯Íú¢"Œö¤k£ÍO_ØÚ‚2’lmtí¸•Ö˜ÑÇ+ -ƒ¬ÍòÅ®-xٖ}åjc}$䌃.®x9Kµ€…t6¨öåcÉÔ¾\¼–HmÙ ZˆÚhÄq;€ÚÔ¦Àõvî݃yٍ¸Í– —‚•=+MT6ô/œÄ7R6.‚? ì3Ú«'5fjuµb²ÏT&ûŒ9-(Ù8£f<æÌÍcªap$٘ž.C³é.ÄÛÙpúNpȧÇ7<ÙÐeQQ½ò±Qo­Œã¨ÏíMÇ~†ÓÙ+F†™ŽýDOó`c3sGc?„$ûq"ÁØ0ÄÏM06-‡Uw E*$¹ØP§E°jb±ï+Úa‹ýæ4¨ØOàW(6R=z‰F&ŠûT„X›‹'º›f>Š]È&.ϧ„b3'AŸ{£bì¼RP±‰à*~¤Ù`s›Ûų´rÑXlX”ß -,v)Q…¿a±µnzúÄb3N—(°Ø¢@í¾ô€¿¨æqÆb3ñ¬æqÑ ìƒ«9ƒ‡ß˜‹ —ƒ 7,ö£bð„bƒ5 N´fb?քíHìÇx±a,Ð@ìÇèŝ‡Íêá6&û ¦uP®½dt£aŠArun'»º{Éä­º ‡Í“kmÒ°ËáJɤa³ -†£òJæUiØ´ 7À`±âQVÜiØtI«ëš–"®\J6,ªÌØpØ\L7sO4N°4°J³¬ÓÀ BAÙÆÃæòºF½»¢Í#Gð°•rÆ?mf±±öԛ´±ÖØDl¸¦rM‰h„m[©»N$6uŒú*cz‡…’æ ‰-mèh‰-¬ØbsGUœ­@lÆæNhñY¼V - 6—¢ÊèL¶Ä O›8lž=OÃFlL¥fÿd÷êéŒb8ã°i¸bÅaÃlD‰pØÜNwÃ8l\#֊ÃæڈܕÀaãÉKiö4l@ìÅl"6~BA›]3 :÷[ÓÂ%Ì kŒñAÄ^,+{šƒˆÍU¡D&bç»»3±™$6Á8›IÍêrÄ©ÿ¤™ïJ@±™ÕäÛ$(6“ŒJlPl‰ò¯gB±Y T@±¹ ×Î[ŠëkL*öìKTlFÀîû|£b§ªž¦b3Å AÅæ×⃵k‘âðIņ·0©ØŒ™±ÓÅFÅfĉíÕ‹M‹&:a±i(bÅbó1¨ÓÙø¾3_‹¸‚ -]7,6qbÝUþƒT1K鋍AP_݆Ŧ…ªàbÃÙtós±ˆ!ÚeãbÃÌ|r±iáà -.6-j¿¸r±yD -Š‚‹ÍpŒ -ҟ¸V×6í\lúÂL››l>ö .63j¨¹r±§9¸ØœÙ -0¸Ø¼qì¿°q±avç' `‘Ö+¸Ø܆®‹M3ŸYp±…:¼ÊcS9Þ°ØÔy²=°ØÐq¬I.6sC՝Z&›1r² -‚‹ÍªægÅ]Ãë¸Ôqåb?Ƒ¤5›+*5 {ZÍýBÿ£èZÎwòÃjà°îà}?ÎO;»ñ.—OIÄÆÃ&E+ØÃÃÑÎÿ${844ìÛ¾Æþ}L µ‹ü' -ûŽp#aßê­°ì&|qb°o×ìì;FÆ`ó}9kP°¡vQ~d…`“8!ØРq¬ ®tµ˜oC`Ã(è¦ ØHA÷ä_3™õ´7üu‘Ì3ý†Ç]r5<õØá×Ċc$ö5zP¡–çøÄZzE_£^ƒ_¯ƒE•äëÂ7ð5ä_HöšêçÞ&õ¨ªgG^·3üN¯[trà5S\ÇýÆ»n!p Ü5Š ¼Üu3þd£]ÃH5`×-”‹»FZŒ}½7Ö5jž:I×HohaàW 7쬳q®ûc²z`®<|Ú¤\P¦nk¤Žú3א̐®„ëaà¸^$ßû1xk˜ñ¿n}^ñ8¸?£k°­OÏa;Úí#›Á¨47×¼[„ôƒç¼q­±PS²RXëXj}5³3­±vtüžnג]ÙúÊ؍oé´F(' >XSÜ­M œ5䂚2Wš5®x¸¿+¦ԜŠà3F©³_+ËÚtI²¦¨Á &¦a‡ ;ÇzDחÀX'7 (Ö#…Ě]rš \˜ÎÂnOœ-ÀÂTNŠA°P™ ÏXŸæ müjlû3¾ú &XЫϐânðjXYìjPmÿ t5~­$˺ÎïG¡£Wç#u#¸Ǫ̃?Ÿvj5’'Œü´Ì ~vÁ¬n– íÈꖍM¬F]Š§V·HQmÀêD>¯MŒNÂÀHɆ«nÑ hÕ ûq4XuÂÚ7V5*ìT‡é’¤f)ºIÕuøóÝ@Õ5T„Á©®¡ L5œq½Aª«=‘„TÃÀ ®Õ5ú¦nˆê—' Åiª{¼_TŸÁÞùÔ'ÇÉOÍB!õ/—W””ÜõfšîDéßÑg¹%†SM ™Èšúa^¶|J2uw+´S_î`µs©O'K]|³øTSÏ÷‘­Rˆ¿Ú¿ÓÀƒÐÙ6²-Æmd[ìsd[;G¶å¶‘ ?‚(ľñÉûa§q?‡i_Nxv¹´÷áûE1Ïô£|¸E˜gŽövL)ŸÌò‹‹q;½Å>¯e9ì¼êå¶[„‰ñBäsÛ4¬ò¶ÃNã~Ó¾œð<ìriîCÞ¢y÷öi}>îeZŸ/Æ2­/ÆmZ_ìsZ_;§õå¶i}>îuã|1ÖÃNã~Ó¾œð<ìriîÃWÞ¢ýÍǽg¾Ë/.Æíôû¼–å°óª—sØnÑ|ÜëÆùb¬‡Æý¦}9áyØåÒ>܇ï?º+$â]çw%ì›BvÎõæÃTÖY^ÜÌ È8ì^ЭæS»«`ã»»²n<=yØiÜÏa±Ïž‡].íã}ø&“霣÷Û;Šå¦û±œíbÜ.mñaæ}X\ yÇ?a»½‹S±l<ݏ婥ñíOûò>äa×7çÃ}øV“霦÷;<ýŠå4¦²œðbÜ®nqcæ­X¼ yÓWa»Ã‹_±l<=åÁ¥ñí)OûòJäaחçÃ}ø&/ðü.ð-]íãøöí“oïãÚ{×>>TkÈ÷oÓÆ÷ñaÝx~òó°Ó¸ŸÃbŸ'<»\ÚÇûðí—3ûžßòró«_Nx1nW· óV,#ϼiËç¹Ýáå[^6ž_ýòàÒøö”§}y%ò°ëËóá>|ãåÌ~{燼œÃü䗳]ŒÛ¥-ãƼË°3ïØòmn·wù—ç'¿<µ4¾=âi_އ<ìúæ|¸Ó@ ÀóѓlVm¾„/PWl^ÇbÜ\”Å>ý™å°ÓóYÎas“>žÛŒ´|\AñÐímœÐÚczۋqsÍûôã—ÃN¿}\ÌÃ.wlžÃ~{ ûˆ·Í¨ÚŸZßñ´/ïCv}s>܇o8ƒæŃl{–d–Óþ†æzõöÛõfı®5pf{W‰Í~Ø&è~-éãßéGN6–\7¾$Þ;û9LûrÂó°Ë¥}¸[È㔽Ý"οçÛq8Վ²ÿâbÜNo±ÏkY;¯z9‡íÁa¸ïçmcWÖ퇝Æý¦}9áyØåÒ>܇o³žÏ÷d®„¦ÉnÂöê„C±=¶0¾¿:ëÆù6¬‡ÆóÛû2¥o4Ö\OLÓ<à|~ËOÏ{·Ÿç¼ÑëÆùHÖÃNãùáõÉóü–Büâû€öíNñBžþfôU¿ßÖ¸Eûa÷¨ÏáC TOõ-ª¸v÷s˜öå„ça—Kûp¾2 ì·h>ùå8ó!-¿¸·Ó[ìóZ–Ãî1PŸÃ‡¨^¨·h¿E‹q?‡i_Nxv¹´÷ᛠô”ÛÇۋt2Abë9 ñŒ÷|;ÛŸ]ÚbŸ÷a9ìž\÷9|H®ïç¶%ׯ‘y…œ&püRW»ÏdÜç>ê.Æmˆ^ìs<_;Gþå¶iâã¹}«ábºÖá,¾/1¾­èD:]1v"ߗòz3Ø핋ýãݽ·ñ}‰±n,CMܯåk\nìòáæ†ó_žTßë´/ï@t}[>܁ïÿ7c¯ÿ槟þòÇ~õéz»þÝB¯ý`Oã^?鿎J÷wí¹Xè²Ú¿¼ÙÑUXÛ/oÇù9ûrœŸ|žßFœ»,ϳ\ra´W l|ý¢Œ¨å2žÇsÊXP‡ô9Ž0Žî{»?ކøÅ/òX_Ö×O=¨<8и;NŸK•ýÆÎ2Ž†òþîëu³ñl‡O¦ß-O†u·þÑ2^Ÿ˜¨Ó5¢bKÆr>‡×³á@¥Îá>âÚôºÔ a.BF´ôõv©+ýqY¾ñ– -m¹èåí+èyÀ—Òæ=x{ŸãÝ ¡Bæ` ›ãò#ƒìu¿m~Ö$“ŃÓ` CÄþ#-ûAó÷@Û.ñ8Ž×Zÿ‡¢;¿Ÿîïk#–Èü’žçžFtÔ¦qÜq;`¿®Ü؛vLÖ:(C_;ƒyrhËgý:ĸz‹“Ce­hgeS;K_ߋoÚIüʧÖí”}è&EeœŒ¨|ýêümžÔÙo_d)nd-žUíÃO¦ûnÜàq]ì·Ðôö¾^¶ÙÎÑ뉪"sä`·gÙoÀ[’ûõ9€¯Av°Qâ°wlŒ¢%ïøÖ×1öxNÀÂã[¦~õ*æ]EqT‰·ÚÒÓ~œ#ì剻ŠÏyøQ>EŒ(ž¥ñ÷Ƴø a‹Ï?ó‹s¼DÑ^¼?/GmÄݾ‘µŽCÝzU`¬eøQbˆ³±Ÿñ(Ÿy¯nK{ãëôÆÇè+Jõ¨Ãoråy„x¸‡ž}lŸÆƒGóÕ«X_§×‰Þ:H{Æò:±HRvÔI{Oûxâ} ˆAƹ?y>b–Æû|“û1í­<¶w 0¢xÕOMWt³a‰"6ñ(WûŠû8Bí6žó°û9øôh(ƒoëØÞý-0&Æxç¼FywÏÙX¨hûÍ3ájn|_ùsu9Âzyz‹×¤•°j²W( hgÙbz9õ>ýtΎ%¥‡Ÿ«?›gæ¯ýb~ û„øé´ÒãýH5Û/¥CïÆz†ñ‰×û@hxãŠV6^ñsüš¾zy¯€H¼cÐ`sÏÃþúº|ð×u}’Ñ_¿^m<õAñ“÷Ãö3fðƒ¯%e®ËÄôµsX¿>¶µÑ@Šé4¿¾9ŠžþšjúAçao‚É9Þæ8\kÏ¹àˆ¹ ÜÏçñvë­{»ð¿fÇxûÁør‡ÿCÞèldA[ö§Å@ˆŸrÄüøº£÷Ïޝ!˜Ö5¦fNC?¦½\~Φ‡«î¹~ÍÎëha¼ŽpŽ/<íµÅÆWï3Ûõ~<‡é»\Ò -yŽhéXæÔcî$áKØïQ|¨×Œã9Œ5>ÒÀ¿zäyO 0ê²ýa·›Á1ðÖ½ŒgŽ,¡ñlyðóÊ{ÄsæéåÆ5ÇÛ{KÛC«£¦ÜZœC¯ã†'ðÕ«˜ˆ&Zǵüâi?æ÷º'2Ž'&.5l¼âV<íÎ êåj{±qMV¯$l(r³M·ÿ«§ö%§tÌ;ìïÐù1ìå(^ËÐÏ´±5ë×Q{5´ Ï\ÉWöžKtdìž=€}»ê§¯žÃîTÆ/ÒgÏqˆëÍé*ÚX¯Õûû¹Äö Zâ^l´ïƒ#<çr*¯¸pöùã°S‰AâÓW¯bý,è¼j:}D’ýî#ìXó} »]Øï|UÇaä«GÎm'xh¾¢»Þñª‚„œ«â Õ/i?úµ< ÄLJñŸ¾zäy¥'øh_¹RPֆWÇZ¹É˜ûC•$N’ŒÇúz—ëôûóÔ3Žðú¬b㞟]=âe ¦âóϜÛú·é×;g›·×^³ÍÇoá?ü·#ÿ[þ(ZÇáŸñPM°÷ócØ멹ö›_>iñyaO^Æ6®'>×+<„“m°}ÇójãrÕ¼5y„£Þþ­2rDBŸÌÁsx¢’ñŏáå.W ƒ”±ç‡½G¬äÿÍÆGàÛcãêÇ=0¿´öˆîéYc±y?GŒPõ(á`ØÏñ¸Òu9{ F ÉxŸõë*@=»¾v °yË:>v.Ç:@ÎaïòÆ¢¥"½Š×pÛ "<¤P´Þì³1[GqûÐ -Æ{î}#¦¡½ñ} û¸ã|9‰úcø ~ͶçYë<²WFŒÿ=q^m4_.=.K‰+«çÜÿu›âÁÄäS‘Ó :ü •åõb¸d9ƒ'—ñ£ÏkëùñГò»[NO_k¦gÙ2\Xÿ”K#.£Ç;z?¾`t6ŠpÞ3íË;zøêɽcjõÍAK¨v‰YÒУ¬Çm/^"uD²ŸW»u{:¼ÜßN+Ï<Âkݔù9¼ñë[gqiÂ0ç5ý| -÷¾Î#¼<˜n/ùýÙã^ÆX fê7»RëÅ«ó´xô€f¶DzïÞtÔ8 z2þ¥3·ÂÙú¸Ew¯§nog§ˆõô;Œ¯¯¬,Æ<Âqäz]\\ÀœÝ <ä#W/~WûX®â„zÂGË70ª&Rô q+)ô–ó%qèöóu·®+^x½ihv—BqïùiÂOÈ×­ûž+ýºûŽkË %ì>ú>Ã'x˜¥Û8?­çº—#÷+?­¸?wØ#ïÂ5îåý -û9š7ž9.J¼å3b²jmÌ#ÌHa,s{®ºðöC#f¾œËü22h¾#>ùœ/ã%잇òÝá“÷š÷­W'1µ•ôå -Ékw„J¾ÙÀ…-ì(º’±æ8®¸5sä8_k¨y„ð50†Ž:Ï«ä,1ígºšO/}qVƉí5\¤¢°ñK<Á«*r¦®1ñ")û9ŽP®|²FM´AÍÙR¡A˜<Ž+ÞðÆÖºñÖ!2ú%ìs”Õ -›qp”¯\‹Ÿ{Íÿa|Ô)CGˆä5ÔØ?‡µ¸]Ì3¯3«9®`ÿ̞=§Æl|Ær(¾=öJž+ÜÀ“' žGOl|wz•šª{gÄaQ„ã# Ú}×ÊË»ˆ»ïkøU.qnÅD3Ç!eꑓ́^T1£?OË«˜w©­øîJù­åd¡áô€“琗†Þ–±î3&s̹JÒõ¢¶÷ÈI÷‰\™ˆe‹hn†±3aáE¼¡111w’1Š9µ¡aœ¯n¹í-ªölÞ4ýܓéê8a8rámöDFÿÌK»žs9‡¹,Ëg4 -ñ¦I¢÷œ‘d¥+xäÎ5Ð6žÜ8#NŒWè°ÓG½ ÖÊ#pì_9GÈdkV6åKðŽ…AÁz> ɤ°ñõáæ ÉL:ç•ç€ž•-cÇÖF ùjê»ÄŽÔ´Eú¨Ö[’ñž¡öø^ÖÔB‹ 4Y÷«ûG`PÔ®•xWÁmûÓ§Nëe?2X×ϔ^ù—{„ñœðqçUC‹CÆò¾„}úG,–Jû _ÕsÙúIEéé{Wó"-Ž¼e éVºX´Ç‚ÄVف§ÄÆ#ŒÖ¦%'aûµÚ?_cÆ¿Ã=äËÈØþzý‚2²‹œ¶<Ï{þ{ë’áAÉXsåÐ,‘ÖŠ\´èü‘ѺØ0K ¬Á‘±e("#²*‰"cÎIíhiÌ)­õÖæf Œ‘Ï/a·²c§ -d¼2ãQÂôŒDG> ôµH7§ƒnﳯw(x¢-­ÅÄú]ö®JѵÁ8£–§æ44C˜É ÷:}ŠÁµåŸûH =3>å¼bþ¼ïP[qL²FîVô\· kȿќ7=¯ð†hŸáÂnaï}‰ôíëÒS¿_óC|SGŽŠ÷ -69`k‹¤=4µœäzõÁÂ;FºîyÜRbã×Ú½ñœúð•EA=±p†dD8‘ÆÚc•TCs{fp¶”|íÐÉ$Ѽ©æí0Á½-r`¦˜ F c¬ms¹§–G>cãžÃjWÏtl™lñê’Täðe,©ïeϊacÍÙ,/ çoH³Òìv.Ñ÷Q£¶ÌwŸšýûW¤³}zÈDaO%¾_ÇCêM¿»©Ó}z|fÏÕIîm%"…šO§Ò—¢ù‡]FîV–3»}mS‹Ïã.”£†±§·\·#ô\IO‘÷¡¦)„òí‰`Uíy„ãL•J-y„gwEÓkñ×Ù֚ò™G€<Éŕ*Û>ˆ$ŒL%—Yd®o²@N"饙,v7 … ƜÚHŠÞ̄>IyÐÒ%<â(óá 9–ô.ü֔€Iæ²ÿ‚˜YaÜ;:®í›tvéȸ–Lc -ÁŠL‚šiI¶ÍÈ85:UŽ|Äa&?&`‹îSJ(©Lš°fK"ÿ«åtEoŒ}v–‹ 1RiSz”tA_‘¹pÕ¢U”T€7ñùã ¡Uèr–çÐð¿JŒËÐͧÁ…’ÖO™ {¨©Ø 9" Å) Ë: 0(¢^ágO[—Câ6ð+Ÿ@ë;š¹•õá&YF¯Ë\nO,aà։…š ÊÔ7²}¡ˆBC‹˜O›—rÆiýÊYN]Gd’­È—Rö(’ÉaH]†®E#Ý%5F›}ÚuhÎò"±Óú8•ƒ+è†ÉÈÕÀ÷AF¡:4'G‘„ÌÈË EÐúa1#=-rÄtÞF«(Q†>‘ -gÝ£aö#úZ‰ÈœS%ˆú,[ WÌ­yIúžgyÊÎiÊ ›ÕܶÃÀHï ¡1ś :TêÏ8whÃ>¸tJÌ;"x/Å bÂì8Ho¶¥ã" 1ÇNåVM9åtábs}ÖGA®•ôHñy¡€–»Ž)æFç8hâ.îhË« Kr1Ñ÷è0[UÝX€ÁF‹:€»Ñ¥XÌCR9k%ÁÆܕý˜S#$t®˜ØGã 5=*¥@-ݼS$HÇÇädÅóȬkn;&œµÑVƒpdâ϶„½Ö0‰L˜ëírpUq4Ü'µcè‰Z•w†¥ƒÆÀ¸í-J7CF³¬¬ }Ø4&ׁ2¦ÅÔº€Æ&ÌÊÀ!yDp«ñ#;q˜¥äŽÇÇø×%w-y€YºÊÖà0[à6q®U7êU쀔ÁŒjƒwó+¢%Ü#ZÇàiaK#Û£À{]Å !%Σ9£9Ä@pªV¢”³nC\‚OÚVÊ5N©š…± VH(M\DNhÀ Z™BXß(\&ì(„¹ˆÝJ]Úc°€ÛªJÄnÉL\Z†ÁÀUJ›Ž<™áá²É+g*`·¸«¯ò™0Yllƒ áuÖ.a.n/cʚ ±+W”Fo³âðu®V¾Á3܉} 9~bEpºSÎ$¤ÅåÙù¶±QQð0q¦€+4CP&XȞ~–Âi Â¡`1§túÁ¢¢N¤‚ž'Tà¤à¢Ààž'Už ÐZÜq†2¦É'X÷ÆaÈR|]¬Vj¢ÃÍ"~R~Ì¥÷øAh˜gSD2n=~¼Á­õ ¬&#±gȖJȌßى_g¦®Ý™~¥fPXË.‡Äf™Ëå°'‡‚—¨…;a(.#£@¦6AŒY1$²6=rÒqHz´$ïÆN5…dTÅ*¥)Ê\ÒpdJ+Øh®Zæ㒷]y3[t -«š»–>}*JƒÊ7)·[C^v©ż gMvÁP§h**fкú^h–²ïÎ5)ĸ a‰ì9& vùá1ŠÜç’k¼cÍbÈ(øØHY®(GF9U°C‰>t¤)2ˆ9qœ…~ó8¨"Ndä鬐hì¦`]Dz#–n°@îø¯Ÿ`¿FUа`ë‰[± Z*ª“‰¹5sê=\îi€’‘¾„š¢Úâhp97P¼Û™œ0 Í.sJ -ÈÈèäÓR*·é€"K¨®`ªÝl ”51Hȸ-ZcÚSN!œ¥L•=4P¹²l˜8m1CIIz£ K@ M@b -Bk3$P w˚ƒüGsj,Ә‹IjIfI Jã8íó"`ˆXêàˆà^ÁIØäTëº5²-·@ë¡#-Èb– b›D)M=k`à„ÖŸÂŸ©\’ˆðÌ¥ÖJ·Ô¨î —‡ttÇ$—Á–EW¾]b,Ìf I—ö›8¥ß”òÄlbΜ*ñ3§³%UØáŠ2ÌÍzuÍÜU«Œ|Z«Ët†>—ãÉA³UÙÔÂHK·P"Êg^QÒø£ÀœGf/ՈL}“¶êX켊23ûÏbpõ™žI×8%íÚX)L!gçÀÀ ‡A¥™ë°}]ìr4½þ@ã#Æõã2"M݁po¸B LÐÀ©ÐEljTÚmÀèu6üGçŠï@ ?ѱã±<T jWHÏLm´$¨Å‰q8s#IpzÒm™ƒ$(G›wÄÀ/ÆÐGÛ7e"ÔÍXb£çŐÿNÓl«a€¹&uKÐíFÝÔÆÁªòIüº=w -åÈB5_\Û¦ŽÇ ½“)ÉxŽEh,ßõe‡Òþ·q r4÷“g -åh6Ÿ’ßÏ f€+WV36r%YÀ„­Ã&"O2O#ÔW÷m ¼`ÌÖŒÊÖàlø‚/,ˆÅˆ™‘Q§Bʸl8åù’vd1ðàdÄžG÷»4³Åhè4[[Ät3·5 FŽ«ÆI#ÓЩÅT€Dc̜å>n{êÆd2ñ£òAXË¥óÔâ›ÜóÂ-S,¢Ô rU–m)PFÎ(cênªT¨µŶʣ:0…×±Ù°ìÎCÔWTU©h,0P_‰“NʈÞ"ðª‚ÀFI‚»&OÙ µ… èXIH_IqØÒ[°ðÉíÜ*B†!G™Ó®îl™™UńK&Dòš-/ ú"±”_JäÊU)¡#/Ù¦A<œÄ@“$"mv4´tbj1I*a„b‹-ý”P-Mê° -æ„ÓÈ驏©8\½-á„S*3•8&€JþyNþBL¡="¸?1ÐfŽ{ÏÒ@[E§LxÌ*NlVԘX¡´åגÀ…T؃ªcÎC]('¹aI]òEl…_`ý¡†>F´áÒ:9¦uG®Ü^U¶š2LÕ.F½²wRH[;ÝaàNxL…k\t·PLâYÈN¢#‹ ðA;ƒs+¡%Åa°E9ÂÆI ñSå˜'§<\™säSÍ#@묉®Ì ¹FÊeÊeF¦´£¥cB*A¤ËìēÑ=îO©ÌJ¹" ÍT©å‚)ŏãY‚‚{Ê'±¥ EhÐJ¨èؼ\à¯7å]"Œg.FŽ,DôQ¾Œ;`ð6NÚ9Ðw¿ò\ACåç×Ëê2¢âaÁ)õ3bºt¨A¡ÅÄÅó¸çY£)sVË(¨BM\Tb«›rWÆIFTÚ ™cËѐn*S*ýêb©¼e†yø: -2v¹¬Þº @IÆ: ƒµ@a‡×6 ¬’nñÚªªÒØX¬]ÎH 2ÔK\T ½ؔZnÀL¸ŽÙŠ Êبm´”3Ü»L(Þ^K]ÖX£¢ÔÕ$.1C¹œSSÚòPf‰;»°¯Aªá4ÉN=¢½gÅc77Á^ԇÄ,vcÂô’ÐEº‰˜Ðê〬}±óР­›ÑpBímPÄ"#÷pRQÂ:óØÌf—8G7"BÂ(Ó¢Äi,Ÿá5oӘ»ü­È•c…bœ!—ÎgF5i¬ða”B,ôEFN*ûD57Í8½ïgÁqìŠàړË™‘Û*# *ª¥‰3ía"•q -ô̝qUù@‹upåjò`aù€ÈTb.Š »$¾N-£…@®t*sº¥ù™Æ¶8hÂÜ%H¾,3&ÑQæ\–8—g –TF sŽ®ÜUdìc ¦(y˜Š~BK_|5ušHb£êíø-Ú p©­4 hŸ«ìK̡ǖrÔPJ°ÀÌU·z3ú|ÍGgkÂE•BÐ~h®BF'„6v9gΕoeoÊSÖŒ†«2OÌ-sA¦°>œù5DJ´ÇÄOËU\²³´…2å‚{R\!.’€ej|õfȑѨ4З.Ďâl™åܦä#0¨[jí´Û¸)Aáyiâ -0Z/ °nAùÎñs[üZõ'B÷'Ð\HÛ4s5YI¬`L9Å©×Ú¥ªeNt“ éºr=©  H]¹P% Âíg´i ¯—@Žn AL„ƒ8-IÆ~b{ƒòw˜‰G•ÖbÊñ€g¾tžY|R†5~¥”MŎ9 >{4åCìjû(« -k w%ݰڈÃà!±˜†…ÄQ7¥0â·ÝWN”"¨„ÅŠmcFÕ™­5âWÛPúrðöR6îKˆÏ”žÿ+V¦gC{=Óp ^”ÁfS^̽Ƨ¼SŒH¡@2Þ¸ª`‰­éÝvÜ(ƒÆ>Y9@;5Š*úš'­DLh¼ ¸rÙނªKŠ&B`Bª2ú*}Ë@3(CÚòLlLÕt8gmânûCãˆ#¦‚ÙŽ¹ÄâX(Â05 -?@e–…Ñ á¤p3˜edè%_ Ȥ8 ³ bñüƒY ¦\¾.r¤Lœ®†%ø¼r¨eØg - P&N6l’¼šp0ðÙ×¹fɜÎ;EC¢?ý7m:­¨À^8¸ _N­üƒ@g¶q…#¯üù;t¬¥_G‘OÌ´@}äN´#ÿ*ÑN3VN§œ§óÄÃw¯sº—ð£˜Qä݅ƒS))Ë®†Œ)PÀe pͺœSî€å )%y%¾,Ž €˜ÚTÊÒô™3²ŸûŠÀ¨©^xxYiê$¸AåÓ£9xŽ‚K§jz¸KãÌív’X¨éµù-ÐÕ½#ˌp*†À)Ù- -.?uÙ+euEܵ‚SÅ(ܵ‚Ò (qæê5ÜWT£òbtõb* QVæ¾lI.}œŽwØbºµT9՗8ݺ¾HclÃêƒ+Î]} ÆÂÔÔbߎÂk´ŠÕöÜ5Z”ª pIÑ»^4wq¨àòsu¢U’جCˆ‘uu-Œ ÊFﺣ‘«×7[ñÏvo¦j×Á•)¥ìeŒ²_`v"WÊË×Hà.š•¹df(Ó`%¼ÌšÁà™Ò„×ÙMÈMqpU´$ÃF¡1]”² ö%]"`k -X`4ݛs=RiÏü„ó €.‡ª0îBÚÈ]oaNd“tãÊKS‚ï\Šf Éâ6Û:ã(KEWf{à7Êt®~ s7öYŽ%œšç«>¸{$%hV»¤ª,(Eâ.³({cx›óÔ#¾3®ê2ꎾ3®ÚÂ-P9a‹*«”uƽԗGǺäK_ªœrînc®ˆ˜»ÌpïAp=Y"¼ºÌÂKJŠ†eÏü%¥’Jv!C%$ÄúÝf=ƒÙ¿T˜*Uæ§ÄÝ±\xênbLvkn0È݈\íڅÝöÕ¼èZc^O`î¡*ë›ïvbö†9w#ßmI®1:ø]†,v9À”{tœñÌ֗ ÂÜ#”Wˆ}² Ýd+]ͳÈ×`šé[x8%>„NÄÜN6\Ü9 -mcoȖTÒȇ¥a%w´(ejBm ÐEšet±ÝL¼ä¥ ÎüyáàÌyxÒÄ%Jênû˜GNÙ¬ÜÀP¯gûwf&¬Öœ•‰»û+fnoÆAÚgê*åpºs¦ gµQ#!ý° T¢Ñ£É Ô¢:@áhž£à¾F/Îb™PwÏtÙ0¦dtìîŒnaÄTƒ|õ¥˜Ý¹ ÊœIwƒ/ŒJ -r$§:„€:?pb;,6ÅÓ R¸mìÚöLDë’ZmAìÙ>xXž#Ìʺ ¸¿§“ê\Ћ¿"Cªæà1d×ZUÖ¸ùiãÙO3ŸoÜyžÜíwö‡“ÑùãÖxœû•=ù~Ð<ìöÇÝþó½= ßϟwûá/ôý%þÆ"óãñ÷ïu{ÕÇÝrŸ_èoÏ}?èäøù°ÛwýÖð͒Ÿn7n¾¾èõõ{ºƒÃîédœ>m|®Þ[ÓmÚçÝ^g˜÷±oÜzÐ -endstream endobj 47 0 obj <>stream -ûáŸñ›Ë¼ÉDtãÓÆ­úݶ†kÜýçŶ/[½‰müªÛŸ/nÝo]˜Æº;¶ùç›0´ó¼ûü|\}lÔ~]ƒ»óàäÎéóü¬×jŸóïZýqþ°;>nŸÃÊïvtÓe£…Fëé¯1¯«Ïàë қêCzãƶ¬ßW ‰Êä;‡ùËn ºU2ŧÖ5什ɰò@‡ùhÒ«Á‘¨ýºw<˜ ÛùÞåy«:ó©1…Ý~åÕ=olÑʹ`ÐÙ³ü~k2u[ýý¥ót|ñ|\ñÝÖ©Á}:oÖ·øjŒ¨ÆÑYã18;åãå+mƒ9F-v¸a¬âNß&3‰¸ õ´½Áð‹WçÝq^ã”~Ó[Òºxú@®ÏÒ7å0îuǏ[Ýeæ‹ >,uغ<¯±H¯ù™¼‰*ÿ -^ ›å‡ùðytÝdÉ«6ù“ô^;s:‚1^•ûqë0?kÜþøª‡‡EÛVgh›68ý5o÷“~G÷s°ÄN:³ŒuÛñ¨úp ­kÌÖ¤m -~ۺз]à[‘ãÉðtÒËûíê¾uópUÒ¸W­exK4Ä`TýÉÅ£ö¸õ2¯ÁvÂgÖ¶ ›Quóik”ßæÿšè ¯±¼§[×PûƒãqwÜ^rÄ¢@ ùÓn¯Î¤Z×Pa[~kÁ:…ø§YÏÕVµ¶ÜKVk!nŽEng°Ú)§;åt§œ^?å´z¤úN9½ÂºÊéÙ°¥Õ«Þ÷ƒîh;ÕÓê›qsÕÓêÖ°vºÓNwÚéN;Ýi§;ítÎþÚi§u$þÃü¼Ÿ÷O–W®(òo¢@YÃV§;©q.Sûu±ŒN·×ª‘¹‰ÌþZp҃áåù 7x^]Þ±ÅÕØb²c‹v|Õ)±c‹;¶¸c‹ÛÉïn>Ü Œ×B`ÌõlïãŽ1îc Ƹ·_dÜ1ÆcÜ1ÆJŒñ~kòïÿµÏóáOy·}þüÓχï)Æ`Ùä¯+ºÎ-·jyÊݦ{›Ní6_uJì6ÝnÓ-_OLnoœg¡íâ<7"Îó/ƒÞo­Q>œ,«?¶IÁž{lëÂ=k éZ|îÊðϚOv¥`¦¹Ð¦LòÔªƒª.n_5Irs™Èîvµ‰f®ŽÐ0ïÔ«Á¹i ñ}WŽ^ãüm+'ÜüËÎzƒAÇޜpÚkµ_ÜnÐà²ÕîŽß|5ëÈZ›t™zk¹I½Ñmؾ»Kt“·Ý–§[¼Å©½9É×H4©ÉL6D6·:ƒWÛÌ(·¢ÄJÜDõlÅýºaKy³#zßSG¶òb½:`mØÅzbw±ÞÜeüÃf^¬÷Ý¿ÿû¼—ïë„Æ_ý{õdõuº!×êÕÙz×âZ=Ö¬á[juº“›“Ú¯k¶;Ý^«FÈMÔB·7¶çÅ^ñYÛ°RxÃËóAoð¼:"ªæŽ'n4OÜÞ¥íã„5b>vœpòòÖE|ŸÖ½fsØÃ{  ºê“µaüaóú·¾@õ0ÓM­ÕtwÕª_j[,\ç8ؔnk¯-ڎzK -O†£æ}*ë½H¥ÎºÛ˜˜•Óê³µc}ëg}ÕgkÖ·O`uçÒÁy«ßÏ{Çy/o×2°Í>¹®Ñ. #½ƒ+vöÉ5k‡ÝÑe¯ÕÎ/òþøaër“϶-®Õãëñ4f>²ÂÇÊÃß´r=§ÕmwwÖ896å0¬>[¦lIÉ¡W…npÒñiu£×Æ1;lS˜FõÙº&yŸ óü·êæè³î²€ò©`ÃÞú&»?èWX«Ýž\L–»úÃá…ϬkÃ…ëêãìtºãîË:£tO¬kŒ½n?oU¿áµÝêµjD¼O¬kˆÕÀp.©ßãX*Ohñ±u Y.Q BWy2¦ñºÕê½j½©>0}ď[Ãz2y`mzbõÁæÏëȶùږcuµ~PC©¬oDÕð³áà¢Æ©Ž­×ª$µú݋:Gõçï«#ÛS«f/ݺȥö.risT³“µaöœ]äR•ƒr½•ê·ÿ"“hw“Éä¦Æ.µ·7v©Î°)gÜ.véJŸsÕEà͊]ª³î6&v©½½±KÛÈúv±K»Ø¥]ìÒ.vé= mIÀÒuˆ]jooìR“cSÃ]ìÒÕf–×#v©½½±Kuvئ0µÇ.m mC±êLpý5»Î ^©åU›ž:±ƒ»éùàÓ³µ÷Ùí*¸–td+¸Ê¨!«k¨†Oê(©Á#ëb®iµÓÇÝ×yotÙÍ{'5ö8ô|˜_ –"ohèy·ßÉϺý¥ä ÖeÞ։t Y×@w1öeãÜÀûÑ%DÙouŒ}ÅskìYXí]„}`¹ÚEØ¿ŸõØ`·yÔ`Rÿ5ôÿoëÏúïmýCõ[ÜÞÂ3³>-n…xõ«&­©ka?]j‚Ü`£ø6W¯5q;ûøš´¢Ê3´‰e´·ý‚»6݊öh²„ém0¬ÇG6˒¼×ÚU·Ÿ½X8δ]›À_}DK¼Ú…‰ђé,Œˆ­Qw©>¢ìüŹykØŸ_äãGÕæÊueÞM<’·7Ùu%Á㚟͛èZm5oØDïÜù%Ù¹ówîüÊ#¾Rîüš;wþΝ?_ÌÚ¹ówîü]ɼ;¿Ü±sçïÜùWȝò-8ôyt»ž¬»sáï\øWă³i¦° çÂ_' y“÷zƒW•g©×}~>Ö öڐ\}ƦŸ[›ÌU]âꞝMFùÁ ¯å~ Ž2óàÕ«a‚ÇõJ Z›ÌRýœ Ï´’XsÅ§Ö5J»¤¶ö|ß11i×ä~ŠUqgUÜYwVÅ7Äêëö˜wwqìL‹WÈ´h´ÌÛχyÞ¿­¥½ü¶>+»Ï·_v½||{˜wn†­þ²Ø…Íqíò[RÝ,œ÷ô·zÇà‘µñδú[¿u/&ã%uÉ ç=°fóÕaGp8^p!ÝT–Žìa½É¤Æգ˼­¥Üa}#Óì“ë5j÷îëK­@¬2\ÿäú´‚%jú6K¯‡u×. ju ÛÎ5ØY¢v–¨%jg‰ÚY¢v–¨Yiag‰º–(kw2–(k–BƒÔεiŠöÎõ®,Që;×í¿.öµc«ãnƒíZTÙÖ÷ë`lYeŒ–ô¼•gjT5ÙUžY— T}DRy¦Æí*Ï\¥ƒ¹v@çÆʽîøq«»Ì!·Á'òª•üvgòæ÷»3ùêhCÎä]5¸ =“WSµ6í\ÞÞJpµ%k~&obœEýU¼a“¼«Wґm¬wM«£·Ï5Ò¼¿»êÌQ¥z•¸]å+*z| Êë<˜¶¥HEõ»¿;ojD½Yßâ«1¢%‡LaD¯×7¢ÁÙÙ(ÃJæz»jÓ8ÇU¦~_,ãNã5ÖVÞboØToÅ-áײ¿S0¯‰‚ÉDt£ò"~ÕíÔ ø³Í×uh²¸ÆÐÎóZs®ýڄŸknx?EÓ×2¬=&«¯Ó²ùEóZCª¡@½ÙXóM²3ßlº¶3ßlŒŒžnù¦Æˆv曫Æ9v曝ùf ¦zg¾Ùê™Ú™o6Ï|s]Íc­èŒÚKlQ×(:àlØj[½ïÝéæñªsï^vÕkœõ'41^ÖɐŸY×£fõêW§­Q~o˜ÿk’÷Û54˜©ÇÖ5ÒþàxÜ×ؾ#lþ´Û«3§…‡Ö5ÔvuCå¦i5í÷^yÕgkW<ŽT±+Y¶+Y¶+Yö^Æx J–Õl¶¦bÙ®`ÙF,kV¿ q<¨¡g 6C9.jõغ¢ô~ @+ {_&±§“á餧YÜF›Rwe‘JMÉô¬£êl–ñ{¥ ȝ͹†)n{Cë m2¸¾‚óá«îð4ïMúÏO–Tðؤ°Á+u3‚k èZ„ Ž+ -‰êÑ©Ñ´¹hçљ3ÜÍõèÀ¶ü>uŠÐ;ýt§Ÿ®Y?­µÍvêNCÝi¨; u 4ÔêãNC½ÂºêÖGV/š²¹:jõ1îTԝŠºSQw*êNEÝ©¨W_E½qç‹Nîö;NUE˜ÐÉ÷ƒþc/Çܳð}¸'0üå㏾¿4x„ùñøÍÅé §»´Ÿwºyÿ,ïu "E¯›ÿû¿òþ§èÏzÿþ_íóüÑKÝ珣Ɲ?ŠÏ^}üфþ÷§ Päààֈð¿ÏÞÀ·oõ§_5ìUC46~þ%jt>fgOà7Ý£¤E‘È{YãBƒ¿G´ç>¨f"á+ü¾&\âç¤q df ÷=ƒm2hŽüËð 5‡¯þ3"ŏð/ý¼8è²n{уOõ£ðG5Y$…¿B7ƒRì*ü5c¢_ö|ó½Ô¼[ÿ5/‡ð#—¢á1¿î¥fP{©ˆû-x$µJ }öOa’nþЇ•Õi<¶`ÆǍøSœ«½ æÍÌý»¯§g/‚ÁFkì1‘󆨌‹†Ê„h<»(´ä¬¼e"ûíª8÷«áä âÄYØß׋ñ˜¶¨©‚Eˆ„º0«ª8{8žÌD´=Kµà¯›§`ö¦&¶øÇ·óÛ9¶Xi¦ƒ£iž7s¼úÌiT<*ÒN•ãé™cYy˄ÏÌÜ|œûÕprUœ9œ¸›Ÿ6žýã½£9UÔL2‘¤'±^)úg’IýA¦qÂàÿÿg­YÞ\†7Sž²¸!š\Ä ÷è|æ ¬=û#L1|Ît÷ðG†,‚>êŸb=šFw„#¸q¢O°qñœ¾qrSSA¥2ÎÒÀ°±¿¢ËŸ ƾ¶Éàï'¶g€–^sáßXÖ±²ÍfÐ-î-oÆ2a™¨ÚÛæ¡MÙ`1ýß`Nn=É[½‡-ù54jÜÔQüÊ ûÙq¯ÛΏۭž~íýa·ó]þƾŒÛ õ}xÆCìÒS:woœèWì½BÓ»ýÖi/¿?év¬¨qã„Ï"¼ûúr0¨ì݂ü0C•Wa¨^ΰÒA™ÀpØO.F(0 JƒÈì_”š’%BÁ&ÕKQd2ü)ÍlèˆeIÙ³­£f:G¨`‘“*Ì~ׯåõŠ$ Ü¥ÊýUvh¤JƉ€—ñDH⺺ƒ±‚S$V\Êޒ˜Ó~OÙóÎÃûé/±-õ|,áÝAgà²éÿ.<¦åbf¯N+‹\6~̐ÇGÀ>äœ&²iæ…Xö—a‰ŠìGv >;VŽ}EÑdAo£åcËÇ-sœÇ<1£d搁GæCLpØ¢‘'™º(:ÊôD/TýOJCÖ¢ð‹Hiœ³ì—?OM¥þ‘Û!q;¢ÈŽƒþòeÃÙcÈk($âb ½aŽlÁ£%#”v„ÒŽfŠþ.\ª8ÂømǗLOT_²d|1­JF«’ÑbŒƒïpUŠÂªTÅ„,š(,Ê©'JFÄ퀸OdGAßíšsw™˜·ËÄÜ]6gDҎHÚѼÐßw¹ÅÒ=&æí1±t•/²KÛeÆíº‹üßw¸üXaºDñÁKFÅ -³5õÄì`¸ 7C‰ÌìŸw»òؼÄæí$6o'•Eš¡ý¦a'Ãþy—KŽÍÝBlÞbs·PÙP•]à_f% ú‹Ã!V÷N–˜‘JæÅ -U³£¡'fæÅü03\bÒ¬&iÖVLÞ雊˜JÉn™ŠX6i†be];öÏ;\bï{NBE`öŒš猥Ø1P^XƙhÆÚiäÁ /[¸-æÅDFš  Å“íŸdîdcî/·íÁèeM& ½4¼žê‘UŒPW¹(ÑUH‰™7j‰ò1u0U”•YB3 -Õ%meڜµÎÇ;# ÍÃ˳™¹,WéQ›èŸøÚ¨ôÃÁegðª_ªÐ[3¿ÑëW6ögÍ,‘BÏZÐ/fAG´—4~ai“ÉD‰FÚL¤Tà&°jA€´ó’©Þ£ÚƒG…êsÚIÝC’ƒ¾.„9lôÆÌ6rý"Xómÿ3ˆÆH "ᝦÝÁBëž>T¤²d©u¯àolÜú~0~’·Îæ v¡¢¡ÿ$qʚIœÀn‹³(™Ý$wÜ·|äéÙ`xa~£eªWqgpšŸÜyè>ßôòÿöâj†×>ë6ÅW1À¦OhKKóú k ’Yâ`z™˜Fª™àÐÝÁÂEëð(®ƒZ°+Ï-ÐÔ¯³Ä¯u‡ -žäf… -»2¨Óé=^†Ù­E  -¡¥±&n…ù‘MÓ¨ªÅfÁ2±çÃì9µûþ>ð4á‹þã Ì¢¿hñܧ"ý*¥Ácx–Ô}×~•w 9õw¸ì6a•Mø§¹gðŽREJÁÊMepÖNoî  -YÐ ›˜b#3¼¦pj ¨8ËЦYÞ _\Ê,Óṯã†=ͱæp±if°YÍò˙·’{¶/Tóø“‘`âO"ä…l.§"áx¡yaÍwíWy—S¯¹ö¼p‰ƒ~j‡‡ªå;q|ï ÚeÌî2°ŒÐ~g~çE ã`Ë^ÙSGK<ܸ -¢·ö‡ê|Ü}÷çó¼=6 -ŠÑ„^8½J4S¥Ìý‰Àagÿ|u­]]›´_äýiEm*K/$t½2‘ -ÓdI¤Rðz&*’),¯4M¸*ss.ô´Æ`ÁmFR&hW€¯RóÇ ž5ãˆa\‹Šb­½óÄÖLSó‰$QtäAŒ7cž²Âôªq,Š õa¨w7g¨ì'M+ƒ×Ò¦R‰0 =ʤ~"fÍ,Q&øÇ4š…ž#+ù^µ7ݙ½éÃ)S2®½pèø}š6{!åöBª³†ï\÷côÝ¡Xë~5?é¡&JB$‹Å -lTNžÐÇ ýîP ô»oï‘Á—⛂NøÞ˜å@ýÇôÒ[¸4Á•„0-œó8‰ ™yБqÕL£ MU3O&%}KɅá䚆úø“%€pŽæAñÑì»L°Yðú½À!bpö1ÿòéïE¤šüº·@× ;5ö+͔‚§yæ§vàØóØÌ·¦qF =˜ÃŒ¥}vkHkJ.ƒsbö›t]ò(¦°ûW8»å܁% ‘6„¦„dcª1] SÜÝnÿEkr6zÕz^Îá?sgz‡5ВÅÜBŽ˜±9EÜ-eýbÓëVÅLÀÒH5“@û>ô/ËD,€Ë¤ VZ¤wWš¥’"“n2ŒÛ=Àטæ-Qj¤0êP¿Or8cÌw®¿k£ßã#Hcc±3=$ÐQJŒ‘Ž`Œ+䢑H ûÉ$¶ú­"ÕlN´&k€„ç½!’¡‘>n&)°|îÅRâÎbDIÃ¥áòÓ½J >R,ó2ún3á;`aÀQè;@Ÿ[šgH‹>蝘¥*ƱÂÈêC–øJÒw ¼í‹…ؾê)b ¥¯1¾W†º L/=mÖRaa6ÀÁ_§°$¢4Š,çÔºa$t¿õ¹‘Jn@8_©ñ¼Ò£% ‡ÍpÑDÃã8qMõ;4MT -1Ÿþij*‘šº'#P§bÉ @ÿ,²j½n5ÛÒk9¿oI-JÞäJÅÈ#,è7=Z"læ%``Q‡Cq0Øzu¸Öõâçi\سÁKf°yŸ’V­Í>Ö¿€\ƒïáö=ʊ?ô„†Þ•ZäJüw;ÕM Ié5î4=˜—ØïmTB”fZ®…Öé’D3‚Á[D±8¨ŸSC1 -ª~^Épxúé,ŽÜSúOª'ŒpÒW÷VØ~ÑӶ߻—n‡Ç¼…Ä _BOÓW‡öíô´í[±ïf<óS݊ ِZ$S±„c•ËU%#~=ŽÕ{ÝÞEy -KáX­~H¢S‹ª Ïø›Ùsýã­ vÀàC¬2Ãì³e°àÙ3«ÓÁ։²]÷E۔`…>*}–€èÉV|aí¢ÜnÁu ª”1 ö€}°È,7ÌèÑ0VÒFèõc r½ bcîU³3(ÿ¨·C@°e4#eƅî)ÈL„îb -hЃžÉ° Zõfv^ïö,IÓbïÁ¼†(ÿhÖdJ©8@B\ï=Ð÷¾´ójÑ»is½§œºθ”{ÔÜbnÆghfíBB7 +Ò2šÁ -Ͷ…Œ‚`B‰)›í³bʦ±©ùgeS³Àp%GJ (Àp¨µ£†ëAHH×א’nHîY?l‹>8JÎPŒ,lúô«…” vÑ7YJ»Ìn ݑTLí)؋à",PRÌb,` Q»àñ‡GK ˆ#“nÑ;Š¸^8õ·À‰hXž¹¡' -žMSíˆì»iA]a8V͋X*r0à92+PRó!›øP¬²q¼ÁËã4ØàQ2zJ€0Tž¨á{PÒu7 ¤Áü¨ îð;Qq†Zäی³dŠˆ! ‡)5ÒLŸìL$E.)ôiqU a¬‡Å ãf" íסD@óô a0D‡™hà^Ïu3 ž Áüh æð;o†J†x©æXà# ^æWE¤-KÒñ”‰i§å6®Âc4i¦2ÒcD;ó´ a0B‡™H@oHç:Î„`~¬qøH7C#{V3ãuIÂp€ŒùÃßl^¦Ó´x €ŸAˆ"íàýqÈ.¡ƒIÐ.í<ÌÓ.„Áf¢{}¸i©›ñÜX܃n´sðˆ7C%ï©Adú/“©*Ȍ™DS+I x•5µd‘z‘‘¾‡#ÁBÑ?g…>Ùèõ¡¸ˆJY¢ -Ò"ü5úžE ¾e)|?Q‘@¡¤èŸ#8Ì€¯?(¡’%‰9!ñæ†H2”#‚´Bâ‘@Ä6÷ v3Bâ9X@¼f†H¨èý!ñl7CâÑPÜsŽ„98âMSiJ ‰G07D›H¸ -©GRXH=’Õ܃V˜s˜í÷v -HçAf|„ÖQ€ÞRŽú’ŽâtÃ'ÔÀ‘nšFSÂ_aÓZ˜ßZö˜ö›ÏJR!éHä -IG‚™{D7‡š!ñ, ^3c$Ԏ -ôþ®µý,l[;¿m‰nÛz€ß¶St*J{õ¸£•!ÉED’Ò9+ “Äæd5Bìé<̓.„áøj¢€{@:êf@9 ¸'$â ¾Ù¦éS愈Gž„¦€j$[D#ù‹@$ŸVúṔ<ÁŽ‹°Ò¸éŵ¨{µhrƒ¶XƒïD­iº幀Z¢q¥î 0ã&9) –•¦b‘ÀE È)}ˆå@žX‡EXiØö½­¨s­RÏêä†l‘߉VÓT) -p­DÃ"‘ÇíG+´"é) IXî)+9¬ö{@,òÄ -@ƨl±Ò¸éÅá>´Ý ¨E#pOÑ  «ÿNԚ¦ËÑòÄ÷럍¬ÿúi£þóKƒkU,šã§udš«øiS%ÞÚMk]Iô¿ÿñßßöÇÿ(þ>íþ³ûûOÉúw³úæÿ¸êvÎÐrg¨ñƒ–:i¦ÀÕÝ4Ös9í¨1àU\5æÉg͸Ž»uؘ¯ä²)£!bì›#Š|r)ž\ÏèÍÑO—ùs¦À5<:úÉ2ŸŽ¯êÕÁGgý:Sàž܌o¡+ywÊh¸pJÝ>Sà:Žýh™ëÁ«8ðÁ÷OZÄ#›u!x%'P¼Ì;4®ãҏ–yˆ¼šõMkø‰pt³ž"¯ä+*£âB¢—9‘ŠÐên$ý‚2G€Wt%Á£%Τ)p w’f¨%%ð -.¥ê-¤u™¯©­îm‚TÝYTYZÅãÏÍúœŠÐÊ^'Ò¬ß  +xžJ¨¶Æe.©"´ºS -…fÜR\Å1‘K³®©"´ªs -4ëžè -ªš-–LJ¶ºU’’ D^ÁýHÈ -¯æ‚ Äà…WsÃyѸ@à\q³ôª$ˆ»‚—΋ÄÚ®à©ó‚o®+xë¼,\ ê -»Y:U’ƒ D]Á™çdàMWpèyI·@ÓúN=/üHº‚co–J•ßIWðùy¡·@Óü~^´-Ðtߟ—v D]Áÿ7K§…D_«ðÃ$A¤KrGWʈþn˜wºã­á8//32gñ+Ž`± SËÀ~<2Ւx–™kâ°#~1·µáG}êšÚ -æ«þ¦Oaúns°á“Ch?pnª%q ÎÀGXåˆ~ 2˜Lu£àÅ؞Ñ'ÂŒÄðÀÌ@- “É0›_êÏí_0è$ðÜccÇýÏ{ÁS{¶Í -œýê2ËMSÓù úšXâ7ö JÄ,3‹ƒky)Æ¢™Å҄@,Ö/1®//€q`»‰ÙÞX>ФªihÛ":”‚WsWÇJï= ¶³;›K,m‚¢3è" b4©Ûw‚F¦Ê!¾ D?Mß™G¡8‹¡ -U$µ#QA_S[9© æŸÄòFÐû(\‘05Ý”A2uz¨gA»©ÎVÙfªëm •B"(9#TILI¯äšàz<¸üá²pýmiUüú7ßuCâÄvb¦2§¹¸ÀÌZ|æþó^Øh/N›Šá·=7@Îl”Fq…Ï&^?b#ðã˄5ð6KOn?ÕXä‰FŸíÃø,àMé^_ûrÓ)ß×(å |­°næÍÁx\ühûãúyN|d)‹Xá«*ô‰ˆpà:tô..ò'u·Ù'>̀\*Ó tú*_9¯­bӗt,Ä;}ï\¼\,¿Ð7¤àE‘¸!у¹f(˜º€úD|šj·‚•85;á¼:xWöòhúÒÜ4‹ -eaŽ@*Æû Ë[«lö2•…¸÷«ãærú3š‡‹`§í¹­la¿°÷üʞސáVµÓwPØÙá†ß Á<ú³ZôO5ûgQýmEÀy­URNÿ¹¸÷«ãž¦ÿ[V†òbºs¸¡Ì¬ãš·e 9–ùLÜeqGÃÿÒu­Æú$³*˜ò¼îĝøÂIxá §™ÇX„årŸÑv̇#÷jF’yÑ B!ˆÕšá· ª©› WÁm -ØãŒÄY»ÐH¹ôîˆzÑ é´UÜUzÞ³hð&3DãfN=cdG£Ô‡„¤÷йM=Ž¬É%q24ó¥ìv(ïLëI҂…—œ”ëÐÒêù©53Kj•]>nõ„“.†`Èíw¥OMIÑ`Š+‘æ¡øXYË$­ ÇÎéٟƒsZ‚g—£4’DÕøzˆªÇ}@ÌÔÉwÿû+ԁÖ"#œÏZP´Õ‚Ò&3t^f …§Æ, g±)Á­3¾IƤ•W™ľFW -oäQZ&‡1Mà+ÑòI–è“@Œ] .Y€ZqZ\S,6‚¯þÌ´œ|A "ÒtO@ÖÜJ_*Ž¸œÍ[á© |«ZÏÓŽ¹€DwW/W N&ž2Ó%¨(ãIEÌÔÌTœ˜jÔ AEš0Ó•z$•eüd…ìŸòâ‡6mò‘L©9Á[3;o]aæ0²nfîLøZíÙӏ•ÌF$­0ƒ&èqzmÍÇÚ³XB5ĆªÌfBÌlÝ8 æë­f)źôb«„„ z ¸}Ì3é&b qªéJÿ›&1ÈXx•Œ hí|à™arn,?„~yåŠ~¯œl2ô÷À,è5Gʈ0ÕÌb¼~¯lÀ[ey†* ܏Ì^À‚W œd­ÅprÇq„·E¸~46ðÓéƒL -.Rû O´¾&Àµka•)ô A`¼^•Á÷SÔ>ñ¦ˆ³ f(Á…ªU&ó§{Î9£J!Ä!ô[`ÿ¡ˆIsێ^‡œá®1Š"D’J¸¬ûÀè¨i‚òŽ^È0F:ӝHšú`¥nT#üo±‰D…\y½càšíÁýzƒ“ë,•M‘$x¡”é7Ñ*v„)MÆç®!Œ¥ >nÓd4›^S¡UmØdXR#Ka?3=£Lá•øœ âÖx״řñÙèµ%%¤8Äx€~rєŒñØM -}GmTë1±Ár‡kG8– e°³Sa/Z@ÙìoÆЪ0h7p7‘¹uM€¨ ×rÈØT”Õ,ËØKÐa OaMT.MPy^a俞†w|›P¼†1åTŒÖºŠa¶˜0°ÄpF`IÌÏÌÌì”Ìh(\j§gAÝÑj—Ú ¼d}ö ›£ÛK͌5 -ânUC@0¯4wgqyM‚ž¶Nrݱ|O*Uî£{£g5ÆéBoܵ±U…ÐõÀí‡4$ã-<øݘñ^ ÷”©ù΅mLx ±Øìw0ÑÛy¸œ §Â啕 Ðrã2S¿ë~ ûŒÔôxøE«zayâÑâÛÓ=s%¿7HN¥ÞÍÓ¾d å›ÙH;RïaÒr‰2?b!âY} /¤L—=šdx¥Ê´ŠVã½Ó:[µ÷–Þx:í¯,¬’‹à»[F…E®À’êV/~.®ë’—Ád×_É*Å%ù.\hDû¸„€©£½(™s(à ™Á‹MTéœ×x^é½¥sn½axC1/K0>^ Z²²ÓèvUX?Y”•,š–‹Òm™ùëŠéPðЙ}U\ò*zòb7|Mgñ–€‚‡Þ©ÏM‹]xQþYîvå×èŠ×§ùëñi>Ì»íó“{ƒ“Ñ<‡ÜÔ9Ò$a¨h¤ g´ôk5C`*EÊc-'>»3ïHƒ5‹5š=Y\K‰|«0ºoGôm¾–|£/#³“àÕÀ S½-^}¬À¹,èðöߎèÛ}-ùF_Fïn2¸ÂR ex•e#ƒ #L'O£·îõ÷·Iã^ëå`ØçýÆy·ÿÛäìßÿ]r#凱±A.@ÂáRQz«5²Á5|‘Í‹`梙™ÛÿÀD‚IZ²i°Y3a)ÅGË1R$8ie2µgÞÇ5M*8 )æaC|$7BÆIfœ¿ U+ ´h%è½Ü@Œš-ÁF#=ŒÐ4ӚºH"sO#g&³ÏÔ/H›¨„´%T¿½ª4lé"Nƒ -²-àw÷.Tü×·QË3·TºFRÏ\ÊýÐ\l‘ñÀtÕ‰Lú¯Öĕ§$̋ÄpxKo#,MŒ ÿN–L˜4WüŦŠŠŒDŠ²±‰rÍt€vVìŽRÌÐÓ:¤q2Ã}›¨i0GNcôÅ+™BÑfî5A›(ñïbû£¿÷ÀÄÀPß3Fã‚6´C‡GÆw‚3¢ -“0‘1¨“ {°\$Wk˜ˆáX“ ­)(Ì ÚX•Ð¤…,Ö$aæ¶^˜`´sЂÐsÀEÒÆ vÛ ™ß=!ò‹2x¬f¤tÐ N_¦|¿ñ^VÛ'6&K _"õ ©´s¿ïbœ¨n‡Æäd‡g÷Æòn6AIó ˜8E0fê&,ˆix§bÂÁ¾¶L ™>‰Þ"Bj[jqH cށ"sã7ú÷ef¯s$Þ¦,Ë8^/™² ä:0Æx vv†¸ÓÁ\ãö“R^Æǹ>Kø€Wäh¦3+ñ4“Þ¾W éò5H—œálW—·éu%[‰¿é£¹„Ãh}‡ÏÍp9 -ásZ|^‰ÓéçJxb[ÛAÎÎ*üÓ6Wâx˜”¾ -Ï3ë}®g6ÙJ|Ü<%œÀ«ð>Èf®Ëý ¯u†ÿì;ÃÁw³ĄJï-Iœ·ÄZöðò¬,5…F™Ó¥&`êŒ)ãG =و kÀ NÅJaôè‘LÑB]‰8|´„4T‰ =Ŏ”€‚qfaÊfAA/¦Çy´àÔ(¡‰†°™­StñÐàeÆ#7M›tß#(äðÝ*/¡“úTB«pu-³º'à`ÊBï$E«»âøZ.ø2(|`£;Ö=ù~Ð<ìöǺß{{Žz^øËÇ}‰¿¥æ·Ç½‰þ÷Ñé¯Z=֚ ¦,7ö‡“Ñyãa«ßzž†0Ú/ù±a~=hõzÝçÃÖåy·m›>Ք¸Õx2éw{¸ñxܼ5ÓøӆîñÍòG´†XúÌTë{G¯Õ>×Éð½Jõ5Ï |78ïå£q÷lLí:û6*4m˵ZÜžS[;_%x Žï†yw”ßú´Ñ´äÖST$ö{˜¸ÎþT×af‚ÎÃW(ð óÿ¸;œêoqã΃“ý¡^нQuOõ¶:98Ö-““{½ÖøÄ îñ@wêÃmμÈî…s¦?š¸º ÿgÿ»¸Ã+¾¼°HÍËõgüŸù¿·œ¿×Äþýq#.¼½Òðßõ|•í9\n×Á7ÍäzP·ô_ Ø­†M5ñ¶#æ>EàŸøÃ™·Ý?u[†ó}þŠZ7Xñk<óþ ÛPè#X™½RêoâYªEZnhÍ¥Å{˜ÚÌü¦gñxüFOØÇÝú®?xÕÇopÐÞ¼Ó{3µNîÚ¸õ½ž@8®nÝÑgñËÜ5ºu0¸¸èz¯ÛÓCÆçÎ[Ý~Ã41`ãiºeÛ|ý­»£®>.i ’ãq«ý¢’ýÖ¨Û.`^äuPpü©÷hh¬¡ð¡É0?ÉÛ}$vðWÓÐR£QÃJBá­Ãü¬q»ññG›.” n7ðå -4n=n Ç¥£<ô;“î¸Ú£‚±×¢øBÚ8 é‡Q~÷eÞÔ1•Å‘ÄžbÜBûtvÕ7~fMe=mæ“çD{ƒŒUŠJÚ/ËZögh:E{ק”_¹àHRAÈI -‘CúƒTÌܐ›hÕMóZ9ÇÛsÓL0–ֵѯF£ÅÛïåú {g»…øVØ{Á˜<Š…ƒÒÏÜ}·'Ðó#¢(a™¨½l·|'=™žas’Zîùèìl”?Åy™‹âæƒ^o‚úÕ`ØÌ_C%sºÁ­)DF-RôǓáË|8jŸwóS-è~Ñ8҄ݻ{v–¿Ðï¸õ´;^‘‡ß|4´ÊDˆvG—½ÖóõÓ÷ÎèÝÖ7?º=è›NUfG›»»ÞÏéö^øÚxþ<ëڇ?ö¶amëkS &¹«ãîÅeÏVVØHÓ"-~e, Ô³•×ßc½ Ǖº'¯p÷о;éw'ýî¤ßôïR»{‘W;`'Lbê½båGÇÀÛ8 ûš×¿“£ãnûEÞo´N‡qÞOŠÅ“Ú,–ܸ 7!:~2Z°v¶Êkk«|Ší¬g•YRºrõnoâF+ŠDúé\Fh%§`gPÒcúï°Ÿ›ƒ3¼éuñ©‰-Aoj›­îeù©ùä¤äïZýq^ý̄Ô_™Ò™ùdٙy}yY¶ãe;^¶•òȕâF)+Øq£¹Üh¿×šè‘|ŸúÃÖùE¾!NÊ«À–0#3摹Ê)®2›~ëÓ1•äpI“w¶Ïäe2=ñ ó2Y’“ÉÞK[…d”(ÈæmrÅӄc¾5‹2̯„:!ÌÔ1Æ0( Tœq–, ÛVB%I×hè5%¥b©]J±&AT’©Oeði… @ò6H¥ ®›¦àxKˆ5bÊ3, >`]@ ¨‰µ•JU§ ££LQÝM0û£7"—reÄ»$Ë{1®o{ƉŒ1lZÆx£7”‘0¿›§é®¡ßCð&_@é÷ºß³à¢üþD—­]@2‰Ó IÅPÕnMsÞÁ­˜L%æ6Ì*öÍ_:ÉF/.wk§öÚ"MáäãnŽ$Á BìXOØأ段Ùëæƒ,›%`癨£?«ä]"ÄΘ÷~¸ÌJÓ ýAà½â ž4á¾íË´œÚŒ³èúeAD,ÉP‘Ž2ndö,K$·ñ±ÍT+Ú ë -xn®‡<ê¶Ïa(çÃÁÅfòÉ«‚¶81t‰¹}ÎcóMïßÙκùe·?Ê{okQâ{ÿy/’÷Z°ž( -ÒXêñÇ[î/Ä[xî0¿Ô‹tôÈü$é±Ã®î3Ò3D†Eý|d,ÿYñ%†‰Ütúë½|¿hLe7–ÑúV˜r —7ᏈuÕ­úÝö “×1}R£Ú䂊,Ã}__ú¦‰[>-ŽÈÅ©™„òÇ yñé+¢yØ˘>´ê±FC…„ˇ´Ö©²L*ü #cì)˜žAµæúé‹–¡LUºÚ"ü€öE³ßM6¤kŸ/ã§AÓù<ôñY«ÓpÁëu‚¡P9\çc÷Ñàl4F’‚\ôºŸÚÙǽôk|Ycûì“Ïá[}˜Ø}i/ò\°WㄧÉîÈXåÈàè×ü GÆv%8ÔWÅ ‚9/«`E‹k˜›zÞW9ہO՗ß-¢¿ˆìÝs½†äz²¶¶`þãôOÿµ7·ÏsÍYú Ë´&ÿþ¯¼ˆ4hÚYЗؿ®_¸ᰏ&ðý~oðj™Ju8\6ŽÏ[Á«ùjTqý=ŽU­Ä6"Ûd”?>>ÚïM†séuî:ySú¨Ý³ªÔ$$m÷²Õ.šøN©¯¤ížöúfÎYBJÜ7î¾¾li¦ºŸŸ †yãG­“qÎç+Ó{­ç£ö9Ô¦ÛÅÿîøð6óျ¾+F\ÜÿpMei†Ñ4T€[cЈüñ’ÀVgxb¥ÜcNxlv‡bNE¤?ãé’ôWLg¶=w -ž[³ŒµÄ†³—ÍæñpõvÀ%½{™_pjمƦf–.Š¨¢§Ì$!jô†ÌzWpܨš:R¢ÄáŽX»cõF Ȝ) ‘=…R†y*}˜%f—*†û6Ñò$ò0N=f´é"—d#cdÔ´Õ¬û¥øÏ$“b~¹ãgú²¿t/. ´e)Û°ðð£aû¼ÛÉó -»¦‰àûçˆìx _0¬€Ê6œ‹èþ ×1±%KQ¹¦Ùüàõ©›–ö©Eµÿ§Ÿ³méx¼yؚŒÆ“3°È°Æãç53s GŽI. CH’9¼Ö¼2†¢+ù@œ‡UHI& «‹M¼æ È6¤V­pûÿ“Ð"‹Þ&ýq‘ÈXá%µê§¶>¨1TO³8Ó½˜z5ýÁâU¸™AGP+ÖüEɀ§À‡H)ÄÇõ™Ž‡¥pÿ/Hð/pIÏË´|!ðx6•ÉðC¤¤•/¨sÓ7GŒ*—þ×s®™9ŽW¨Ô°W},IsªkÑFÙ.)—æ`“ñôq©UKäÕ\+†‰²ôìeFQǦ?ReÎ`”\”ç_úèJ°‡ d?…dlÕíÔýŸK$P€ã@ÿë¬TÈÌ\ñÀb\ZW‰U¹¨GÓœ¬¡žK›‡šàje¯PµDAHÀTëýü)?=k OÃh—¸fù‚’@IÅ -ý¬ &±“ôy `êS$RdÁ ƒb•• Ü uKÇm(¨@jÓCñXÒ¤Jbk)™«LKY¢L›ž˜iÍ`z¹ÅÂà>R :‘ÁÂa\qؽW•É]‰¹‚ôN#žš[Ý)׳ØŽ«WùmÆ5/¸Ð¸2c‰J¬ðHi£˜KôI3¿äá{¼ïíoÎÊVï -¡£îh\´EÎZÎ|\V©f&¹äcŸ÷qxKѬMÑôhÅ ’X^¢¨þÃô¾ÕŸõþý¿ô0N/ÍÝxO[§G¹n‘ïéOš¿ŸæC¨itroðb2àãÁå—åXÀѼê;À~1*gy¯stìæ@­½ÂÏèÙÖxr1¦ôô½n‰õä u<ÑÍûö:«Nwü¢5ãVw»ý­ÉÙèUë¹ùýñ£c¶÷ôÎñÓ»ðmþÝñÐã T]ýtæÖBK®¤·‹çpОèYëþ·ðÂG€Å¾N]þxëÙãï|ÎÏ·7__ôúºÁž^pÃîédì.c¼ug8l}P4ïè-A;-j©+ïOÝ/I?Ã?cµäÍ?ôG'/[ÃÑí æyØöe«7qá‡Ñœ†4eÛÙތŠ_7žT§Ý~G›U¡”&éq>þiR\aóϯÄ`ûƒþ¼®ÚèíÝ©4Hjú.ÅÛ‚-&Dµ¹î½®•vF•Ù]ûä×g -_¼¬Î íÕXä0ζVW€ý½×%úŨž^8C5£©¾R?ľ9†›A®V¶k+Î^]õ½œ|÷~oÍ܋ÈÅ Íñ«n2+L¹my%·H8d &K‡§õÈç畸‹kz%(—íuµzE´'RµtHo* éÍ’‹¯›;žÓÁX‹GùÙøÑ°«5ÙJÛ}èÊHȏ“a;߇ÈÝ«!FèÓíJôã"·:Z¾zÉÞº3Ÿt¬‘¤Òš Z#ȝû½<ïÀZü1@N‰·ÃÁåaÞ2Ñáe'þôžTà ÆÿãA·?ÆÝ|2éåÂ÷齘Ðü"_õàþ†5ÀûÖ¾×ÀOgAš4£±<¾ó„¸+ã=øÇ÷âIÞ{:xb:`zôx0êBçñgî:UˆM3Š£;Ãñé 5ìæg­I/Tøýš 6HH¢ê4%cw@\¶:O2ó¢ ¬¶^„.ãiX«×%¢ˆÛu.»M:f)¤x`£vMÿ4îLƃƓÖhœ»¿åÓXï<`¬A+ªñ¢¯ÕþÁdÜx>L.·íŽ½Ö8oœBð+å¯ZgËÖe>lŒº“žÏ÷ûš´,ºãê9Œ‡­þè²¥7\ûîW·£ñ¹qH.x:[ƒëÞM*·}>ÌÝ®^Úxè¬#‰”°Iæ5ea–¶ û°´±ïKâ4vMÉèzÐê¿lŽ=¹Xa*óQ>|™7À²Ý¸ÛéŽ[§Ý^wL ùæì^ÅçœMW+_“Ëƽ:ôD#Âq#ÜÐ>Fð0»µˆ+¢ñ$×ëh,Ž8*<òh2¾Ô rÉC¯˜ÙµúÏ'­çyãñàÒ­j¿~¿78mõžä—“ÞÈ#,rÕ§ƒË)¦üødÑðgZÞ/î>¼X5ù -Sîí¨qæfRó€^·Ÿ7Æze”¬²¦#̎ÍlqÆOŽ5;;€5ûpÐqjLñ¬Çºƒ—9žL÷õ?¹× †÷ƒÀý2šnû—^ƒþ_B@¦s›Ãùx÷õØŸñܦy¯ìHq°2¹ëÈfŽïR"Ð]¬ÛÂn:ؔÿ9iÁŒ6Žò—¾b:».[m¿€Í̙hü$ïL-ÂéVšGøEÂfąéæÇíV¯ìJ‚EÕꏻ =¬ÖÈQ?Kق^îûíǐžß´°°æ´{¨wKf¨@˘«D-Z՞šK›CJ¡Æ=.%î¸ådZ6óîÝü•^BZl·úm¿5-ž{­vî ç,jÛbºù|rbóÙ¥)çЛ/_œØ, å"²cÛpyÜd¢5£@.×LõޤףƦ/é_ç SúÞqÞûKk¬×ȇGÉqNÛ£Þ2pªZ‡-ž‚-^]zBí£šQ¸ TVaAÁ”?îµú¹>ÃU5Þ®=f`áYkrZ)]ñ+<è"úüõ½îp´¬‹ÓÏçíAŸÖ‘ʤÞj1KªSXzû§‰Ò8€ÄËpX١ߝëåÒ·ú–GØ3Ï3X*ͳÇRq¢ýå3†a=•é1ÍP2Òº_-Ç`«ˆá**%'óReA.:žœêöÞ ?=ÎY"GMÉ;í^÷RKàà¡y­%ðçz³;½ÌKë…G†(¼î½Ô=Ör»–6f;ï5—$œCüÇ%[¸·(VqucÀ[-.·Èg×ÖmxØ'RNñ¾™DK/irâüàXíÏóNwrÈö¿|äȆÖf)EaT_"î€áõӐވñæóÀÎç“Â|δ}deÝガÍköÔKÏáÒÀ6F¡¹õ£YûÓk¢ÐöÑôXN,Ö¸ûø¸µ õ2rœée/'X±ÝŠ™FIf1Nӌ…†‰þÀï«F·ûÌAÎ2¶d){ZßòÞ[¿N›—ZÑj…sºc3íàÕ­^oI³Ñ‹îå©è‹)n<Ýn˜C¡Êº8\Ò´=èõ<›.Qò§ »CaÑ3ãÑÚ€âßNôύ@bYFqˆ¸÷S~zëÇn'Üz8ÐçÎ/‹GÃÍuÑÐ8ÓýѸ×ì[ŽÂr ‰à9û@`©­òÐeçBÿÜëWï×e§:z,á)[——CÛnA ‘í ñ™lºš›ÓMCçc*X3×°àÅ˚j.Æî…ÞT͞>ŠHçhfKÎГʥ¨‡AGÒH6½K¯¼½ñûÐTN†íóÆÓaÞ=՜VSªÛïb9ˆE3Èún<ûÂö49ç·*Ðr²AhPX€nºÝÌ¢Àfh›]Ân:ù¨û¼šù"ÞqjU qbK´{Ui؝vÇ­Ëê¯81³cï ›ޔ5¯‰Ö* ,ó šºÃHóú6ñzÅK›;ÍÁŠÝ…4×òLŸÖ®ìZ=K›]Z_È…/~Þ\¼m# - äîéf#°9lK¾\2ÒQû²×~³€™FíþŒ~8Ýh¬u™ÐŸ1g”zÊz­Ë -ä°  àòùŋfÞ-~!»†f#WhdéZÆö†¿›¥ÊCzŒ¡(un+c‰ÐVs<Þ¦UyçOÁ±¬Q{8¸\Ö䬮–!–µ m¤ùԒ½bÞ 6êÓÖp´hJý04 ¥ -­ÇḖ5¥òóšC¥“ÑTO*´ö=©Ð8ìIÙÎ:돛ÞŽh]Ïý…ìڍ´Vî ôe³5ÒÃõÖîR¡eÔ<í‚4¹hÒGÍ~þ¼xÄç´jÏuÈÌ4ÔçR ¶k£+†XÎùtÃÑyK‹óù"jA«| fWß_ª¡qµlÏ,;3 -ŠIÎ^h_ÊF è'£üpÐFŸB¹b‡ž UûÐ,$½sþq÷uÞ{œ¡*\È@È÷ol_÷©²33ñ #ÌSG`Lº34OaxÃÌSÅw£Q헙Ç*¼­~€B`$;n½Ìjí»{ÙËïLV–ÚMþ¿ÿûÿüÿ¯Å[¢ÛÑéS·=<þkÁÚ´íځûš¦ÿAÿE²Ãy·uÿÞÛûQë­ÓÄÊÁåؘ ‹¶Ýo§Gæ§ÐJ© *P` ›Îù[û]¢ÀãƒRy˜ÃhñWñçGøù³/úꏷ[Ï>ÿ6þã½ýo†÷/οxÞÿÝ·÷~÷ùÍ?t[ÍÑï“þr7ùä‹o~¸ÿõCñç/ŽþþÇ‡ß 'muï.˜Þ`B|E£Ã_Ÿýþ›Ûÿhþé›/?¿}3úŽßÒ¯ùæöÑï†ÔêÛñþó¿üçÑ7_Šüø ûÕ×íÃfóÏgÞuÔù«~¡:¼wã õ·ûãÃ_ÙÛûüÎÅàh¤ç}|þÙ×É'“{‡â÷?íÿÚûãOú5‡gÑ·§¥Ø~¯²3õãþü÷;Oš?ÎkØî‹_¾ùòŽ_¾ùbÔ¼øìðó“{7ïwÎôk^÷þyòhrxöËOj¿÷MïÙgûçãƒsõ7V È?ÿpØfGÿúæË?ÿñ'ƒHwztðçÿèOø×áƒÎƒßí勵þþÎñÞ'}Ӊg­ÎD¿&ûõægí»mùŸ7ÎÅÉí/ï܈ÿðÙþ÷Ÿÿó³oþøýƒ|ò§¯üö“óÛívë|ê~v÷ìèܼšE·ZjØýý?¿èþãÛÎ~ïƟÿ¸7üìï“;GÇø àÓon{ë×$·üå›;ýö/>ûêáí[êâï_u•º5:‹ï ÛØg/¾`eûðÛяšrꏹú)Ž:_tnµô$³‡_ÝÜû<ßï©Çf =ºñÍÁƒ/?ùéî癄Š‡‡~N>ùZ þñٗ?v~þ‚Ÿ~ò âýºCéëäOŸÀ´üœü”ügHõõþ‹O“=»@ìEì—OÞj}ù‡{¿ûìoCxM?ü±`ýšèôÿx ðËg_ßûÒ~úò§»ß™öŸßý§ÁÆÿÊèü,úìë¯ï~Îÿüü+‹è§¯¾¼Ýùõûàlºk|ö%½F·ÚÿÖuáßvó«'Ð*“¿Û?e‚Îú+’=.OñՁ°æܓ-ó{šÿe֛×mºóÝ3; `—wl_¼¤É¦[_ßfð³S&h¯~ӢӚû2ƒ`¼ÛoJ$æ_{EF¢ •ŽL-Ÿ{PÞOr3ÿ÷[ºûôyä¿gJ·:ÃuøwíŒ#éƝ  ÷¶LÄ3+Ë<LÔZ¶)Np¶`¢ÛCÌÎyËóþ;yO!C[N¡%à¢}ñBxb•Ž_@~Ïy=L·'å,ý4’ž¤âŬ ¼2yò jÊxçqº}îø¹§èe(ÓÀ7©ÃgÔD-¾Qõx²žÝ„B•©(¯ºI¢bّàŸy†¨xæi¢ÜŽPŸ¨Öd |š2à'ø¢A?B_—O=ȳ0,½ö#êOÏ4Åü Ñppêgð5Ò ÿñüfÑ+šßóø=Ža’-Þäd˜ÀŸZFÿ_ž™&jž¡ÐpÓeÞ¢@®æ¹‹±q#§&‡¦ ÿ´fÚôoÆCaú)K4„‹ÆŽè…à2Ô/Ÿêqê—åÕ0BÀ­Á:C 0kŽ0y`~hh@Ó >gÏ.¿Ï­K Š|,Gð×ã†h4z)M«z±¤}•a<þiP;6z88Í/N0HuøÕà^Akî97››XB2´–E#ÜXÖ^;_h4^}AƒF‚1dvxÀínlˆ[Xh4¥ùÔôFꈃ˜Yןy""ÀÁRffÃÊ -„PtrR€¿o1.a‡XÚܾ¥Ðˆ½Š“–GW±ïŒ[]ä&̒.1)À²§êm$`mDHMìe4°yY†¥órhXB"yÀ‰]F`h¥n úÎ×5méÎkeC¦Ì‹°/¾¼ø¹IoÀ©¼¬’“Z?Jêm®ob1‹†µÂih€ž”[¥Þ Ýeög4Nå?W{ufbºKàԐ6£pÇþ&cFÙrK§5I隍’õ;LyvaH½š-‘ì÷¹5ÈU*û >¥Ìx‘nmrõT{t˜cìÏsÆŽL–è ±ǝr˽@=u?Z‡À~Ýå?w&èð:1“Õ“™-s [¾ˆ©rò9 ¡µ¾÷p›.®±»֑5¹ýƒôüàgέ»ÖzOÁ9p´4EÚ-"¤@i5Š4[DPë„ó£ vžå=Zq–Qxí:éuè>­hu¬WΠ͙O*ߚ¡ÔÁû4kqÚ¿`Ð #ž1ãŠïÐð¨d‚f€Á:Ë4SC[¦ùôqB*8Q.xB"¤ÂM Äý‰`ŕ+ý†¦ÊÑôOoŠ¡_×ÕNºÞ­¶ÛT8)[†"i"´±û Y—CÍÁ)·ØPõ\aõ´û¬‡n•OðÉq*ìg‘ˆ=æáíJØFq3šn¯SvðÛå ñ|¶’uoª«ÐfrǶôZùœÞÁʐý~×GÁ Çc†>\`®JfU³ë§ñågf …öÈ(³ò>ë¹g,ÛÑùߚ€KUæYèÁ Ï¿»Øí"G6™ßœ'Þ§È_˜b.‡Ñ=h¡Ïj9Ól¤^kÿï…ê¹ÿ”n¾´_¡©ÏA½Êîd´â»šmì ¦Mô‘ÈÛÆð¾ÜÉ>ÎÿÉíd±mŒnc`…n¿²?ǟ`îË9ºX~ŸEðx.U^ nSsfû<…le^‰zÂúÒÚoœÒ•¾gÎJèçÊË<7ÿ‹8.´<æ¾ÌI"—-(’:·ú„‹rDPgÖÛs º˜˜4©Š wfíjyÜö†ÓE¢/ÝðG~µÏŒ,ìöÍrÁAã F¤Ï e~æüð5$¿‡Èu@áÕ%àªÚ®Íæ ÷j(îË/ò£úl 4–”=_Öü§xOû-‘&†oaJ? ñû ©x²kʕþ~†™ÀkϕnÚËt«c' O…Pf噐ö·'¥ÀP̳;WVmPi¡·€¬Ž·Å†mrl0õs_€d™uØèȕ-V §òкÅòi÷ÍÏ1òû2¶¿qµ‰ÆêÇj똷ۂ_øy×k7ΌR¯ÆӉE]˼ÔOU²• t\NîÅf=Qâ4 öÈEþâÚï×WôÇܬ]ϑ&sý¢Mlr¼÷öØÇvøνÂÒ¼·^m¡—ÏX](¶YWȟ}YÆ~òŽíÀÄdÀ“nȏÂßÉf†ïýR†ÏH”Êa8‚³¥öMé$É`¯}ɾ&Y…æ%*¦rЁJ½o•Ní1µ‘f Â(ü¶CArK¯ƒ lÔJ0øLî‹ñܺàdz-G}î«=ÙfÀßþzz“(mE–ÔM1^}û¹‹Ô¾Ü¸oêÑ|%Ëìpµœ[ܒ:8#g(¡SéÐÇü%÷™¸óƒÅÉ$ iä÷`î]`ÔOo¿ë6¿@]€q £oÞ¹áƒa%K%žƒ>1.‰¬ÒùN:i!}rœûj+”È [DÇZ6ý±$³©e«h|ö”Ò÷*-x‹~%mûM½vJS2ž;aÃrÙ𘊾-–©ðî0Æ\¤<4y¯Õ†– ðRã[0]ɹRú7%^X×þì‰P¡˜Úb}v©„žÿå0tÐ<òkJ½~uÎðD°|ιZsg*úò»Â4wðO'øHn²tHˆÝ·û´·šù‡!/°Й×îïÅh›VèiŠëç\qt<æ32·Ÿº€#ûûÌ_=¸dšæ#8ÑVƒÌ*汉ç -\ǍΛÎ؃Ä׶KǏIá‰ÔWRÃè”ûÚ\"|çèÒ -ƒN=2û•ô]n£ô —!¨z‘ÆÞïá ¬¾s…ÄÓè‘ åþ|Y¸1ÒRš¿AôJ‹^nACâl -LŸÍb ±7 )~Ѿñd|ÀO®RñÄ΀oJF;Ÿæn qt ‚‰®?Ÿ8+M(2Ëψ¸×´iAêAz=]À€‰F’ˆtk[=åõýœÑ¢Vgvq¹C¡*Gþó1ø,ýÌ‡[EÁ)Ú[UdSǾþL&`åÿùz’@5¨!žw 8?oXm#ö–·×Ív@ÑSì0aÞKÔÀ¦¬jÒ%‹ú mMZq-]­-³ Á†Þg_ò‘ uÊ$Žƒ'0єž-Mk:S€óâþ1Dã´Î˼EŽ×î šÁu*Ô[æÓáÂñ£ôNÒRv¾f=Ý¿cl5ýY·¬8êÄþÖ1“Ÿ CCùyN‡g»%vR ÿìD½S[#³vz:…Þ ·ksÊpN@ꕗÑìLN>Îß0=Č,(çÆÑñ ÖÊÃ)µ_n'Ü7`õ»–ôf¶<²¢ŽräýCG#–ƒû -”ÛÑаÿD\óÌú–îtC„†¡`d•ú­‚Éÿ½ñ|Ò“7ppíˆcšˆ¿ì0o*¢WÆïäl?îϸ£_ɤ΄gúáC֒– >³@´þ—ŠVæ3]¯aPwه”ðòÆÔ|gÅb›¾msîü/ÐÏ"Û(:G½ï.?ξÈû“`·>ü¥…M•|—NZO±mþ3h djVëOhSjÚ9G6$ó*Pj¤pµqwöÃˌÿÍçÄXàgäX¦;¹£-¸¯L“ÏÀŒ¶,îá#d¡Øžc³èê9÷ñÓ7 kµ|Y@ÈΠ?)¾fö;5wæJëì›@ ¼Íwi©dÂéÆÀ±Eó§9ÍËw£sbâÚªü¬“pb’‡z•Šâ¹»Ê ‚|0(±É~(Ó'M4?ü:қ¤¾AN,^¸)Þseý >ÅJõb+íug`6 ’V ÃÑr£L,¡hàߝüü´`Ôð¡*%*Ûó5{l@»ì¥Î1ÿ™(:S±®igŒtóCcdùv+B¯¾k„Üߟ'8Êÿàù‰{9tóžÊ²ÏÒz}FۃµäS4{æ.6r䘽;O&N¾Ë B&Q’Û9üüÁËðä2ø™wÓå¢Ä+hQnG¾˜„÷nÏó•Ek±Ä,Aô*sKUú [ÃG «$±ä~LJãÏfþ0ÿ%âY?›ãi}³\lf‹Ÿ¿‡ö]"xØ<€‡‹Ã΀—ðª #Ê3ÍmW(±ÖKÿg±™m 8.ò8hÇxÎ>} àwÿó`k’Ÿ Žäðú¢ÿ{¨Nÿ»=Ÿv‡íò0ýû{øøõÿr=d\¥M;‚QÃ.:¨ÅÆßÿü_ØídCÁ€ÿ£ZþÏÿ·>ý,Ì(Á€Žÿë?‹ÏzÊy3[¬¦tÓÞÉ%Ïð kôŸ‡ŸB³"äôxz[Ìà%@*–›Ú"?l%ºÜ»lñ½ŠQ ‹Á2¼¢+É­×9Lw;îÒ;ñ7ýˆtšºŠÁ2×àa ïÂDÎNwԍx?l Žx5 ª¶Ýl?aW›EnûŸ uûE*¸hٍ¶C$ Dݖïڜè›á ll×?²µ‘¼ÅàÆ^ùaïőªŠº7¼Y¡N„?êìv3NjPåæ ,}Õ67•±Ÿ¿¨.Ùg~Ü¢* -ÿû"_…ñºÒ»ULâ²w e°Óÿb×b '·ÜˆH›Î÷ùo¶™þ¬ÕTô¥"ì^N[·{\ JtðâZo@iNàõ~¥ìöã.óAwù¨!@!ÊîbU‡øÁ'r‘¢Òž¹SQ~þh3 - iG]È­WB‰É€¼ñ =Û²5’¢eE¬äG÷@µà?[À󬖢F§?ÛÙôNØ{ øU \q旟)õ/&ª((1œô%ŒW‘¨u³Ä,=çôóõÃV–I ]å=VâuœâT»8Þ9Z|¥®)…H$xɺæHüZþ/Õ]F뗥ä¾»m•ÖMBXýzž~r +¦šà§„ìD"A®(NHeu÷÷*Éè;í´ŒR¹£¦»mŖ‡¶¥Í'P&…ëlaðÅ£YÖF@…DÔ֝- ¼¸ùó{ûŸâ^‚/ñކ½ %&bpÇtlßEA3?HUªË,qdêþAäÆ¿¯Â³'“=ù:sn{ÍiO~Ÿ|ð“×oF}ìƒ&û =ˆù’S&÷)¬Š†ÖóÆÛìS¯ý¹üÖ[}Åg½Óm†i×z{b×[_½ãû<›|¹ôös´­wÔz9½“¨y ÷s߂ðôYkÓôk`t¹•?YŸ$|™°/ÿ(ûyj¸§Dq¼€+‡Cây–vì^Ê©Jä˜ão.r;ð¿æï"7 ûò9ýüé±¥CÏØ´g¶@X JM˜š’ËWÀ,ÕË·ªÇÃ!vì,Žáö·©‰pc;†ÉÓ«w´]™ˆ¹ÉƒP×9¸‡âÀÃg{¢ 7¡©Sk“[¹ÜÇpÁÞÇ~ÁŸ…5øy?ÇÇú~ø¨½7űB£@´4r‰b_`xU€˜Ãü©žÄ±Æõ–ÃÑótÇÚð¼û½Q‡¦Z±ˆfGÍ)5ðm™šûyq¬~ë»=î]ŠÏõ‘ÁT+Cw·®ŠM— 3•”Ö Á¸9XŸ%°öGùõÒæ°êPõ*‹¸ ›<åqGk¡èíHRØ;Ht&+àÈYž¿®Ð«~x?'ª±õri-}ßpí±¬þíCU‰ µa6 °ã‡ch -ñøðñ½éH`MMƒ!ÒèÅ:JNZRXa^§Ñg‰½‹O7®ÿ8¾-q¬Í¬5±7þUÅ°Úcëh‚à -׆ÏP¶ä UÇêï÷ 2B¼ˆb}$—!cëÏ[ÊRF>>H‰é O«M-+…uJ“Wq¬"m^XB}„ ùdp$i¬}§E@ää‹ÿ™¦pþ}Eò°âD5äô@¬6V€æøX\lƒ­©Ó ‡vB6®S ¬ACh5'GRXsDÍöAX§ ¦[ÚGS¿‡—–(ÖvÌì“ÄZY´}„Vtø‡N¢=¶>ŠM÷øX).^†«Eë«y³”ÄÚþnNf+@s9Ýax­ìââX«¾§.™Š?‹cݕÅ°B ¿Ž ' "ëÄ[²’ÇZKäÇ£æLJ(֏úª„°¢óærº¿ýÀœ”Àú&>Žk§8֗ßÝ_=ö °B4ñ¸äÜHùðÔ¶ë%°ö»Dþç¯,Š5üâ|Ô§>œ¨ÌgnŠî…›ç<i¬3ŸU°y¬ƒêԆ°zÍ K‘?×*1±EÓ«ƒÃ -Ñ@Äîïž9žB¬Ç­é™ÆzJÚsÕ¿O‡V -k¦ï)ñ…¢ãpì&ô @캔P%'š.Àš=]ÈÅâcÂšôTœ¡èØù_¨“ÇgŒf++BC#6ÓÙb%X‡ôbË°qY/Àz üFé“'mº~Ü.&J³íb:ò‡UìšFÛ¨äÓ~Óó÷*õô›(NžÎÜÓ˃âœIâç`Lö,3°ßEHð4öŒ;ôÓã*|¹=ƒ›ïÇžØ ”„l”¢ï’OÃ^[k"ýô{:2sD»|!í5 >%ŸV훤Wúé¬þ㞠-‰4Ô?gE‰Ÿ‡‹¦b¼{¤ž~™÷Áo»öFmýò…¡mÀε°æaEÙvÄ<"?{%±"Û@+0m0â°ÂÙð¦û!‰ùè—Æ -mI¬ 4¾Å§×»ä°V͒X‘¢ÁaER€‡*ÞÒ." ~ô‰^ kv0ÿSóÞèü·áI‰Wƒ†ý(ß«+¾ø¦¹–0ë÷4#:/6ñÄò Ôœ9 ò| åŒ©ì}˜¬éàþIì,ómÓCñDû;k|ǂ´ ‰HÑø‹Æ‘ˆ†9 ĦyˆÚlj)"ÿDÿã¨mi H;f0pZ'˜ßóŽzKà¬20ãþ^äžØZ¸6MûØêìË9ˆ¦€OxRN2(0èn|c‚ºîÙƈÒêiáŒÍ¡aâӐuсåÀÓú²å›ÀŒÖ*R Óøl\sxÍIó» ˆˆêPt~œ3%ÂÃèáSF¿È Ízɵa'‰þ‘\Ff ۏÊkh`ghc8Ml’P¯íÊÐKýn—Ò†‡JzÉ@óØ2¿¤$(Ý?j؞¡WÌ©‰¿8æâÒÞ÷Ú©/Jz ò †¾™úÞÌ R–'="š½øRÈz)…Fy¾òIJ!$ÓdW$ÿ^:à4dÍ£¡‰’Bâäå‘fCYbDŽ¼ƒú‡&Ÿg#N¾¾S/)Ä%·'rà‰N®ÿ¨}r¼c Íϗ|íԔÈ]¨˜èP„èHrvÁ¼xÇ6¯EÃe¢YàB¦æš×­¦)‰ -ÀAÀâëaôe÷#Îî« Œ®—“X*ÇÎ35š‹htŒàJÚÒ÷÷ÖþÌ°ÎÐÈ$Í£š(Dzöβ jð8ºüghÇB¼Ĥ%_[RH4|Uá?`U9ö%ƒ€²"ñ’AêMvLØÀ¨Ùœ -¢cKfG©i¦ˆÅ©ë¾ÐÎ.—3 -köËe™”´3µRh†~hɓJ…6ɽ tœáIò˜‚†‡†E.@²µ+U¢R`^àKmzÕ¶ÜY,3¦S²,}zÖ[ôˆÔèz`LҊ³|Ôé©b#FymCÑ"à-ãæIVÛа†…ÆŠfè µ7*·§*hüFëÀØ`1 ­/oäh™&®íÝN´ñážDãK7Û |6“Ðáº=%ŽWjÎüø QQÌ`”ÒuEÏlo¦÷­W’i˜ö-¾=OÉÇûmÏLooÔfNS‘Ý‹Õ,ˆK•£2ص¨ÿhRk›pZ§@‰#{R+úÄ5Æ¢@<ˆïå¥Jå­@ÁH†¾Œ‚µ\ʽäè¥~³KšE”è¥q³óèÅnvô Ÿ1²rówz͆¿ÙEse_`ÞG•Î9§CYèÈGΑ+t¦ü•ùú½„é¬ìÈ“Ã6Ú=*e˜éPSëáÌ(á`ÊgþI}…#0Ãދ¦D%À\,™úõœ²N"ZO“òëý•aœ¸““F…wP $|;@Au  QžKbÇS³Sg¡š ˜AÚÿÈHhš6¤tE¨fk!­§¡=ɏH­#—ì†Ì¶À­5MGcE %_¹o¢M«üä”ٽ†Üys…{W„RS¢BxR8ˆ ^# -’ݧ€PO»’6cÿ>ãb÷¨”š $8ù”Î%\Í¥gƒ~0ÞeƓBà¼Àwj8Br÷á #rió–_κ×;þáUÕ¡LMÊK+梥 )/-„¦aŠT`ó47‡8ÐÊɟ\¤PßØÔ6&ÂNºu+RPX‹“ƒÂJh-€´„œ_@/ШíXåG͔Êá°ð•Ñ,ʈ½Kx"‹Ò\ÙøÜ~Tqü@h^—öH¡„f“Fmª¨‰)¦Ñ=ÿXJ·ãÊz!ݎ+aP…tw¦dmRû[¥[—“n¬‰«E¿BS–nœ_@!¡]/ݸíYxÝÞAº•“nÚ¥¤]º]z9(@·K7åQ\H&œäÈXØ(Ólxž0üTzÝÊÙÙxR\qñ;Z‚¼N`]xÕáw·†rÙóæ˼—I*5¶,Øñõ“Ø®¦÷ڄ.€öª×$qaÄCJè^™PÁßÕ¯Èâæìר-`å S’ÂF:Å_ -å³€nϪ@P$Ìna _?†¯Ò--Š@Ðîáä¦G0C;R9øç#øÚy‹ö±êô±u¼Ý(콩u~á^ÉóñM“ö¯à¹…Ðn×þß÷b‡£æc ®œv˜È±Ý¢ýcPØÃñ†c ÑþÅ p&® µç£üáH ›÷ýÍç#ïp CÎðõ]R (ÍòbNO^j—Ú!©Œ2˂SÓ¡&„×ëÝâäÆ´[÷960‘M®Ý-C4Uš0³š”ÉÔ¥jÇ˄a³€¤¯¸:xMƞ`L’lAe )î3áI•u9/Ž©¬Ë­ÎöTqRy3½¹d tjœ”_ŒÍ«Žš*6ÙìxÇÔ^M2öù†Ôæñh>c¬R½‹3-¤MïHt„«9v©óÜRÐ$¶}_6ӗb ,Fœ¡jX*Ùâb“1‡4µ‰¹.¨mD zPÝÞq©wnšc½ãu”×;Ó¾¬àˋÕò騋fn/çϵËZ> héêr>ùZ>JBß¡œO+ªåÓI–.j,瓯åÓ᥋·”óÉ×òñÕÁÊùäkùt¼ÒÅÊùäkùt2¥‹šÊùäkùt¨tñå|òïéèªï›Ëù.v0¯–3^´L¥[ÃLŠiâ2™÷ÒÅH‚$cwç”sÅmꊶH¡%}uâmN¨‹8T;ˆ‡9¾ mùðHaN˜r5©b6Ó -ªWÙsߢ¦(mñ»xUò·"…rÐä³¼Ô͐ò*ñ©ž¡ÀÑ%²oÔÞ­}L¢UpXòŽ.¹1‰ï¡ÙhªßS%vò‚ü,kH[×IS~ Ÿ&šb¢ÝÝ,åk¦.6»Ù½Õwä'ÇZkJewü„K­®DŠ¡ÁÂßêi¦Êî¤Â>3J©ìNڈ•Và¢3/›b³_•¬”¼ ŽBÇ+`VŸà幌ø̼{ÅBLuòkJj²Œ©í)eÏ|Ò©ššŠ^u¨ -¯¦²RÙè%çô´K_›’¯qÞ <*à·]ÑÝk‚^IuL² W „õhŠê˜êšÂ³b潆šÂ™býç㒮‘“.‘W³E2ïÍÏß©a¥ÄjF¥×P9ó^uZ¼À÷zŠ®¡NmMaø T“#Ç‚”xín5«.n"Y£š2ãk ß-{+Ñ WÕO““n׍ï/öfz}'?‰ª(Hç׉”©Ss/\ŗv»ç[¾NùÒ= «GÁ!-câyà?Ù}^TarF¡‚=¸,ª¶¥\dB^Cé°Ö:öúuU{W­Ò˜PqÞ0ŠŽøö€ÅvÊÞÝ?²¾lX'aç]p¿\µž wP†"rú ˜’üý,ÌÚ¨Ó0£Ç‹Kêx`EŠ¡KÚ|A"¶­@)Ôê] 鲬“荞VR»÷¹/­§ý–´ù‚¤+þ.’“®&Õ·‚K‚Þ7| Ñ{ÃϾÃòjñ”ÈŒ‰¿«Uk2¤ò«“BJ¼ryžÜ˜.nq üÆTYÔ=¼7eä½¹5 hÉFÞ&R¨P dŒºL·xop¿@ùvï `‘KÑPw÷FwQºx»÷Öà ¼7åV}­ _“÷FÌ®¯Ìã½T¤t^W™wa­IŅ`MÝ -ÿá‘w·ÔKŠŸz)©uªI½|ݪJ½T”ǕïVÕ ‹r.Ô%\*r(²€J@jªX$¡Ðzt‡‚²‹Ü¹Ì{eéëü¤h—ùÕ:¬›DŠµyo»H±6ïC°¥]C½×[ö#Wÿ„»nݏšì58¢2Mr?öwj÷£œªi®Í¦e·;]uŒiÛFâ&.t—ºÌœ[屦Hú¾c©«À¤»/ï;V¼ÎïÍDq'VÇ¥Ë VÁÉßH¥hv³>›/Ïãµi'ج¥nM¾Æ ¡U”µª-’>ÎÔøÊïS$û¾¿S‘,t—"YX·v{‘,„r—"YHÝE×»Y4wmé«`5ç/Y ð÷cïæý((ʓi÷.Ê£êds…îQ”'¾6w/Ê»Á×É'š¼‰¯Åö¼¡(÷§QuyÿJQž˜ûá_(ʓ𧩴àúr#.tøýÐrÕWߒi±jn¿èiY—‚ݤ6 ‚ -¨sBªpë5Üia |۞âú­NªØÏßïɕÝÍݒX ²“‘-ö{ªÿÔ¦RX'2X ΆUXµq·°ìÎßû®²M¥h¹²;K€UÇïSû“*ö  ûàù]ªìn(Wýö§Pì·ít$±šª‹ï¹օBŸÂfOkþeX¤°q㋍¥°BåöbiÁÖ¥'Ž>ÑìUù^Lì=ÚýÀ{Õÿ^UÒomPïчi5(¢¢¾°fT‚<¯…g¬œÏYE~/_¹µoèÙð¢L Óö>ÅE*’a…éž^{cÂck2ÃRʃUJ¡MÜ{¶×k¹¢¹F…/J®½ž6·Ý0§:S¡8“ºáRCî Rg=ùÜAõ\¥ÐYOr†ñ›œŠF+jg¨¢»‚jÂ+õXÞwCS= û¦°îÇ$™Z«¶+Ÿ‚ƒøšÂ¾+}6Z ûĬÆmwÇÂ>µ÷ÙÜXØ'æE¼Ø7·ö‰Uõé®-Ĕ.ìsãK$øßRØÇ# ½y¹HáÝ -ûÄ@é.3¹¢°ïÚCZcaŸXœ‡;=ïVØ'VÕÇó ܧ°O¬ªOm֐†Â>1/=câÞ±°Ol…)ñ] ûÄT^–ê} -ûĪútWëßPØw9¦oƒŒumaŸ˜ÚŠˆvßÂ>±5Kµº±°OJ¹óU…}’Zç} û4í–Â>¨‹û -û®#šæÂ>ùJ¯»öIT}ß»°O DsçÂ>±`‹0óþ…}b‚B`âÞ£°O)°r§Â>çÍ= -ûÄȁ©ê÷*ìS,(»OaŸXUŸxÊHñ.6¢“³1¢ý–´Ý9%ÝÓ첇§ÀŒR]}µWØö<úû·R*Ç ]ü.ÆtBa¢{wñ“Q9ԑêd7k"G'~Â%,UÔ6Tò¯4B'QŽ-5,Á˜Ô -6%3,~lëª1!¢aiêS-7&ñÜ ia#C*™>Õòk|“)é)&“ÏÙ)t„—wå±Çšlÿ¿››ÿé°;ºTêë×4ÿ“6¼þ×NŽ½öM'UP¦®¦OU΅B>4×ÿï¶õ*ôw:5mvdZªšÿ);!!mnnþÇh6òýÿnnþ§£ªðúÿ© ?í*÷¸£Ë—ìzäRCGånéO» -§Ž‹¥ó¨žÜ³U-—J‡‰`Û>Å G%.…}ÐĖwÞ«ªéS“A Ñ(Õ;Jg†¨.v„hd’5$©AI:  ­®ß@m0 KšàU°’³Ö‰Ýj%0*4þ®¬/ã§ZÖRÈAWj@)秩NµÐT&‘ËgR#AxŸBÌÛ#)°×¢Ì­ç ¨¤ª®}šša"jÊèiýûݪէBxwª»íKÞªu…f3;jj†©Ô@Ð}eÝ-¶QÙԝŠrlåº[0&õåØru·´».F5$ŽÑ aí]ñ¹“[y²wù-gX”¡w0—´·;Ïۉ=>¨Ôì½“s¯9ñ˜£"äÆ|Îô'^=àK²…cåUæ4GÃk¿{¶ø­é¢Ùa_¢2Ï*]x8O¢„”6©BÄ ÁjY?¤êß%±ÂÙ<’;Ÿät‰‚aЕÄj.Í\K©ÖtV«Ž-(ãˆÜx1¬ü¹£9dâ:,úE—VKr¸à -Ð@" ;ññJ§ÂBDœÂ•xCkÐðäÉM0Ï­°8o,ƒµ` Jc-4 1¬:Ô /\ä•z -±¶ä:,V^¥±æó]’Ÿ8á ö]z¶=»ù, ñž/KH¾§Ãë=‰‰-šVÒݞòÜÁ fÝ÷ ÕQ6Øø†øçiVƿ̞|*³3]VNÂ5›œŠMÇ5þ,,®Rv¦H—E]&nIŽ 1´ô°²j꫔‹«Žº{5¦A~`¥Æ4jýN9ùÄ-Éåc4Þ°ÚZrÜä -…iÞP§ JÑI÷:®δΐswÃ@Í-(%Æt‘v±oT^S@#7,iÿ²¶1AÑ)Fè"W ºòï ?žés¥€—T\ï­ä¹åïueß© -›ë+¢dÝÒªÃD£ü-Wìê¸ -ɋ{ï®*»ã)ŠªJ¯óHó³TQIâ­·ëŠÝw§“¬[S²j.ﻓ1$üiüT‘`í”ÔÔâAFؐw³¤§ä…°¹6†NÕþImh*è¥Üԏ76aŒ@ÙǧC} -%=0þýEFÂ*|Ю¤Hì`^=飶‚¶Ë>7tª“¯¦ÒiªôŠhºŠ“°þf^ó9+ªê¼1aLèÛ¿ëWFµ¥:üŽ.™ºD¥Ð -kˆòçåR!Õ!h­m³£šR#!óEɯ 4Á)s#Ñ«‰ÔO“½•hŠ-…´­ê—€vQÅ,¦62D»²$Qm=¢Rýr¡šªzD¹”x%‰jëEüÐZJÕÖ#rÉ°W•$ª­G¤ÜÝW—$òøEÆ -½È¹ÕV’¨¶íú’DŽ¤òDǯôÒZ’¨¶‘³¤¯*I”ÓE="/îIèr^·7+Ô©oRwK³B|6ÿb³ÂK÷ÿҬP§Ô¤î>Í -éŠyµåöf…ºžDôÅ»7+¼tÛý+Í -ESï߬P§ª¿ç-Í -yî8¬ ä°h*)U,Kw;”/ŒÑÐðPÞ%¡œm§²á¡º[­nnxˆMî·ZI5<ԘumÃCùn‡bNÈ«Ê»$ ví ÅYPþV«+ª`è{4<”O7á]76ÅSnokxȕ‘‰q$çLÑVrqÑðPž†”r{‡†‡2{î¸ò© }+7<”‡Â*P·6¡€Ëÿ®‘=WÅuЪÿ$ÓZu“óv-øöÝY¼ö¯–Å—ñ-mõç~;­Ê*ºŽ÷¶‹¤e³‡öO‡Ô&ø¢{Iš>K!øô5,•¬çoÃп}_D)€ªMÝNûUﲏRzïrÿjûÌ)‚ÌT2ùõY& -ASëp˜D,‡cø­t4Œ‚³c`6l°•Ÿû³ÛùæòU#LÞ¯ûp|ßÂ|¥Šˆ^ÉklPGҟÍ4»Ù™°Ýæyây²¥SÕ²½9À„O&´6>£^rº¨ÀÒ25/†×A'aÜܤÉë_ž ë¹~k[ËL¹ªþìØù_`B\mƒ*$õi²Óy"Œ‹9åhlù -ýN°ÀäY¬~óÒb“"NŒ‰àSææ䢇ZŒf?ʆbþ0ŒQpfR{ËfòÞN.—´‡+Ü{dÄÐÞ@¯{.Õ_ÔⱯB°°²?JŪúšWúo‹:]y{Ûó¯½"üæÜX»`)±ƒ2ÿþ™V„ûdù ã%—Ý—™ùä± Ÿ3 Ihþ ÙP-2=¥øóÙA ƒkÃø&ëb~IºÉ¼·p‹„=çx:“–b©äq˜¿ÿòŸ«}„p'BV4T8º-ë‰e¦nxðlÇLÙg€†y–urϼ™A7É<(±+8B§±ôÍÐæÅ -„Çvå)T§ìwvîeŠ(Œ\Ÿì3'¨°‹ð;7­6^Xéôç)«AXei÷%»z );Ä1r׀ïH¤“ Øè‹ ã †"1 …^´Èר»!  æ F׃~ä3FþNàÏ¡Ï]k¯|à·»=aˆàS;Ààú#Üý*G˜ †f(8sîiÜ]nÌ]2ž÷ÿ -*PááÐĵ^Fõeår q“ƒÐ\ ’©pG ­åp3.)ó¢“+͟õ´Ôî÷M=̧¹—{èá-0ÃÓ¯ÿb8Ó+i³&b¡Wç#Œx“ÚS.mÆgCD¹`€õúÒ¨Gd*­×W£x„g7ÃÙ ³ØöAžõŽïߞÞñ:Êëµ^Qï ;Æz󮳟œ½3í[èíkUït›_á±^ÕÛö†v¬CQ(á6ÁÕ´0»º¶ac@c°AMw·m´è4‡eN¸Q ×|ËOÑB ”¤E ’ PE„^´¢Â]^ޜshgD'+!HEBòjb=ZB*V:4 -Ä©¸e(ÌNƒÆËä¡ß³à]È×i±D1E±xò£hœù.…„“…^n I‰À¬®Š Ý»,‘+Ç·x¥Îñ÷ˆ`lPœVx¶yÀÊ&(Ù -W±¬NJ¦R2xuÓâ4ôZÌNVé ëü´0àœLEç2®C˳QœE„M@èƒJ+ -:©§µósbþ´Éϟ&\½A­Âã•7Vù(z³™ŸÓIÑw°t0y8Ïð68 H…ÏW›Þ2¦i£ïôÏ}˜}Ñ:Aí´Ë»£z„w)4p-)à+ ÿ(—‚Ñæ7:P‹A GrlöZÿ2!Èø°^Kî+ýÝto£¿[=ÚÁRͬn1çǤ©'ŽîᏧÞlSp4ÙIð1Cc{y9Ré®Ç6«Ž~ M”‘öغû‡úŸõùׅX¸µéé·î<¥ÿ2ý!£úqfl½ƒcÍ_öú†–F´³"ÖSõ‡&H*=s5JÄÀ 7”fà蠉òÙyÝ×' ünFëdG´Âk¡Û%(:äŽm–ïœFn‡u–‚›ZI:øRM‹…¦Ã4Y¿Ì‹‡D ±êñe¹$œ€T´ 2Ö -K‡â‡ëñ·«‚¨ä?Š—CõwgŠ÷ìÁéðY¯I1ƒ™ºƒ¹wÙ0”$ÜÄ5SÅèRL©Ì‘Pi.ØÅAIUÁ9BÃDð|3UuÃD€:ºr V„[n{ÊLĂ¯È5¬mAYC܊à0ÔÁà¨)6–¡“ÑՆaô²·pĐ„œ Bü͍(æÚ3öžœ ÿU+uuëO'î~ÿC°@Ü{×s.ƒ¯æ4pH¸®„AqšÈÞ×Êi81®å4œWÁÀ÷¾— щøàVlß^CM Z–hWÁ°ª¢€X@ƕÒÀn|8›«VÄÊ­ˆäÞç¡£îèŽãiLÀ–ÌMëD¸M¦b"h”ÀaH 1ՃPwHë͹÷& Ã{ñaخܨø!mãØS’òƒ<—¢S†6ü\ºRtÚÔ°§Ü¹d“çMU¢ÓæÍô=%ìϏS´Ìýé3F³*ijø]@[®èÀmïnO½³@“| ·ºŠzGÝê@ö ŒÍ)Ge7²×¤Ñv¹×ŽloÜ1HŽÇŒk®±eŒç6ôrxËe9Hi÷Îêх~Nù΋ˍþ„º…þô»€œ­´qnÞÃËð‹vúϨÅI[æèÏ*RÕ©_~u£'ÚSÌoÎIg¥rxÄf µbÍèìӌ}àÀt=9(‹€oy/Ÿ„‰*†Ð—|ÝehÚ¢H?°âÆ~!Å9RG¸Å_ ÐÅ>CÍÈÁ×UƕU¨”KÓ}‚~œjY<³Ñë9mÚ)ÿçl灤j:YÞ0zÍ ,Sm¢ó½õÌzá7¬¬=x>‹uô' ÷s0ôÐ+×'í¬›Óžz­ÁèœÁÚqQh«1Lx×í§¼#b4©ñj´cIO ]¸@9S.Réèä7Ò-R ,V’À@z܆cÜލ‚‰®ÿ%ú˜[ÐðZm=ãÀr~· @ã3ÆãÊ1h=ÏWÌìß0–ñæŠÏÐÛô梨””<”»*÷YПÖ]/ýé<¡ÝêÍ[§c& Λ÷.áú¾QŽïx‚ .d¿zÇë*Aý||nÑÀ'ÖëPàîØIlþË>ð³Î6“7}îó<3Z™µkiK7>¿ª¹JIßæ&lª{–͐2a™WŒ(ã{:—ؾùpS>9“·ë§€)6 ПrÓf€>ú½×¿´p8õlçƒÌ­?ӭλ9?s¦ÞG ÕsÞÁÓ.HÉ J~‘〼_Q“Sí:¿¢&§¢0ÕJ½_Q“S훫üŠšœŠ(~s•_ 9þï„îŸPÄx@ÿ¸[çõâP?ü,6Ý?1Ý?îtÉãénæ[ò°Xtÿï)·ý<ÿ-6§‡èƒ;ÝΖJá@nñ¹/tð%ÄÊD'=Ú‰‡ÇyžIĈ™ÜW¤°*ZÏÓÜÑO`~KJ‡ÙuöÐý:ð\}Ò;Æó¡Þá%ÛzKñè€ö) - Т¸‹Í[2ç¼½V}ìA䧉L:Ë¿e­”û¸Œ»‹éŒM¾¶Sî±E.:,ÊËFÀ\í"w  œLzküÅÏzèaR¦Þ˜ »õk*¿.ëíÍÇ8Ãø ÝúsÊßO9ó§û0 Q§4PkÓÞýËJÊgzƒ’ÒÀ«4DD¹p(~ #¢˜ª`Œ-ÓÌÁ.ƒ±d°Á0UC]È:ðˆÕÇ^(¹ œŠbïݎ´°Õ~Ïh«¡?ÕFD¹p(•ø÷/ED¹ð%ŒÂÿkQã ùW"¢\8†’þµˆ(Åb£÷ˆráP8›-"ʅCñ}s÷ˆ(…ù¿å¡PtâÑ·žÞú2°ÐBôm@ Ì/k²£·þ¬zç¦ùkF® „^´ç>%öÀæI#GÕ÷‹RhÚ;ú­éÞÉ$“ø-\2 «‡˜áu?{(:í´è„: &:û[•DbNé?ÐÒ#љu9ëý8ÇKîŸÞÉEi?Ž¨å„™–/‹Õûè¥"`ø  Єœœ¥eÚ½Rå¸K©1ÇÙ*³~ܐÇ(´`M8‚U3æk 2H ¥´QÄ0¥?{ -] <³–u¨¥8è`èÒ‰öBiò@ÓI¹ib”$Åäw¡ëE‹þ±cUE\Â,— d;w Sv·°6„Õ¸}g©¬·ü(ÀÆ›B‡ eæ;ñäg¸rÃ^¸5hÐ?eŒ9™xmƍ𐽂%ꨒí -Ç#]Ýý“èæ‘ÆÙ-ØùîuÏ|×?¸ê;gÝ Æã¥hѱ3Ú}¤>»ˆ!"qFÅŸ½T‹‹4‚ðçÐRë¸öĩȵ§:–êÙ±táD@n)šœ`8‚;VᝊXªt •õ³ÊÆäjN–4V:¡-‹ -"<Ÿn ('£“Š@*/ , ¬SåÎ7Dæ©úL²€J¦¼€ÚÜ©Éz µæºe"¨l€ÙZÑ4O¤uk -m‹lOGäd»…µ¡CÑ.ÀM-1 ïÑ©4‘iü…à®=a^²âE'¢’š0QӃ ŌíaÐ؆ß{µÙ[éWÉ_]¤Ý ÍîÓ±ùVNj‹å6N«ú]iN“…1J7sšùÛr§«§©†Qµ;¹€f!à´QÈuˊ@wº[ ä4µ0 -ÕGå}+€Iÿ…š jA(>ˆ‘KœšpT†„âŠÕSqïË ‚ö¹Ý¶"Pᕧ&uÞÈM¤è$µí‘‹A«¤ªß°GŠÉ–Wa‡„ÛƒÒEÿÉՍc0f£§ÛŽ„ÙÒngiÙqÈ bç‘f-Á ) ǧ1伉->Ï.Žš¸èT8špÁ¬èf—„ˆèüL–’øŸÅz -ÿ³ÙM#[ÕK ]“ë݆vê?ý¹¤}Ü˝§…jö£LÏP¾ˆ@ŠñSA— ?€%]ä¡¢ÂCGßApK‘‡Š -8^‘ës­Xñ‘>¬ØñU;[uQÁ«.xƶ[€f—]²ÏP1g¯Õé‡<ÚqâõÉTLE(M`b¢i­¦Xç€×Z$㚣s¼nL— ›Õg.°85Œ‹ÂÇ ¼L·ÏƟü`ހU5ÇÆޏó(E»:ú#ëëôó}¹dˆe™7'mf¡Hzs3à Ÿ}@#öÍÃ8®ÞP<Æ-Þ|ì'? û ‚?”…"¢ŸhõlÙπ`?yðè§wÄ>üAned¼˜¿f6ƒ ë V;ã1gîaÌù ªùLÖ:¤ëø§ÿf¡c£ôüäÅ_­-ýð;¿H¼IN^ûٜ=l%É|핉užþÄb B.u±îí¼©õ&^éJD2Mƒ7ñJW¢îmÞÄ+]‰(uAƒ7ñJW"r?¨ô&na(4½£%gœßÌñ`'øú |Õ^œÎ;ôJ`œY,6Õéà¸ñTa­Í؝>œr?Ÿ§ŸífzøïC}׫U»¥ÜCô~5ö`ƒ!Æà]ð½XÇpˆcÝ?ÄCþÓûĞÞÁÏuð+ì÷|þ ‚A?á"¼!ŒÏåóü`T®ˆ×FzSøCjàØá_eðé|÷ŸñP{~sxØÒý㠄œþpèAþ@ú\¥?{ý®pÈっ÷<¾°+è!ÂìôË_*æŸùYŽ?ËïÓøs»>ÿ)Ð`Gfï ‡ý4!l¶hš>SÐã -€Wà¼!8hŸÇ 80ô=Hô6þ™ý¥Ê´ÿ¦ëµö9\±~Ÿ]lM˜% DИ½èï€ßð=ì¾@ À¿¯7âòrjX±êâë4nLOßj¦YÍЛì)´…œðìyjL—‹Îaú³†{jyœþ?‹‡éf³=MO‹xô°<,Ž§íañpüÞþ~ÄþìÐ:0™þù/Vœ -endstream endobj 7 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 34 0 obj [33 0 R] endobj 48 0 obj <> endobj xref -0 49 -0000000004 65535 f -0000000016 00000 n -0000000176 00000 n -0000046465 00000 n -0000000000 00000 f -0000000000 00000 f -0000175432 00000 n -0000175365 00000 n -0000000000 00000 f -0000046516 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000175639 00000 n -0000175670 00000 n -0000175523 00000 n -0000175554 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 -0000048167 00000 n -0000175755 00000 n -0000046845 00000 n -0000048464 00000 n -0000048351 00000 n -0000047096 00000 n -0000047605 00000 n -0000047653 00000 n -0000048235 00000 n -0000048266 00000 n -0000048538 00000 n -0000048734 00000 n -0000049777 00000 n -0000070877 00000 n -0000136466 00000 n -0000175780 00000 n -trailer -<<5B95C5AE6D270C48854932B225484F55>]>> -startxref -175973 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg b/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg deleted file mode 100644 index 7712f662..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_blue.ai b/net.mograsim.plugin.branding/raw_files/icon_blue.ai deleted file mode 100644 index dcdd0e08..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_blue.ai +++ /dev/null @@ -1,1467 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R 6 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_blue - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T16:33:44+02:00 - 2019-06-22T16:36:14+02:00 - 2019-06-22T16:36:14+02:00 - - - - 224 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Ann5Hfmx9aWHyprs3+kqA mlXkh/vAOkDk/tD9g9+nWlev9oOxuG8+IbfxD9P6/m6Ts3XX+7nz6fqe25yDu3Yq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7aztZru6lWG2gRpJpXNFVFFSSfY ZKEDOQjEWSiUgBZ5PF/Ln5mXPnH84tOhti0WhWaXQs4Dt6jei49dxtuw6A/ZH051uq7JGl0Eid8k uG/Lcbfjm6XDrDm1IA+kXXy5vAUd0dXRirqQVYGhBG4IIztiLdC+m/yZ/NVfM1mui6tIBr9qnwSN t9aiX9sf8WKPtjv1HennvbvY/wCXl4mMfuj/ALE/q7vk9L2drvEHDL6x9r1DOcdo7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kKCzGgG5J6AYq+afzp/NY+YbptB0aX/c HbP+/mX/AI+pVPX/AIxofs+J38M9A7B7G8CPi5B+8PL+iP1/2PNdo67xDwR+kfalf5C/+TM07/jF c/8AJhsyfaP/ABOXvj97X2X/AH4+P3PPc3rrlexvrywvIb2zlaC6t3EkMyGjKymoIyvJjjOJjIXE soyMTY5h9W/lZ+ZNp5z0ekvGHW7NQL+2GwbsJo/8hj2/ZO3gT5r2x2VLSZNt8cuR/QfP73qtDrBm j/SHNnGadznYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/PH82OXr+U9 Cm+HePV7yM9ezW6Edv8Afh/2Pjnaez/Y3LPlH9Uf779Xz7nRdpa7/Jw+P6v1vC87J0T0L8hf/Jma d/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FUx8veYNU8v6vb6tpkvo3ds1VPVWU7MjDur DY5j6nTQz4zCYuJbcWWWOQlHmH1x5D88aX5w0JNSsyI50ol7aE1aGWleJ6VU9Vbv8655h2j2fPS5 OCXLoe8PWaXUxzQ4h8WR5gOS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkv51 fmuNBtn8v6JN/uauFpdXCHe2jYdAR0lYdPAb+GdP2D2N4x8XIP3Y5D+cf1Op7R13hjgj9X3ftfNp JJJJqT1Od8847Ch6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxVkHkjzpqv lHXI9TsDzT7F3ak0SaImpRutD3U9jmD2hoIarGYS+B7i5Gm1EsUuIPrjy15k0rzHo1vq2mS+pbTj cH7aOPtRuOzKev8ATPMNXpZ4MhhMbj8W9bhzRyREo8k0zGbXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwD82vzOt/J+l/VrNll1+8U/VYTuIkOxmkHgP2R3PsDm77F7JOqncv7qPPz8h+l wNfrRhjQ+s/i3yvdXVzd3MtzcytNcTMXmmclmZmNSzE9Sc9IhARAAFAPLSkSbPNSybF2KvQvyF/8 mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVZn+WH5j33kzWQ55TaPdFV1C0B7 dPVjB/bT8enuNR2t2XHV465ZB9J/QfJzdFqzhl/RPN9Y6bqNjqVhBf2My3FncoJIZkNQyn/PcZ5p lxSxyMZCpB6uExIWORRGVsnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8xPP2m+TNDa9uK S301U0+zrQyyDufBEqCx/iRmy7M7Nnq8nCNoj6j3ft7nF1eqjhjZ59A+Sda1rUta1S41TUpjPeXT l5ZD+CqOyqNgOwz07T4IYoCEBUQ8nkySnIylzKCy5rdirsVehfkL/wCTM07/AIxXP/Jhs0XtH/ic vfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV6X+Tn5pyeVr8aVqkjP5fu3FSd/q0jbeov+Qf2x9I9+e7 c7HGpjxw/vY/7Id3v7nZ9n67wjwy+g/Y+n4pYpYklidZIpFDRyKQysrCoII2IIzzsgg0eb0wNrsC XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk/m3zVpXlfRJ9W1J+MUQpFEPtyykHjGg/man0dTtmXo tHPUZBCHM/YO9pz544o8UnyN5w826r5q1ybVtRf43+GCAH4IYgfhjT2H4nfPT9DooabGIQ/tPe8l qM8ssuKSSZmNDsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdir sVdir2j8kPzY+oSReV9dm/0GQ8dNvJDtCx6QuSf7tv2f5T7dOS9oOxuMHNiHq/iHf5+/v7/v3XZu u4f3c+XR9CZwz0DsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLHStOudRvpPRs7SMyzyEE0VfYbn LMOGWSYhEXKTCcxGJkeQfJX5kfmDqHnPWzdS1h063qmn2dahEPVmp1d6VP3ds9O7K7MhpMfCN5n6 j+Ojyes1ZzSvp0Ylm0cR2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f+Jy98fvdj2X/AH4+P3PP c3rrnYq7FXYq7FXYq7FX0N+SH5sfpKKLyvrs1dRiHHTbuQ7zoo2icn/dijof2h79eF9oOxvDJzYh 6f4h3efu+77uh7N13F+7nz6PZs5N3LsVdirsVdirsVdirsVdirsVdirsVYn+bH/kudf/AOYU/wDE hmz7G/xvH/WcTXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv +/Hx+557m9dc7FXYq7FXYq7FXYquillilSWJ2jljYNHIpKsrKaggjcEHAQCKPJINPqH8nvzTi812 A0zU3CeYLRPj7C5jXb1VH8w/bH0jbp51252OdNLjh/dS/wBie79T0/Z+t8UcMvrH2vSc592TsVdi rsVdirsVdirsVdirum5xVjvljztpfmTVNYtNMPq22kvFCbsGqyyPz58KdVXhQN3+WZ+r7PnghCU9 jOzXdycfDqY5JSEeUUL+bH/kudf/AOYU/wDEhlnY3+N4/wCsw139zL3Pj/PU3kHYq7FXYq7FXYq9 C/IX/wAmZp3/ABiuf+TDZovaP/E5e+P3ux7L/vx8fuee5vXXOxV2KuxV2KuxV2KuxVE6bqV9pl/B qFhM1veWziSCZOqsv6x4g9cry4o5ImMhcSzhMxII5h9Y/ll+Ytj5z0b1fhh1a1CrqFoD0J2EiV/Y en0dPn5n2t2XLSZK5wP0n9HvD1ei1YzR/pDmzLNS5jsVdirsVdirsVdirsVeIfnj+bHoLN5U0Gf9 +wKareRn7APWBGB+0f2/Dp407D2f7G4qz5Rt/CP0/q+bpO0tdX7uHx/U7/nGH/eHzB/xltv+IyY+ 1v1Y/dL9C9i8pfB6H+bH/kudf/5hT/xIZouxv8bx/wBZ2Gu/uZe58f56m8g7FXYq7FXYq7FXoX5C /wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXYq7FXYq7FU18seZdU8t61b 6vpknp3MB3U7pIh+1G47qw/zrmNq9JDUYzjmNj+LbsOaWOQlHm+uPJPnPSvN2hRapYNxbZLu2Jq8 MoFWRvH2PcZ5f2hoJ6XIYS+B7w9ZptRHLDiCf5hOQ7FXYq7FXYq7FXlv5z/mqnluzfRNIlB166T9 5Ip/3ljYfaNOkjA/AO32vCvR9hdj/mJeJkH7sf7I/q7/AJOr7R13hjhj9Z+x8zO7u7O7FnYksxNS SdySTnoQFPNPfP8AnGH/AHh8wf8AGW2/4jJnFe1v1Y/dL9DvuxeUvg9D/Nj/AMlzr/8AzCn/AIkM 0XY3+N4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/wCTDZovaP8AxOXvj97sey/7 8fH7nnub11zsVdirsVdirsVdirsVdirsVZL5B89ap5O1xNQtCZLZ6JfWZNEmi8PZlrVW7H2qM1/a XZ8NVj4Jc+h7j+Obk6XUywyscur638v6/pev6Tb6rpkwmtLleSnoyn9pHHZlOxGeYanTTwzMJipB 63FljkiJR5FMMobHYq7FXYqwb81PzLtPJukcYSs2uXakWNsdwo3HrSD+RT0H7R28SNx2P2VLVz32 xx5n9A8/ucHXawYY7fUeX63ynfX13f3k17eStPdXDmSaZzVmZjUk56XjxxhERiKiHlZSMjZ5qGTY vff+cYf94fMH/GW2/wCIyZxPtb9WP3S/Q7/sXlL4PQ/zY/8AJc6//wAwp/4kM0XY3+N4/wCs7DXf 3Mvc+P8APU3kHYq7FXYq7FXYq9C/IX/yZmnf8Yrn/kw2aL2j/wATl74/e7Hsv+/Hx+557m9dc7FX Yq7FXYq7FXYq7FXYq7FXYqzn8q/zLu/JurcJi02h3bAX1sNyp6etGP51HX+YbeFNN2x2THVw22yR 5H9B8vuc7Q6w4Zb/AEnn+t9W2N7aX1nDeWcyz2twgkhmQ1VlYVBBzzXJjlCRjIUQ9VGQkLHJWyDJ 2Ksb8++edL8naG+o3n7yd6pZWgNGmlp070UdWbsPegzP7O7PnqsnBHl1PcHG1WpjhjxH4PkjzBr+ qa/q9xqupzetd3LVY9FUDZUQdlUbAZ6fptNDBAQgKiHk8uWWSRlLmUuzIanYq99/5xh/3h8wf8Zb b/iMmcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdi rsVdir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq9B0X8sJ/MH5 ayeYdJVpNVsbqZJ7UVJmgREb4B/OlTsPtfOmaLP2uMGr8Kf0SiKPcd/sP2Owx6I5MPHH6gXn3TN4 4DsKHYq7FXYq7FXqX5M/ms/lu8XRNXlJ0G5f93Kxr9VkY/aFTtGx+2O3XxrzfbvY3jx8TGP3g/2Q /X3fJ2vZ2u8M8MvpP2PplWV1DoQysKqw3BB6EHPPiKelbwK+UPzw1K+vPzG1OG5maSGy9OG1jP2Y 4zGrkADxZiTnpfs/ijHSRIG8rJ+bynaUycxB6MCzduA7FXYq99/5xh/3h8wf8Zbb/iMmcT7W/Vj9 0v0O/wCxeUvg9D/Nj/yXOv8A/MKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf8A yZmnf8Yrn/kw2aL2j/xOXvj97sey/wC/Hx+557m9dc7FXYq7FXYq+m/+cc//ACX8n/MfN/xCPPPP aj/Gh/UH6XpuyP7n4sU/PL8p/QabzXoUP7liX1a0jH2WPWdFH7J/b8PteNNl7P8AbN1gynf+E/o/ V8nF7S0NfvIfH9bw/OxdG7FXYq7FXYq7FXuP5Gfms0Ulv5S1uUtHIRFpF0xqVYmgt3J7E7R+H2fC nHe0PY1g58Y/rD/ffr+bvOzNdVY5fD9X6nvecU758j/nL/5MzXf+Msf/ACZTPT+wv8Tx+4/eXku0 P7+X46MLzbuE7FXYq99/5xh/3h8wf8Zbb/iMmcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JD NF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+ /Hx+557m9dc7FXYq7FXYq+m/+cc//Jfyf8x83/EI8889qP8AGh/UH6XpuyP7n4vUGVXUo4DKwoyn cEHqCM50GnaPmb85/wAqW8t3ba3pEROg3L/vI1Ffqsrn7Ow2jYn4D26eFfQewu2PzEfDyH94P9kP 19/zeZ7R0Phnij9J+x5bnSOrdirsVdirsVT3yD/ynXlz/tqWX/UQmYXaX+LZP6kv9yXI0v8Aex/r D732fnkz2T5H/OX/AMmZrv8Axlj/AOTKZ6f2F/ieP3H7y8l2h/fy/HRhebdwnYq7FXvv/OMP+8Pm D/jLbf8AEZM4n2t+rH7pfod/2Lyl8Hof5sf+S51//mFP/Ehmi7G/xvH/AFnYa7+5l7nx/nqbyDsV dirsVdirsVehfkL/AOTM07/jFc/8mGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdirsVfTf/ADjn /wCS/k/5j5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0Ub6ytL6zms7yFZ7W4QxzQuKqysKEEZPHklC QlE0QxlESFHk+UvzU/LW78m6vyhDTaHdsTY3J3KnqYZD/Oo6fzDfxp6V2P2rHV499skeY/SPL7nl ddozhlt9J5fqYNm5cF2KuxV2Kp75B/5Try5/21LL/qITMLtL/Fsn9SX+5LkaX+9j/WH3vs/PJnsn yP8AnL/5MzXf+Msf/JlM9P7C/wATx+4/eXku0P7+X46MLzbuE7FXYq99/wCcYf8AeHzB/wAZbb/i MmcT7W/Vj90v0O/7F5S+D0P82P8AyXOv/wDMKf8AiQzRdjf43j/rOw139zL3Pj/PU3kHYq7FXYq7 FXYq9C/IX/yZmnf8Yrn/AJMNmi9o/wDE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv8A5xz/APJf yf8AMfN/xCPPPPaj/Gh/UH6XpuyP7n4vUc5x2jsVS/zBoGl6/pNxpWpwia0uV4sOjKf2XQ9mU7g5 fptTPDMTgakGvLijkiYy5F8j+ffI2qeTtcfTrwGS3er2N2BRZoq9fZh0Zex9qHPT+ze0IarHxx59 R3H8cnktVppYZUeXRjebBxnYq7FU98g/8p15c/7all/1EJmF2l/i2T+pL/clyNL/AHsf6w+99n55 M9k+R/zl/wDJma7/AMZY/wDkymen9hf4nj9x+8vJdof38vx0YXm3cJ2KuxV77/zjD/vD5g/4y23/ ABGTOJ9rfqx+6X6Hf9i8pfB6H+bH/kudf/5hT/xIZouxv8bx/wBZ2Gu/uZe58f56m8g7FXYq7FXY q7FXoX5C/wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/wA45/8Akv5P +Y+b/iEeeee1H+ND+oP0vTdkf3Pxeo5zjtHYq7FUg87+TNL83aFLpd+OLfbtbkCrwygUV16V9x3G Z3Z+vnpcgnH4jvDj6nTxyw4S+RvM3lvVfLes3Gk6nH6dzAdiN1dD9mRD3Vh/nXPT9JqoZ8YnA7H8 U8lmwyxyMZc0rzJanYqnvkH/AJTry5/21LL/AKiEzC7S/wAWyf1Jf7kuRpf72P8AWH3vs/PJnsny P+cv/kzNd/4yx/8AJlM9P7C/xPH7j95eS7Q/v5fjowvNu4TsVdir33/nGH/eHzB/xltv+IyZxPtb 9WP3S/Q7/sXlL4PQ/wA2P/Jc6/8A8wp/4kM0XY3+N4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvy F/8AJmad/wAYrn/kw2aL2j/xOXvj97sey/78fH7nnub11zsVdirsVdir6b/5xz/8l/J/zHzf8Qjz zz2o/wAaH9Qfpem7I/ufi9RznHaOxV2KuxVhn5nflzY+c9G9McYdXtQzafdnsTuY3p+w/wCHX2O2 7J7UlpMl84H6h+n3uHrdIM0f6Q5Pk/UtNvtMv57C/ha3vLZzHNC4oVYf57HvnpmLLHJESibiXlJw MSQeYQ2WME98g/8AKdeXP+2pZf8AUQmYXaX+LZP6kv8AclyNL/ex/rD732fnkz2T5H/OX/yZmu/8 ZY/+TKZ6f2F/ieP3H7y8l2h/fy/HRhebdwnYq7FXvv8AzjD/ALw+YP8AjLbf8Rkzifa36sful+h3 /YvKXweh/mx/5LnX/wDmFP8AxIZouxv8bx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+ MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdirsVfTf/OOf/kv5P8AmPm/4hHnnntR/jQ/ qD9L03ZH9z8XqOc47R2KuxV2KuxV5p+cX5WR+arA6ppkar5gtE+EDYXMa7+m3+UP2D9B26dB2H2w dNLgn/dS/wBie/8AW63tDReKOKP1j7XzBLFLFK8UqNHLGxWSNgVZWU0IIO4IOeiggixyeYIpO/IP /KdeXP8AtqWX/UQmYfaX+LZP6kv9yW/S/wB7H+sPvfZ+eTPZPkf85f8AyZmu/wDGWP8A5Mpnp/YX +J4/cfvLyXaH9/L8dGF5t3CdirsVe+/84w/7w+YP+Mtt/wARkzifa36sful+h3/YvKXweh/mx/5L nX/+YU/8SGaLsb/G8f8AWdhrv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4n L3x+92PZf9+Pj9zz3N6652KuxV2KuxV9N/8AOOf/AJL+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8XqO c47R2KuxV2KuxV2KvGPzv/Kf9IRzeaNCh/0+NeWpWiD++Qf7tRQP7wfteI9+vWez/bPARhyH0/wn u8vc6btLQ8X7yHPq8X8g/wDKdeXP+2pZf9RCZ1vaX+LZP6kv9yXTaX+9j/WH3vs/PJnsnyP+cv8A 5MzXf+Msf/JlM9P7C/xPH7j95eS7Q/v5fjowvNu4TsVdir33/nGH/eHzB/xltv8AiMmcT7W/Vj90 v0O/7F5S+D0P82P/ACXOv/8AMKf+JDNF2N/jeP8ArOw139zL3Pj/AD1N5B2KuxV2KuxV2KvQvyF/ 8mZp3/GK5/5MNmi9o/8AE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/AJxz/wDJfyf8x83/ABCP PPPaj/Gh/UH6XpuyP7n4vUc5x2jsVdirsVdirsVdirxfzj+U/wCjvP8AoPmfQoP9x8mq2balaRja BzcJWVAP91t+0P2T7dOt0PbPiaXJhyn1eHLhPf6Tt7/vdNqNDw5Yzhy4hfze0ZyTuXyP+cv/AJMz Xf8AjLH/AMmUz0/sL/E8fuP3l5LtD+/l+OjC827hOxV2Kvff+cYf94fMH/GW2/4jJnE+1v1Y/dL9 Dv8AsXlL4PQ/zY/8lzr/APzCn/iQzRdjf43j/rOw139zL3Pj/PU3kHYq7FXYq7FXYq9C/IX/AMmZ p3/GK5/5MNmi9o/8Tl74/e7Hsv8Avx8fuee5vXXOxV2KuxV2Kvpv/nHP/wAl/J/zHzf8Qjzzz2o/ xof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+R/zl/8mZrv/GWP/kymen9hf4nj9x+8vJdo f38vx0YXm3cJ2KuxV77/AM4w/wC8PmD/AIy23/EZM4n2t+rH7pfod/2Lyl8Hof5sf+S51/8A5hT/ AMSGaLsb/G8f9Z2Gu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc/wDJhs0XtH/icvfH73Y9 l/34+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/AJj5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0dirsV dirsVdirsVdirsVfI/5y/wDkzNd/4yx/8mUz0/sL/E8fuP3l5LtD+/l+OjC827hOxV2Kvff+cYf9 4fMH/GW2/wCIyZxPtb9WP3S/Q7/sXlL4PQ/zY/8AJc6//wAwp/4kM0XY3+N4/wCs7DXf3Mvc+P8A PU3kHYq7FXYq7FXYq9C/IX/yZmnf8Yrn/kw2aL2j/wATl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+ m/8AnHP/AMl/J/zHzf8AEI8889qP8aH9Qfpem7I/ufi9RznHaOxV2KuxV2KuxV2KuxV2Kvkf85f/ ACZmu/8AGWP/AJMpnp/YX+J4/cfvLyXaH9/L8dGF5t3CdirsVe+/84w/7w+YP+Mtt/xGTOJ9rfqx +6X6Hf8AYvKXweh/mx/5LnX/APmFP/Ehmi7G/wAbx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL /wCTM07/AIxXP/Jhs0XtH/icvfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV9N/845/+S/k/5j5v+IR5 557Uf40P6g/S9N2R/c/F6jnOO0dirsVdirsVdirsVdirsVfI/wCcv/kzNd/4yx/8mUz0/sL/ABPH 7j95eS7Q/v5fjowvNu4TsVdir33/AJxh/wB4fMH/ABltv+IyZxPtb9WP3S/Q7/sXlL4PQ/zY/wDJ c6//AMwp/wCJDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/ AMTl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/wDnHP8A8l/J/wAx83/EI8889qP8aH9Qfpem7I/u fi9RznHaOxV2KuxV2KuxV2KuxV2Kvkf85f8AyZmu/wDGWP8A5Mpnp/YX+J4/cfvLyXaH9/L8dGF5 t3CdirsVe+/84w/7w+YP+Mtt/wARkzifa36sful+h3/YvKXweh/mx/5LnX/+YU/8SGaLsb/G8f8A Wdhrv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4nL3x+92PZf9+Pj9zz3N66 52KuxV2KuxV9N/8AOOf/AJL+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8XqOc47R2KuxV2KuxV2KuxV2 KuxV8j/nL/5MzXf+Msf/ACZTPT+wv8Tx+4/eXku0P7+X46MLzbuE7FXYq99/5xh/3h8wf8Zbb/iM mcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVd ir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/+cc//Jfyf8x8 3/EI8889qP8AGh/UH6XpuyP7n4vUc5x2jsVdirsVdirsVdirsVdir5H/ADl/8mZrv/GWP/kymen9 hf4nj9x+8vJdof38vx0YXm3cJ2KuxV77/wA4w/7w+YP+Mtt/xGTOJ9rfqx+6X6Hf9i8pfB6H+bH/ AJLnX/8AmFP/ABIZouxv8bx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz/wAmGzRe 0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45/wDkv5P+Y+b/AIhHnnntR/jQ/qD9L03Z H9z8XqOc47R2KuxV2KuxV2KuxV2KuxV8j/nL/wCTM13/AIyx/wDJlM9P7C/xPH7j95eS7Q/v5fjo wvNu4TsVdir33/nGH/eHzB/xltv+IyZxPtb9WP3S/Q7/ALF5S+D0P82P/Jc6/wD8wp/4kM0XY3+N 4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJmad/xiuf+TDZovaP/E5e+P3ux7L/AL8fH7n/ 2Q== - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:75FE812EFA94E911B987F622BD994B0C - uuid:717f5cd6-4b5f-4555-8584-c15b50a65740 - - uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:75FE812EFA94E911B987F622BD994B0C - 2019-06-22T16:33:43+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Cyan - Magenta - Mograsim Blue (7,83,235) - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - Mograsim - 1 - - - - Mograsim Blue (7,83,235) - SPOT - 100.000000 - RGB - 7 - 82 - 235 - - - Mograsim Orange (255,83,0) - SPOT - 100.000000 - RGB - 255 - 82 - 0 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 40 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 36 0 obj <>stream -H‰TM -Â0F÷sŠ¹@“ÌL~š­Q\P°.¬ ½?8‰b+L|yùˆ=´Cq¸Ûg'tF8螙ñ5=^N <‘Ðé"”P㠕gÈYǽÙg‡â{#}=ßà -g°E=ã¢÷q[$U:ã‰â*í"a—´Q/ªh¤µ4Ä;~õ‘È_½.¥Ö¯ÎVГ±¦„þKú¼ MÏ!™~òà¿ó`’œ;¥ -endstream endobj 40 0 obj <>stream -8;Z,f;%eL($q1-eQc!eB@rRu>;'_62QH[j`r(36'S"3HHo3X%<%o@Hk2!FU+O9'@A -Vh?='VDRf@#r\p&mleqUMK\/E'E9[l2>lmZC]&"^j -95"(G'%j4=D]?'P$/_8'Cjt\dhLp_Tn>uh2^311(H[bs]?mAGAP!15FM;J6P"GI-O -gBipRN)0DM8H7ZrS4'1QL/FR>IM#j!_u/>@4FEE#&mRh+s,t5QJ+tT\q=:+;q6F)l -*<>sij2C`PIB^T7."CG!'gL> -5C)unqL8tSl2I=;5M^gRs4[,`!7BdB$i~> -endstream endobj 41 0 obj [/Indexed/DeviceRGB 255 42 0 R] endobj 42 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 34 0 obj <> endobj 43 0 obj [/View/Design] endobj 44 0 obj <>>> endobj 39 0 obj <> endobj 38 0 obj [/Separation/Mograsim#20Blue#20#287,83,235#29/DeviceRGB<>] endobj 37 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_blue.ai) -%%CreationDate: 6/22/2019 4:36 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%%DocumentProcessColors: Cyan Magenta -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%DocumentCustomColors: (Mograsim Blue \(7,83,235\)) -%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) -%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%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: 1 -%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 47 0 obj <>stream -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 20907 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 -%524C4585FD6DFF7FFF0885FD6BFF5B0EFF0F08A9FD69FF850837FF080908 -%A9FD67FF8508090EFF0F080F0FFD66FFAF090F0837FF080F080F30FD64FF -%AF080F080F30FF310F0F080F31FD63FF310F08310931FF080F080F08095A -%FD61FF3009080F080F30FF310F0F08310F0F5BFD5FFF310F0F0F08310937 -%FF080F080F080F08097EFD5DFF5A09080F080F080F30FF0F08310F0F0831 -%090F85FD5BFF5B0F090F08310F0F0837FF080F080F080F080F080FA8FD59 -%FF7F09080F080F080F08090EFF0F08310F0F08310F310831FD58FFA90F08 -%310F0F08310F0F0837FF080F080F080F080F080F0831FD56FFA931080F08 -%0F080F080F080F30FF310F0F08310F0F08310F0F085BFD55FF3108310F0F -%08310F0F08310931FF080F080F080F080F080F080F085BFD53FF37080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310985FD51FF5B -%090F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F08 -%85FD4FFF5B080F080F080F080F080F080F080F30FF0F08310F0F08310F0F -%08310F0F080F09A9FD4DFF85080F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F08AFFD4BFF85080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F30FD4AFF -%AF080F0F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F -%080F080F080F080930FD49FF0E09080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F30FD47FF300F0F0F08 -%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F -%080F080F08095AFD45FF3009080F080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F7FFD43FF5B0F08 -%310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F -%080F080F080F080F080F080F85FD41FF5A0F080F080F080F080F080F080F -%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F080FA9FD3FFF850F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%37FF080F080F080F080F080F080F080F080F080F080F080F0831A9FD3DFF -%840F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310931FD3CFFA93109310831 -%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 -%0F080F080F080F080F080F080F080F0831FD3AFFA931080F080F080F080F -%080F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F0831085BFD39FF37080F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F -%080F080F080F080F080F080F085BFD37FF5B080F080F080F080F080F080F -%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F0885FD36FF310F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F08A9FD35FF5B080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08AFFD34FF310F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080908FD34FF5B080F08 -%0F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F31FD33FF -%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 -%0F30FD2DFFAFFD04FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F080F5BFD2BFF5BFD05FF300F0F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F08095AFD29FF3031FD05 -%FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30FF -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F7FFD27FF5B0F31FD05FF310F0F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F85FD25FF7F090831FD05 -%FF5B080F080F080F080F080F080F080F080F080F080F080F080F080F30FF -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F08310931A9FD23FF850F090F30FD05FF310F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F0831A8FD21FF -%A90F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310F310837FD20FFAF3108310F0F31FD05 -%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF -%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F -%080F080F080F080F085BFD1EFFA931080F080F0831FD05FF5B080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F085BFD1DFF5B08310F0F080F31FD05FF300F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F087FFD -%1BFF5B080F080F080F0831FD05FF37080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F09A9FD19FF85 -%090F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F08A9FD17FF8508 -%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F0FFD16FFA909 -%0F08310F0F08310F0F30FD05FF310F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F080F0EFD14FF -%A9080F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F -%080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F31FD13FF0E0F0F0F08310F0F08310F0F31FD05FF370F08310F0F08310F -%0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F -%080F080F080930FD11FF3009080F080F080F080F080F0831FD05FF5B080F -%080F080F080F080F080F080F080F080F080F080F080F080F30FF310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F5BFD0FFF300F0F0F08310F0F08310F0F08 -%0F31FD05FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%310931FF080F080F080F080F080F080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F08095AFD0DFF5A09080F -%080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F -%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%31080F85FD0BFF7F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F -%080F080F080F080F080F080F080F080F087F3009080F080F080F080F080F -%080F080F080F080F080F080F080F080FA9FD09FFA90F080F080F080F080F -%080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F -%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F85FF0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%31A9FD08FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 -%0F080F080F080F080F080F080F080F0885FFA9080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F0831AFFD07FFA90F080F080F080F08 -%0F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F85FFFF8508310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F0831095BFD08FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FFFFFF5B080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F085BFD06FFA90F080F080F -%080F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F -%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 -%310F0F080F85FD04FF5B08310F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F080F087FFD06FF0F0F08310F0F08310F0F08310F0F080F31FD05 -%FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF -%080F080F080F080F080F080F080F080F080F080F0885FD05FF31080F080F -%080F080F080F080F080F080F080F080F080F080F080F0885FD04FFA80F08 -%0F080F080F080F080F080F080F0831FD05FF37080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F0831 -%0F0F08310F0F080F85FD06FF37093108310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F5BFD05FF0F0F08310F0F08310F0F08310F0F080F31 -%FD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F083109 -%37FF080F080F080F080F080F080F080F080F080F080F0885FD06FFA93108 -%0F080F080F080F080F080F080F080F080F080F080F080F087FFD04FFA90F -%080F080F080F080F080F080F080F0831FD05FF5B080F080F080F080F080F -%080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F -%0F08310F0F08310F0F7FFD07FFA90F090F08310F0F08310F0F08310F0F08 -%310F0F08310F0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F -%30FD05FF310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F -%0837FF080F080F080F080F080F080F080F080F080F080F0885FD08FF7E0F -%080F080F080F080F080F080F080F080F080F080F080F087FFD04FFA90F08 -%0F080F080F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F -%080F080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F -%0F08310F0F08310F0F85FD09FF7F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F080F7FFD05FF08310F0F08310F0F08310F0F08310F0F31FD05 -%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF -%080F080F080F080F080F080F080F080F080F080F0885FD0AFF5A09080F08 -%0F080F080F080F080F080F080F080F080F0885FD04FFA90F080F080F080F -%080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F -%0F080F85FD0BFF5B0F08310F0F08310F0F08310F0F08310F0F08310F0F5B -%FD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F -%080F080F080F080F080F080F0885FD0CFF3009080F080F080F080F080F08 -%0F080F080F080F087FFD04FFA80F080F080F080F080F080F080F080F0831 -%FD05FF37080F080F080F080F080F080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD0DFF300F0F -%0F08310F0F08310F0F08310F0F08310F0F5BFD05FF0F0F08310F0F08310F -%0F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F -%0885FD0DFFAF080F080F080F080F080F080F080F080F080F087FFD04FFA9 -%0F080F080F080F080F080F080F080F0831FD05FF5B080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F7FFD0EFFA9080F0F0F08310F0F08310F0F08310F -%0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD0FFF85080F080F080F08 -%0F080F080F080F080F087FFD04FFA90F080F080F080F080F080F080F080F -%0831A9FD04FF5B080F080F080F080F080F080F080F080F080F080F080F08 -%0F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD10FF -%85090F08310F0F08310F0F08310F0F080F7FFD05FF08310F0F08310F0F08 -%310F0F08310F0F31FD05FF370F08310F0F08310F0F08310F0F08310F0F08 -%310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F080F -%0885FD11FF5B080F080F080F080F080F080F080F0885FD04FFA90F080F08 -%0F080F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F -%08310F0F080F85FD12FF5B080F08310F0F08310F0F08310F0F5BFD05FF0F -%0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F -%080F080F080F080F0885FD12FFA931080F080F080F080F080F080F087FFD -%04FFA80F080F080F080F080F080F080F080F0831FD05FF37080F080F080F -%080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F08 -%310F0F08310F0F08310F0F080F85FD13FFAF3108310F0F08310F0F08310F -%0F5BFD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F -%080F080F080F080F080F080F080F0885FD14FFA90F080F080F080F080F08 -%0F087FFD04FFA90F080F080F080F080F080F080F080F0831FD05FF5B080F -%080F080F080F080F080F080F080F080F080F080F080F080F30FF0F08310F -%0F08310F0F08310F0F08310F0F08310F0F7FFD15FF850F08310F0F08310F -%0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD16FF7E09080F080F080F -%080F087FFD04FFA90F080F080F080F080F080F080F080F0831A9FD04FF5B -%080F080F080F080F080F080F080F080F080F080F080F080F08090EFF0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F85FD17FF5B0F0F0F08310F -%0F080F7FFD05FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD18FF300F080F080F080F08 -%85FD04FFA90F080F080F080F080F080F080F080F0831FD05FF5B080F080F -%080F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F -%0F08310F0F08310F0F08310F0F080F85FD19FF300F0F0F08310F0F5BFD05 -%FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F -%080F080F080F080F080F0885FD1AFF0E0F080F080F087FFD04FFA80F080F -%080F080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F -%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F -%0F08310F0F080F85FD1BFF0F0F08310F0F5BFD05FF0F0F08310F0F08310F -%0F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F -%0885FD1BFFA9080F080F087FFD04FFA90F080F080F080F080F080F080F08 -%0F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD1CFF -%A9090F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF -%310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F080F080F0885FD1DFF85080F087FFD -%04FFA90F080F080F080F080F080F080F080F0831A9FD04FF5B080F080F08 -%0F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F85FD1EFF7F080F7FFD05FF08310F0F08 -%310F0F08310F0F08310F0F31FD05FF370F08310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F -%080F080F0885FD1FFF5B0885FD04FFA90F080F080F080F080F080F080F08 -%0F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD20FF -%315BFD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F -%080F080F080F080F080F080F080F0885FD20FFA985FD04FFA80F080F080F -%080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F -%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 -%310F0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF31 -%0F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F -%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 -%0F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F -%08310F0F7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF31 -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F -%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 -%0F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F -%080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F -%0F08310F0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF37 -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F -%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 -%0F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD26FFA80F080F080F080F -%080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F080F -%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F -%0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F -%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 -%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 -%0F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 -%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F -%080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD26FFA80F080F080F080F080F -%080F080F080F0831FD05FF37080F080F080F080F080F080F080F080F080F -%080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08 -%0F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F -%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 -%0F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F -%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 -%0F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F -%080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F -%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 -%0F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F -%85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD26FFA80F080F080F080F080F080F -%080F080F0831FD05FF37080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85 -%FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F -%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 -%0F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F08 -%0F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD -%26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F -%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 -%0F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85 -%FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F -%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 -%0F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F08 -%0F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD -%27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD26FFA80F080F080F080F080F080F080F -%080F0831FD05FF37080F080F080F080F080F080F080F080F080F080F080F -%080F080F30FF -%%EndData - -endstream endobj 48 0 obj <>stream -%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%d_²Ý#)ɬ`1¦ó(ÉÌ"‡|™}˜}±ÕïS…fîy›3] ²2Cà 0\ -=>UüÍÿñ«ß|yýÕëßÞ}®†Ý“/þæoo{ýæÇ;’w?}ñâÛ·ïހôƒ_ÿp7ÎWžºþiyjOþÓݛ·÷¯_ý˜¿» -øí-ÞÿÁá÷oîß¾»öjw{÷Rúáî?Äoÿáþ݋;ùýýóׯžþöÅ·wWÏîèMKUÇgïä÷ó¦éGÓ0.»øã0ï~õs>òìÕž½}{ÿç;´ -›Û¿þöÕW÷¯¾Þ¿þŸ?Þ¥y÷e,yñ)â÷ÿë»·=tUÒÂ'¯ŸûòîÕ»_½yýüîíÛÃë¯ß¼ýñîð'éÄϟ}-¿y&]ÿ4=½½q'Ý|ùìÝnœ8&×?§§ûoï_|õ‹o_þöNF`^FÒÃSVôo¥© ÿ&=?ýéK!ýæîÝ;ù0igè¿á ãþúeý„üüõ×ož½½¹ÛˈíþíùïJø»)¤û!Çî×?Ùw/HUWÔcåaJq‘¿—iLóòޚþÏ]÷R÷ô/ß<{õ5žŸRÂCk¹.išåÿú+™¨;¡7ÿ~÷ê¿ÿ°ŽÄ›×߀„Þî¾Lã´Ãÿûí?ܽüæ…Ì>'iJóU’éá_ýõa™>øe¯J^–Ý—s®æyJc¼eñìÆ´\-ÅÞhÓ{÷‡û»?þx÷‹×¯îlB¯ß¼û.«‡Aÿk¿úõ·/îÞüã«ûwòÑ3i‹ÎèÏ_u÷BÞhUܾxƉdÛí‰xöæë»w²_¿øö7MñVdÕüìٟî0Ù£5òËoî^ýÃëâ§~9NsØå1Èä$éÖTvKŠ»±°‘$팳·;¶ÿZí¨ -Õ&2¦îW²ú~ùæþëûW?®ß˜ŸþäÍýWmIæiWô?ìÇUéþ¿ÔÿÛçJçß½»{U¿_¶ÃáçÝâ®~þK´zóê«Ã뗘‡·Ü½wÒ¾¬ ¯¿¶ß¶ø;©âÛo¬$<•iû՛ûW¨øÉ¿Ðߕ§¿zñ­üò'o^ûÍO_ýîõ“/~ ,ìŸîž ›’¹ýj÷ËßþùAÑ/ž=ÿý×w¾»þûWwïîÞîö²o…îÏ -Oúæ‡ï©Xúûæn§¿•wù£üý;üý˜÷w¿Ò*Pêßÿ[Èñŋ»W_þ?ß¾}öîÏ/_õí ùíÍ«?ܽxýÍÝîÙ«¯vÿüìÍ7iâW/ž½zöfÇ_Ôúzw?}õîîͳwÿ‡ÝËgÒ¨<ô³û?ȋÏd|Ղ,§odÔøŸY·öÐݯÕÔ³w¿¦u÷ê«·^ûõ«¯_`¿Þ´1vDŸLõ¿ùÓËß¾~qÿö¥WÞSüߏüRÖW¿|¥ŸüæÛ·¿ßýÃë×/¼æŸ ¯¾{óÍý«·w/6_-\Dßû«jÈ>×6ÏÿMž½xq/çÙ7¿¿~®•ÿf¿ÿÝýÝÙÆ.¼ÿ¨ÕõœSu®Õß|s÷çûg/ζxúÚ_]c¶w7_Ý ï¼À|æ7|öîùïw?»ÿí›goîïÞ³[1Ù¿»õ•|èo¾½w獠38W¾¾{{÷îÏï„A {›‘n»Zõé©7ýqòå—4rÆî_õüäͳ¯îå( í'¯_|%-U·˱™wû¯ž|ñ¯O¾ºÿõq÷7O÷"þ!oÿŒ›2u%X‰Vÿ_ˌÿKóªd/eXVåº+{)+Ç®Ü ·Rãm-«OëÿL] ]‰«’´Èàï<ÎR2ÿ.]YVåzÜ{9xُG)õ§£ÔxoH;Ž·}量ŸWÿ„®Ä®¤iFyò…þ=宔i‘¢ÿ½îÊ^˓/þïósziVÃj^c7»mŽ¥Hužc7Û:»ý,)ø³[Vó¼t3-ÿ•uÎë¬ï}¾õoÌöM?ëò_ý3œóIf Ÿñ ó‹¿1Ø뙥p¶óf¦¯­¬çsŠ¿oXŽ›Ù¬ÍÎe›;«:s‹Í™Ì“Ì©Îæì`åÈrcå¥n3tg3§#g+ÚøŽëž{æ–#4qföqaŽüêѾræê¹ÆZaÛhk -!Ä0‡,ªíöRŽáV¦}Œ!ƘbŽ%.ñ:îã1ÞÄ[Î)…$jlÊiI×iŸé&É>•OeÉÆ9Íó\æe¾ž÷óa>η²(FŒ˜Sž³¨MyŸù˜oeÁŒe*±¤2—\–r]öåXnÊ­,™Ó%,q‘Š–²,Ë~9,7Ë­,Ÿñ:\Çët=_—ëåúúz/åp}¼¾á’š¤ qŸöy_ö‹üj¿?ìoö·²Ìd49èáé ŸpXׇýáp8neٍœŒxLÇù(Ÿw,Çå¸?Ž7ÇۛA¦'Üěù&ߔ›åF»9ÜÈ*¹¹¹¹ÅÒ¸•A»M·ÒÙ[ùüÛk)Òè­¼z»ùÃ98­N»éʱ+‡®ìWåº+K-Rã"Í·’»2¯JêJìJ芬F©qòÒs¶Æ•‡þãoú?ÇU9h‘!Ãßû®\weY•Ò•Ü•¹+ÂÐo’—¸*¡+SWÆ® }Ñaò…M@߁þÏ¡+{-u«®æs=‹ë¹«³¶ž©õìȌH±Ÿ‘n&Öã¿uíÍsTe¼–͘ÚH®Æp=n›ÑZŒ×z\tL®­,,ÅJ¶2³$+‘%X‘uÇÍhgªž -¾jç´±úgÏrmea)Vd³ËæχÙJ²Y‚åÉõ ¾ÚÍé çqÏy+œ§ÄyÁ\ ý#Gûšc›9š‘£7r´n8:{ŽF‘Þeö=F/öêÈ^\ó»3¿2ò«ä[dÙÜȐ„] [+ÂÞfarQ˜Ý$|^¾T–ԍ öA˜áµ°År…A&a”AΛQÎà[™ú£ Ê~¹vZ–,Œ5 ƒ rBrbßʂ8Ê`í… /E¾QXò,¬9– Lz”³ýV–ÊQ†rŸ¯…‰—œ…'aëA˜û(²À­,¢£ ï^Xÿ"G@–ƒ ɁäXgùFYÒ72Ù94®åð(r„Ì)ÉaäPE¾¸•…w”)Ùˁ³ÈÁ“ã,GP”£h’i-p#Ë㠇ԵVòrlÍ!Éä E¢¹•Åz”iÄ1‹ƒGq’£G5ÌsÊ~;؞ijõI>+L~ˆ{ -*PˆˆQ×ƅVYë¨5´÷! L+~q۝Ê)YcIÖ×(këÜʚºc„§þèI5rÃâ´JÜÖõIJ3 '–J"0ÔOÀÙèçâ,K¯œ9ƒŸŒ8¯Ñf}ßeŒ`l®r¥ŒÊ£IÉeëíT`X ã ·^³üLYðX)ØPºúsÔàú„ƒáótMÑæ&œ¬Š˜£‹O*0ª¥‚áâý42šè®Ý¬¢x½©²°¶ZW«‰õp ôý³ƒäßßO¦NäJð Ðd…dY){®™ ÑO²#¤2«ž]µeÕXVϴȶ|ôÏ0³5+{#óéØlåϲ‘÷._×Ò4¦²Ò¥²éWZÒJ3½Lj Æ ôÊü+•x­íÕÓÊuA×&XdWZäzÕ<ð÷²)eSšÆªÿšM—íK<)á¤LgŠý‘û?'ª#vg/ûùßdzEX‹¬Âƒ—½—ë e¹XJÕ0¥Æ¼)ó#KÓ^S_¤ÆÕÏnáhÿ>-áBáҐ§G–sƒ|¦H{òÑÎÚ ->éÏ竱;^GX•~«´¢r[µ…TÛH1Ý»ÚNlßË®V=½îöji[a»·«ì[÷r¿{÷¶««átïf·:ÌV’Û$š]*ô»Õ­ìSù—ÛBšml³7ëî<òhª6–Þƶ?»7÷+ËÜéî¬6œín-++_³ -UËйýê?¯l‡é¤Ä•µñò®\[®¶6Ësûö¡Ý¼Ù«ÜÕ~÷á;úÁ]ýW°?„Þ^½:U°Tj9U°ª¬2Pa¿¡D²˜‚9›L2¹zuÛI%y%•LŠu%‹*֓/Dɂš¥JÔ¬*–*YZTÑ*®hS´ jDÍÚSÑ*´aÉj¤²5r£ÜRÿ>¢ © ˆª¥ÊÔ­IÕ-*\GS¸öT¸ -.¨\`e²vLíº¥. ÅKU/(_…ÊÔ¯Hõk䶺¥ -v  -% jX–fñ¨hZ¢¢*c¢ŽÑtC…ì( -T2(ePË ˜å˜¨šA9 d]´[Óá÷Z„ƒ/”ï áeJy3^ø3RÀjœb°NH“ãTv+TÏP"9xÏ»;®ÝIa՞«÷<¹—¡(/ ¿'²‘sÖ/]I6+®¹â‘²cz™eÃíÎò¹ä‹3òÄã¸ÆEnò™wµ«¢Zz YÿgmìLk;\=s©rŒ¦Ò¶VemóK›2¯Š+Kb^Ù u¬u¹Þ”ý¶˜E³/Ǔrúçö´ÔÕ& ²?ÉÇ3e:[ÂÙR­ˆ§%](óÅâöd©1oJy°,ï)"R¬¬ÚçËþ‘…_j<<²W¤ÆS깩|t‘/ýî#ÿœ9^?º&7 ®µNæDÑ­¨=µÚW³•j]¬˜uVjTkmýSYEÛBuZ*¿­ºu•ú«¥XíƲ¾ižÒ2{©¶æâe±ríe†ga^:áXçxUó#œçN_Zù)V<é7ºÄ…zγ§=è2ïy€ç¬xŒñÚÒ.ó˜3œå}Ej|<‚ƒl8½\Î5>šSt»ÿ"Ÿx$W8åìê‡Ë_pWÙve¸Áî ¶T:Š!‹…({P¹sï…1¨Óx0·1lj®ã"‚guá@–CGȁ"+œÈrÆP­®d8“oèNV‡r€J§2þÀ±|MQÎel&u0ÃÅ ù“næ'_ÐÕ\ •Óݼött§ó R"$N8ž£| déL~qþšN胰sEײcDèŸ(üÃ) ·ô|©,{šj)X˜GÚ*ÕpWCvÏtZQ=º®Õy} sÂF¿¥{p.\ùo引ã6NkÀEÞË5{úü®®æp@¿:hö¸›ä_ó® WQöÎ. ×'<ü›'_üÍÓÇ<»{¦Î«$O¦aWÆ+ÑçËndmW㜗ìÿÅxª€ïTÊå9Mök#ÀZËt†[sŸ\“~Ï JmšÉ Û~Ƌ¢™‹êÎʖ˜†…@ôqòIãZeájNÓ}ÖgªÐ¾n„Ï¢²4)óÅ"üY+ݲh“ðYT&ӗ–Uei–þë>O…Ÿ0—S¾*!,¨ª¤¼|ê„n«;·fíã—åJøüÅ»~ -õì ¿Y!˜`™ÿòåÝ €2í_Rq¬Ìÿâ¬óÖæd¬2™›/c¼6Vxì}¶Æ梡f(bzœ  OyÈQµçávKó‡j3³kd7äpÀSáàÒC뚶­ã4¡"«gDm»j#Æi2öR]ž;IÇ©#ÐÒÅs.£Q{Ëmêì4Ž)"˜G%lÍcÙÐ ŠO0„ d7†Q8$w{>Œ½èÂ]l—~²æ†ïñÍÐÓ»sÇG?­—ê’?úÄA>3¤²R!|”ÅÀW(Aî‚Ô•dD id ”®’õŽÙ½É:ʆjh¸†2Œgƒ»4©9,›Ù+š}lFáGcS…KqOz3«‹zR<‘ሎŽº6ÄP5'C)"hàqsâtÝTK¢zƒKωôL):S’.4^SžÞS–Ù£àtKɺÉÖ -ÅÄ<ª|­v“±)e8Sᙐ³!i‹ÄKi»PÚ®òöq%so¤n“¹±*„“rw•¼e—­eo¬’Å`ŠŽ7îœ(yWˆg/y(yß@䒹WÉ;t’w6©{O©ûH©[áŸMގ¼ YÛ¥m‘ʏ”¸«¼}*q'“¸)s»¼½§ÌM‰Û™•AÞ šÜéN;ý÷ÿ{M5C2qfV6—ÝMsÞÕõ;º¾«‘ºÂŸG7[‡Á·¿ÃêïhŒºB¥“ƒãÕ$.Œq<¾‚ä³ýWéú_u{¶ÿ^¯LïGƒQWùBÅ%ó&n— €:)®T,ØG¡ÁFgקpÐÝÌÁf âÚÍÆ[svSóÈÜA™­t@f©q f>®À̗×g1Ãú¼^¥²²¹‡1¾foͶ¢Óö¾zuý.< -¹ŠeeëJžyT¶õ f§\^]Ÿumßؐ:¹®s)²²uµg[ñ3µÊ1ʓÉÛõ QGªî€îîÇœsfmöå¼Ël:1{Ÿ8œ tXƒîO‚dž„>l@ùç Nƒ ¬/5ž …Èç¼q^ˆDӞŠØE—öЈà³;iß¹[Ú^ê÷S·«N YW‹¥ö‘9Cî‡Ö/Ü£@ýFaa‰¶„K1WÒNä•/OwÖ®ÏU¡>ÊXª­e\ÇB×(èý\ãž[Ìsý’¦¨™Ö©YªT­£š[”xU…šÚÓâ—]¡é˜£¡¼ÖñÊM-9RnjýF¥ïUyÃZ¬Uùó†¦5~£Â›oø»µ¿VäתüZ™/fåÎ~Ê,¹JßÔúªØOžñdèÔûÛNÉ¿q]Îí…WÔÆ۟ÅKñҎµvH'/±©1t¥Åô«Òã®×Ѝ^ƒæ¤ -‡l á°*û“r½)çþˆ@».gví.”¤Æt¡Ä.<ژFã3”Š…8ž!¤²×A¤§ñëPÒuT|oÞYYÝóÊCÛ|´Ç•éuexUo­ûk«ÇöÚç9Û<é¸N›@Žƒ{'—M8GhÆW3¿ÞdY‹d{n…ż–™blõ`«)¶ù°×^ìæ‘)Ëʱ`õfO«€2°uØÇB©%»É6™,ï "ӏ4Ä×@ 9˜1w¢!!*1ÕÀ Q-„Î&‘£jÈ­é+ÊP•ííi¾6#p éGfSè«÷öÕ-áB?7×ó­™kNÒ7<¥â<ÜYƺÍÄ:ŸÓw“'æ3e‰¹ÎѲÄ|çÙm¾ÿêõW¯œ!æ4 —ñ”ÕËý>Óä~¥v­3ÿ8Ï8?C]࢚™¤VùŠøɼvÎs[¡#¥ô–ßN†4Ä~?OY¸¯Á…Á" ͪ7²Õ¬S¸cþ¦9ìdþ6‘Ofš%]Öº -«A-g]¶ÐT`ӓ/Ú´†5¨iLÌ$³&è 37 L8Õ<£ §É”Ÿh†š^0› -U•ª¦§Ô?¦ŒQ-«JZUÚÖÎÆ/³JÐÒ^®‹,€é¤„³%^(i]Lme~Tɗ }×çKù¸bÑà+g´ÉÓbAŸ±|_ã¥':©¢Êo³s•Ú&Jy•5s"-SFPãq“Î -²WiB)—Ì ôy2 ijA/-ÐÉ— léáM¢ÂU e oZ79Àò$¼IA–³‡… ÚwANƙ,Ôi *|Z<%zª¥š5ôÔh¬¦o3¢TÓJ3»´(šf¦·…ˆ§V™/”tRÈ¥Æùb9ã_¹PšÑªvåCʉi]¤Æ÷<ñ¡åÑ5>úÔø™ÿüïQã:ɍÅB$j!×êœòÄo³é5û.ø‰ézÂQÔ2Ô¥¹w¡åÝ:h?­ò©Â·{7ÓyŽRyJ…mŸ ™<ËU*_ÉL ©ÜåzÅYÔ¿å-¿LfÑi\&™éSNëŽÓÔ?m¹®ùÌ -<´…IUŽ£rԊë\â>Ӆ²á@côeŽô>þäEj|à·QæzU¾¯ñ/UãÆE=úσ5®AèáÄΒWÖ!³ 1'g0i©KlÙGyѤv•*7U‡ûlV-ÂUTrbØx Qº¦MëÖå§Hãtï\¿¥ü,`)“‰@! CaO¾ ;]A`-0µ«¿ †@Gz2؎úäàÇUÞ܉ž”7 GÑ?‹›ƒ§w0Gº–ºçëœVVÝb Im‹ {o;ͪלzmh­¿l¥ÛîaяgÊiÎõL–Éò¥?®ÄÇÃ)¿¿Ì-R㣟ýÏTcg&;ž¤ÞËòÍ7I¶ ré-oÚÌ|i3¥íiòšiî-3Ú^֛:×`䂉 æ-¸ÓàJS7šÆ-™ýL£RÍzFW™§—.¹†ð‰DQã“Zz›\ÚÓK·h„'_˜›«º¸ª{+XTÂèN­c›pÝå6kn,º°„GM«gk×Uu\5§UsYõ«ÐœU–Ùr<“Ùrë¦Ú:©.¸§ž|±qP]rO­œS9¦¤Æ Ž©sN©G¸¡4ì±åð˜b÷t¼¿\2hæóü¬å¿ç(ßs”ï9Ê÷åóÕø=Gùž£|ÏQ¾ç(Ÿ¯Æ•›ýÁË?þ—ôÞç)–q¡3=.™PIV!(9'uƏÂ÷ÎüƒÿœÏ9ò?kµÕ§p°1ìÒx5·[yö7¿ò7¤YùÍ<^!ÑÄ.Ä«yìÒm=ðȦ†,§iÞM¸Þ{ÉçjØ>ÒjÈù¡§:aº€G˜€GÁ3¾ÝlØÇ ûb©§Ýõñ¤>¬xM[À5þ<äù9ñRyÌ|ƒÆ ?:0þô -¯roÔY0û[ -s‡‘ëïùìïøܔ¿Úšú”MOÌØìk¶B|vÖ³¶šqævãºb7<‘߸d—ùíN]Šš–f©t –ºôJŸå™5 sQ&•Cµð¶†È|w%Ž¹í†—a:ó P¦ÏW§ÅF§aYdZ/<û€˜ã ÏjHÖ ¸TÐ}ÐÇU`­–Þ|þñùtÖyžqN›½1ç™û²2k°M^ŒK°é#À¢ù,zæº뚐Á+`lá|oÎChWý²k Ž†¿þèè{ÁŒàÇ5 â;Ü`+҂…m¼§…e®Ûh¡!§¼§tÀÄ5Ùþæ/m g÷CØîÖM›¼¿}2=Xn<×oËô›ºëù4+àž),³oÙòùΞÇ÷Úâ}]Óɦ1ÝÏD%4di¡ËmoñÚ75hð¥ÐEbà 'ÂĬñÖð? ªúÆ"¨ƒ)Ýq}|kŸWP÷ç;Úf<êsMD ÄÔ¼G}æ£.Dz Áñ›UjN©8Ÿb|aO>b|fåh²Íöø˜×õ4“‡é?Â8æ€ÐW…¿Íeîó¦ö ~È[Ÿ¼ ËùmX¶)X={`ÍØgì®ðYÛêr8É^!½ ºâ°^çÆÁÀCˆio×÷åO}g•Ÿó`.ïÀ=¶7'w°½äí\¸CõB²­¿à;½ÐŒ¡é#R·é¥Î%˜Ï$˜²äRT€šÊS£K1Ÿ5–Ô¿ÕS„ÊâH+¶t¹²«jlg œZd ·ÝÚIg[›Hyå-6V(m¯#'[Yƒ³DŸ/šG'a%7¼Øjá…Va?Êx™¯v–/™¤]\XµÐ¤Aaü Â.aò\dµ%YuÈʁ˦ö²³ðþ ›ø–‘…×¼D -«Ãï0=/Á=êzØ÷ÝØ Ûûâ궻½ÖeNõû -<´ Ü.qÀ5dÈcYÖÙTG“dZ@ïïAú‹w®V`å3w1<Àk·Ü–iáZE@q>„böþæT×a]ÎڴʶѾñWßòõ™Ö¹èa‹  Ø€ˆ§á¨Ùò:§DµÉðLðԅó#œ FÉÌ•…:{Ø醧H8 L,‚’B!ôÇ¿®¿ïûÓnûÖ ‚ ‰ýè+‚ëíÛßÝ'~ÝJe?L´<ŒÃBËÃ< ¢ä•ì™ˆ¦ âNÿђèû+#>s½&²Æab‚²4#üÉ(ÊSÍjÙ ¸J`:ó¯sž®Qçûoý¬õš±èӌÿµÎñ -Çõçs*lêµqûÝfþ¥q §h˜‹öŸWHœùÇy5á3Õø©*D<«AÄ­?€É°Œ©Ø- ·¼a¡²Nܯpki–ÀÀ5=¹§7v|3à€DÓuK=¾º Úuý…~µO±OwQšìmÑ6WW¤m.G[_ŒÖÃêח¢u×£­²{>|±ãã -îmýÀ;¶ÞWþjtá¦Ç^GšÁ(S …D«h¸÷eÉÿ2ӕì ×Xy=ê!Z:2Oû-_5Ýx„Übz¢Ñ&zÊ<â¦åЩÍk5XB²‰&jv½biìZhXƒ%wŽ mº¹íöLev¾¤³%҂s®Ì[x Øg-^£¯‘–]¯f¬—dèM±5•e¶ÿ/½¦Q‡):x -ö‰›>azÿ_üÝ'¡ºtô}lÀãb>êÏ÷5>öv¯Í Ûó j®uƅίqÞóúfȅeBH„! F^Ë<ðBfȁ½¨ÐžKR`'º$x4xʵÝúP¯P®w¾†ÔëéëmíŒþ²äþ*ùådù{*PÞ&pþrä÷^Ô~þ’ä‹—­ô¥ë5ËD/7ÐËÍm>=$®Xn -ÍLáY)¾­Èl\ÍøîÖ­•á}ß彪†÷šûª7½e Ø4ð`¸q#üѲ™îÍí9±ªY¾˜q¾þéR¾òƧ¾Ä“.”é|áí6çÊø±…×´Öòá5:У¹+z‡EuYŒ'ð -þ(ž ±Ï„!sZeAl×<&ÿá:"s»yˆPð҇­s›¥³½Þð†­K嬤ûžrpÈg+ 5nmˆÿñ‚ôwRãƒ*‰Ôxþ7ç/ 9½è ¿ð€êØ§W‡Ì'™E×ÙEǓ]U÷Ԟ·g_›Ë°ø…5ч-;ÑùüDãæЫ9pún ­Þ€ Çý­|øž~ž>?sþãéOªñ¼b/¨"¦¨Ð~½.'JÎ&×v”kj“«RÂÏkŽðz²iŽq=yT,ÒÔØï©ÀeËþ)NȀ¸5ŒòáÁ2=f—3¯£es„íPÁä°Ân80~•S%Eµª”¸g^D•)šDIòä=Hy×TP ¯¹ïí?^BúO_ãZµ³°oF¶;ɂã›úÿ6%²bŸ‚ßѵVSª³UQ-E5¯T\+Šó‰ãsòç/Tãà -Å¥ûK­P[?½öm{m[¯¹zt2˜T§¤ÆŬýÛê—v×N®]}QüþÖ½eO¬îÌÞ¡ùKó4‡eË`©×O,î®Zgd;0GÒDK.ràu¤~Çí¸ ýI5^P9.ST˜Í`]N•œµÔ)Hç. ý +{ËÓ®•¸éòÁ ž桬0—ܸ½w^]ìyè.õœèøL×z™çµe®«ÖòÉl兎Ç-ä#]I>q‡ÂüÇ ÒßIª$py|H懯¾ºÍÞU©št~£põªXSÐjֆ¦ÆÍæ¯Èír©qñ ꇕcíŨ—<4(ãl> óRˆhmÆ“û´£âãWwinŽgÐtY`oÂÍp…‘Ã᪖‚”ÌÔËn<Úåx5¦Ü;?­uª¥aZ1Æiæ=[ÂLǤy瓫²»Í>¨W%ï¦x•×_òÑU|ª#/uä¥-"÷,Fg{¤=:1pŒ'h-^gìnhF2¯uÚãzkl½áªþ·Ýtº¾+¶Édaûsw¿ëö–×­8 M¤³õ-߶úá UÓ;7Yqe:×·¥·,ü-Äíï¹í®Y<½ dé.H\ßý6ù’‹7‚4þº³}©œº ‰—Sɹ^–7²»&†cˆ´ôøÖmÒÞÛîדýB¸¬’8e{µÔ`E¼à¸ñò'ïÄóàøô=:Bá÷èøïÑñtü¼œÝ‡B>µ5>"jëòu¦0~~ÐúŒzä"|DønY·;«ŽvKs½·ªÝ\Uü檹»G«]4Ì[ºÎœÌ~×ëó£^·Ë9NnîX/ÅK|êªËç±|"‰¹AeZÝçy_÷À5+äõÅø½&ÍçÖu×B5¤u„àq­Î²‰ Ü^Qqò͗£//ìËüuµ¼äُåÚošÇºŠáÜУœjThdAC;e˜—ÅÖ¿qgßÛ Š·»è“+ûN¢ -ÿùîþÿûÿn÷›ç¿ÿã³7ƶÙPþR—Òœšô>òZš'_œ¤-®IÐkÒâ>añÑïÄ\'@¯‰Š˜ÝX’â©Cê¯# ._ÂÐ_Á°ï¢>%BâÐ]«À J²#aÅó†zrÏ­!hcÆù®¯ü91ÿ~ô¥?LTtyÍÔįÉnVÕUÓÒ]W»¥¼†l½0H¢J×7v“ï#ÒèoÒ]›QóAƒæãâRÎ\îñ±‘)ëÄÝåÛÔ Çói&µ&>æB¥ás]©Ô_å+báDf¿"ú»vëz蒠?¸&ޗ}ÝÌÝô$J4Ðvu»¸¥ŽêÖJ·b좂óÉþWiE>ŸD^åò¿`çœjçn‚ÏkŽ'5žr¼3šËÙTÖëDցõä‹OŒÁÊ…Õb°d•}t–¹Böjõ ½#åT—²N"ss>Ìwv§ÖÇXÏުŴُ¶:~±¢kŠ¿cKò'ã­Æ&úó4ÇG%ú[§ù³Ø-‘y>)zK£§ µËè-Ye¿EÄ.P³!uÑÅÞºÝ$ûÉçS}¿&¾_߯‰ï×ăkbì2fæÿúð—¿Só–Pžþâõ«_½¹õîþÕ×_~Ù«îýož|ñ‹oø» ¿ûÕ³wïîÞ¼­þúş޾}mÞþµ[–«ež¸ã<‡ÝãÕ ³³›ÆùJ׬_|­ýËñ÷·úCu þ˟ôçÿ*ÿþBý£ Åîç»ýïÃî«'|ë×x ¶T+Þ½õ¤½ÝÏVäú]?ë«8K\Wð -ÿùÑõ›wÇûçïî_¿zöæO»«QäGûׯ_ÈXüÔÆåéÍW÷ï^¿yºöüßeôžþÃý‹»§¿¾{þ¿ÃÿþãýþÛoµ–£vú—ºV&\{©ÆÐqJ\5QVK±,‘vip©÷^Æ¥ aÙýË3­k=’a¯†0»T®‚( 6PÒÏI*Ú¥åj™l'¬á -µ¥Œ+Šãn*ò¸0ƒ]JW£ìÀÝs¾Vҕlò°KÓՌ[Ñ"®â4—]\®DÀ¥ÉóÕäù®dGNõ½åjÈaÚùmfõ™ÍMå*Mp;”á*-x?_‚õµ¯DŸÙM3BŸ¥µYZ¡t&ý(‚p®]nˆ„l¯ u g'Ó^FY…s¾‘u`A®èT2¹ia -¥vn¤Ö)îâ|…+ªv“ θÈʈã•t ßaO„tý­ñJ¤ÝÑ¿|šÓ•ðɤIóœnž¯âX–ݘdfç¹¾7_-vh¿ÅGż¤ÔW"nƒNAæ‚ÑÀü=éFîËñJøF,”«Aô½]”¡f)ù’yV@®“ì=ú3fëLÖ³àÃeæcâÏ1ã»1óK¹€ Â|w¨EtѲ“F1¢Sˆ:o1] [«óÆ+ùAÖÜ,ã;Jßä}QWæÝe“|tœdf—e7Kc˜b}OVß8Í»<#0¾p(…[/xMÎ0!È^ ¢ídð²ðô¶º&ì © ±Õ»0H—Y%ʄ/;ì.fYœr>ØÌɇ]̓Œ„¬ExÅdU¡9i¦ÈëI†*ÈÂãêΓ.@}OfZ4þÌ(÷ýù39†¯¿ùÓÓ׿ã™ò“7¯¿ýÆ‘ó¯üúgïî¾z*lO›e÷ƒîþåŸ/<²RÒ<V%ÒÉB·í L-ðÄ6•§ÔŸ8Yï«·'–+á[26ØGÑÖr£"=<¾²jB a'|n.…Gá¾|¹–EnÔ…áL‹.X}O¶©V”´z',ö„¾W©ã°Ø‹ö ”q6ŠpF9Ü;Š¾ÁãVʂÖ‡¢ß攥¨\ oVªp nïu?\v'cs díÉ°dáU“Œ¯0—kªH.`i£0Ì(btei#Î$™ûÑú<Ùs{C„}y%N°¶Úˆ“:ÊÄ´Uët{cC·«ÛùSõ›½žM׶[b³Cn øÞ G ½Wr®³¥Ô˜¶(|@þ±D9ãm NrÖÊð -Íp 'c§ØÛ³€Ëá*ìjˆH+ŒK ü ǒEøâa¬ìt.Ž‘§ -˜Ú(|^”ŸÝå .r@ÊV_DØ-r^ˆøaïá°2‹09#v<Gù˜E„%Ñ]„ ¼B–'œe™êé%TÑ®ôÔ)҇ B‘œnXAç‹ ¨°–!ÄúžPã$­Ë! ,Ûí"ãÔ-qÁ{›Q9=†°iiBÚNƒ´ðrMEÇq|K‡SäbÃ2š„âÊòúóslÑÛC"›è*©kË^«T™m†×“1Èqn­U‚½§ŸÔžªßìõlº¶]|ãîú›ÏÀüFH "¬g -F6‚šdÆd¦e©^…‡CÁ’§88ÁxXRù¤=&ƒ9C"òz*Áš³÷*5_AßßµŠDîN²Z{F°÷ì«ü©úÙ^ϦwÝ šÞ¦ƒøöð( 'å‰Ü -ò°$Ìý,³$¢Ú(<_Ža~á˜'laáBYv©ìé›ÅV‡,ºX’É—•/ôՄM&[bd³Œîo’+AšÃ0·§d+‘¿‡P#ˆÔFñgÆ<ŒOÉö£½'UÉ8>„5û90BÉAD~2"ÖO¹8ê B0n”ItôW,¢5Ì/<¡ÌØ.|5;T¿ˆpÚ(úªœÈ"²—îAù̜bäI…¨£ˆö±Œ©¾ZÉd-A$40v9ÉTÉî]1Wõƒe®i9RgH2ÉW!âX’Å9Èq"³ †csÌÝ0MƒÌÕÄMÍ6,oä™flvYy/KwÎrŒ4!πÁ adLCŽÐµä8ϲÕÀ£Ë0Öý$?ÅY>Q”â š…|ªŒ¤ðÔÝ2èlëé±]„+vDS¹JE 1Sº4ƒ»eådî£ðs¤Êi_+±`jڃ“ ÂjeÇUüh†,ŒáPDŒ¬†,iÿ -~Šµ!k”¦¹Ñª!k”Õ›×®ðc.â•!k„fœ·cᨊt¬Ú±F‘Á¹¨Wv,j”Œ«KZ–#\vTµclµÓcŽAMc\Û±œZmPX‹ÉLTãÄ“+3εi.í™fSØúj%•°2.5ªÙ ¼žj¥ª­lYþEí©Ú“Z϶kkv.RT\Û²ÕLPà›aIn£!jËڔž‹ˆªî±AnõTBoZjT³@µŠÌFÕÚëMYþUþTýl¯gÓ»ÿ¥,YŸ`D0ˆ¡Cä3ÕUbdÙê3Žwqȁx­F5ƒS¥TÙPQ¢´ 6³ pÈÀ í)˜µœ< ¬Ì曀I) Ò\u0ˆÆÂm*¦|ø8;ÁüöÕh£ÁàŸ…­—b^JX´àæ£b› 3¾SŽ>aIªqP}xbÔF¥X‹¨/àðþ !vå”{JÔS#DÔâŠC¤(35²0OÑ'¢Z—éؘÀ_³ÚÇEZ˜ÅÆ>ȦíÁ nŒ®*ý¹¶è†ôEuŠADÛ]«Ê§ÐÛ«{±~˜?ØúT+;éåw(#¹â²øqãõƒÚC_Ý~x.LÀ‚W¿ܔfwà™ãOÎv‘!ñfõüòƨ¾@Û8DW¨Ž§êû£؆:ÿp¼Èá<6ïÔ‘¦|©ûʳœíSóÿ÷ñã܈³«³©U Î89; H²Daõƒ¬{ŸKóñAÅI277 0Ciž[²>CM¬Z‚ïTï†û©ƒA蜁°1÷á˜7rkŠSç„.Ê@»?p¤ÀRÉüTÝ¡Ô¸?’«œ[S猖*64 yÚ¯êqæʤ5§ -itg"½‚è¾ú}ª[Êÿ2a¹WÇ †qˆÎ«gÚ҂~V× (øÂDŒqß ðV‘–ê¹Uƒ]8elÞA¾™@©îAvÛ2ªîAÔW²TáþAXH©ï¸‡PN@ðªÉ]„Ó%S¾É}„ØåHïŸ9 a„à2]{ az¢ˆênBh¬Q}wºM/; -ñ·ÙË ¹È1ÀBuÎÁZÂ>¹Ï)kwa÷ ½]Uö³µØ» ÁD¢]šÏº1­ËޞSÖ^ÃîAÿx¯lÛË3ŽC™kù‚1m<‡0òpºnåÎcsåUÂÚuØ3Ÿ`W“S¬Éµó3 `·º ÛŒSפÖÞÃö˜¼×´íå©K˜žùí¬‘uãܤ²ˆß‹Ö‰#w0ŸÔY¨È4{“"œ‘×`µÆ±N3Ô áùæá!jÆ´²J1,¨ó±=ß Õp›„ó;C³¿šJ}UN-¶*¯&"˜h!4œtõTŸ -ÐÐ`™KCwpwäQ%ÔÃ8ìÀˈmàøÀªÓsŠ*½íAaLºc««Q†Ž 5²t„Â\«, -«˜ÆصZ)Ïë¤òëÚsµ^×IOß#}5¼K\k5ìÉ:ÝÕI ¿Âa×®^êQ„'$6njÚ¬ùju@ƒ¯è²sJHý"sr¬‹¬zª§ëú4OµS֞êö`õ@OÜ¡§„Ü­²FÆ´¦Þ73oH6]ëaºì®ž Jãbˆ—2ïink?c«Ù k§u{®ú£[]b®×<‹i"ðÊ dӞW­„µïº{Î;àum{ú¹¯Áфm”æéäªyº-²jžX&4á¬4O°Ñ&×<¡Ÿ‰Ì¹¸æ ۍn+ÕӍˆUõt[`Õ)aÏ0‚®TOè“C§ Â6YÏúóJï¬DW;a6‡©Ë•Iz'E+­¦³ñuþ _Õ:OôŒåjVãÈZëläª*ÒDûcU&ñ:ô×Z'íLÐoڃcå—^™SVZ`G6u±UVUÊÖêJ÷lŸ×ôžyeÛ¾^v†’i>&CÜÀ -õË ‰žÇXš³j$Ømħ¸}žvÖîAˆð#¶Êœb­:c1ò3…ÂX´29µ„ÍÍ]«•âÖ}s®úƒÞ¯lÛ×ïÐ7>aϓª‡v°j¢Œ,yPÆ@™c -4®Ot?äÅ»Ïr á(‹£UdµÐk;ÿ4*oqeâP—ª¼°üÃÒ®…ÂםV˜dGíݒ§+âTuœ`S€µD^Š9Vèw#W+–Ñk‰ŒOFPµàyn[3AGÝs¬}U•`Mڋ• Üjšôlm-NÝaÛ}™?ç_ïum»ù -’S¸@ƒÜ ’N>€pú8*’¡Ô‰ù"!] SuÁ`}•Æ^o¨ºÂ:¿àP_„R:S¾;q+­¶&átÇ"WìTŠ†ØUÝèdHx‡°pۃy©@ÉE›à -U Dz’!ó† N©*˜¬Pz"©ÉœC•SÍÏ']ч)›@a˜e%ig×ÀШß;×ï•h£e°®VŠóŒ¼"«±ÇŒ•Ò6¦•-½R¾Äï…" ]]lj€!Ñ©à[ÔP¼U®öF¸ó`Ú"ˆ&ê”膏 jŸ¤9ÕßTæ’Ç+š7‡IÃQ }ê’:µ*ÙM祩,òXŠfí§A‚ÕbÅÁö¦”°úÜh Hª§4ú"Ÿl±ž.ûSnƒå ܺD«ÝË YŽŸB³‹È1š=ðò-<>"{Y)¶9dÀ3k{PβÔWe?‡ÞNX‰ 7®»®¢`ºkíÅ^ôóýã½²m/;¯ ¬_úß°òy”½Ü5¡~CÏ i²œ'…ç9Å£¢’ºeóNiU™S¬UÕÈY%àVÜ»0´¶V+Å^­Ÿ×ô.xeÛ¾vã Ó³$œË¢N‹ùrMÆ;)w­še0¡°æB‡œ Ä/´ç"Ò †®.§ÔFíU'CT¢ë V@¤˜Ú¦ýlœ£~Z}ªuªVtÒÍ6°ùŠˆW8Õs¨âŽ!9+.Q„75/Q2‡Uv"k¨ãG°›ÀX_Ʉ®MóÜ*ë(Öª½êä ¢`Ùu•Á-RߪQž×¶Ïó½ VÙi_»qpIOŠÖý§ºöœ ›dxpÈažae”éon”çUzIižû ç(]eN©­º0ad3Œ´Ê„«2†Ë5‚9-êÇÕÇZ·jM'ýΌŽêÆaäÈ_ƒÝqžÍÌ;[Ñî8¦æGV…»ÃêŠ;*àª]RŽx6=eZ¼ ò>‰Ð@4Ï1ïP!K9æc¦ž× -zdz!¹É@ï4·Ä96Ô;e"FýUØ;˜nX¶°wô€,ǽÃ7qљãÊàáøº5ôÚPP%Hæ<Õ¯u<ºSžûøãdè4h{WW¥ÔF]¡2r¹¨¬Õ%mM™R`m´R\~L1ôÏy·jUÛ~^Vý? žî¹Éñ®¬¨“ -9Ç“µ´4dºSÌ"böîA¹·ªœ`MڛN–ƒ®«+›9º5š{³µœ?çŸïumûÙq;#„YË¢æV‰“Eî’Wj ˆºãh>Ͼ:Ŷ‰0œ8ÝƒÖòÒÕU µMgY¤Â¤0[« k+.}“•bâ`ý6пß+;éèwhûp¨56æ«È -s4VÖÐìžÈø,6ÊReZƒè~wðèÈHKž¦à4> =W‘ÿØÍ _)˸RŒLn ™Úc(wª^cA`²M@÷(¸úU©àL¥ÐF™a¾ðW,rÐ0•Ò¢Z"ÐÀ£œb’“E ´+øʘh”jÑp¡ËÈã1Ò5H`¢*Ì-H`£¹}o €kD s5HÍ{NEJI§ÆÔ àˆñ j/F“&€ê›ãa€NФcQ˜‡qK ÀYƒ|GU²²8h÷séâpšñ#NWï©%ºè1›#ÂN^nÈ¢ÒáRnGã³çK*P ¾^ˆîoY@W“S¬I{ÓÉcÕ§k]…M}x‚SìÕúmíAÿ~¯lÛÑNi¨èyàØâèQ¤ÜïdÀn §£¤>B¦‘a!#¸À+ƒÄ+@kÕ(öªû»- «Ì)ëVìŸç•y¶}íÆ¡"鱔rtz# sÖÅAù"_ DœWð¾Sœgä߬q­²F±VŸ×%häÑl5­²Áº×Z5Šñÿ<лP+;éë{„æÏ6°†ÄÕ¸GÄyà€CâÎ_£á:²aØ*Ì¿¢Ü<`†ó˜ö˜Et9¥G¦udƒ°µº å֚ìÁpþaþ”ºW´íã%µ¹;açæQíKN†µ"«€–Š~ÒR-=edcF1뎁)÷ - aîërŠ5Ú J–M6ў╙ˆÐµÚ íëês­µ®“žvä“4÷mê-jŠ!ê -È`/7äQƒ“`óÙ(éÄ Aõ‘B£¸±Ç43gçúʜb­>¯–B#î*KRߪQìUÿ<лà•mûڏê'è¬pWY՗”—*Í62ÌiL+ü=Žsàî©B¤Á‡•bš\M£â2B1Í]eb­Ó¯ä…"Ô¼k• %/ôz×V+ÅZ­Ÿ×¬]h•mûÚq«XL6Á…ÍórCÆ(ÊnIɒ»Œ¶ô¾®¥Q¬3€ø”©ò±¯Ì)Öª~N.3A‹µ2ØìJצþl¯ÕO«u}²j¶½ü\{s›Ì -i4pQS/7d ¾h¦À¬21/š $@ê^:JÛ`ó¸zp@œgî+sŠµê6&'SÅmuÁ4»ôm*Áف}[}¬ë•V´íf? Ÿ¢l™ª„ YPèË Àº 1å^R™ã<Ù¹)ÄWŠ)€vìûs¥Â€½®F±FÝ[mä ßkuÁÌ;¥¾M£<¯Ê³}œ?èðº¶=ýÎ),1¢‰ -¼œÕõeĨç\P¢çÌ;(#Eõ/rbûÙú%rbyÝBÄJÉ]-•`m¹æ¯TÙޑ®ûZOÖðôÖZîããý›Œêmõl{Öû~'Õ­„¹ËÓ©2dìÎZj\ VoP0µãJ0¶»¨bìKQT‘Њœ`íÙ{•Še^åaCAh÷öŒàÎbý,¬~x­hÛ¿ïjCòDLo™q•äË ²álF|TPy†I¥¡À4_)Îáæ@+¯?ˆAXúº*ÁÚtþ¦Ô¬÷®¦bQü­ÉÒå:é¾Íôï÷ʶýL¢Çv@§¤Fp -ì°Ê¾\“aсê^ÿP@Ÿh™œ`²*<|1u êÊëjª”Ú¤½éä‰ÝÙµºh- -¥k³RìÕúmíAï–W¶íèw%!ƒ§Î–Ôgt¤K£N†Ì€w0ìQã•õÒHR ¦܊–ûç°íÆ¥¯Ë)Ö¦k“F†³PV؎¥kÔö¦œ?W¿ß«Útó»Y 4ô ԛD|ÈŁØN†Y+©¦&EäzBeœ±aa£Xߘ]9öflj•9ÅZõW<)³h• E´óصZ)>úyíAï‚W¶íëg;„Y -êð øýË5µÔÔ³-$Õ Œkń‘X³-úƒ"œ!TW™S¬Q·÷(Y†ŽùñZeÓ !S­ÕJy^¿W?¯=h=hum:ÚFðsFȽ'ðí3ú7KMí¶‚vâF UEvK·‡<–ìgõ -×]«RªȁH ԝ194»ö˜nÙÂ4rƒt#k'pƎ螑ƒï͘.;6<7Œµt*W87¼#Dß­ÐÜ0€¿Ñ.—–;™O…³‡rK{ÑP‘ܳé(䞁{€¤Çqg ÕÂÒ`Üy‘MBCqSÒÓ[¸aJ6Ԙ¸GZŽ ÄM ,–k7€@Ó`yÙèk„0GÙ¼b¸OfþÄæY`'®Gp7ªՑp3——xúp‚ßÎpOÀøT©Y>±XºSVÔ=”ºQ rÝ*2Tvk¯Go·Ïªù‡[E'ý{èÓ*¢Œ.6¬ ÛN®ÐíYtäçŠÜ†Ïƒ?÷Àmx¸Á*n[¼œ›©Á¶™ˆ¬±GÀgCE¦¢¶Ó¢9û¹‚l˖_U©É;6¹¶XíГ†Ð6Èì¡A²–àª"²'¨;[<6´÷†ÅžìK*Àù°LªlMĤØþJD:þ)ÄŽVË -‚m’¯c¯‰Àø®¡×X©9. y8/xÇhâð:c†»ÆђTa×LQœÒu-Ì'Ìdl k®ùXÅ\—l„äzdþ¨UrÝg…\Ÿ.×îÞ1]+Äu£JšÉ¤:pu®f²Ú+˜RŸ?†x‚anõ4B}nTƒH·Š EÝÚëÑÖþUFlŸmõœô®õ†¾”ÒhݨmVuO#¨!o1Ö"ä2²¦A¬å|žûjœ°XWj…D׊5mÍ­ÁÕöM•Ø>Úª9é[ëv` õÇDR‡Áv -ÂܨuöŠ íÍõiÿ¨úPíI­dÓ³K>xø'æ_A*¹Â è;R.«HI9ÇK.qƒ¨„‹}œs£dëfnx«É +l£S+Ò+ª0Ioo§lßUÉíÛkU§üntšOÊúqñCÒ°ûѯ»çxÿòé¯îÞ<¿{õîé»û“Õw?úé«wgÇ_Ï~ûâN;ð³×Ï»—Ò¥—~õæî÷w|úë×|[ûà"­äÒwñNž¿¿»ÿú÷ï.M}öõ7OeLoß¼~õþ‡v÷»wÃ#]½¿{û!=¼~áÕ ºùáŽþóýWï~qfožèÝN7¯¾²—Ÿœ½ìé¿ÞÿáW=ñoªyŒ–EœoXT…( ²ª§2Ӓõ¯ÕMO7ÿПj“µ†ßZµ«69Ù?ðg}ç©ë*þ¢w>Ñ@.çÉÀ쨩AË)ã4èåÝS½¼;®“ç$ÙFîÈèÙçAEX ²Æ#°‘o&pû ì) ŽÖ‚òQrU¼{bõ¥š†`ƒÈ5¡bT5¼ZŽ -XMР{g$׀éQŽwQÍèì™ÎïÈ0UÒ»3,v=Ãq„015 …>¡\`ãk©1A%Gí#0bè”PB^”¦Ö;½i (€"mÍàízþRÏCÎe훜êK -Ìi±pfEJæÙ úóÌ<Ð"ÍjßzrœG}1ÄE)‰³’S›06 »Wj*‡z -ø\²ð¸¬ÊfŒs=¤¤ÏãÈKؒ»£HBå‹b8~+CìB,"O˜×Ù½fÍ0‹ÇÆ!HIaêš%N4­3·1•ÅZ](!!Òí1·æ ªq„Õ›†>eµ¡Œ‘ׁ8Ð HLúq‘F«Œì° ³ÅÑÁÌÆ ´ÛÕÕÔg:á $-³3À¬  ÜÀè9¤ =å6]–'XŒ…’ôGnÍb›‡”Ù?˜Â0؃‰•±¨P'Š¨‚ƒqÍ#))øUæ*¸BmaFìWàÚ%u"¾÷DbñÏ°vü͈l3¼Ÿ@SûD1Ý™ÙF>¬=dD=¶pÐ]¾ÀGL⠁ºn—IݯÖ â0§î½01åsN“Ö¯‘ƒ@)rܬ?GwËÃë=Ó3ÆžÌE¾n‰–bý(‰(Ì´Ô)d¦ŒZ c0’ž¦[±0#°‚¹OR‡À;ɸD@`ê X†"îm-yó؅‘qÐ@͊iÊR-ë!NsL:ÌÓ{:F#ÍäÔaü)3ü .p9A¨.€Xç‚Æú@Åh^)ú "Å@z‘Ù‚1ÈÕyD*âó {„€‚…g)šèl?Ï>&ƒå@5Øk¢\,ÝkX›Ñ+~^ç€ç‚F0£˜âj4 ‘9):##´=/Êí{£¶—³®Pš…–‘·xM@®Ðz„ü s<'¨Ø|30‘LægšxŽò‹PýkCŽ¬Œ9#¥5Êx(‹¿@½•ŠDc0†å¡fƔ ˆõÍ@eMãD#n(­\iÒì¥3ÐI£:iq"ÍY2Ð*ŒË™ªWrÀiÿFë‘îl@܁\Û¸}΅™äsYÍ†×pæè)!ËVËÒÂ¥ìԔ¿5BÖuˆ -¸¶'ŽêTbFZðE9©•£`ž‹LOÁ‰¼¨{¯@ȋ]±0#¡ß‚!avR;«³-ž‘~{šcâNQVe•"q2Æ?¸·Ô s,ãV1He?œ¨sP6æâÄRlM€©‘€# µÓÍ‹&&£Ž¼¹a1‡ -­˜Å‡Émõ³õ¶'¤²qJ;'«ËdTl LŒŒ8†·1ª£f,šm|žÛ}I;ƒõ nžqÙøʼnybe¤Œ€cTîéí²L¼(]žþSmâúM ‚·KÆè¡è3—‘J~A€€¯Ñä)¸ÅFå×öž0½‚³¨Øi _Ë@ìB;U0áS Ï« çn} ÷

 9PÔþŒˆLŠfp‚þ¡WuL )6 ó<̆ŽÌ•®ÚMF؉L9ꛌ§!EŠ­°‰A&Ñc‡ÑÂ@SŽ7‡}‡Ì‚°åÌÕ(^Ô3d3=×ÚÜâ¡ ñ…T,I˜eE!ÅýÕ²ÇiDì_·F x[9?¾“Z@ƒš>&*ÄíΝ&€YW W™nTãnLp?ÁúÁ«±BåÑÑòxádVVî‰ø<³paƅ©5ӊ¯MQ¶(j®Í ³,yÄðⵑA\¸ji¯Q2£ð4ámªæ,ú‘9êÉ7ŒE«˜€d)sõè1ë ¢³&6Ê0bá€o\¥R‘G˜& -œS“^½Ä©ãákI›ºpYM%”-ŸÌ­˜‰‚€©ÈªœùkzÚ íULÇh5&Þс-f0MÔ¤Ä2Ù¡9wN£fð%×Çs43ë÷"þ‘¾!).•òª½ -Lÿb²IÖìN¡Àô͘:0¿É®þ™RK lC12;i:Љט ‘>ƹwAÃKgcEx£Þ‹‚ã 2ªØTnP( UŸ -3Ϊ!Úçb¢¦©%GexèIZ·¯«Ù¶rîpú\i s°²õUá>I 4)‹ßhOõ ÊI̗M‰–!h‚"«™`Ä n“e}Gš! ÿ±Þ-Š›ÂÙ8«×åyµ¹)›*‚:¥h!ÄÕÅ Œ–‚‡–P3–AÉ´ªñÁ)©Ï9«…«f…»¹T.:ÑP­ÅÈG†B/ćᾃYÃya_°³ eËmË+3™c ¦?ºî! 2b·ÌÙm›qp̨Ѩƒ£Ëa,äYëU©MLœÐ¥Þ4™}±˜×Åd-÷9…­C®_üHƒ[¦¦Oµ,axcV牦ïDìöbÉÌgˆ -ÚUŒØÑÔ²À å1X Ì0ÕѦ+c@ÓZ3àž°:‚ù.ÌWl?—È›ãßØe3Y5j¡¹ÔK[€£*|mn«>Øc—d)DFÍ»ÃÁžNˤÕÞ!yø˜Ö0¨Ù ëšJóÂ+;çÒ$D¨œ³=ø_` u5ØwÆ9¾˜ÞF¬²HŸkú Raê€7 Ú$+²›vÃ5F˜†wÆn_1LÉí WËbNA†ˆdÙª 0&Õdƒ}‹ÄÿŒJ4 /I#ŸÇ¸(ü™»Ï¶?®o™mK¼áÀY†ïŒÉpw%c¿ýÊ4d%†ä„Ê0Hm§V58Í¢&IX–À':û÷ÄÛ;‘6Ð%ÀF§…W½ÑÀ#œH4•ÞæŽéøvFÝpª|VԐìÈÂ=¡÷“@FÆU4 ¼¤ ÂvYÎù±øýº·J´+ȑRšorhA²bF)?’a;‚ @c5Ö!Ä+\v´0èJD‘rUo÷¤h¬¯Á$ƒRG&ˆ²£);`;Uo.‚§Q$ރ['ëá6ˆ*̱9X5ª/ÊÞï'®ù)3ü/T ˜{pãÛô“ŠŽ23—TCÎS1y‰êÌMŸÜä* _ &ød{kÈô”ÑSEz¿¨U½½…i†—çHªÆÏaУ”9-z¯5ž½ › ‡AãAџôêÙý…I߄;˜¬ºð NÊúôBjfŠ@L¡?ÐL\³ês´®i‹³àá¦Yø`J‹ú|iãTJPwï}¡Í¼Bݪ´³2µÂ ª”±Uf¥¥µ -3?jv{¬BÁø“feHöI«¥‰I×<ºJ¥G/8³)ÊÅÒEÑ  8dž{÷]AÓ©b-³Fõ ëmA““ÎK= -AN´¹LFCÓ)¤N>h‚ )Ù×1 £>GÇ)¼œ’?|g§º@§'€§Çª/×d!L/‰#`Kk€À´§ÉÄ;Üö3{ž5nÖX3➄ÝÁ¤§œÔ]Â[í=žY „9´÷H) ŽvÒ,8ÄP½ª©ƒyÊæNÓan¨°ú¤ ÞI.)܂ÌToðÂ÷x}w•YÌÌK»(}˜´«+rS V‚Š H\c.\} I60 ó@ÅÞ6šÿÂpÛ(¨8ÒàÉE¢¬šéx+ö¤V -ü\׈<4ƒ¦Â<©QΞ¢gÙÿQkƒ/ 瞜ŸÄjæðA½[Iíº@à ³M -*ÂÔg˜©ˆ¦ã…!ö3´B‹J „XÓ¢xPž€€ûÙF0¨îў‚T$½E½[NÀƒii¯Ähw¸#Ê¢peÂEŸ<·i\šŸD 7hÉ÷3¼4pÜi¢ï¢CŒ»¦†þ5$ȅ©w²§È«qRœŒÌ‹¾Ö² n»€…gѵÆԐСaD%Ä'UT¢9FԒÌD€X­)$à3¡½N2âdš'ûå= àG F6é4²:[?AÈ-_ã¢þßÉܘyQÇϪQ?“ÙêñÚà3âé қ.˜q&ñ‚ršz‹mVXØۇº#VÂMµ¹AmOaRd”81*ŽÂ q$‘ž|¾ßSAdö¤ „¥{Ç:Ìëš>gPDS³é0¡ÚÎi8CôX`…SC\ä…wS©¿‰CˇžëÞ?À{p–Ñ+EK“©Y€¨¸à{ðµQ„ø’ºŒ™4¦ÃÅfõvSD½ŠjZÔá„ÕÞí GÖLª} @•Œ\˜±¯(Qµ´ö̋8rEv‡Ž¦Á¹ÁP1:ƒÊ¯éJw¢ÂòfÃa•¥¢®”`Œ ZšÔú"£ À!)Y*šüŠ*U ‹éЎT¿àÏr8 w¶:†w'°»Å—À 5x>E[RÔÑþ™§A ¶àÖlvl`ŸTwy =ÍÔN€k'w7Â(q1`#õ'ŠàÀ«ëA¡‡•±P;[uoOIgJbFʓ©"CË™Žå¬D×jèS«~$¸‚6L8zÇ™;Ï©&.Z´. -5ctf=Hà=0—.Á­¦H*Õ64*¼‚Ô2¯ã$Æt¦þxïJ¦V}ÛL/§OqêxE„xŒÒ◘0ë SèáÈ Ó O¦l3…sOL.®Â®†¬cy„‚Ñ•Ghí×IýçCðöÿ'£+%ÌêçéŽKäDì9¸Dt>»Ì0¶ XÏU\20#®+Ì="°pÑ\5+€œ×›Ü°\'ŠQôB¾t*8 2kŽtLòÀÇÔ Û®ú­×yo2pœ€BrZ!x&Ý*šÏb¡³’‡èÁ¥­ ¢Ê™…Ì´U„®Qº¼näAÔ챸Æ(&ŠM3sŠÃõŠïŽn¢Œj;+ eT 0ÒFÃhÃÚc`$#ÙÀ )BB錌Êj'„ldžÂ´£Í’9ü[8xU3µî™¨ -¹"L¶$'.Z$XD @kv^ÙSq¬ðgˆj¼/[‹üÂîUò×(uMfñê 0Œ‘0|‚Ž³çՐӒ7~Òè”}ʄ!PFK$[rtììm÷›ž (B&|‰<õqouîŒbt0qZúuƒ@@UØÍ䌚JíˆaÕ»h鈜Œ)ðZu[·×Š3t'㇠ٳ¼qjQ·¯\Gƈ² з -¯ -Ã}Œìä_Wí(Cʉ‹C´OÈ0KRÅa§DÆÀzÅo^Ôo£Ç¢¹9ʋúπeŒfS2‘)üSè,y ‚ÿa‰ax“†ûüè$,Qe@JŸ*!ÑÒ§¦f;ˆÌr§ÀVxZi,L.¡Î€f⸣lp5pCð¿Í.zá=ˆ Õ×Ó!S¢F QFÙ,‡ØšCêƒV×ÌÃ?›Yۜ'^6¹쿸•' àÄÕqèGÆt@ ½ž÷ˆåL)NcÚÀË ¨4auŠF¦l"/ÝoÚ7ޗŽÝœTà?ŽGÜî³þӏ”ÝèWþ‚ -‘P;úᶃc™ÀΨïaããH|þ - KÞÎôs0§º‰üt16eÅa¥ à6¢Ý ä0m9öèˆ îwë^Q¼ÔêˆlÄb„ @ì®lÒ<9óhk%(*g -’šG•uí½ –k¤«çiÄ&¦eõÙkn¸ÍY9€(›ÜGª%I2%g5Ñ$cc‡ªL°½TZ:çAÏL0•sÀ›“ëÄ f"¡©þãgÂy€q¦0Qžõ”ÞïÏïœUýÇÏTð BVdöÐîLÙìvÃ\T¨£oÐKÂh_H‹:LÔ4GÆlL½Ì00Ç1–„#¯CT„‰ñ°¤,̅<Üà…öÁƒ°x@ ·1€‡"·CT„ÔPO1ëýØîÏcšpÊ90 Rý«9fÅôç`¢™,‹ê]æ›5ôëPßS‘S`$Ô¼Æz1ðÂ[bFE -Ò&×ØFBa ØÌ1äjÆ ¾ysЃd‚}HaÌO®± £†¨€BŽåúžFpåø~J5ðˆd?5ã"1O¡²(®L¢}à‘K6™´S pÇug½ô|!Õ2љ­„Ñæ–X¼cjïÑϬŠQß#º`,IÈü™§±õ.h‚„’ÔþŔӰ¢äjÛóßÅaÖ0&ƒEeÆ˘ÁDm‚¼ÎT€/7ÇPàÄǃª‹Ü¢€ë¥ì>¨øÙG¥»>ž=«—q¶,v—)Ýf<ë®ψLœ&ůix|6ÇìÀ\nVo–“qǬXÇԋZÂUd Êtæ¡7©Ó¤…s0~ !ixŒsIÿ‡ò4 -õ®­1²gïÆ (;RB€®Çz€îí$·×À!ƪ½Ç&„ 0#¯¸‚ÉJ*†Õ‚˜õ®("€ô¢¬‘s@«›KÍ4O Ë܉ /HêK†Ô2µ;igâô#ûÑDM5î™ìÜÅõQ†Öy׀ÿ‡2\êބLÍP“€Öë -³‚NíÒ4¤0¢Öp À[6å{Ex2œÌ³·W „D]4z0ÍH!|ZA|H׌Š‡¨†'zü„•BÚ¦J‚ÏÄ:…6 /‚é¼D]°Ú\ Ö\Tø3…_•×'䈆3‡ˆ%>†Q¨©-Q3KPnfŸHÀÚ3c+F¸;uëÏÈ~ù‘r½½eD³¢/4™àn½¯g4û؅Ò̕&”ÑÇBRðD6dp#,Š±±÷ŒZ’ú&ú$¤z¢° tYÂõ±ø%ÆÄõ#×h@1äR……â"ÃÙ lè9쑾?àá\„ëo™G“ýwY%½)Ã5_tŸYD§ätLº#asÖ8¶:LçðíÖÍ5Žð Õ‰ûo¡ÝüP§ZCøF£ŸC˜ô-Ý9d‹zÛ}8À}CQÏ<»„ùñ”* 3~Jö ^óó‰ŠTæЉŠŸá…£žÌœñTZOlÛc G3bJ±úà$®LŨSŠ¦iªæZ‘ŒCTØÄ8ʨ¸Ì~6^ïˆ[x`‡,a¼ ¨ kts¦>q„é`xCQ$7¯!i",S3G‹‚IÁÄÐK>ÒZŒxAå­?ÄˬþîIÁˆEW )ìg(j_#¥û©÷Yç½&›H{Ê98nôNÄ4êiïÐ#ÂNè!1 ÷Æ·r1^Ó ÷í5€:oÂââÕSCBÌúœ²R¼I,Ò»@|’9S°ŠCºçe‘£¾©¦$@úÀIéÌqY®#e‰E“ÖΓ:ÜGU¦ -°Ð?gÉÄy+‡^39«Šä·B£kغšqMáýö®dfNs`Édœ=b)]`§‘g ÝÅÕůKñD>ÿüªã>e^RÏzGÐ-äa†ùõ® -Êx]~QÅ6ÕkAÌ¥o„¶j€ŽÝ©ª€_{Óöï •ZÉEYJ(¸SPSD„öcí=ÓªjõJ Ÿ¨ÉŒlŽQ ªõI㢦1FO.”·Ô$§½nž÷Ó¨ÿ~ØQ ¬­L×fà´`Î%mŒ¡ƒ >iðܗ´îv ²¤«:P§ò’Ta£j–֏@·¬i;­h¸½°ôÍÁ.žx~h2è6í+‹â-F»¶V_Øÿ¶äµ DlOàJP$¨½UÔ¼X˜ #Øɉ!ƒƒhœhóð×Ìb‰Ì‰aš“áHÑh6Ú¥­Ì;т÷¢a>š ªàýLŸÁà‚¦O¸%0‚ =Óµ01Y䬈Õh6.äf-îÆ8ؔ¾®,ÁXt]O¢d»ªx†öº]O:g3Ü1VÓÂòjÀ>À6Ž"×+ðÀتe QŠÄ¸&…‘yµ¤Úeý=]ÿ©ù²©Œ•?Ñ4f;ëšo–5Îj®é<&5¬ÅÔÉS Æ`ÔQ`^‚]éo‡¦N_¦g ¨ÄXèÃÉ£bl°ž¹Ý69ꁋȞ-\¢,Î c3.óӆ7àœž´wA‚ù)=‚Ä0 Ø䙓l`Ôd8ÜyÉÂþyÄL¹j»|VŒÒӌg¬¤¢ n^# 9Y¬¿Fä9¨~43wCRÄq™,½†½•5\%šÑH~Ô >Ñ2XKžbS7iÀeÔ¨>…c‹Æ[ÞsgÆޔ{3?|:pá£È邁@`hðí€àf5P£>¥qÑÁdð”[sdfÈQ8ÍI4Ô>ÖËÒ'C~C|oƒ²°`¹)ô5Èl™§€¢Ñ‚›# •Ìþäïñ°­„$Z–k4l ‰?wÍÙíᡚiöEDálVG ¶¹ž‹‚KM jæ˜!,õð5¶wfdNn‘¡ƒ9ü¹ ¢ÇAÀUo7¸¾Giü=š™-,„_‘>êÏ‹4gÔõ­D¥Ñd¥ÉÒ1M^V=p.¾1ç ‘ŠÆk’}3š(¾w <¿?~sQÀ‰9 @ É®ÄPBÖÃ>ÌS ‰­±Øõð£e ê4™9Ä{§wÕ,ú¹c½â}ªè«Gå˜Xú&¿ÍºÌÀÌ4%´BåÄÄVˆ«tž¨)Ðæ`1çb1¯#nWD}Ó-ëÒÒKT°ŸýÊAí»Å2{- -ë!a݆þq ˆË¢ Bd:d›º­Èþh`Ò -§!ÙréÉRââu¬³zQybåT³ƒ ŸMšËÁŽ€A{ó #™`^„t=Gõw2ñ8¦ØÊ]"0î P-=íȨ=Uz©SP;µDø½ËK§¯õv:|àÈú:gÍ7ÇNó¦KpÓ¹†QÁ -k.>Ìñ7¸ËY[² ‹FÓ¶{ƒF5ý¹¿byõà),jXþàê?hööЄ…ÅШÅB1év«‘Nƒz^T—lº&¯—ÄHgó03Ñ2~“WÙhr¡äãOá}8©%Ě®„W¯•ió±â‹ñhðN°’T⪓óŠî;l&‡ð"Ƌ;aè fN-5ë2Ì®X€¥Æ»!Wď2õâbv‚b™;H€„Uìjx ó•µì)ƒ\é ői8<ÚËc#Ø{Y‘2 ÇÇ 7H¼|V\#MÐ䞺.‘ð‰Y¸jNžÅ@ˆÌQ΋û&͊‘—ˆC*6#æŠÜjQÕ.ÛÂÂÏÔyہïÖÅÂ@5¤%ûˆŸ™r±8ÔÓÒT™À'¯fC27j>°·ñ\\lûÒã¨B¬LÅÀ/hrta!ó̀yFžbž5kqTîWìÜç{ÑLõ蔋…”û{jP±™I‡ÏAEŒËœ4³¦ÐsCc`‘(Mƒ+£Ê8™u‚ã«FC?X-EȪ-U9À -düô܁½õÓxUÌlN1Ärò&KµEÊb’¥9ál½òžzü@ý‡q¹5TQ«Éꬶ¹¯î[`'g]Y -€¥qjl¢¬‹£ÙS4НûqHŠªâN©Ù*+ÅE6%Ä„Ï&ØME‘ð¥bè*¡JKp¶¨¡‡Y=¨‰çz¬2Ìf6< 3–4´x1Ä=ҍ(λh£z).e‹—ä3 „ ·q¶é v­i' +¯?}ÄD¥Mz‰A¶˜›ªfǀý4—}D H£‹¦œ·l™Q]ºLJDž@«_<ž²ÎŸ£”‘õD“vZ¢>B–lGjÊè`у±F Ô9 ˆ{åi]lM Ã*R`T Ø´?Uüô1^ÁŒªô7ä†az$Í R4”J ƒéuÌÕ, -1jö&LÃ؍?¢vqðAQdvºÐ™ï²8o™PGˆ2ùdF™Å€F[±éðÙ³¿½˜gûcjû«É~šøø#3ŸÜ8k Ý*2v/ðç5ÿñ4k]M £23*öُâΚüWß²fË} ™¨•>õ1ôòŠg>†j‹`šø:ôžUÞc@™òÐÒãg|mÍzŒŸصÊz̗T$ Ù 5çšâ8+ÚyÙd<´àåšð¶\@ 4ßqÀ Û·Kw ì÷ƒg;F´è R¢á¶ÖɎ{*ÓøâÖV`¢=Õq –bw•é8ÖDÌ5ÓñÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc`òÓ% Ðqw.~'3Ó'à,AX -â$:>=Ón cÈA…2ç˜iø^&ça +æ‘Tþ&å˜Íœî>!ÇTÔûq 1Q&8> -MÀ1ÿoxcŸgҍq˜zŸn|Z𶳍Ñ=‰£!ÛlL#mŒ…˜+Ù84­ 6æ'×x¨dn§c­ÐÎÉ4¾àV;‘Ƙ¦ò4æl~>“gÌrµRæÚúòg±¯à‡ˆgŒâ¸ë9'ΔŒì4cxÄJÁfŒÆ@­ôÉ2¾ºbOÊîõ!F¶œýó噴'AÆÈü#S¿qŒQQz©ÿ£I¯¿ÔïÅ—kgc~ aŒã¢öÀc8[¨³ØÆ÷PF4øÅø¨Qsøbœ;¾^ !®6àÅ,ƧðbΈàäoðb͓jddÒõIx±$o¦'¼Š·b¤ñ¥v½œÉ.æßT^Þ lHÊìbÜ~v‚]ŒöSÈx¯èb\v"–RP}د‚\ÌIU6¹XÖ»'`†’‘À²Ccކ.æ{3ÁÅtq 3]veԝ[Œ•Jµ[ ÐUK–Т(Z™ Zü ü;‰Å\;½|É?·e^+¯F|[+~< ­灃¬°b¨0«ŸÁ¡ã2)iõ¸ ©øiúTTÌw_²8ŘLá"o˜bPb± Jñùˆè”âÓø“ R|Z­bÀðÃÁ(ÛZ» Q|:ª„b”<㗂PŒ¿ÑD'²™`‚OLõ|»O ¯~þJ'&¦«Ü 'ÊOšv¤5641KŒG 21¤S¨¿zwÁÇÆ%F¾"à!w©Vº bǽS‰‘0è"s„aè13‰‰¿/ñ®g4'€…A$ffúJ‰{‡xã7›#Fتӈáqøø6ùfV©öØٓR ˆß]¹õ´œ“ø]Ç"FåäGƒ°q²)%ý’µ¬bò4Xߨ€<“„Øñöc§ªŸÕħµ­A Æ/‘øo²ðYÍ[ùÃ,y&¥˜Eͳ‰>Œä9–+|Åøíz’=ŒªvÝ-eªݹƒ‡ÁPÅûeÎðÉ®ÁË_ømÐa@¦1Ks»Ò’‘üÍRՕ8Œä?ÈæW‹ªóÏ7ŒbAÌWA~­¼Hý -Ø0úv6NÖ0rîp5 ñp'³¦áƒX€ 4 ¯Îfp†1Æ0qbÌ0þc£ Ÿ<c ;8î>»€<aF~d§ð7[ÁƨÒw¸0<4òY͆–ßG …¦—d# #ÿÉAX`aH+!å ®pw_Š +LÅѓ* ̓1¢žûR–) ˆ%„læÂgk¢0 ü¸W 0Ts­× -“øyžÉÆߜíVœp}„÷ špUˆ1XÂا;I=/ñn$Œ$6\»à7 \7Œ0rwUlv¾ÄCL¤—wŽ>¦+CxeÛA=7œb„¾ íy#¿Þ^ÂFš‰ =@ïoôàC¾„»‚4ÙÁ‡²©;:ØD»$ãõÉ >8ümÔ`zHc$4êͦ^–ªÉë\,lÈ`€1o$1 ‘>&0ø§iç[û¸`õdWë·‰9U<Ô@s£V')nýî -¾4F%'xˆ ™˜àø{£‡1 ÁbÆÿ‚¿J_iAW;6±‰×οW>pŒ -'7éÀ~å68ðÃÙfÐÔ_œÒAä_PyPà>vêo© ê/UZÕ­±•Á¢në©oÔ_îÊ¢Š aò7øúõ–r‡~(©¿¤åò€†þ",ª8sP_çô—‰:}W¦þ2|$µ©¿ÏëÿÙg£þSÑÎdþ‚?YË5‘¿èNÆ݈¿°2UÀ_n6ÎÉûŁÞa¿t$ë—A/‘÷‹ ᔳã~ŸÇßDÐ~Ÿ"ˆbÂ~‘“PYÉÊúE,ò°*Œ)÷›º›IúÅßµžo ßkÎIù½í2%ä—Y“ëycü¢~ýe"~›S¸±F )«¾!~yÕõ(“ñËÇÇ2›È5E>7ÄL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK -*"Ê+Ü·P pŒ„û*0ïԆZ^Z'ît_jÃmÕTŠ€{$ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿéWÒ}•  ˜ow -ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥ÜÒM¸/»STä)UŒÂ|v¦ûò¾°`pÅûÒ -Ãx_fíì¼/ L]lx_Xƒ -ž@¦nÿ²$À8‹ïy#üŠ+QÎ$übà}MüW~õÜc'üҊ×8¿8úӄü%áN\ᗠü[ˆtãæƒð+Ãè;á¿GÞn~ù•-¿˜<Žkl|_fúÎk$ߗiÒRދêVv"~1Ü9ÏI#C¸ü >GÛù¾0ñÞچÑ}!:†“¹Â}ٕPad†òþÂhämð'F‹ì;®L(éxÎkf/: 3³±p} ɽŸ°AèȾxÞ3þ^±¾i3Ö÷öô¼^0l±¼Ý¨¾×©(undÒt0}ãïé›6}_çAÍb¢ï}¨ÿèÂó½=dÏ÷>4ôÎã¦n4_ìÄå¹i¾·µ.ó½½ÉË÷rƒ£@ù^Éd6/©®½%Ǘ xÈâÝH;l_ñÞÄ㥠†/‚â„ü®ßëprÔßË­i‚àË°x-;À™=œ{ð{ñ ¢„<ø½W4~Xñ½Àr 6Æ:©„÷Ž*aüÊî¥M”cf³±i&÷‚¦tª·]J1ÁkãLn/ò«Èˆ Û æ°Kµ—šGÔóڋŒ±ÚŠÙ{yi¹!{Ùû–¸"ö¯“؋óõ~ãõòdÀ43®wxÕ´^"Ø ‚Za½¬vÃËiV/kâ T2ªwd!õf÷Rƒz££ø‘_·9½ { ÀLï wãw¡°ÇÈ»Az!FãB'6z¸ð -B/‰bH¶­€^QŸàóâÏÁÚdñyo++6]ïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8ížáá°fߢ‡f’Wñ;«Ú~‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Õ½1€"/)¼6"/Uö]ÀWá;HE.Wy…©ÏNä¥ò‘Ú…2•ß 4‘’ §È‹¬Nɋ2+²®UÿË~S;Žʪ¡ï‘®7|ZŒãe”ª«trÂxQwMoŠiƒÆK;Z­5@4’¥'‰"s¾âZ͍—!Á“ðI×Oa‰`›q¼ f•²óxíaõ¤q¼@d=DI4ÂÚ¥ñ'Œ%T}¢x/$e®’(^ÀöﶃxakDÏH×Ïj³~'‡÷òw±ax¡²CþÁ^ü‰¾á…J õÆà½Ü¶'¼¨õL/"9ˆlÞËÁÖà︘GIþîploÃïòDL‰ñ»ÃAÃ ï’ -uíì]6‰êEèÝÁ¨Npw‡3vw˜E¿hP‚ÐOPwqêM Â't—ý«‘´3s—5êåNän·Ôk#îRð\ ÜE I„ž‚· èYßx»XâÜ.ÖhH´]ü '~ƒíBƒð~°v¡ÎBn(P»@Ãö³‹QD·³{¢¾4»Ðâ`Ž!vaDì.»Ðð n \h|Ìɛ…÷gW>$ðº§zŽ.û¼NüÞÙº(¥§Lݐá`uQUCÉö -Ö´?\ÝÓ́«‹Š ,‰7ª.ŒøŠ‚ª{zÒ ¨.ΤΗ)dÞÕ3R Î˄]ø,`*4µÏ™\/×Öêb…„÷6xº¨ª‚kÃé>Ň wf -˜.$Ëäë­0]1ìK—5EOO”.4Øö­$]ŠµÏ3AºCèÁÑÅßñCÉÑebà°`ëRÐ_S¸1º¨uìj£è¢~±·IÑ} S ˆîã8òÆÐEVB¯IIJ‹˜ó¡Å=«Ö¡Kë­&ö‚–mZždè2”÷vƒè²U:bÑżϰ_@ti@œo…è΃(èØørŠƒ¢Ë¢;6Š.\x9”1ƒçEPt3_¼Qt顱·Ò5Ë9#F÷ƒg7ƒbߣû8×µStò= fðˆˆoopMôXi´tQKp¸šêâžhñe~.öc2gÃç²r³Éÿ&=÷ n@q›cŒ}ƒçª2¢×eCôíÂ+ŸôܙhZñ¹ôá©+|.WL,4=—ÃáÒºÉÀeÜp\.p@ðnªÈ!ÅÀw优ð\ÝõSÒsiaߍžË=Xdz./Ӎé¹ù÷FÏe8ø çªžùz’žË¤K+Vz.#ðlx…ïh5è¹t—ñ„6z.-hƒž‹$ë°B`|XX¹ÑsyV­%<—Å6i<—u e7x.­üÚ Ï¥£á¹éP8±ÁséâÜž CÅWð\(°ßè¹\ž6"8˜A…õdàs9lÜÊQM|.—«¸wÏÅ[Κ…Àç*óYŸŸKPzq>WiøR’Ÿ‹$‡›ŸKZJ—`Gc%°‡ˆÛ?Wɍf“ŸKѪ½‚ŸKC/Wí±Oá{W|.|ºçÆçÈEãs±oӆυ>ƒÍíŸË< cÎO€~…C6€.ˆf̤çfp60/@y¾,@ÖNÊ(ºà/с‚.RF Am]à°v ‚. tó‚ K®A—L¤®p5gGA’’ŸË½Xö³òsËiß.ø¹( æ¢$ø¹ê¿Ñs™M+ò‡©dä9w9ꟄƐïoô\Xõc¦çBÚ“ô\ŽÙè¹°v<ð çr3ÞÓsyä"<ô¤ç"9ɱ.è¹x¾Ö>7 ?wZ ÐÅáß2n¡Šº¶ ‹¤.=µÜ¬zÝiXºi €n!( n’ºùbn]fgŸIÐeÁ5òèAÐez­ªôk -iÅÒ.ºL®a] ]fÈhÞº|í±¦%C—ÅÜHA™¡ËÅJtƒè/W: ºLªûj,àÂW¸@t‰j<Š%—>µ3ˆ.?.ç¹×N"^„!ºøs ½].–f©2¬ÌE—÷±%Á‹†CêËÇS•Ê5E—9`¦­ƒ¢ å+wŠ.¸dAÑ%áR#YRt)Cì¼Qt©mÀâ80ºpÿ”Ø Œ.^B¶Û1º0îœ]Zðh£K µyF—Gì·±ª|Ñ ÿco`taaLlÅèÒ7eŠÖ]BÄ®ÓÙ,PÉ!lµbtӘ]NW»ÛêI↱ùà†Ñ…Y¯—1º00|]n"ÙɊѥ™*0ºâ°]ëŠn Ò§¢KE ¥Aхr…ãGbt ¨nÍ>1º ³²;0ºt螅Ë€W¾bt¹ò9¦ñ±H!!ºiغÓj¬ڔD']¾‡|ó?Â*€5Zäx,]ç—èÂÙçj-ø¹C£ÍŽÏŠe$=wHMžðÜ[~ÁÎÎ}/‘r…½UäÜ;ÚU®àܛ\äeŸ‹UWA͵–u§æÞN‡˜š‹f*¢½¸ŸTu*`eæBcŽü®™¹¯!Ú0ÚjÁ×F̅>`s <îÄ增³õF˅]i)Árñ·2R‚åâoԙm¬\R‡ÑiϨ\(îñúäÙ¹IùFÊe>µhJP“³˜ÞEo >üÈN.ôC€Vi°mÿ€ä¶Á†ë+!þ’?ÈeO¾£%°A„¹wx 7þ-d:ÕmîX´‰~ã -ú-TeUxØ ¿ÅE¢%Ø·¸ üŽ E°²¨/á\ì"Â'”%“L§÷;¹·Ãȃ {;ܲ!¨·Q[ÐÛa˜ÂƼeW‹Öy›²&Þ6WuoÄ[(«X˜’B qÓكw‹¸/Ý wK@Gy’v{ºµTÀnOK07Ö-ŒˆYê¼xkAºÅ/“oÓ9ï.+Î-|.ø5¹EEXƒÜRm…·à à;2âwï×F¸…‘]S ¸!aûàÛ6'^6¾mko‹¿2Þ"È°ÑmqKà¬ܶ ë$ miÆlh[Ô@±Ne%ͪâÛ¢Æ -ŸâƵeñöWôQ ¨¶HšŽkgÚV;Á´ÅßnÒ# ½mk×â/¶Ý/x¶' 7œ-2,.)3½P„0[êîsgٞhDvô¬zÃÜ /2H¶ˆ©µšY’Y‹ŒkoÌZļŸY‹÷–í!L¬¥Þ§½k›¼œàÕVÏށ«e-ôÙwZ-t ãJV-ÖĪv¨Öä Uûz½'©öd,±¨Vëž^wP­ÄXïT‹@¥;xKér°4Xè$Õ2ÛÊjx9Dý7 éƒküí½oŒ©——ºIª…p¯P€jƒ[œZ$Ó(]1µXÙÃÅ -J-*ÆáΤöt=âƨÅõH/j–ƒµA¨Åߗþy®>N§àƒO‹Œ%Bþ§%§eôN{ºÀ3‚ÓTaD è,°*ΗM4í]25K#ÖÞ¼*ð ËûK ã%À,ç ü]”ëFÄO”UmTZDÐ1;”uA Ÿy#$óèڐ´÷­•A iÉb½¯d͂ԃycÒ"Šw$Œã–Ô5x´ñ÷†£ cÐh/ÏÃA™…KҍE )#+6ÞE‘Ü Ñæß+ˆ6ŒÁ¡%>÷~C{mlZÈh»Ð´‚0‡Ðr0hIœS߲ҢåqîðYÚð…{öv÷¥`ÏÞî&¾¡g$íOg™¯–³"3´åÙ¸³ÁL -ìì}»1PPgo‘;tœa¼ÁœÒYÈ@Îâïªõ$ÎÒXZg,ŠŒ—ÅêU;ðÜ6Üì3»Ê±ô0ß16˺—rî¬YšªRÏQÖ§BÒ ÍÞ^ î Ù[4­ÄÌ>±è Ê,+ÓÜKgj‘If«³8'VNbµ8§á´1‹$'µÊû¥*ÌÎc¬|Ù;’›ÆËÞNöL6>ù . I§Â‚ËÞEw0‘±W7nC˂¯Bê`X‘òy&W–jéëyÃʂ4°_Pe‰q92q×1«vSÈ|³pWлCþ$ʾ ªd݀²Ã1æʎ#*M]°œ†);bÊópiŠe'ÚQ–bnæÅÊm²GG¤»Bl'ÊBi¯ºje)ÏwÜ·k˜h6S™H3•æƒñèwÀ.éNÑï,ÙÓ‡DÉ"džâ ÉR¶Ä¼óJ’Eb«ŸÉraå­PTKX¥sÌ©þ@ÁTó`mr¯b%FËÅäVŠlǒ½ÔyÇaP]¹²ÝòÄ !‹.‰:s'#óÙwwæó7w˜þž ûw#Ȳ[s€uáÅü˜f -ˆ!ÊõIMË£¤aUtÕB0g¹£y;GOx²~â¶\b<¤#rdÆwÛÀöuª) áU%'>,(«¡ð”.©Ck«{ʵPPtvë:Ü\Œ‹ªzyÏÌÔE% dz«%´¿Ý ioa‘ª÷;_è8¡ÖÇxTt– SèÄßtw4½][‡ÛÈî<ÇåÞ帻êfv¡Ë*Áü^Ã[£¥äÙÂ[dWÎHÁÀ¢°~€dXê­'W’ɀϗ uÖñ)®I‘҇ы´\—6d¼Ã+ KfóÊCóÌô)jhA ±²4"-Y>ÿa–äLZîÑ]xkb7Ӑ)"Bõ{¸Wûv’¸ñœ"×⽐¼ëZo0Í,tÀï _ ŠÖ°g¯GÀ5ȸÇ6G„9ØvÚùK/n¨Žø Œ´0„$aïiá;b”ô3Šžbñè“!P *|©MÍÙ~";ì© o3úøxÙ)+¢ 6ьT᩸:Óΐièo2TðgÉ[t<¢|B“½Ÿ*Œc?T‰3œä#…\üÂð ³Î’çÂòzdqîGù_eñObÁL˜Oqg@Fãø¬ñš`ÙÞ3G3;^U«%Z8Bó±OŒ»ªÔZ¹+«*ifö[ª9.§Ûa¹Õ¢Šrã]«PllĶtX>±KðÃlæF-EYTeUd¼oJ ²,ñæàG•F%‰Ï±Ž‚03™E0;þÔ9`’!ê9ÊÍ`i9s£Ö@w™ñb¤y$®Ý8½<š°8ÏäˆMÀ{¡« &z²EŽy;J…÷–OF¨« ©«c~L„"=z-J æ»P…ðŒùåºMf·êôGÅù¸îûr¹šýŒGøœË¡c$†é*6 d)ÕeµDz(êÁÁ,ì#Ÿ@L€¢(ð։ páA٘«ÖþXË*ùé+`“¹ÂèY\)Šô9n&¾_WÚҙ¤ÜôvÍø÷éuŠ]ÖåÓÐÂGI©X´—ÝÖuµb™Ž*’ -»4èú;"ã 3Å(#pXˆâ†Â oýՓ:fB `a¥È ô×`¡ÜÄۋ]£ú• ñ¢~]Â6ꬳ?˜úàØb¿ët—ÜA[É,,ŒÊ¦˜Â7\é_ž £,íp«51c—¸ênf,ªlM’kŸðáµ™xÓ£4}³Ü5§y²5/‘A¶0ƒ¨ –ÉqªªQUt]©F²£YÅD¸z¾§ù«‹åµ/}i%ðƒâìÚ%Uó=£0‡ ¯@6¹Sî6¢Y ºÀS°Æª#vöm†¬±Dw°‹ƒ”{j¹5oy´'Wc°6Â&ö·ž 'e_êmYû«P zKÍÁþ¸¸ª%——S¾sàÒ÷|+¹M ×á×íð6«™™áj¹«.ƒˆøC¿¡êOvºÕV}Â`9çºáŠFB#†®€·^Ñ{ƒݸá¤×çXrˆý×­«÷Œð@è´Ãñ’m\½âaM…wr–àvŸ©Ôóôr¨´0éW5_‘JåaÄ~ôã%ïÉXæɦ’Ôy`v'z¦ì.ºë܎ÄËÂñýP‡»R%†úünz ïÁõy¥›à_X#‡õc¯¾o£rH÷€ÙÜÁì²\Ÿw×Ê´”bn l‹b]IÙ¹!Ú)r²¼â}<²¥íê㦴­œOÔVtûTŽàD„Ð8ù•#ýU1 -^Cd2dú0#hZ"8țܕAtsš°|êъWJDîXw­¼kxŒTÑ.™Åƒ&AÙ"å~,s7œD·—Z´¦¨{!ð -¤ž¾ƒxK`J_bŽÀ‚òGa>M?”V>¡nD^ï.FÍÓ&€h»* ‘<–¨PVwy×á1“Ú©%G¦<Ÿg‘–¦²rï™f—2ÎË(Z30%-¨ÜH[ü⇟77ô -~)“Ó"AŒ÷ ëiB7مü |ý\9çÛ 4 ¼?ÓKJ5mV£2¤Cn -K²wíœ4—òÖ Gxíè=T9á; Ê–>Y=ªêâáwÏR¯n<(& -`áÚOtŽ‚ °ÑQ§rÿV‘„ÛÉ=f¹"$Æﶻìîs¼ *Rƒ4NŸÚíÖ6KŠðÝxFlðÖb –ÈWñ´xWªØ¹kÏÀXÜp,ï—ÊLi!ϵ£ÔôaW†«Hw™ŸZQñ¡èa |ß^‡Âo£T»^nú :N.[( hl„{Y¬‰GAõËà­w‡©ˆð(XU -‰áÐá*ÁUqÇ!ÔcÇ;ò¦¿-0L½¼nvÊw‘,Uì­þ˜=Ï]U7] ›ß$úŽŒ6ÇaÁÓóx/ì¿úAw‰Þ©à1ˆ¿¢3‘Rš ƒ J–R69gÜ5Žû—839Ç荃ù¨¼1ôQ¨Å8‹)\aæžZà°òœØ‘âל'îêÒê×&P|ßË¥GÎ\J¢Uuˆ—âF4µûÉœ…ðK æ¸oµÚ›Q\`tê5 ¹²‹>}ÞLݜUE÷ÛŸ‘þgX»“cìVҔ§Òëøai0WuÞT!3ċévjÈ~!šçÅd5×­bÒ Äß"6á®å7l¯6ëV*¾3†XƒXËë¥aB¦¶{FNaUhž î,̉ÒB&J½šväsÌ=©¼ßö$œŽ¿Pü7šI7ërGúA•rJD&ð‚ãÞÖê…*®ƒC$¢°œ_tà“á­X§4^•ÙMµ%°æR‰%Ï¢‡ìfI…xˆ4»…´ÜU¾ë´Ì–p€1ú‡#òÈCO½ÒAC€ŒÔ¼Ô3D-üQv8i§& lHçC狱—Ìh”÷tÕ=›ÄTÔ!*‰ÿ W¨¢äN¸†GpíJÂ8¯«ø4k7šâGTW¦—‹®`˜ùž‰íð(çÁg„@A%Šœ—zHTËÝCr3×54#’‹Ú½ íV0ð­çPò”¹'W˜03âÈcA^ ½Xþ(䅲„†¬²9 ¿½(¡Î¨}üÊÁ~ ŸƒÎè|ëBQ4""Š"þJ <ƒ^$K®pøaT4‰dcg2¨L>…Ç¥Ì*XFísOJ¸`e°ÛU~̧ ø‡å-´d߇z¸ç}%GìR@úäç¢æ2ųŸôÚDÄ·Gä2‡eOk†O²bÕš UÛ \ãØrQ{!Y‚þʕY€ÇS:LƒÝ{n)3sO֕TºêŒÇÚIƒÅé.kþ`³g!/xxÈ40!BB1úíÎpÞ¬G©1@ëJqNíÉ2\>Îê;E‰z¦ø/ã$3Éå0\\-„•räÛN‹ÁrΏæ‹Ù[Å<–Âê7§¦âú­=k¾Clö÷ã8=Qçç,ƾ#ÄCc¨t™Õ9æ¹øâCÈ Ðq -ɀR›' kžÿб0ºk”pe‹Dðï-iݝKлh¾›¶ÚǺ/mȸve#Å»ÚR—¯Œð8Þ«ZgtºšE3YŠwZ¡ãTÙ¸Ÿ¨u”ÐñÛ@Â€ûñØÏââÊ*'E §J$X­þ¢Å­¾- åÇ è·™ýHÀ5£§u»n£RÖ\µ!ûÏpv@ Ðó‡Pž+¬'Zì@°ó¨Gõ­‰§¨Ç¾rBÁýL¯§A£†ÃP´Î.î—ç4x”ø͙;jfà*PÎÙP?wiï@¢š6XRL ³>Î["žJAzÓ±ò7éŒAr7rò†( -Š*ñªv×öT"p¿vâ`!¯Ç˜³þýˆÞª§Áþ A‘åÑ@˜å´jnÒ=ñXúbϒ¿£ö³üf— ŽŒÃ8]½w‡™¡p•Ô™0…Á¾Šˆ^åG|ºÚƒ|H춗u×뛌 -Á|³ÙΣÒKb‰9=l¢tߣ”Âܓ-ày=牔GJ¿Ê`Þ£ƒQ‹í]­…Ù-ƆœKŽd†ØAöŽ”ad>á>V žšÀn¡ …Ñé“:‚vULÃÐo7ߣY«Ø¾œˆ‰ç^`òÖTe¿™‘Æ;̓Q˜„ºZ£XŸDËüÕÓ $-5)õðI¢eNeDzá‘n¯HÓo0a[¿«™Ê®Gô°5ýc)‘8ïúd Wâ‡!”z `̽W†~9àTŠ¾_Ÿ:àm*#¿ðY¹- |ÀÂA.wUƒ¢â@œ[¸¹¹Ð‰¹Jŝ»+ ΌÂvkQÎ= -Û-«=£©$~ƒ*X”+S -ÚB±Ë8–Xª¦>Vs¹Ê…li@ήՠԃX1>óZçŽÎÌzc«Þj*O*KpO¥ë¸êÈ×é Ig.ZèDBe£¸ðáqÔÝ´kî*O0pJ”³ÛJs -ÅbF­¿ˆKc:dgl;¥7ÆçJŠãp¬%FÀ5Õ"4Ætx¥LhÞ#=»2Çiþ1Æ 8CA¨XõRkkŽ-¤ Š6TJPÓ¡ -¨[+SäJ†™± 8ÂÒï%ü¦ÄáaQ/\AHRˆ?É!–+ž”ë£@¼ŽÅË°`tŝ¨æ Í@á!f¬Š¡-ѐœb%ŠVyöîp¤Ù•–$Ùµ` ݃r¸VònXüPÔgÆ5‹ºèÆRpFîj³…^3k™‰¬„ØäŽB6Çs(ˆë”²K2a˜tÎɵéÖ°¹é°–“ÂÑîôu«”BäÂ*ìÈÖH½øS…–øTîP"ùË¡T|<”uå¢IGëjxg”ÁZX4•^Rr2©éÍÁÌ©´w_'~‚ïhïáôD–™§¼.a¾’zˆ}Ø¢ kP JÍKw©ž.½ê!@‘:¬Ÿ(G;MLàÐ ÆbïLOf‰_Ñ¿9Nʙ.WlÁ¢Î®MhËÜSz+Úb]¡î®ÕùK -Yc…95æX©¨H¾yZ…n‘ž‘þ¸Â«‡PŬ_ê­ro.θþ®5fƒ&Ÿªš<µeé3ê,a––Ç©¥pB”#¢´¡æ+8Œ»¤ù<¥ª£ð~ÛUý•yø©ÕÀ³ -ðяYÏS­º\'Z¢?ÉçXéW!ÍdQ#´ÅÔª\ªÝWh…¡Êä“.óuY…;:&QhE|“šÊǺWAÁp©•{êX2¬0IïP± žî -WŠoDß-hú8Áª–¥Ju§»üDXÈ¡] õR€˜Êl/»?6)óÓû„‘zÒǽ™˜üàI| g©ºªrW–ÃÌu&3üMlȤ§íÉUqŽ×ªø¸Üˆ,34e˜çOa=;÷BŠ6R)Ú­——]ûjvÁ„$Iqáá7pÜSŠGÕÍ»3Mq(n25ñ@ÏQär¹æ÷‘ÝÑÇxÝÑ8ö#‹]×&ñ6Iu)¬Ò?_& 3LyúUP¯j²2†‹22Ž3!j¶=õM*°T—çã‘Ẩ‹!fº÷ÌÚߊ1QOSٚ¸XÚ5Ë9àkJ=üðG»$í§:&½û­3®ù±Óô^ØëXƒ~ 󭢦'<½KËlZFwŠº‡?‹ö‹ñÉn¿MíÄaÜ>]ÀB]7«ÅÎYdú Ÿ=s"üÕC%ÞL†X™³ ‹›¡æs;ëYó¦µa$‡zß}ŽI9SA.]4.&1“0 |°BÇÍ>g@øà ¸$ÕçÉ]å±¥Êi¤Öþ}×ÃiÕbÑ-§Bñ.-*®|*êe RW ^ΖàŸ1ÃqÝÈ´JXX1J_ì)® -’r\õK®˜ª}üH/•L`Ÿ”KtQÁq¸"-§2ÜõeîJÍÈ°šœ59`±ëG›«Å8·ûB›˜†ôu¡A=¼##€1Žã4F—”õP¼Wd¥4[™'BÝ&u܄¡ŽeÏ>\ñÑôÖ?î’ ‡›nó'—èœkº¾"fÃù: Œ-Š¶šó9×슃ÎWwšBðÅ)ÓZvp¼Qž‘»Š"€&XÊÛH<_Øà€š(ñœ ‰æŽB4slEÃz×"nñÛe^.(U›ƒù œä—dOùæ–°\óonӊ›¤UuãRꪕÕz¤Ñe)ò„W(UDàä\P4f: ù¨>¥²[ÈüÛ©«+ÜƒØ Y$*¿\eôá{öӛªd•WU24Šƒ±';Š•8Ÿærö„È Eµˆd"ñ-9Ç%l4€…m1Ù2ڛ»ŠšgZXèÜ£%õIؕbKXŽ;õ¶0ÉÜ¢ó±¢} á^!ÿ«úîk(Õ¥»Ë¤ê%y»º‡‘G˜S³è Ëv.œàv\A†~´«ê*{\”%ìý“œ{¯A)À£çv¼#]éœàÇ MïyºÃS¤JbF¬‰¹øû6­ßû…5J`±n¢+v’cµ—A”¥J ‚* †rC µùÞæ†,gç²9͏I㕍,•}TÏî7—i¼vf6¼[>Å}vh}»´9Aß°T¯2çÊ(;ùÎØ÷§¨^ôÐnRãï,¿â—¥¿Œ^×a=ŸõA°p°êë臲¬ÇéÆÇXÊ­©S‘ xCòœiø¯‚$Ì®é>]„[ü™‘þÿX‘7Ë"È͘ŒÀYd!w|m=Û3¯”T4’”oÝ!ÍÂPP<%Šô~ïóB•ó§’7$ò&¬û­þRÔX -å\ëPɇ†dulЫR݈ÂQµEUÀóÈgñè÷¸)×å1¡Åp‰|Iñ·|±>}±æt0Ÿzqo?*ªš¤®Òè”g)P㥄¿'qémAü½€2”Èm²/=]afô9 Òt·8\<ë )ÔT:ûÒ@ø9”45‹ïôP[|„h˜Å -•Rc<Ãê”-Ô TW†qWJËj_4ó‘ABˆ1O‚ch¯µ‡ÂÓµ”’ÂTÚÍu¿ª€ç­UKµdr^,¤sòæuãÈR -¿Ü6.{&›J·f‰--3px<‹™êÊ{Ón˜´´éӝæá¢sHŠÔz-?¬¾ý⃅$\>¢8/ºJGٕèT-ŽÈ`²? -ևÌlBuN¶)¹f­ÝÁ®8I7ÚÉ8× ÃJŠ'­ë p~D÷R/•ù¬È¨9‘þé„ m@ä€Ø¢qî­„â7dqN-ÎüQf¤ŠiÆPȍ® -¦KeÊzz [׉lŒ+C”±€`nD¿G—W¥ðP=À³Z¯»›WPUFÃæfê’Ø”XS¹^ô÷®g¤«3èDýć{O4†q•W -bñ£LvGÃfÌÎÍs½­ŒÁ×}̇½gˆ˜èB«gbÈ¢pµ«A@ÿŸa¨ú`Ü»˜ Ë¡²7ìecÆ:A¾º– åçJ”l Vf8,z B´‚Ù›µâ]C¤3B¤»(î³ÃMøÆC¡V–jF©aŽðÌð Õ–Hw7vcªyæ‹Áÿi‡ê”jF1—2°~ÑØ0þ¼t»§Ï¦‘¿©ªEOߌŠ@ѧ‹Iõ@¯qM…äk„ Ñ 0zÙPáE O¸ºv"w%‹™(PÏ@¿Ü†¦BµZR‡2ÎxÔWmª¿¨¼£\”š—Ǽ9|YÄvø¼.“nÆ ‘SVáð÷šœDYk¹UD­$,ä±)£4-"&´­>fêpȸuÝ,9D%°Å<Ö¥ìNŽMvu¡arJuÜK“ŸQÖä¡þszNtƒ&šsºÒîÞ$¨$B¢8ÀD(®œ×l€bæ¾Q‹ØõÇø‰ÝVºW›ÜäaòýÖiÍ=¯;ˁ_P' Çd á³r™–Ùëår×(ðîJ·Ô† •îÜ-÷àgՍöô3Î½¬ðlGéC·€Î•oé@©àX†U&¨Í¢6»ˋX­Å|½³iÃÝ5rO••Â¬¶!ÐËp>“µŸ¸ˆñž—‘1PÖ¨áä(rùªÓU[X@ø™â£d-«+¶¸ápš¤»V›_ü¸Ö”2ªÌ±Á̘C N—Ê,~èÔ ^Ê[ä®ÝÛ©¤¿E_t°ÒO²XŠ<­1gÃfŒY#GuK”®*­"k»1-Ú1-U‚^Ö=—Ëðæ‘[QB ÓYË]ÙÛ"KW¥:eq©vS<Èx—½ŒÖ¯.ƒÜ‡ë!;FG¼õÔÛ§jNx°û;‘vz‹ôÁbæÄ3¾ÄV*LÀÜÝ\Å_Gq~±¿Ä)ï˜:¢¡Wý•#ŽõOLҗh Ý]wjŸªXº†¢«+çšSš!Ϊ‹#}™Þ£ M¬r{T¼NN.e2ìFøé‚ÅלÖ0O³#u‹tgnh3â+‹êN˹V«…×3ф¨¸“˜~GhÖ¼É딃‡Ö"L7µðKXQ—ä…®a÷Žz QINþgÃZC8´V¢ˆž¬cZÎÁ¬¢j¬(y ¹y -(ö /Ëèñev:sˆßnw®ZF»ªúÕÄ–CÅúc -ÔR]ÂBÀC…êJÇ×`Ö}XJü–+”™ºãrÁ*sÀ|Û £ã©né@“øŽÐXwñK<SZ-ÔèôöÙ­)Õ¦y– Ý؅NÌA‰iÊ#w7E‚E©Ð¾¬àð’z ,†“B–²_4§ª i/2éÐ93¥KLso•£ñ¥H -A‘-é !.­l¾7”XwÈEÞ ‚=ŽÝqY’¹VâÏ¥EßùÇ`a½–é“ ei±¾]{äm9Ɔ´pxÂáSâÂÛ@mˆ×Ƹ\RÚ¡h›öŽ“÷†q"¢»/Û±›8Þ H>” ‚n˞#jõ¢WØm?B)as„Å~æ­ÜÄܐ)„S ³¯‹L0ͼ`N}P«_<¹fðnV=uÍ»ßÑÍ fT\ÐBÀS¡…†g÷§ âe<}xCñî·iá¯^e±x×Ë@˜±¸FEføt53Tqx&/ôÚ>.Naä™T+bª‹NV!o¼ÑňµÏIž¡eÖ×¹ï£FMø»F*© óË&ޔŠ€GSÞQêay$ƕÚé¶æ̑™ðŒž;ò—‡%è\?õÊf© B®€o ºtD')ܬÂ*|GŠU:3“þÕbgú±[Á]»“¥êXrWWˆçžÒ ¥ÁŸÃptnØ]4YXlÃ~ØcIóV¶¿@7]Uw–"iE<Ù'¤™g¦xìdEóåÕÛãU$ëO¶ö(j‰ðXVè쐈dǞGzbD¸]ãiTªºk´ãÊ=é -ÀL±7-äo¢éVØƱå‰\x?L+zª,榯CJZ|¥…"–­s;|µ¸½,·¤O…­Ãâ!å2»67Ä샕+ƒÄ㪚a¨öqÖ´±ì¡wÝދ{ºy‹&-–¡²‰%’KaÁ­†Ù¬=oVc°W -tÆÀ:›·ÉUJ¾»ÌP2.€HuU<—’…K N‹{'^fŒ±l-«!Æ?k·÷”+ÁÃ|8ñV¨Æ\µ¹Ô‡ ,ƒË³¨Á¸c˜¬ì„¸íÂ+t„w¬ö%N—Sþ„8»ÕÜ&nRI:h’¿æ”Í ˆ¹ïۊ$䙪çl ƒ`ñ¬.)†Ïvj!š^ÝG¥û"!WÕ9NÁ—š#Š«éóŸìݬÁ¥Rz‡øô­¾Žäè!?¨åÔVÔû ZÎn|ç=™åè¬W[Ëù×Øyå´=Ïĕãõ>'­ü´Ôp‡•Ÿ=à4f•#¬¥ÎŠf•cñx™ì0!½ÌK÷2IåÔÿ••dî˜rô1jæÉcî½ì%£³ø!\øtÃ8ןÆR°Íäã2á@”_þLvBùTœ”£îòz<…"÷Bôó#:ʤg£ˆN¹hÓɃrpò«›³±ÉÑè0õž–×rˆÅiI&ÅÂ&Ç2C~ž¹ä;H–üEk‡’SìÓÌÇààO3ÉÖÇ=¨w"ù=<àaߖ<òË*ÉGþܪÑK9+í8eœÝ@ˆÕÚhäjÒåX‰bDÈ6hä°2³ÓÈK8ÞI#‡…}FNƒ¤°÷ÆÊK‘¿aäX†3„0r¬˜X_´±ÈQß،t™å|Ü.Päìg¢"ñE.3‹ê ‡E³Ë\¿#Ê^W9Ì×B"g§Š€s¯AÕù"Jµà?™³‘ÔE(”mrÌ$ ‚üñ2 äÏúº@kTxD·&M`Çéð@}Á¹úøøE'¡³~.Sð7ôøhá ßg¬B Gõ2—ówLg.ö;~>á—;žÕåuü´žÔÔqKøó¹D}9Væøa¿@ŽŸÆó&r†àUN(ò@ª&6p<ÚÁoœêLêõVÜ8"Åå¯Ô'oƒ5Ž@?S8ky(¾>‡\ímV }še0AãH[±Ò7@ãÝA¨äŒ£ô´ÆtbƑé%¤ô¯Qàá—€ã W@î3ÄÄ£±Þňq¦¢‡>3ʖYÄÈÇÂP¯ŠùâÈfª$Êxq¸v”otñ:f”¦xªK¶øÏqFl­J‡g@‰üFGЭ4-ÿ`–1WŽ‡Ð +NˆLQœ°fP«ËçØâ6RS+&})Žßã‚1@álæxœo@qd_øú„•åYò˜„½EÃá&Ž|Òˆ‰wùJ‰G::–$X9_ÃÀ†ã¬V°8|än8ø¤ˆŸÆ§%D†¨îeî -V„8Ô§9Ýbàr9•@|V~x‚&>üŒxgÐÃÏS¤~FW²`‡O> 'a¾ó0™ ·YÐB\¨ÁáXQ*edn8éˏÂĆã¬Î:¡á`p°~?˜ágwÎlC†ÃªoÓÄpŠ) ±blÒ >iá¸T3Äy)ÝÈÿ`…á$¨ÄŠ -GºXc»Iá=˜À -ï%èó+'¼‡Z'0áÈÅ5s¤k1opÈ Fx·T=á-àñ!¼…ø%áhQ«ºMÂÙ³ÖzˆÉ¯[¼ªYcÂÁ±[ÓafåÞwMç&ƒ# 4XUf0x ±òÊL F󲲸4`ßCm¼w(øҚשUt ¯®ñ¦¸Włç -ïœDðŒâÎî8pWçNxÔ1' üpzg›&9Qà}ß ‡VÞ0àôՆ8S˝½{¥èWÕgW.yc€ß y«VJðC˜±IœÎÙà!úþ7—?þ?©¾ØfûjU{²¿¹™É1J0 ™¨Ý…üíp`‚¿‡jê'÷; ö;­Aý~ê–7c‘嚝fxX¹™ýé$~OÃüNcð¾kV¾î;^ˍöýPÐ?ìk-êá‚õ}0êi¨÷”Ï⋉õ-–C¯“õ}°¹Ýo¬ïƒHLŠS ûþY?³§MûÉA“ðFû†›2ÜVC’µ½=ƒ\ñ õ;S$Aú~èãJ&…oˆ…öéór£# Þ… w²´0êéÅkÙ0ßð ”B Ì÷A8ˆ-ÛT_l”ïFä¨d|fp¿Šµ–*¨’~G|WÓ’ðݪJ3ðÁL꧕ï Q Á-÷nÕéñ {§.±ç -÷®Ñˆ0ØÞÕ­¢í C´Y A 5 ö†x`„ցúâÓ² ë _RúOiX4ëzYIäî¸?íPï´Fùô¬¯¦7¶YA>L»&Ñ»¹+Þ؂KŒ èÝ"¾@Þñéªc`rÍÖÊñV¿¥«L7~l2$oÊY𰑼ññ2¶$ol(lf¼ñà9©o$oZY_¾3š ò†”³ÇP±cꧪŠ2&ț| ±H ò¦,T$ƒ¼IGbáÊò¦™H yóI]cr¼)²axãxSXåLCCRƒËIŽ77á'»q¼afóëäxSt{ô'9ސ ¹q¼©Ù×ÔeŽw!gùz&Ço¨*†6Ž7µÚ.áÈÌ c$Æ[ )#̗>‘Y°oÈ¥B8ãMá3)?ÆfsãM©¹ÆxK;ÇjµãÍ=YUï’ÀËÀxÃÂàݎñƅ]> (í2Æo -¨X'¾R¼Ù9>+… \Þo„9Î^vŒ7Âríœï+¬rMT0z+òDW„÷c¢Y¼«éàã¼Ó»Ÿ;ž®áÝ æ1Èün\'¤ß -¨êŒð”.™ÞMòqS%S»u%è?àÝPäÜÞÓôݽ’»Ñà]m’oûZIíÆ^|o7h7‚T³›GÖ2³›½á‰;ژݼèzhWåÃððnsjBõïÈ¢ì`Û<͵pþÌَݩ%ùv`7¬¬¢ -^7Ž£¸³pÝø5•-´îBÑÄ¡5w -þlàº5Ç8I3qÝ¢ìE[Zv¶#‘âÖÁ„bW‚þ†ë†Yë¦…ô5ãºi¨ªM\7Í,Ç -\7¢'œS0“iOû´ãºØV½jàºY»!A¬›QåmeÖ¤u³^„•>ëF†~=pݼI*5]yÝ% Éëf‡vÆúƒ×Íâ Õ)¬¼n–Ð$ê[NÂå‡àuÓBjâÆ릠–¢‰àu³?—ìÆÜ¥ŠÏ Ø-‰-¥fvsCUßцÞy¤ØMׇ+š vK‹ë {³ µ›»=Ý°Ê-1°›†añYþ&AÃ;±›>ÉMìV?–[‘·ºÝ’`»¹ªRҀ"½ÜÜã€eë°p¨ÞÝ2ßQ°Ú´¡‹y…ì†Aôû ÙÍæ6IJ[ëC¼µ–nÑïdCv«û#a-Fv3¦Ghd7—9A؞Ènjυ¥1³›út}#fvÓ¢aevÓܝùUXð, ‘ÝüQVFnÈnIþ‹Jix¼•õMd·´ü‡{°&²›î#ÃíÆ};Eý0´[aÄ.'GšÝæ@wOíV¨ä4é$¡Ý%ûјٝ–dv38ÃÄçÆìƥʙ f7}E: ¹àÅäËލٍDçÉEû#¬œTKd7Qw|‘6d·"ËϘÈn¼qDü$²»œgÐqd7‹Æ¤† !9²›®¿:ˆ¬Èî’*†@vÓÂÔp »?®–Ff~ç²™È\)ORˆÊ£Âs‘=Ó7d7Ílpfd7~‚ªµDvÉoGvÃL8O"»iQvÒÈnY˜t[‘ÝøQR:ٍ)Å[AìFJQ½ W`73¢$]°ûq.-YÜY±1»¯ùa[ÑÒý1±{ô(RZÝ°Ž|qö´“Àu>…ìsI0œïIX÷ˆ±)6]í¨îáNéIê¯îpt±1´aç<´ºIº¾Ÿi½¯ ™™Ó†Ó=­ætß5Z†¿ 6–ö®˜îët>73g>!ÝiØÝÓ*D÷M Ñ ƒ¯+ ›´ò¶ºåVEœùÜ0hYñÜ؏ó~à¹ïû>üöopî+¨› µ‹4šÀS™›,æ®ï" E—Ãiå*ÆW®XnI¹ *7 Ýe -t]Sn÷dr_ÇTþ1Mz¹ÛU"¹a Îp#ryÇúÈr#ÌJy¹¯ø7uô[F·FôP7­,yØ`Ü´bNµö†Õ(î—A‘µÄ=b}`7B¿êÝfžD’È7 7µ©lóg -7òðŠÂ}y±»3¸Ù$üy&‚{D-t¸qB,9ÚÜ<-Œ›ÁßÆ­æ€ømèݯôí&|›e•ýšìíõ8½]œƒ¼}E+8Û9@làíËzµän_n‘4mUp”ߨÛ÷p@nöpµ˜ÈmÈ©õX‰Û¢‹>¸ çØnß!vÙxÛ°r8 -Þ6ê:˜ÁÜ6¨âª[iÛ¨¢á `ÛXz3ýfÖvþ½¡¶§Õ¤mÐq†[-²‚íŽhÓÆÙ~?˜m,MÝÑ;ºSÁ_Ÿ7Ì6ÌZ E\r¡3Â¥,ô¦.®˜mXj Ì6,¶$f›Ûð fs­ÂâÙ~̖JÊ6–Gjû¾B¶_©Ê—€lóÄx—²MÂHìY=§“אmRؗ Û| ·[tOÈ6+k³ ÙæûÁ!4 Û´(FºB¶Ù,4®Böãv‰!Û½§ÏéYý1!ی@2X¶A¶iVöՐmE&ë5‘ÚŒ8ªy…l3$FuS@¶ñ˜ý†l‡Éfcl㸎یí¹Lƶ¾u7ÄXÁ5úIc›^Á™Ò¡ÈíÎØ.A·IÆ6,7c›%¶·6™ˆm\©DvØÆk(,V ¶áºÔ{ElO8•x_CV"FF‰*§ ±½˜Øf“gf± ‹Tnb›Ä Ʊ]È?/*U7zˆ…9ðlˆm¼ÂVŽ±M‰¡±ç,Ð݆ØF¹éiÁØFݚ8÷.Ig÷¼O;_9¥¢Œ×†Î!%èÚx]äɯtm‘8œ^›A$uB÷B ׬+][V*’Œ×æ±Î€i«<¸zxÙðڌ‹²CIðµñÜsL¾ös}l£ž(Êu™Ì¹ƒ‘xmÖa´']m~úÂֆ”‘”`k£kÇ­´ÆŒ>^Q0dm–/v­h™À˶ì+Wë#!gt¡pÅËYªÅ,¤ƒ°Aµ/·K¦öåâµDjÈÆHÐBÔFC ŽÛÔ¦þãp0®çp°sçi‹Æ]ð´G‹†qÚ©)]=aÚìhEA’YÚ8ÎÒ‘¨Ý8ÚÃx­,D§fÑùcEqʟ­m()c ˆ6’†ü¬‚¡ÝC¸·!´É˜{¤EdlËÐ*;@z/•;pm?ë¿ŸÝC±Ñ³¡Q"˜%àÙÙÝ>Oº~ ;÷7p6J”º07û7( ÙXX±Ðvcfê"0×àClÅ]`¯!ÇýefŸ.AI^öéÌËnÄmî°ìl¸¬ìáXi¢²¡á$¾‘²qü¹eŸÑ^=8Ù¨1S««“} "0ÙgÌiAÉÆ5ã1gnS ƒ#ÁÈÆôtšMŸèt!ގȆӯp‚CF8=¾áȆ.‹Šê•zk…`G}Îh¿h:ö3œÎ^éØ02Ìpì'zš;˜™;û± $É؏ó Ɔ!~n‚±™h9¬ºcè,R!Éņ:-‚U‹}_ÑÃXì'0§AÅ~"¿B±‘êÑK42Pܧ"ÄÚ\<ÑýÛ Ø43ðPìB6qy>%›9 úÜf啂ŠMWñë Í›ÛÜ.˜¥•óˆÆbâüV`±K‰*ü ‹­uÓÓ'›9pºDÅÂh÷¥¯üE53›‰g5‹N`\Í<üÆ\l¸lp¸a±ƒ'¬u¢5û±&lGb?À“ˆ ƒ`b?F/î©Á­fFýù´S«‘9N.xj‚ ©¹¼¢¤ä¶¨7Ót'JÿŽ>Ë-1œ’xhj­ÈDÞÐÔó²åS’©»[¡%˜úr«K}:ѐXêây;¨Ô–ÐîPj•¢ØŠIMbÂóS"©oReމÔ@´°qF©o/G±ù7µõ[É¢¾¢û„QÔ5ªïvõ0°'IÔÖX&ˆšÉ‡jFf¢\·'­„Pãý(®ä›jÔÆMD¼Ü^Âè£áˆ¨åÐ$P7»W ®á'š…ýo'~õC¥¨ô¨°âë™ìéáÞ oìiË×=}2äP&yZK²^ßÈÓÒ¸\m’§¦=Ù!ÈÓÔ§aI­5±!ã0°¨b §?ºìß~Y€¡ùŠ5y §»³|IžP\‚§Ï:á•;€„ØœÆNƒ¢ŽÓ¦NŸQ»A§A¡'Ìi A”†5r†Ë[ÌÒ⧑¦¸+xÓHœF·¢©â9£ôØñzÈ`9¢š"æՑhLÖô]"ë-#q¾½MÒôS‘ØAÓ°r€ Ð4 bí:Ãæ.+Ð7Ìôc(NR¦Qž¦¡7Ã?0è³1¦o—s&cš@åûšèh>8 m„éË$Œ´W£&`: _:¬‰—¾<×'4"e®¥7¸4ÄÅ -ÙzwZzþ¹’¥Ãš`é+4AÁ•¾ººa¥!¸î›ÆDuAO6T†hƸø²Ñs&ÒWè© wN¬n@i¿k2OµVªÅ7NßÑp¿Æ ”¾O;âÁ“¦¡Ž‰“f¼ü8ßhÒñk4LúîÝLš½èÏó% @¦ÒçFICf j„ˆoÃWvtâʂ#(ÌÀHßþzwŠ4Ê·Š;—Fe!+ђ! CuÄ~"¤ŸˆðA­#xѕǑ۸ñ£Ÿµu&¾@ºǘôhd{˜ÚØàѤU·™:ÔKõ*FGß^Äîäè[|»äF?^%6š…”gÛ©Ñ䅳mž¡Ñ8)ú3úi$ïÌèÇP–DF?QÄèõ@}G¦8xÑ·“d ‡Žáa§ECÉËN˜A‹½Tà`@_ѧrcEC¨@RhX‘XP45ö×óƉF‹ñMc¢ñ7+¦L‰¾Ž(6_!ÑȏEŹ8•‡`ˆFªØ!z8¼ž„èewˆNÃƈžVC¢‡YRI(Æ -™Q§ nê£ìÁ -…^Æä¨Ø]¸¸#¢Áë:}3™”éŽÉ‡ÆŠJ W<4–eðãÕ›ê­\`Ö-{ØáЧU$ɆÕIM‹†¦¤Œ©ü‰†V{%šË<ÿ±œYgí§Ü†~\)“ KãäBsñ<®7,4ÚdÄ=ï5 †Bw+Mw&4¸]qîü`"+—Hèw×èó7w¾þïEBôü³Ç?Oÿè/~øËípÀßüö—ÿô×?þòÏøí÷?üô»_þËþ§Þ?ý£þÓï¾²9þï/ÿó_ÿ óúò›ï—ÎŸÛéÏûÃÿøõ¿ÿå_üæ÷Dë¨Þø¹óúýú‘ÿç‡_ÿ׿úÝÏC°cÛßü·_¾nÕ?ûío~úÃùá¿üîo¿5nÏëRýÃßü].ôóoþz^(ªä_ßòÿòBÿݯõ»¿úÙ'û§¯¿þñ?o¿üӟ~åi8aøåŸýæ§?½}¿{½€ß}gû?ù῾®pù—_üɟý7þÛ­û'¿ýïóWy¬ðg?üþ“ÿúTþá/ŽOÿør|ú÷¿ÿşüwüNJý>>ý‹×ý/Ûï?õOÿêÓüOǧ_½öø÷ñ‹?ùîz0ôã~œn{û…¦Ã…‰?oíôe;Ö믟ðÃÿúõ?¯‘‡™¸mB«þ«]”)\ðÒfz-/_k<üÇk´0Bˆ—+@Š‹&êlIæ)«Æ[@²—¯UÃnÄ¢áäH·Ù1”^¯ßØK7ê5¼mçF«p8ŠûÆEá¯í°Ó¸ŸÃbŸ'<»\ÚÇûð:ÂÁM¾Ð? @»×ºž›ø`z&þåݨy-¸ÛÙÂzàáö–ãÓ¿úE<Î ÈcIÁŠï1$MǹÚatMÛËHY{3ZR¡ë[ì]hŽý°ðÆ^¯Ã~6~?_µíÜþš×ÿ4^nÈ?¢ -iÇo«ÝgÂêÅ¡¼1ʛò‚|°‹y¼:>í‡%£}ÚÏÁÆïæÜò´ÿþþCot¿{5Òîf(çµÔ0ێÞñ2Ÿlµ‹ZÞëîx©›Õm¿ßï0ÔXUl§Q¼îÚNx1nW7íË­˜‡]nÚ<‡ýƒ)PÎ÷«ÐúûƒKãÛSžöå•Èî/χûð>f|Çӹčßo/Î}÷~‡3GÛÙ.ÆíÒ¦}¹ó°Ë›ç°ß^üœò}c8µõížÆ·G<íËû‡]ߜ÷᛽À§šz¾l•BüÕþ„ζ‘m1n#ÛbŸ#ÛrØ9²-簍løD!ö/HÞ;û9LûrÂó°Ë¥}¸ßÇ(Šy¦åÃ-Âîå8óÅX~q1n§·Øçµ,‡W½œÃv‹æã^7Îc=ì4îç0íË ÏÃ.—öá>|ÿÑ]!ï:?¸+aß<²s®7¦²Îòúà®`EÆa÷‚n5ŸÚ]ßݕuãéÌÃNã~‹}žð<ìriïÃ7™Lç½ßÞéT,ç0ݏålãvi‹3ïÃâÍ;¶ø Ûí]œŠeãé~,O-oxڗ÷!»¾9î÷šLç4½ßáéW,§1=å„ãvu‹3oÅâ͛¶¸ -Û^üŠeãé,.oOyڗW"»¾<îÃ7yçwoéjLJ°oŸ|s¿ÜÝx¤|7ÐÞë¸öñ¡ZC¾›6¾ëÆ󓟇Æýû<áyØåÒ>އo¿œÙïðü–—Ó˜_ýr‹q»ºe蘷byæM[>Ïí/ßò²ñüê——Æ·§<íË+‘‡]_ž÷á/göÛ;?äåæ'¿œíbÜ.m7æ}X†yǖos»½Ë‡¼läa×7çÃ}˜>jžžd³hó% |ºbó:ãæ¢,öéÏ,‡žÏr››ôñÜf¤åã -Š‡no+(ž„ÖÓÛ^Œ›k¾Ø§¿vzüíãâiûeç¿q¨÷OúÕèý[€Û7û¾G—X/^¼Ÿ³Æî_>q‹ÿŸ‡)ÛrºÅzûõb͙¦*Èh»' I½Œ/監p?—™Fv®þi;,C wý´CçLó\×ÛÆVÁo‡Æýû<áyØåÒ>އo9Ó`ƒ÷;\Œ"ÙNC@ïs?áŸ]Ý´/·bv¹ióö;,÷¦¾m\¥ÒÛ\ߞò´/¯Dv}y>܇o5Ó°Ðåýö.MÚ΁WÙÞ^àŸ]Ú´/÷av¹cóöÛ[ØG|¼mlFÕþÔÒøöˆ§}yò°ë›óá>|ËÀ4/dÛ³„< ³œöï44׫ǰ߮7#Žu­3Û»JlöÃ6é@÷shIÿN?r²±äºñ%ð~ØiÜÏaڗž‡].íÃ}ØB§èíqþ=ߎév”ýãvz‹}^ËrØyÕË9l·Ã}?o»²n?ì4îç0íË ÏÃ.—öá>|›õ|¾'s%4Mv¶W'Ší±…ñýÕY7ηa=ì4žÞܗ)}£ù°æzbšæçó[~zÞ»ý<ç^7ÎG²vϯOžç·âß„°owŠòô7£¯úý¶Æ-Ú»Ç@}b zªo1P=Àõ°Ó¸ŸÃ´/'<»\ڇûð•a¿EóÉ/ǙiùÅŸÞbŸ×²vú>Ä@õB½Å@ûû-ZŒû9LûrÂó°Ë¥}¸ßd@ §Ü>Þ^¤“ [ωg¼çÛÙ.ÆíÒû¼Ëa÷äºÏáCr}?·-¹~Ì+ä4ã—ºÚ}&ã>÷Qw1nCôbŸãùrØ9ò/ç°MÏí[ Óµgñ}‰ömÕ@'ÒéŠi´ù¾Ä×›Án¯\ìïïKŒuã¹j˜‡Æýû<áyØåÒ>އoì–_½ßÞ¹XÎa.–³]ŒÛ¥-ëŽy–e˼c‹o¿ÝÞe!°l<— ËSKãÛ#žöå}Èîo·ûð ƒÝv­÷;<×ËiÌUÃr‹q»ºeé1oŲr™7mqï·;¼¬–çªaypi|{ÊÓ¾¼yØõåùp¾Y°{Døï¾Êø0>„}ûäz«oããtçýa|`㕻íãÃo_&MïcÃÜp~ìó€Ó¸ÿúbŸ§:º\ÔÇ;ðíƒû½_ñró{_Nx1nW· óV,cNܲå³\îíòç†óK_Vߞì´/¯At}a>܁ovØoìüx—s˜Ÿùr¶‹q»´e¬˜÷ajâ~-_ãrc—77œøò¤ÒøöX§}yò ëÛòá|ÿ¿{ý7?ýô—?þð«O×{Üõïzí{÷úIÿuTr¸¿kÏÅB—Õþå͎®ÀÚ~y;ÎÏٗãüäóü6âÜíd¤xžå" £½ `ãëe<@-—ñ<žSƂ:¤Ïq„qtoÜÛýñ6Ä/~‘Çú²¾~êAåÁÎÀmÜq2èø\ªì7v–q4”7ðw_¯›g;|2ýny2¬»õ–ñúÄlD5˜®[2–ëð9¼†˜å*ít÷×þ ×¥ns2ú ¥¯·ãÁ î{W›7}Õå3¨6½–¾ñG©Ëþ¬5ѽÁ³õI]iìçˆËò?°ThË=@/o_AÏ{¾”Ž0ïÁÛsøè…2[Ø—d¯ûmûð³&™,œ"öiÙš¿Úv‰Çq¼Öþ=Ýùýt_±Dæ—ô<÷4¢£6ãŽÛûuåÆÞ´c²ÖAêüÚ̓CsX>ë×!ÆÕ[œ*ëlE;+›ÚYÂøú^lF÷XQª‡0@ŽxC+Ï#ÄÃ=ôìcãø4<š¯^Åú:½NôÖAÚ3–׉E’²£øKÚ{ÚÇïA 2ÆÈýáÈó³4ÞçC˜Üioå±½kȀÅ«~jº¢› Küȱ‰G¹ÚoTÜÇj·ñœ‡ÝÏÁ§GC|£ÐèèpXÇöîo1¡0Æ;ÿà5Ê#ø»{ÎÆBEÛož Psãûʟ«ËÖsÈÓ[¼ ­„U“½BI@;ËÓË©÷é§sv,)m<ütXÍøÁØ<3íóyØ'ÄO§•ïì@ªÙ~i, -x4Ö3ŒO¼ÞBÃW´²°ñŠŸã×ôÕsÈ{D⃛{þö××僿æ¨ë“Œv øúõjã©ŠŸ¤¸¶Ÿ1ƒ|-i,(s]&¦¯Ãúõ±­RL§ùõÍQôô×TÓ:{‹ ÄHÎñ6ÇáZ{ÎGÌå~®Ø8'ˆ·XoÝۅÿø5;ÆÛƗ;üòþCg#{ Ú²?-:@ü|#æÇ×½öþë Á´®15sú1íåòûp6=\uÏõkv^G ãu„pŒxái¯-6¾zl|ŸqØ®ïôã9Lßå’VÈsDKÇ -0§s _Â~âC½`Ïa¬ñɐþÕ#Ï{ùS—í »Ý Ž·®èe{ŽC\oNWÑÆz­ÞßÏ $¶·XÐ÷b£}á9ÿSyŅ³Ïw‡J Ÿ¾zëgAçUÓé#êìwaǚïKØí2À~ç«:Ž;ð _=rþh;ÁCóÝõŽW$ä\ßX¨~Iûѯåù >>ŒÇøôÕ#Ï+=ÁGûʕ‚²6¼:ÖÊMÆtت$i,p’d<Ö×»\§ßŸ§žq„×g÷üìê/1ŸæÜÖ„¸M¿Þ9Û¼½öšm>~ ÿál¼ùßòGÑ:ÿŒ‡ªh‚½ŸÃ^OÍ­°ßüòI‹Ï óxò2¶q=ñ¹^á!œlƒí;>ИW—«æ­É#õöo•‘#úd˜Ã•Œç(~ /w¹ÚH¤Œ=ï8ì=b%7øo6–8ßÏøP8îy„ù¥ °GtOÏ‹Íû9b„ªG Ã~ŽÀ•®ËÙc0bHÆû¬_TyêÙõµk†Í[Öùó±s9Ör{ß0-éU¼¾€ÛÆá!}„¢õfÏø›Ø:zŒÛ‡V¨0Þsï1 íèKØÇçËIԇÃoðk¶ýh<ÏZ瑽2büï‰ój£ùréqÉXJ\Y=çþ¯Û&&Ÿ"ˆœÑáo¨,¯Ã%Ë<¹Œ}^[Ϗ‡ž”ïØÝr*xÂøZ3=˖yäzÄú§\™p=ÞÑûñ£³Q„óž˜yh_ÞÑÃW‡HîS«oZBÅ°K̒€e=n{ñ©#’õø¼Ú­ÛÓáå–øvZyæ^릜ÈÏá_ßz<‹K6€9¯éçS¸÷uáåiĔp{ÎíÏ÷2Æb0SÏظٕX/^§Å£4³å Ò{÷¦£ÆIГñ/¹åÎÖÇ-º“x=u{;;8E¬§ßa|}ee1æŽ#ÐëââÚæì>Hx„à!¹zñ»ÚÇr'Ô>òX¾Q5‘¢݈[ÁH¡·œ/‰C°Ÿ¯»u]ñÂëMC³»|šˆ{ÏO~B¾¾hÝ÷\é×Ýw\[)aôÑ÷>ÁÃ,ÝÆùi=×½¹_ùiōø¹Ãy®q/GèWØÏѼñÌpQâ-Ÿ“UkcaF -c™ÛsՅ·21óåÜXæ—á™Ò'üºï_ÂÞJ ÖLçÉXϸ%ŽŒZ¼1¢ß{Ɠãpâ#¤ÚÇqÍ#‡K⪌g;sªñ qD|€£^úólQ›мyn-ç·¾Õ¤%"½0ªÏJÜ7Dhç‘ëG~äTT!ŠW›DdŒ)~s—`oZÝÁ±~âÜÐ'ÝÞ;Ü(Y _——<Ç©'RÃOÀ¸’~¬5H×ÐĈ~Í aDWèpsO¯ƒeï4·’ª»Æþ¢v9×*wºßK–œÜì«Iž>ù€S(c;âýëWƯq„\ÃÄԏ–f¹ñk,ˆ#Ìt×ý䘄¶W¬žïS1t2îün5ÔUt^‰Wj´\†Ô®ì¡? ó šçÈÍ ±¹RG¢bá¼ã-áZMÆ^îüò½]«ÿ“GèWÞ´3—"PŽŽp¡«‡´Þñ„YsºvòŒ«¸GÎ*°Ï9o𗰷zĸälS‹`¢ö¯4W_rÈ{¬8£˜g^ŸL>47ŠpQ +è=éh“‡ÝïA›üÃَ×r–[^î]À³²Ç¦DNŸ° -7†Q¨kv˜¦¾„½ä͌ùÆú:BHåHpäˆ,óëˆ3(÷ §ÜqDÆ¥üµdækŒúch± -X~©Hz‡(êgU¿hŽ+ìî1£yª…ŽèŽ3<¥RÔÆÎ,×è–^㯞}á<¿d‚*­“Ž^„ãõdò‹¿Ð±=5&v8ž%@ñܚ!ºš±ª;½çM;bœ«ÕQ0Âϟ¼ßü;_òcþ<Ã+Ç=S°qºÏ]âõŒ±›/Yáh1òÖªÀzAÍñíêa Û¯ÔÃ9¦k‰±ÛI¨ÅsãGÓ{1Oá.uCñ{Ûâç{yì{‡} -ñQœlô¢Šýy|ÂX^żKmÅwÿ‹P"Èo-' §œÄ8‡¼4ô¶Œuߘ1™cÈU’®ïµ½GNºOäÎF, XDs3Œ /⠍‰‰¹“ŒQÌ© ã|uËmo¹Pµodã™Ë+—ºôˆ&8xž³ùUñld¾c Mò˜Ž"ž t9ͬ¨Ωj0¨{ŽùÛG@vþΛvÔ8BÆIÎÑÓØsk¹(9V×êF“RO·&± šÝEÎËníåɉ©I<†eב¾ÇÆ)?»ûˆ,;ÞƃӄBcõØc¤Tmš‘d¸—Ì7ãËÊâ݆7}dHÄ¢"|Y±a€v9Â\vø„/‰X§GkcƬø€æ҉bÝJ¦§Š­a.ñșñÀn6ú¶£OYέæç)—g,k‰£?‘b¿®-–ùøñĐú[#y>1"+– -K:÷ñ¦éçžLWÇ Ã‘ o{´'2úg^ÚõœË9ÌeY>£iáˆ7M½çŒ$+]Á#p®¶ñäÆqb¼B‡>êµVcÿâÈÑ8jD&[³²(ÿX‚w, òÖ+ðYH&…¯7MfÒi<¯<ô¬l;¶6ÍWS×Ø%v¤¦-ÒGµ¦Ø’Œ÷ µÇ÷²¦Zd Éº_Ýï<ƒ¢~p­Ä» -n{ܟ>uZ/û‘Áº~¦tðÊo¼Ü#Œçt€;¯ò X2–÷%ìÓ?b±TÚgøªžËÖO*JOß»šyhqä-[H·ÒÅ¢=$°ÂÈ<%6a´6m,9 Û¯ÕþÑø3þmlþë!_FÆæð×ëç씑]ä´åyÞóçØX— Jƚ+‡f‰¶ÌPä¢ D珌öÐņñXe ˆŒ-Cù}„ PIsNjGKcNi­·60eŒ|~ »•£8U 㕏¦gÄ :òa ¯Eº9t{ÿ˜}½CÁmiÕ(Î Öï²çpUŠ® Ƶ<5§¡ÂL¹×ìS ®-oülÜGŠXhì™ñ)çóç}‡ÚŠc’5r·¢çº]Cþæ¼éy…7Dû v {ïK¤o_—žúýšâ›:rT¼GèT°éÈÑ[[$5¨è¡©å$׫o Þ1:ÐuÏã–¿†Ðîç4Ї¯l,Bê‰}„34 #‰4Ö«¤šÛ3ƒ³¥äk‡N&ŽämL5oπi –èm‘3Ål0"hcm›ãÈ=µ”8ò÷Vë¸Âx¦cËd‹P—  "‡/cI}/{V kÎfyi8ÇxCš•f·s‰¾Ý°eæ¸ûÔì߇¼"íÓC& -{*ñý:RoúÝMîÓã3{®¾Hro ()Ô|:•¾͗8ì2r·²œÙík›Z|nw¡5Œ=½åº¡çJºüÿì½év9’0:¿ëœzÎév·««D'¶Df¹«§,yiWËeåZz©ÑPTÊb›"Õ\\v=Æ÷sî9ß¹pͯÛ/sßàû9@H2IfҋDŠ½Xd €@ìpGd–ØKSòDNÆ>Œj÷å£T8óe(é2r¯‹›ÞrîÃgr[OÛÒ®9$¸ÄémÜ•&ÙÏ°Uî€Âñ—Õà1Wªà„!$0$­̉ãóÈw†¡;˜ø>(X{œI -gLJ!óŽuHópÁA¹ÕVЊ*ÚÑ¢Œ( RŠ±Ü¿.$©r))[{­ -WªÇ S’ýx¦‰qi¼Æ×Ï]ÎíB{t–¹£ˆƒa |æÓ~R -[ËEN ΢?ûÆ^ìbN ÒÂނæ${JAh¯´mË!¿¹ðÂQÊ}cÏÁTßK³ø€q -„ûӈûä AÑ·¹“4Ì]y BsëqìRQ®Iæs­¬-cIJpL;“®1Åÿ‚`Z³7i‚³,êƒYÖ^â÷ù.Á#)¤# äEó’Q -·7˺³:¡|¯pt‘˜ªYäÊ۝0³Ë£¬<´%º‘sŸ Ì7è·q|ø¶‘Ñ£¾1Eæ dI®ÃÞø¸òÀ4áš ‰³õ€›\úão®s}yõ4»µÃiâ¡­:¾0FÒg‹îy¹ò,í„ÒÀ¬çÄ•—[ ËÀ-ጘ%º‡üzW‚”"0„ò4×Wª™p}i™J.³Ä^ß䀜D Ò*3YÜn–4 -9s‘%¼¹ }Ž’ò ¥OxÄQzæÃSs"é}ø5¬ÓÜgÿE1³Òºw,t\×7åí҉u-ÙÆ‚•Ø5ےl›‰ujtª"ùˆÇL~LÀ–<¤”PR™²a͎D.þ×ÈéšÞ(Bv–‹ 1RåRz´òA_‰½pաՔT€7ñ…ã ¥Uès–RïпN­ËÒ-¤Á…’ÎO—Ø w¨iᇜâÐeF4ѯðs§­Ï!ñø•ˆO uÈÍÜÉúp“,£×å>·G(I¸s¢'±&ƒ²õl_(¢ÐÐÆ¥œqZ?’r–3Ǒذd'òe”=Šdò2Ÿá†kÑJwiBÑÅæDߔvš³‚HÂô>^å OfV{a;§,;sd0Ò#”&n§T$ð§’v.sVhPœÏ -ºa3²A5}PI¬-ÈQ$!3qÁrVC‘´~˜`¤§%ž˜ÞÛè%JXÂÐÇCRáœ{4Î~D_+™sʂ£ѐeëàšù5¯Hß ,O»9Íx‰'ˆóI>:“šçÄv•Ô”t²©QÍíz Œô3¼É0¥C%¥>ðœs6îƒO§Ä°C‚‹„x)fÏñ@zs-=—YŒYxU”;q4ã”Ó…‹Í÷M:M¹V*` $ä…Zî;¦™çü±yˆû¸óÄ r\ÐJ³LRneZ£ƒ3Rµ—?#Z{^`æѲ,Ìr°÷&. -ç!u6˜0\î"åÑy \êxçZ ;P”³Ðïá{°ƒ¤ÒïPg¸äÅ4sEҐ“ÎT„AçÄ%§}ƒ)‡gš¶-' ´üxd)“0·þÌõ -#ÀsJä¦ÔD@’h¿¹„" £–‘™‰Dפ-*šÍ·‰ Í|gt&½îÞ«¬ôR¦žòŽ€Ä†Yz³W%Öúá z¡r×ÂÛÃÀm*²’ӝò³Âk·À×L:vÉ«,¸êÀ.™{ñã(J ˜­¥Pçd2zt0„$·Ü)Ře”8ƒžöþÆ$øèÊ« Kr1Ñ÷è1;UÝX‚ÁF”‹:€»Ñ¥XÌCQ9g%ÁÆܗýXP#$•t®ØØGë µ=*¥@-ý¼ES$IÇ r²âyd×5w“ÞÚèªAx * g[JŽ^gŠ˜D.íuŒn9øª8’Ú1ôĝʇ;ÃÑÁ``Üõ¥›€!§YÖ΃>lš ›k‚@%hñDµ. ± ³…²pHÜiüÈN—ÃYH<œ -A¢Bþ„¡¸ŒœjÙÚY4fIƐÄÙôÈIÇ!é В¼+¼j -=È©ŠUFS”û¤áĖVpÑxšÄ žø‚4÷rfÜ\ ¿—] p’eu*›8–øœù–r¿RtByCI¸‚Ù'ˆidD æ€A;žzÁ'I2×8÷U ÐÛ¾·¼¼GšøsÙQŒ#E¥8y³Peõ™.žIê›æ>Ã(T¸ ÞÈm’ Dy&T‰SŒ¦§šW™¸*֋íö¨Î(~4É@ö…ÀԗÁs9`Èh˜c^/E¦Ú͝ åJ+9 ’LiŠJ©ÙÐؔD”Dç/»¨Ô‡Ò´›)dë'-ØHž„bg˅<ÇE‘+f>ÀW§¾F\ü³o\FbC„Eæ`\ó¶¥;¬SçÞw¯Só‹*¥˜fî=2ÕÓ\]>DG¶Ñ$ñaÜ҇%4q’Ò¼ âªudŽ±.y×ؗ7sE§°ª¹oÒ§’,ª|“q·5täeWšQÌ»ôÖd …pŠ–¡¢b­¯ï…f)øî]ƒ‰æQŒ»´–ÈžapË'ˆQä>WtXãkCNÁÇVÊòE9rÊ©‚JôÉÉ £l‘AÌ)à‰ç&2dlÀª#¸ Ñs}q0о§ÆÒ{lмéY:Ñcc’‘º-tæ³ ˜Ýìn»BIbB¦G”â-ÐÅÌáûê ŒEVÆĕ Þº ÚSoþ”Ú‡‡C¥Wîí”ÂÚ3—¨ÙD1g#ñìÃ.<—c‰Z¢ÏÿdÞs©œQÀ%~0á÷† <ž…“ dª€±3ð)E§Œ“«OGdîCûŸœÈ€Ûzé{38 ‰Ä9iLD®¨Td„B îO[[bƒcŽÎ[_’ ṯ–sé{,£Â eܤŒLWÂñ̽ÁËô¼öî×$³\Â]Aâ3è¸H›Ë$­éÞÁ™rƒ ¤]–…f)ÍF”sÒ©0Šœv¥½±XOÌCJ`öÕOmyKLG¢dÞÄÖä±ÀP<‡AQU0<¯­l€—–*ï©Å7ùç¥_¦XD3ªAä«,»R L¼'P ên¦u¬µ9̒ʣz0eˆ×qÙ°ìÞCÕW’TU©h-0P_‰“NʈÞ2òªE‚À½FI‚»”6OÙ¢u… èYIL_EqØ*X°ðÉíÜ)RÅ!G¹×®îm™¹SŤO&DòÚ-/¡ú"±”<†PJ äÚU•¡Il³¨Nâ  $‰(— -½XÇ£ZLŠJ¡ØâJ?¥TK“:l’yá4ñz*À…7g‰¯·%½pJe¦RÏ0B)<ÏÉ_ˆ)´‡'úÁÐsOâYèêàè”Ë€Y éÅfM‰*W~-\8Q…=¨:æ0ÄÑ¥ö’–Ôµ PÄV†õÖÚièc´@®œ“cATwàÚïUíj¡iËTÝR`Ô+w'…rµÓ=î…ÇLúÆew» Ïbæp©X$eÚ ¼[ -)ƒ+Ê7N#‰Ÿ*ïÀ4x8ãñúȽ#ŸjZoMô…Ð`nÈ5W,Ó>û0±¥SRá¢|f'žŒþñpJåNʕYl¦ÊÌ(~ÏÜӞ8©+](cƒVJE×ÀæåoB½(Gèy¸dÔ8÷1rd!`ˆêeÜC°qÒ΁¾‡•ç ê0¿AVW ‹N ¨Ÿ˜Ó¥C --¦>žÇ?Ï¢ÍDÛ³Z%Qj⢠-Xý”û2N*¡Ò^¸È<«PXŽ†tS•QéWÃHå-Eæê((ásYƒu€ŠŒuë€áŽ m@!Y­üâuUU•µ±8»œ•T¬—ø¨„±)sÜ€¹ôsAµµQ»h)oxp™P¼½ù–ù¬°F%Y€kE6\b† sy§¦rå¡ì÷váPƒÔÀi’½zD{ω)Önnƒ½¨©]ìք,x´ØÑ8OsG}$¡t“‚К〬}Â{hÐÖM‰h8¡î6(b‘“á[z©(e¹°3…Ù%ÞQÄ­ˆ2J紂(qÚËgÍÛ6æ>+ñåX¡Ø§Eȕ÷™QM'|X¥ }‘‘“Ê>QÍM;ÎàûYr„¾®;I±ì‘¹«2’²¨¢Z–zÓ&bQ§HÀÜ_•´X×¾&–ˆL%æaÙ uê\-Ìò¥S™×½(ÍÏ6vÅASæ/A -e™1‰Ž2çòÔ»z[.(ª‚öCô22‘Zásμ+ßÉޔ¦ÿ _ež˜[îƒLa}xó;jˆ”h‰ŸŽ«ødgå -eª%÷¤øB\$«Ìúê퐫Q`(]† ÄÙrÇ+¸KÉG`T·ÔÙ è -¶q[‚"ðÒÔ`t^`ݒòsâç ¶„µN„îO ¹P®iîk²’X @A9ÅYÐÚUˆªe^tS éúr=™$ Ì|¹P-# Òïg´iZ`¨—@ŽnAL„ƒ8EÆ~b{ƒw؉G•ÖbÚó€ç¡tž]|JÅ5~•›•MŎy !{4ãƒðµ}´S… û’nXmÄc‰XLãÂaÒª›JZñÛí+/*U ÂbÅ®1£jŒÌUƒñ©¯m¨B9xw)%ÄçJÏÿ+Ó³Ö}{Ӗp ^TÁ½f3^Ì#½&¤¼SŒH©@2Þ¸«`©«éÝõü(£Æ!Y9B;3Š*úš'­DLh¼ ¸öÙޒª+Š&B`Jª2ú*CËH3O(CÚñLlLÕt8gm€~ûCã„#¦‚¹ŽùÄb!5a˜E ¶ËÂê…pRøÌs2ô’/€ÞdSœ-ÐÛ±xþÁ<[._—xR¥^WÃ|A¹ŽÔ2 -ì³ …(I'6I^M9% |þu>†Y1¯óÎÐÁ’èwßÁM›÷½ŠVV`/<܇/gNþA 7»¸ -ÊRÈQPþÂ:ÎRŽ¯£È' -fZ¢>r/ڑ -•h¯k¯S.R‚yàšû×yÝK†QÌ)òþÂÁ™””UWC - -ðF\³>ç”{`uBJE^I(‹c f.•²2}æŒìç¡"0jª^Uš:nDùôpžÃèÁ™šþA‘ûÝîBK5=°6¿úº÷"ñ±Ì§bœ’Ý’èòSŸ½RUWÄ_+8SŒÂ_+¨¼€"rPoà¡¢• ¯ ¨4DU™ ÷R°%ùôq:N,ÜW`tk©öª/qº¥u'B‘FáÂêƒ/Î}} ÆâÔÔrßãk´ÊÕöü5Z”ª pEÑ»A4÷q¨àòóu¢ušº¬Cˆ‘õu-¬ ÊEïú£‰¯×7_ñÏuo®j×Áµ)¥ì匲_`v_Ê+ÔHà>š•ùdf(Ó`%¼ÌšÁà™ÊÄ×¹MÈmqtU´$ÃF©1]”²¤ö%]"àj -8`5Ý[p=ReÏ„ó¨€.‡ª0þBÚÄ_oaOd›tãËKS‚ïBŠæ)Éâ.Û:ç‘(KEWæ{6Êt¾~ ó7ö9Ž%½šª>ø{%hV»¢ª,*Eâ/³¨zc|›óÌ#¡3¾ê2ꎡ3¾ÚÂP{a‹*«TuÆ¿4”GǺä+_ª½rîoc¾ˆ˜¿ÌpïAt=Y*ƒºÌâKJ½Š†eÏÂ%¥ŠJv!C%$Äú%Ýf=‡9¼TÚ*Uö§Ôßî«¥µ\Xxæob̼vko°Èýˆ|íÚ¥ÝÕ¼èZc_O`ê[èvj÷†=w“ÐmE®1:ø}†\ø`ʽ‡:ÞxæêKé î ‹Ê+ˆ,H7Ù*_ó, 5˜æúNi¡“‚‡ÃɅ‹{G¡k يJ…°4¬Dãí£Lm¨úH³œ.¶›ëC¼´åқ?/<œyO–úDIÓíóÈ)›•ûêõ<âðÎ܆ÕÚ³2õw_ceÀÜïM¥}f¾R§;gªðV›D1* J%Z=à‰ŠJ-† Ôà9Œîk â,– õ÷хÜAŸ cKF‹àtgt #¦ -Xü૯ÄìÏ=Õ>žLù|!`TQ#9Õ!ÔûSçÜaÂO/Iá®qph»[0­Oju±çû`yŽ0+ë‚àážfLªóA/áŠ\ ©>\€Ç’ÝhUyëög­˜û|ëÞãìøÁàt4Ÿ?ëL&Åh€PÐão‡ƒg£Þ`Ò¼ÜÛsðýâeoÿòé'ß^âo,±?}ÿèa¯oP}úÉÿ¹õ¥ùöã“Ão‡§~¾ßëNzÃAg -endstream endobj 49 0 obj <>stream -ôvÅOw[·ß\ôæÇ=ÓÁQïd:)Ɵµ¾0 ïFÙ6Ýó^ÿtT °oÝy<˜„áŸÉÛ˼Ídrë³Öï½®܃—嶯;ý©küsïtr¾¼õ sa›î¸æ_lÂÐ΋ÞËóIý±Qû«ܽÇÇ÷N^gýN÷|Rü©3˜Oz“£î9,àÁ1«=ðÞ©iºj´ÐèªFºÇLã›ú3øfC†ô¶þÞú±­ê÷ucC²69ƓÓûÅë^ºUŸ2姮jÞOúÓQ큎Šñ´ß€#Qû«ÜÑp:ê÷ú—çú̧ÁöµW÷¢°e¨æ‚QgϊGéxÜë öWÎcÔñåóqÍwÛiîsúöê_ƒ58"N¯ðŒž‹ÉꕶÁ£;Ü0Vñ§o“™D\ÐzºÃþpôåÏç½IÑà”~Û_Ѻ|›³ôM9Œû½É³No•ùbƒOc+K=u.Ï,Ò~&o¢Ê¿†W`ÃfùI1zY]7YòjÌpnÂ$}ÐÎ\ƒŽ`ŒWí~ܹ_œµî~zÝÃÒí k2´M žü½èNö‡ÓÁ©éçþp…tn›¶“qýá–ºª1CHX“¶)ømëBßvoezL¦£“i¿tëûÖíÃuIã_u%Ã[¡!F£L/žv'×E¶?se ºÔ÷0ŸtÆÅÃQñ©™ðË{汫ê`x4éMº+ŽøR4Ñë7™ÔÒCW5TؖÃZp•Bü‹š¬çz«Z[î%k´7Ç"·3Xí”ӝrºSNožrZ?R}§œ^ãÝåôlÔ1êUÿÛao¼êiý͸¹êi}kØN;Ýi§;ít§î´Óvº`í´Ó&ÿýâ|P ŽWW®)òo¢@YŸ£ÎioÚà\¦öWÅ2N{ýNƒüÈMdö7‚+>Ž.χýáËúðŽ-®ÇÓ[tã«O‰[ܱÅ[ÜN¶ø`4<í£Àx#ÆÂÌöŽ1îãŽ16`Œ;‘qûEÆcÜ1Æc¬Åu¦ÿü¯q÷¼ýPôºç¿À?ƒbôb 6‘M~ôº¢W¹åÖ-O¹ÛtïcÓéݦsã«O‰Ý¦ÛmºÕ뉩íól2´]œçFÄyþqØÿå¢3.FÓUõÇ6)Øsm]¸g£!݈€Ï]þyóÉ®Ì,ڔ©CžZwPõÅíë&In.ÙÝ.pe¢™¯#4*N›ÕàÜ4†ø¡+G_áüm+'ÜüËÎúÃá©»9á¤ß龺۲ áe§Û›¼ý2i7‘µ6é2ôÖr“f£Û°}÷–è&o»-O·x‡S{s’/nhҐ™lˆl2>ïœ>ØfF¹åÁ›ÝèT¾ªþlÍ>wU«²~ìiïìl:.š_ñ4÷àõ«å€ o<*=tUc¼×:¹%µµ'àV*çM'í~×í¼IëßuPôÍ·f®…è‘+c»¢>SêüÒ»˜6qTû®jtx×¯ç¸aÝýžÙ×æ"«û–‡lÃ=V»Û5W w“o×¼YJÄÍ:iumóýe»ûDwÚ6 -h;ùìãÈg»‹F7Æk²ýnûa½Î7,]n+< - .³\‘ØÏÎîÂÑ«ÑÆ7åÂÑs´»pô:̍íäs(ï.ݝÉ×äLÞ]~ýÏäÝ%à»3ùšœÉë©Z»sùšœËÛ~ñðîðwŒÞ¨ÙÞݾ­“ôA;³É«eë¯Üi±©wîìn„]8Üͽs§î}4,<®ç(Û¨Ãj;nºètõ«élÔñÐJÜ«>yHí±ãǼ†Ú_Õø™§Ç«ƒÆ6˜Ë¬ÁH7ŒÉ`êۓ{ôzs™›Q èF$šÞ€“}[ªçìÕ×6¥|ÎÞöÕÏyzs’Ôo‚¡qó Îly ç;ì·ÍñNs†øâ#]ï»! -Άñ’íˆi7HuÚ`é?Þrõs[7mÏ­ÅX6lÛm‹üsõãY1zØm¯ èÚ×mö'“DÙ$Ã.oÕwü!¾oh¹-=tÅÌèátÐ}¾É\h{×a[·’ÖÍZ‰v+ñZ®DvÓXâþuBý Šf¼uã³·å\ÃݱåfŸuÓL6ÉâcǸÕâþZ:͆éŸ[aöÁðÉ{ýþÇX‰›¨ž­¹_7l)ovDïêÈV^¬×ä¬ »XOî.Ö[¸Œ¿Û̋õþôÏÿ>ïû£&¡ñ×ÿ^=UnȵzM¶Þ¸Vµø–:§½iƒÍIí¯j¶O{ýNƒ -›¨…nolÏGŠ ¼æ³¶a¥ðž G—çÃþðe}Þy UÍOÜhž¸½JÛÇ Ä|ì8áUÈË[ñ}ÒôšÍa4€êºOֆñ‡ÍëÞúrõÃL7µ@Ò@ÐÝU¨8| ªlq°p“ã`SN¸­½¶h;ê¬(<sŒ†÷©\íE*MÖÝÆĬœÔŸ­ë»zÖW¶Ö`}Wã ¬ï\:8ï Eÿ¨èÝF¶ù'¯j´+ÂÈcïàÚ£òŠµû½ñe¿Ó-.ŠÁäIçr“϶-®Õêñ´æ>²ÒÇÚÃß´r='õmww6896å0¬?[¦lIÉ¡W…npÒñI}£×Æ1;lS˜FýÙº!yŸŠâ—úæè³Þª€ò™`ÃþÕMö`8¨?°N·;½˜®võÇ˟¹ªAŽ -®ëóô´7é½n2JÿÄU±ßú7¼v;ýî“aƒˆ÷艫bý#0žKê÷8–ÚZ~쪆¬V¨±«¼AÛøªÕéÿÜy[`戟tFÍdûÀ•é‰õwR¼l"¸æW¶ë«õÃJýðêFT_? /œêØúJ•¤Î wÑä¨þâCud{jÕìe[¹ÔÝE.mŽjÖ`²6̞³‹\ªsP^m¥úí¿È$ÙÝd²Ä¹©±KÝí]jr lÊ·‹]ºÖç\}x³b—š¬»‰]ênoìÒ6²¾]ìÒ.vi»´‹]úC[°tb—ºÛ»ÔääؔÃp»t½™å͈]ênoìR“¶)LãÊc—6ȅ¶‰¡XM&¸ùš½Ê ^«åu›ž&±ƒ»éùèÓ³µ÷Ùí*¸Vtd+¸ª¤¥êk¨–ϛ(©Ñ#W%ÄÜÐj§ÏzoŠþø²Wô†9lqèù¨¸® -DÞÐÐóÞà´8ë VV/iX—Egr¿I¤kôÈU tc_5Î Œ±_B”ýVÇØ×<1·&Àž5ˆÕÞEØG–«]„ý‡Y-v—'-¦Ì¿IËüÿ®ùlþÞ5?Ô¿Åí<3W§Å­¯~ݤ5}#Lâ'+Mlßæ -á&ng¿"­¨ö mbím¿à®K·¢=®`zÌ#›ñ‘Ͳ$oŵvõíg¯VŽÄ³m¯Là¯?¢^í҈äFŒhÅt–FÄ®Pw©?¢ìüÕróΨ79¿(& ŽªÍ=”›Ê¼›x$oo²ëZ‚Ç ?›7Ñ!´ÞjÞ°‰Þ¹ó+:²sçïÜùµG|­Üù 3:wîü;±˜µsçïÜù»’y;w~µ bçÎß¹ó¯‘;å[pèóän3YwçÂß¹ð¯‰gÓLa;þ΅•,ämÑï®=KýÞËó‰i°×…¼àú36ûܕÉ\õ%®ÞÙÙt\ FÞ4à(s^ÿ±Z&xÔ¬Ré¡+“YꟀÓљQ²üÔUÒ-©­=?tŒÆFLÚ ¹ŸbgUÜYwVŝUñã ±¾Äº=¦ÅÝ];Óâ52-Z-óîËQQ îi¯¸kÎÊÞËáÝ×½a¿˜Ü§w‡£Î`UìÂÎæxåò[Zß,\ôÍ·fÇè‘+ãYýv~é]L'+꒗ÎzàŠÍW÷{hœ8„Ãñ„ ™þ ²tèëMÞ ®_]#厚™æŸ¼:Q£ñp¼¹4 -Ä:à O^V°BMß&céÍ°®ÑâÚeA­oaÛY¢†;KÔε³Dí,Q;KÔÎ5/-ì,Q×ÃåìNÖåÌRhÚY¢6MÑÞY¢Þ—%êêŽÃ«öŽßûڑÓq·ÁÀv#ªÎlk‚ûM0¶¬3Æ KzފÊ3 ªšì*Ï\• TDRy¦Áí*Ï\§ƒ¹q@çÆÊýÞäY§·Ê!·Á'òº•üvgò5æ÷»3ùúhCÎä]5¸ =“×Sµ6í\ÞÞJp%~&obœEóU¼a“¼«Wёm¬wC«£uÏ Òb°»êÌS¥~•¸]åk*z|¤ÊWy0mK‘ŠúwŸ¾mAôöê_ƒ­8dJ#zsu#ž‹ ¬´QqÚlWmç¸ÁÔŠe<Åi¼ÁÚÊ;¬ã ›ê­¸%üFXöw -æ Q0™LnÕ^Ä?÷N›ü¹æWuh2Ñ`hçE£À9ßþʄŸnø0EÓ¯dX{LÕ_§ dó+Í ©õvcÍ7éÎ|³éJØÎ|³12z¶uæ›#ڙo®çؙovæ›-˜êùf«gjg¾Ù<óÍM5LŒ¢3î®°Eݠ耳Q§;éô¿ö¤ ØÇëνÙu¯q6˜^<5ÄxÝ$C>~檆˜´ëW¿:錋‡£âÓbÐm ÁÌÈo@ɲ‚ÍÖT,Û,ÛȂeíú—!N† ô¬áf¨ g£áEƒ£[ׂ>ŒhdÊ$öb::™ö ‹ÛhSê®,R…¢³)™žMTÍ2~¯•¹³970ÅmoÈ`“¡íB7ÂWð}1ú¹7:)úÓÁËã<6)l°ÁJ݌ Áº!ƒ“šBâ†ztêG4m®C'Ùyt ws=:°-?†Oç*Eè~ºÓO¯X?m´ÍvêNCÝi¨; u 4ÔúãNC½ÆºêÖGÖ/š²¹:jý1îTԝŠºSQw*êNEÝ©¨×_E½uï1KŽ N½ªŠ0 ão‡ƒg ^Ž¹çàûpO`ü˧Ÿ|{iñHûãÑۋ“aßti¿8탳¢ -)ú½âŸÿU ö 8ErÖÿçÿîžO_›>š´î}úIÒúñçO?™Òÿ~7ŠÜøSø‡µüïoáÛ7æÓß ìç–l=iýõ§¤uú)kýø~3=JÛI’ȼµ—·.Ì7ø{øé'{þƒn§Js_áð5å -?§­Ó o¥Ø0oùßèl“C+øs^†_¨9| Ÿ)>xˆé—èÅQ—MÛ3ˆ|f½€?ºÍ%5þ•¦üaWá¯ý²šïeöÝæ¯}9|€¹’-ÿˆýu/³ƒÚËì@üoÑ#™#Pf鳓tû»¬¬ÓÖËQf|ÒŸá\íå0ovæèß}3={ 6IXkŒœ·@ç\¶t.eëNjRKΪ[¦ªµß­‹s¿Nž"Nœ…ý}³¿ƒiKÚ:Z„H¨ »ªÊ3°‡SÈLDÛsT‹þúyŠfofbËB»ð°›c‡•f:êAÔ1šæE3ÇëϜAœ2íPYÌÎË«[¦|næãܯ‡“ëòÌáÄÝþ¬õã0Þ{†S%í4—Lz*ÌJ18SL™*)ƒÂÿìÌóà2¼ñŒ‰–ls)îÑ=øÌSX{îG˜bøœ›îᏠY}4? 3šEwˆ#¸ulN°Iùœ¾u|ÛPAgJäYdØØß¿Ñåχ“PÛäÖ1ð÷c×3@K¯¹o¬êXÕ¢fsè–÷–·…JY.ëöö»E¨d[µ˜ àÌɝçE§ÿ¤c0¿F­Ûæ Ï üÑhõ{Ýâ¨Ûé›×>õNÿT¼u/£Ã6jýÜ^ãÉ»ô‚ÎÝ[ÇæûÃa¿ÔôÁ sÒ/M{§NÔ¸uÌç>xs9M"Tn„~A~œ¡ªë0Ô g8é J`¸ß™L/Æ(0 +ƒÄî_”ڊ¥RÃ&5KQæ*þhÃlè„åiÕ»­“v¶@¨`‰—*ì~7¯ãõš$ Ü¥ÚÿÕn¤Z‰TÂËx*ñÓ?ÓA¡áš+UÁ[R{Úïiw>À¹`y?ý%Ö`¤žO¼û"ê |@v¢ÂߥǴZÎìÍ/ÀiU™ËfÀòø؇ZÐDµíÁ¼Ëþ*,I™ãÈ.¢¡ÂéÆ*㱯)š,ém²zÌrõ˜“•cyyÌS;Jføph?"€ÿÀ–<ÍÃÐeõÐQvH 'f¡š2²Ù¥_dFãœd¿ú13•æGî†Ä݈7úËW g!kl<¢XåfÃ.ْG+F¨Ü•!Íý]ºTq„â]ǗΌOÖ_ºb|‚V%£UÉh1ŠèÃ{\•²´*uù©*†&K‹r扊q7 îƓ¸QÐß÷»&åÂ]&í2¹p—-‘r#RnD4/ô÷}®A¹rÉE{L®ÜcUãKÜän™q·î’ð÷=.?Vš.YþAòŠQ±ÒlÍ<1?nÇÂíP;÷çý®<¶h'±E;‰-ÚIÕCQv(V¿i¹ÉpÞç’c ·[´…ØÂ-T5deø—9 ƒþâpˆÕ½—%f%€ŠyqBÕüh艹y±?Ì —˜²«IÙµ%èÏ{]b3C‘3C©Ø-3C‘«†¢ìPœ¬ë&ÃýyKìCÏIl£ˆÌžI;眱 ;Ê Ë9S`‚ÍÁZ;­fΦ˂²¶KhNØA¡º¢­ÊÚóvÂÅxç$¡Exy>7—Õ*=jó ý#nŒJ?^žT*ôÎÌoõúµýy;ÏA¤0s„ô‹yÐaí¥m‰bXÖf*Õ²•µS¥4¸ \£”Zàí¼dª¨öàQ@áæ\v*`4ÂFÀ¨¯Ka½1w|¿Ö|×ÿ< ¢1ˆˆ@xgiw°ÔºgΝè<]iÝ+ù¾NžÝáèÔð·PQ‰0R‘±v*RØm"OÒùMrpïñ#ÇG^œ Gö7Z¦fŸOŠã{ócÓç£ÉÛ~qÞ^^ÍðÚO-›âë˜ `Ó§´%,‹¥yÈ‚„5¨<õ0³Ll#ÝNñˆèîañ¢ @xׁEm>¸•çhÖYÖºGOr»B¥[9aÔÙìž/ÃüÖ" …ÐÒXS¿ÂÂÈfiT×b³d™¸sƒáœÚx ÚðÅ|8({„˜/‡XøTb^Œ,z ϒ¦ïÚ¯ó.©f^ã—Ý&¬³ ·ð ÞQªL)X¹™ŠÎÚÙÍ}@1 šc3ldŽ×”N͈UçÚ,˛ã‹+™e|’.ƒyv<Ç°g9Ö.6Ëì"6K y~9wâÖrÏÖà…z²lJüIƼ-äOøT"=/”1/lø®ý:ï’ræ57ž®pÐÏìðXµ|/Žï=I»Œ¹]–Úï,ì¼tlÙ¯zêp…‡WAòÎ>ãXýQÏzoŠþ³btVt'VA±šÐ+¯WÉv¦u‹ù? 8ìܟ¢®±+WצÝWÅ`VQ› Æ2 ]¯Lf҅ĴYšè ¼ž©NTË+ËR®«ÜœK=­,¸íD©í -ðU~Ähñ¼-†q-:F{çiøl˜¦áiªè0€o ž±Â̪q,Pæ04»›3TöÓ6Úⵀ¬­u*-COrež¬§ÚÿØFóÂsè$¿Ò«öf;³7Ûa8e*Ƶ¿ÏÒf/¦Ü^LU`Öð›>`ì‘ùb:$Œî÷gû“jªD²8¬À¦Aåä)}< ºï~À*¿‡ö|)¿)êDè݁]ÔïxL¯ƒ…Ë\+Ã1Â9©°BL"U@‡Äu;Kr4UÍ=i™” --q$„“kšãOUâ9Z!ćóï²=ÀfÑë÷JˆÁÙÇÂËg¿—‘ò›Þ]/ÜÔ¸¯4Sžæy˜Ú9@x`/`³ßÚJŠœ@f80‡9ËrúìאùÖV\JçÄü7å»PÌ`¯>ðv˅K[2kIC Å,ÆÌ`º¦¸½Á«Îôlüsçe5‡ÿ̝™ÖBKó 9aÖæ”p¿”AP ‹Í¬[-˜„¥‘&ö}è_ –K!Ëd VZbvW–g’!“n3ŒÛ=À×[˜á-If¤1êмOq8cìwn¾cÞ-ðdÂZìl tƒRk¤#ã¹h"SË~r‚­y«Ì ›€­É à9@o‰äAh¤í4–OÀ=¡Ì‘#î\ J ®,—'˜éU -ðx̑âðؗÑwwÜرÈÐŽBßqæÜ2¬8GZ$ðÁìÄ<ÓÇ -#c¨9âkE߁ò®/âújv¤J_¾× †¦)L/=m×RiaY6ÀÁ_"2XI–$ŽsÝ0‘¦ßæÜȔ‹ -· œ¯Ìz^éÑ -Çf¹hjàB¤¾©y‡¡‰Î æ3<@m-3KSÿdê”P¼ Ï"«6ëÖ°-³–…„ø5xKæPò6×Z ô°¨ßôhˆ°Ù—€Y&BÄCñ0Øzu¼ÖÍâç™(íÙè%s؂OɨÖv›_@®Á÷p÷íÄzBËìJ#r¥á»Ä‡ê¦ƒdô‡wšìKÜ÷.*!Ú0-ßÂètij˜N@A€è-¢Ž8Ôϙ¡XÕ<¯U<<ót.ÿ”ù“™ #œôÕ¿•®_ô´ë·ÃÆeÚá1ï ‚áKèiúê±À½žv}+÷ݎgñajZq©ZʈdZ(8V¹JðXÕ*á7ãX}Øë_T§°”ŽÕú‡$:µ¨ -æ܁¿¹ 07Ÿ1ޚ`‡ >[6àž­‚EϞ9¶N’gè‚à°¸/"ئ$³(ÌQ™šƒ´DO.±âKg·Õv ¬Kâ¡ÃšF:U)†g˜sŒ%àvMáÜ4Ò¬$tUk<—¼úYmv‘9)ͳ9F¤[¿­áýif5%iä™ï5Ërfy¥Û‰€ƒ HÅÐ)ËÑÞ¨˜H²ÏrÀÌ1ê ì}øh½.3Ðû”¥MÌéƒ=~H6'æ®&¿ó¤3~5cyCïK@7¯½Ÿ6ߋxÊ©»ñŒûAùGÃÀöàg|ŽfÎ.$M™²2-c ¬4l[*DóºLLÕVhŸ-Sµ­M-<«Ú†Æ+!xRzXDɆCõ¨=5|bBú¾Æ”ôCòφa;ô1ÀSrŽbda3Ï _-¦d t‹¾Í2Úenc˜ŽdrfOÁ^a‰’æc.t´€ DcìBÀC<-0"f Llf¸Cï)â{QâDÔß'¢aNä‡Nœ(N4KµC²ïf%uQ†áX /b™ŠÈÁ€ç¨¼DIÇ\â{DI°ÊŠy!ƒ—‹,Úà%Q2J–€0Ԁž¨zQÒw7"¤Á¨-îø;QqŽZäÛy:CĆÃT‹ŠifNv&Ó2—”æ´L¸.ÑP˜!%""¡h§Ò~=ê@ °@¿Cô˜‰þõñ|7#âù±,ŒÖbŽ¿ñæ¨d‰—ž>"âÅ0aqU¤Afв4+Oہ˜vFnã:>FÓv¦R©æ@´ °@»#ô˜‰ôöˆt¾“éüHÆjÇ߉ts4rg5³^÷˜t1 ÈX8üíæeF0ÍÊ -ø¤,ÓÞ/bv LED»@´ °@»Cô˜‰þõñ¦¥nFÄócñúÑ:ÌÑw"Þ•‚§‘™¿Leº$3æF͜$âUÞ6’EDFúKŒ‹Æðœúf ×Çâ"*e©.I‹ð×ê{5øj´;¤ðýˆDEŒbxŽà1¾þ ‚JŽx$æÄÄ#˜"ÉPžNЊ‰GYL<Ûüs$Øÿ‰çañ"˜"¡öD ÷ÇÄs݌‰GCñÏyæà‰7K¥Y0&ÁüIlòD á*¦Ia1õHVó:aÎcvßcÚ("]ÙñZOzwL9êcL:ˆÐŸPGOºYÍ¥Më`ak¹c:l>'IŤ#‘+& fþAÝ"|tÞK4nà'ÂÑÍ{Š¼–¯¨ŠŠK‰^åD*Cë»‘Ì ªI^ӕV8“fÀ ÜI†¡V8”`Àk¸”*¨·”ÖU¾¦2´¾· RuçýMPei<7ïs*Ck{`Hó~'€®áyª ÚRW¹¤ÊÐúN)šsKpÇD.Í»¦ÊкÎ)м{ - k8¨*h¶\2©ð\•¡õ}Wæ¹ -ïB×ð_áss¬2´¶ ‡4çÅBhs?VÕV…ó®ÚÄÅIۑ‘)¶¹¹"™:26•¡õ]]A̎lN‘”Íš¸»*¨¶œÆ~°ÚĉÓe¯å ‹dæ2×òˆ9ºLãµ¼bT«'C—i¼–Ã,’ŸËD^Ãi¤ä2…×qœE‚s™Âk9Ï*hVOhžáëøÕ"¹Láµ|k‘T\&òZþµHRžáëøØ*èVKJ.y ÷[$!—(¼ž .ƒK^Ï Dã×pÅÍÓ«–X\"î^º —h»†§.¾%º®á­ ²p‰¨kxìæéTK.u gž—K4]á$ÝM›;õ‚ð["鎽y*Õ|K$]Ãç„ÞM×ðûѶDÓ5|AÚ-u ÿß<–uq­Â“‘­È]+#úO£â´7yÕMŠê2#³y°â»°µ ÜÇC[-‰ç¹½&k!1à{[~4§®­­`¿šoæ¦ï.>y„îç¶ZÇà üpˆUŽè×è!‹éÀV7Š^Qî€ë}"LÑHÜlÀ ÔâÀ0™³ù•YñÜýƒN -ÿ¸Ê=.v<ü¼=µgQaÛ¼ÔÁù¯>³Ü6µ¿ ¯©#~k/à¦øÒÿZŠí1*þâÄO:„®ažÊ_ëÕ‚Êìf”+xöôˆí½¸wôâÁ•’PÌT Ár»8¸‘—àí\(E0a^$®/&–À8°ÝÔno,hSÕ TWDGÚ2BðjîëX™ýcÔÂvngs…¥MPt]¤DŒ¶"@`ûÎAðÁÄV9ÄÄèg àâÛû(g±T¡Š¤r :êkæ*'UÁ“XÞz_…+‘¶f£§ƒ2H¶Nõ,j7ÓÙ:ÛL·…Ù¶P)$’3RC…Ô–ôJoH®gÃËï.K×ßVVÅo~ómT7D¤®°³•9íÅvÖDô™‡Ï{q£=‘µ5Ão{n*€œÙ$KüWã -Ÿm¼(~ÄFx~âãð4beX‰>†þ¹o”ëÂo%4=ĺ—ÒGjBBOãA„J€H=‘#® ú讧°Ÿ±>ðE†eÂZxŒ#H‚§ wŸ‰j, D£Ïîa|ðft¯¯{¹íTè‰o”ñ>ŒVX?ûæè \”?ºþø~ÆŸ8Ê"Vø† -}""ø¾‹|AàÉümvà‰Ïr —Î ½ÊW-j«Ùì%KñÎ^ç»/—«/ô)xQ&nLôh.¢Š¦.¢>Ÿ¦Ú¯†h%ÎÌNºgÑSéSz˜•—ÁüŠXV­a±iÑεáa)”ºµQ°Û__úùÑÑÒ[}? â®ª4ÅÛÐs‘Q»…þ a2ŒT®…B³S†:Ü¡ž3´—Z@ìT²4´É%Ôc!½ª‹ ]fÞ ¥ ûB,ЅŒ±ð&t1•ÉvÇ7¢{,³£ê.)¬~çÇ'‡ß=¾ßú²u»Ûuûű8þ¬…Ñ•fêÌæÇòìŠv’14™¦Z -kGIÚ"cfï{ U¹$ÇrÍÚÈg*AH&À—eÛ -ËM2 \Ó+]IÆ,Oà 4áÈ 0 >[ÙÕÐ-UðS%~ã.cΡ´NS§¢™þ° /`ÏÁÀ߂¿ZCôJŠå¶gGs0?@»ÅÍ\1ƒ"vj‰N ß0mó4O`if)ÎÜ\§aãžÌo:è¤L%è´{P¢˜:¸î[ , -n+Ò0(+p5i²õۚàæ! 3åNÌ÷sƒbP¨_´$3œîtg@¼d<ÏUv3”°¬™ÃÌÞgo%ͼ^}æ$s*˜ò‚îĽøÂIxá-¯ÙÇX‚årŸÕvì‡CÿjF’yÑ-B¡ZˆÕ™5á·ª©Û WÑ"m -ØãŒÄY»ÐJ¹ôî„z”Рé´ÕÜWzÞshð&3Dãf^=c‘dG£Ô‡„¤÷йM=NœÉ%õ24 ¥Yìn(ïMëI³’…—œTëÐÒꇩµ3Kj•[>~õē/†hÈÝ÷¥OÍHÑ`Š«æ¡øXUË4«!ÇÎÙÙ_€sV‚o—£´ÒDUq3DÕ£©9 æêäûÿ}ê@‘Îg#(ºjAY›‹—¹ÂBá™5ËBÀ™°%¸µdÖ7ɘrò*“2Ø×$çZã<ÚÈDà0¡ |%F>ÉSs€µ«Á% P+Έkš +øšÏÌÈypÁ!"ƒÀôd]ɝô¥E"Áålß -Oåà[5zžpì$¦»f¹*p2ñŒÙ.Aµ@eO:a¶>`®Ej«Qc0qÂ8L3Tê“ T•ñ“—²ª‹º´É§.2¥áClÍü¼t™ÃȺ¹¹³ákgÏYC±·zVÛ -`œ.ôÆ]+œ*„®î> !oáÁïքŒ÷ùïð Êìw.]cÂë©Ã澃‰ÞÝÈÃÕB>ÏìH€–[—)˜ú}—ð[Üg ¦Çã/ÒZ-Ð ËӀ¿¸žîÙ+y½Ajö+õn‘ö¥(ß̍@¹‘“‘K´ý Ïëcx!e¶êÑ4Ç+UfU´ïÕÙê½·òÆÓYei•\Dßý2*-²xV¬P¿zñsy]—–¼Š&»¼þ*V©,/É÷áB#ڋ -fžö²bΡ 7d/4ՕsÞà½szz­÷Vιó†áu: ż<Åøx#ÉÊN' ¸UáüdI^±LhZ.*·e®+¦*@ÑCgîU¢âUôäÅnøšÍã­E½WŸ›»ð¢"ü ²(ÜíÊoЯ/Š7““bTôºçLJ¯¦ãE¹ç¨sdiÊPÑÈ Îjè 6j†ÄTŠŒ #'þxoё -k& š?Y5\K‰|«0úo‡ôm¾V|£/c»ÓèÕÀ 3³-~þTƒsYÒá¾Ò·=úZñ¾Œßßdp…¥Êð*ËV&˜Nž%) -îª×ß_¦­‡×ÃQoR Zç½Á/Ó³þwō”Çƹ)‡KEè­ÎÈ×ð%./‚Ù‹Tnoÿ &i©¶uÀæí”eM@.ÇD“àd”É̝!xcÒ¶©àp4d˜‡ ñ‘Ü^)ÒÜ:A«ÖèÐ*Ð{¹…X5[F>˜ 4jf4u™&öžFÎlfŸ­_µQ:ˆiJ¨y1zU%hØ*4<EJN‹ -²-àwÿ.Tüã—wQ˳·TúFÊÌ\ÆÃÐ\l‘óÀtՉLæ¯ÑÄu $̋ÂpxGo+,[MŒ ÿ9N–J™²Wü [EE%2CÙØF¹æ¦?@;'v'fèÒ:™á¾MÔ4#„#g}ñZePt€Ù{MÐæJ<Ä»¸> ô÷Øê{îÂh.hK;„yxb}'8#f¡0)@Th؃åÊ ¹ÚÀ¤€cM´¦- 4'èbUB›N0aHÂìm½0Áhç aæ:…‹¤­í6® 2·¾{Beô:XÍH騜¾L‡~㽬R”ÛGX‰#†/‘ú…TÚ<ì;„X'ªß¡‚œìðlÊáÞXžÀÍ&(éb¤§ŒÆL݄…1 -ïTL9Ø7À¶bƒ©!Ó'5[D*#b+#ItÌ{PboüFÿ¾ÊÝuŽ2۔å9Çë%3–ƒ\¦S·`‹¸3ĝ·oWò20>®ÉÍÀðYÁϼ&G³Y‹§Ùôö5¸ZL—˜¯Aºägƒ”¸¦¼Íœ¨kq7óÜZüÍÍÎB›ó8|nŽËhŸ3âóZœÎkµ¹Í•‰ý&ît¦ë03Qçá+x‡ý¿î§æ›hÝ{|¼?2 º_ ŠÃމÙVÇG¦ezü°ß™ÛÁ=šN}Ü¡-˜wÑÃxÎÀÌGW—ãÿÜ—wx͗—©}¹ùŒÿ³ÿ–óÚÞ/Z¢ôöZÃßóUµçp5ú]ß l‘ëAßiсbwZ.Õ$؎˜ÿ”€âcgÑvÿÌouηÅÏÔºÅÊ_ÅÜWø/lCiŽ`m÷lHe¾qˆ#d™i¹¥E²`jsû›™Å£É[3aŸ~rçOƒáÏüíí{ý·ãqçøÑÑg­;ߚ „ãêÎ=s¿.|£;ËˡY {}3d|îà¼Ó´l ¶ž¦;®ÍpÐßù¾7î™ã‘V 9štº¯!ÙïŒ{݆ÑðUÑǟúOGîQÀ † ÃÉó¢;4Gâ)þj:j´Ø@I(¼s¿8kÝm}úIëv„ %ƒ»-|yËÈ­;Ï:£Iå(†ƒÓioRo€ËQÁØQ|)m¼„ôݸxðº<=µ•Å‘ābOýBûl~Õ·þÊÚÚyÚì'Î;…ö%t†JÚO­ËFögh:C{ߧ”¿*rÁ‘ždƒÓ "‡Ì¥™½!75ª;šærŽ·çf¹d,kj£_FË ¶ß/ÌAöÞ(vñ­±÷¢1Kežyð¦èN¡3öGDQÁ2Q{Ùnù^z2;Ãö$uÜóéÙÙ¸˜|†ó²ÅíÇýþõ«á¨]¼Kötƒ[SˆŒF¤L¦£×ÅhÜ=ï'FÐý²uh»÷àì¬xeÞqçEo²&¿ýt:•-Š»ß_ö;oí×Ï>8£÷[ßþ`éöx`;U›mîîú0§ÛYàWÆóY×>þ±· ël[GØèœj1Åe|Xõ..ûá°rÂF– H HŒø•³4RÏÖ^ÏÌ.œÔꞺÆÝC øî¤ßô»“~wÒ¿OíîF^íD€0sˆé~ˆUÏoë`8^ÿ^ŽŽÝWÅ Õ9ÄÅ >)–Ok3¡¸u¶nCtüt¼d3ìl•7ÖVù.ÛYÏj³¤l3äêÝÞÄ=Œ"V"4Dú™\%h%§`g‘PÒcöï5°ŸÛƒ3¾éuù©‰-AoêNڝÞeõ©ù䤭?u“¢þ™ ©¿*£3óùª3óæò²|ÇËv¼l+å‘kō2(V°ãF ¹Ñ~¿35#ù¶Fó‹bCœ”ׁ-aF¦à‰½ÃŠi®s—~Ò1µâpISp¶Ïåe23ñ ó2SU‘“ÉÞK»2 -©$ՐÍÛæšg)Ç|k–ä˜_ uB˜­cŒaP@(‘s–.!ÛVB¥i -×h˜5¥”f™[JÂHƒ ªÈÔ§sø´„BP y ¤³×M[r¼%ę@1åPŽ°.!ÔÄÚJ -eZˆŒaa’kª;`æbÌFäJ-¡Œ|Ÿdù F«۞"Uæ•À½¡Œ„åømaWœ¡»N¥F~Á›| ¥?èüÀ‚‹ð‡]¶v©Td9,‘¨ê¶¦=ïàVL¦S{¦€Š}‹—NºÑK‡«ÝÚi¼v¤Ì28ù8„„Û…£H0H¡;Ö¶ö¨…ëFoöºù(Ëfg Øy&šèÏßy—±3æ}XÇ.³Ê4Hx¯8ƄÉÓ6Ü·Ýb¹‘SÛ"On^DÂÒé$çVfÏóTqÛΌ¢±®çæpÈÃ^÷†rp>^l&Ÿ¼n!hËCW˜Û<¶Øôþ'÷ÀY¯¸ì ÆEÿb-J|¼ìϋ~Á‹!EAZK=þø}gÔ …xKÏÝ/.Í"?µ?)zì~Ïôé#À¢A1¶–ÿ¼üËD==ùûs³|¿lÍd·VÑúNœr —7Ꮘu՝ï½îð´hbú¼AµÉ%ÿ.YŽû¾¹ôŸÌ·zZ<‘ËS3? ՏòòÓ×Dóp—1}lÕã -  -.2Z§Îs¥ñƒJ˜ÀØS0=ƒ>êÌõ³–-C•él½Eøí‹v¿ÛlH×>_ÅO£¦‹yè³³Îi˯7 B„BåpÛGóñI" rÑï]|æf÷Òß“ËÛgw˜”xßêÃÄíKw‘ç’½*Rž¥»#c#ƒ£_ó£ەàÐ\ƒ -漪‚y’,¯anëy_çl>S_~·ˆ>þ"rwÏmôRW“µµó/²÷>ý7ÞtÔ=/ g€,әþó¿ŠA$Òl ehgA_aÿº|á„Ã>Â÷GýáÏ«Tªû£áeëè¼s:üy±UÞGB7Jl#²MÇų£Ãýþt´Ð˜Þ䮓w1¥»}§jAMBÒv/;ݲ‰ï„úJÚîI`眥¤Ô!Ám@qëÁ›ËŽaªûÅÙpT´¾78é×à|¾6<¹ßy9îžCmº]üïŽo3Ž¸ëûbÄåÍӔ_vz–¡yßëbdM|ʛBN;£WåFçÃÑ/Ÿ9DÈõºãQ÷³æ fîlÇÜßsÿ«á­³|NZY1§U² ✿ÿSåYkaQ,Aú`p ]]ÉôY§_˜h‡ñì¤~¿oÿõYg<.Ff‹ƒŸ>C -üø ®üçŸ<ëVQ R“þù_ôsƒ-¼ãçŽÙÆsu%¯ÛÏí·ž'þIÊànQ| ULf-ÒP}óGEÿÄ·O¹NÑ ”ØÐpôÏÿø–ŠéÜÞ¼Öf\ ›¤F -¼í„öËk,a{H0òíyšÛÔY¸.Û]VÇÊíŸt^å»ãain† CÕY®1˜ƒkÎ$¹ÔÒeÙ¤†d3J·a6Ûbý -.2xô•È[û_IȘ˜§S{!šä_!àj íαŽfø°èJ—ö¢ Ã.fn¨õè+žÌ"&R›Ö'=Í´M(Nf—ã ßÙ2J{ôUž”PÂã†Ô˜å¤)v6S©r‰Ésáç PB/™ù×àLbœ–BÂ}Å0-š ›XaÐK?¦fÝæ)ƞ2a&€p*è&ô{ÿ+•œR1áz%X–I‡ÌåhäþƒË ë‘q £@:Š0÷p§qf‰'0tÚ¬{aCî3*gª¡£óNŒ™ÖF©GÌæ »šòDdvÉ+—×­‰Š†n‰Êý*’ Œ8‡N¦¥–)³F6ƒKãû$!N·Ím(·iDˇ[j:” -ç%c£–aW¥êØÂ*Vòƒýfä6gJi®pIq[óÇáÂÎI˜Ž4L‡n!$\? IJ¹f'&©²3 .]‰7}ØÊ°1¾è§ÂžÑf/*Û ³¬ufç‚ѬúaÚ5î0 éGÉX„+“ÓÁò$þI¥º›aajÛ9ŸI—Îw.… ͔Œ®a$ƒHÚU }ãÏÝüpå«q¼twuª"’¦Úrà /eǜ.+¤%Œaޜgý>Gòx²€ûJ¨7Qೂ©#MeÎ2Ëñ…9ÿpMåYŽÑ4T€[Zc0ˆÂñ’ÂVgxbe<`N¹°»CË1g21ŸñtI†ƒKЙíΝÒÁ…çVÄ,…‘ØpöRiØ<®ÂlLP2»—…U§–[hlfö`颉*fÊl¢AoÉlvǍj¨£Jþˆu;Öl´ˆÌ9Â9ÐXjm™§6‡Yjw©f¸oS#O"ãÔcF›.qqI1ÒX £¦­æÜ?(ÅÑ"™<ó«?³”ý±wq¡-+‘¸†¥‡ŸŽºç½Ó¢¨ñ¸o¾ŽÈŽ†æ£¨\ň û§6¶d%*ßÔ"[¼aÀ uÛÒ=µ¬öÿìs®-·:ÓñdzÖzö²¡bftàÈÑ1ɕeiš"‡7šWΐg˜Ågƒã@´cˆÓÃâã°ª#I#Í¥euÂæÁž€lCÕ -pø?  ²(àm*©,eT<µÍA¡z†ÅÙî êÕì‡WãfAG¬Øðs]ž­7g:–Òÿ¿$À¿À%/3ò…ÄãØT®â‰VN¾ ÎÍ~ Ü90ª\æßÀ¸aæ8^©3Ë^ͱ¤ì©nDíN¸´t\ڃM‰ÙãÒ¨–È«¹Q S+d™Ù·ÊŒ¦ŽÍ~ ¤ÚžÁ(¹èÀ¿ÌѕbÈ~?(áÔíÌÿŸK"Q€ãÀü¬LªÜ^ñÀ®?#ÈëÔ©\Ô£Ù^ÖHPς¥ÍcMp½²W¨Z¢ $aªÍ¿a þPœœuF'ñtKÜ°|II ¤bE‚~^’Sá%} ˜æI4Y@pàXådM·HýÒ±BŠ:’ÚÌPK†T©p–’…Ê´Rʴ퉝Ö¦—;, îóA!µ¤Y,Æ%⮘½ªmîŠàÒ;­xjou§\ÏrO8®^¶7¼@áBãÚ -Œ¥:uÂ#¥Fb.Ñ'ËÒcÑ\>¾uÆfJSimÅÈ4S)1O³h\**Ig¹•p<‚Ö~Z´þv[‘‰/̐þö™³·½1XÒ(Ð'›‚" ½(zÃÓQgð7ÔIõ;ªšÙ·<ÛöFoUlveÒao<)Û^ç=˃!>­ªÌ3—LóiÈ?ü4¾•iކj{´æ…P,‰/Tÿb{ßéOÎúÿüßfÇÃ×ö.À“ô(ö̧-ÞLNŠÔp:~8|5ðÙðò»Ëj,àz9þ<ð€ýbrΊþé1бWµöJ?¥g;“éÅ›ÒÓ{}$Öó#$ÔÑÔ4¸ë»N{“WÑïðzмêLÏÆ?ƒ »øôˆí½¸wôâ|ûË´õ°óz8ê™ùk÷¿LÏþùß®åýѪÌ~6wK£#×Ò»Ås؝šYž˜þwð‚K€…¾Î\vyçÇ'‡ßO‹?ßmÝ~sј{fÁz'Ӊ¿|òνѨóQѼ§·DíŒàk¤Ìb0sŸ&ý ÿLÂUš·3¿îŒÆw£ïqÛ×Ãt¨1ü0^ЂÄ\;כqùëƓê¤785Ãfu(eHzTL¾EšÔ WÜü‹k1ØÁp°¨ë¥ö‡f{ŸÖ$5}Ÿ‹âÝ Á–¢Þ\÷àÛZ;£Îì^ùä7g -_¾®Ï íõXä0ήQˆ‡׀ý}Ð%ú帞m8C £©¿R?ƾ9‚›P®W¶k+Ï~¾ë{8ùî9ߚ¹—‰“Z8âŸ{§ÉYcÊ]ËkÁ¸eÊ!ã6]9<£G¾<¯Å]|Ók1@µzhoêmÔk2 =™é•Cz[kHo¯É|<áÂñœ 'F´8,Î&OG=£ÉÖÞüC×FŠ@öx4œŽºÅ>D*_1œn×¢Ťsjä«÷Йü;ó«Sg$©µæ¢ÖòçÆ~¿(Na-~!§DãƒÑðòÞ¨èØhøªvOjð}ã?ˆÿÙ°7˜à€n?Ÿö‹QiÁ‡tfLà~B‘¾fpÁšçg߂kïg³¾#MšÑXžÝ{NܕñÖüzñ¼è¿>·°=z6÷ óø3÷Jê?ÄfÅãñ½Ñäd؝Þ/Î:Ó~¬ð‡5AmDÕYJ -@\vNOÉì‹.°º|6¾Nfa~xˆ&nwzÙkÓ1K!ÔC¥lû÷¸uo:¶žwƓbÔû¥˜Åzï1c-ZQ­W£ö§“ÖËÑpz¹¼mo<ìw&Eë‚})_¿Ô:o]v.‹QkÜ»˜öCî{ؿФã(Ø2RÏyÔ`2ê Ɨ³áºoM¿z§Ÿ‡â’g ±µ¸éÝ´vۗ£ÂïꕍGÞ:’*›dQS÷aeÛ¸+‡>°TdÂ7%£ëAgðº3> -äb¥©|6*ÆÅèuÑËvëÁioÒ9éõ{ZÈ·ç÷*>çmºFùš^¶öÑ`&NZñ†áÿ0‚'ÅøܯE\­ç…YGÓhqˆ¤ôÈÓéäÒ,ÈÉ°bæ;xؼœv^­gÃK¿ª}¼þ£þð¤Ó^\Nû〰ÌU_ /g˜jôãsEãŸiy¿º÷øYgd <Œ87|ðÙhxÖë*ÞÎNH©-dR–»3òÁÅIqZå³û«!_iŠã½´ÎüLÐï ŠÖĬŒŠµSÕtŒÙ@ã¹-Îøñ‘ag°fŸ O½Z 2M<ë™éàe'Ó#³Áö‡ÃÑ£h'ð°ŒfÛþqhVÅpðÇX#PÙÂæp>>x3 ǧXØô è÷£½³)®€V¦–a=0ÙÜñ]Iº{¶Äâa[¸M›òߧ˜ÑÖañÂulg—àée§Ö°™Ÿ§3‹p¶•áa‘°9qa¶ùQ·Ó¯:‡ÒhQu“^Ë «3öÔÏ3¶¤—ûaûñÂ7--¬í^Dê݊*ÑRpêe«:PseÓhHT>Ã8ϕĝt¼LCËfñÂý¾Wül–Û&A7lÍe‹ça§[„BAËZ㶘m¾˜œØ|~iª4Âæ«'6‹H¹ŒìØ6^·™l'í$’Ë S}8í÷é„qéZæ×EÂߌ¾wTôÿؙ˜ÇMŠÑãûã’丠íáÐl8UK­ã/À -¯®<¡öQM(\P:¯± `ʟõ;ƒÂœñªZDoß3Îð¬59«T®ø5ž‹t‘ǃÓâÍÃÞh¼ª‹³ÏÝá€Ö‘ΕÙj‚¥õ),½Äý³T@âU8œì0èÏÍòŠé[Ë#숝ç9,µæ9`©9ÑáêÃ0¦Z„ ˜æ(™Ý/IVcpUÓpU’“©²$MOÌûp8˜ŒŸ笐£fän¿wi$pðм1øK³Ù½^¤õÒ##^÷^›¹ÝH›³]ôšKÎ!þã‚-ü[4«¹º¬1à—_äókë.<Ggxß\bi  9Hq~|ŸXí_Ÿ§½éE$Ûÿñ]#[F›]¦l”… P}AŠ¸RDÐOcz#ƘÏ7ŸÏKó9×ö©“uJ²n²¨Ù‹ =ÇKÛX…æÎ÷vMìÏ®‰RÛ§³K`5±XëÁ³£Ԃ֫ÈeqÖ¤—m¼š`åv (fÕ$™Ã8K3&ð¯Z½îg0yË؊¥h}'Xxïü}xÒ¾4Š&†åÍtl®¼ºÓï¯h6~Õ»<1}5Ígۍ -(ÌY@G+šv‡ý~`ÓJþìdwh2,z&r<:›Pü›áÉãÁÙ°I,«(÷~(Nî|ß;-†wž ͹óÓòÀp D]64Îu<é·O­­Gá ¹‚Dðœ{ ²ÔÖyèòôÂüÜÔï×åi}ô6X"éŒÆ˦4 ÃðÈøPªÑzkUãøPª> 9TvÏô¤FëГãžTí¬³Á¤}Ú_Ám£ËÑÙp°”B»±Ñʽ¾j¶Æf¸ÁÚ])´ŒÛ'=&—Mú¸=(^v"ø‚V݅™¹†æ\¬ÀÖg]tÅЫ9Ÿi8>ïq¾XF-hULÀlàë¹Gnô™–3ÍtÕiðæ²]6P`÷ªšF³^8ôöU5}9×tACwd–ÝNKZ§ÓŠ¦ýÞ2nbZ€·¡SÖ{´^v—ql1^6ýØâtôøÞÄpÙQѺ7=ëÿóÿO/Wè3à -ñÄhj㇠6;›ºËVmäÌ~å¬8Að¡Î`àƒªÕel¶Rûè^IJÖ탡Ñ]O[Ÿ>z~Oä­¿Ý~|ô´Åx*õÿ’'‰„T¹¥úà…‘ -cÙ±J5@¡‹ì‡ÕÈJ×½x»LCZ'ç+5t+®Ví™UgFI1©ÁÙKí+Ùh ýt\ÜvѧP­Øߣ'cÕ>6 ©àœÖ{SôŸ#¨‚3òý[Û×#ªd EòlüÀ҈ûÔ!“îìSÞ0÷Tù]ÖhÔøeö±ok Ɏ:¯‹'Fûî]ö‹{3†••v“ÿïÿþ_ÿïÿµ|Kô¯úcsêvGg£,Y›®]7r_Óô?¼jA–`<ï®Îá³û÷¾7:A礱rx9±&òm÷›áIë©ý)¶RbU§È7‹œówö{D{Ggê~£Å_å¿=ýÍ_?ÿý_ýönçÇ/¾¿yº·ÿõèÑÅù—/ÿúÍÃýâöozöø×éw|þê˯¿{ô‡'òß¾<üÛoŸ|=švõÃüIv‹Iù«$ßÿûý—_$¿þúî´÷õ￸=þ¿c^óõÝÃQ«o&û/ÿøï‡_ÿ^G½¯þнßnÿöåÜ»Oÿl^¨ï?¼õ¥þË£Éý¿ÿ´/ÿ²÷Ž‹ááØÌûäüó?¤¿š>¼/ýÃþßû¿ýÁ¼æþYòÍI%¶_ëüLÿïýÛ½íï¿5n÷åO_ÿþÕß¾þrܾøüþ·¦o?:=3¯Az=üÏã§Óûg?ý ÷û_÷üòlÿ|rp®ÿÂJùÏßÜï²Ã|ýûûí‘éôøà?^þÇÐ|úÍ?î?>}ü¯û{Ùß}ïhïWۉ;§Sóšüï·?ï>調}p.ïþþÞ-ñ›Ï÷¿ýâ??ÿúà·ß=<(¦¿ûÃ÷ßüêün·ÛyŸzŸ?8;<·¯fɝŽõ~ýŸ_öþã›Óýþ­ûíÞèó¿Mïýæ0€Ï¾¾û͹0¯Iï~ÿÓ×÷Ýß^|þՓ»wôÅß¾êi}g|&Ù篾de÷þ7ãï åôo ýƒHN¿ìÜé˜IfO¾º½÷E±ß×Ï.ìþ|xëëƒÇ¿ÿÕ¾ÈTx¼ÿø¯é¯þ †ÿñùï¿?ýë—üäW?!Þ? n™!ý!ýݯ`ZþšþþûHõ‡ýWŸ¥{n~z˜°ŸþÿÚÞk;y½ÿÖâŒÁäÐäh2M6&Ù›d0¶ÉiϞ}±Ÿæ<ù:wÿ;’:©›ŽÀ·fæ7˜nª¤R©TQe¨åܓ¸‰ÔÛûˆ& ô -@CLK~ô‡=AÆéOñ÷|…z?ëȏ)hޞ·8¸K؉¼Ã›K.ži@ïÏñØìïeˆV“1€WÏ4à­L™Â'7å¹ ߚûÑw}&7BäÎ͏I°üûJ·söÜ·»²ÏO&fc&8í4"¯OÝNºžÍ¼æ¾[¿ûÔþ3ºh2þ^{D´œõó#ý-ãï¦ëdîï}”ýý ºcß맙ý¶y ãP¨9Ûríýº’®Wm2gU(ê0´¦¶dÓÎÕ°'ß&{jJ‰`x’ŠµOévùt¾œœ€¸%˜Åèô ¨ØAõ,Œ¡åû³§…wOæò#åC|ÇÉà›ÃžÙF†Âõâ_\f1(öIþψNp68©ÊÕBzTö ¾‰Ûw±1iù®¸ÒD¼Ý÷ZÃ85>E‚çfdNZL;kö'Ø\æíUÉñ+ؽ-6­ü 2j -쮵 LÎ`Í.~òÇPì«ÓL‡úÞwá:¼Wo<à…¼Ó1ˆ-Kd9¯dšt»6³a“ˆä2ÕÞRl¼èUì½B/ô 6OÞKx þÚ%ûœ^Iëë*Fæ}¯=QÃ2unj`^_ßd>e‚Îú’=.Oñ́°æÜã-ówš­3«ÍÛ6Ýþ錊°Ë;¶/^Òä ÒÍï3øÙ§)´WhÑiÍ}›‹A0Þí%óoÝ"#цÊgÛG¦Ï](ïǹ©ÿç=Ýyú:òß3¥›íÁ*ü·rƑtãΈ†{a[&♥e÷KÆ  &êûMÛ' 8[0Ñí!¦ç¼åyÿΝ<‚§¡-§Ð pÞºx!<¶ÇJÇo ¿¿ Œç¼¤[ãr–~ISñbÖ^¿yP5e<ýó(Ý:·ýÜSô2”ià›uêð5QK†oTG=ž¬g7¡Peb ÊËN’¨Xv$øg–!*žYš(÷ž#Ô'ê5ÙŸ&Ìø >€hЏÐ×åSò, K7ýˆúÓ3I1B4\„†ú|`¼Òÿxþ²è -Í_ŽyüˆÇ ɃoðF2HàO-Cˆg¦ ‡ƒše(4Üt™·(ËYîblÜÈ©É¡iÂ?­™ýÛ¾±ÆP˜~Ê ᢱ#z!¸ õ˧zœúey9Hã€pk°Î̚# Â_î›_ Ð$ƒÏÙ³Ëãïs+ƒ"Ëü5Ǹ„!M nJÓª^,i__e?DšԎNó ‚S£ R|¿r¯ µaל›ÍM,€@¡?ZË¢nŠ,k¯œ/4¯¾À A#Aƒ0; <àö 76Ä-,4šÒ|jz#uÄA̬ëϼ?à`) -3³aeB(ºG9)Àß·—°?ƒC¬Î-nßRhÄ^ÅIË£«Øwƃ­ÎscfI˜`ÙSõ6°6¢ ¤&ö2š ؼ,C‹R‰y94,!‘<àÄ.# -04ˆÒ ·‚ýà뚶tû­²!SæyØß^ü\Š¤7àT^TÉq­%õ6×1ŸFÌZá44@OÊ-Sï†Î"û;¥ò_˽‰:31Ý%pz•6£pÇþ.cFÙr §5I隯%ëw˜òì<z3["ٟs³Ÿ«Tö|J™Ñ<ÝÜäê©Öð0ÆØÚsÆŽL–è ±ŝcr˽@=u?ZÀ~Ûå¿mw&èð:1“Õ“™.rs[¾ˆ©ríò9 ¡µ¾p›.®±»֑¹ýƒtýàgέ»ÖüHÁ9ès´4EÚ-"¤@i5Š4[DPë„ó£ vžå=\r–Qxå:éuè<-iu¬[Π͙O*ߚ¡ÔÁû4kqÚ¿`Ð #ž1ãŠÐð¨d‚f€Á:Í4R[¦ñôyB*8Q.xB"¤ÂM Äý‰`ŕ+ý…&ÊÑôOoŠ¡ßVÕvºÞ©¶ÛT8)[†"i"´±û YÍÁ)·ØPçõ\aù4û¬‡n•/ðÉq*집ˆ=æáíJØFq3šn­RvðÛÅ ñ|5“uoª£ÐfrÛ6ôZúœÞþҐýùÐGÁ G#†>]`®JfY³ëçõÛÏÌ4 -í‘afé}ÖsÏX¶'¢³õŠ€KUæYèÁ ϸØí"‡Ÿ6™ßœÇÞ§È:L1—Ãè4áÐWµœi¼¦^½ÖÞú…ê¹÷”n¼´Þ ©Ï‹àñ\ª*¼ ܆æÌ6öy -ÙÊ -½õ„õ/¤µ÷zJWzž+¡Ÿ+/³Ülq0\hyÌ}›“D.[4P$unõ 删ά÷ç@t>6ÍiR_ݙ•«ép[N‰¾tŸùÑði@9SúÔ>3´°GØË}@O€‘<ƒù©»ÿË×lü ×}„W€«j»w˜4Ü«¡¸/?ÏëÓÐXbPö|[ó_vâ#í·D@¾‡)ý€Æï3¤âɎ)WZÿ2·®+Ý°½.ÒͶ,<>C™¥gv@Ú Üž”C0Ïî\iPµA ¤‰Þ²:Þ~¸m2¶È‘ÁÔË}’eVa£#W¶X-œÊC닧%Ü7¿ÇÈcìÛØúÁÕ&««ÍcÞn ~ãç\¯Ý(3L½O'u,óB€¿ýõô&Qڊ,©›b¼úök©}»=pßÔ£ùJ*–Ùáj9=¶¸%upFÎPB§Ò¡ÏÙKî;2vçûó“I@ÒÈßÁܺÀ°—ÞþÔm~ºãFß|pÃÃJ–06J<}b\Y¦óít(ÒDúä(÷Ý8V(‘A¶ˆŽµlúsAfS‹fÑøì)¥#îeZðýJÚö—zk—&dá2DU/ÒØýû%¼åO®xš½#¤<Â_oý# 7FZJ³wh€~@iÑÍÍãChHœíBé³Y¬áÀ!ö4¥ÂÚ7žŒXãÉe*žØðMÉhGàÓ̍Á ŽŽ~0ÑñçÓg¥E†Gˆ½‚Æ9$½mÈib‡Ô#YÝä¿€Ú鲊Иµj$X‡Þkz›þ¾ÿ }%Œ@¸„aJ±ˆÖì¾AºÝ6éUmY9îhx€'°Û›4áM’ ÀZc"ÿÕ;r©ânϼìØB]/H1T¡—Z¡°&R9ìÏå>gÕ PЫJ~fV¡”Yt 5#!ÛŠŽfÔù?°sÅ}µ¢•È¬V»±ÐÎçŸã(î¹þæ§D܌+Ù4È õ ½šÌa¬ÄƒHDº¹­žrŽú~Æ(PË3;rî¼AhLù¯Çà'ä´ÖJ óáfQpÀ„öÅf™Ó±ïµÉ ü¿ _Eh5 ¿ó.1¦¡íVш½çíu³Ðpè;G˜÷5°+F€štÉ¢~OÅW¤•bhVABkÉl@°—÷ٗ|dL0‰c?ÂÉJ4¥gKÃڃæ ôª» Ñ8­î2o‘£•;fp• -uùt¸p<Á½“´”oYOg}ŒÍ£¦5˜uӊ£Nì×´z™üš_ˆÎs:<Ý-°C‰ß~cRJà–ˆ}Ÿç¡ ÞÚrn쬧qNp€&Þ"ÉÔ"µB,pnϔÙ8ˆŒcD h%Ô½{’¯¥[ŽX›…m#`Ðü×ùq”;]¡ª08Ÿ6óŒ9›ß:ŸoáP2[Ìþ fÐ -{Lža®R‰?²ñláÏbäĔOÅ>;@ 5ìPð:ö_@è÷—àþÞ¥›«À;O$Oº©£µû˜«”}Ÿé–!³“®LrÁk?ԝ7à½ìsn>Æç_({[˜I¶='¿h¦de+¦ EË´#ms¼šìÏ©Ðc%9€‘|fC­Ù6^؇NÎh¢³ÙW;êØ^3+§§]èö»°6§ çÿ£^yNÏäøóü3CÌÈxrnmÿŚ§ Z Ã;ßÁÒw,6Óőu<CX>îÐk‡g@ÃÞq3ÿé{ºÝ µù @ -F–©¿*˜üúç愔¿ƒ3kGÓDüe‡9R½2æx;gûuŽJ&v”àŠ˜~:!® -¨Ï,­ú偎•ùJ×+EÏ]ô 1¼¼15ÁY1Ä&ïÛ¿œ;ÿT³Èö7?ì"÷?ΞÈûã`§>ø£…M•üNZO±mþ+h djVëohSjØ>lÊ"h] FšWûyg/¼Èøß}NŒ~‡ŽEº;ڂûÊ$ù ,h °¾â>BŠí96.ŸsŸ¿=b7ÚöÄ!óœAk)¾Fö'5sæJ«ì»@ ¼i©dÂé×¾cËÍ_  àbâš©ü´pb’‡ºõ‰â yºgJ?‚Ü/(§ˆ“ýŒ?-?ÿ9қ¤þ•[>½pS|äÊúo |4Œ•êÅf0ÚíLÁlæ$­;†£åF™X@åÏ -0|PN~6û!5|ªÊ† -DFö|ÍÐî{©}Ì%ŠZÇ´3F:ù1²x?€¡Cß5L·¾Npˆÿ7Á%òörèÆ=•åž¥ÕêŒ -7¶'ÞÿWk©§hÖ,ÌY|͑#öÎ<™X8 ø.3™Ilû𻆗àÉeî3ï¾Nó¯Ea¸mù"Þ»<¿WnÍù°ЫÌíTéƒlå oM¬‚Ä’ûŽ¿›ÙÃì–†SdÿnŽ§9XôÍb¾y˜Î×­º<ð°y燜%/ÍáAG”_šÛ.QB­ 6ÐþÏ|3 Z8@pœ?äqЎðœ}ú@Á9îþçÿ-I~78’Àgè;ˆ~ýPüw{>í°ýÊzýððëÿãzȸJ›*r£†Ý‚Pkõÿü¿°ËɆ‚ÿFµøŸÿouú]̙Q‚ÿÏæ_Kô5”óf:_N6膽“KžáÖè¿¿;…ú -fEÈÉñô>ŸÂËT,7µE~Ù -t¹wÙ¢{£@‚exÅV’[¯}˜ìvÜewâoú%èôtƒe®¿Ãށˆœì¨›ð~ÙÚñ*Tm»Ù~Án6óÜö?êúö‹pÑrm7…Hˆº%Þ)´9Ñ7ÂAøº]ýÊÖDòƒ{嗽GªòO(êÞñd…úþ¨³ÛÍ />•›'`t°@ôWØÜT"Ä~þ¢ºTŸùq“ª$üï‹|õ Ç^èJHì61‰_ÈÞ}”ÁR8Lþ‹]ˆ-œÜr " mÚ?çõt3ù]©9¨èËDÚØ}œ*¶nç8G”hãEµÞ€ÒœÀësüâJÙíÇ]âƒîðQC€B”ÝŪ ñƒOäE¥=-r—¢üüÑf@ӎº Z¯„“%xÓAzºek#EˉXÉî jÁ¶€çY-E N¶ÓÉ œ°sö@ð«¸âÌ/?Sþê_LTQPb8é˯"Qóf‰YzÎé÷û—­(“ºÊû«Äë7Å©vq¼)r´øJ]S)Hðr+t½‘øųü_ª»„Ö/K È}wÛ(*­š„°êõ(<ýäVL5ÁO ى -D‚\1œÊêîíU’ÑwÚi¥2GMwڊ--lK›/ L -×ØÂàŠG³¬*€ -‰&¨ ÜM6l;[xqãçÏö?Å_¼ô^â½ {JLÄàŽéØ~‹‚&~ªTw?XÚÈ<ÔýƒÈ%^}gOÆ!{òmê&ÜöšÓžü9ùà'¯?ވúØ özó%Û§Lî;RX Íç Œ³%ا^ûs3ø£·úŠÏz§Û Ó­õöÄ2®·¾ô#zÇÏ/x6þvéíçhKï¨usz'Qóîçžáè³Ö†ÿè=ÖÀèrK²>Nø2a_8Ø®û(ë¹i¸§Dq4‡•*‡Câyšvì^Ê©Jä˜ãï.rÛ÷¿å}"×'{mò9ýüå±¥CÏØ°g¶&@X JM˜š’ËWÀìÔË·ªÇÃ!vl,Žáö·¨‰pc;†Éӛw¸]šˆ™ÉƒP×9¸‡OâÀÃg{¢ 7¡©Sk“[ºÜÇpÁÞÇþÀŸ…øy/ÇÇúqø¬}4ıBÃ@´4t‰b_ S€˜Ãü­žÄ±Æõ–ÃÑótÇúêùð?z£6+L±b͎šSkàÇ21÷òâXýÖ{Ü»Ÿë#9„)V†ÎnU›.Af*) ¬Aƒqs°>K`í òû¥ÅaÕ¡ªUqA7yÊ£¶(ÖBÑۖ¤°·ŸhVÀ‘Ó<]a9éá㜨BÄÖË¥µô|ƒ•Ç -°ú· U%24ÖW³Y€5XvVŒ¡)Ä£ÃçϦ-55 †H£Gë09nJa…ùœFŸ%ö!>ݸþóhø™7ű6²ÖÄÞ¸®ŠaµÇVч® Ÿ¡lÉ~ª.ŽÕßëd„xÅúH.BÆæÚ[ÊbŸŸ¤Ätƒ†§å¦–•Â:! -Žñ›8Ö‘6Ï-¡ -Љ|28’4֞Ó" ròÅÿLS8ÿ±$yXûq¢rz V›+@s|,ηÁæÄéˆC;!Wý‰Ö !´œ‘C)¬9¢fûŒ ¬ˆÓÓ-í£©¿ÃKSk+föIb­Ì[>B +:ü'ÑYŦ{|¬ç/ƒ¾Õ"ŠõͼYHbmý4ÆS„ ¹œî @¼Uvqq¬UßS‡LşűîʏbX¡„†ˆßF…Ç“‘uâ=Yɉc­%ò£aãóSëg}YBXÑys9Ý¿^`FJ`ýŸÇ•SëËßn]„}¬ B<*97’D><µìz ¬½‘ÿ]—E±†_œúÔ§•÷ÌLѽpóœG¡uê³ -6µ_ØV¯9a)òçZ%ƶhbupX!ˆÀýÛ3gÀóAˆõ¸5=ÓXOI»`®úÉÀJaÍô<%¾PtŽ„¢ˆ]—ªäDÓX³§ ¹X| RX“žŠS ;ÿ uòøŒÑlaEhhÄÆÃa2Ý@¬„ëᐞo6.ëX¿(}ò$£ —€ÂÛù¸Mi6ࠝOFAþ°ŠÓp•|ÚkxÖoROˆâøéÌ=½<€ Ι$~ÖÁdÏ2û›‡OƒaϨM?=.×Û3¸ùy슽@IÈ×RôCòiØkkŽ¥ŸþL†fŽh—/¤½¦þ—äÓª}“ôJ?Ö¿cÜS!т†úã×´(ñópÑTŒwŽÔÓoó>"ømÇþ˨­ßžÇè%Ñ:Órk#ö%ñröåAòéûÓÔ­—~ú‘‹>³Dyaü4 %Ÿþ^wEɧË7o¦Á=½$ÚzI&†R?cjÄ’OË^¢+C´§¯Í´U•ú¹Io*}Ø$ŸæÓµé\òiٛ|ôÈ-­÷­Q‰§"‘¶1³ŽZb‚§öv㘤Ÿf]ñ‹íYl ¶4÷‚ÿèw4ù6Z–˜™YZŸVðéŽ6YÉQ€’B™íñ…úėiޓZ¡Y½³é+ô¯ ÿqÁïH½#×ÌÂޑ‰ÇÚw”´ NšF -½æçW'-݁Ä×ÓŸü²¼F{šBØÎp×Â30v»g gMáwœEhpÿ>O­@P=æç±Ëɓ½˜ûÄ!F¦Ö ÚAq¬þ^_+8Sþ¶:ûr¢)à—“Œ - ºó -¾1A]÷lcDiõ´pÆæðjâӐuсåÀÓú²å»ÀŒÖ2R Óèl\sxÍIó» ˆˆêPt~ž3%ÂÃèáSF¿È Ízɵa'‰þ‘\Ff [Êkh`ghc8Ml’P¯íÈÐKýn—Ò†‡JzÉ@óØ2¤$(Ý?j؞¡WÌ©‰¿8æâÒ>öÚ©/Jz òô†¾™úÞL?R–'="š½øRÈz)…†y¾òIJ!$ÓdW$ÿQ:à4dÍ£¡‰’Bâäæ‘fCYbDŽ¼ƒú‡&Ÿg#N¾žS/)Ä%·'rà‰N®÷¨}r¼c Íϗ|kהÈ]¨˜èP„èHrvÁ¼xÇ6¯ù«ËD³À…LÍ4o[MS6€ƒ€Å×ÅèËîGœÝÇV]7'±TŽgb4Ñ èÁ•´!¤ý™aœ¡‘HšG-41Pˆôx˜Èv¹'¤Ú (¿ûàé9yìžeÔàqt<øÏÀŽ…8.xˆIK¾"¶¤høªÂÀªrìK3dEâ%ƒÔ옰Q³9Dǖ(LRÓLóSÇ}¡]. fÖì—Ë2+(igj¥Ð2 ýВ'• -m’{è8ƒ“ä1  ‹\€d)jWªD¥À¬À—Ú"ôªm¹³XfL§dYúô¬7é©ÑõÀ˜¤=fù¨ÓSÅ2FŒòچ¢EÀ[Æ͓¬¶¡a ¯kÍÐ7@kmT nOUÐøŒÖ±ÁbZOÞÈÑ2M\Û»h£Ã=‰Æ—n¶ølơÅu{J¯Ôœùñ0¢¢˜Á(¥ëŠžÙÞL÷G¯$Ó0í[|{ž’÷۞™îި͜¦"»«Y„—*Gd°k'PïѤÖ6á´N!Gö¤Vô7ˆkŒExß7ÊK•8Ê[‚‘0 }9y j$B­ó:²(l$´%m—8³Eèóh0Ý©Ø&?‰Ëò~§.Ì>• ïç5`pQ/§ÙˆJ‰R’×E¨}£zX†+E@t½÷yz’?©ÕŠ‚' -Tû¤ghVAuÚ«®Hxž¡ìùªù˜wð¯Cƒï÷`­Üɓÿ<8Á϶µŒ$Lw°~|j¹” zÉÑKýf—4‹(3 -ÐKãfçыÝìè>cdéæïô2š ³‹çʾ(À¼*)rN‡²Ð‘+Žœ#WèLY—ùú½„é¬ìÈ“Ã6Ú=*e˜éPSëáÌ(á`ÊgþI}…#0Ãދ¦D%À\,™úõœ²N"ZO“òë­Ë0NÜ»ÉI £Â;( -¾H  :†Æ„(Ï%±ã©Ù©³PÍÌ íd$´ -MRº"T³µÖÓЈžäG¤ÖáKvBf[à֚¦£±"В¯Ü7цU~rÊì^áNC½«B©)Q!<)ŽÄ?¯ÉÎS@¨§]I›‘‚Ÿñ@±{TJÍœ|Jç®æÒ³Á?ï2ãI!p^à;5!¹ûp†Î‚¹´yË/gÝm‰‚ðªêP&€&å¥sÑ҆‡”—BÓ° Å *°yš›ChåäÏ@.R¨ˆolja§Ýº)(¬ÅÉAa%´@ÚBÎ/ hÔv¬ò£ŒfJåpXøÊheÄÞ%<‘Ei®lüFn?ª8~ 4¯K{¤PB³€I£6UÔÄÓ螬 ¥Ûqi½nÇ¥0 ¨Bº‰;S²€6©ý­Ò­ÃI7ÖÄÕ¢ß ¡)K7Î/ ƒ‚Ю—nÜö,¼mï ÝÀʉI7íRÒ.Ý.½ Û¥„r‡(.$Nrd,lȍi6‚¯·hÿ«N›ÇۍÂî»Zçîå<ß5iÿ -ž[ívíÿc/v8j>ÖàÊi÷€‰kÐ-Ú?…=o8Ö í_ -gâJR{>ÊŽ”°ùØß|>òǑ0äL¡_ß%Õ Š"Ñ,/æôä¥fq©’úÁè ³,85jBxÝî-NnaŒ@»uŸcÙä -ÙÝ2DS¥ 3«‰ÐH™L`A]ªv¼L6 Hú†«ƒ×dì Æ$ÉT֐â>žTY—óâ˜ÊºÜêlO'•7ӝIfJ§ÆIùÀؼꨩb“MwLíÐ$c?œkHm?€æ3Æ*Õ»8SÑBÚô‰DG¸š#—:Ï-MbÛ÷d3})¶ÐýÃøþU K%[\l2搦61wÀ%µ¨áA¯ªÛ;.ôÎMc¤w¼ ózgÚ7„|y±Z>uÑÌíå|ø±vY˧-]]Î'_ËGIè;”óIbEµ|:ÉÒEå|òµ|:¼tñ–r>ùZ>¾:xC9Ÿ|-ŸŽWºxC9Ÿ|-ŸN¦tQS9Ÿ|-Ÿ•.Þ¡œOþ=]õ}s9ßÅæÕòq†Çå|òµ|”ž¦\ÎÇK€–©t{5“bš¸Læ½t1’ ‰FŘÄÄ9å\q›º¢-RhI_x›*Æ"NÕâAŽ¯h[>Sï^±Süšš,cj{JÇSŸtª¦¦¢WªÂ«©¬Töz‰Æ9=íÒצäk\†w -ømG4A÷š WAR“,FÃ(a=š¢:¦º¦ð¬˜y¯¡¦pªXcàù¸¤k䤋päÕl‘Ì{óóAjX)±šQé5TμW–0+𽞢k¨S[S>(ÕäÈq„ %B»[Íꁋ›HÆh¦ÌøˆÆwËÞJ4ÅÂUõÓä¤ÛuDãû‹½™nÏÉO¢* -Òùu"eêÔÜ Wñ¥Æîù¦„¯S¾tOCÀòQpH‹À{‡øÏXvŸU؃œQ¨`.ŠªíA)™WÀPºÇ¬µŽ½þC]ÕÞU«4"Tœ7Œ¢#¾=`±²7B÷¬/–ÇIØyÜ/W­'È”¡ˆœ>¦$? ³6ê4Ìèñ¢„À’;© :X‘b迒6_ˆ-E+P -µzHº,ë$zÀ_£§•Ôî}nãKëi%m¾ 銿‹ä¤«Iõ£à’ ÷EhôÞðÆijoà°¼Z<%2câïjǚ ©üjǤ¯\ž'7¦‹[F\¿1UuïMyonMƒZ²Q…÷†‰*£.Ó-ÞÜ/P¾Ý{XäRF4ÔÃ]ã½Ñ]”.Þõpï@¹U_+è×住”U©«‚Õ‚`ã©`hu)‚°I ÁW¤+œ"-“«®F‘ö%;vƒ -ŽÐÉWHî*÷ɍ@km˜ïã“‹Z”2ˆÕÔÃ]™5Ï;o`%›´/JCÛE2„N´tQ©ÄOs‚®H2,*ñS™([⇳ -Ti'Ùûµ°mŒk²é€¯—÷«ÂïTž|Ìl$“žîS™‡ÐÜ#mO¾2O&Š{ÏÊ<Ñ´ë×õ½+ón©ñÐP™'› {¿Ê<äî¾q+ª¨Ìã+ÊIˆ7TæñS­˜™ï]™§Þ¥JçÝ»2 H*f×Wæñƒ^*R:¯«Ì»°Ö¤âB°¦î…ÿðÈ»[ê%ÅO½”Ô:Õ¤^¾mU¥^*JãÒw«jE9ê.•9Y@% 5U,’Ph= ºCAÙEn„\æ½²tƒu~Ò´ËüjÖÍG"ÅÚ¼·]¤X›÷ -‹!،Ү¡îÛ-û‘«ÂÝ·îGMöQ™&¹{;µûQNU‡4×fSŠ²Û®:F€´m#qºK]fέòXS$}ß±ÔU`R‰Ý—÷+^çÆ÷f ¢¸c«ãÒå«àäo¤R4»YŸÍ·çñÚ´lÖR·&_㇆ÐF*ÊZÕÉN§j| -e‡÷)’ýØß©HºK‘,¬[»½HB¹K‘,¤î¢kÝ,š;ˆ6ŠôU°šó—¬N†øû±{ó~åIÈ´{åQu²¹B÷(Ê_›»åÝàëäMÞÄ×b{ÞP”‡ûÓ¨º¼¥(OÌýð/åIøÓTZp=9 -:ü~h¹ê«É´X5·ß ô´¬KÁnR›GAÔ9!U8ž!4éûù´j6W(kLè°RùžÊÜÍÃ@°‹åªka‰ß‡ä>³‚u©ŠÜN†­ôbéu@-@õŸÂêm2Êfç<1¦†d;ñšO¹Ofxíd¨‡Ú­çúùC*] ¶Ëٌë+›Í¸+°íBkǜOO+þ iÿ¿"L¬ú ™Qt¡Ô@º.܈¾âLÆ/»‹}Õk¸ÓÃø±=Åõ[T±Ÿ¿×•+»›¹%±d;#[ì÷Tÿ­M¤°Že°œ «°",j?ân;aٝ¿ûSe›6 -JÑ-rew—«Žß§0¶–*ö  ûàùCªìn Wý¶V(ö۶ےXMÕùÏL -ë\¡Oa£+5ÿ2(HRظñÅFRX¡r{±´`ëÒGŸhvª|/&öí~à½êÿ¨ªé·¾Rïчi5(¢¢¾°fT‚<¯„g¬œÏYE~/_¹µoèÙð¢L¯¦í}Š‹T$à -,Ò=½ö*ƄÇÖd†¥”«”ñ5…}Wúl´ö‰Y ŒÛ}jï³¹±°Őx±on/ì«êÓ][ˆ)]Ø'æƗHð¿¥°Gzór‘»ö‰Ò)\frEaßµ‡´ÆÂ>±8wzÞ­°O¬ªç¸OaŸXUŸÚ¬! …}b^zÆĽcaŸØ -Sâ»ö‰©<¼,Õûö‰Uõé$®Ö¿¡°ïrL?êÚÂ>1µí¾…}bk(–jucaŸ”ræ« -û$µÎûöi Ú-…}Pö;ö]G4ͅ}ò•^w+쓨ú¾waŸˆæ΅}bÁaæý -ûÄ…ÀĽGaŸR`åN…}*Λ{ö‰‘SÕïUاXPvŸÂ>±ª>ñ”‘â]lD'g#bDû+i»sJº§ÙeO¥ºúj¯°íyô÷o¥TŽºø]Œé„ÂD÷îâ'£r¨#ÕÉnÖD*ŽNü„KX$ª¨m¨ä^i„N¢[jX‚1© -l4JfXüØÖUcBDÃÒÔ§ZnLâ¹ÒÂF†T2}ª%ä':Öø&SÒS> -L&Ÿ1²Sè/ïÊc5Ùþ77ÿÓawt©Ôׯiþ')lxýÿ®{í›Nª L]MŸªœ …|h®ÿßmëUèítjÚìÈ:µT5ÿSvBBÚÜÜüÑläûÿÝÜüOGUá)ôÿS~ÚUîqG—/ÙñÈ/¤†ÊÝҟvNKçQ=¹g«Z.•Á¶}ŠŽJ\ - ú ‰-ï¼WUÓ§&ƒ¢Qªw”Î Q]ìÑÈ$7jHRƒ’t -Z]¿1€Ú`–4Á«`%g­»ÕJ*`Tx]_Y_ÆOµ¬¥ƒ®:Õ -€RÎOSj ©L"—ϤF‚ð>…˜·GR`¯E™[ÏP HU\1(xâXë[A¹(³×‰0+WÚ#hªª}%;_«}[›ËjßÖæŽ×BhwéûLq¯Á†f’Ôl‹QS|mpcS.kÛv†E—)Ûò»TÖöü¸¼Oa {³³võâTõ¬JëTSB -¼JG›ÕKŽ¦æޒ!<؋îfƒ‚"›>ªÐ=®1 ÝÚᛂÂlFîôÔԌHP=«XB¡-Xlµ‹ìÇ7%êœ÷7÷ýÓ1õžR­ÿ®Ø"ùÊ2í.}ÿ¤UuºõߍìF÷ýSQ|q¾*òlîÑ÷OÇ6¼}?ÊôýÓñk£ÔT§\Ó÷O'׶þÓÞ÷Oõõí°ëöjߏ=§üHš¸ª«}4eå‡5£”ª}?öWVû^bnõ6Ábǚh6/¥ÐBôÂˁݥÀ´F¨´ÖI×ç - -©XJº– -vÔR}/VHÅ ¯BYá¸ØQ‹Âb¨pƒé˜^x*k©ÔR™Ÿ‡Bk?ÖÔÔRñ§©àpå@qk#YKµ¨*Ÿ—µî¹íµ¨Ùžj -©ÌÏ¡b~µíÙÕTH%™œûJʾÚ4Æ®Ž®,¾¡ @c¹÷±Û£ÐÜ¥î6뒾 Ù7Zûôij†‰¨)£§õîw«V -áÝ©î¶'y«ÖšÍô¨©¦RA÷•u·ØFeS;t*ʱ•ënÁ˜Ô—cËÕÝÒî"¸Ր8BF'„µwÅçvnéÉfÜå÷œa^†ÞÁ\ÒÞj?oÇö øTxE¥†d÷ƒœy͉Çu!0æs¦?ñê_’M+¯2 9Þz¯¸g‹ßš.šô$*ó¬Òõ€‡ó8êHhAI a“*D Œ¡¦õSªðC+œÍ#¹óIN—(úI¬æÒÔµjMgå°ê؂2ŽÈ¯/†•_#w4‡L\‡EŸ èÒjIVbXHda'>^IàDXˆˆS¸•À4<ù_rcÌs+,ÎÉ`-ƒÒX C_ «õ y¥žB¬M¹‹•7i¬ù|‡ä'ŽÄFø‚ƒýDW…žmÏn> H¼çË’ïéðzObl‹¦U€´G·§qKrù͆7¬––7¹@áEš7”Ç)d‚RtÒý£Ž«3­3äÜÝ°Ps J‰1]ä€]ìՄהÐÈ KÚ¿¬mLPtJ§Ñ#ºÈÈ®üGÂƏ„çE:Æ\già%×{+yn‡ù{ÝDÙsê…ÂæúŠ(Y·´ê0Ñ0Ë»:®BòâÞ»«ÊîÄãßxŠ¢ª’Äë<Òü,UT’xëíºb÷Ýé$ë֔¬šËûîd $ ?E$X;!5µx6äÝ,é y!l®¡SµRš -z)7õãM#PöñéPŸBIŒ‘‘° ´+);˜WW:ƨ­ í²Ç êä«©tš*½"š®bÀÆ$¬¿™ä|Ίª:oLX…úÆö¯ÆºÄ¥QEm©¿£K¦.Q©´ÂbüYA¹TH5GÚ@ëDÛìh€¦ÔHÈ|Qò+MpÊÜH4Åj"õÓäG@o%šbK!mD«ú?$ ]T1‹© Ñ®,IT[¨T£\¨¦ªQ.%^EI¢ÚzD?´–’Dµõˆ\2ìU%‰jë)w÷Õ%‰<~‘±B/rnµ•$ª­GDD»¾$‘#©¼Ññ+½´–$ª­Gä,é«J%ÆtQÈ‹{R#ºœ×íÍ -uê›ÔÝÒ¬ŸÍ¿Ø¬ðÒýð¯4+Ô)5©»O³BºbE^m¹½Y¡îŸ'}ñîÍ -/ÝvÿJ³BÑÅû7+Ô©êïyK³Bžû+(9,šJJËÒÝå c44<”wI(gÛ©lx¨îV«›b“»Ç­VR 5æ@]ÛðP¾Û¡˜òª†‡ò.$ ƒ]{ÃCq”¿Õꊆ‡*ú åÓM8G׍  Êîä–ívȜ777<”ŸœÐËquÃCÞH.ºò|·4<”Ÿ’h2ì5 E‹#e¯oWOÕÕ»Œ?í憇ò÷–qöʞ|YêX»CÃCyo²NÓåY2 åíañ´ë+ŠUmr[ðzN4<”‡"ç~ÐÔðP -ŠÜ£á¡|<†s?ÜØðP¾˜W',’½¶á¡ˆŠu;Ä­5(5®nx(؏¿Û!®Ü^QC° •kqïÒðP¾Û!ÇÐ76<”OñƔÛÛredbÉ9S´•\\4<”§!¥ÜÞ¡á¡Ìž;.}*CßÊ å¡° -Ô­ Õ÷)¼©á! Eti.%¹hx(Sr¡œÚ;×ÚðP^͇³¹KÃC©cýM$ y]™ -]Ÿ H*íG¥†‡ò±kAZÂõ ù”×¨ê¢ å¡ày675<”‚¢¶ý®Ê†‡7^1q™¢­EáE‘ìm yñ‹n‡T`å Ùz-ÙÞ«77<”W~¤8MsÃCùn‡º›¯›¢ÞêTÙðPM-îÊw;ÔiîSxUi°Pt^6<¼¾Tëvˆ£¹©áᥠïvÈJèk÷#ÓðP>{Lx¬]ÝðP>‰J聺ºá¡ÈÚ`Ý%‰¦µáá ¾N>Ñ´^Iٞ74<䄘X·ÃëS eÙo~r[ÃCy‘6qoox(_¤ËÒ77<äOSØíðROS} ¿á¡´jDk6 -·p©lx¨N³¹¹á!¾š— ñŠ•+ʟÒIäʟ´.à9.úrº[½#žF"¼뇺Rxz‚¯¥=Âòùþ‚"JK±œÆ…Ï;¼JŸreѸ,¼3ÓµåhC¸ëó KÒžµZ…e>‡ƒ÷ø£ÇLYo¼ ww¢Þ‚U]zc-Qr–Þý5Øù}‡Ÿ2™X}F›Å¹¶š3û Q\¼¤ ûs&¨ÿ˜Ì|àÓ8õNJ¦Z}ß ì—=ØÇ#pù¿Â5²ëª¸ú@µàgšËNrÖªßÚó—ÀþÍ2ÿ6¾§­þÜßc»YYFWñîvž´lö£ÐþéÚ_ôï/I³Ñg)Ÿ¾¥’õücø·ó(#Pµi¢Ón½é]öaJï]ìßìqŸ9E™J† ¿¿ÊD!hjãˆåp ¿—Ž†apz L¯lågÛþìv¾»|ÕÈ#S€÷ç>?¶°_Ä@©ƒ"â„WòëWG‘ôWcÍn¶A&l·y{žléTµ,F/D0ᓠ­Ï¨—œ.*°´LÌóWÃ[¿0nnÒäõ/ΆÕL?ƒµ­e¦\Uvìü/0!®¶A’ú4Ùn?ÆùŒò ¼nù -ýN°Àä^³Xýç¥Å&Dœ%Á§,ÌÌõÉyµÍ~– Åüa¡ -à̸öžÍä½í\.iW¸÷Ȉ¡µ€Þö \ª¿¨Åc_†`aeo˜ŠUõ4¯ôz‹:]yÙóoÝ"üæüºrÁRbeþ'½2­÷ÉóF'J.».3óÉcA>g@“Ðü²¡Zd {J;ð糃638ÖðMÖÅü’t“yo- à {Îñt&-ÅRÉã0ÿ¬ó_Ë}„p'BV4T8ºO-ë‰e'nxðlÇLŒÙg€†y–urϼ™~'É<(±+8B§±ôÃÐæÅ -„Çvé)T'ìwvîeŠ( ]_ì3'¨°‹ð;7­6^Xé´öƒÕ ¬²´û’=Ž¯);Är׀ïH¤“ Øèó 㠆"1 …^´È÷ZwC@@Í=@¯ú‘ÏYŸÀŸŸ»ÖZúÀoÛv{Â7À§v€Áµ&ܽ*G˜1†f (ì;sîIÜ]lÌ2ž÷ÿ *PááÐÀµ^Fõeår q“ƒÐ\ ’©pG ­åp#.)ó¼+͞õ´Ôîu=h]©Ù´½ÜŠx­«‘æ¥ÞÄÏÎ~М"4[LëNÄó4O;nšç§]Â3­–¬àÓÀC3ítèE¶gÉ –l:ñ1Ÿf~ƒ^ßet"ÅüÙuÓ?_æÓÐÃg -½j‚Îræ÷çÔ;ÔûFäÈ:¨xǵý=›å:ˆö¹/ö…có¡õ;û$ë™UØÆÌH¶)5%î*–‚ùÓÀïºØ}Ñ,sž‚'eŸ&æÓÌ˽ôð&˜áéÏ1œÀ鍴Y±Ð›óF<Èqí)—6ã3Ž!¢\°Àz}iÔ% -2•Öë«Q<Âγ›álÐYlû$ÏzÇÏ_WïxæõŽZ·¨w†#½y×ނOΊޙöÍõö•¿ªwºÍoðX¯êm{Ã;Ö¡(”p›àjZ˜]]Û°1 1Ø &‹»[6ZtšÃŒ2'ܨ‚áK¾ç'h ¡ƒJÒ¢I¨"B/ZÑFá‚./oÎ9°3¢“•N¤"!ù 5±.-¡ +âTÜ2 ”f§AãåòÐoYð.äë´X¢Œ˜Œ¢‰X<ùa4Î|—BÂÉB/7¤D`ZWŅ‹î]–È•ã[¼Rçø{H0 6(N+<Û<`e”l…+ˆØ -V'%S)¼‹ºiqz+fÇËôÐuvšpN¦¢sסåÙ(΢FÂ& ôÁ¥ÔˆÓZù1{Úä‡ç/®Þ VáñÊ;«|½ÙöÔÏé¤è;غÆ? œ§¯ð68 H…ÏW›úÞ2¦i£ïôÏ=˜}Ñ Œïé\šcûæÓMùäLގŸ¦Ø @ÊM~™~úè÷ÞÖiápêÙö'™[=~¥›ís~êL½#ª漃§]’A”ü"Gy¿¢&§"$Úu~EMNEaª•z¿¢&§"Ú7Wù59Qüæ*¿"@sü¿ Ý?¡ˆ/ð€þq7Ï«ù¡~ø]ünºbºÜé’ÇÓÙ̶äa>oÏÿ÷)·ý:¯ç›ÓCôÁneK¥p 7ÿÚÎæ:øbe¢“ž í€ÄÃã<Ï$bÄLî;RX ÍçIî›è%0¿%¥ÃìÚ{è‡~x®>é£Ù@ïð’-½¥xtÀ?{”¿†Š–‹hQÜÅfÈÍ™sÞ^«¾ ö òÓDÆ팿åß3ófÊ}\ÄÝÅtÆ&ßZ)÷‰Ø"—åe#`®v‘ˆ;PN&½5þâg=ô0)So̅Ýz‡5•‚_—õöÆ㠜á |„nýå隆ù“}…¨S¨µiíþe¥å³½AIià‚U"¢\8?ȅQLU0Æiæ`—ÁX2Ø`˜ª€¡.dxÄjˆc/”\PNE±ûaGÚØjg´ÕПj#¢\8”Jüû—"¢\øFáÿµˆ(ñ„ü+Q. -CIÿZD” ‡b±ÑûGD¹p(œÍ¿å¡ø¾¹{D” ‡Âƒü_‹ˆráP(:ñˆè{Wo}é[h!zŽ¾B Ì/k²­·þ®zç¦ñkF® „^´ç%öÀæI#GÕ÷‹RhZ;ú­ÉÞÉ$“ø-\2 «‡˜áu?{(:í´è„: &:{[•DbNé?ÑÒ#љu9ëý<ÇKîßîÉEi¿Ž¨å„™–/‹Õûè¥"`ø Єœœ¥eÚ'½Rå¸K©1ŸÇé2³zܐÇ04gM8‚U3fk 2H ¥´QÄ0¥?{ - <³u¨¥8è`è‰öBiò@ÓI¹ib”$Åäw¡ãE‹þ±cUE\Â,— d;w Sv·°6„Õ¸}g©¬·ü0ÀÆB‡ eæ;ñäW¸rÃ^¸5hÐ?eŒ9™xmƍðÝ‚%ꨒí -Ç#]Ýý›èä‘ÆÙ-ØùîmÏ|×;¸ë;gÝ Æã¥hѱ3Ú}¤>»ˆ!"qFÅŸ½T‹‹4‚ðçÐRë¸öĩȵ§:–êÙ±tâD@n)š}œ`8‚;–ᝊXªt •õ³ÊÆäjN–4V:¡-‹ -"<Ÿn ('£¯'T^@YX§ÊoˆÌSõ™d•Lyµ¹S7:“õjÍuËDPÙ³µ(¢ižH'êÖÚٞŽÈÉv kC‡¢]€!šZb@ߣSi"“ø À7Xy¼dŋND%5a¢¦8>Š;Ûà± ¾=öj!³·Ò¯’»H»šÝ'#ó­œÔËmœVõ»8Ҝ& c˜"næ4óå6N#6V)NS £jw(r ÍBÀiÐ떁ît·ÈijaªÊûV“þ 5AՂP|C—85á ¨ Ū§âޗís»mE Â+OM꼑›HÑIjÛ#ƒV=HU¿a“M¯Â  ·?¤‹þ“«Ç`L‡O· ӅÝÎÒ²ãÄÎ#ÍZ‚A0R@8Ž/cÈy[|9Ÿ]5qÑ©p4á0‚YÑÍ.9Ñù•,%ñ?‹õþg£“F¶ª—@º&×» 6ìÔùsIû¨›;O -Õìg™*ž¡|㧂.8@~KºÈCE…‡Ž¾ƒà–"p6¼"ÖçZ±â"'6|X±ãªv¶ê¢‚W]ðŒm·Í.»`ŸyðRÌzi_ðÀ+¶làõ¼È¡l.(ӀH¢B_P°À ð⡍ódþÙÀƒ‰Û ÍyÀøQÚrqÔ¶T¤ð2來›‡&K´ºAÃl„àú0Gfqt bÎ^«Óy´íÄë’©˜ŠP›ÀÄDÓ.ZM±Î¯µHÆ5Gçxݘ.A6ªÏ\`#pz5Î Ÿýð"Ý:óýÙ+¬ªi{86ö~ž‡)ÚÕÑúX_§ŸïëÌ%C,˼;éh# EÒ»›Ùïøô±ïÆqõŽâ0nñîc?ù)ùØ:þìSfŠˆ~¡Õï³e?}‚ýäÁ£ŸÞ!\ìû𹥑ñbþ˜Ùôƒ¬ƒX9ìŒÇœ¹„1çO,¨æ3Y됮ŸàŸÞ»…ŽzÐ𓵶ðÃïü"Qð9~ëesö°•$óµ7&ÖyZˆù4„\êbÝ}ÚyRëM¼Ò•ˆdšo╮DÝ?Ú¼‰WºQê‚o╮Dä~PéMÜÂPh zGKÏ(¿™áÁNðõøª5?wè•À(3_ünª“ÿÎÁqãy þC€ÿÀÿ÷`@þ—xÀ/«SÝ?–Ò×vc}¨ÂZ›‘;}8å~¿N¿ÛÍäð߇(ú®[«vJ¹‡èýjìÁCŒÀ»à{+ -°ŽàGºˆ‡4ü§ûˆ=½ƒŸëàWØï øü„+ƒ~4$ÂExCþŸËç øÁ¨\¯'Œ‡×ø°ZÑ:vÿ7¸Î$èqÂa?œ¶7§êó¸‚!"§ƒ¾ §†ÞÆ?³¿T9ïÖz²Ziž¹Ççc—[fQ„ß‹þø]_ÐÃ~á rðoÆ델¼ÜŸÖ¬:ÿ>^'§5C®fèmvÚDNxú<½Nóöaò»‚»jqœü¯ùÃd³Ùž&§ù> endobj 6 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 50 0 obj <> endobj xref -0 51 -0000000004 65535 f -0000000016 00000 n -0000000176 00000 n -0000047815 00000 n -0000000000 00000 f -0000000000 00000 f -0000177312 00000 n -0000177245 00000 n -0000000000 00000 f -0000047866 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000177519 00000 n -0000177550 00000 n -0000177403 00000 n -0000177434 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 -0000049541 00000 n -0000177635 00000 n -0000048221 00000 n -0000050025 00000 n -0000049838 00000 n -0000049725 00000 n -0000048473 00000 n -0000048979 00000 n -0000049027 00000 n -0000049609 00000 n -0000049640 00000 n -0000050099 00000 n -0000050295 00000 n -0000051501 00000 n -0000072603 00000 n -0000138192 00000 n -0000177660 00000 n -trailer -<<3B853B03CD4D8C4B8BE2F2BA0FBB0695>]>> -startxref -177846 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_blue.svg b/net.mograsim.plugin.branding/raw_files/icon_blue.svg deleted file mode 100644 index 37653cb4..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_blue.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai b/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai deleted file mode 100644 index f036f2c6..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai +++ /dev/null @@ -1,1420 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_orange-blue - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T17:16:24+02:00 - 2019-06-22T17:16:24+02:00 - 2019-06-22T17:16:24+02:00 - - - - 220 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7N+WH5gfpWFdG1ST/clC v+jzMd50HY/5aj7xv45oOx+1PFHhzPrHI9/7XqfaDsXwT42MfuzzH80/qP2PQ837yzsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLLSrCa/vZBFbQLydu58AB3 J6AZVmzRxQM5GgG/T6eeaYhAXIvFv+Vsa5/in9K1P6O/uv0bX4PRr/yc78vHb7O2cd/LeXx/E/g/ m+X6/P8AQ+gf6G8P5bwv8pz4ut/q8v07sIgmmgmjnhcxzRMHjkU0ZWU1BBHcHNNGRibHMPQzgJAg iwXvf5eeeofMdj9XuWCavbKPXTYeovT1UH/Eh2P0Z3PZXaQ1Eal/eDn5+b5p232OdLPij/dS5eXk f0MvzbOidirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i4gtoJLieRY oYlLySMaKqjcknIzkIgk7AMoQlOQjEWS8C/MDzzceZL/ANKEtHpNu3+jQ9ObdPVcfzHt4D6c4XtT tI6idD+7HL9b6b2L2RHSQs75Zcz3eQ/G/wAmJ5qnduxVE6bqV7pl9DfWUpiuYG5RuPxB8QRsRluH NLHISiaIadRghmgYTFxL6F8meb7LzLpYuIqR3kVFvLau6PTqO/Bv2Tne9n66OohY+ocx+Oj5d2r2 ZPSZOE7xP0nv/b3p/me6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVxIAJJ oBuScVeJfmb+YDaxO2kabJTSoW/fSKf791PiOqL28Tv4ZxnbHaninw4H0D7f2PofYHYvgR8XIP3h 5f0R+v8As73n+aF6d2KuxV2Kpn5d8w6hoOqRahZNR02kiJPCRD1RqdjmTpNVPBMTj/a4eu0UNTjO Of8AYe99EeXfMGn69pcWoWLVR9pIzTlG46ow8Rnf6XVQzwE4/wBj5ZrtFk02Q458/vHeEyzJcR2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvKPzU/MAky+X9KloN01G4Q9fGFSP+H+ 7xzlu2u1OeLGf6x/R+v5PbezvYvLPlH9Uf779Xz7nlOcu9o7FXYq7FXYq7FWQeTPN955a1QXEdZL OWi3ltXZ08R25L2P0Zn9n6+WnnY+k8x+Orq+1ezIavHwnaQ+k937H0Jpuo2WpWMN9ZSia2nXlG4+ 4g+BB2IzvsOWOSIlE2C+X58E8UzCYqQROWNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVeffmf5/wD0TA2j6ZLTU5l/fyr1gRh28HYHbwG/hmg7Y7T8IeHA+s8/L9r1Hs/2L458XIP3Y5D+ cf1D7fm8TJJNTuT1Occ+hOwK7FXYq7FXYq7FXYqzD8vPPUvly++r3TF9IuWHrp19Jjt6qj/iQHUZ t+yu0jp5VL+7PPy83Rdt9jjVQ4o/3seXn5fqe9QzRTwpNC4kilUPHIpqrKwqCD753MZCQsci+aTg YkgiiF+Fi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWI/mF54h8uaf6NuwfV7lT9Xj6+mvT1 WHgD0B6n6c1XanaQ08KH94eXl5u87E7IOqncv7qPPz8ngc88080k8ztJNKxeSRjVmZjUkk9znCyk ZGzzL6ZCAiAAKAWZFk7FXYq7FXYq7FXYq7FXYq9E/LD8wP0XMujanJ/uNlb/AEaZjtC7Hof8hj9x +nOg7H7U8I+HM+g8vL9jy3tB2L4w8bGP3g5j+cP1j7XtOdi+fOxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KpD5x822XlrSjdTUkupKraW1d3f8A5pX9o5g6/XR08OI/UeQ73Zdl9mz1eXhG0R9R7h+v ufPWp6le6nfzX17KZrqduUjn7gAOwA2Azgc2aWSRlI3IvqWn08MMBCAqIQuVNzsVdirsVdirsVdi rsVdirsVdir1r8rPzB9QReX9Vk+MUTT7hj1A6QsfH+U/R4Z1XYval1iyH+qf0fq+TxHtF2LV58Q2 /iH++/X83qedO8Y7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql3mDXbDQ9Lm1G9akUeyoPtO5+yi+5zH 1WpjhgZy5BytFo56jIMcOZ+wd7538x+YdQ1/VZNQvW+JvhiiH2Y4wfhRfYVzgNXqp55mcv7H1TQ6 GGmxDHD4+Z70rzFcx2KuxV2KuxV2KuxV2KuxV2KuxV2KtglSCDQjcEdQcKkPb/yz8/jWrddK1KSm rQL+7kb/AHei9/8AXH7Xj18c7PsjtTxh4cz6x9v7Xzvt/sX8vLxcY/dH/Yn9Xd8u5nub15l2KuxV 2KuxV2KuxV2KuxV2KuxV2KsE/Of/AJRBP+YuL/iL5o/aD/F/84fpel9lf8aP9Q/eHhucU+iuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxVVtrm4tbiO5t5GiniYPFIhoysNwQcnCZiQQaIYZMcZxMZCwXv vkDzxb+ZdP4TFY9VtwPrUI2DDoJEH8p7+B+jO67M7RGohR+sc/1h8y7a7IlpJ2N8cuR/QfxuyvNo 6V2KuxV2KuxV2KuxV2KuxVp3REZ3YKiglmJoABuSScIFqknlPzfpnmiDULnTKvaWV49kk9QRKY44 3Mi/5JMlB40r3zL1uinpzET+qUeKu7c7fY0YNRHKCY8gaSD85/8AlEE/5i4v+IvnL+0H+L/5w/S9 Z7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmkatfaTqEN/YyGO4haqnsR 3Vh3U9CMuwZ5YpicTRDRqdNDPjMJi4l9C+UPNdj5k0pbuCiTpRbu3r8Ub0/4if2TnfaHWx1EOIc+ o7ny3tPs6eky8Evp6HvH6+9PMzXXOxV2KuxV2KuxV2KuxV4F+eP5seu03lTQZ/3Ckpqt5GftsOsC MD9kft+PTxr23s/2Nw1nyjf+Efp/V83Q9pa6/wB3D4/qZL/zjV/ygt9/21Jf+oeDNf7Vf4zH+oP9 1JyOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYqm3ljzLqHl7VY7+zNQPhngJ+GSM9Vb+B7HMvR6ueCYnH4jvcHtDQ Q1WIwn8D3F9D6DrlhremRajYvyhlHxKftI4+0jjswzv9NqYZoCceRfLdZpJ6fIccxuPt8wmGXuK7 FXYq7FXYq7FXkH52/mv+hoJPLehzU1eZaX1yh3t42H2VI6SsD/sR7kU6nsDsbxT42Qegch3n9X3u o7S13AOCP1dfL9r5y653jzr6U/5xq/5QW+/7akv/AFDwZwHtV/jMf6g/3Uno+x/7o/1v0BPfzn/5 RBP+YuL/AIi+ee+0H+L/AOcP0vd+yv8AjR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxVknkfzld+WdTEgrJp85C3luO47Ov+Uv49M2PZ3aEtPO+cDzH46up7X7Kjq8dcpj6T+j 3F9BWN9aX9nFeWkgmtp1DxSL0IOd7jyRnESibBfL82GWOZhMVIK+Ta3Yq7FXYq88/N380YPKGm/U rFlk8wXiVt02IgjNR6zg7dR8IPU+wze9idkHVT4pf3Uefn5frdfr9aMUaH1n8W+WZ55riaSeeRpZ 5WLyyuSzMzGpZidySc9HjERFDYB5Ykk2VmSQ+lP+cav+UFvv+2pL/wBQ8Gef+1X+Mx/qD/dSek7H /uj/AFv0BPfzn/5RBP8AmLi/4i+ee+0H+L/5w/S937K/40f6h+8PDc4p9FdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirNfy48+SeX7z6lesW0e4b4+p9Fzt6i+38w+n57nsntM4JcMv7s/Z 5/ref7d7GGphxw/vY/aO79T3aORJI1kjYPG4DI6moIIqCDnbggiw+bSiQaPNdhQ7FWJfmR+YOn+T NEN1JSbUbiqafZ1oXcdWanRErU/d3zZ9ldmT1eThG0B9R/HVxNZqxhjfXo+S9X1bUNX1K41LUZmu Ly6cyTSt3J7AdAANgB0GenYcMcUBCAqIeTyZDORkeZQmWsHYq+lP+cav+UFvv+2pL/1DwZ5/7Vf4 zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCIvnnvtB/i/wDnD9L3fsr/AI0f6h+8PDc4p9FdirsV dirsVdirsVdirsVdirsVdirLrbyNPqPkmPXtPDSXUEkq3VuNy8anZkH8y9x3Hv120OzTk03iw+oE 2PJ0eTtcYtYcGTaJAo9x8/exHNS7x2KuxV2KuxV2KvSfyu/MD6jJHoWqyf6FIeNlOx2idj9hj/Ix PXt8unR9jdqcBGKZ9PQ93l7nkvaHsXxAc2IesfUO/wA/f972TOueCdir5B/NnU7+/wDzB1o3czTf VbmS2tw3RIYmIRFA6Afr3z1LsbFGGlhwirjZ95eR10zLNK+hYjm0cN2KuxV9Kf8AONX/ACgt9/21 Jf8AqHgzz/2q/wAZj/UH+6k9J2P/AHR/rfoCe/nP/wAogn/MXF/xF8899oP8X/zh+l7v2V/xo/1D 94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/5P/8AKGR/8Z5f1jO47B/xYe8vm3tP/jZ/qhiX 5o/l99Skk13Sov8AQ3PK9t1H90xP94oH7B7jsfbpqu2ey+AnLjHp6ju8/c7v2e7a8QDDlPrH0nv8 vf8Af7+fNc5x652KuxV2KuxV2KvYfyr8/NeLHoGpuWukWljO2/qIor6bH+ZQNj3Hv163sXtPjrFP 6v4T3+TwntF2N4d58Y9P8Q7vP4/jy6ZnSPIPjj8yv/JgeYf+Y+f/AImc9W7K/wAVx/1A8drP76Xv LGs2DjOxV2KvpT/nGr/lBb7/ALakv/UPBnn/ALVf4zH+oP8AdSek7H/uj/W/QE9/Of8A5RBP+YuL /iL5577Qf4v/AJw/S937K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8AJ/8A5QyP /jPL+sZ3HYP+LD3l829p/wDGz/VDNZI0kRo5FDo4KujCoIOxBBzcEAii8+CQbHN4T+Y/kJ/L939e slLaPcNRO5hc7+mx8P5T9Hz4jtbsw4JcUf7s/Z5fqfSOwu2RqY8E/wC9j/sh3/rYTmmehdirsVdi rsVZN+Wv/KcaV/xkf/k0+bLsj/GYe/8AQXUdvf4nk9w+8PofO/fLHxx+ZX/kwPMP/MfP/wATOerd lf4rj/qB47Wf30veWNZsHGdirsVfSn/ONX/KC33/AG1Jf+oeDPP/AGq/xmP9Qf7qT0nY/wDdH+t+ gJ7+c/8AyiCf8xcX/EXzz32g/wAX/wA4fpe79lf8aP8AUP3h4bnFPorsVdirsVdirsVdirsVdirs VdirsVe7/k//AMoZH/xnl/WM7jsH/Fh7y+be0/8AjZ/qhm2bl55QvrG1vrSWzu4xNbTqUljboQch kxxnExkLBbMOaWOYnE1Icnz7548m3flrUzHvJp85LWdwe47o3+Uv49c4LtHs+WnnXOB5F9Q7I7Vj q8d8pj6h+n3Fjea52zsVdirsVZN+Wv8AynGlf8ZH/wCTT5suyP8AGYe/9BdR29/ieT3D7w+h8798 sfHH5lf+TA8w/wDMfP8A8TOerdlf4rj/AKgeO1n99L3ljWbBxnYq7FX0p/zjV/ygt9/21Jf+oeDP P/ar/GY/1B/upPSdj/3R/rfoCe/nP/yiCf8AMXF/xF8899oP8X/zh+l7v2V/xo/1D94eG5xT6K7F XYq7FXYq7FXYq7FXYq7FXYq7FXu/5P8A/KGR/wDGeX9YzuOwf8WHvL5t7T/42f6oZtm5eediqA13 Q7DW9Mm06+TlDKNmH2kcfZdT2Zco1OmhmgYS5FytHq56fIMkDuPt8i+d/M/lrUPL2qyWF2Kj7UE4 FFkjrsw/iOxzgNZpJ4JmMvge8PqXZ+vhqsQnD4juKU5iOc7FXYqyb8tf+U40r/jI/wDyafNl2R/j MPf+guo7e/xPJ7h94fQ+d++WPjj8yv8AyYHmH/mPn/4mc9W7K/xXH/UDx2s/vpe8sazYOM7FXYq+ lP8AnGr/AJQW+/7akv8A1DwZ5/7Vf4zH+oP91J6Tsf8Auj/W/QE9/Of/AJRBP+YuL/iL5577Qf4v /nD9L3fsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2Kvd/yf/wCUMj/4zy/rGdx2D/iw 95fNvaf/ABs/1QzbNy887FXYqknm7ypY+ZNKa0uKJOlWtLkCrRv/AM0n9oZha7RR1EOE8+h7nY9m doz0mXjjy6jvH45PnnV9JvtJ1CawvozHcQtRh2I7Mp7qeoOcDnwSxTMJCiH1LTamGfGJwNxKDylv dirJvy1/5TjSv+Mj/wDJp82XZH+Mw9/6C6jt7/E8nuH3h9D5375Y+OPzK/8AJgeYf+Y+f/iZz1bs r/Fcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/7akv/AFDwZ5/7Vf4zH+oP91J6Tsf+6P8AW/QE 9/Of/lEE/wCYuL/iL5577Qf4v/nD9L3fsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2K vd/yf/5QyP8A4zy/rGdx2D/iw95fNvaf/Gz/AFQzbNy887FXYq7FWKef/I9v5k0/nCFj1W3BNrMd gw6+m5/lPbwP05q+0+zhqIbfWOX6nddi9ry0mSjvjlzH6R+N3gVzbXFrcSW1xG0U8TFJY3FGVhsQ RnCzgYkgiiH03HkjOIlE2CpZBmyb8tf+U40r/jI//Jp82XZH+Mw9/wCguo7e/wATye4feH0Pnfvl j44/Mr/yYHmH/mPn/wCJnPVuyv8AFcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5 /wC1X+Mx/qD/AHUnpOx/7o/1v0BPfzn/AOUQT/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKf RXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/ACf/AOUMj/4zy/rGdx2D/iw95fNvaf8Axs/1QzbNy887 FXYq7FXYqwL8zPIA1q3bVdNjpq0C/vI1/wB3ovb/AFx+z49PDNF2v2X4w8SA9Y+39r03YHbX5eXh ZD+6P+xP6u/597w8ggkEUI2IOcY+iMm/LX/lONK/4yP/AMmnzY9kf4zD3/oLqO3v8Tye4feH0Pnf vlj44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT/nGr/lBb7/tqS/8AUPBn n/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRX Yq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l829p/8bP8AVDNs3LzzsVdi rsVdirsVeWfmn+X/ADEvmDSo/jFX1C3UdR3mUeP8w+nxzmO2uy7vLjH9Yfp/W9n7O9tVWDKf6p/3 v6vkwv8ALX/lONK/4yP/AMmnzT9kf4zD3/oL0Hb3+J5PcPvD6Hzv3yx8cfmV/wCTA8w/8x8//Ezn q3ZX+K4/6geO1n99L3ljWbBxnYq7FX0p/wA41f8AKC33/bUl/wCoeDPP/ar/ABmP9Qf7qT0nY/8A dH+t+gJ7+c//ACiCf8xcX/EXzz32g/xf/OH6Xu/ZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdir sVdirsVe7/k//wAoZH/xnl/WM7jsH/Fh7y+be0/+Nn+qGbZuXnnYq7FXYq7FXYq7FXncvkD9Fefd N1nTI/8AcbLK/wBYhX/dLtG24/yGP3Hbwzn5dl+FqoZID0E7+W33PVR7a8bRTw5D+8AFH+cLH2j7 XomdA8q+OPzK/wDJgeYf+Y+f/iZz1bsr/Fcf9QPHaz++l7yxrNg4zsVdir6U/wCcav8AlBb7/tqS /wDUPBnn/tV/jMf6g/3UnpOx/wC6P9b9AT385/8AlEE/5i4v+IvnnvtB/i/+cP0vd+yv+NH+ofvD w3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3 LzzsVdirsVdirsVdirsVdir44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT /nGr/lBb7/tqS/8AUPBnn/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0 vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l82 9p/8bP8AVDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/AJj5/wDiZz1bsr/Fcf8AUDx2s/vp e8sazYOM7FXYq+lP+cav+UFvv+2pL/1DwZ5/7Vf4zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCI vnnvtB/i/wDnD9L3fsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8n/APlDI/8A jPL+sZ3HYP8Aiw95fNvaf/Gz/VDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/mPn/wCJnPVu yv8AFcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5/wC1X+Mx/qD/AHUnpOx/7o/1 v0BPfzn/AOUQT/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq 7FXYq93/ACf/AOUMj/4zy/rGdx2D/iw95fNvaf8Axs/1QzbNy887FXYq7FXYq7FXYq7FXYq+OPzK /wDJgeYf+Y+f/iZz1bsr/Fcf9QPHaz++l7yxrNg4zsVdir6U/wCcav8AlBb7/tqS/wDUPBnn/tV/ jMf6g/3UnpOx/wC6P9b9AT385/8AlEE/5i4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRXYq7FX Yq7FXYq7FXYq7FXYq7FXYq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3LzzsVdirsVdi rsVdirsVdir44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT/nGr/lBb7/tq S/8AUPBnn/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofv Dw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l829p/8bP8AVDNs 3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/AJj5/wDiZz1bsr/Fcf8AUDx2s/vpe8sazYOM7FXY q+lP+cav+UFvv+2pL/1DwZ5/7Vf4zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCIvnnvtB/i/wDn D9L3fsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8n/APlDI/8AjPL+sZ3HYP8A iw95fNvaf/Gz/VDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/mPn/wCJnPVuyv8AFcf9QPHa z++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5/wC1X+Mx/qD/AHUnpOx/7o/1v0BPfzn/AOUQ T/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FUX+iNV/5Yp/+RT/0y3wM n80/Jo/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50 fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHuH5SwTweT 445o2if15TwcFTQkdjnadhxI04BFbl879pZiWrJBscIZlm4dA7FXYq7FXYq7FXYq7FXYq+RPzG0X WJfPmvyRWFxJG99OUdYnKkFzuCBnqHZefGNNjBkPpHV5HV45HLLY8yx39Aa7/wBW66/5Eyf805n/ AJnH/Oj8w4/hT7i79Aa7/wBW66/5Eyf804/mcf8AOj8wvhT7i79Aa7/1brr/AJEyf804/mcf86Pz C+FPuL6K/wCcdLO7tfJN7HdQSQSHUpWCSqyEg28ArRgNts4T2onGWoiYm/QPvk9F2REjEb/nfoCc fnKrN5RQKCT9bi2H+q+cB2+P8H/zh+l7j2WP+FH+ofvDxD0pf5G+45xfCX0TiHe70pf5G+448JXi He70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiH e//Z - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:7AFE812EFA94E911B987F622BD994B0C - uuid:5544eaeb-e005-4a01-bdb2-9e7085444008 - - uuid:e177ff01-74ca-4810-9fb1-85109f60768b - xmp.did:76FE812EFA94E911B987F622BD994B0C - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:7AFE812EFA94E911B987F622BD994B0C - 2019-06-22T17:16:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Mograsim Orange (255,83,0) - Mograsim Blue (7,83,235) - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - Mograsim - 1 - - - - Mograsim Blue (7,83,235) - SPOT - 100.000000 - RGB - 7 - 82 - 235 - - - Mograsim Orange (255,83,0) - SPOT - 100.000000 - RGB - 255 - 82 - 0 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 8 0 obj <>stream -H‰¤‘M -1 …÷=E.0m“ôgfkW£H0 ³p™ûƒiG´ wRèËK×5çfLvûʤlaZÖé¡ÌQìmUOiX9ìƒö@N®iQ¥·¨a¹qt AŒv½îûRÏêª.:å‚Îéô'ÒÖçYå ŒMæÌQàV;ÄðEw¡‹V۞Q“—!ªÜÆ4¹á‘¨ÉÜÅXS-©Ñ¡8$™bÒ.¸·“4šÙ×m䣎þ³ë0ʼö&QZ -endstream endobj 13 0 obj <>stream -8;Z,f9+ln#$q0jV3/j2:`@\UF.%lb@!r5fTjfhE9rL3Fab$V6Oh2lOOPm2G\:+Cm\ -ds[l\O9oeHa:fQI!FKRqdT4*+TIEJ4eQ&n>2sl\[0Gl<%Isho(*Q)51i,km_,!l4n -38[j??3U,:!Rsg'+NrB$,lb(6.cm!C(OjAnM-R]#[<8Irb6tTY3!P7 -`b=946k=it;]qTj= -fmc5HMiYRW(4O[%8["`biP`l'hmR.rohT&^s%6\cs-e9/`QKp+rnH5UIpXgWq%8,I -mJ$8Q)ZJ4a5L"\hIkUi0lSAOrVV`H~> -endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 5 0 obj <> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 12 0 obj <> endobj 10 0 obj [/Separation/Mograsim#20Orange#20#28255,83,0#29/DeviceRGB<>] endobj 11 0 obj [/Separation/Mograsim#20Blue#20#287,83,235#29/DeviceRGB<>] endobj 9 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_orange-blue.ai) -%%CreationDate: 6/22/2019 5:16 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -488 456 -23 -%%HiResBoundingBox: 56 -488 456 -23.5352 -%%DocumentProcessColors: -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%DocumentCustomColors: (Mograsim Blue \(7,83,235\)) -%%+ (Mograsim Orange \(255,83,0\)) -%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) -%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%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: 1 -%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 20 0 obj <>stream -%%BoundingBox: 56 -488 456 -23 -%%HiResBoundingBox: 56 -488 456 -23.5352 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 20612 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 -%524C45CFFD6EFFC9B4CFFD6CFFCABABABAFD6BFFCABBB4B4B4BAFD69FFCA -%BBB4BABAB4BABBFD68FFC1B4BABAB4BAB4BAC1FD66FFC2B4BAB4FD04BAB4 -%BAC2FD64FFC2B4BABABAB4B4BAB4BAB4B4C3FD62FFC9B4BAB4BAB4FD04BA -%B4BAB4BAC9FD60FFCAB4BAB4BABABAB4B4BAB4BAB4BAB4BAC9FD5EFFCAB4 -%BAB4BAB4BAB4BABAB4BABABAB4BAB4BBCAFD5CFFCFBABAB4BABABAB4BABA -%B4BAB4BAB4BAB4BAB4BBCAFD5BFFB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 -%BABABAB4C1FD5AFFBBBABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4 -%C2FD58FFBBB4B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4C2FD56 -%FFBBBABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4C3FD54 -%FFC2B4B4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BAB4C9FD -%52FFC3BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4CAFD50FFC3BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABACFFD4EFFCABAB4BABABAB4BABABAB4BABABAB4BABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CFFD4CFFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4FD04BAFD4BFFCABB -%B4BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4B4BBFD49FFCFBBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04 -%BAB4BABABAB4BABABAB4BABABAB4BABABABBFD48FFC2B4BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%B4BBFD46FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD44FFC2B4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAC3FD42FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC9FD40FFCAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAC9FD3EFFCAB4B4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BAB4BBCAFD3DFFBABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BBCAFD3BFFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4 -%C1FD3AFFBBBAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD -%38FFBBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD -%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4C3FD37 -%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C9FD -%36FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%C9FD35FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4CAFD34FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABACFFD33FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BABACFFD32FFBBBAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABBFD2CFF7FFD05FFC1B4BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BBFD2AFF -%5B08FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAC1FD28FF850931FD05FFC1B4BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C2FD26FF85080F30FD -%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BAB4BAC2FD24FFAF090F0831FD05FFBBB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C3FD22FFAF -%080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BACAFD21FF0E0F0F0F0837FD05FFC1B4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BACAFD1FFF3009080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BBCFFD -%1DFF300F0F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCFFD1BFF540908 -%0F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BAB4C2FD1AFF5B0F08310F0F0831 -%0931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD18FF5A0F080F080F080F080F -%30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BAB4C3FD16FF850F08310F0F08310F0F -%0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C3FD14FF840F080F080F080F -%080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4CAFD12FFA9310931 -%08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CAFD -%10FFA931080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4FD10FF37080F08310F0F08310F0F08310931FD05FFC1B4BAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4B4B4FD0EFF37080F080F080F080F080F080F08 -%0F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABBFD0CFF5B08310F0F -%08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4C2BBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BABBFD0AFFA9080F080F080F080F080F080F080F080F30FD05FFBABA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAC2FFBBBAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD09FF850F090F08310F0F08 -%310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FFFFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4B4C2FD08FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAC2FFFFCFB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAC3FD07FF850F0F0F08310F0F -%08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4C2FFFFFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAC3FD06FFA9080F080F080F080F080F080F080F080F0EFD05FF -%BBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD04FFC9B4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4BACAFD05FF850F08310F -%0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4C2FD05FFC3B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F080F0E -%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD06FFC2B4BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4FD05FF850F0831 -%0F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4C2FD07FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F080F30FD -%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD08FFC1B4BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABACFFD04FF850F090F08 -%310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4C2FD08FFCABBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F08090EFD05FF -%BAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD09FFCABBB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABAFD05FF850F0F0F08310F0F08 -%310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FD0AFFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACA -%FD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BAC2FD0BFFC9BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4FD05FF850F08310F0F08310F0F08310F0F08310931 -%FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD0CFFC2B4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA9080F080F080F08 -%0F080F080F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BAC2FD0DFFC2BABABAB4BABABAB4BABABAB4BABABAB4FD04BAFD05FF850F -%08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4C2FD0EFFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BACAFD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAC2FD0FFFBBBABABAB4BABABAB4BA -%BABAB4BABABAB4BABACFFD04FF850F090F08310F0F08310F0F08310F0F08 -%31FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD10FFBAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F -%080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2 -%FD11FFBABAB4BABABAB4BABABAB4BABABAB4BABAFD05FF850F0F0F08310F -%0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4C2FD11FFCFB4B4B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA908 -%0F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BAC2FD12FFCFB4BAB4BABABAB4BABABAB4BABABAB4FD05FF -%850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4C2FD13FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BACA -%FD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BAC2FD14FFC9B4BABABAB4BABABAB4FD04BAFD -%05FF850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4C2FD15FFC2B4BAB4BAB4BAB4BAB4BAB4BACA -%FD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAC2FD16FFC2B4BABABAB4BABABAB4BABACF -%FD04FF850F090F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4C2FD17FFC1B4BAB4BAB4BAB4BAB4BACAFD -%04FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAC2FD18FFC1B4BAB4BABABAB4BABAFD05FF85 -%0F0F0F08310F0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4C2FD18FFCABBB4BAB4BAB4BAB4BACAFD04FFA9080F -%080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BAC2FD19FFCABBB4BAB4BABABAB4FD05FF850F08310F0F0831 -%0F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4C2FD1AFFC9BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F08 -%0F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD1B -%FFC9BAB4FD04BAFD05FF850F08310F0F08310F0F08310F0F08310931FD05 -%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD1CFFC2B4B4BAB4BA -%CAFD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAC2FD1DFFC2BAB4BABACFFD04FF850F09 -%0F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4C2FD1EFFBBB4B4BACAFD04FFA9080F080F080F080F080F -%080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2 -%FD1FFFBBBABAFD05FF850F0F0F08310F0F08310F0F08310F0F0837FD05FF -%C1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD20FFBABACAFD04FFA9 -%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BAC2FD21FFBACFFD04FF850F08310F0F08310F0F08310F -%0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD21 -%FFCACAFD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08 -%310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2 -%FD27FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAC2FD27FF850F090F08310F0F08310F0F08 -%310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27 -%FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08310F0F08310F0F08310F -%0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9 -%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08310F0F08310931 -%FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F08 -%0F080F080F080F080F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BAC2FD27FF850F08310F0F08310F0F08310F0F08310931FD05FF -%C1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F -%080F080F080F080F080F30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAC2FD27FF850F090F08310F0F08310F0F08310F0F0831FD05FFBBB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F -%080F080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAC2FD27FF850F0F0F08310F0F08310F0F08310F0F0837FD05FFC1B4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F -%080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD -%27FF850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F08 -%0F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF85 -%0F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F080F -%30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FF850F09 -%0F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F08090EFD -%05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08 -%310F0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F080F0EFD05FF -%BBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F0831 -%0F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4C2FD27FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08 -%310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2 -%FD27FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAC2FD27FF850F090F08310F0F08310F0F08 -%310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27 -%FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08310F0F08310F0F08310F -%0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9 -%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAC2FD27FF850F080F090F080F090F080F090F080F08 -%31FD05FFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BAC9FD27FFA93031 -%303730373037303730373037303730FD05FFBBBAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%%EndData - -endstream endobj 21 0 obj <>stream -%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%d_²Ý#)ɬ`1¦ó(ÉÌ"‡|™}˜}±ÕïS…fîy›3] ²2Cà 0\ -=>UüÍÿñ«ß|yýÕëßÞ}®†Ý“/þæoo{ýæÇ;’w?}ñâÛ·ïހôƒ_ÿp7ÎWžºþiyjOþÓݛ·÷¯_ý˜¿» -øí-ÞÿÁá÷oîß¾»öjw{÷Rúáî?Äoÿáþ݋;ùýýóׯž¾~óìÕ×w_þöÅ·wWÏîè_ 5Ÿ½“ÇæMӏ¦a\véÇã¼ûÕÏùȳWxööíýŸïÐl(luÿúÛW_Ý¿úzÿúþx—æݗ±”]Ä?&þþïï}÷ö¡‡®RHž<¾~þíË»Wï~õæõó»·o¯_¼~óöÇò›ëŸ¦§·÷//Ÿ½ÛGãú§ãôtÿíý‹¯~ñíËßÞIßçe$=<å»ÿøöÙ×ò¥ü7éùéO_ -é7wïÞÉ·¼ýñnè›=Ȉ¿~i­î~ðó×_¿yööþån/ƒ´û·ä¿+á戀þ퇮ÿ³{â—MyfJ O ö̯²ï*•æ®†)Ç4Ê?”â"/Әæå­u/=®å~¥i–üë¯dþîdßüûÝ«ÿþÃ:Zo^Fd÷e§þ?Øoÿáîå7/dQpî¦4_%™5þÕÿP–iâƒ_†ñªäeÙ}9Çájž©4Æ«QÖÔnLËÕRì6ëw¸¿ûãw¿xýêÎ&ýúÍ»ßèj‹qô¿ö«_ûâîÍ?¾º'=“¶è¬ÿüõWw/äVÅí‹gœl–±ýמø‡go¾¾{'‹ôõ‹oßqKoEVÖϞýé b´F~ùÍÝ«xýOüÔ/Çi»<™œ$ݚÊnIq76’¤Ù;µÝ±ý×jGU¨¨6‘1u¿’úË7÷_ß¿úqýÆüô'oî¿jË6O»¢ÿa?®J÷ÿ¥þß>W:ÿîÝÝ«úý²e?ï6Àpõó_¢Õ›W_^¿Ä<¼å¦¾“öe½xýµý¶ýÀßIß~cÝ á©LÛ¯ÞÜ¿BÅO¾ø…þ®<ýՋoå—?yóúÛo~úêw¯Ÿ|ñepÿt÷\˜˜ÌíW»_þöȦ~ñìù￾ûóÝýóß¿º{w÷v·—½-tVXÕ7?|OÅÒß7w;ý­¼ËåïßáïǼ¼ûp™VRÿþßBŽ/^ܽúòÿùöí³w~ùú«o_Èoo^ýáîÅëoîvÏ^}µûçgo¾yL¿zñìÕ³7;þ¢¶Ð×»ûé«wwožýû»û?ì^>“F塟ÝÿA^|&ãû¨d9}#£Æ—ø̺µ‡è~õ¨¦ž½û½0­»W_½õÚ¯_}ý³ø­ð¦íˆ±#úücªÿ͟^þöõ‹û·/½òžâÿ~ä—Ê°¾úå+ýä7ß¾ýýî^¿~á5ÿ\xõݛoî_½½{±ùjá"úÞ_UCþð¹F°yþ—hâðìŋ{9Ͼùýýós­ü7ûýïîïÎ6váýG­®çœªs­þ曻?ß?{q¶ÅÓ×þê³5¸»ùê^xç&ðà3¿ùã³wÏ¿ûÙýoß<{s÷žÝŠÉþÝý«¯äCóíý»;oÁ¹òõÝÛ»w~' ZØ+،¼p۽ЪOOå¸é“/¿|ø ‘3vÿªä'ož}u/G™Hq?yýâ+yøk©ºý[ŽÍ¼Ûõä‹}òÅÐýo¬ÿ‹»¿yº™ñ¿yûgܔ©+ÁJ´’øÿZfü_jœW%{)ò*×]ÙK9X9våf¸•okY}ZÿgêJèJ\•¤EÆçq–’ùwéʲ*×ãÞËÁË~ì‡Ãñp+ËnädÄc:ÎGù¼c9.Çýñp¼9ÞÞ 2=á&ÞÌ7ù¦Ü,7ÒØÍáFVÉÍÍÍ-–Æ­ Úmº•ÎÞÊçß^K‘FoåÕÛÍÎéÀiuÚMWŽ]9te¿*×]Yj‘i¾•Ü•yURWbWBWd5J“—ž³5®<ôÓÿ9®ÊA‹ þÞwåº+˪”®ä®Ì]†~“¼ÄU ]™º2veè‹û“/lúô]Ùk©[u5ŸëY\Ï]µõL­gGfDjŒýŒt3±ÿõ¨ÛhoF˜£*ãµlÆÔFr5†ëqیÖz|d¼Öã¢crmea)V²•™%Y‰,ÁŠ¬;nF;SõTð­P;§Õ?{–k+ K±"›]6>ÌV’•È¬(O®g€ðÕnNo8{Î[á<%Î æbàè9Ú×ÛÌь½‘£uÃÑÙs4Šô.³ïè1z9°WGöâšßù•‘_%ß"ËæF†ô ììZØZö6 “‹Âì&áóò¥²¤nd° ¯…-–ë, 2 £ rތrßÊÔePö˵°Ó²da¬Ilj”ûVÄQk/lx)òÂ’gaͱaÒ£œí·²TŽ2”û|-L¼ä,ì< [ÂÜG‘neex÷Âú9²I„ ÇÂ8Ë7ʒ¾‘É>È¡q-‡G‘#dNI“ ‡Ê(òÅ­,¼£LÉ^œEžg9‚¢E“HƒlY9¤®å°’o”ckI° Ù(Í­,Ö£L#ŽY¼8Š“}8ªažSöۉÀö$ž­OòYÙ`zôC܃€°P€PBDŒº6.´ÊšXG­¡½eZñ‹Ûî$PN±ÈK²¾FY[çVÖÔ#<¥ðGOª‘§Uⶮ'–Y8±äP¡~ÎF?gYzåÌÉüdĹx6ëû.c“`s•3(eÜPÎMÒH.k\o§Ão¸õšågʂÇJÁ†Òíԟ£~×Ç8  Ÿ§kŠ67ádPÄ]|RQE( ïo¤‘ÑDwífśèM•…µÕºZM¬‡¥ïŸ$ÿþ~2u"W‚…Ž +$ËJÙsÍl~x’!•Yõìª-«Æ²z¦E¶å£†™­YÙû™OÇf+–¼wùº–¦1••.•M¿Ò’V:˜éeRc0f Tæ_©Äkm¯žV® º6Á"£¸Ò"”Ы恿—M)›Ò4Vý×lºl_âI 'e:SìÔØÿ9Q±;{ÙÏÿ>ž-ÂZd¼ì½\_(ËÅRª†)5æM™Yšöšú"5®~v Gû÷i  -—†Ô8=²œä3Ej|ܓþsÖVðI>_Ýñ:úÀªô[¥ø£•Ûª-¤ÚFŠéÞÕvbû^vµêéu·W{LÛ -Û½]eߺ—ûÝ»·]]­§{7»Õa¶’Ü&ÑìR¡ß­nÍx`ŸÊ¿ÜÒlc›½Ywç‘GSµ±ô6¶ýÙ½¹_YæNwgµálwkYYùšU¨Z†ÎíWÿye;L'%®¬—wåÚrµµYžÛ·íæÍ^宾ð»ßÑî꿂=øùk¼ ôöêÕ©‚¥RË©‚Ue• -û %’ÅÌÙd’ÉÕ«ÛN*É+©dêT¬ƒ(YT±ž|!JÔ,U² f T±TÉ:ÐꤊVqE+˜¢Uë j֞ŠV¡ KV#•­‘å–ú÷MHET-U¶ nMªnQá:šÂµ§ÂU¨pAå+“µcj×-ui(^ªzAù*T¾ ~Eª_#·Õ-U°U0(aPò4‹GEÓ-PuŒö *dGQÈ ’A)ƒZÅ,ÇDÕ ÊY 먠ݚ¿×"|¡| /SʛñBÀŸ‘VãìƒuBš§²[¡z†ÉÁ{ÞÝqíN -«ö\ý»çɽ EyIøm<‘œ³®xéJ²Yq͏”ÓË,(nw–Ï= _œ‘'Ç5.r“ϼ«]ÕÒ[Èú?k£`gê\Ûáê™K•c4•¶•°*k›_ڔyUDXYóÊÆX¨c­Ëõ¦ì·Å,š}9ž”Ó?·§¥®6aýI>ž)ÓÙΖjE<-éB™/·'KySʃeyO‘beÕ>_ö,äøRãá‘åø¸"5žRÏM壋ÔxéwùçÌñúÑ5¹hp­u2'Š–hEí©Õ¾š­TûëbŬ³R£ZkëŸÊ*ÚªÓRùmÕ­«Ô_-Åj7–õMó”–ÙKµ5/‹•k/û3<ëóÒ Ç:Ç«šáááß<ùâož>æÙýÛ3u^%y2 »2^‰þ8_®pû k»ç¼D`ÿG(ÆS|§R¦(ÿÈi²_kÐZ¦«0¤Øšûäšô{QjӌHÙö3^Í\TwV¶Ä4,¢ÏˆsLïÐ* Wƒpšî³>S…öuó |•¥qH™/áÏZ™è–E˜„Ï¢2™¾´¬*Kðô_÷y*ü„¹œòU aAU%ååS't[ݹ5k¿,WÂç/.ØõS¨gløÍ -Á¼Ëüûû—/ï^”iÿ’Šc…dþg·Æ0'c•ÉÜ|Ùãµ±Âcï³56 m4CÓã\øØhxªÈCˆª=·[š?ôP›yœ]ó »!‡ž -—Z×´mÏ  9X=#jÛU1N“Á°—êò¬ØI:N–À(žûsÚ[nSg qL Ä$8*akˆNP|‚!h »1ŒÂ!¹ÛóaìE‡¼xîbë¸ô“}47|ïˆo®øƒžÞ;>úi½T—üÑ'ò™Áø •• -á£,¦¾Bù r¤®$#Ië kp t• ¬wÌîMÖQ6TCÃ5¬f<Ü-x yLÍaÙÌ^Ñ èc3 -?›ò(\Š{қ1X]ԓ≠Gttìе!†ªq82HAû›§sÜtè¦ZÕ{\zN” gJљ’t¡iôšòôžê´Ì§[JÖM¶V(&æQåk•°›ŒM)ÛÀ™ -τœ I[$^JۅÒv•·+™{#u›ÌµP!œ”»«ä-»l-{c•,ëžNÞ¡[¯7¾n°ïM÷§®ÃS÷ctÀÖiyúSÿ÷öß=-9°¿…rċ°‡Ë ˆ°úw Œ¢þ7ÞÍqÞÅÛ~ï_ûÆ혌¶lå6k÷Ä -*º?ÍmðÐ - 5H¨D$Ã{O±àš*{!;™M<¨~Ãф„µ÷ðÚ½‡™,Ì<ˆÂ¸&î¢êG<òóô`Ô£±Ž~<úYH8yLÊAùä ;*ûò?.{ çʹs:œóÉ*.™7q è¼é|ÔIq¥bÁ> - 6:»>…swåý€îf6±ˆ×n6ނ˜³›š×@æÊl¥2K[0óqf¾¼>‹Öçõ*••Ý€Ì=Œyð5{k¶íœ6°÷Õ«ëwáQÈU,+[WòÌ£²­ç`0;åòêú¬kûƆìÐyÈuK‘•­«=ۊŸ©uPŽQžLÞ®gˆ:RuÜpp8~àœ3k¾°-ç]fӉÙû$Àál Ãtô ëð$ôaÊ?qa`}©ñ\(DÞ88çûór@D šö|PÄøÀ.º´‡Ž@ŸÝIûÎÝÒöR¿Ÿº]ubȺZD( °Ìr?´~áêÿ0 - K´ „$\Š¹ -v"¯”xyº³v}® -ÕðQæyñj\Dt.fHÝV¡vžf7™¯DÒ*Ý÷|tú9a‰°Ð„¼0‡^Ç,Ê:‰¡·% -/íú‘fyuì¬vŸ\“™‚Ê3…¥Ðü%Gq -CF02é[=ËUJRJtf O­êM7¿|óü÷÷_ÝÝÁxãÿ–j¦>¢öjÉÑò5a’óÆ×ʌÑXÆg`ÊÛZdíÍ]}Q“uØ[;{É °H°1 ½…ê#Þ6 ØcßÄØÅùJçÕ4|l8ø¿AŽŽ7zûMqmà{9½JϽܦf#VãÞËoª¾epg(!U'J®÷d×nZhh ñíµ—ÎKeݦvZa¨-PW!« -`½l3H´Pwa”KÕ^Ôf°tZÌÞ$›j9· -Æ2„++¢õBÕ|Y–Tß çRKBµ&ì«üb'Fu¡¨h>ÊÜÌɪM"dÒÞ@t-KÅlZL†¨aWÉ¥%w‡WD”£d)dj ^’—ö'{)^®½ì[‘]i0µ[¨Ç©Ž«ºÂá{òEŽ^Òªœþ)›²œ)"læë“r¸PŽwnÁ0|ÁÙ>|pá‚…búålps oÎà¼o{v\ÇÖîÐ} Õƾ”¨ö„UŒ÷ÜmghþìÅbƒŽÕ-Ö½[›ìÝ:3ƒN]hK½¶•}C»Ör u9Ù*…UmÏ5yäZ¬¾ì‰+ªù±¯éǶy$t¤hõ¬v´Bó>ìh Ն6˜ -т¦~ëŽÖG3øƒ%N·› ‚ùâ64ú«iC{ÈgݼÖKg?;0à6íÃHº¿ZԔµÇz¦*ӐBÕs­úIC5$PÃqˆû‰+ÜOøYNð>+/v‡ïqd)k,OŸ·ˆS¤Î)JðÐáÏárVˆœ‹èœ•r²ŠÊ¾Œý»¤$­:ñ>ð6ðÁRm-ã:ºFA×èç÷Übžë—4E͔°NÍR¥jÕܢī*ÔԞ¿ì -M§À 嵎WnjÉi”rSë7*}¯ÊÖb­ÊŸ74¨ñޔxÃß­Õøµ"¿Vå×Ê|1+wöƒPfÉUú¦ÖWÅ~òŒ'C§ÞßvJþërn-¼¢6Þþ,^Š—v¬µC:y‰­H¡+-¦o\•w½†nô4'U8dc‡Uٟ”ëM9÷G4òØu9{°Óhw¹¸ $5¦ %~páÑÆ4Ÿ¡|T,üÃÑð !•¸"=ˆ_‡’®£âû¸xóÎÊêžWÚæ£=®L¯+ëzkÝ_[=¶×>ÏÙæIÇuÚrÜ;¹lÂ9B3¾šùõ&ËZ$Øs+,æµÌc«[M±Í‡½öb·0L)XVŽ{¨7{Z|ܐ­Ã>J-ÙM¶Édy™~¤!¾‚h(ÈÁŒ¹ë€ Q‰©†hhˆj!t6‰UƒDnM_Q†ªloOðµkØH82›âaJMUIm©ÆìŽgÂ/ Ö0“uÈ°Èz¦±-¨z)l¸•x.„؉OÿœFö]Š%;þvsSn>¦¼3FLMY[Î?Pí i(¢>$Òïbf‚ûÑØ,In7Ú8>âõ´1üã«WÏ^Þ}µûÚH»ö†3ÔÞès.Sr¥ËÂ4^ý×$·5Í€Üná¶ë k ­Âp½‚×N0:9¸v9qk6cI_ÊÇ‹\9£Mž òøŒåû/=ÑIU~›«¨Ô6QrÈ«¬™áh™2‚›tV½JJ¹di Ï“h ž ziN¸l`Ko®-kxÓ:¸Éy–'áM -²œÝ8,üHxÔ¾ r2Îd¡NQáÓ*à)yÐS-Õ¬¡¤Fc5ux›¥šVšÙ¥EÑ43͸-D<µΔx¡¤“Bî(5ÎËÿʅҌVÅ°+RN,Hë"5¾ç‰-®ñѤÆÏüçà(ÐIn,"Q ¹Vç”'~›Mç¨ÙwÁOL׎r –¡(ͽ -ïÖAûi•wW]M¾Ý»™Îs”ÊS*lûLÈäY®RùJfZHå.×+΢6ø-oiüe2‹Nã2ÉLŸrZwœ¦þiËuÍgVà¡-Lªr•£V\ç÷™.” Ú£/s¤÷ñ'/Rã¿ýˆò0×û¨ò}©?0.êѬq B'v–¼²™eˆ99ƒIK]bË>Ê‹Ö µ«T¹©:Üg³j®¢’ÃÆkˆÒ5mZ·.?E§{çú-å§`K™L - -ÓxòÝé -Âk©]ýµ1:ғá0ÀvÔ'?®ò®àNô¤¼I8Šþ9XÜ<½ƒ9ÒµÔ=_ç´2°êkHj[LØ{ÛiV½æÔkCkýe+Ýv ‹~¦Nùýe~l‘ýì¦;3Ùñ$ð^–o¾I²‘K÷hyÓfæK˜)mO“×Ls×h™Ñö²ÞÔ¹#L\0oÁWšºÑ4náÈìg­jÖ3ºÊ<½tÉ5„O$Š—ð˜ÔÒÛäҞ^ºE#<ùÂÜ\ÕÅUÝ[Á¢Fwj»Ø„ë.·Yscх%O±Œ éqɌ€J² -AÉ9©3~¾wæüç|ΑÿY«­>}„ƒa—Æ«A¸Ýʳ¿ù•¿!ÍÊoæñ -‰&v!^Íc—nëG65d©8MónÂõÞK>WÃö‘VCÎçÀ=ýÓñÓ<Ân€ØK=í®'åðaÅkÚ®ñç!Ïω—Êcæ4f0€üсñ§Wx•Óx£Î‚ÙßR˜;Œ\ÏgÇç¦üÕÖÔ§l:xbÆf_³â³³žµÕŒû3ç°×»á ŒüÆ%»ÔÈowêRÔ´4K¥K°Ô¥Wú,Ϭ™`˜‹2©®…¶5Dæ»+q Ìm7¤¸ ә\€2}¾:-6: ÓÈêD ÓzáÙÄtçhxVC²aÀ¥ ‚îƒ>®ký³ôæóÏ§³ÎóŒsú(Øì8ÏܗåYƒmòb\‚MÍ'`Ñs0× Xׄ ^û` ç{sB»ê—]u4üõG@Gß f?®ßAà[‘,lã=-|(sÝF 9å=¥&®9Èö7hc8»Âv?°nÚäýí3éÁrã¹~[¦ßÔ]ϧY÷Lid™}»øȖÏwö<¾×÷èëšN6éž¨x&*¡Ù K ]n{‹×¾1¨Aƒ/….n8&f·†ÿQÕ7A H™èŽëã[û¼‚º<ßÑ6ãQŸóh"²` Þ æ=ê3u8–ýèLŽß¬RpJ ÀùŒã {òñã3+ÿC“…l¶ÇǼ®§™¼8 HÿÆ10„¾*üm.sŸ7µoðCÞúä]XÎoòMÁêÙkþÀ>cw…ÏšØV—ÃI†ð -émЇõú;7:@L{»¾/ê;«üœsyî±½9¹ƒí%o窒mýßé…f M‘ºM/u.ÁÔx&Á”%—¢ÔTž]Šù¬±¤~ø­žú€$TGz\±¥k̕]íTc;kdàÔ"½íÖN:ÛÚô@Ê+o±±Bi{‰8ÙÊœ%ú|Ñ<: +¹áÅV /´ -ûQÆóÈ|µ³|É$í⪅¦Ð µÀ -ãgv “ç"«-ɪCV\6µ—µ˜…÷ÙÄ·Œ,¼æ%RX~‡éy îQ×þ7èÆnØÞ/ÿS·Ýíµ.sªßWà¡àv‰®y C˲Φ:š$ÓzxÒwX¼sÅ°+Ÿ¹‹á^»å¶L ׂ(ºŠó!³÷7¯ ºëìrÖ¦U¶ö—¸ú–¯7È´ÎE[lÅD< ÷è@͖×9õ ªM†g‚§.œéä0Jf–¨D(ԁ¨@ØÀN78E™a`)”´j ?þuý}ߟvÛ·^LHìG_\oßþþë>ñëVè,ûa¢åaZæaˆ%¯dτÄ@4Mwú–D¯ˆ@Ø_ñ™ë5‘5”¥y™àOFQF˜âhVËNÀUәxótµˆ:ßëg­×ŒEŸfü¯uŽW8®?ŸSaS¯ë€Ü¿è¶0ö-CX8EÃ\´ÿ¼BâÌ?Ϋ Ÿ©ÆOU!âY "nýL†…dLÅnY¸å •uâ~…[K³®éÉõ8½±ã3˜$☮[êñÕuÑ®è/ð«}ú‹}º‹Òdo‹¶¹º"ms9Úúb´V¿¾­»m•Ýóá‹WpoëÞ±õ¾ò×P£5=ö:Ò FA˜)$šxXEý§( Lþ—™®ü`½ÆÊëQAÐґyÚÿh)øªéæÀ#äÖӍ6ÑSæ7-‡N5Øh^«Á’M4Ù P³ëKc×BÃ,¹smÓÍm¯°g*³ó%-‘œseþØÂKÀ>kùð}´ìz5ë`½$CoŠ­©,³ýéè5:LÑÁS°OôØô Óûÿâï> ýÐ¥£ïcCðQ¾¯ñ±o´{mٞQp­3.txóž×7C.œ(B"„<i0òZæ2Cì¥@…ö\’;9Ð%Á£ÁS®íևz…r½ó%00¤^O_o³h·`ô—%÷WÉ/'ËßSò6ó—#¿÷¢öó—$_¼lý£/]ÿ«Y&z¹^nžhóé!qÅrShf -ÏJñðmEfãjÆw·n­ ïû.ïU5¼×ÜW½é},ŦÍᏖÍtoÆøkωUÍòŌóõO—ò•7>õ%ž”p¡Lç o·9WƏ-¼¦ý³–¯ÑÍ]Ñ;,ªËb<TðGñlˆ}&D™Ó* b»Îà1ù×™ÛÍC„‚—>Ìh˜Û„,½èõ†7l]*g%Ý÷”ƒ@>[ùk¨qkCü¤¿“TI¤Æó¿9YÈéEý…T§èÄ>½:d>É,ºÎ.:žìªº§ö¼=ûÚ\†Å/¬‰î8lىÎç'7§€^́s ÐpkÐhõ9îoåÃ÷äð³ðô©ø™ó/HRç‹xA1E…öëu9Qr6¹¶{¤\S›\•~^s„דMsŒëÉ£b‘¦>À|O.[öÇH™p¢@ą¨a”–é1¸œy-›#l‡ -&‡åvÁ€ñƒ¨œ*)ªµP¥Ä=ó"ª„HÙÐ$BH‚ÿ ïAÊ»¦‚yÍ}oÿñÒúת…}0²ÝIßÔÿ·)‘ûüŽ®µšºP­ŠjÙ(ªy¥âZéTœOŸ“?¡V(.Ý_j…ÚúéµoÛkÛz5ÈÕ£“Á¤:%5.¦`í7ØV¿„°»Fpê píê‹â÷·î-{bugö͇\š§9,[K½~bqwÕ:#ہ9’&Zªp‘¯#õ;nÿÃéOªñ‚Êq¡˜¢Âlërªä¬• NA:w…ÔèNXÙ[˜v­ÄM—fðœ0e…¹äÆ흸óêbÏCw©çDÇgºÖË<¯-s]µ–Of+/t<h!ézLòÉ°ˆ;æ?^þNj|P%ËãC2?ôxõÕmö®JÕ¤ó…«WŚ‚V³645n6En—;H‹_ðP¯x8¬|k/F½ä¡AgóY˜—BDkƒ4žÜ§¿ºKûps<ƒ¦Ë¨{n†+ŒWý‹°¤d¦\®pãÑ.Ç«1åÞ!øiõ¨S- ÓBˆù0N3ïÙf:&ÍãÃ2„yzÞ;Ç°‹ùJv÷9Ÿ\•ÝmöA½*y7Å«¼þ’®âSyé¬#/m¹g1:Û#íщcò¹¨­ñQ[—¯;0…ñóۀÖgÔ#á#rÀw˺ÝYu´[šë½Uíæªâ7WÍÝ=Zí¢aÞÒuæÌø`ö»^Ÿõº]ÎqrsÇz)^zàSW]>/ˆåIÌ *Óê>ϓøº®ÙX!¯/Æï5yh>·®»ªy$­#ˆ lu–MLàöŠŠ“o¾ xya_毫åý Ï~,×~xÓ<î,xÔU çî€åT£B# Ú(ü,¶þ;ûFØ^P¼ÝEŸ\ÙwUøÏw÷ÿßÿûw»ß<ÿýŸ½ù3¶Í†ò—º”æÔ¤÷‘×Ò<ùâ$mqM‚^“÷ ‹~'æ:zMT| ÀìƒORIpù†þ -†}=ð)‡îZFHP’ýÈ +ž7ԓ{n A3Îw}åωù÷£/ýa¢¢Ëk¦&~Mv³ª®š–îºÊØ-å5dë…AUº¾±›|‘F“îڌš4—rærLY'†è.÷ئ9žO3ñ¨5ñ1* ŸëJ¥þ(_«'z0ûÑßµ[×C—ýÁ5ñ¾Dèë4èfî¦'ùS¢¶«ãØÅ-}pÆzxöV-¦Í~´ýÐñ‹½XSü[’?o5†0џ§ù;>*Ñß:͟Ån‰ÌóIÑ[=m¨]FoÉ*ûèø-"vÒ˜ © Œ.öÖí&ÙO>Ÿèû5ñýšø~M|¿&\ë´`1ë4ÿׇ¿üš·„òô¯_ýêÍý«w÷¯¾þòË^uïóä‹_|Ãßýݯž½{w÷æ•hõ×/þôöí3hóö¯Ý²\-ó´À ç9즯™Ý4ÎW²¸fýâkýë_þˆ¿¿Õªõ_þ¤?ÿWù÷ÿêe(v?ßýëv_=á[¿Æµ¥Zñî%¨'íí~¶"×ïúY_ÅY⺂WøϏ®ß¼;Þ?wÿúÕ³7ÚýX"?Ú¿~ýBÆâ§6.Oo¾º÷úÍÓý³çÿ.£÷ôî_Ü=ýõÝów?ÜýÞø¿ðï÷ß~«µµÓ¿Ôµ2áÚK5†ŽS⪉²ZŠe‰´KƒK½÷2.eËî_ži]ë‘ ãx5„yÜ¥rDI°’~NRÑ.-W³Èd;a W¨-e\QwS‘Ç…ìRºeîžóµ’®d“‡]š®f؊q§¹ìâr%ú.Mž¯Æ ÏÇp%;rªï-WCÓ.Èo3«Ïln*Wi‚Û¡ WiÁûù*À¬¯åx%úÌnšú,­ÍҊ¥»0éG„sí‚tC$d{M¨£h8;™ö2Ê*œó•ˆ¬# BpE§’ÉMS(µsó µNqç+\Qµ›dpÆEVF¯¤Kø{"¤«èoW"íŽþåӜ®„O&Mš‡ätó|DzìÆ$3;Ïõ½ùjn´Cø->*æ%í¤¾qt -2Œ†äïI§0r_ŽWÂÏ0b¡\ ¢ïí¢ ¥0K!ȗ̳°rdïÉÐϘ˜1[g¢°ž.3Žߍ™_êÌltxæ»C-¢‹–4ŠBÔy‹éJØZ·0^ɲæfßQú&2ïæ(˜ä£ã$3»,»YÃë{²úÆiÞåñ…C)ÜzÁkr† Aöj h'ƒ—…§·Õ5aOHeˆ­Þ…Aº´È(Q&|Ùap1Ëâ”óÁfN>ìjd$d-Â+&« -ÍI3E^O2TAWwžtê{2Ó¢ñgF¹ç«Qž/sÂæVùvÏñ½ßé?ê엫‡‚W¸o^®¨²Î¥’Kg)²_d‘¡#bðŸm%É×-2qþì¥ØÕÁkC¾ÔA“e¼ÌxÄj'àÔÚ©„¶dñ5í±Ú ¯hÓ­Öñ0–+á:2–AX€,¯—kjÔdyÊ1AC9 Avã,˺lîd½‰rÚ=µåVQ%X{ö^¥NW¢ËÜyEãU”Uеg{¯~–?V?Ü+Úô¯uýoÿÿýÇ8C~úöéϟÉ1|xý͟ž¾þϔŸ¼yýí7vˆœå×wßÜ={w÷ÕSid{Ú,»üp÷/ÿ|áà‘•’恰*‘Nºmaj'Ž°©<¥þÄÉz_½8±\ ߒ±Á>Š¶–é!àñ•UJ;áss.< -÷åȵ,r£ŽØ( gZtÁê{²Mµ¢¤Õ;a±'ô½J‡Å^œp°¡Œ³Q„3ÊáÞQôÕ·zP´>8ý6§,Eå}³R…qx¯ øá²;›N kO†% ¯šd|…é¼\SErK…aF£+Kq&Éü؏ÖäɞÛ3Ê ìË+q‚µÕFœÔQ&¶ ­ZÏ »Øº]ݾȟªßìõlº¶Ý›E‚pcÀ÷9J轒smœ-¥öÀ°Eáò%ÊoKp’³V†Wn„9;Åޞ˜\WaWCDÂXaÜXb8à9–ä(Âce§ƒpqˆLŠätÃÀŠ ‚<_d@…µ !Ö÷„'i]I`ٞh§n‰ ÞیÊé1„M3HÒv¤…—k*:Žã[:œ"–Ñ$ÌW–ןŸû`‹¦ØÉ@ØDWI%X[öZ¥ÊlË0켞ŒAŽsk­ì=ý¤öTýf¯gÓµíâw×ß|æ7Ba=S0²lÔ$3&3-Kõj,< -–48èÄÁ ÆÒÊ'í1Ì‘×S ֜½W©ù -úþ®U$rw’¥ÐÚ3‚½g_åOÕÏöz6½ëÑô6ÄÏ°‡GY8)OäV‡u ¡p`îg™%ÕFáùr ó Çhjž°ay#Ï|0c³ËÊËxqXºs–Ë`  x ö #cr„®%Çy–­]†±î'ù)Îò‰¢Ñ,äSe$…§î–A?`»XOuè"\±#šÊU*jdˆ™Ò¥Ü-+‡ s…Ÿ#UN£øZ‰SÓœdæ±«Ë Ö¦½édŽ JZW—ˆ³³l£®Q£Ø«þuþ wÀ+Ûö´ Ƹp˜ø&“ú1Ï%aqW²¨Ù"Çc`Y KZQDÌ+“O“±×JÚu•Éñ«ÖªQìÕp5 «ï”h³®2§¬[u²žWæ]ØöµÙ7#Q“C‘–_®©MHØuA‡;âsD”EÝX–•à\ -Y‚ÚcsÑöŠœ`í=¯‹O©AÖ @Ø^Ñd½òöŒ`»¾~–?V?¼V´íß{$½O2pA `ªê Zà~¢P¸= ÊEî´´Æ(қ¨pkƒ$[À7h©ú!«©´ æÊz‹kƒj["LfÐ/e{Õ¢5ÒR"ÕºLÇÆþšÕ>.ÒÂÜ(6†ð‘@6mNpctUéϵE7¤/ªS "ÚîZ5PÆ8…Þ^¥Ø‹õÃüÁÖ§ZÙI/¿CÉ—åÀ¯ÔrøêöÃsa¼úý à¦4»Ïr¶‹ ‰7«ço”7FõÚ¾Àù#ºBu4:c„eÄê:‡!  ‘Føré”+¤ÀÑãL¿=ÜìŽýPΒLï}ÀƒÐÓ4ªÓ\É"û‹|JÁA e2ØA¢Ú³8¥Ê€ºfl®¢Ø×Á(1¹·q‚-€3*4ÊI><ϋºëh—‡%oZÀóDu -Áµkøöq-¾®è´Â$;jÇè–<]§ªã›¬%òṞB¿¹Z)°ŒXKd|2‚¨Ïs#ؚ Š8ꞛ`Í諪kÒ^¬Ô`xàVÓ¤gkkqêÛîËü9ÿz¯kÛÍïPœÀ äNt2ð„ÓÇQ‘ ¥nLÌ éj˜ª ë«Ì0öÂxCÕÖ)ø‡ú"”Ò™òå؉sXiµ…0 §;¹b' ÚP4Äþ¨êF'CÂ;„…ÛÌKJ.ÚW¨b8–• ™7dpJUÁd…ªÐëÙHM†l䪜j~>©èŠ>LÙ -Ã,+I;¸†FýÞ¹~¯üC-ƒuµRœgäY•8F`¬”þ°1­lé•2ð%~/íêbS ‰NÍßò †ªà­rµ4 -ÀÓA4Q§D74xlPû$Í©þ¦2—<^Ѽ9LŽíS–Ô©UɎh:/Me‘ÇR4k? -x¬+¶7¥„ÕçFAR=¥Ðùd‹õtٟr,OàöÐ%Zí^nÈrüš]DŽ‰Ðìo”oáñÙËJ±Í!žÁXۃr–¥¾*û9ôvÂJL¸qmÜuÕÀÓ]kÏ(ö¢˜?èï•m{ÙyeýÒÿ†•Ï£ì冼¨ ðzî` H–å<)<Ï)Ø•Ô=(›wJ«Êœb­ú«FÎ*·Êàޅ¡µµZ)öjý¼ö wÁ+Ûöµ™ž%á\u’X̗k2pØI¹kÕ,ƒ …å0¢8œà` ~¡=‘f0tu9¥6j¯:¢]µ2B ÅÔ6ígãõÓêS­Sµ¢“n¶!€ÍWD¼Â©žCõwäÉYq‰"¼©y‰’9¬²YC¥?‚ÝÆúJ&tmšçVYG±VíU'OË®« n‰úVò¼~°}ž?è]°ÊNûڍC€KzR´–è?ÕµçdØô ÃCó”+£t´Hs£<¯ÒKJóÜ?H8Gé*sJmՅ #›a¤U&\•1\Þ¨ÌiQ?®>ÖºUk:éèwf,pT7“ GþìŽólfÞيvÇ15'8²*ÜVPÜ!PïPè’rÄ;°é)Óâm÷I„¢|6ˆy‡€ -YÊ1ï3õ¼VÐ;ž ÉHz§¹%α¡Þ)1ê¯ÂÞÁtò…½£d9 ŒëtˆÎWÇ?¨Ð­¡ïІ‚*A -4ç©x­ãѝòÜÇ'C÷ AÛ»º*¥6ê -•‘Ë@e­.ikʔk£•âòcŠ¡λU«Úöó²êÿYpðtÏMŽwmdETÈ9–˜¬¥¥!ӝbC°wȽUåkÒÞt²üóv]]ÙÌÑ­Ñܛ­ýãü9ÿ|¯kÛώÛÁx!ÈZ5·Hœ,r—¼ŠPK@”ÐØGóy¸ðÕ)¶M„áÄyì °–—®®J¨m:Ë"&=€ÙZMX[q雬ë·ùƒþý^ÙIG¿CۇC­±±ˆ0_EP˜£±²†`÷¤@Æg±P–º(Ó@÷#¸ƒG@FZò4µð§˜h¤ñí¹Šü‡ÄnùJYƕêddr[ÈÔ#@¹Sõ “mºG ÀÕ¯ªHÿc"(…6Ê ó…¿êd‘ƒ†©”%Ё%à“œ,J =XÁÿS6ÀD£T‹† ]F¯ˆ‘®APanAÍí{k\#j˜«Aðx„lÞs*ºPJ:5¦ '@$ˆ P{ 0šÔ0TßÔt‚&‹À<ŒãXZ˜Îä;ª’•Å @»ŸK'€ÓŒqºzO-Ñ@ÙvòrC•—r;Ÿ=_ºPJðõBt{̺šœbMڛN«>]ë(lêÃœb¯Öokú÷{eێvJCEÏÇG"­à~'{v}8%õ2 Á^$vXZ«F±W Üß=h]eNY·êdÿ<¯Ì»°ík7I¥”£›ÐY˜°.Êøj ⼂÷â<‹ ÿö`h•5Šµú¼.A#f«i• Ö½ÖªQŒøçùƒÞ…ZÙI_ß#4–°5$®Æ 8"Îç‘kHœ‡8$Îcç»5$Σçᎉóø5&Î犫!kLœÇ8&ΣçÀ5&®† 8$Î 珬qî@ôNx4#âºp‚çñŽˆkç+DœG8$®F8"ÎC -V€8)¨x¸Tàp¸V°FÃÕ¸‡ÃÕÀGÃÕЂ5®Æ8®8®F¬‘p^àP8/p(œ¬ p`àP80hî÷c°†ÂÕ GÂy”#á<Ì`„ó8GÂy #áNw燭áñ×H¸Žlð5‡ö;À­F¬p(О«±­®FéiÙl^™£Üj£k4œ\÷œw ÖuÒÓõù@pþ ב ÃVaþåæÁ+0œÇ ´Ç,ª «È)=2­#„­Õe(·Öd†óó§üÓ½¢m/é¬ÍÝ ;Ÿ0j_r2¬Y´Tô“–jé)#3ŠYp L¹PXXs_—S¬Ñf˜P²l²‰ö¯ÌD„®Õ^hh_WŸk¨uô´Û Ÿ¤¹oSoQS QW@#x¹!œ›ÈFI'nª·ˆtō=¦™ùƒ8;çÐWækõyµ9hDpWY‚úVb¯úçùƒÞ¯lÛ×~T?Ag…»rȪ¾¤¼Ti¶‘aNcZàïqœwO" 8¬ÓäjŠiî*kk՘~%/¡æ]«L(y¡×»¶Z)Öjý¼ö`íB«lÛ׎[Åb² (lž—2FÙPvKJ–Üe„°¥÷u-bħLýƒ}eN±Výðsr™ Z¬•ÁfWº6õg{­~Z}¨ë“U³íåçڛÛdnTH£Óˆšz¹!ñE3íf•‰yÑd R÷ÒQÚ›ÇՃâ£#]u2d¼Ë€a¨¬—F’J0•0àV´Ü?‡m7.}]N±6]›42œ5€j´ÊÀv,]£F°7ýãü¹úý^Õ¦›ßÍ¥¡g Þ$âC.Äv2ÌZI…45)"×’(㌠sÐÅúÆìʱp0cS«Ì)Öª¿jäI™E«L(¢Ç®ÕJñ¹ÐÏkz¼²m_?Û! ÌRP‡_Àï_®©¥¦†˜ÍhÉ ©¨e\ûÐ(&ŒÄšmÑá ™ ºÊœbº½GÉ2t̏×*› ™j­VÊóú½úyíAëA«kÓÑ6‚Ÿ3Bî=oŸÑ¿Yjj·´7­*²[º=ä±4`7h<«W¸î‚X•ÒPÝ°@Ì@b îŒÉ¡ÙµÇt˶¦‘¤Y;3vD÷Œ´„x÷€îÄtÙ±á¹a¬¥S¹Â¹á!ún…æ†|¨ø-ˆv‘¸ÌÐ°Ü È|*œ=”[Úӈ†ŠäžMGq ÷ Üì$=Ž;­–ã΋lꊛ’6˜Þ -Ä S²¡Æ Ä=*Ðrl nb€`±\ƒ¸šËËF_#„9ÊæÃ}2ó'6Ï8ñp=‚»QͨŽ„›¹t¸lÄӇüv†{ƧJÍò‰Åҝ²¢Fè¡ÔjëV‘¡²[{=z»}V}Ì?Ü*:éß{@Ÿ†Pet°aÝvr…n/È¢#?Wä6|ü¹nÃà nTqÛÂàåÜL ¶Í|@d= ->*2µm̱ØØÈd[¶üÂШJ HØÁ°εÅj‡ž44€ö°Af ’ ´4W‘=AÝÙⱡ½7,öd_RÖȇeRek"&ÅöW"ÒñO!6v´ZVlCpl|{ LÆw ½ÆJÍqiÈk4Ày©Àk¬8F¯€×¹;0Ü5ˆ–¤ -»fŠâ”6¨ka>id&c]ÃpÍÇ*æºd#¬ ×#ó@­ªë¶8+äút¹žpð®ˆéZ!®ÕPÒL&Ձ«s5“­ÐÖXÁ”úü1Ä s«§zès£DºUd(êÖ^¶ö¯2bûl«ç¤w­ÿ0ô¥”6@ëF­Ðh³ª;xA y‹±!—‘5 b-çóÜWã„5ÀºR+$ºVä¨ikn ®¶oªÄöÑVÍIßZ·ã±;ˆó˵B¡±qù§£¥C´d™+T5lscéžÂÁÑË멄¾¹Q ]ë1 ´7Öéý“êCޓZɶk­×H¿Åd+(u£ø:ö°i€~R˜V"Y ¦?Õ«Ó*rBgnTƒ=·Š ÝÚëÔí³êcþáµ¢mÿZ×a‡‚Ÿ~ž®ÄŠv–ý¢y8+ Æ1æW]§…ñih¬?&¢Ð: ¶VæF5¨³Wd`ho®‡LûGՇjOj%›ž]rðÁÃ?1—ø -RÙȉ@ߑrYEJÊ9^r‰D%\ì㜵 [7sÃ[MNXaZ1^Q…Iz{+8eû®Jnß^«:íäw£Ó|R֏‹’†Ý~}÷ìÜ8Çû—Ou÷æùÝ«wOÿÛݟ¬ö¸ûÑO_½;ó8þzöÛwځŸ½~Þ½”.½ô«7w¸¿ûãÓ_¿þãÛÚÏ™h%—¾‹wòüýÝý׿wyh곯¿y*czûæõ«÷?ü³»ß½{üÓéêýÝÛéèáõ ï¨ÕÍwôŸï¿z÷û‹3{óDïvºyõ•½üäìeOÿõþw¸ê‰SÍc´,â|â*DYè”U=•1˜–¬­nz2¸ù‡ÞøT›¬ 4üÖª]½°ÉÉþ?ëë8O]Wñ½ó‰r9OfG¸H ZN§A/ïžêåÝq<'iÌ6rGFÏ>*ÂZ5 ˆ|3€Û×H`OIp´”’¨à Ü«/Õ4¼D® 렒ШáÕrTÈÀj‚žÝ;#¹Lr¼‹jFgÈt~ïD†©’ޝa±ë9Ž#„‰©a@(ô …à_H *9jq€C§„ò¢„0µÞéMA¹hko×ó—2|r.kßäT_R`N‹…#0+Rr0ÏnПg恞iVû֓ã<ê‹!.JIœ•„œÚ„±Ñ`ؽšP³P9< ÐSÀ璅ÇeU6cœëì!%}G^–4Øý@ò*_Ãñ[bby¼ÖÈî5k†Y<6AšH -S×,q¢iåà¡ólñç D†“’f⬒‰ÆYÍÀ³šº‰©}Ýۤݛ°y´A‚,ÂLR,¨ .¤öj¤&<âÞ¼h¦ô™¹!¨,ÖêB !n¼5Uµˆ ¬Þ4ô)« }à`Œ¼āN¸@bҏ‹4Zed€ýc˜-Žf6v` Ý®® >sÐ¥h i‰˜fåFÏ!Ñè)·é‚´¶<Áb,”¤?rkÛ<¤Ìþ±À†ÁL|¬ŒE…:QDŒkIIÁ¯‚(0WÑÀj 3b¿׆(©ñ}¸'‹†µóàoFd›áýšÚ/ ŠîÔÈÌ~0òaí!#ê책ƒîò&8b Ôp»Lê~°‡9u)Ÿsš´vxåˆÔJ‘ãfý9º[^Θ1žðd.òuK´èGIDa¦¥N!3E`”ÐXƒ¹ô´0݊…Ìýx’:ÞIÆ%S_À2qoÛhÉ;@˜Ç.ŒŒƒjVLS–jYqšcÒa&˜ÞÓy0i&§C°à‡Héœá_pË BuìÀ:4Ö*ö@óJѧ`)ҋÌŒA®Î#R˜Ýs Ì,Ln«Ÿ­·=!•½ˆSÚ9X]&£b[`bdÄ1¼Q5cÑlãóÜîHÚ ¬uËðŒËÆ/N$È+#e£ÂøpOo—Õ`âE©€èòôŸ˜j×h‚Ù¼]2FEŸ™¸ŒTò |&OÀ-6*¿¶÷„éœEÅNKøZbïÚ©r€ ŸJx^Õ=wëc¸ç{1Y""¤Žv+,C}mÎ8Ký¢ä!Á‹6[BþcB‡0œ@ÉƁÇÞâì 3nê~.:ƒ.Ҋ^‘p›GbT{h,òÊ Ù¬jù"’"D…áÙg}>¢šgf'¢×ʔAï ~â Ù6Ìa”õ=j:B Wå{˜¥õ¬´îÉgÉÉ –2`†@X„×Ñ:¯LgR.‚ ^r'èéƄ¨”Ôô¶ð¶b&Û’rá™J¿Š¿Ç¯Ÿ—ڝIA’åOHð=ƒ04y=ëCfçd)š‚¬q\Á” -Øà SќX‡*æs´ÓX“S1•¦ºPÉä"C!x[#Þí=9û0¸Ô'‚¡O‘| y¼%)ã £šbŸ»Q$“« yÑÄ\SÐ-E@ЬÒ#ÕAU'O V|À‹‰ÿ_ô=œ8yÐî›u+ð Ps0xŒÖ¦cĹgsˆX¢ž¡½VÙ¾²01\] xA[“ýÍSÐA"â#[*5nsèeI^%‹·½pǀOàäT˜çcM†ŒpsoZž„F›jæïãNCê¨æóF „<oÁƊõª ‰†£3jÎÂÜ× ÒMNKƒ~.Œ¸ø^rŽE2£ x5ø”¦ˆœ3RÑË8híÂhxá5f©ÿão\s²pP¹A‘„R–Ê’[Ÿö bʁ¢fæ3>5‘01 ꑇ„⣉Ä`wXÈPM1Ç3HYâ”xÛ~;µ˜Éx‹™7†`©#VNÅ6ýÙ´‰Wþ©9Õм‘ÇãîŒ -ÛÕx¦¸•Ê#ÔCIueFƒ¹ÙÔ!‡^$U}ž¢\fÀ@â¤5°2 Ž2 -&ÅáÔ¶…ªG}:ˆ°ÄK&¿àðù{Hȁʠ6ðgDœ`R4ƒô½:¨cbH±Ažåa6”pd®tÕ®h2ÂNdÊÑP—Ød< )Rl…M º0‰;Œšr¼9ì;d„-g®Fñ¢ž!Әé¹Öæeˆÿ(¤`IÂ,+ -)–=N#bÿº 4h€ÄÛÊùñÔâÔô 0Q!nwî4̺j¹Êt£pcÒ¨€û Ö^*Ž–Ç '³²rpOÄ癅 «0.L¨™V|mŠ²EQ«pm`É#†¯ âÂíPK{’…¯  ß8hS5—`яÌQO¾a,ZÅ$K™«GY_µ˜5±Q† |ã*•Š<Â4Qàœšôê%NÇ_‹HÚԅËj*¡lùì@`nÅlLLEVåÌ_ÓãÑ 0¡/Ö/’›r(q<ÎXêY…­çÕ4N¸RQ 2 8`«T?SòœT‡ôÓUw%ò|YªChxˆT®i°œëÏ®ñ:y*…œFrv¨oYFH]ò€ÊJLjv€*Vx /5ÅFðîàHс'×Ý -€ºÄ¨Eæ’O¼±V{Œ"7¡Ó/ó|U=ÙxÄr¨ÿH&­9ûíIÑ4ÙÍSéì‡ ÏiÔ$¨3Æ ”õee€:@‰¼Ú”Á¯èŒp ¦eý*¯VÐ6J4Ê¢yF¢o¶±ÄšÄ.®H ½q“yÀjçl¦~žÚÕPT²ÇIO}%Òû©Áдœ!mv ¦`]Ú(8 ¯(`7†´9ŽzÑÆ8LzòÑi¯b:F«1ñŽl1;€i¢&%–É͹kt5ƒ/¹>ž£™Y¿ñ—ˆô Iq©”WíU`ú“M²fw -¦GðhÆԁùMvõϔZjØ`Š‘ÙIӁN¼Æ‰ô1ÞȽ^:+Âõ^‘QŦrƒBi¨úT˜vT Ñ>ó5M-9*Ë @OÒ¢¸}]õȶ•s‡ÓçJ™«€•…¬¯ -ÿÓðIZ IYüF{ªoQNêØ`¾¤hN´ AÃYÍ#np›,ëû8Ò ¹XøçˆõnQÜÎÆY½.Ï«ÍMÙä¨P)Ô)E !®.e´<´„ú›± J¦UNI}ÎY-\5 (ÜÍ¥rщ†jl-F>2z!> ÷ÌþËóû‚˜-[n[^™É[0ýÑuYÛ¸eÎnیƒ;`FF ÍXc!Ïj\¯Jmz`â„.õ¦Éì‹Å¼.&kñ¸ÏÉ(lrýâGÜ25}ªe ó:O4}'b·Kf>CTЮbÀŽ† –N(Áj`†©Ž6]šÖš¯p°ð¤€ÕÌwa¾bû¹DÞ¿øƘ@(ƒ˜ÉªQ íÌ¥^ÚUáks[=ðAÀ»$K!2jØÅötZ&u×0µ¬öÉÃÀ´†AÍNX×Tš^Ù¹08—&!BåœíÁÿk¨ã¨Á¾3ÎñÅô6`•Eú„\Ó‘ -S¼iÐ&Y‘Ý´æ¨1Â4¼“0vûŠajLîÑÙ¿'Þޙˆ´.6:-¼ê¦áü@¢¨ô6wLÇÏ°3ê†Sås°¢†dGîù ½Ÿ22®¢uà%M¶Ë¢pþȏÅï§Ð½U¢]AŽ” Ð|“Ck ’3Jù‘ Û«±!^á²£…AW"Š”«z»'Ec} &‘”:2A”¥HÙÛ©xsÁ<í ˆ"!ðØ:Y·ATaŽÍÁªQ}Qö~=qÍO™‰ØàŸx¡Å|Ü€ߖ ˜|Tt„˜¹ô ržŠÉKPgnúä&Pù1Á'ƒÜ[C¦§Œž*‚ÐûE­êí-L3ü¸ÃLE4/ ´Ÿ¡úXTÚ¨X Äð˜Ńò 4èØÏ6‚Auö¤"éE(êÝrîLKx%F»ÃQ…+. -øä¹MãÒü¬ b¸AK渟᥁ãN}bÜ55ô¯!A.L½“=E^“ŠàddÖXôµÎ]pÛ,<‹®5¦†„ #*!>¹¨¢Í1¢–`¦ ÄjM!Ÿ Ÿèu’'+Ð<Ù/ï5‡Ôå±*nªÍ j{ -“"Ë@ Ä‰Qq‰#‰ôäó5ø®˜ -"k´'M` ,Ýk<Öa^×ô9ƒ"˜šM„qÕvNâÇ+œªà"/¼›JýMZÎ8ô\÷þރ³Œ^)ZšL͂DÅ߃¯"ėÔe̤1.Ö0«·›"î5PTÓ¢'¬övýl=²fRíªdäŒ}E‰ª¥µg^đ{(²;t4 Î †ŠÑT~MWº–7«,u¥cÑÒ¤ÖÇIÉRÑäWT©XlL‡vì ú–ùó°Õù3¼ <Ý-¾†©Á3ð)Úʐ¢Žö?ÈÄ8 µçp°f³cû¤ºóÈkèi¦v\;¹»F‰‹©?Q^] -=¬Œ…ÚÙ2¨{{J:CP3RžL‚\Ît,g5 ºVC/˜ZÝð#Á´aÂÑ;ÖxÈÜyN5qÑ¢uQ¨+ 3ë!@ïìù»t n5ER©¶ ¤Qᤖy…'6¤3ðÇ{W2Ý°êÛfz9}ŠSÇ+‚ Äc”¿Ä„Yo˜Ò@G^˜ix2e‹˜)œ£xbrqvÍ0dsÈ Œ®ì¦hØþpÕo%¸¶È{“ã’Ó -Á3éVÑ| •5u0ÛAd–;¶’ÀÓ"èHûkt`ar u4Ç} `ƒ«‰€‚ÿmvÑ ïAL@¨¾ž™5ñˆ2Êf9ÄÖR´ºfþÙ̒Øæ<ñ²É…`ÿŅ¨<é`'6¨ŽC?r0¦íõ$¸G,gJ‘pÓ^E¥ «Sü32ey1è~Ó¾ñ¾tìæ¤üq< -àvŸ-ðŸ~t ìF¿òTˆ$€Úї·ËvF}@âó×PµXòv¦/˜ƒ9å@€ÐM䧋±)++·í!‡iËy°GGLp¿[÷Šâ% ÞP—¨Ð@d;  $1bïpe“æəGƒXƒ°(AQ9sPÔ<ª¬kïµ\#]=¯H#61-«÷ȶXsÃmÎÊDÙä>R-H’É(9«‰&;Te‚í¥zàœÕÒ9z†`‚©œޜ\'5 Mõ?ÎŒ3…)ˆò¬§ô~o|&xç¬ê?~¦zà€O²"³‡vŸØ`Êþ`·æ¢Bxƒ^FûBZÔÐa¢¦92f³`êe†96ˆ±$¼y¢"LŒ‡%e1`.ôàá/´„Å à ¸y<¹¢"„@ Î€zÊàɪØÚÜ®:Dº|±Ñ?Pý -0_U•š,xûÑ}ã˜3%Sä:$Z½úO =ÂÆC ,-»¢.Ÿjeg*à¹Až‘î8 †{'m&uΆ40àt˜K•±ßtf"} ò€š‚Z%±ppß Ì¥Y4¼®YCrô~6X›xù­úüh–^¸dfwàú3׉JÑt). ½Ñ&`u„5ÖGñZ&¨¬ üÌp"&6{ݹp³| €ñ(sÿÃݏ~óîÍý«¯w?Øﯟ?ÿöå¯_¿{†‡·qfõ’ˆÑ,ª4¼¬dÅ)ŒC•µ²e˜  MBïY:xMpÑnc§U‚”ÙÚ ’–”ÁÂ~è`k>H½ô‰YïÇvӄS΁‘ê_¥˜È1+¦=ÍdéXTï2?ج¡_‡úžêœˆœ#¡æ5֋Þ3*RîÀ0¹Æ6 -c8¨À¦`Ž!W3æhñ͛ƒ¬ ìC -c~r5Dr,×÷4‚«(‡À÷SªG”0 û¨yp‰y -•Eàpeí\²É¤;®;ë¥ç ©–‰Îlå Œ6·Äêà½S{þxfUŒúÑÕ0cIBæÏ<­wA$”¤ö/¦œ†%WÛ6˜ø.³†1,*0^FÀ &jãäu  „x¹9†'>T]ä=\/e÷Aý0xÀÏ>*½ØõÉðìY½Œ³å`±»Lé6ãYwpxFôø`²à4)~MÃã³9fæ‚ p³ú{³œŒ;fÝÀ:¦^´Ð®"cP¦3½I&-œ˜ƒñKˆˆIÃcœKú?”§Q¨wm‘8ûx7Aّt=Ötïl'¹½1Ví…86!d€yÅLVR1¬ŽĬwE< e…Œœ -X݄Xjþ£yZh\æöN\xéDšP_2¤–®ÍØI;§ُ&jȨpÏdç.®ˆr(0´Î»ü?”áR÷&d:h†š´^T˜tj—¦!……°†ó€ܲ(ß+Âsádž½½¢X $ê¢ÑƒiF -áÓ -âCºfT„<üC5<Ñã'¬Ò6U|&Ö)´X€x9Lç%ê‚Õæb°æ¢ÂŸA(üª¨¼†81 G4 ¨˜qh’‚'²!ƒaQŒ½gԒÔ?0Ñ'!Õ=€m Ë®Å/1&®y¼FŠ!—*,üÎeCGÈaôýç: \óÈÈ<šìè¿Ë*éµH®ù¢øÌ":%§cҁ {˜³Æ¹°Õa:‡o·n®q„‡d¨†H,Ø íæ‡:ÕÂ?0ªý¤oéÎ!ƒ\ÔÛîÃîŠzæÙ $ÌŒ§Ti˜ñS²_ðšÇ˜OT¤2?€NTü (õd挧ÒzbÛ6k8šSŠÕŸ qe"(F ˜úP4åHS-0׊d¢Â~ ÆQFÅeð³ñzGÜÂ38d ã]@]X£û˜3õ‰#LÊ"¹y I‘`™š‰8ZlL -&†^ò‘ÖbÄ *oµø!ÖXfõwO -F,ºZHa?CQû)ØO½ÇÈ:·è5ÙDÚSÎÁq£w"¦QO{‡–þpBG‰a¸7¾•óˆñš½o¯ÔyרžbÖ甕âMb‘ÆØâ“Ì™‚UÒ=/‹õM5%ÒHJgŽËêp)K,š´vžÔá>ªâ0Uh„…vø9K&Î[9ôšÉYU ¿]Ã֍Ќk -ï·Çp%3sš;H&ãèKé;<[è.–à¨.~]Š'òùçW7Àð)ó’zÖ;‚n!3̬wU˜PÆë‚ô‹*¶©žX#ÐÚ`.}³ð ´UtìNU=üÚ˜¶xo°¨ÐJ.hÌRBÁ‚š""´÷hkï™VU«WýDMfdsŒbP-˜¨Oú51zr¡¼¥&9ípó¼ŸFý÷ð{ÀŽZ`meº6§s.ic \ðIƒç¾¤(p·k%]Ձ:•‡”¤êU°´~ºeMÛhEÃ텥ovñÄóC“y@·i_Yo1ÚµµúθÀüï´µ ¯Xð b{W‚"Aí­¢&àÅÂ$ÁNN œ4@{àD›‡¿fKd®H Ӝ7@ŠF³Ñ.meމ¼ óÐUÝïgúÔ°x4}Â-ÈL螬…‰É"gE¬F³q!7klq0ÆÁ¦ôåpe þÀ¢ëzB%ÛU=À3´×í‚xÒ9›áŽ±š–Wö¶q¹^ÆV-kˆR$Æ5)4ˆ„È«%Õ.ëïéúO͗M}`¬ü‰¦10ÛY×|³¬qVsMç1©¹h´`-æ™ã}Ÿj±5Ceԕ?M:Ý¥ ÷€0ªE}Ð =M½!¯-J-ÉõKj ª3N@Íc *­\“ÆP‘@QқpYý4j’7S^TÑv~ü*v.‹™,VÅxõ¡NžZð0£FˆóÌèJ;´˜0uú2ýû8c@%ƚ0€@NÖcãaÒ^7ƒ#à}aÒ>y|¨Vßl 2pïE·VFµ#{£ç=V9èçi„(Ý£´Øk1¡¦ 5zzPk(“¨€‡ã¶ËaèR«pèC ͟Mh ¦Òñ ø3€õÌí¶ÉQÔ°XDölá* epf›Ap™Ÿ6th¼çô¤½£ÌßÈHyì¤ †YÀ&Ïܘd£&ÃáÎKöÌ#Ö`²ÈUÛå³b˜fœ8+`%uó2YÈÉÂ`ý5"ÏAÕ𣙹’zäø#ŽËdé5ì­¬á*É@ЌF"ð£fð‰–Á"Xò›ºI.£FÝð)[4Þòž;3ö¦Ü›ùáӁãEN „C»@€o7«õ)‹&ƒ§Üš#3CŽÂiöHâ ¡ö±^–>òâ+xÔ…ËM¡¯Af³È<æÜi¨Œ`ö'‡m $Ð²\£aMtø¹kÎnÕìH³/" -g³:µÍõ\\jNP3?ÀaÄ¨‡w¨±½3#€tr‹ …<ÌáÏe=®zƒ¸‘Àõ=ªHãïÑ̀ÈÄha!üˆôQ&( X   8£®Gh%*&Ã(M–ŽiÒð²êsñ9gˆT4^“ì›ÑDÑð½áùýñ˜‹NÌíLv%†²öažjHôhÅ®‡-ÃØ`P§ÉÌ!Þ;½«fÑÏëïSE×0X=*ÇÄÒ7ùmÖeŽf¦)Á *'&¶B\¥óDM6‹9‹yqø"ªè›nY—–^¢‚ý´èWjß-–ÙkQX ôë6ô׈k@\Eh"Ó!ÛÔmEöï@+“Vx< ɖKO–¯cÕ‹Ê+§šl0ølÒ\v Ú˜Éó"¤ë9ª¿“‰/pÀ1ÅVîqjé1hGFí©èÐKz„Ú©%Âï=XX:%x5À¨·+ЈàGÆÐ×9k¾9vš7]‚›Î5Œ -VXsñ‘`Ž¿Á]ÎúؒmX4š¶Ý4ªéÏý…Ë«ßOaQÃò—8PÿA³·‡&,,†F-ŠI·#øX}ŒpÔãð -8ð ºdÓ5y½$F:›‡™‰–ñ›¼ÊF“ % -ïÃIE(!Öt%”¸zͨL›_ìŒ@ƒw‚•¤W%˜œWtßùcË 09„1^Ü C1sj©Y—avÅ,5Þ ¹‚ ~”©÷³ËÜA$¬bWә¯¬åØ`7HäJo(Ž|LÃáÑ^ÁÞˊ”8>½AàÅà³âi‚&÷Ôu‰„OÌÂUsò,BdŽr^Ü7iVŒ¼t@R±1WäV‹ªvÙ~¦†ÈÛ|·.&ª!-ÙGüÌ䐋EÀ¡ž–¦Ê8™x5’¹Q󁽍çâbۗÆGbe*Ö~A £ ™g̓0òó¬Y‹£r¿bç>ߋfªG·@ ÄX,¤ÜßãPƒŠÍÌH:|*b\æ¤ñ˜5…žz‹Di\U~Ä Ì¬_5zúÁ:h)Ú@Våh©Ê(nhP ã§ç쭟ƫbfsŠ!Ɛ“7Yª-R3,Í gë•÷Ôãê?ŒË­¡ŠZMVgµÍ}uß;9ëÊR,-ˆSc•`]͞¢î܏CÒPTwJÍVY)Æ(²)!þ |6Án*Š„/CWUZ‚³E =ÌêAM<×c•aÆ80³ái˜±¤¡Å‹!î‘nDqÞECàÕKq)[¼$Ÿi€ ¹³MµkM£8YXyýyì#&*mÒK ²åI‚s—ý!úšÆ:JãÔÐ2ĉ`QÁa‚!ËôÁÜT5;짹tè#j@j]4å¼eˌêÒeR"òÚXýâñ”uþ¥Œ¬'š´ÓÕð²<`;RSF‹>Œ5¥ÎY@Ü+OëbkjV‘£À ý©â§ñªfT¥¿!7ü Ó#if¢¡ä PJL¯c®†`™PˆQ³7arÆnüµCˆ€Š"³Ó…Î|—Åy˄:B”É'3Ê,4ڊM‡Ï.˜ýíÅ<ÛSÛ_MöðÓÄÇ™ñøä¾ÀYéV ±{?¯ù§Y£èjúc•™Q±Ï~upÖäǸú–5[îcÈ´@­ô©¡——P<ó1T[ÖÄÇÐÁ ÷¬ò‚Ì”‡–ö?ãkkÖcüŒÀ®UÖc¾¤"Íf¨9×ÇYÑÎË&ã1 •/ׄǰåJ ùŽfؾ]ºc`¿Ç<Û1¢EEˆ ·µNvÜS™Æ·¶í©Žc°»«LDZ&b®™Ž‘“Ÿ"IMtÍÿÿ³÷.=·$IZî¼¥ú{ƒá—ðˆ¦Ñ6M«u¸ ¡R“•Ðuԙ…ª Jüû³Þ‹™»¯o'Õ »$=©ÊÏvD¬¸º››½öØN:f¦OÀY‚°ÄI -t|z¦Ý@ǐƒ -+dÎ1Óð½LÎ1Â@VÌ1"!¨üMÊ1›9Ý}BŽ©¨÷ãb¢Lq| -š€cþ=ÞðÆ4>Ϥã0õ>'Üø´àmg£{9FC¶Ù˜F4Ú ;1'V²qhZl<ÌÿN®ñPÉÜN5ÆZ¡“i|Á­w"1Må hÌÙü|&Ϙåj¥ÌµõåÏb_ÁÏÅq×sNœ1 (ÙiÆðˆ•‚5̍Zé“e|uŞ6”1ÜëCŒl9ûçË3iO‚Œ‘ùG¦~㣢ôRÿF“^?¨ß Š1þ.×Î0Æ>,üÂÇEí Æp¶Pg±Œï¡Œhð‹ñQ£æ6ðÅ8w|!½B2\mÀ‹Y"ŒO'àŜÁÉßàŚ'Õ:ÈȤê“ðbIÞL3NxoÅHãKí>z9“]Ì¿©¼¼7ؐ”%ØŸýì»í§ñ^ÑŸì&D,¥ ú°_¹˜“8ªl6r±¬wOÀ0 4$#e‡Æ¼ ]Ì÷f‚‹éâ@fºì4ʨ;·+ ”j¶  ª–,¡EQ´2´øAùw‹¹vzù’,~n˼V^1Œø¶Wüx -Z1ÎYaÅP `V1>ƒCÇeRÒ>êqRñÓô©¨˜ï¾dqŠ1™ÂEÞ0Å Äb-”âóÑ7(ŧñ'¤ø´Z1 ŀ;à‡ƒQ ¶´v¢øtT-Å(yÆ/¡¢‰Nd!2#ÀŸ˜êùv'ž^üü•NLLW¹N<”Ÿ 41"ìHklhb–dbH§P:õKŒ|-DÁ%BîR­uÄ Ž{§#aÐE8æ.ÂÐcf_â]ÏhN ƒHÌÌ -ô•÷.ñÆ#n7GŒ°7T;¦Ãã:ññmò ̬Rí±²'¥@¿»r3êi93&ñ»ŽDŒÊȏ„!aãd RJú%kY)Ääi°¾Qy& °ãíÇNUÿ>«‰Ok[ƒ@Œ_"ñßd᳚7¶ò‡YòLJ1‹š f}És,?Vø0ŠñÛõ${Uíº[,ÊTºsƒ¡Š÷˜á“]ƒ—¿(ð۠ÀLc– -æ0þv¥%# ø›¥ª+qɐ18̯U/ æŸ+nł˜¯‚6üZy‘ú°aôíl*:¬aäÜá$j ãáNfMñh^œÍà cŒaâĘaü;ÆF>xÆ0vpÜ1|vy6Â0ŒüÈz€ÞßèÁ‡8| vi²ƒeSwt°‰vIÆ-ê“|pøÛ¨ÁôÆHh0ԛM½,U“×¹XؐÁÿbÞHb0"}L`ð#NÓÎ ¶ö;pÁ(êÉ -®Ön/rªx¨ -æF­NR0ÝúÝ|iŒJNðA21Áñ÷F c@‚ÅŒÿ•¾Ò‚®vlb¯œ¯|à0N8nҁýÊmpà‡yìžl` àÐøàrZ_ïT^¦*ÐÀW½&ø È­Ý;ß«XÖf‡Ÿ½ÖpàƒÄ¥íp`”ÃRæl`øaíJ40Ó繓”„ß`à×{ñ1¹À\·7,0Z$%©Àæ½&£+·”ŽKPÒ¹¥ °ã`àã -,RY™LàÃÀ¾@#xÓ5bV†¦+ó€1ðµá€1á`4`PX(õACµ¶³€«{x̊o¢ ¤Àßð\70ÔÎ+9ÀHv‹Ëdê© ÑJ†ãâYP€q«¥çVBIw6pÜØ!º$˜w…à’E -Q^›C©€Á1ø¿øwKWþos„-ð¿Í5îAÿEþŸ -ª¥¨ndCÌþ@€¤Y£¦¿·’áŸ` -ð/F<ÔwÓ÷D$;¯à_:ûm™÷^À¿ñ÷þM£Á¿'¦Žþ$÷÷Ý͝~0âÑŸ­Ø_5:¹Jr õCæÒsý½Äs9s‘àßí…FþÅvòø½Ô8ßîà_š‹ï£ì‘ì×ÿ–Gžõ ü ‘Æcʯ÷Äíz&÷—–»ÜoÜ_°ž„÷šû+l«©iJÐPéQÇ÷—(øv?Éýލ¼àþe{•öÆý¥™í¿‚û‹ÿ¸¯1±¿üÑÇöW´ßÖ&ö—xßÏÄþòŸŠÿi2Â*jt[ŸØ_&Áø’ö—ˆ<º û‹L•XÃÆþâ^ìÇØ_½PslØ_fèê˜Ô_bf±ê/ۏ¿‰ ý>Eńý"'¡²’•õ‹XäaUSî7u7“ô‹¿k=ß@¿7֜“ò{ÛeJÈ/³&×óÆøEýú9ÊDü26§pc>RW}CüòªëQ&㗏d6‘kŠ|nˆßG5™ü"Æ|ƒ¿øàœ•ï ªhï‹#Ð 2ݗTD”W¸o¡à ÷U`Þ© µ4¼´NÜé¾ԆÛ8ª©9÷Hº/ïôîË>‚JA÷¥1X/§hÀ -y£û*ÿÓ¯¤û*A0ßîè³Ý§ÍnA÷e• -Iƒî‹K¹¥#šp_v§¨*ÈSª…øìL÷å}aÁàŠ÷¥†ñ¾ÌÚ#Øx_˜ºØð¾°x¨Öý]6ð¾40û°â}©Ü¼Î‘x_vwÁX|_Œ&X_í|_i9Ar0ø•›±$Ô|ßR,Ù¿°rÍ€_I>µÙ¥QMZ6¾/Œô6‚ïKB„Á÷¥ ú ð‹‘\ìb~ՇA@_‚aÐ6cÐø…••Ãø-d·¶–€_0ön„_Yï' ¿<«/Mø…ôýðËX°áWe!¨iᗽa«¤“ð«fjgOÂ/úqJÂo!#STÞIø¥Ðû¹J"~K7tو_þÍ÷{EüÒÚk~¥¯Ê#6ßü¿~%/JwPI¶N -#Iø•öû¸wÂ/ý¿³jè“XMèîãu¤»íŒ_˜K3їŒ_X<}™ñKKä;'ã·dÿ #~y¬Èƒj‘Ô0xâ*g,¿œ¬éAâë/7Ä/µYœE¢­ V8j`kÂ/nÆÅÆ á"}£‹MøÅ;vŽvNÂo9½ÄÚ ¿,¢+„_ö^S¢Ø„_:ïj°~K¤á“ðKËe}<LÝþeI€qßóFøW¢œIøÅÀûšø¯ üê5¸ÇNø¥¯q~qô§ ùKÂ/ œ¸6Â/ø·+"èÆÍáW†ÑwÂ/~¼Ý üò+9Z~1y×Øø¾Ìô×H¾/Ó¤¥$¼#Ô­ìDüb¸sž“F†p? ø|Ž¶ó}a< â½µ 3<¢ûBt 's…û²+¡ÂÈ å!ý…ÑÈÛàOŒÙw\™P Óñ2œ×Ì^tffcáú’{?aƒÐ‘}ñ¼gü½b}Óf¬ïíé9x½`Øby»Q}¯SQêÜȤé`úÆß+Ò7m&ú¾Îÿ‚šÅDßûPÿхç{{Èžï}hè œ/þÆMÝh¾Ø‰ËsÓ|ok]æ{z“7–ïåGò½,’/ È l _R]{KŽ/ÿð,Ä»‘vØ(¾0⽈/þÆK _Å ù]¾×á䨾—[ÓÁ—añZv€/2{8÷à÷âD yð{¯hü°â{åm*$ŒuR ïUÂø•ÝK›(ÇÌfcÒ MîMéTo»”b‚;ÖƙÜ^äW‘¶Ì1`—6j/5¨ç5´cµ9³÷òÒrCö²÷-+pEì^'°çêýÆëåɀif\ïðª1h½D°AµÂzY톗Ӭ^ÖÄA©dTï<ÈBêÍî¥õFGñ#¿nszA÷@€˜Þ+@ïÆïBa‘wƒôBŒÆ…Nlôpá„^Ől[½¢>Á纃µÉâóÞVVlx^Ñx‰ç…ºñû ó7Œauƒó¢nâàՈ͋Õ+w¸z:þ^ɼi3˜´œAPMJâ¹`Ù°¼Y;AåŲNÍi­€ %‚+ý•Ê «Ú (&F!Êy'•—«Nÿ+•—È)6ê ?äu©¼Ü‚tÿ•Ê‹ÉŽ¡â òÂ#­â8²¬«h<üÉ‹e¼â`òòœm¥úhø·)º³`>Æ©;À î…š‡„ ÅWۙ¼ò0êL^8Ü“—6;X™¼tÓxòfòD:˜¼•ÏéÃü1™¼ Ö¡(bcòÒÊ,¢™¼ -áÕ+¼ ̱teò2îÙL0yÉÍàáÅä}ºÞ ɋKçê?¼¹ÂŒZVDØHAِ¼jŒ)O‡H^pÚ=ÇCa;EÍþ$¯âwþVµý&6"/#Xx?ƒÈËÖnAäesÉFäM×ÒD^¾5ˆ,@Ÿ‰³•È»Z«{c0D^R20xmD^ªì»€¯ÂwŠ\®$ò -RŸÈKå#µ e*¿h "/%N‘5*X’eVd]«þ—ý¦v/”UCß#]oø´ÆË(UWéä„ñ2¢2îš4ÞӍ—v´Zk€h$KOEç4|7ĵš7/C‚'ᓮŸÂ:Á6ãxÌ*eçñ"ÚÃêIãxÈzˆ ’h„µ#JãO/J¨úDñ^HÊ\%Q¼€íßmñÂֈž‘®ŸÕfýNïåïbÃðBe‡üƒ)¼ø}  •&êÁ{¹mO x/$Pë™^DrÙ¼—ƒ­Áßp1’üÝáØކß䉘ãw‡ƒ†Aß%êÚÙ»lՋлƒQàîg7ìî0?(Š~Ñ ¡Ÿ îâԛ„Oè.ûW#igæ.kÔ˝ÈÝn©×FÜ¥ ๸‹’=o ѳ¾ñv±Å'¸]¬ А*h»øNüۅ -áý`íB…ÜP v†í;g¢ˆnf÷D}i2v¡ÅÁŠ{CìˆØ]v¡áAÜ&@¹Ðø˜“7 ïÏ®|HàuOõ]öyø½³uQJO™º Ã!Á 뢪†’í¬ h~(¸º§›VAXoT]ñU÷ô¤P]œI3œ/Sȼ#ªg¤.œ— »ðYÀThjŸ38¸^®­ ÔÅ - ïmðtQU ׆Ó}Š>îÌ0]H–É×[aº0bØ –.kŠžž(]h°ì[IºkŸg‚t‡Ðƒ£‹¿ã‡’£ËÄÀaÁÖ¥ ¿¦pctQëØÕFÑEýbo“¢û¦ÝÇq䍡‹¬„^“ˆe1çC‹+zV­;C—Ö[Mì-!Ú´<ÉÐe(îíÑe«tÄ¢‹yŸa¿€èҀ8ß -ѝQЇ1ñåE—E vl]¸:ñr(cÏ -Š èf¾x£èÒCco¥k–rF -ŒîÏnž1F÷q®k§è"ä{̆aß(Þàšè±Òh'袖àp74ÕÅ=ÑâËü\ìÇdΆÏeåf“ÿMzî܀â26ÇûÏUeD¯Ë†èۅW>é¹3Ñ´âséÃSWø\®˜Xhz.#†Ã¥u“Ë¸á¸\8à€àÝTBŠ?îÈy1á¹*ºë§¤çÒ¾=—{°,Èô\^8¦ÓsóËp22ðAÏU=óõ$=—I5–V¬ô\FàÙ:ð - Þ!ÑjÐsé.ã mô\:ZÐ&=IÖa…Àø°°r£çò¬ZKx.‹mÒx.ë0Ênð\ZùµžKGÃs9Ò¡pbƒçÒ?Ĺ<†Š¯4à¹0P`¿Ñs¹;>— ôâ -|®Òð¥$?I7?—´”.ÁŽÆJ`· ~®’ Í&?—¢ T{?—†&^®ÚcŸÂ÷®ø\$øtύÏ%(ŠÆçb Þ¦ Ÿ }›Û>—y@ƜŸý< -‡l]͘IÏÍàl`^ €.ò0|Y6€.¬”QtÁ_¢]¤Œ‚Úº$Àaí]èæA—(\7‚.™H]ájΎ‚$%?—{±ìgåç–Ó¾]ðsQÌEIðsÕ~£ç2›VäSÉÈsîrÔ? !!ßßè¹°êÇLÏ-„µ'é¹4 ³ÑsaíxàAÏåf¼¦çòÈExèIÏEr’c]Ðsñ|)¬ |n6~î´ ‹Ã3¾dÜBum;@I]zj¹Yõ(ºÓ°tÓÝBPÜ$tóÅܺÌÎ>“ Ë‚käу ËôZUé×Ҋ¥]0t™\ú&ºÌ!м1tùÚcMK†.‹¹‘‚2C—ÿŠ•èÑ%^ ®t@t™,T÷ÕXÀ#4„¯pèÕx)J.}*jg]~\Îs¯D:½Ctñç@z1 º0\,ÍReX™)Š. îcK‚ ‡ԗ§*•kŠ.sÀL[EÊ;V î]«®‚šk-ëNͽ15ÍTD{q?©êTÀÊ̅Æù]3s^C´3`´Õ‚¯˜ #|Àæ"x܉ËE=f덖 =ºÒR‚åâoe¤ËÅߨ3ÛX¹¤£ÓžQ¹PÜãõɳs“ò”Ë| .`ƒsïxÜf½DÒq!G7kB`@ˆa‡ãŠ+ظÍÍ ’ÛšTY;·=ÔÉŒ‹$-¢êñÆ Î6+·?֘ŠËPÛÓŠ‹ ×È+q>‰¸¨ºÑü,%Í°`lãáÂHÁ”q¸Ø‰bhÓpKyvîi±V°pO7& îÑB…^†Ñ{ƒp!á@@,8¸ð(ñqn\„]™k3:ƒg2pQ#‹5ó†ÀEž¾öàâO8‚‹}ðnü[ÈtªÛܱhý:Çô[¨Êªð°~‹‹D1J°oqø9Š`eQ_¹ØE„O(K& ˜Nïwro‡‘öv¸eCPo£¶: ·Ã0…yË®­'ò6 dM¼m®êވ·P"V±0%…@㦳ïq_ ºŽò$íötk©€Ýž–`n¬[³Ô-xðւt‹_*&ߦsÞ]Vœ[ø\ðks‹Š°þ¹¥>Ú -3nÁAÁwdÄ-îÞ¯p #»¦p B&ÂöÁ·mN¼l|ÛÖÞ#d¼-þDa£Ûâ–ÀY ¸mÖIÚҌ9Øж¨b=œÊJšUŶE>ōkËâì¯è£@Pm‘4×δ­v‚i‹¿Ü ¤-þFz#ÚÖ®Å_m»_ ñlO@o8[dX\Rf{¡7`¶Ô1Üçβ=шìèYõ†¹^dlyBôa#Ù>,»/dÛrKŽí¥Þ;ÆöTx=)¶Åsª!¶·ôÒÃVu%¶7ßæI°½IÊx؂=Aø½ùµ·JL¯½¥zc×Jö“èÚËb“k«ë£vrío$Áµ–Å&·–"æwl-Ã}Rk5³$³×2ޘµˆy? ²ï-ÛC˜XK½O{Ö6y9Á«­ž½WËZè³ï´Zè@ƕ¬Z¬=ˆ' TíP­Éªöõ zORíÉXb P­Ö=½î Z‰)°Þ3¨Jwð–Òå`i°ÐIªe¶ÿ”ÕðþrˆúoÒ×øÛ{ßS//u“T á^¡Õ·*8µH¦Qºbj±²‡‹”ZTŒÃ HíézčQ‹ê‘^Ô,kƒP‹¿/ýó\}œNÁŸK„üOKNËè;ötg§¨ÂˆÐY`Uœ/›hÚ»dj–F¬½yTà –÷—ÆK€YÎø»(׍ˆ- ž(«Ú¨´ˆ cv (-ê‚>óFHæ!ѵ!iï[+ƒ@ҒÅz_ɚ©óƤEîHÇ-©kðhãï GÆ Ñ^ž‡ƒ2 *–¤‹ -RFVl¼‹"¹A¢Í¿WmƒCK|îý$†ö:%ÚØ(´Ñv¡i)$a¡å`В8§¾e‹yª˜-´—Õ9Á›Å«Þ´ÓŒ4á -)]àgGdO0Óg!Ûêm6ù³â5Å&âàßu$}–1ËãÜá³´á öìíîKÁž½ÝM|CÏ2Hڟ Ï2+^-gEfh˳qgƒ™ØÙûvc  ÎÞþ"wè,8Ãx‚9 ¤-²œÅßU!êIœ¥±´Î>X/‹Õ#ªvà¹m¸Ùgv•céa¾cl–u/åÜY³4U¥ž£¬O…¤Aš½½ÜA³·hZ‰™}bÑ”YV¦¹—ÎÔ"“&ÌW3fqN¬œ Ä,jqNÃi'b1HNj•÷KU˜ÇXù²w$7—½ì ˜l|ò\’N…—½‹î`"c¯n2܆–_…ÔÁ°"åóL®,ÕÒ×ó†•i„a¿ Ê=ârdâ®cVí¦ù:fá® w‡"üI”}Tɺe‡cÌ ”GTšº`9 +RvŔæá$ÒËN.´7¢,Å6Ü̋ ”ÛdŽHw…ØN”…Ò^uÕÊRžï¸!n-Ö0Ñl¦2‘f*ÍãÑï€#]ҝ¢ßY²§‰’EŽ ÄA’¥l‰yç•$‹Ä&V?’åÂÊ[¡¨–°Jç˜Sý‚©æ;ÀÚä^%ÄJŒ,–-ŠÉ­َ%{©óŽÃ ºr3d»å‰B]uæNFæ)²ïîÌçoî0ý=AöïFe·.æ1ê‹ù1Í C8”ë“š–GIê誅`ÎrFóvŽžðdýÄm¹Äx,HGþäȌï0¶ €íëTS«JN|XPVCá)\R‡ ÖV÷”k¡ x̄¢å6ËÍeOsߝnIûiä±jRÍ_Ì+e1$L£œÂ ¼ª;‘3ùäõ©[KÔÃÑ0q ovWìéxÚ%Oçb®Šr«Y”ÔA „‘`ieٕbÓâ: ÜÆk^HöO5ÁD üΦ X°Y*å XAþ¨C2¥¨xÄÐg°[qÊÀVâ*ù) Xí¥ÞÇXUŠ£ax±³=6hkÝ8‚ƒÚÐúšÄXögâò0¥\|©„®Õ%Q„VS– ÞÃã¿)§e‘íÜO,8‰jő ð‚…+%þ$û3Â2¢NN=Ś~’…T|èìÖu¸¹Uõòž™©‹J6ŽgWKhºÒÞÂ"U1"îw ¾ÐqB­ñ¨è,A§Ð‰¿éîhz»¶·‘ÜyŽË½ËqwÕÍìB—U‚ù½†·FKɳ…·È®œ‘‚Ea%üÉ -°Ô[O®$“Ÿ/êxðþ T^ïFc[È»júD[ÈEãr;Ž¦6×øÈ¢ä™-®vîv1|<¬ãS\ ’$"¥£i¹.mÈx3 †W–Ì敇æ'˜éSÔ $Ђ@cei2>DZ²|%<þÃ,É™´Ü£»ð×Än¦!+RD„ê!ö ¸ø…áAg7œ+$υåõÈâ܏ò ¾ÊâŸÄ‚™0-08žâ΀ŒÆñYã5Á²½gŽfv:¼ªVK´p.„æ b žvU©µrWVUÒÌì 4¶Ts\N·Ãr«7DåÆ»V¡ØØ -ˆmé°|b—à‡Ù̍ZŠ²¨˪Èxߔ@dYâÍÁ*5ŒþJŸcaf2‹`vü©sÀ$C Ôs”›ÁÒræF­'€î2ãÅ"HóH\»qzy4aqžÉ›€÷BW.Lô$d‹óv” -ï- žPWAR VÇü˜EzôZ”@#Ìw¡ -àÿòËu›Ì,nÕ鏊óqÜ÷år5ûð9—CÇ0H< ÒUlÈRªËj‰ôPÔ‚‚XØG?˜-DQà¬Aàƒ²1W­ý±–TòÓWÀ&s…ѳ¸R#è%rÜL| ¾2®´¥3I¹éíšñïÓ뻬˧¡…’R±h/»9¬3êjÅ2T$viÑõwDÆfŠQFà° Ä …AÞ.ú«'#t̄@ÀÂJ9Aè¯ÁBÿ¸‰·»Fõ+âEýº„ßy-Õ Xg0õÁ±Å~×é.¹!‚¶’YX•M1…o¸Ò¿<-FYÚáV'jbÆ.qÕÝÌXTٚ$×>áÃ/j3ñ§Giúf) ¸kNódk^:"ƒlaQ,,“ã6TU£ªèºR 6ŒdG³Š‰põ|NóWË-j_úÒ,JàÅÙ´Kªæ{4Ga^lr§ÜmD³t§`UGììÛ Yc‰î`)÷ÔrkÞòhO®Æ`l„Mìo=NʾÔÛ²öW¡@õ–šƒýq5pUK./§|çÀ¥ïùVr›®Ã¯Û à!mV33ÃÕrW]ñ‡~C՟ìt«¬ú„ÁrÎuÍ„F ]o½¢÷ºqÃI¯Ï±äû‡/[WïáÐi‡ã%Û¸zÅÚ -ï -ä,+À!í>5R©çéåPiaÒ¯j¾"•ÊÈüèÇKÞ’±Ì“M%©óÀìNôLÙ]t×¹‰—…ãû¡ w¥J 1ôùÝôރëóJ7Á¿°FëÇ^}ßFåî³¹ƒÙe¸>ï®!”i1(ÅÜØ'ĺ’²sC´SädyÅûxdKÛÕÇMi[9Ÿ¨­èö9¨%À‰"¡qò+Gú«b¼†È2dÈôaFдDp,7¹+ƒè"æ4aùÔ£¯”:‰Ü±îZ+x×ð©¢9\2‹+M‚²EÊýXæn8‰n/µhMQöBàH=}ñ–À”¾ÄåÂ|š~(­0| B݈.¼Þ]Œš ¦MÑvU"x,Q¡¬îò®Ãc&µ R JŽLy>Ï"-MeåÞ3Í.%dœ—Q´f`JZP¹‘¶øÅ?onèý,R&§E‚ïÖӄn² ùøú¹rηhx~¦—”4jÚ¬F/dI‡Ü–dïÚ9i.ä­ŽðÚÑ{¨rÂw@•/,}²zTÕÅÃ=^ÝxPLÀµ žèAa££Nåþ­" ·“{ÌrEHŒßmwÙÝçxT¤iœ>µÛ­m—,á‡:ñŒØà­Å@,‘¯'âiñ®T±sמ €±¸áXÞ/•™ÒBžjG©éî W‘î2?µ¢âCÑÃø¾½…ßF©v½Üôtœ\¶P@-ÐØ÷²X‚ê—Á[ïS'àQ°ªá'†CU0‚«âŽC¨ÇŽwä?L![`˜zyÝì”ï"YªØ5Zý1{ž»ªn. »@7¿Iô7lŽ‚§çñ^Øõƒî½SÁ/b1~; Dg"¤4A•,¥lþrθk÷/qfrŽÑóQxcè£PŠqS¸ÂÌ=µÀaå9±#ů9;OÜÕ¥#Ô/®M ø¾—Kœ¹"”D«<ë/?čhj÷“38 á!—Ìpßjµ7£¸ÀèÔkre}ú¼™º9« Šî· &>#ýÏ°v'ÇØ­¤)O¥×ñÃÒ`®ê0¼©BfˆÓíԐýB4ϋÉj®[Ť!ˆ¿El \ËÿnØ^mÖ­T|g =°"±–×KÄLm÷ŒœÂªÐ<Ü9X˜¥… -L”z5íÈç˜{Ry¿íI8¡øo4“nÖ äŽôƒ*唈Làǽ­Õ U\‡HDa9¿è:Á'Ã;Z±Ni¼*³›jK`Í¥KžEÙ'̒ -ñ*!iv i¹«,|×i™-á côG䑇žz¥ƒ†',©y©gˆZø£ìpÒNMؐ·Îÿb .™Ñ(ïéª?7œÑù (2օ¢hDDDü•@x½I–0\áðèh8 -ÉÆÎdP™| -K ˜U°ŒÚ瞔pÁÊ`!·«ü˜OðË[hɾõpÏûJŽØ¥€ôÉÏEÍeŠg+>é+´‰ˆoÈeËžÖ ŸdŪ4A;«¶A¸Æ±å¢öB0²ý•+³§t˜»÷ÜRf枬+©tՏµ“‹Ó]ÖüÁ2fÏ0B^ðði`B„„bôÛ)œá¼YRc€Ö•âœÚ“e¸|œÕwŠ;õMñ_ÆIf ’/Êa¸¸Z+å4È·9œƒåœ7̳·*Šy,…ÕoNLÅõ[{Ö|‡ØìïÇqz¢ÎÏY.Œ;|Gˆ‡*ÆPé2«!sÌsñŇ ‘ ã’ÿ¤6O@Ö<9þ¡bat×(áʉàßZ"Ò0º;!— wÑ|7m'´ Žu_ڐqíÊFŠwµ¥._áq¼Wµ<Îèt5‹f²ï´0BÇ©²q?Q;ê(¡ã·$…÷㱟ÅŕTNŠN•H2°ZýE‹[}[ʏÐn3û‘€kFOëvÝF¥¬¹jCöŸá6ì*€ 3æ¡^OƒF ‡¡&h]Ü/Ïið(ñ›3wÔÌÀU œ³ ~îÒÞ!„E5m°¤˜f}œ·D<•‚ô¦cåoÒƒänää Q:ZUâUí®í©D -à~#ìÄÁC^1fýû½UOƒý9‚#Ë£0ËhÕ Ý¤{â±ôÅ4ž%3FígùÍ.1† pºzï3Cá*©3` -%‚}½Êøtµù<Øm/ë ®Ö7‚ùf³G¥—0"ÄszØDé¾G)…¹'+Z0ÀózÎ3)”~•Á¼G£Û»Z+ -³[Œ 9—É8 ±ƒì)ÃÈ|Â}¬<5!ÜB -£ Ò'uíª˜†¡ßn¾G³:þV±}9Ï5¼À†e­9¨Ê~3#wš£0 uµF±>‰–ù«§!HZjRêá“D˜ʎeÃ#/Ü^;¦ß`¶ -~ V3•]èakúÇR"qÞ5ôÉ®ÄC(õ(À˜{¯ ýrÀ©|¾>uÀ5Ú&TF~á³r;[ø€…ƒ\îªy¨Vâ 7 «äLÐ/ý辔X–˜ -z®Ì_o¶–¬ø:”b§AX$Ká BÀðÅ5T*é½HtÇÐ#çŒbþ÷åî=°pÎã&×õÌ=j™«M8g(ë:ÔvDöp,K&ìê>TM3jò°%¹ ‚ óEwyŽ= ·ŠS Ÿ¹Þ“‰CêAáˆHÆ9"Ð+õ^=nÐ£ï– =•–Bôgr’Á,)!ŠÒ¨1¦úÁ"8äJéOÀ, þpͅÒp­Ï ™Kcø8ôD½ëi¥4öŒsöë@¿¢l·I!a°Ïe¾çÜîÁà% -‹úÓBPI ^Z ÓÅÄG€%ùD‹8Q¯iðÍmNÌí\÷‚g§ÂÁ´04Ÿø…iîžO—óö…SÙó^ÕʵVYë"äÁW\8cÞ¾û糆™nwfFèzx;I±ÀU"ªû¶U–ŒÒß ç2ødh3ñŒ¹ @ò ŒÀ4L¸¹zR89u.Šø->_–¤Q[À z¢ÄiÁÚ¨*†!…ÊP;4E˜6ÊeÞsa bBZÙ(ZÛ)÷ F -ӟäª5®*¡p¬žÈ*ô&e\ -i1:Ìäž -Ù1t}Ç·N -e\&¤ö¶Uý䡆ZLq0zùàºk~+‡Ã@ šLG¦`Æä‹bu°´uW76hêDÐ4%iÐZ…°Y¥˚`îPԛ£iläÍ(YÉÙG» -ÅÅ·/Õ ˜½¡´P»cE;{Å$ˆ§çP–’xœsü€…µïã™ÔŸ3÷ÑöéZ°4'`ôò®Ç*ËýuSöM¯—Þ¥Ý臔e@ ƒ®”Y®SvÔT©xÞ_ÂW)o1#;-Rºûèä†O nH7»¬â¡þ…x®sŽbâ±@î§Ñ¨¹•R3g㉬NÌü¹g3~W¬†ÇÎ)¹½ŒQ¢Ó·Éq +úyù¹\öbK‰þM«¡ºãCFl~¬ReߙÇagf³€n¡ð‚e¼Q‡iàTƒa®oGQ‹.‰uB%θl¹ ‡ÈˆÂÀ¶Î%Ãò3ƒmú"ÛR ïÎ,¨ÿa(˜A¡R‰ -Œ\ìXRsMÿ|OFæI%£dm2Êë¤Zê±’äÝfx™ŽXq ܳ]âifΛ•ý 3y0´(xZ \`ð>=h¸“T÷4½[4°¡zŠâØáï´@¡Ÿù£‡»Sõ#:F*AP¬þ>øbŸÓOûcr™åTd{Ƚþ1ÍT0ŒaƒŸÇ°ª¨9ÌÉaÉ¥.±SÏÒÇ.®¢Fà:µÄÓ;®NöÜt›&NŽsÉ ì}DŁ8·pss¡s•Š;wWœ…íÖ¢œ{¶[V{FSIüU°(W¦´…b–q,±TM}¬æ.r• ÙҀœ]«A©±b|浆O™õÆV½ÕTžT–àžJ×qՑ¯Ó’Î\´Ð‰„ÊFqáÃ=⨻i×ÜUž`à”(3f·•æ:ZŠÅ -ŒZ—Æ6tÈÎ(ØvJoŒÏ• ÆáXKŒ€kªEh$ŒéðJ™Ð¼Gzve2ŽÓüc<Œp†‚P9°ê¥ÖÖ[H8m:©” **&¦CP·V¦ȕ 3cp„¥ßKøM‰Ãâ^¸‚¤;~’C>,W.<)Ö/Fx‹—aÁèŠ;QÍAšÂCÌ2X;B![¢!9ÅJ­òìÝáH³)*-I²kÁº äp­äÝ°ø¡¨ÿΌkuЍ¥àŒÜÕf ½fÖ2Y ±É…lŽçP×)e –dÂ0霓kÓ­`sÓa-'…£ÝéêV) „È)„Uؑ­‘zñ§ --ñ©Ü¡Dò—C©øx(ëÊE“ŽÖÕðÎ(ƒµ°h*½¤ädRӛƒ™Siï¾NüßÑÞÃé‰2,3Oy \Â|%õ û°EAÖ ”š—îR=](4zÕC€"uX?QŽvš˜Àÿ ŒÅޙž -Ì,¿¢rœ”3]®Ø‚E]›Ð–¹§ô W´ĺBÝ]«ó—²Æ -sj̱RQ‘|ó´ -Ý"=+"ýq…W¡ŠY;¾Ô[åÞ\œqý3\kÌ:M>U5+xjËÒ fÔYÂ,%>,-RKá„(GDiCÍWpwIóyJUGáý¶«ú+óðS«; €gࣳž§Z t¹N´D’ϱÒ¯BšÉ¢Fh‹©U¹T»¯Ð -C”É'] æë² -wtL¢ÐŠ -ø&5•u¯‚‚áR7*÷Ô±dXa’:ß¡b=Ý®4߈¾[Ðô):p*:ƒU-K•êNwù‰°C»ê¥þ1•Ù^vlRæ§÷ #õ¤{31ùÁ“ø,ÎRuUÿä®, †™ëLf -ø›ØIN/ړ«â¯Uñq¹YfhÊ0ϟÂzvî…m¤R´[//»öÕì‚ I’âÂÃoวŽª›wgšâPÜdj⁞£ÈårÿÌï#»£ñº£q2>ìG»®Mâl’êRX¥¾Lf˜òô« ^Õde edg0BÔl{ê›T`¨8.ÏÇ#…™CÍt¿c¢ž¦²5q±´k–sÀה,zø7àvIÚOuLz÷[g\óc§é½°×7°"ýæ[EMOxz—–Ù´Œî*uíã“Ý~›Ú‰Ã2"¸}º€…ºnV‹³ Èô>{æDø«‡2J¼™ ±2g;6C-ÌçvÖ³æMkÃH4õ¾û;’r¦*>‚\ºh:\Lb&a@ø`…Ž›}΀ðÁpIªÏ“»ÊcK•ÓH­ýû®‡ÓªÅ¢+ZN…â]ZT\ùTÔË:¤®¼œ-Á?c†ãº‘i•°°b2”¾ØS\$å¸ê)–\1Uûø‘^*™2À>)—è,£‚ãp;DZN?d ¸ë=Êܕ<2š)a59krÀb׏6W‹qn÷…61 éêBƒzxGFcÇiŒ.)ë¡x¯ÈJi¶2O…º3Lê¸ C˞}¸â£é­Ü%. 7݄!çO.Ñ9×t|EÌ:†óu[m5æs®Ù9œ ®î4…à‹S §µìàx£<#wEM°”·‘x¾°Á5Qâ1 8Í…hæ؊:†õ®#D:Ýâ·Ë¼\Pª6ó'>8É#.ɞòÍ- `¹æ;ßܦ7I+ªêÆ¥ÔU+«õH£ËRä#¯PªˆÀɹ hÌtòQ}Je·ù·SWW¸±²H,T~¹"ÊèÃ%*öì§7UÉ*¯ª,dhcOv+q?Íå(ì ‘ŠjÉDâ[rŽKØh ;Ûb²e´7w5δ°Ð¹G Jꓰ+Ŗ°wþêma0’¸EçcE1ú½BþWõÝ×PªKw—IÕKòvu#"0§fÑ–í\8Áí¸2‚* ýhWÕ3Tö:¹(K†…Y!ú'9 ö^ƒR€GÏíxGºÒ <8%ÀšÞót1†7¦H!•ÄŒ -X sñ÷mZ¿÷ k”ÀbÝDWì"$Çj/!‚(K•U å†@kó½Í Y,(ÎÎesš“Æ+Y2*û¨žÝo.ÓxíÌlx· |ŠûìÐ -úvi%r‚¾a©^eΕQvò1°ïOQ½è¡Ý$¤ÆßY~Å/#J½®Ãz>#êƒ`á`Õ×Ñe'XÓ-Œ±”[S§"ð†ä 8Óð9^I˜]-Ò}º·ø3#ýÿ±"o–E‘› 0³ÈBîø0Úz¶g^)©h$)ߺCš…¡ x4Jé5üÞç…*çO%9nHäMX÷[ý¥¨±"ʹ֡ -’ ÉêØ W¥º…£õâÞ~TT-4I]¥Ñ)ÏR Æ#2J OâÒۂø{!e(‘Ûd_zºÂÌès¤+ènq¸xÖR¨©tö¥ðsxä2«}(ijß顶øÑ.0‹*¥Æx†Õ)/Z¨¨® 㮔–Õ¾ &hæ#ƒ„c>žÇÐ_!k…§k)%…© -´›ë„UÏ[«–jÉ -ä¼XHçäÍëƑ¥~¹m\&"öL:7•nÍ[Zfàðx3Õ;•÷¦ Ü0-hiÓ3¦;ÍÃE琩/ôZ~X|ûÅ I¸|Dq^t•Ž²+Ñ©Z‘+À d¬™Ù„êœ: lSrÍZ»ƒ5\q’n´#’q®!†•OZ×àüˆî¥:_*óY‘Q=r"ýÓ ڀ(ȱEãÜ5Z ÅoÈâœZœù£ÌHӌ¡]L—Ê2”õô¶®ÙW†(cÁ܈~.#®Já¡z€gµ^w56¯ ªŒ†ÍÍÔ%±)±¦r½è'î]ÏHVgЉ ú‰÷žh â*¯ÄâG™(쎆͘›çz[ƒ¯û˜={Ïÿ0хVÏĐEájVƒ€þ?+ÂPõÁ¸w1A–Ce nØËÆŒu‚|u-Êϕ(Ù@­Ìp"Xô„h³7kÅ»†Hf:„H# vQÜg‡›ð‡B­,ՌRÃá™áª ,‘înìÆTó̃ÿÓÕ)Ռb.e`ý¢±aüyévOŸM "SU!‹*ž¾¢O“ê^ÿ>⚠-É×¢`ô²¡Â‹žpuíDî*J<3! P" ž~¹ M…jµ¤eœñ¨¯ÚT'~QyG¹(5/ysø²ˆíþ:ðy]&=܌"¦¬Âáï538‰²Ör« ‰Z HXÈ'bSFiZDLh[} ÌÔáqëºYrˆJ`‹y¬KÙœ›ìêBÃä”긗&-. ->£¬ÉCýçx¨ªëÂ%0D•H©;¼L¹ƒè½.‹{i™œ5f\b §¾˜"–n„Í<ªb'3–z³?AUYË$<$í25†–åM*Ž~Ö\­7q}ôœèM4ç.t¥Ý½?8HPI„þ&Dq€‰P\9¯ÙÅÌ}£±ëñ#º­t¯6¹ÉÃäû­Óš{^v –¿ N@É@(Âgå2-³×Ëå®Qàݕn© A*ݹ[îÁϪíég{YáÙŽÒ‡:o+ßҁRÁ9° «LP›Emv–±Z‹ùzgӆ»käž*+…Y%lC —á|& j?q)ã=/#c  -¬QÃÉQä òU¦ ª¶°€ð3ÅGÉZVWlqÃá4Iw­6¿øq­)dT™cƒ™1‡ -œ.•YüЩ¼”·È]»·SI‹¾6è`¥Ÿd±yZcΆÍ ²FŽê–(]TZ#DÖ8vcZ´+bZª½¬{*.—áÍ#·¢„@¦;²–»²·E–®J;uÊâRí¦>xñ.?z­7^]¹×CvŒŽxë©5¶O՜ð`÷-v";ì ô%èƒÅ2̉g|‰­T˜0€¹»¹Š¿Žâüb1~‰SÞ1/tDC¯"ú+FꟘ¤/Ñ@»»îÔ>U±t EWWÎ5§47BœU/Fú2½GA›Xåö¨xœ\Êd؍ð1Ò‹¯9­ažfGêé:ÎÜ.ÐfÄW՝–s­:V ?®g¢ Qq'!1ýŽÐ¬y=’×)­E˜njᗰ¢.É ]Ãîõ¢’œü)Άµ‡ph­D=YÆ´þœƒYEÕXQòr3òPìA_–ÑãË.ìtæ=¾Ýî\µ(ŒwUõ«‰=,‡ŠõǨ¥º„…€‡ -ՕŽ¯Á¬û°”ø#,W(3u Æå‚Uæ€ù¶AFÇS Ü Ò&ñ¡±îâ—x:9¦´Z¨Ð7èí³)ZSªMó&,º° &˜ƒӔGînŠ‹R¡}YÁá7$õ@X '…„-e¿h8NUÒ^dÒ¡sfJ—˜4æ>Þ!+GãK‘‚<"7ZÒB\ZÙ|o(±î‹¼{»ã²$s­ğ#J‹¿ó;ÀÂ"z,Ó'AËÒb}»0öÈÛrŒ iáð„çą·Ú¯q¹¤´CÑ 6í-&ï ãDDw_¶c7q¼|(3ݖ=GÔêE¯°Û~„RÂ,æ:‹ýÌ[¹‰¹!S§:g_ÿ>™`šyÁœú V¿xrÍ>àݬ(zêšw¿£›̨¸ …:§*þB 9 ÏîOÄËxúð†âÝ=nÓÂ_½Êbñ®—&0cqŠÌñéjf¨âðL^èµ}\œÂÈ3©VÄT¬BÞx£9ŠkŸ“®Ï=¥@Jƒ5>‡áèÜ°»h²°Ø†ý°Ç’æ­lnºªî!,EҊx²OH3ÏLñØɊæË«·Ç«HÖ žlíQÔᱬÐÙ!Ɏ=ôĈp»ÆÓ¨Tu×hǕ{Ò€™boZÈßDÓ­,°cÝy{˹ð~˜VôT2XÌM_1†”´øJ D,[çvøjq{YnIŸ - 8Z‡ÅCÊevmnˆÙ+W„‰ÇU5ÃPíã¬icÙCﺽ÷tóMZ,CeK$—‚[ ³Y{Þ¬Æ`¯Z茀u6o“«2”|w™¡d\‘ê:«x.% —œ0÷N¼ÌcÙ[VCŒÖ(n;ï)W"‚‡ùpâ­P'¸js©AY —gQƒq1Æ0!1XÙ qۅWèïXíKœ .?¦ü qv«¹Mܤ’tÐ$Í)›sß·I$È3UÏÙþÁâY]R Ÿ%ìÔB4½ºJ÷EB®ªsœ‚#.5GWÓç?Ù»YƒK¥ô3ðé[}ÉÑCxä(Ë8¶ü ÉûÜç‚úˆû¸<ô%h8ݗõ§Tõ½¹`Ÿ¿¹“÷÷Hó¿Ò< -'v¢9¢o¬7 9ç5ñå컨ʆ3os¿A3¾_G7Ì2ù™Ë•©w“#”y´K’9–{)o sb ;jŽyu¯ìĘÃÀÁgØs¿¢Jüpø+‘å·ºâ=ñwû’s„›x €9Z ßMóÈä—Gǡėw'A_Þ­šÛéåÓjxywGÕd—ÿH¦Î†. -þX¢Ë{‹fVŽßtëvt93ž†Gs(AAUÚ&—Ÿ1%¯ärHx×v0 -†®äã¼,wèÒ8%©àŒ,h`ËQ7Î|~PË©­¨÷´œÝøÎ{2ËÑY¯¶ –ó¯±óÊi{ž‰+Ç1ê}NZùi©á+?{ÀiÌ*GXKÍ*Çâñ2ÙaBz™—îe’ʇ)ÿ **ÉÜ1åècÔ̓ÇÜ{Ù7JF9fñC¸ðé†q®?¥`›ÉÇe(¿ü™ì„ò+¨8(GÝåõx -Eî…èçGt”IÏFrѦ“å:áäW7;fc“£%Ðaê=#,¯å‹Ó’L‹…LŽe†üHޔ7²àa#yããel!IÞØPØÌ yãÁsRßHÞ´²¾ xÜzÝkO’wa5îYßHÞxßc»½ã0aZ oþ}›},0|g4ä )g Ž¡bÇÔOUeL7ùb‘äMY¨H,y“ŽÄ• äM3‘@ò擺ÆäxSdÃðÆñ¦°&Ê=˜††¤—“onÂOvãxÃÌæ×Éñ¦èöèOr¼! rãxS³¯©ËïBÎòõLŽ7ÞPU mojµ]‘ ˜ÆHŒ·@SF˜/}"³`90ސK„pƛÂgR~6Œ7Ì -æƛR9rñ–vŽÕj+ƛ{²ª&0Þ%—ñ†…Á»㍠»|@QÚeŒ=0ÞP±N|¥x³ÿr|V - ,&¸¼1Þsœ½ìo„åÚ9!ÞVX嚨`ôV䉮ïÇD³$x?VÓ'ÀÇy§w?w<]ûÌc9øݸNH;¿PÔ'á)\2½›äã¦J¦„w#êJÐÀ»¡È¹½¦é»*z%w£Á»"Ú$ßöµ’ڍ½øÞnÐn©8f7#Ž¬ef7{Ãw´1»yÑõЮʇááÝ.0æԄêߑEÙÁ¶yškáü™³»S-$J>†síÀnXYE¼nGqgáºñk*%Zh݅¢‰C%jî$üÙÀukŽq’fâºEً¶´ìlG"Å­ƒ Å®ü × ³*×M ékÆuÓP-T›¸nšYŽ¸nþDO87¦`&ӞöiÇu#°­zÕÀu³vC‚X7£ÊÛʬIëf½+}׍ - ýzàºy“TjºòºK@’×ÍíŒõ¯›ÅªSXyÝ,¡IÔ·œ„Ë%Á릅Ôč×MA-EÁëf(.؍¹KŸ°[[JÍ ì憪2¾£ ½óH;±›®W4Aì–×öfAk7w{»a•[b`7 Ãâ³üM‚†wb7#|’šØ­~,·4<"!nu»%Á$vsU¥6¤E$z¹¹ÇËÖaáP½!»e¾£`µiCó -Ù ƒè÷²›Ímˆd·Ö †xk-Ý¢ßɆìV÷GÂZŒìfo˜m˜µŠ¸åBg„KYè5L]\1Û° -Ô˜mX(lIÌ6·á!Ì6æZ…ųý˜-•”m,Ôö}…l¿.R•/Ùæ‰ñ.d›„;Ø³zN'¯= Û¤ °/A@¶ù@o·èžm>VÖf²Í÷ƒCh@¶iQŒt…l³Yh\…ìÇíC¶?zOŸÓ³úcB¶d°lƒlÓ¬ì«!ۊLÖk"µqT ò -ÙfHŒê¦€lã1û7 Ù“/ÌÆØÆ=p·Ûs™Œm}ënˆ±‚kô“Æ6-¼‚3#¤C‘۝±]‚n“ŒmX$nÆ6Klom2Û¸R‰ì±×PX¬@lÃ+t©÷ŠØž>p*+𾆬DŒŒUNb{1±Í&ÏÌ<b©Ü6Ä6‰Œb»^T:«nô sàÙÛx…­1b›C5&6bÏY » ±r=Òӂ±º5qî]’ÎîyŸv¾64rJE¯ 7œCJеñºÈ“_éÚ "q8¼6ƒHê„î1„®YWº¶¬T$¯ÍcÓVypõð²áµe‡’àkã¹3æ˜|íçúØF=Q”ë2™s##ðÚ¬/*ÂhOº6Úüô…­ !(#)ÁÖF׎[i}¼¢`0ÈÚ,_ìZÑ2—mÙW®6ÖGBÎ8èBኗ³T‹XHaƒj_n1–LíËÅk‰Ô‘ …¨†@·¨MýÇá` -\Ïá`çÎӍ1ºài! ã´ RSºz´Ùъ‚$³´qœ¤="Q»q´‡ñZYˆNÍ¢óÇ Šâ2”?[)ÚPR0Æm$ ùYC»‡poCh“1÷H‹ÈØ6 – Ý/EUv€6ô^* vàÚ~Ö>»‡b£gC£D0KÀ³!²»}žtý@vîoàl”( tanö)nP@³±°b¡íÆ̆UE`®Á‡ØŠºÀ^CŽ%úË -Ì>]‚’¼ìÓ=˜—݈ÛÜaÙÙp)XÙñÒDeCÿÂI|#eã"øsÊ>£½zp²Qc¦VW+&û @E`²Ï˜Ó‚’3jÆcÎÜ<¦G‚‘éé24›>ÑéB¼‘ §_ᇌpz|Ð ]Õ+õÖ -Á8ŽúœÑ~Ñtìg8½Ò±ad˜)àØOô46v03w4öcAH’±ç!Œ CüÜc3ÑrXuÇÐY¤B’‹ uZ«&û¾¢†±ØO`NƒŠýD~…b#Õ£—hd2 ¸OEˆµ¹x¢û·A±ifà# Ø…lâò|J(6sô¹7*6ÌÊ+›®â×Aš 6·¹]0K+çÅ†Eù­Àb—Uø[릧O,6sàt‰‹- -„ÑîK_ø‹jg,6ÏjÀ>¸š3xø¹Øp9ØàpÃb?*O(6XêDk&öcM؎Ä~<€'Á Ä~Œ^ÜyجncⰟ`ZåšÑK&A76¡$Wç†àp²«kగLÞÊÃæºBDÌÃæªî‡Í¨êp]çdZ3¶J}wà°yv­M6ýóö´¯ì©œeаi?ôŠÚ–ê²›‡ÍB•ž‡ÍK¿ˆ¨7;-{ò`6>T€‡ ¬«dgÅaÃÜÔFõ -¥¨‰Ã¦×ÎGµá°éԑ]8l€.Tù'6·à£ÛpØ<¹Ö& »®”L6«`8*¯4lZ5˜†MËp +Eaŝ†M—´º.¡i)âÊ¥¤aâʌ ‡ÍÅt3÷DãK«4Ë: *”mðè„ŸÅk¥bs)ªŒÎÄaK ú´‰ÃæÙ3ñ8lÄÆTú±á°aöOv¯žÎ(†3›+V6ÌF”‡Íít7ŒÃæÁ5b­8l®È] 6ž¼D‘æaOÃÄ^Ì&bã'´ Ð5ÃP¡s_°5-\ÂÜ°ÆDìŲ±§9ˆØ\JT`"v¾»;›éñgAb@C ±™Ô¬.GœúOšù®›YM¾M‚b31ɨÄŖ(ÿz&›¥! J›Ûpí¼Q±¥¸¾Æ¤bϾdAÅfì¾Ï7*6qªêYa*6SQlÑTl~!>X»)ŸTlx “ŠÍ˜;]lTlFœØ^-°Ø´h¢›‰"V,6ƒ:=ï;£ñµ±Øˆ+¨ÐuÃb'ÖݑQå?H³”>°ØõÕmXljQ¨¡ -.6œM7ÿ0›¢]6.6Ì\À'›>¬àbÓ¢ö‹+›G¤ (¸Ø Ǩ ý‰kumÓÎŦ/Ì´yp±ÉæcÏÀàb3ƒ¡†š+{šƒ‹Í9­ƒ‹ÍÇþ fwÞq -i½‚‹Ím¨áÚ¸Ø4ó™[¨Ã«L06‘ã ‹M'+Ћ Íǚäb37TÝ©er±#'« ¸Ø¬j~VÜ5¼ŽKmW.öcIZ³¹R RÓ°A±§ÕÜ/ô?Š®å|'?¬þëÞ÷ãü´#±ïrù”Dla”Š0ûµ²¬]@—$kŠœ`bv²s¬Gt} Œur‚b=P¸A¬Ù%§i…é,ìöÄÙ\°!¬¡Aå¤k•™ð €õi¾ÐƯ&À±?ã«Ï`‚½ú )•ùÁ®Նñ¿@Wã×J²¬ëü~: -p5|:R7‚[͌úói§V#yÂÈ_@«Á âgÌêf¹ÐŽ¬nÙÈÑÄjÔ¥pj`u‹Õ¬NäSðªaÐÄèä Œ”l¸êý‚V ºGƒ€U'¬}cU£ÂNu˜.Ij–¢›T]‡?ß T]CEœê -ŠÀTÃùפºÚIH5 âŠQ]£oꆨ~yZœ&¡ºÇûe@õÉìO}rœ\ðÔ,RÿryEIÉmQo¦éN”þ}–[b8%ñ8ÐÔZ‘‰¼¡©æe˧$Sw·BK0õåV;—út¢!±ÔÅóvP©-¡Ý¡Ô*E±“šÄ„ç§DRߤʼ©haãŒRß^Ž:bóo0j뷒E}E÷ £¨kTßí(êa`O’¨­±L5“8ԌÌD¹&>nOZ ¡ÆûQ\É7!Ô¨#š"ˆ:x¹½„ÑGÃQË¡I nv¯@]ÃOþ4 û ÞNü4êÿ†JQéQa=Ä×3ÙÓýAßØӖ¯zúdÈ¡Lò´–d½¾‘§¥q¹Ú$O#L{²B§©O=’Z-j.bCÆa`QÿÄ@OtÙ¿ý²Cókò@Owgù’< ¸OŸ5tÂ+w ±9;D§M>£,vƒNƒ BO&˜Ó@ƒ( kä4 —·˜ ¤3ÄN#LqWð¦‘8nESÅsFé±ãõÁrD5EÍ«#ј¬é»DÖ[Fâ|{›¤é§("±ƒ¦aå iÄÚu† Ì]V o˜éÇPœ¤L£â×h˜ôÝ»-˜4{џçK€L¥Ï’†Ì4Ô߆¯ì éĕG:Q˜‘¾ýõîi”ow.ÊBV¢%C†êˆýDH?á ‚4(ZGð¢+#·qãG?këL|„u1éÑÈö0µ±Á£H«n3u¨—êUŒŽ¾½ˆÝÉÑ·øvɍ~¼:Kl4 )϶S£É gÛha„ 8.9V€7LÔْÌSV;Œ·€d/# -0^«†ÝˆEÃɑn³c(½^¿±–nÔkxÛÎ!Œ:Váp÷‹Â_Ûa§q?‡Å>Oxv¹´÷áu„ÿ‚›|¡€v¯u?<;6ñÁôL8ü˺Q5òZp·³„õÀÿÂí-ǧõ‹xœÇ’‚ßcHšŽsµÃ蚶—‘²þöf´¤B×·Ø»Ðûa፽^‡ýlü~¾jÛ¹ý5¯;þi¼Ü~DÒ(ŽßV»Ï„Õ‹Byc”7#äù`;òxu|ÚK:Gû´Ÿƒßÿ̹åiÿýý‡Þè~÷j¤ÝÍPÎk©ÿ`¶½ãe>Ùjµ¼×ÝñR7 "3ªÛ~¿ßa¨°ªØN£xݵðbÜ®nڗ[1»Ü´yûS œïW¡õ÷—Æ·§<íË+‘‡]_ž÷áÿ|ÌøŽ§s‰¿ß^œû8îýgŽ¶³]ŒÛ¥Mûræa—;6Ïa¿½ø8åûÆpjëÛ <oxڗ÷!»¾9îÃ7{O5õ|Ù*…ø«ý; <m#ÛbÜF¶Å>G¶å°sd[ÎaÙð#ˆBì_¼v÷s˜öå„ça—Kûp¾QóL?ʇ[„yæhoÇÁ”ÒùÉ,¿¸·Ó[ìóZ–ÃΫ^Îa»E˜/D>·ASÀ*o;ì4îç0íË ÏÃ.—öá>ä-šwoŸÖçã^¦õùb,ÓúbܦõÅ>§õå°sZ_Îa›Öçã^7Îc=ì4îç0íË ÏÃ.—öá>|å-ÚoÑ|ÜËq拱üâbÜNo±ÏkY;¯z9‡íÍǽnœ/ÆzØiÜÏaڗž‡].íÃ}øþ£»B"Þu~pW¾y dç\o>LeåõÁ]Á ŠŒÃîÝj>µ» -6¾»+ëÆÓ™‡Æýû<áyØåÒ>އo2™Î9z¿½Ó©XÎaºËÙ.ÆíÒfއÅšwlñ¶Û»8ËÆÓýXžZßñ´/ïCv}s>܇o5™Îiz¿ÃÓ¯XNcz Ë /Æíê7fފŠš7mq¶;¼øËÆÓY\ߞò´/¯Dv}y>܇oòÏïßÒÕ>Žaß>ùæ~¹»ñHø>n ½×qíãCµ†|ÿ6m|֍ç'?;û9,öyÂó°Ë¥}¼ß~9³ßáù-/§1¿úå„ãvuËÐ1oÅ2ờ¶|žÛ^¾åeãùÕ/.oOyڗW"»¾<îÃ7^Îì·w~ÈË9ÌO~9ÛŸ]Ú2nÌû° ;óŽ-ßæv{—yÙx~òËSKãÛ#žöå}Èîo·û0}Ô<=ÉfÐæK@øuÅæu,ÆÍEYìӟY;=Ÿå67éã¹ÍHËÇÝÞVP< ­=¦·½7×|±O?~9ìôøÛÇÅÓöË:ÏãPïŸþô«=Ðû· -·oö |/±^¼x?gÝ¿|<â þ?S6¶ät‹õöëŚ3MUÑvO@’z_Î7#Fá~.3ì \ýÓvX†îúi;‡0Ι湮·­‚ß;û9,öyÂó°Ë¥}¼ßr¦Áïw¸E²†€Þç~‹q»ºi_nÅ<ìrÓæ9ìwXîM}Û¸J¥·?¸4¾=åi_^‰<ìúò|¸ßj¦a¡Ëûí=\š´¯²½½À‹q»´i_îÃ<ìrÇæ9ì··°øxÛ،ªý©¥ñíOûò>äa×7çÃ}ø–3h^<ȶg y@f9íßih®Wa¿]oFëZg¶w•Øì‡mҁîçВ>þ~ädcÉuãKáý°Ó¸ŸÃ´/'<»\ڇû°…Ä@õTßb z€ëa§q?‡i_Nxv¹´÷á+Â~‹æ“_Ž3Òò‹‹q;½Å>¯e9ìõ9|ˆê…z‹ö÷[´÷s˜öå„ça—Kûp¾É€@O¹}¼½H'$¶žÏxÏ·³]ŒÛ¥-öy–ÃîÉuŸÃ‡äú~n[rý™WÈiÇ/uµûLÆ}î£îb܆èÅ>Çóå°sä_Îa›&>žÛ·.¦kÎâû#ìÛªN¤ÓÓh'ò}‰!¯7ƒÝ^¹Ø?ÞÝ{ߗëÆsÕ0;û9,öyÂó°Ë¥}¼ß,Ø-¿z¿½s!°œÃ\2,g»·K[Öó>,˖yÇß~»½ËB`Ùx.–§–Æ·G<íËû‡]ߜ÷á»íZïwx®–Ó˜«†å„ãvuËÒcފeå2oÚâÞowxY ,ÏUÃòàÒøö”§}y%ò°ëËóá>|³`÷ˆðß}•ña|ûöÉ3ôVßÆÆéÎûÃøÀÆ+wÛdžÿÞ¾LšÞdž¹áüØç§qÿõÅ>Out¹¨wàÛö{;¿âå4æ÷¾œðbÜ®n4æ­XƜ¸eËg¹ÜÛå Π痾<¬4¾=Ùi_^ƒ<èúÂ|¸ß8ì°ßØùñ.ç0?óålãviËX1ïÃ2ÔÄýZ¾ÆåÆ.nn8?ðåI¥ñí±NûòäA×·åÃøþ3öúo~úé/üáWŸ®÷¸ëß-ôÚö4îõ“þë¨äpמ‹….«ý˛]%€µýòvœŸ³/ÇùÉçùmĹÛÉIñ<ËE F{ÀÆ×/Êx€Z.ãy<§ŒuHŸããèÞ¸·ûãmˆ_ü"õe}ýԃʃÛ¸ãdÐñ¹TÙoì,ãh(oàï¾^7ÏvødúÝòdXwë-ãõ‰Ùˆj0]#*¶d,×ásx 1ËTÚéî#®ýA¯KÝæ"dôAK_oǃÜ÷®6oú:«ËgPmz- |ãR—ýYk¢{ƒg듺ÒØÏ—å`©Ð–{€^Þ¾‚ž÷|)aރ·çð9Ñ -*d¶°9.?"0È^÷ÛöágM2Y<8 :Dì?Ò²4´íãx­5ü{(ºóûéþ¾6b‰Ì/éyîiDGmÇ·öëʍ½iÇd­ƒ2Ôùµ3˜'‡æ°|Ö¯CŒ«·89TÖيvV6µ³„ñõ½Øxð¦Ä¯ÜqjMÐNهnRTÆɈÊׯžÁßæIýöE–âáFöÑâYÕ>üdº_pðçÆý×Å~ MoïëeË1‘íý±ž¨*²1Gv{†‘ý¼%¹_Ÿóød%{ÇÆ(Z²ñŽo}`ç!Œ1αeêW¯bÞUG•xk -ý1íÇ9Â^ž¸«øœ‡åSôÑÁˆâYïq_a<‹ß¶øøü3¿8ÇKíÅûórÔFÜíYë8Ô­WÆZ†%†8ûò™÷êV±´7¾No|Œî±¢Ta€:ñ† WžGˆ‡{èÙÇÆñiã°]ßéÇs˜¾Ë%­çˆ–Ž`N=æ@¾„ýŇz-À8žÃXã“! ü«Gž÷ó§.Ûÿv»o]ÑËxæÈBϖ?¯¼'à@8Âsþ!§òŠ gŸï0;•$>}õ*ÖςΫ¦ÓGÔ!Ùï>Ž5ߗ°Ûe€ýÎWuvàA¾zäüÑv‚‡æ+ºë¯*Hȹ*¾±Pý’ö£_ËòA||ñé«GžWz‚ö•+emxu¬•›Œé°?TIÒXà$Éx¬¯w¹N¿?O=ã¯Ï*6îùÙÕ#^b*>ÿ̹­q›~½s¶y{í5Û|üþÃØx;ò¿å¢uþUÑ{??†½žš[a¿ùå“Ÿæñäelãzâs½ÂC8ÙÛw| 1¯6.WÍ[“G8êíß*#G$ôÉ0‡'*ÏQü^îrµ‘0H{ÞqØ{ÄJnðßl,q¾=6žñ¡>pÜóóK`èžž5›÷sÄU†ý?€+]—³Ç`Ä ‘Œ÷Y¿þ¨òÔ³ëk× ›·¬óçcçr¬äö ¿a,Z*Ò«x}·*ÂCúEë͞ñ7#°uô·­Pa¼çÞ7bÚЗ°;Η“¨1†ßà×lûÑxžµÎ#{eÄøßçÕFóåÒ㒱”¸²zÎý_·)LL>E9 ¢ÃßPY^/†K–3xr?ú¼¶ž=)ß±»åTð„ñµfz–-óÈõˆõO¹42á2z¼£÷ã Fg£ç=1óо¼£‡¯‘Ü;¦Vß´„Ša—˜%=ÊzÜöâ%RG$ëñyµ[·§ÃË-ñí´òÌ#¼ÖM9‘ŸÃ¿¾õx—&ls^Óϧpïë<ÂËӈ)áö2œÛŸ=îeŒÅ`¦ž±q³+°^¼:O‹GhfËA¤÷îMG“ 'ã_:sË!œ­[t'ñzêövvpŠXO¿ÃøúÊÊbÌ#G> ×ÅŵÌÙ}ðÁC>rõâwµå*N¨'|ä±|£j"Eº·‚‘Bo9_‡a?_wëºâ…×›†fwù(4÷žŸ&ü„|}Ѻï¹Ò¯»ï¸¶ RÂþè£ï3|‚‡YºóÓz®{9r¿òӊñs‡=ò.\ã^ŽÐ¯°Ÿ£yã™3à¢Ä[>#&«ÖÆ<ŒÆ2·çª o8d0bæ˹±Ì/Ã3¥Oøuß¿„½•¬™Î“±žq+JyŠ’É’_ rsjùűãUkÊ0·Çé5/_# Ç]ûå#ƒæ;âóÏù2^Âîéq8 Û>y¯yßH±qu#ÑX[I_®ðq¼vGø§ä› \ØÙŽ¢+kŽãŠ[Ó8GŽóµ†šG_cè¨Óù¼JÎҘÓ~¦«ùôÒgõgœØ^ÃEŠ -¿Ä¼ª"gêï!’²ŸãåÊ'ûhÔDԜ-´ñˆÉã¸â ol­o"£_Â>GY­°yGùʵø¹×üÆG2t„øH^óHýsPP‹ÛÅ<ó:³šã -öÏìÙsj\ÁÆg,‡âÛc¯ä¹2Ì¡Ýw­¼¼‹¸;ð¾†_åçVL4sRÆCqßóêPóSÛsÜq„#‡Ø³=w!—¸¯ˆYÍhÏqnV¾„}´x'bD¾÷Œ'ÇáÄGH/´ãšG—Ä TÏvæTãâˆøG½ôçÙ¢6' yóÜZÎo1|«IKDz`TŸ•¸oˆÐÎ#×3ŽüÈ©¨B¯69ˆÈSüæ.ÁÞ´ºƒcýĹ¡Oº½w¸Q³@¾./yŽSO¤†Ÿ€q%ýXk$®¡‰ÿüš9@ˆ®Ðáæž^ËÞ3h>n=$UwýEìr®Uît¿!—,9¹ÙW’<}ò§PÆvÄûׯŒ_㹆‰©-Írã×XG˜é®ûÉ1 m®X=ߧbèd&ÜùÝj¨«è¼¯Ôh¹ ©]ÙCæA5ϑ›Abs¥ŽDÅ<ÂyÇ[µšŒ½Üù!åz»Vÿ'Ð¯¼ig.E áBWh½ã ³ætìäWqœU`Ÿs&Þà/aoõˆ5pÉÙ¦ÁDí_i6®¾ä÷XqF1ϼ>™|"hná¢VÐ{ÒÑ&»ß)‚Ü7_7#ø‡³¯å,·¼Ü»€geM‰œ>an £P×ì0M} {ɛó9Œõ=t„>Ê‘àÈ3Yæ×gPîN¹ãˆŒKùkÉ +Í×õÇÐb°ü R‘ô#PÔϪ~ÑWØ+ÜcFóT ÑgxJ¥¨X® Ð-½Æ^$<ûÂx~É<UZ5&½ÇëÉä;¡c{jL"ìpmK¸Bæ”àiLœÞÆ]!P§$û¶*0v|ĝj`ÌÞU‡*8að"Fˁ9aüqøÎ0tÇ#nƒ† q„ñǙ¢pvŒaq2v¬Ã1”[mÕ­HBF;š”…CB1±ä×å1IªR)ŠÃNY«Â™Ê҄d?™¥Ä¸R¼Æ—Ç.—î—G¬T§=Ò۽¯WØàþŽ‘'tö#±™]\áÄ»¹\ü=ÜñCͦtvdXÁ>T* |2qÎmIƜ݅“¦¶9vHy'K!Y‚`9Ö '6ՙ -±ÎÞ3¬h<%6Êa¦¡C–‚*vérP…â³™å¡P8•ÌŲã$vg3,Ü»tp[ Y› ©; ÷Oñ¾+9Ž çÍ7è·q8|ÛÈèAۄ&s²$×`6¾©˜x!<Cäl=à&W¼àÍu®mq^=ÌnîHš§¸is‡¶/Œ‘äÓ"±d^®Ycƒ©Ñ10ë9±@Ír œ2pS8#f‰î!žï:&¥(ö|y’§WšŠØµA%ad*¹Ì"{}“J1H¨<ÉâV³¢^è Ï™‹¤(áÍmèsp(JòGì%3™PŸ#åHÏá׸±fLr>ýÄÌ*ëÞ±pÐq]Û4Û¥#ëZ²…)+²ÔlI²mFÖ©yBЩŠpä#Œ™<üx[p¤„•iÖìHä⍜žÒc:+‹ 1RíŽô¤šƒ¾"{áªC›Ò¡¼‰Ïo ÍB>³”°CÃküibX–nþX\(éüt‘ *q›Zs—#Rœº¬“CJôÁ+üÜnËgHX`¿ñ ´ñÖ,¬7É -z]Îg{b­ƒtNô(ÔdP– ¶‘í EêZ$ü±eGÎ$ÍEg–3ŽãˆlX²ù2:=Šdb Ÿpùh¥»$¢Âèbs¢oB«ÍY^$öaú@V9ȓ„'«YØÎ锝Ù2é:%n§u ð'ŠV®pVhPœÏ -šaOdƒjàÛ £PZrF‘„ÌÈËY EÑü± =-bb²·Ñ)Jt` COI…sîÑðô#úZ‰ÈRÒ)8: êOÙ:x*xÎkÒ÷<ËKݘf²ÄâƒàC>i¦R*œÛÕ*¥Cwþ45ª¹]Æ Hï ¡1Û ÚTjƒÌ¥d´aø8%ž;%x/Å bÂ̤7W’¹„ÊBÌ1«¢Ò‰£™¤3]8Ù¸mÊùh"8k¥=@ü¹P@+¹a©àÞ1çÍC’ãÎ#ä2¸ •F™¤ÜÊc.HՊÜù1_ÑÚýÒ3F+2?ÊÞÞ¹(<,œû£³Þ„áÎ.Ò9:Æ U®\ tŠv¶1ò*ˆY°;H¢x…:ÃML.Q\Žƒ®µ(Ýx 9rê\0èæ±°gM¨cšä"智´ÇàwY•¨ˆÝ’™¸2 ƒ…§-:òdB„Ÿ&OœLœ§»ÅUͼÊgÃd±° 2„×9»„¹ðZÆ#kþâN¬ <¥côîT¾ŽÛàäÜÃYìƒH ˆù‰ÁÈ»œ=WŸÎw…­Š‚› ›Nž’ É !µÁBn÷sÎՇ9£Ý&5"STŸ\py@’‚‹×'Sž,ÐYÜq„rfÉ'˜÷†1ä )¾«•Ùèp»„ˆ_gt>ÆÒ{ü 4Ì3÷ÈNj¥D2é<~9¼çzV““؃#äR%äÖïlÄ¯s›H×­L?SsH¬å¦C»YÎg9œ…„áäPð¢à†â2rÊdsdAŸC"gÓ $‡¤7@Kòn̪)´ §,V Q·†#›ZÁEã¥$nȈҜå&$ l£QÄa܊CÈ"¸¥± àãªÓÀc]ò®0§7sI§0«9—ôǧ¢,È|“I·4ÒÀË®SA1É …pŠ–¡¤b-ç÷B³” |g×`”Ê Æ]ÙKdÏ1apÓHPä¾Ô´YãkCNÁÇVÊâ¤9©‚JôÉÉ £m’A¡ú)»_£Ìr t 9ˆÏX sà"müY&eM÷.´+ì¥Ô²0À,¡ÑNÆ@áœw:í{‘ÓŠ£co"Ôs$0söS›Þ#ÑaÞÈæä±@Ÿ<‡ASV0ܯ­l€—<° /µ§¿ Ð÷ãP†”0ãFé–xf£ë,GJ$%s»êw|vò`',cG1¥7óSX»¤ éÏùAf3«Ëas5§G#Þç!ÌIPè·ÕeDyp #>H焄@c· ë"Ò1uƒJæ¿~€eDüUA˂eÌ'éÄ&(™RžL<[ã1VïárO Ԃô%Ô-Ð%/@CŸ¹äÝlrÂSÜ»œ•.PÐÎg¤T鎪<¡¼‚YÊtsPÎÄ I “.i-Og -!á,Í`Êìa€)§eÃÓ3¤”¤7Ú°ºCHLEhÝ TÂyZKÿhL­eÏb’Z’»MҀ²8…GW_ SœÜ«18Gx(Õ¹n­l+ÐyèH r˜5ņآÔ6Ϟ30HBë÷Nå÷T©IDxÎGk5O5Ê{"5Åa y›”:X²èÊw½K¬…ÙÎ!ÍÇ~Vúm*O’#ÝTLhÍv@Ö¾˜=4h릃h8 î6Hb‘“á[±T”ˆ€Î2¶#…§KØQ$­ˆ:ÎiQâ´ ¦Ïðš·-,ùüVÄéX!ه¤I(5ûÌ('>¬Rˆ‰¾ÈÈIiŸ(ç¦í§÷ý¬¸"Ž9 ®ÛI1í‘í¹Ë2’ˆ £Z–°ibQ§@À³3œ•´X†§œ“ËD¦sQlÙ ñyê\-<Ä©Së^tÌÏvÉAÁ— ù´ÌxˆŽNÎå »<8`Ii´ðÌÂ)ÁSîcYûX†):ç#ۚpBQ¦´: gÈÈâ„ÐÆ|æŒ]ùNö¦s`©óã†ÁY批åd -óƒÍï¨!ÒA{<øé¸ -vÖ.Q¦^qO -'â" XgÖWo»YÊ}ê2<ÐqBœ-w¼Bº#ù ò–:;]Â6iSPx^špFç%Ö­è¼sNüÄ?WýŽÀý 4ÚÍ9'+‰ÕŒéLqæµví£j‹n$]Nד)ªŒÓ…¦*À x=£MÓ}¾rtkb"´Äé0h2öÛsR瀝‘¸ÕQj-‘2ïxîSçÙɧu˜ãW»áÑAÚTlcð§G3ÉbÎí“:UØ%§tÃl#ŒÁ„Äd$SVÝÔʊßn]±¨U5“»Â‚²1 -—= rÄ'œÛPûtðîR6éSˆ/¤žÿÌL/ZIìõL[Á†z]gÍ*f²˜z?òN1"¥ÉxàQ¨‚%.§w—1p/ƒÂþ°r€v®'”ô5Oš‰x ñšà)ŸöV”XS4R•ÑWéKšyD'¤ÏÄ”MGJÁhäå…#šŒxÌ5ŒÇ*% s½ðLí´°z!ì<‚yN†^òŐí@öˆ³²M“çŸ,b°é‚ðu :a] Sðyå:PË(°Ï(´@Eš8Ù°Hòj"e\ _Ç1ÌZ°Î;GK¢þ nÚ|È*ZY½f8‡/gNþA ›‡]\U)äÈ+þg)Ç×Qä3­P%‹väŸB%š5ã”uÊeJ°L<<•ü:Ö½”ïł"ÏÎIYw5dL|ÂHk–ÏœJVH©8WâÓâ؈y ;JYy|æ’ìç>#0jª×^•š: nDùôt žÓàÁ¹œ|‰`œójw!‰¥œ˜›ß9ï}q,3Â)‚¤ÃnQpù)Ÿ^©Ê+Â× -Î%£àk5 (qÎõî3ªQz1r~€˜RCT¥¹p/[§íÄÂ9[L·–¦¬ú§[™wÂ'iŒ]X=bàä !óKM-·í4¼F«œm¯Ñ¢£Ú×½ëEsŽC—ç‰N“ĝ:„YÎkamP.z—sŒFœ¯o1ãŸkÞBÖ®k‚§ÜS:²— :ý£q*/Ÿ#Ar4«àÃ̐¦ÁNJx'šÁà™Êœ„×¹E(mqpe´$ÃF©0]”²"÷%]"àr -8`=Zr=ReËü€Ë ®„¬0|!mÄ×[ØÙºáôÒtÀw)Eó„’dIwÚ:—(KIW[àÊtœ?Pð}Žc)Vó|Ö¾WAÓmÒlהC©Hø2‹ª7†·9ÏUñá¬Ë¨;úÆp¶ „;`ÊÂeV©j ¿Ô§GǼäk_š²rÎ7€ N"Ɨ.à= ®'K”W—ExI)«h˜öÌ_Rª)e2TBB¬_ÑmÖ ˜ýK•ÍReJøvßTY˅…g|cÆÚ­½À"çqîڕÍöÙ¼èZã4¼žÀÞCUÕ6ßìÄ® »ïF¾Ùš\c´ñs‚†<æ3Àtöè°ñÌå— Š î‘Ò+Äþ° Ýd«9çYäs0-´-ܜB§bé7'.ΎBWز5¥4òai˜‰†·–”£Lm¨r¤YNÛ-´ÁK^©åŠÍŸ× ìáÉ>(išíc%f•C­^Dìߙ۰Z»W&|÷5fÌymÆÁ±ÏŒ3åHºs¦ -gµQ#¡}· U¢Õ£é Õ¢:@át žÓà¾F/ÎbšP¾ÎŸäÓ06etìî‚naÄ£?øê+1ó¾ )Ǔi¾ÁF59’SB@Ùœ8玈mòô’î -{‡¶»Ñò¡V—{± ^VçOe]Üßӌ‡ê8èÅ_‘‹!Õ§KðX²­*oÝû¶õ˾óàivþhØ;Ï&W/:Ói1"TôüÇÑðŸ?œö‡¯Žü¸x݆¿|ýՏ7ø›ˆìg??yÜT_uŸ¿·¾7O¿<;ýqÔ+ðûà -endstream endobj 22 0 obj <>stream -~wÚ ;ãk~ú¡uïýõ`h~<2 ÷/fÓbòmë;SðÁxܙ/Ó½êzãbˆ%dëþÓáÔÿ¦n -üñžPÑ7߶îÿ4ìw üÌà¾.—}ÛÌ\áwýÞôjuéaçÚ6Íqſۅ®]ý×WÓú}£òÛê܃§ç.^—ƒN÷jZü¡3œÏúÓ³îLàṨÝñ~Ï]×[(´­žÉÃø¾þ¾ß‘.}¨ß¥Ü·uí¾mlHÕ&ÇdÚ{X¼íw Yõ)S®µ­q¿ÌƵ;:.&³AŽDå·Õ¹³ÑlÜ- n®:õ™Oƒ!ìkÏîe«:P̓Æ^O:³É¤ß¯Ç á«Ç㖯¶^îÓû°½É× G ¶ˆÞ÷ˆÑå夘®Ÿi;Ì1±ÃcÏqøv™I @À­§;ŒÆß¿»êO‹»ô‡ÁšÒåí‹oMS¨ß¯›¢;tÆ'£ádj„î]\¨¹µÞF»ûèýÍhXlÒ]_s[ÝÕõ{;_vºÅY·Óhî–jm«—@ïç³5tØ+>j¯¸mÚ¨‘æŸÚTùµ>Q~Ý¢n¬›ôiGô}Ñh >‹Æÿ¹£þpzÚÈxöÝçk͙ÛvNð²ËØ:.t|tSŒ;ÓQ}¥4¨±[öل³ËÃ~|[ú·cêÛÉèúf4Y«ñÜnR_­y×(»­YW}³Æ"Tê‘Ú‰­ÎRÄ.(Óo0ó7[äåqzu]Lûݽސ›³ô]ٌýé‹Nùb‡wc+K=wn®LÒ;¾'ï¢Ê¿W`ÇFùY1~]]wYòjÌpî }ÖÆ܂†`ŒWívÜX\¶~øú¶‡‡EûÖ¤k»6ºøkѝfÞiçñhta›²ÓIýî–*m«ÏÖ¤} -~ۻзCà[™ÓÙøb6(†Ýú¾u[¹.iøU[éÞ 1èÕpvý¼;í¼-°°ÎÖ&t;ªïa¾èLŠÇãâßffÀLï¹jÛêêpt6íO»k¶øRÕ4ÔR¥mu–å—°lSˆU“õÜnUkϽd&âîX䫃rzPNÊéÝSNëGª”Ó[Ü¡;¡œ^Ž;F½ü8êOöS=­¿wW=­o ;h§íô ´ÓƒvzÐN—¬¯ƒvÚDâX\ ‹áùšàÊ Eþ](ëSbÜéõg öe*¿-–Ñë: ÎGî"³¿\ñÙh|s5Œ^×€lq3¶˜Ø¢ë_}JØâ-Øâ~²ÅGãQ¯_Œã 3ÚÆx`ŒÆ؀1DÆýŒñÀŒ±c|ҙýíß'Ý«büǢ߽úþ ‹ñgŠ1ØE6ùÅóŠnsÉmšžò°è>Å¢K‹Îõ¯>%‹î°èÖÏ'¡÷7γI×qž;çù»Ñà×ëΤÏÖåÛ¥`Ï#±wឍºt'>iøÍ'‡T0ó\hW†yjÝNÕ·o›$¹»Läp»ÀÖD3Î#4.zÍrpîCüܙ£·8~ûÊ wÿò„ËÁhÔs7'\ :Ý7?´,htÓéö§¾ÚMd­]ºL;½·Ü¤YïvlÝ=†)ºËËnϏ[|Ä®½;‡/îhҐ™ìˆl2¹êôFïNö™QîEzðf7:•¯ƒª?Zóõ¶5+ëƒíõ//g“¢ùO o_-lxãQ©Ò¶úx7®urSjowÀ½TΛÚgÚünÛ~“Ô¿ë ˜§f®… ÊÖØn\Ÿ)u~í_Ϛ8ª¹Â¶z‡yý|Ž;&Ñ=ìãž}k.²zhyÈ>Ücu¸]sMwwùvÍ»¥DÜ ¡“f×>ß_v¸Oô  í£€vÏ¾Œ|v¸htg¼&ûÑè¾o֛ôqǎËí…G¡Áe–kö‡£s¸pt;Úø®\8Ú`ŒŽÞ¦¹±|g6åÅ£‡=ù–ìɇKÀoÿž|¸ü°'ߒ=y3Uë°/ߒ}yß/>Üþ‘QÀ;5ڇ»À÷u>kcvy¶ìý•; â#võΝÍ°K»»»wîÔ½f‡…ÇÍe;µYíÇ­B׃®~6ÚZ‘û·êCj÷¿6à5T~[ýbjO֍í0—Ù€‘î“Á£oÏj¬ÑÛÍeîF2 ;qÐôììû’=稾î°+ésŽö/Îó»sHý.w?á̞Çp~ÄzÛï87 ‹¯¾Ðõ¾;¢àì/ُ¨‘vƒ£N;,ý‡K®þÙÖ][s1–[vû"ÿÃXýrYŒ÷Çûkº5›Àmýiç¢QvÉ°+[õH…ŸZnK•¶ÌŒφݗ»Ì…öw¶ÓVÔº[3ñÉa&Þʙ(îK<¾ !B¨ŸAҌWãÎprÙග[¸:öÜì³é1“]²øØ>¿‘N³cúç^˜}0|òÁ`ð%fâ.ªg®×›Ê»Ñû™²—ë5¹kÇ.ÖS‡‹õ–NãŸvób½?üí?®Åñ¸Ihüí¿WOן§;r­^“¥w'®Õí¾¥N¯?k°8©ü¶F»×td€ÜE-tc{¾P\à-µK…÷l4¾¹ F¯ëóÎ[¨jxâNóÄý PÚ?NØ æãÀ ·!/ï]Ä÷EÓhv‡=|ÖªÛ>X;Æv?¬{ïÓÔ3ÝÕlQA÷  Nàð-È°ÇÁÂM¶ƒ]ÙáööÚ¢ýÈg°&ñdÈ1Þ§²Ý‹TšÌ»‰Y¹¨?ZÖ·}ÖW´6`}ÛñÖw.\u†ÃbpV Šn#ÛbÍmõvMyèܸ·‹5·¼­=ìOnnq] §Ï:7»¼·íq®Ÿ§µðU”¾Öîþ®¥ë¹¨o»Û¹Í°Áα+›aýÑÚ1=`OR5¸*t‡_Ô7zíÓh°Âv…iÔ­;r‘÷å¸(~­oŽ¾ì¯ (Ÿ 6lo°‡£aýŽuºÝÙõl½«?ì^Xg[(\×ïg¯×Ÿöß6é%×ØVýaÑ©Ãk·3è>5ˆxjl«‹õ·Àp,© ?b_jh¹Ú¶º¬×¨¡«¼A[x[ê Þu>Ôï˜Ù⧝q3™ÀVؚžX¿sÅë&r+¾µéX_­5PêGÛëQ}ür<ºn°«cé­*IaÿºÉVýÝçjÈþäª9Êö.r©{ˆ\ÚÕ¬Á`í˜=ç¹Tg£Ün¦úý¿È$:Üd²Â¹«±KÝý]j²!ìÊwˆ]ºÕû\}x·b—šÌ»‰]êîoìÒ>²¾CìÒ!vé»tˆ]ú ][°tb—ºû»ÔdçؕÍð»t»™å݈]êîoìR“¶+Lcë±K;äBÛÅP¬&Ü|Îns€7JByۆ§Iìàax¾øðìí}v‡ ® ÙÇ ®:jéúª%ÁË&JjPe[BÌÍvú¢ÿ¾LnúÅà¼a˜Ã‡ž‹ëѺ@ä =ï{Åe¸6ƒ|Iú):ӇM"]ƒ*Ûêè!ƾªŸ;c?¹(û½Ž±¯¹cîM€½h«}ˆ°,W‡ûÏ3[ⵄ6£–ùÿóÝ|þ`~¨‹ÛGxf¶§Åm¯~Û¤µôN˜Ä/֚ wØ(¾Ï ÜÁ>¾%­¨öíbí}¿à®K·¢=Ÿ­az;Ì#›ñ‘ݲ$ïŵvõígoÖŽ„£e·&ð×ïѯv©Gj'z´f8K=[Ô]ê÷¨;³EnÞ÷§W×Å´ÁVµ»›rS™w·äý=캑àqÇ÷æ]tm6›wl îüŠ†Üùw~íß*w~ÝwþÁ¿\Ì:¸óîüCʼƒ;¿ÚqpçÜù·Èò-8ôeôC3Y÷àÂ?¸ðo‰g×LaþÁ…¿Mò¡ FïjÒ ÿújj -uá\pý›¯·5™«¾ÄÕ¿¼œMŠ“ÑÐÈÃe¡âíï«e‚gÍR •*mMf©¿ÎƗFIlØÉr­mõÒM©½Ý?wŒÆN Ú¹Ÿâ`UKï†u&×áÔ涃%jt°D,QKÔÁu°D,Q‹ÒÂÁu;,QÎîd-QÎ,…©ƒ%j×íƒ%êSY¢¶·nÛ;~WìkgNÇÝ۝È:³¯Üe“>îØ¡ç½È<Ó «É!ó̶d ú=ڑÌ3 Æèyæ6m̍:wfSô§/:ýu¹ޑ7Íäwؓo1¿?ìÉ·¿G;²'²Áí螼™ªµkûòþf‚k,yÜñ=yã,šÏâäC¸Š†ìc¸;ší¬{eÃÃUgL•úYâ™7n©èñ…2olscڗ$õïþî}hAôa{“¯AÖl2¥½ß^F——“b -3m\ôš­ª]ã·!˜ús±Œç8ŒwX[ùˆy¼cC½·„ß ËþAÁ¼# -¦PÑ7µ'ñ»~¯IÀŸ+¾­MSÄ ºvU4 -œãò[~î¸aàó$MßJ·Ž„®?OÈæ[Íu©õagÍ7ÉÁ|³ëJØÁ|³32z¶wæ›=:˜onç8˜oæ›=êƒùf¯Gê`¾Ù=óÍ]5L¢3é®±EÝ¡è€Ëq§;í ~õ°ÕëŽ=¿ì¶ç8ޟb¼mrB>¬³­.FíúÙ¯.:“âñ¸ø·Y1ì6Ð`æªm«§ÃÑÙ´?m°|'XüUÐdLK•¶ÕÕn}Cå®i5ÝÏ^yÛGë<‰TqHYvHYvHYöYúxR–5lö&cÙ!aÙN&,k׿ q:j gvC¹®lõXº¦ôy @$ û\&±W³ñÅl`XÜN›Ri‘*]9éÙDÕÙ-ã÷F' 6禸ý lÒµCÈàNø -~.Æïúã‹b0¾>_“Ác—ÂÌÔÝlС;28­)$î¨G§~DÓî:t¢ƒGgIww×£ËòKøt¶)BôӃ~ºeý´Ñ2;h¨ õ ¡4Ô=ÐPëKŒ õwèNh¨{uX?iÊîê¨õûxPQ*êAE=¨¨õ ¢Þ~õ›OEtþhØcUa@ç?Ž†/ ¼óÈÁážÀ𗯿úñÆâQödz×£iÒqÑëÃËbЃŒƒ~ñ·/†Gœb0½üíu¯ŠçoM›¿ŽZ¾þ*jýòîë¯fôß?π"þþˆV„ÿþòž~o¾ýÕÀÞµTëYëO‰Z½¯E뗗ð›iQҎ¢Hå­£¼umžàóô믎øKÚNt*cx„ÿà1‘¿'­S o%X0oñoTËäP ->NýËðŠÃ£ÿŽH±â)~Ò/Á‹ƒ&›²—ÐÓùÌT½†´-"­RüT¦üaSáÓö‰~9òŏ2ûnói__àG©U‹«Ø_2Û©£Ìv„ ªdŽ@™¥Ïñ Ò½Ÿ†0³z­×ãŒø´‹cu”øّ£¿ÇfxŽ"èl‰Ö‘0¥ly@šKÕJs¥Z¿\—JJQ]2Ñ­ãn]œÇõpÊqâ(›Éø [ÔNƒIˆ„º¶³ª<G8žÌD´#Gµà“Ç)½¹-ør¾²c‡•F:hAÐ0æe#'돜A%£2í4P9ž9‘W—LäÂÈ-Çy\§LË#‡wïÛÖ/„þ>0œ*j'¹Ê`ГØÌó!…Ú|ÑYœøÁÿÿKg‘÷—‘íLf"n©¶T±À5zßesÏýC ßsÓ<üQ ‹ ¯æ§Ø €æѝb¾97;Ø´¼Os~ÏP!ÍtœgaãøøD—¿M}n“o΁¿Ÿ»–Zz͵cUê:[@·ºµ²ëDäªnkZ†JµuKÄôž`Lî¿,:ƒgƒù=jÝ3Qüҍ‡ùÙ ß-ꝁyí“q¿÷‡âƒ{m¶Aé—fóšLÇؤW´ï~sn^q< JE ;ƒâɬßs¢Æ7çrá£÷7£ñ4@åzÈòËtU߆®z9ÃIUÃÃÎtv=AaT!Dvý¢<ÐÖ"Q),R3U®Ã/Qj¸¢€‰<©úb—uÔΖ"b©Â®w³ñ:^Ÿ’$«4åÏÔ-ƒ4Õq¢àe2Qšx‡iŸi`œÂ.§Rë -ޒØÝþ(uûì –÷Ó'±#õ|­áÝ×Acà ²í?WnÓz5³7¿§Õe.›?Èã#`zIݶóJ,Çë°DevŽ=»º -_”ë« -û¾¡h²¢µÑú>«õ}ŽÖö9ÎË}žÙ^ -»ÉÀ—Sû%&ð±ªçIî»®ª»Ž²C-1ÕüɨËfA”~Qõs±Êqu•xn(͏ÒuIºE®ô)×uçH klÜ£PˆË%̂]Ù³U+z¨]µë!}®œªØÃøcû—ÌõOÕï_²¦1ÍJA³RÐdŒƒ/ŸpVªÒ¬LË?(]Ñ5Uš”s5*z$]‡¤ëOäzAŸŸvNª¥«L-[ejé*[Ò#íz¤]h\èóSÎAµv©ekL­]cUý‹Ü”nšI7ï"ÿù §Ÿ( —*ÿ dE¯Di´æj,vFÚ¾HەÈöÀ}|ڙ'–­$±l%‰e+©º+ÚvÅê7-7îãSN9±t ‰eKH,]BU]AVvŸÂIô‰Ý!V÷I¦˜•*ÆÅ U‹½¡ ãbXè N1mg“¶s+¦O:Å溢æºR±Z溢ÖuEÛ®8Y× †ûø„SìsIh£̞Q;—Rˆ ʋȥÐ`‚ÍÁZ;­‘$©zíXf¢‚03ëA‹bh³šÕ-*ûI[Æ©ÅkY;Mez”kS#í]|—m ^T0"{Ÿð/Ÿ.#5ä7­º^»¡q4R)Ԗ¹Ú€¯pä±Ù§¶VqN ÓÃ\d9}ç9džÚZ*%`ŸX|ÒÜ$b»õ Û-—n"i©¬¥ %´°3ƒéN˜âõ‡o:³ËÉ»Îëjÿ˜»0+¬…–,Á9ÖæIžÊ (úÉfæm S#3Líûо@"W±.“ ˜i‘Y]YžYH†Lº-0n÷_oa†·D™uPŠQ‡æ}ZÂcŸ¥y6Ƽ;Æ*Èbk±³-$ÐiJ¬‘Ž`B¦ÈE#•Xö“klÍ[UfØìhM6 õ½%ƒÐH·“ X>bm6Œqç1¢$ŠáÚry‚™V%ÐÆc¶‡Ç¾ŒžÝvcû¢| 8 -=c̾eXqŽ´ˆà‹Y‰y–ÆØWè™@}È?Õô ”wmq×V³"Ul ôã{Mg`ZÀðRm;—J˲ þ’8ƒ)eQä8§Ñ #eÚmöL»¨p Âñʬ番V€›å¢‰ÇqÂEÍ; MÒ b>}mj§*³4嚨S±–% ¯‹¬ÚÌ[öÌ\ŽįÁ[2‡R¶ešÆÈ#´›ªV€›} ˜UÇaWKÏ 纙ü2‹Kk6xÉ6ïS2ªµ]Çækð=Ò½'uâ=¡eV¥¹ÿ¬pÅ¡ºé ½ÆaÀ‚¦û÷ÜE%$5L‹K.I Óñ(¼…@Ô‡ƒÚ9׫ šú©»gjçqĵÌGfŒpÒ#¿•®]TÛµÛa÷ý2åp›wXàK¨6=2v¸·Sm׶rÛm–o¦¦”Tº¥H–ƶU©#ÜVSÉ»±­>°”¶Õú›$:µ¨ -f߁Ïܘ›ïoM°Ó_â4·lÀÕ­‚u/NK'Ê3tAH˜Ü× lSJXf«LÌFZ¢š+¬øÊÙ-TµÝBëR¸é›¦Æc€ÀèÃ3Ì>&"p»&°oé V -šš¦¸ÆRÉ꺩YEf§4usŒH·~[Ãû“ÌjJÊÈ3KÞk—åÌò:mG1œ1¸†£i"r´7jGْº0KŒz{V­×dzŸ¶±´‘Ù}°ÅÉÆãÄÜõÁä÷Ÿu&oæÌ!O‡o‹ñ´èͯ¡“AÿæÆ,ÆyøÃþV•ÿå7ðwðP˜YÅ÷ü„ëãegb“›ö‰Ö/O¬Í­xÛÇ{Å>´~ù âYp„qaøç/ ÛÅÀ?~¹ZQ@¶ ý/ æ•jaÀ¶élÐÃδó½Ym2ûú«_ž~õwýÏÿþÏ¥ÿüoø}ùÏÿùŸ_æ÷% ?ü~øýïnÃü\ýûºõõqÿ_0;;päh¿cöe žyý¸TöñbGÞz<ûõ×-à³eIâ›säÊ^ 8ÿå¿:)È%åýœ9ìˆø|¥eoXêzA"BWBè ˜—CæJ8¦þÏ3Û2ˆË]à¹ýxÐEÉä›ó*Ù$€†’ˆÇP -a¸´h”È#Ë¢â˜òÍ9*ÐÇÆ¢Š‘%7V¾9ÿqå›óX¾9ÿ‘¥nÃ+…–oÎÛd=wÖC¿\`ásûFxxð´õ`6µì’ìÿZxŸÐ¢wíùŤ¿-zçF‘8·¥&ååcÆûÁp4lå2·3~> - -ÜQœ‚ÓÊ|1j™iþ g*°XÍ64ˆšœÄYŠ±aR暴nFp Ó|f‘]™5™)¿àÄÉìQ¬<ðÔ¥P*¬j&”5 ö€mpÈP¶Œèé0N1¤Ð›/ÖÄ­ bü*„9 í”¯Êýfô[qRE3Rf8Œð(…Ó€‰òõ®ç€=xà…›`ToòÃƛ՞'YVn=˜·Àå«æm‘¦i !Üzô­/ݸ:ôÌ÷Ú⟉Š Ô"ßfœ'sD aØMm°èffg*)sIevËH¦%ƦKQ0n' -Žý2ê@ô0O¿]dÌD~}@éhäöja½î!éBvP¿ùÛÅ+Œ`š•7ð3(U¦¼?Ù%40‰څ¢‡yڅ0è"c&ðëÃEKÍ ˆÇ}áŠÜ[‡9x&â-PÉ{j™ù:KK2cnÑÌI(^åm#Yd^d¤çPb$X(0úzNèó˜€^Š‹¨”%iIZ„O«ï9Ôà«IÝ&…ï'@ *(”}="cö|ýI•ñHÌ ‰G0î"ÉPL'h…Ä#,$‰m\;ÆL€x ˆÀl 5ÞÏ53$u…ë1s`âÍSiN ‰G0î"‰ML®Bê‘Rd5®è„9ÆìžCÚ( ÙþZ¦½;¤µ1$u„+r÷ u`ÒÍÓhNø+-ZóKËmÓ~ñ9I*$‰\!éH0ãŠ$º1j„ÄcX@½fûH¨™ -ôþÒªuí,-[׿l‰¼l=À/Û9:•¥½€z’ie{Hr‘€d§€t,c¤cIŒ`,«b¤ó0Oº†ýcÔD~@:jf@9ê ¤'$⠞‰lóô)‹wÕD#ˆzOBS@5’­¢‘üE ’Ï+=c'XÂ~Vê7½8 5/ õ€@Üi‡5x&jÍÓ¥,ÏÔ"õ+ãÂö›ä¤€ZNš -ˆEH #¤ô‹AžX»EX©Ûî½­¨q­2ÏêÄ]vHƒg¢Õ¶ -ºÕ’’KDÞÀýHÈ% -oæ‚ Äà…7sÃyѸDà \q‹ôª%—ˆ»—΋Ä%Únà©ó‚o‰®xë¼,\"ê»E:ՒƒKDÝÀ™Ç2p‰¦8ô¼¤[¢is§ž~K$ÝÀ±·H¥Z‚o‰¤øü¼Ð[¢é~?/ږhºïÏK»%¢nàÿ[¤ÓJ¢.ÏUøeAdkΎnt"úã¢×Ÿ¾éŒ§Euš‘ùsŸ1ã&»°¹ Ü×S›-Iæ¹½&s! àƒ½­ ¿š]×æV°æÉìÂôìÎ`Ã7Fè¾Hi³%I ÎÀ/§˜åˆ~ *YL'6»QðŠr\Ëèa -zâ:xbf †Éäxš_›/Ý'tø{â2÷¸ØqÿóQPëȢ²y©‹|²Üµ¿¦ÇÄ¿uäqÓ|i‚Ÿ–bG‚’¿p°¦CxâZáÇ©üX/džw#]Á‹çgâèՃ³W¶”HA2P%b‘ÛÉ!¼cÕÎcmC ›©痈WÀ$°ÝÄ.oLhªh»$:ʦ‚WKÎce֏éP ˹•-5¦6AÑt‘1ڌTå»ÁŠ‘Írˆ/ÑÏÀÅ·E¶*$g±T¡Œ¤rê!iÐÖÌeNª‚ùš˜ÞZ_…+R6g#ÓM@$›§‡Z”›kle–¶c³l!SH)gT -B›Ò+¹# ¸^Œn~º)][™¿ùÍ·Aސ8q‰„ÍÌi/.°£ߥÿ~:Š³v*ðéHÁMpf6Ê"~t1®ðÝƋâW,„û'V‡ÚˆU`6&úzêÛçž2HׅO%4=ĺ—žÒW*BU¡¥a§O|&@$ÈQœ#®kúꮧ°ß1>ðã ӄµð6Gwé¾ÕDä‰Fß]e¬ x3º××½Ü6Ê·„ e²…•Ñ -Ëý°oÞ ãòW×nçi8ð‘£,b…GßUhá„tú).ò'ãÛìÀŸå@®47 tþ*_½¬l*æ/éX‰wþ:ߥx¥Z¡oHÁë2qC¢cŒP0tõ‰ø4Ô<‚™87:Ḡ:ùWöÊhþÒÜ,--uiŒ@*Æû «K§ùâe*+q×Ç-õüf4×ÁJ;â¥,a?±ü̞_áRuÃwRZÙá‚? -'Á2ú‹FôOê5&ûQý]FÀe¥Ó¤šþKq×Ç=OÿÌ éÅLãpAÙQÇ9ïÒJLó™1œOqG…ÀéºV"V~Z,YžX$øêJ\cL©O©²(OƒÅ±*ZÃdÓq;O K Õ­‚ÝÿüÒ/ÏÎVÞêû¸pU' ކžÇc·0à †‘ÊÓX£Ù)CîPÏÚK- ‹v¢DâËäÎÊX@¯êâ. 3oPʆ}!hB&„ºx”É6‡ QƒË|¯º+«ßÿåÙéOO¶¾oÝëöÇÝAqŸÛÂèJ3t¦‚ù±<ºq;ÊšL“TÅ֎µãL˜µÏ@«r)‰éšS#Ÿéu _Vm³ kL7)pc^åR2fy¥)ŎܐÓ೙] Ý ?EâW éNÌY $€N“Ä©h¦="à Øs0ð·à3M!z%ÁtÛó½9Yì ]âf¬„Av;1 -ŒB'LÚ2É#˜šY‚#w×iظ'ó[šÄè¤Lè´G¢X:¸æ[ L -i3ÒHãlJÉÖos‚›_âSnÔÉb;×0(‰úã–†óÀî胗Œç¹Îî†ö™õ/³™Ùãì­¤ëUÁ×ØìdNÅSž×$‹/’„ÙbýËV¦Ë|VÛ±_NùՂ$Ë¢1Z„B·«33¦dH„ßrȦn+@«‚>Ú°3ÜƉ³V¡•réݵ(¢NÓ7(›JÎô|äÐàMfˆû-X=dG•QêCBÒ{hߦGÎ䒰 -üEiû‰ëÊ'Óz’¬$Gá%'Õ:OUÉjg Î -}§ªä2m§t×O@³ë2-Yú]ò5Ò81ˆÂ¥a^˜vzœ„¥ê M­Z;²¤V¹éó'ôp2]î~*}jNŠS\…4ÉǪJ&Y 9žpΏþœóü'»¥•D ªÆwCT=›™ b!O>ÿ÷VÈmDF؟ è²emçè¼Ì5& -ϬYÎb›‚;UÂú&…ÐN^JEûå2MñFžÔÈDà0¡ |%F>ɳ€µ«Á% +Έk©ˆ­àk¾ #çÁ_„ˆ Ӑu•tÒWG -\Îö­P+ߪÑóŒ€c/ 1Í5ÓUƒ“IfÂ6 ²jëxJ#aóæiœØlÔ AE†0Ó•$UøÉK§ª“ºc“Ï]dJÆؚÅqè#‡‘u cgÃ׏ž©V1~‘´ÁÚ Çù1t9bÕª2?Ù±£õÍy0^5J楇ÛTùðG¸ ’ÛÇ2×þÀD¬!N"msêÛÑ$ ¯’Q-£]¼´LŽûòSè—O99á—ñÊé¶@Œ‚™±Õx´ŽdKÛyŒ×ïᕠx«¬ÌQeû‘¥Â Xðj#…ƒl´Nî8Žð¶¢(׏Á~:³‘i%UæêÈÄèk -\»6ÜfYŠ¾!Œ7³2x>±ù@í#l«8Ïa„œ¨FeJaüLË¥”)‚8”y ¬?rmoÛ1óP -\5VQ„HR —uŸX5KPÞ1YÃÆHgº3I³@¿Ìԍj„ÿ-¶‘¨pVÞ¬¸f„@Gp¿„YàäºKe[% ^èiúmCŒŠá‘&ës7!²«»c2†M¨¯©0ª6,²L©‘g°ž…Q‘â•XψN–Ig<€kÚâÜúlÌÜÒŽ8Äx€yrÕÖBȘ…žQ5zLìA0ÝáÚ‰)H¬ìL¹‹P6;Á›1Œ* Ú ÜMdo]S êµ:¶e ˲ötXB-̉jÀµ -²•à•Fþ›AxÇ· Õ9Ák3IÉh«FK( K,g–$üÈ,ŒÞIňÖð€Â¥vfÔä­w©ÂKÖ÷°%º½6ÌØð•BÜmÚRÌ«íÝYRߑà†W‹ÓÂ4¬82ß*•ûhÅÞêYm+€IºÐWmìT!t=H÷å Éx >[2Þ ÄÏPQgöY*W˜ð2 qØÜ3˜èݍ©Ï͈]xQ~‚, -w»Ê;tÅë«âýô¢ýîÕùãћÙd™Cî%êY’T42ˆ„³Zzƒš¡ð(E&c#'þò`ٖ -k>´¸³¦p-%òIÌÂÈO§ôtDOô0±31 ^ :3ËâÝ×)8—mÞþ锞Žè±â‰&Ÿn -¸ÂÒex•e+‡ #oÄéL½ -^‡Ø6àvpfg~‡Ç67âxx(}žgçû&\Ï.²ø¸y*8€7á}pš¹)÷ƒs­ üdß¾› x ¨ôޒ„½%β‡—gå™M4*X7F”†€ ¨36Ìç*¶¬Op¦¢FUO­`Šê*°€\ÅaÕ -Ò0M\è)6¤Tđ…![­˜ïçéŠ]£‚&RÀl£‹‡/³¹yÚРùA%0 ‡oV%°T½‚NXjS­ÂÙµÎꞀƒ)o)³6’ ­î©Ä×J%¿Aá Ý1'èù£á‹q85í>:rpÔóÂ_¾þêÇü-³¿½ÌÌßç5ê±ÑñÈrëx<›\µžu†×Ÿõ|Ü£ýš[öדÎ`Ð=îÜ\õ»®è+C‰û­—³a¯uԊ[/¦íû …¿m™ß«®b4ÄÊ:s¥[ƒN÷ÊTÒa3Kž ¯Jþ0º“iÿrJåzÇ*íL-ŒZ<|]PY7^x-Ž?Œ‹þ¤¸ÿm«íÈm†¨LìÏ0p½ã¹¦Ãȍ‡GHð û ÜNÍSÜzðôüxl&ô @§ý ³¬ÎOÎLÉäüñ 3=·{12ú²][2îУÇá˜@˜¯6®.ÇÿÜ¿«¼áËK“Ô¾Ü|ÇÿìÿÞrþYû÷Ç­¸ôöZÝÿÔãUµæp6òªƒ'Ã[äzHï·è_ Øý–;jâmG‚¿EàŸø’ÝY¶Ü¿å¥NÝù±xG¥[¢ü/<¿° •Ù‚S»¶`Ajó$!ŽPdF¤•–ÑRZ|†¡ÍíofϦ̀}ýÕý? Gï†øí½ƒ“IçüÉÙ·­û?š„íêþ³¿-¸Ðý“ÑõÍÈLÐÇýé2Ö;¹êô‡-[Ă­§é¾+ólô÷îOúf»D¤H֝î›FHŽ;“~·„aÅî#¾ Ö^Ð'be§LGï‹î cD,µ—]à–Ÿ¤%ó#lwRÇ=Ÿ_^NŠé·8.KQÜ{:ÌP¿ÛÅ{ȱdw7¸5…ÈhDŠát6~[Œ'Ý«~qaÝï[§†°G./‹7æ÷_õ§òð{ÏgӉQق±‡ýÉÍ óÁ>~ûÙ=/}ûƒ¥ÛÓ¡mTmv´»«ëóìnŸe‚oç/³®}ùmoæÙ¾ö°Ñ>ÕZªp³:ë_ß üf儍,‹áAdį\$z¶ñü{aVá´Vóô-nZÀ;ýa§?ìô‡þSjwŸ1òê D€¹M,ýì›XõÖñð¶NFã¡áõŸdëxÔ}S [‹±A\ Ýbõàˆ¶ˆµ´.ÃÖ=ˆŽŸMV,†ƒ­òÎÚ*?†bëYm–”í†\}Xû¸†QĊâ"ýÌ©#´’Ó°³(Hé1ÿy ìçvã oz]½kbIЛºÓv§S½kþΤ­?t†Ó¢þž GuF{æËu{æÝåeù—xÙ^Ê#·Še¬àÀ–r£ãAgfzòc1Ž;W×Ŏ8)o[™±ŒìV"•iîŽßú㘩–pI“w¶/œËfàžËLtřLñ©XÚÖ(¤£$…Ó¼m™Ê,‘xÞZD9ž¯„̝ÆsG©,ƒOBH¸8šƒ±c>akZ:oÒݞ7_dÚ,ÏDýù÷FA>„8ó>¯c§Yå18þ ð^qŒ ‰•LÚpßvKäFNmÇyt÷NAD"ÉQ‘Žrieön.'S$‰"Èõ ý­}\KNo,ŸÃfRâ9r¯7·.ÝEž+ÖjœÈ,9l›lýš_dËدÍU1È`.«2˜GÑêæ6Ÿ÷m>í çòË&їŸDîžCz;§¶ö`üãì“ÿ7u¯ -ÃY† Ëtfû÷bˆ4;h:XÐ×Ø¿n_¸á°Ïgðüd0z·N¥z8ݴή:½Ñ»åjTyý9ŽÓFۈl³Iñâìôx0/5¦7¹ëäcLé“îÀ©Z“´Ý›N·lâ» ¶’¶{1Ú1 )uHpPÜzôþ¦c˜êqq9­ŸNzÄ-؟o Ot^OºW›îÿ{àÃû̇îú©qyñ4eÁ7¾ehlâ{[Œ­‰O³)¤×¿)ºýÖ!B®×Œ»ß–0ï0sæþ‰˜ûŸ ošéÓûËڌ9­’mÇü“øŸ*»,ZK“ê` -ÒGÃ^€t}&ӝAaV íƋ‹úí¾÷§É¤_›%V ÿò-Rà—_tå¾þêE·ŠJp4éoÿN?7XRÀ;ÞuÌ2fÌՙ¼î½|rÜz9šò+¢DÀÝ¢X!ÑBe-ÒP¹ø“bpÁå™&hôJ¬/8þÛ ¹¤ino^k ©c{HÃ÷*œ|èøò«s,ay8`Äåe’Û£³p]¶»¬N”Ë?ë¼6Êw‡«ˆ$7݅®¦Yžb0‡L¥P˜ä2Uî”M’aH¶ ã6ÂÆa[¬¿‹ žü&Î[Ç¿Qړ12µ{!š’ -_ÃÕڝcÍðaҕ.íE†]:ÌÒPëÉodf0ÇI0©)ã 'YjG‘°Ó€‚ñcnl¥=ùM•PBuCj<å% 66Ӊv“ÂÏÀ£„V -ó×àŒBœ–±‚ûŠaXRۃ½ŠñÇÄÌÛ<ÁØS› œš í>þÎ=N¥EìZ‹,S™;£‘ÇðN/$,#“@Æéû±‡;3K¼C§Í¼mÈ}FéLShè"Fc†µ„QÃÑ#aÏ Åv6åQœÙ)¯Ý¹î”¨hèéœg‘Š Ç942ñ(S•kd3¸Rœ#pŸ$Ä鶥 å6…húHKM‡Rã¸dÂ`L•_UI ylak8òƒíMÏí™)JSJڜ?6NÁp$~8L‡pñı‚뇁€˜6׬Ä(Ñv¤Á¥«ð¦›6Äý´_3©Y‹Ú6ÃLë4³c!hT¹›vŽ;L±â^ -àʔÂã`y”a۔N5º›ab¦¶q|’.Yl\ ZèÔ3º† ’ "eg1´MJ¿Ü²TÇH'-Å&ÔÀÝM'i‚戚“ežø¹YM– h…ˆb•+{voîä,ßÜù"tꇗڗÔ -;ª¨yÈëÍš%ˆëRi‰H€ŠhMÄ)­ \ÀXÀ?â篖ØÃP„[m¹ÅRbйò ‚ìá*·&"X¸f€ }~hU®5¶Ä ÇÀXn‘í¹=üð*âƒî„/·”˜¶P~¹^±w©Œpnˆ’ã$ɓ£5Úfø҈ç‹Ð™A]Ïö"Ì ´ÄT¹´7ÁfpaœBtìÁ“Ò¶’Ù‹$ZæQ¸§xËl¹ÓBñ{ˆeÊNsª´…Ä8,Rø­Rf°>Í"W¿Ù•ÝôSš3 ì2@KßOCZ˜Ï®Œ€j†+\˜ml'¶éN–$³™. EÖ¢`&ù¡Ð°ŠXá -NnÛ¡4ÔB1Àß.AÃ÷rdø¼ÙÑ—6;Ã`³ƒAμpŸv0RñšÁȝÙÊâcèÆGjÎÆaðfÐ`\ՉHš¤–fx);žé²BZ$ž›cÖϧq”  ¸¿¡„Npy> c¤©ÊEf9~lö?œSy–c4 %àV–A "¿½$°ÔîX™ô˜ÛՑª1g*2ßqwI€ú+¦=Ûí;¥ ÷­€YÆFbÃÑK”aó¸¹Æf9à%³z…Ÿ°k¹‰&æF¦.Š¨b†ÌB4è-™Íª¸P u´F‰ƒ·X·bÍB Ȝ),‘=UšZ晚Í,±«4¸n#O"“ÔbA‹.rqI1Ò8FFMK͹PŠÿ®E2y æW;~æ+”ý®} ¡-k‘¸‚¥ÊÏÇÝ«~¯(jT碉àÇWˆìld^0®Ê\ŠèÉhг±%kQqQ‹lyðz€ƒÔmIWkUîÿùz®,m÷žŒ;³Étv Ñzñº¡bf7tàÈÁ6)µeI’ ‡7šW.g˜Égƒã@´_ˆÓÃä“0«I#ɕeu±=ox² mT+œÀþAdÑÀÛ´ß.§¸ai£zà®m6j Õ3,Î6/¦VÍqxS\Ì #¤+6üE-€§À—(MŸ4{:n–Šÿ/Ið¸¤çeF¾P¸=›Êuø%Jµ“/¨qó_·DŒ*—ù빃4Ìû«Ò̲W³-i»«Ñ&u;\RÚ.íƦãùíÒ¨–È«¥Q +d™Ñ·ÊLJ ›ÿBHS»£ä’zþe¶®[(@öKñ‹Žºñÿ4Y"…læ¯W°2¥s{шqþA>MœÊE-šÿ²F„zLmj‚›¥½BÕ!Cmþú%øÇââ²3¾W ›â†å+:J*V èç%)0‰Yҗ€iv‘(% .«œ,’°!-Rž:VhC± ¤6ÓÕ·%Cª$v–’¥Ê´ÖÊ´m‰Ö†W:,îóA!µ¤Y,ú‡M1k5µgWb™ÂñN+žÚ[Ýé¬g¹%goꗙ4¼@ãD“©„HÒÄ tl4s‰>YÆòÙèõ¸30SJCh+F&™NˆyšI㎢’t–[ ‡´Ž³¢õç{éwYüéҟ¿uö¶÷¦+ -yúd`SÐd!£ox>î _CuC@U¿£ª˜}ˋcood«b³+“Nû“iÙöºè)X ñuUfž…Ã4_ûó‡_‡·2-ÚPm‹6¼JDá¥ñ€êïlë;ƒéåàoÿËtã|ôÖÞøªsqZ˜őùæ¡ÅûéE1†NçGof¾ÝütS\/½Ñ»!Ž ˆÉ¹,½s c¿j•*?§ºéìz‚E©öãþ‰õò u63Ňîú®^ú¦3žâ^úÃ7ÙåäØ ±‰ÏÏÄÑ«g¯ÁÓ¿ÎZ;oG㾿ÖUøëìòoÿáJ>Ï Ëì· ·4:r­ ½›<Gݙå©i/¸$Xèáqî²Ëû¿<;ýqÔ+–üüCëÞûëÁÐ82nÜ¿˜MùòÉûÆãÎEó‰Þ”3‚¯‘2‹áÜ}šô3ü™ú«4ïýãprþ¶3žüäx˾í¦C…á‡É’‚$æʹÖLʏ;Oª‹þ°gº-êPʐô¬˜þˆ4©A®°øw·¢³ÃÑpYÓKŒÌòîÕê$ý”“âã !V¢ÞX÷áÛZ+£Îèn}ð›3…ïßÖg PövLrèg×(Ä£ë[Àþ>ëý~ÒÏ6졆Ñԟ©_bݜÁM(·«=ûµ”'—ïnÁüÞN>{Î÷fìUÄqRK{ü®ßƒ“œ5†Ü•¼Œ[%ªmþÏÖvÏ葯¯jq.z+:¨“µ]{_o¡Þ’©lýh}¨Õ¥·¤KO¸´?£©-N‹Ëéóqßh²µº·XéÖHÈÏF³q·8†HåOÆ)÷EC|ñ㩏Æםe<§DÏËþ XYº<3Ââ·bD?—:8íŒ_S#OUgòôa­n.VÚ'+Âz®1w†“›ŽÁØ­ÇËnËÌXÓËáèØ{OFƒÑ¸V/Ëv¤——/]Ó>â ߊÞÝû‡ÇøONvÝl,¯wo$ûC36ƒN·æX†ÅoÍþ½~{ú² -w™Óߊ&n¦ýëþ¯˜UãV5Ìèð·¢×Å´ÓëL;Ÿ 1ùG7æzÎTkM¥iÑ[…äxP=¸“ps2Ý<{æ¯Jà˜çV)DøáÄÿbd˜vèÞËÙ —ÄzŸ´ÓÔ<£óL¦sÿŠ7» ¯%sÛþA}yñà%éB¶ŽàoÅËbðjôÒ6À¶èÅh҇ÆãϒÕ¯$曧“ãéŨ3î=,.;³AèÖðs‚Ê !‰ªó”ŒY ¾éôzždöE×x‡N6¹MçaAŸ8mJû@ï¦ß&c Æ~²¬†|¥!×vÔºä‘4<`Э©™s§ªèϝyˆó ÂtPÑ»)À!COú•MÃÔ/%?°ZߧìM;ƒúuŒˆ65È`~>” -ÏÿZÂ(ˆ§y ADåƒÎ°x5º ¥ñer*—Ç|D¸ÎI6Ë5… ê6ܧÃ^ñþqz{àÆW©š77cWnE k™HsÝæ{j拆ì™ílYÁR$xÞN—bìƒÒ˜ ‹„êv¾¦ðtÄn´L¯E=’EºíëËÛØaŠ‡³q÷ªõj\ô/ §5”êû˜BuÕ²a‰/¾°;OÎ奮æ4®eÈF¡»fºùr “‹¡ç{ »é“þëa¨oÊU¼ãÂ<¯Ä‰%Ñ«X§`grџ^wnês¼òÀ,ö}0n_{Gá²"F÷€Tº*±ªCP”7#Ãë»ÄëSYY|Ük%rTVèðó%/ÍnÍ©zѧ\YìÆEš¬œøâ×íՓÑ¢£‡t>_l^6ƶ¶àÛ5=toÝy íb¡îpA‹œ/45O-²¤—o!ðð¦9\ÁU¸y}ý¦] ÁG²’]C± 'ç];—±¼åïÁb©Sɬ‚)$’¦Æ´¥®d‰PÖp<ÞæUuã/ÀÛ³®Pw<ºYW䬾‘!֕=nbøԚµbß îš‹Îx²jH}7  7¥¥§a¿Ö7¥êýŠCvàÉ\Kj”ö-©Q8lIÕʺNÛ½ÁŽh ݌/G‹ö·ùr£»søCÕhMLw},A¥Ð2i_ôAš\5è“ö°xÝ â —”ê. wY(hö¥álÑEÛ%u°šó™‚“«Žç‹UԂRÅŒ |'`¤8Wr®XZµ¼¿i—Íؼªbãñ|ŒÆRU}½PtIA·e–ƒzV´!=kŠú«¸‰)±²Þ»¤ä覻Šã`‰Éªáǽ™×ãûSÃeÇEëÁìrð·ÿg2¾^£Ï kÄ£©Mjl&Xìr6쮚5¶3#ðÌY³ƒ`¥ÎpÈ!¢Õê2[«}t¯CYëÞÉÈ讽ÖãçO^>ˆó֟ï=={Þ2Qé‘ü^F‘‚tK+õÁk#†²c•8j -BX« ‘-¯{ýa•†”M¯ÖjèV\­Z3ëöŒ’bRƒ³—ÊW²ÑúÙ¤x8êbÄFµbÿ€j†ª}hÒÞqñ¢ÿ¾¼(Æp“BÈ@(²ÒÚ¾žÐmhpтÎ\ik‚1éÁØÖÂàхZåwY£Qã—Ùj5ÞÖ<ü34ÂvÞόöÝ¿æ +kí&ÿßÿýþ¿ÿ×ê%ѾLÌ®Û_ŽÿmÅÜtåºAp ÿÓá›dš -ÇÝݕñâá㣟Nй(@¬„“£Rú´ß.ZÏíO¡•3ƒÖаXàn½Ü' -<8;yú4Ó è-þªþÇóüÓýoüÍ?ýÐùå»ßÇÿøüèø·ã'×Wß¿þýïÿýw÷þé¤ßiOþKòÓï%ÿðýozòߟ©ÿñýéŸÿéÙodznúø‘|–}#”ú‡(š<üëÃ×ßEÿå·?üíþíûîfòÛÉä}óšßþpú÷c*õûéñëßýÏÓßþ7Uœôóß»Ûíz½ð®ÓÞ¿˜¦ó}ú¯O¦ÿú—cõ¯Gß=øÿk{¯ítzäQôþ[‹w0“sN&Ódc“ƒÉ`ŒÉiÏöÅ~šó çêÜí;’:©›N„oÍÌo0ÝTI¥R©¢j³+ÀºŸÍQŸæB¤=ÚVòo­o4éGa"Mëþø›_½ïD=ekŠcÅß õã‘я‡N¶9my»†ìì Aô"FÃÊ%ýÓoù“ëøºúIþžS¿þ®“C‘‘.=u–ñHLß"AŸRƒÅ`>ééü,¯NZÚDْͪƒhg€&øg0O3Sï—!õë†#‰7·Îœü°ŒÌñ”¾A¤æS´YÐü†§Óñ -~Zš3?¥_µÓaûKí(´fÉõ[Lo=š¿/‰RMw€0ÆÅ_7@ã 7ûñÄvªß˜ßËa»óý¾ôûí§wâ8Í;Í«“9MNM@9¿~îo¹³Ð2eƒEv–ß VË<¹önÈ9tJoñT>¢ie,A/ì’Î÷|š¨?µ˜#ÍY/äšhúntû¦õ™4pYz¾–ïk IM®Œ>+Å ÍYÉáìkÊiû8¢#Ôæî¢ñÁ½Ð8&¯yúÃ%"Ô§H+S$ßOY2#š«ãÊn;ÌÑhÆâJÇï Ö{$<ûû ÕdF àU’^ x+Y`†Ðg‡à4¼Wá[súΫN¦‡ˆÜéù)æñu}ÓD=ýgNÿ؋‡Ìx¬×&}“ÆWðó­ÝHTRÉÏôOmyˆú¡@“ôtêC’ ]߬›:Íͤ§¨é¿Ö0µüóÙÃ?›·‘ú19 £#¿¿:Û±µÃ¦˜¨”LE"mœIêд&·dóÞöeŽ5ÇrJQ_`×ϯ‰zá|¹ž¸%èÅhÕ4¨ØA•Œ´eº³·…k‰¥Äw܍ø 2ŠiÀ#&‹9¹ øëÅ%.¾¸ôbìû=]àlpRJÙÄ°àD|1ïÃ#ÂðS´%‘z×eÔ"äH¸ñ]ªÁ9aÐ퍩__u•1—l˯`tvHØÔ23Ȩq°»6:091µø͜üái£šðw]-þ:|æÖMð×lÆj™…–%¸šSM¢^ž™°‰ÓÉRg%4^ô*ö^¶ãÿ›'ãr¸²žò5ûœ? ãç:L¤½]—9šÁ«Ù©yMˆLÚëOú¬•&’=6g®iAXÓöÑޔü;Ï6Éõ¶¹KÔÛZ£hfì3–݇‹ÐYý½DõçW~Ö×%}æÒ/%:é}ÎÆ»û%Eb¦ÙÎÑ`(öën"¾xoCy?JO<¿­Dãmz⾧KTë½uàom éƞ  û®àˆ$W†ý’ˆdLÔw«¦1Np¶`¢Ûé˜\2†÷C‹=yxO!CÎþà¼võB`dçO?@~O5Þ¤ó²î%j£BŠzLŒâ‘\Ê^5<(é’Îîe˜¨]êö)zÊ4ðÍ&~œ†tä’áÕR‰Ä*©­ß_k…U#æ(öøg–t³„£Ðy’ŸÈÆX|Óà'ø¢A?B_Îmȹ0 í(ö#òOç8Nÿ Ñ°pògð1øIýãüK¡WH4iúð#j½Zä‹3’^j@ü› =M8 Ô,I¢a§K¿E‚\ÍÒWccGNNMþiLÖ¨ßvµešÂÔS†h…Ñ Á¥©_8W"ä/ «^„€}š@`Ö,aþBWÿÑP€ÆI|ÎÎ}Ÿ]†$ùŽà®9Æ%4Ñ(µã7­êՒvÕ%šñ¸C¤X@éبáà4¿"89:À ¥ÞÏ'û -ZfÍÙÙ<Äú“¦µ$þö éÀ°öÚúA¡q©³444ˆ½ÓÀvß°cCÜÂ@£(Í¥¦+XADϺòÎù–¤0=FV „‚{”•Ü}‹q ó38ÄÒìXc÷-‰FèUœ´º -}Çc|0ØÒ<=¢—tI†=o#k#š@jb/£Ù€ÍË0´Ð(嘗EÃÉVìÒ¢Cƒ(Ms+XÐo®®iJԛÅ-×ÏëÀ¾øqáçR0±§ò¢DŒÊ¡6Ù~óI(@«V-@ô¤ô*ÞÒ4©å`ÏLWyfbº‹÷ü)nFá:Ž¹%aF™Ò «1Fꚟyã7{˜rì<‡&ÞÔ‚©ßKµ›.I|JÉáß áY3ˆÓþƒñ´—û††G1éÓ ÆIò+Þ3%¿Þúg¤‚; -Y§_€T¸ „¸?ê+ÚÒù?ÿ˜G9Šþ‰m2ts]ª'*"`{°Mùƒ³eH’F}>³²ÉµoÑãÙ¬r‹ u^IgWos°Ï¾"Э2Ÿ,çìþu šÃž.ܒˆmÑ#¬‰Ú:n¿]ç´«¸â u2“ë¦9 ×Ê#ãtpuWšÔï·:=Ò,з ۊÉUÙ ¬ŸÏ=HдGɕë]Í>cØÞšmÖ¸TŽ…îK‘Ì·Ùn~bÐ7iˆÌö2r½7’¹,Z{  ø§¥Bòë3þé2v6ÔP/·Ä×G­ M}úAëÏMqÄNçð¯.“OGio[gO•ùQ5@#„ýqÔ4[ñãñ·¡r+†0„±ð–)ÇO0•Ç€WöÉ\ÒsI:œ–ÆIÍY‡Þ  ­Ìƒºç`[&Àӌ%~|-ä“Ñâh€èjÃÊ2ۂãªJC£úN׏LÛxëˬ ýškKp ÿ»c²úʅ’³¦ GӈÇ4”ƒVg¢ä«ÌNæ@Ë}+ÙÆ._BG‰œm éëìfýŸìNÚÆØHà6Vèî'µ<-}ékèb™C -Áã¸Tx0¸_jp˜ÓÛØí̦ŠkôJÈPÆÎç9Qì8gŒ„~/~ÌÒ³MÐBs¡á5ý£9Ò©œ†$©u§ŽÚHGyfµÞ½¡ùH7§H•û´'׶ªÀ­mY]$ôÑô3ÃÁ[t¦,ÔñCr``Ž°_†û€ öiß1‚yx-2{wÉÕlüî!×u„—€«Êû{˜4ì«þˆ;3Ï *“!ÐXÂPöü3S³ã;á1¿€4lHý€ÂïÖÄ#±†.ß,{Io³mK|™>‰jÝLdß²}r圑ö·'©ÀÌ»=ï•LP©¢·€¬ŽÔ„†¨ë´5b¨ÑuÒ?€dÉu@kI F«òPºÅâm÷Íò| ÿhk¿¸ÚDaõ€cµzʘM¾ü¼ƒëµ&ñ¦ö|fP—À2/Ô¾s‰¨&½u›•}@²€^íÈ÷² -sä"qùïç'´Ô•®gIéNÎ$49Î{^s¸¿ë}³¯Ð‡4ç­¦Éÿ1 Wx€Âóq…üy¡Ex™±ìºN &½ÎDÍKô³›³Ißû#… —‘H•CsgKù—ÔIb¾v6õ‘jÆ…â%2¦rT÷€J}¨‚•Ž0µ‘b ‡ P¸µGAžrK­ƒ lÔ¢Ï÷Nr‘ôºäedj-uú§6Ú¥–¯Z/àoO%±æwKj'¯²›îƒå»î›J(SŒ‡“{\-§Æ1ďÖàJèxÂߟ}¤‚#{¦;?ëx$ þõu  :‰ÝoÅÄ㨠ÐnaôÍ7;|0¬Xc£è»Ï-Ä%ÁU"SOøƒU¤OÓ?_§")2¨Áæб–JôD*¾¨æ´ïÎ|"h_%xoQ¯$Lñf=?&"é36 —5¯ñPk¾ˆöÇ!æ"å É¸Œ&´d€—>yӝ+©ÿ±#P"ÙuycŽú³¹ø¡î0K…$ôl“9ÁÐÁà‘?]¼ùS¿`À£¾Â%m«Î¬ñÐÇß -ÓÜÁ?uß+±MQ!!fß®RrCN` Ó¯í¿óÁˆ&7¥ÐSÉU.éÜàtJ[&D&bÔ¾5GvÉM%ê½fš¯Wp¢­ºÉUØiÏ󸺝7õ#°?l+æOýQöPãGÍàœþÙm|çèƒNm"õs_o£¾ú„  T½mûoépyW¿élômôŽ ôO›Ý7Lò³4@¿¡´h§ç‘4$.f¾Àt› ƀ÷nM)û‡ö3éÖxlD÷|SÒÚø4³c0'K×mx2 ¯µøE†“½‚Æ9 \uÈiB‡Ô+QÚf¦Þ-@mµè¥Oøke¬Cç3±Kü\‰ˆ¾@ \Ã0¥Ê±•Íî^¢^שmY)îh8€‰8Î`;×· ‡+F|Ö92ÓÎћŽçöúeËêz>’¡²ø…5‘Êa~/tY«®‡‚^%¢Ÿ\ûãZdiPVŒxøM(:ª!ëOäÈÌ÷U”sFGr½Þøv>÷GqÏÍr’™8"z\ɦ@úȉõxc%Dr$ª»Ò9m©f´µº0#gÏ„F—™¾úúÓjkõ‘Ȫ9Þã?äª%dN‡6:0ðÿ|\‰§”üÎ؄˜†²oE#Üʘ+z3 áÀ*tŽÐïEË`?µ5a“D݊Gք‘dhFAçC«Il@°—©LpD0ÑS7ÈÊJ4¥w×±ÍèU·/5¡¥îÒoõݦo÷·™D {:ý•0¬Í”³±9…ç!Ý̺jÄQGJ½ŒMçW¢ó’Lö ì@â·û5Î%pçÿ\æG¾ ޙÒv쌧qŽïà ր&^#ˆø"¾F,p©ÏäÙ؇ŒcD h%”µ\@I‰”5K¬Í´å1hfzy&VÛ+dh *úxLΧí<éYÍf¾f£ß øc©\ê·7{…VØk<ò夋ÅÈ+Ïæÿ,LŒu™x¸ßê¨ÿË u—å0B¿»ÇðÏ>Q]{[‘¼lÁ{©÷ôÂë{X.ßK(¢S˜I¦!¦S2²ŠS´„¢dډ²9>uæ÷¸ÿ5’ÀHú)m¶‹d÷ځ•5AšÐl6­‡\cÓgrmuÖ³ín{ Öæœdýä+ƒÉ…õ/¿03DŒ'ëÖR÷\­¹ãX:Åd"`ÉÃÑ-y:!®ò¨O/¥úe€Ž•œ&*ÅŒç.:.Θ¾^ÁY1ï…Ç­Ý_ڞùªYp·Ì ÚÈýďµ#ðþÈרôþ(aS"¾EÆsx—™úŒÞdÙh\ú·ù/3χMZ_@(zÀÕÚnÆÚ ,’ž–ÛŠ±Àr`Y$êé“Éw(ŽcïÀ‚6ë+âä"d ˜ÞÓÐê=Ý_v4ˆÝ(Û„ÌpmÄ`¸¿R¿ñ™5_§Z<5ÀáúúÖ†b2øìZvìüyº.&–ÐLõf&õŒ—“Ô]¨OäfÈÓM;SºAä~A9E¬ì§ýi™ñèϒØÆԟÄÈÐwÁMñ.¨Ø)àÃA8_ÉU}¡vcf3'(Ý0%7 -ŽTþŒÃ7éäg²|!M_Q6”784gÊæ ؀f ØKõSfÍh Ý^ldzÚà¢uËA‡¾m¨ÿNÏpˆÿ'Ê&röÒè>c…åžùõú‚ -7vG+ÛÇôöROÁ¬Y˜³ø™&†ÌÄ)°pð]z ’4Øúq¹W KeîÓï~Žó<§Ef¸ué"λI<¿WjÕù°Ыôݟ‰£då gU¬‚Đ^ÎO/§åvö2[ÂÒp’¬óåötžƒEß.æۗÉ|¹y©íÑÕÌÇí x8?¾à,xi/`<¡üÒôn…jm/Íùñ?óí €¨àÁiþ’ÁA[^Àsæé ç´ÿ¿ÿlk»ÜâH^v3ò;ˆ~óRÿww9…ïfóòðëÿm{IÚ^òÛ4*r£†§Q{ÖÍÿýa§Ü- þŒjñÿ¿õy¹˜Ó£:ýïÿ̧+ô9”Ëv2_·°.ýt¶I3<͚ýô¸ÜËÔWÐ+BŒOçÖ|¯VT°ÜäY2èRï2E÷ -FîÆKrŠ­D·^ý8ÞïÙ«„…ßô JPéé -K_.Œ-8¼a95ޓ÷ /™Úá*Ty·ÝMaGäyz÷Ÿ-Ùð*\°Üæ¶ûDD DÞA ƒ=@Ý· Eàçn½”¬‰ä,;öⒹ5G¬ò/êZx²L}wÔ©Ýv†ŸJÍ0:X êQln -b?ÿP\ªOÿ¸JVþ÷Cºú†e/t%¤Mýº•ï’7Ëú$°dãÿb—1c 'µÜYˆH›úïe3َ—k%u™Hýº ŽÔÖmœæˆu¼¨Ö啛x}Ž_ .¹ýØ«~ÐM?JP²»Pµ!~ð \O-·§nª–ž?ڌ<Ü´£®äÖ%"‚„dºù-1Ù1µ‘‚åDŒäG÷@µà?;À󌖢D'¦ÇÝd|'ìœ9<Š®0óKϔ»úW•”Nêjë»HT}Xb恞s^þ,™Š2‘¡+¼åJ¸~S˜jWǛ,G ¯Ô=%<‰¯ÀB× _ëÏý¥²+þ=’”€Ü÷´¢Ðú H«^OüÓOŠa…Tü”œ(O$HÃñ©¬¬+‚œŒ~ÒNKʕ9ÞÔ1@hy(a‹®™¼Z` ƒwHM16**$¯.p?Þ25îL9àÕ}ê¿»ÿä–xé½È{[溱ÖÌf¶`“±³‡}‚ ´îÏêsÀìRNìlæR&ovà <Ÿ®…ƒ€m"HNDö?çÊ»sø¹øáÜðËã|º(֏Òõ´”öøªêN–/¢KÍá=Â"U3çÂ4ü9ïªÕ°€«# }šùà0³Ñë%è[§s˜"z i@?TýƒÿJ¸îÑõŽüæXsbwØÍe«9ö{vÃO.Oä+äf|1ŸÐƒ°;V?'Ó?Áì*§©¾a„3ʱ “S²¹KA˜|ýVét<†Ou€Å’wØ=5r"ìØNâÜt v+c¦s"Ôî±ï8EðÀÅͪuhêäÚ¤W6û)õá?ðgv ~ÞIs±~ûåï/a¬YÿÀÊl‚XÚè]æ!f±ú–Åì›0ֈÚp<9ߎÂX?ßžWWÈÄbhXÄ'½¥lÁêý5ŒõŒ0VñÛq-„çúJ `r›¦±_—„¦ë ’ŸVŸF»=ßE°vâç£ÆbU¡zaqVÑ9 ú ÖlÎU¥°«­VÀ‘“ w]a!ïñû-AÄÆë¥5tܽµÓ°zvW Ur$)¬Ÿz=«×»îY¬C“ˆ‡Çþï¶.‚5>öù ­Së 6ªŠa…™´Z·!ü-<݈ºÒüΫÂX¿RÆèA») a5‡×¡(‹® —¡L±n¼"ŒÕÓé8ˆ ãCë+±ðk«WE+ŠÊôû„Èt}š·Õ¶œÃ:vd-£¦0Ö¬#¡Ÿü„ áù¬±Ä(¬«Gä؇睢pæ{Ep°v#Ž’ßê„XM<¬Íé57ßùªc« öïùl\êuÇ"X}ÿjF Ä°¦eS?ˆ°"NãM7ÅÿŽUA¬µ°Þ-Šµ8¯¹BXÑAàéYµ¡ñUhº§×bnþÑë ‚X›úíBkí÷k4AXšëéö²ŽfqÆZr¿5ˆxä]ë¾ð*„Jhˆ¸9̾žEˆÜ«8Z±bZk9š¾ú}A¬ýÊ*°¢óæzºïŒÁúpôOk«0֏¿ý¦ ¸yX!„x˜·nE‰||«™Õ"X; Gf¹)b |X_Õñ¾VÍt¡ó\†þ!…uâ6ò6±[›V—>jÈqçZrŒL¡Äja±B41€ûw Ï€÷#ëi§{§°žcfÞ\Õß㞑Ěì8ó\¡h9žQ5DÛ®%Tފ¦ °¦ÎWr1÷ê#±ÆœE+O(ZöžòäqkC©"ŠÐPˆµÇãx²…X<¬Çcb¾£Ù¸ æa=yÿBÔÉ }Ùx~ÝÍGuR³í|<ôq‡•k軐èÓΗsÓ{úëȍÞ.ìÓëƒâ´Näç`tæ=°¿¹Ÿ÷ÔpëÔÓÓ*p½=}Ûß׶Р¤„ü̇¾EŸ\¦êHüéïx g‰výBÂ¥ëNEŸ–ÌۘKüé¤òfŸò‰æÓT^§“œÈÏ9].Ò8‘Oô‡ ï· ó’V[œ¯¡k¢5&…ÚVèRâ¥Í«£èÓÖÛÄ®ú½3Dxaô6ðkEŸþ?÷9ѧ«¦+ùÅ>½&ÚfEDb?cú -{EŸ\žh[‚hoÓí¤Vû¹N­Ë›DŸfåÉ\ôiÁ{uJ-¡vi!‘§Þœ#ón¢g2„yOÍõ¯SŒzš²E®¶g®>ʚì ž“ÇRåÚh)ÇLßKQ¢hô¶†O÷”ÉJ ½¤JîNä'®LsµÐ -M©­…`X¡uø ~G¨-éj -þÓB&cߑ҂B8®&i)x|uéß?­”tvWO‹jÜzðËÂíh -a;Ã^lõÀØm_€œ}Õ„?¡Æ¾|Ÿ zÍ/#›•#{0ëŒEŒL!¬> ´ƒzÂX=®(Vp¦ü9ùz>]d -‰b…gàT ë Çê©AKCøHÖ0¬3NÃbE¶ƒÕÍ£0´ ˜¹f׬Æiââˆ9D~w‰bE¶V`2Û`Àb…³áL·/ŠùäÇ -mQ¬ 4~…§QÛ¤°–ô¢X‘¢ÁbER€ƒ*uÎÒ΃4~ô‰Z cª;Û(yopÙl9R@äUŸæ0È´+²ïy)î£äFÌú;A‹Î«M<2l ª˜3'J\Ž”œÑÕâ¼½sd-ì?ѽaV§lz(ž(¿@toŒì#ÌiÿÐ8¢Ál/ „Ø8Q»Y1EáfÞ¨,å…iÇ4Vë#ó{ߓoñœU@&í¿óôóOצ)[…y9 Ñdñ  -1ÚÝøßè ®{1Ñ"µzJ8csøÔqiȸèÀˆïÛú²e‹gF kÌ󆅏ixÑ.[\ú˜ó»ñˆˆêPtö/É¢áá?ÔðI£_`†zµè áÚ0“Dÿˆ.#½†µWù5Ô034ќ&4I¨×6$è¥| wˆK)ÃC!½$ 9MÉ?B”ê%lOÓ+l½‰¿XæâÒ$e¿·S_ô@åéÒ ý0õ]Én° MzD4zq¥ñZ - 2\)ä•BH¦I®Hæ;ÄiÈ šCC)…„É7È Í†"²Èˆ, ùE>çV˜|«ZTˆ‹nOäÀœ\çõöÉqŽ54?w¬Y/ˑ;[ÔQ¡Á‘¤Í¼yqŽ5l^óO›Žb+™šhš»›¦$(l‹¯Ñ—ُ8»Œ:0ºvZd©,{çX«Ï¡AP1‚;iã?¸wæwš}p†F ahN¥Ð„@!Òãa"ÓõJ7 ôçøµ}‘\PÓÒpZà?=3â¸â & ™¢Ð’B¢á« -ÿ«Êz°¯̐‰× RùbƄ ŒœÍ9+8¶hvr›fÜ1?7ìWÚÙõ²`FaÙ|½,³¬œv¦T -­Ð-zR)Ð&ٗŽÓ;‹SÐð¸a‘³,¹Û•*A)0Ër¥¶½Ê;ö,–Ó9V?=+UjDJt=0&qE^>òôT°ŒA­´¶!kp–qû&©mÜ°†ÙÏ Šbè Õ¶ -·§"hÜæց1Áb -ZGÚȹeš¸¶÷8цÇg+Ýn؞ç³ùWÖí9zºSsæÆoÀˆrB£˜®+xf»’í_µœLôoáíyŽ½>o{&Ûímæ4Ù½ZÍŒ¸”Xê ƒývu^uJmVëä(zbNjYƒ°Æ˜ã‰á}#¿Tѓ´È ÍÐ׃‘‘ŠFÂ×:ï#‹ŒÀFBYÒf‘3k‘ƒ>ïÞ ¦;Ûäæ/±YC®þibÃ\áàSò~æ "î "ª¥4AI"²QòÒº¹oKs§(à‰N¸÷úç7é“Z©(ȳ¢@±_@|†zT§¼ê²„ç(òž¾šyÿò04Øzk¥ÏÎLÿ”ee7ÛNÐ21ÝÁøu+åR:è%E/å›]Ô,"Í(@¯7;‡^ÌfG¿pkƒ+;w§Ðl¸›]Ð8—÷Eæ}UèL‘r:øŽ\þp¤¹|gʦÀÕïELgyG.˜¶¡h¸Ù£R€™e¥Ž֌â¦pážÔw8B3\hJdÌՒ)_/Þ)+â$¢ô41¿Þ¦ãĝ‡œD0 -¼ƒ<¡ âہò)chLˆr\{Žš¿ðÕlÀ âþGZB+д!¥‹|5ûòQzћôˆ”:"ܱ†_Ïc ÜZ»éh,ò´ä;÷MèË(=9yv/²§!{ÞÜáÆÞù¡Ø”ÈžÇâƒ÷ˆ‚XãÍË×Óî¤ÍPÆ¿O{ ˜=*¦æñN>¹s Ws©Ù`‡Œwéñ¤8/ðŽÝ}8C§Àˆl·y˯gÝ® ¼ðªâP&€&æ¥rÑR†‡˜—B»a -T`ó4‡8ÐÊIŸl¤P×ؼm8t„ôèV$¡0' …‘зºý dýÐ8ÆێUn”QOªWM¡ŒØ§„'R(͕‰ßHíGÇ„æ²Ý)Ñ,`Ò¨I51Å4tàk|évZ¯¤ÛiÅ*nÂΔ Müð¨tk°Ò1qoÑïùÐä¥ë‰AAh÷K7v{f›»'H7°rBÒív)Ý.Ý®½$ Ç¥„ò„(.$N²$ LȎi6O~*5wRv6V\<–*/¯EW^uøÝ£¡\æ¼ùÑÄE’B-v|å,´«)çýmB@kªo’¸0â!&tïL¨àîê&²¸¹û=j X9^”¨°‘¤Lñ…Búl Ç³*³›ȗčá+tK …"´g8¹ÉÃÌ]É;Á×ÖG´ŒUǯÕÓãFa»¥Ôù…{9DÏÇÖMÚ¿ŒçB{\ûÿ>Ž7kpån÷€ kÐ#Ú?…98Ö í_ -kâŠRz>JŽ¤°ù><|>rÇ!?äL¢_?%Õ Š"Á,/úôä¤f±©¢úÁð(±,85-JBxíö#Nn~Œ@{tŸcØä2ÙÝDS¤ Ó«‰Ðˆ™L`AmŠv¼D6HÚÄÕÁ{2öxce 2kHvŸñOª”ÍzuL¥lve¶§‚“Ê•lÏD3ÅSãÄü`l.eÔT°É&§'¦öh¢±Ö5¤4@skÃÅÒSœ)€hþÛô‘DG¸šC›2Ï- MdÛw$3}I¶PýCûþ K![\m2ú&71{ÀE½å­ áA­ªÛ;-ÔÖí×Pmi2jkÂ=€|¡Z>yÑÌãå|ø±v]˧â-Ý]Î']ËGJè'”ó‰bEµ|*ÑÒÅËù¤kùTxéâ#å|Òµ|\uðr>éZ>§tñr>éZ>•DéâMå|Òµ|*Tºø„r>é÷TTÕ÷Ãå|W;˜SËÇ–óI×ò‘zš|9'Z¢ÒíSOiâ™÷âÅH¼$cv§åsÅMʊ¶¾%}wâmš¯ 8;ˆ{i®pÛòá‘Â4? änR…M¦åU¯2ç¾AIQÚüoޔó·ð"…RФ³¼”͐ôÊñ)ž!ÏÑ%°o”Þ~û˜«"à°¤]Rc*ÞC³¹©~O‘ØÉðòK°¬¡ÛʸÎ7å—Pùi‚)&·»›Å|ÍäÅf»·:VôäkM®ìŽ›py«+‘dh°ðzšÉ²;±°ό’+»7b¥£¸èÌH¦˜pìW9+%ë£Pq -˜•Aã&x9¯#>×A¶S™ü7YÆäö3Ž'nñT͛Š^U¨ -¯¬°RÞè%gõ´k_›œ¯qØó<*à· ÁÝ{‚^YQuL´ W øõh²ê˜âšÂ‹læý 5…Ùú ÇÇ%^#'^„#­f dÞëß5bÊ ՌŠ¯¡|æ½â´„Y–ëõ\C•ÒšÂÀQ®&GŠ#x)ñÚÓjVlÜD´0æhòŒѸnÙG‰&[¸ª|š¬t»h\±+ÙîX¹IT9^:¿J  L™š{å*¾¶Ã˜=_ñuJ—îñ`ˆX½òi#×À ÿIîóœ{5 -eìÁEN±=(à*òr÷¸€µV1×(«Ú»k•†ç ­èoXl'ïPý#éˆåq"vÞ÷KUëñr%("¥Ï€)IßÏB¯2 3tº*!0¤Ï -¨ŽVÄú/›/HÀ–¢(™Z½+$^–u<àïÑÓòJ÷>»ñÅõ´¿üm¾ ñŠ¿«ä¤»Iõ+㒠öAÜè½áŒ‰cßÀa¹nñ”HŒ‰»«k¤ò(“LJ¼|yžÔ˜®n±ñüÆdYÔ3¼7ä½y4 hÉZÞ:R(S ¤ Ùtxop¿@áqï `J¹¡îïêªtñqï ¬‡ãyoxÊ­òZAÏMÞáAAA²ê X-6ž†V–"›”8¸Št‘U¤%rՕ(ÒîXìQÀ*é -É}ñ9¹hmB_úçx€ÀäB¹ b%õpwfÍsÎXÉ&¡Œí*B%Xº(Wâws‚®@2,*ñS˜(Y⇳òTŽÓNŠ’÷kaÛ×:%Ó?¯ïW…ß)<ùèو&==§2¡yFڞtežD÷™•y‚iן›gWæ=RãqCežd2ìó*ó»ûÁ­¨ 2 ¬È'!>P™ÇMµ¢¤vežŠ—*Yœ÷ìÊ<, )˜Ý_™Ç z)H鼯2ïÊZ‹ Ášº'þÃ#ïi©—7õRTëT’zÙÜ)J½”•§•ûQÕ …r.”%\ʲȲ€B@JªXD¡Pzô„‚²«Ü©Ì{yéëüÄh×ùÕ*¬›HŠµþ`ºJ±Ödƒ·Å]Cíæ#û‘­ÂݏîGMòA™&º;{¥ûQJU‡4¿Í¦d·']uŒÝ¶„M\è)u™i»ÂcMø}ÇbW‰%v_ßw,{כ͋⎌–k—¬‚“¾‘JÖìf|6?Î×{ÓN°Y‹Ýš|B*(kUZ$;~(ñ-Ȕ>§Höûð¤"Yè)E²°níñ"Yå)E²²‹®yv³`î Ú(âWÁޜ¿d´Ò,Àݏí‡÷#¯(OD¦=»(¬#ÌzFQžðÚ<½(ï_'—hÒ&þ-¶çEy¸?¬ËûWŠò„ÜÿBQžˆ?M¡בÒq¡ Âª¾úM‹Urû=OOKÙdì&¥yd”W™RãB¿ŸïVÍæê -å[#*¬T¾£0$uó0ìBg †F¾êš_â÷-zÿ¬`\ªÇ»“a+=‹BjP Ðhå7»nŽ‡iÍì’!‚Úø€¨G?3qûY¢ówP»õt7sŒ'r¾z!•´MS©¤½Û.Ôöôùô¶æšòOq+„ªßEJõÄ à_¡OœÉ¸ewái¥Œ;­1¬Þ_Ó[D½S‰ûy:m©²»™]«ƒ¨'%‹ýÞ*ËòX ëHkÖÄ°ò+ÂBæî¶ã—ÝyÚ¿%¦i#¯íÕ Uvç´ñ°ª¸} -ñb?ŸFsð]¾ÅÊîzRÕo™b¿]½.ŠUWšÿÎÄ°Îeú~µÅ±f>zYQ -k·îðP +Tn¯–l]jâèÅî!…ޣܜW=ß%E =ÆOò=ê0-ùTÔƌŠ—5ÿŒ•ò9+Èïå*·æ-5N”éS·{Nq‘‚dX¾ƒE¼§×AÁ˜ðؚİäò`å’G(÷™íõ„Z®¨n€Qà‹’j¯w›Û®—Vœ‰)SœIÞpyCî \g=éÜAå\%ÓYOt†Wñ›´‚F+Jg¨ »‚bÂËõXáß÷@S½öMv.ޏI4µViW>ñ=…}wúln-ì²h·Ý û”Þgó`aŸñjß<^Ø'TÕ§º·S¼°Oȍ/’àÿHa‡0Ôæe#…O+쥒¹ÌäŽÂ¾{é û„â<ìéù´Â>¡ª>Ž_à9…}BU}J³†n(ìòÒÓ&î û„V˜t?µ°OHåád©>§°O¨ªO%rµþ…}×cúÕH(P÷ö ©­ˆhÏ-ìZC¡T« ûø ä;0ßUØ'ªu>·°ï¢=RØÇuaRaß}D»¹°OºÒëi…}"UßÏ.ìÑ<¹°O(ØÂϼBaŸ à™¸Ï(ì“ ¬<©°OÁyóŒÂ>!r`ªú³ -ûd ʞSØ'TÕ'œ2’{ŠhemDŒhùÛîœïivÝÓgF)®¾:Èl{ý=;1•ã.~Wc:£0ѳ»øI¨ÊHu6ëo"K'nÂ%,•Õ6ò§4B%RŽ-6,ޘ” -&%1,nlë®1!¢aÝÔ§ZjL¹âÂF‚T}ªEä':Ö¸&SÌY8ñL&·6¸—é/íÊcŽ5Éþ7ÿSawt)Ô×ïiþ'*l8ýÿîsí›J¬ LYMŸ¢œ ™|h¶ÿßcë•íìUJÚìH:µ5ÿ“wBBÚ<ÜüÖl¤ûÿ=ÜüOEVáÉôÿS~ÚŸqG—;ÖpJ/ä 5ŧ¥?틬:.”ΣxrïF¥\*&‚mûd3å¸ôA[Úy¯¨¦OI5D#Wï(ž¢¸Ø¢‘Hn¼!I HÔYÈcheýÆjž_Ò¯‚µJèV+±€Qössg}7Õ -°–LºâT+J>?Mqª€¦0‰\:“ Âçb>I½%n=§Y@! E=p… à‰cµglEåªÌ^%XÀ,_i )ªöí|Á¯ö­m¯«}kÛ'^o¡=¥ï3Éi`¼J~˜‰R³.DMáµÁM©¬mÓut^§lKìbYÛóÓê9…1ÌÍη«× JEZ§’RðàS<Ú¬\ -4njî-ƒ½èÖ1H(’é£7zÆ5$ G;|“PèÍȞž75#âUÏʖPÜ,6šöcSA …2çýÃ}ÿTt½§Xë¿;ö£@¾†¼L{Jß?qUjý÷ »Q}ÿ_<£ïŸ‚<›gôýS1 ߏ}ÿTÜÚ(%Õ)÷ôýSIõŅ­ÿnïû§øúvX‚õxµï÷U~DM\ÅÕ¾š¼òØQrվ߇;«}¯ -1½z›`±cY°N›Rè!zåå@€žR`Zv(´Öd‰×çò -©J¼– -v¼¥ú^¨Š^…²ÂrµC™ÅPàSѽðÖR))¤Ò¿øÖ*~¬)©¥âNSÆáʂb×F´–*dPT>/iݳÛ3dP²=•Réß·|ÅünÛ³}S!•hrì+)qøÞ¦1¶UTeñ]x£À½í‰æ)u·)›ø¥hȾ¹µOßMÍ05%ô´ÎónÕê!¼'ÕÝvDoÕºC³™œnj†)×@Ð~gÝ-¶Q™Ô•‚rlùº[0&ååØRu·”».FÉ/ŒÖ aí]^9SI{¡•ÖÌ Ð;˜Ž™kõ÷ÝÈ쟲Ÿ¨Ôh3—>úš&"äÆ|ÎÔ'N=àG¬ŠcåTæ4'M³ó‰{¶¸­éB©^G¤2Ï(^x¼ŒBNž„æ•:Lb…ˆ>Ö_5öÅê¿E±ÂÙ¼{·ètYM·!ŠUŸŸØb­éŒ,VSPÆùÓë°rkäNz¿Ží°èæ] ±ÞZ+@‰ÌïÄÇ) ó q -#Ÿ"X}š7ÏGz„ynùÅyC ¬Y­OköKÓªB½ð9N©'kUªÃb±)Ž5“iÜÄ1€X _°0Ÿ¨ªÐ‹éÝÎe‘÷Ü)‡è{*¼ÞÓ12… -@šC»s†=8Á¬;¾:Ê{h×÷>êS(êñ®2VãíJŠˆÁæՏ1ÞVÐvÝÇãNuÒÕTª›*½‚7]ŀ‰_3ËJùœeUuΘ° -:ôíßëWZµ¥*üŽ.‰ºD¹Ð2kˆògYùR!ÅÁk­l³s4¹FBú«’_ h¼SæA¢ÉV)Ÿ&7ú(Ñd[ -ÝF´’ç[ÚU³ÚHíΒD¥õˆrõ7ò…jŠê¥Râ”$*­GðCßR’¨´‘M†½«$Qi="éî¾»$‘Ã/VèUÎím%‰JëÑî/IdI*-ATÜJ¯[K•Ö#²–ô]%‰"cºªGäÄ=É]Ïëñf…*åMêiVˆÏæ_lVxí~øWšªäšÔ=§Y!U±"­¶<Þ¬Põϛ€¾øôf…×n»¥Y¡`Šâó›ªõ÷|¤Y!Çý‡åE%¹Šeñn‡Ò…174<”vIÈgÛ)lx¨ìV«‡b“{Æ­Vb óº·á¡t·C!'ä] ¥]H"ûí …YPúV«;*`èg4<”N7a]6<”-({’X²Û!}Þ<ÜðPzr|/ÇÝ 9#¹êvÈñu>ÒðPzJ‚É°÷4<,Ž”¼¾]9mWïÒþ´‡Jß[ÆFØlx(yò¥Ècí ¥½Éª›.ϒhx(m §]ßÑðP¨j“Ý‚÷s¯á¡4)÷ÃM ¥¡ Á3JÇcX÷à ¥‹yUü"Ù{ -(¡X·CÜZƒRã¼ýèàv;ĕÛ;ªcLÃCùZܧ4<”îvÈ2ôƒ ¥S¼1åö±†‡l™G²Î”ÛJ.®JӐTnŸÐðPbϝVn…¡où†‡ÒPêц‡Êû>Ôð"¸n.%¹jx(Qr!ŸÚ;¿µá¡´šg󔆇bÇzS y_™]Ÿ HÊíG¹†‡Ò±k^ZÂý ¹ç”÷¨ê‚ ¥¡ày65<ƒ¢´ý®Â†‡^1qr[‹Â«"ÙÇr<âWÝÉÀÊ2õZ’½Wnx(­üˆqÚÍ ¥»ª¾nŠjxø¨wPaÃC%µ¸Ohx(ÝíPusŸÂ»Jƒù¢óºááý¥úX·CÍC ¯]Ðx·CFBß»醇ÒÙcücíÒIT|ÔÝ Öëv(J´[>àëäíöÂ+1Û󁆇¬êvxŠ"¯á¡$[àÍOkx(­1R&îã ¥‹téCúᆇÜiò»^ëiŠoáâ6<W(ÍFæ.… •i67<ÄWó:$\±rGÃCé³B<‰üƆ‡Òg¥ ØŽ‹®”îVi§‘ðoÄú%o‡äŸžàkq°t¾?¯ˆ’ÃR §±áŸèû¯Ò']Y.çÌ´íXÚ8앹!éÇZ-Á2ŸãÑuúUƒc¦ 6÷>´{{å'߂U]jm9š·9 [µ}ÚÛ{ÜÇß]÷ƒ_ “Áº1꓇¤#·øHh—¤Oý=ž¹Á§QüÍçtåÊ¡ê=¬:°‡ßkóLe¢m+ڎjo)ë%««FlV+ûZ¿õù‡÷Ð4Ì´­„Ñ“þ{­W‹«Ð:ÒÞÍc†íaè?¼ã[߇ºõÓk݆¬ïí§—Ï/¿šžg÷=ÑRU›FõZSm3âj×âÐ4GÜú¸ƒH“âgZpd}ºêñ8 -Ž§@+Ò |““wÒûd*?ëæw»µes—‚¯tޟýxúÞÁ|A © -ˆNÉk¸[Ó¯=4»™™°Ýæeä|3%⥂½9À„Ï:´6n­Ztº¨ÀÒ0ÖÏ?5Ín=ªÝí„ÎåY\4ë™zk[ t¹ªúbÙ{>`B\y‹*$Õ ¢^shç3Ò/ð¹ã*ô{Þ6“ûLaõ{¬—›qB”ˆúÞR0w0Ý%æmÔb4Õ/hr™c/2DÀÉQ¹•Jf\õt:fÙ÷ˆ ¦v€š.Ù_Ôà4¯ü°°²3ˆ‡Kê#šWb³C (¶ZCs¦ÙÎÁO`Οk,%¶æÔÛ9"ÓÊa?`~ÃðLÊe»×¦§?9 Èç hâ߂?ý&T‹ dO~þ|·ÂF£ÇZï¾IÙè_v"ã*ܜܶ¼]C.ŸwZô¿›Ìtu:ìQ¿ Ž®ï4¥œáÔrlw‚ïfìÁX›zhèg)+û̕ì6bôƒ<ƒ°ˆ#´jó¿4m>Œ@xìVÎléuÌ|gf_†¡ˆìÀ6ežY1@Ù}È¿³Sj“÷Ã+6Μ¯äƒU–fw¬¡Âñ3nb†8Dîðat2}ž¤ÄP$ Ð ‚Vù>+vȨyè³áD?rkƒ›3ø³ç¶—k+7ømÝlŽj"øÔ 0Ø6{§Äf„¡ŠøºÖ´}х[}ƒˆd<¼ -Tx8|áZ/­ú2r9†¸M ÁhîIW¸#ÆBà+Èqý¼žÎÏÞՔÔh]ÉÙÔ]슸Œë¡†â¥ÎØÃÌ~ Мƒ[L*VÄóOvŠç'm‡sRÊÁ§ž“bÚÉÀ…lϼ ,Ùdì¦?Í<µ¾«*iEŠ)ø³m§~¾ê9èO'3œ 8ôJQj8«™ߞ×@íCc¯è•oÔlVÚçîdÀÏƟԯ¨$×M3#™>¤ä”ØÈX -æO[¼mcF4¥Xæámp@‘ -\H®Öu]LÓFß©ß;0û¢z†Úiƒs%FéïRøÄxw€;ßې&. £Æmtì%ƒŽÄPï2n’~Èø°^ Ü-Fê»ñÁD}·z5ƒ¥šxÝbƍI“ NÝÂ6·Lcp4™ ð1Ãçîúr ¤Ò[ lmFí#M”–æðºñ‡ú -Ÿu¸×…صi«wö ©ÿ“­úq¢­~ƒc͓å÷ú†–F´‹"V“õœz:H*5}5JPÃ7”&à蠈w›9Ý×G4h$E†¹¾íõ¯¡€Èä?’—ý•{gŠëâÄé0­”ŘAOށAŽÜµøâ1”(ÜÄՓÅèbL)ϑPiΚ…AJEÁ9↉àùz²6ꁉuteç­»ìö”˜ˆ_‘{Xۀ²†ØÁa(!‚ÁRSh" CÇB«- ÃÄëeo`‰!1)A…ø›&š#—®M˜{r¶ÜWä=Pä­?õ$³ú>oØ÷îç4\ßÍià°Ý ƒä4½+§áĸ—ÓpbÜßû"\‚D'ãŠ[±}{5 h9¢ÝèˆbwJc ³ñálîZ#»"¢{Ÿ„Š¼£‹?ŽG¤1 [R0 D´['Ân2Aƒ ¥CLˆ)„²CZ­OQ0\§†é΍ŠÒ&–=E‰!=Ñs‰':%ˆaÂÏ¥;E§I {JK&iÞT$:M®dǙÇþìŸCöO·6”*’!žùßÚr9 n›¸Np{ª­…`šä]µyjË©-£ك0B4#m¤ÝÈ\“FÙå.3²½qÇ 1Ò®¹Ïm<× —ÃiY,¢ÈAJ¹wV¯6ôsÒwæ0ØìèOh¡¨OsxÁIÎHçú¼ ?g¦þ ¬”eŽþ,!UüåO#t¦<5ÀüfݑŽÜ$ßFŽ§Å±ÑC-šp#:õ6aXð 'IÒ"àZދwa´„!tǚû$E›léFÜØÏÆYGê·ø³„z ˜g¨9øºD»²²éÒԆޠçƒ\çdðÆxN¿Ì¤ÿs²wBR}YÞкôQ,SýBç zkêK¹à7XY{tNsô'wÚí9©•ëfÆÍiAO]F_hFc­ÛH4£6àp­koKÐ8hâaGSkƒžFªpt¦\¥ÒQÉo¤]¤<*X¬¤é´kNs#|ôEž„¿?3 -à2vkjځÙcýn#€Æ­DF¤cÐx™­èÙ·0–q¥sïÐÛÔ²‘TJwóNÒ]•žV¼Ô§uÃE}ºôh·º2ÆñNƒse\ ¸¾-Òàvãd׆ìW×p]r?^ªð‘±Í8Ô»¸;vžý1<Œs`ͨ¥NÁ}†gF5¹¶-L‰ÏéO)]Ì«klÀ„IuO1R:,óŠö%Ýo—üÛ7};é“Ó¹RèÂ=/õ)=^Ò컩÷š›8•T½O¤×¯ÓDµþ­ÏL¬ñò(¡Z`Ö;xÞûHDÊ/bè•ö+ÞäT„D»Ï¯x“S‘Ÿj¥Ü¯x“S훻üŠ79Qüæ.¿"@sú?QÕ?þ Ûû‚þ±W/ëù±r\.–ۋ꟰ê{"ït6¶³qœÏëóÿ9§wÓËf¾=¿„^ì‰Z*ŸxÓóén6±PÁ?#­ÔL($çx&#&Ó?Áì*§©¾Ó?ŽNó[’:̾~€pèׁçê›Ú2œõÔQSr' ü³CúkÈh¹`€Å]Lšôü˜¼dÌåR‹·‘Ÿ&8ªgaü-ÓJΫqûi±ç]›lÖâö³c‡\:TX”“€¹Ú"î@A8ëÔÆȇ‡ñÐäLµ6°«-Æx~]P›¿^?à ?àƒtëÏH?éÌx,D™Ò@®Mmÿ/+ (Ÿè rJ¬º!"ʆCñƒœÅTmx‘ ðvŒ%ƒ †© -êlʂG¬8ölÞå4PÛßf¤}€­öwA[ ý©4"ʆCÉÄ¿)"ʆ/aþ_‹ˆ²ðhOÈ¿eá0”ô¯EDÙp(}~D” ‡ÂÙükQ6Šï›§GDÙp(<Èÿµˆ(…¢ˆ¶ÚjãG×@ ÑKè -X`~cuµq¹Žª­Û¯o(Xƒð˜Ð2puh$Ô¢½wH±6O9ÒȾ_¤BSÛSoV:™Äc`“I=D¯û9@Ñi¦D'Ôa0ÑÙÙÙÈ$}\ÝGKDgÊfAV¬«‰äíËöÙFjKKȌr€LË„êá]ôQä±|ÐhüGVÎR2­Omž”E9.@À’jLÿ4Y%ׯ[ÂiøçŒ ç`Ԍσ RF)m¤1@êÏÎlÃϬEj)*ºð@¢}š<ÐtâvJ#†)I1ùm¸Ðb€ÌXU›0ËfÃÙÎȤÝͯ a4n^ßY2ë-3ð2±Ã/¾Ã…4ó­xr(^Å0φãó:†iÊÚ<¹Ä†•î˜Vœp«µŒ…[ ÁŽ›nõiÔoImZ"^›´cœD;ëD‰‡*²d;I ÀñHW·/£ Ò »E»Óß5ôw£}YٚYë1'E‹ŠQî#™ðÙU ‰32†øî ¤:mlì  á…ÏX‡–R÷ ϵ'HE®=űT瞡Ã'rKQDèâDÃáÝA° -ìÄRÅ©ŒŸU2Ž åP³2t °R …hYáýüh@9ú<+¤rÊüÀ:Yîü@dž¬Ï (dÊ+¨Í²AP™¬×0Pk®G&‚Êè­Eíæ‰4Bö›BÛÛÓ<›amèP4óÐDSJ è{´ÊMdù`¸{kg€S£ƒ¬xÁ‰(¤&LÔt"§×l.ifz˜4¦ÞÑ}À^Í&FêUâÏihwB±ûx¨”Ó€ÚbxŒÓJ @œÓ$a ⎇9MÿkxŒÓ[£§)†Q2[d¹€fÁ㴁ßöȊ@wº]ä4¥0²¥Wù}+ €Nÿ…š bA(<ˆM˜špd†„ìŠÕSvïK ‚ò¹=¶"Pᕦ&yÞHM$g%nÛ#Wƒð•œHU`äbU—Ì ŽQ»?¤sž³­Á`Lo “…ÙÌҒãÄÞ)ÎZ¼AÐR€?Ž©Öo}ˆ-¦ÖwKM\tÊM8 _Jp³‹B@tNcùþg®Çÿüj$-ê%®ÉönCƒ XÕSO:f¶Ó—q¶”êÈâÒáÓ~*è€ä°Ä‹<Tx¨¨;)òPPágÃ)ò`|®E#þ xf‡E3þ dfª.ŠxÕÇضóÐìS æ™/ÕH —ö¼aË^?ðÀ+€LpàÀæ‚2 ˆ$2ô ÜNÊ8UáŸ_8p°ã q¿(s0~ˆ²\,婼 ¹ïËN…CcyÊýEÁl„àº1Gfnx$cÎ.£Õy´nÅëbñ°‚P“ÀDGÓ®ZM1Η1GDnŽÎqº1]ƒü*½³ ïùS;Ïö»E¢vÑ.3ÝÙ'¬ª©;Y6võ/ƒ8åêè ܌¯ÓÃõu¦c~†eZV*ú•‚"©e§7@ Ÿô¡ÛrҎ«ŠGÀ¸EËÍ|ò2áüÙ%Í(¢Õï2e?]óɉG?]&¸ØuãÒ+-íÅüóÒ³éú±|؏9³ÿðcÎ},¨æÖ+®}ðO§e b£NôüäÂ_-/<ð;@ü‹5;©´9`$ˆL¹IÇ:ϯc> ù —Ú÷G—rÞû•zït%"™vƒ7ñNW¢êŸÛ¼‰wºQê ÞÄ;]‰Èý Ð›¸ƒ¡Ð0ôŽæÎaf;Ýàë7ðUm~¾ìÑ+Þar¾XnKãÿÎÁqã|!ÿãÿÿïò€*ü¯ãÅ ¿,MTÿòÓÝÖøR‚µ6C{âxN/§çån;>þ÷%„¾k—K|ú%ôB½~1€Á8†à]ð½X‡Î{r·[ÃG5¢õ’ùŸýîx~Ay©ï^Rµš‚›ËÓr²žs'?TýãxIÀÚÿóJìáç -üÇa 8ÍüÏævy=p††ònqŸ–›—Êq¼]Ì_¾ €–€Ûâø6ÑËíÿªƒiC$Áÿ ÿ*€Oà»ÿ¼8/å—^ßñ2S‡™Ûë³y_¬ž€ü°Û<^/ûw‰ùÛå±üN'ü†ú…Ó°ùœŽö󣉂åK.Ããrñ{NwëËFl))‚*žtñ¸½n ˆ/àõù<ä,m—ßãÅèd ºœ^_#Wr}ÄòCR¹Ü^œæn·ÌÆç´yÉ! \~˜°ÛióùA8ô˜š*|ÿÌü|ñ£`ÞµÍx½¾}æ³–Óí&fèeç?ÂÅõÑ \èo¯ÇæuûœÌn? ¸--ãrm.öO -”’Ù—æ?çáçøü«dÒ¥$%G€XA{Ò -ß·Ïñb^?Ž—k(V§ñÿš¿Œ·ÛÝy|žïÁ£—Åq~:ïŽó—Óïî?ðø#æ@HU€Õøÿƒõè -endstream endobj 6 0 obj [5 0 R] endobj 23 0 obj <> endobj xref -0 24 -0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000046800 00000 n -0000000000 00000 f -0000048544 00000 n -0000176906 00000 n -0000046851 00000 n -0000047214 00000 n -0000049206 00000 n -0000048840 00000 n -0000049019 00000 n -0000048727 00000 n -0000047479 00000 n -0000047982 00000 n -0000048030 00000 n -0000048611 00000 n -0000048642 00000 n -0000049279 00000 n -0000049475 00000 n -0000050711 00000 n -0000071518 00000 n -0000137107 00000 n -0000176929 00000 n -trailer -<]>> -startxref -177122 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg b/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg deleted file mode 100644 index 88b7d364..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_orange.ai b/net.mograsim.plugin.branding/raw_files/icon_orange.ai deleted file mode 100644 index 948fe6a9..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_orange.ai +++ /dev/null @@ -1,1448 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R 6 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_orange - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T16:34:14+02:00 - 2019-06-22T16:35:26+02:00 - 2019-06-22T16:35:26+02:00 - - - - 220 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7N+WH5gfpWFdG1ST/clC v+jzMd50HY/5aj7xv45oOx+1PFHhzPrHI9/7XqfaDsXwT42MfuzzH80/qP2PQ837yzsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLLSrCa/vZBFbQLydu58AB3 J6AZVmzRxQM5GgG/T6eeaYhAXIvFv+Vsa5/in9K1P6O/uv0bX4PRr/yc78vHb7O2cd/LeXx/E/g/ m+X6/P8AQ+gf6G8P5bwv8pz4ut/q8v07sIgmmgmjnhcxzRMHjkU0ZWU1BBHcHNNGRibHMPQzgJAg iwXvf5eeeofMdj9XuWCavbKPXTYeovT1UH/Eh2P0Z3PZXaQ1Eal/eDn5+b5p232OdLPij/dS5eXk f0MvzbOidirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i4gtoJLieRY oYlLySMaKqjcknIzkIgk7AMoQlOQjEWS8C/MDzzceZL/ANKEtHpNu3+jQ9ObdPVcfzHt4D6c4XtT tI6idD+7HL9b6b2L2RHSQs75Zcz3eQ/G/wAmJ5qnduxVE6bqV7pl9DfWUpiuYG5RuPxB8QRsRluH NLHISiaIadRghmgYTFxL6F8meb7LzLpYuIqR3kVFvLau6PTqO/Bv2Tne9n66OohY+ocx+Oj5d2r2 ZPSZOE7xP0nv/b3p/me6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVxIAJJ oBuScVeJfmb+YDaxO2kabJTSoW/fSKf791PiOqL28Tv4ZxnbHaninw4H0D7f2PofYHYvgR8XIP3h 5f0R+v8As73n+aF6d2KuxV2Kpn5d8w6hoOqRahZNR02kiJPCRD1RqdjmTpNVPBMTj/a4eu0UNTjO Of8AYe99EeXfMGn69pcWoWLVR9pIzTlG46ow8Rnf6XVQzwE4/wBj5ZrtFk02Q458/vHeEyzJcR2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvKPzU/MAky+X9KloN01G4Q9fGFSP+H+ 7xzlu2u1OeLGf6x/R+v5PbezvYvLPlH9Uf779Xz7nlOcu9o7FXYq7FXYq7FWQeTPN955a1QXEdZL OWi3ltXZ08R25L2P0Zn9n6+WnnY+k8x+Orq+1ezIavHwnaQ+k937H0Jpuo2WpWMN9ZSia2nXlG4+ 4g+BB2IzvsOWOSIlE2C+X58E8UzCYqQROWNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVeffmf5/wD0TA2j6ZLTU5l/fyr1gRh28HYHbwG/hmg7Y7T8IeHA+s8/L9r1Hs/2L458XIP3Y5D+ cf1D7fm8TJJNTuT1Occ+hOwK7FXYq7FXYq7FXYqzD8vPPUvly++r3TF9IuWHrp19Jjt6qj/iQHUZ t+yu0jp5VL+7PPy83Rdt9jjVQ4o/3seXn5fqe9QzRTwpNC4kilUPHIpqrKwqCD753MZCQsci+aTg YkgiiF+Fi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWI/mF54h8uaf6NuwfV7lT9Xj6+mvT1 WHgD0B6n6c1XanaQ08KH94eXl5u87E7IOqncv7qPPz8ngc88080k8ztJNKxeSRjVmZjUkk9znCyk ZGzzL6ZCAiAAKAWZFk7FXYq7FXYq7FXYq7FXYq9E/LD8wP0XMujanJ/uNlb/AEaZjtC7Hof8hj9x +nOg7H7U8I+HM+g8vL9jy3tB2L4w8bGP3g5j+cP1j7XtOdi+fOxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KpD5x822XlrSjdTUkupKraW1d3f8A5pX9o5g6/XR08OI/UeQ73Zdl9mz1eXhG0R9R7h+v ufPWp6le6nfzX17KZrqduUjn7gAOwA2Azgc2aWSRlI3IvqWn08MMBCAqIQuVNzsVdirsVdirsVdi rsVdirsVdir1r8rPzB9QReX9Vk+MUTT7hj1A6QsfH+U/R4Z1XYval1iyH+qf0fq+TxHtF2LV58Q2 /iH++/X83qedO8Y7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql3mDXbDQ9Lm1G9akUeyoPtO5+yi+5zH 1WpjhgZy5BytFo56jIMcOZ+wd7538x+YdQ1/VZNQvW+JvhiiH2Y4wfhRfYVzgNXqp55mcv7H1TQ6 GGmxDHD4+Z70rzFcx2KuxV2KuxV2KuxV2KuxV2KuxV2KtglSCDQjcEdQcKkPb/yz8/jWrddK1KSm rQL+7kb/AHei9/8AXH7Xj18c7PsjtTxh4cz6x9v7Xzvt/sX8vLxcY/dH/Yn9Xd8u5nub15l2KuxV 2KuxV2KuxV2KuxV2KuxV2KsE/Of/AJRBP+YuL/iL5o/aD/F/84fpel9lf8aP9Q/eHhucU+iuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxVVtrm4tbiO5t5GiniYPFIhoysNwQcnCZiQQaIYZMcZxMZCwXv vkDzxb+ZdP4TFY9VtwPrUI2DDoJEH8p7+B+jO67M7RGohR+sc/1h8y7a7IlpJ2N8cuR/QfxuyvNo 6V2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKsx2AA7nEmkgWlfl/zFY67Fdz2NWt7W5a1WXtIURGLr/k 1eg+/MXS6uOcSMeUZV7+Tma3Qz0xjGf1SjxV3WTt9jGfzn/5RBP+YuL/AIi+a32g/wAX/wA4fpdx 7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmkatfaTqEN/YyGO4haqnsR3 Vh3U9CMuwZ5YpicTRDRqdNDPjMJi4l9C+UPNdj5k0pbuCiTpRbu3r8Ub0/4if2TnfaHWx1EOIc+o 7ny3tPs6eky8Evp6HvH6+9PMzXXOxV2KuxV2KuxV2KuxV5J+af5g+q0ugaTL+6Wq6hcoftHvEpHb +b7vHOU7a7Uu8WM7fxH9H63uPZ3sXhrPlG/8I/T+r5p1+SX/ACit3/zHSf8AJmLM32d/uD/XP3Rd f7Wf4zH/AIWP91JW/Of/AJRBP+YuL/iL5L2g/wAX/wA4fpYeyv8AjR/qH7w8Nzin0V2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2Kpt5Y8y6h5e1WO/szUD4Z4CfhkjPVW/gexzL0erngmJx+I73B7 Q0ENViMJ/A9xfQ+g65Ya3pkWo2L8oZR8Sn7SOPtI47MM7/TamGaAnHkXy3WaSenyHHMbj7fMJhl7 iuxV2KuxV2KuxV51+aH5gfo2J9F0uX/cjKKXU6neFGH2VI6Ow+4e+c/2z2p4Y8OB9Z5nu/a9X7Pd i+KRmyj0DkP5x/V97xfOOe/e2fkl/wAord/8x0n/ACZizs/Z3+4P9c/dF899rP8AGY/8LH+6krfn P/yiCf8AMXF/xF8l7Qf4v/nD9LD2V/xo/wBQ/eHhucU+iuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2Ksk8j+crvyzqYkFZNPnIW8tx3HZ1/wApfx6Zsezu0Jaed84HmPx1dT2v2VHV465TH0n9 HuL6Csb60v7OK8tJBNbTqHikXoQc73HkjOIlE2C+X5sMsczCYqQV8m1uxV2KuxVh35iee4vLtl9V tGD6vcr+5XqIkO3qsP8AiI75qO1e0hp48Mf7w/Z5u+7D7HOqnxS/uo8/Py/W8FlllmleWVzJLISz uxJZmJqSSepOcPKRJs830qMREUNgFuRZPbPyS/5RW7/5jpP+TMWdn7O/3B/rn7ovnvtZ/jMf+Fj/ AHUlb85/+UQT/mLi/wCIvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYqzX8uPPknl+8+pXrFtHuG+PqfRc7eovt/MPp+e57J7TOCXDL+7P2ef63n+3e xhqYccP72P2ju/U92jkSSNZI2DxuAyOpqCCKgg524IIsPm0okGjzXYUOxVj3nXzhZ+WtLM70kvZq rZ21ftMOrHwVa7/dmB2hr46eFneR5B2nZXZc9Xk4RtAfUfx1L571HULzUb2a9vJDNczsXkkPcn9Q HYZwOXLLJIykbJfUcGCGKAhAVEIfK212KvbPyS/5RW7/AOY6T/kzFnZ+zv8AcH+ufui+e+1n+Mx/ 4WP91JW/Of8A5RBP+YuL/iL5L2g/xf8Azh+lh7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdi rsVdirLrbyNPqPkmPXtPDSXUEkq3VuNy8anZkH8y9x3Hv120OzTk03iw+oE2PJ0eTtcYtYcGTaJA o9x8/exHNS7x2KuxV2KuxV2KvSfyu/MD6jJHoWqyf6FIeNlOx2idj9hj/IxPXt8unR9jdqcBGKZ9 PQ93l7nkvaHsXxAc2IesfUO/z9/3vZM654J2KvnT8wb67u/N+pm4kMnoTPBCD0WONiFUDPPu1Mkp aidnka+D6r2JhjDSw4RVxBPvLHc17tXYq7FXtn5Jf8ord/8AMdJ/yZizs/Z3+4P9c/dF899rP8Zj /wALH+6krfnP/wAogn/MXF/xF8l7Qf4v/nD9LD2V/wAaP9Q/eHhucU+iuxV2KuxV2KuxV2KuxV2K uxV2KuxV7v8Ak/8A8oZH/wAZ5f1jO47B/wAWHvL5t7T/AONn+qGJfmj+X31KSTXdKi/0NzyvbdR/ dMT/AHigfsHuOx9umq7Z7L4CcuMenqO7z9zu/Z7trxAMOU+sfSe/y9/3+/nzXOceudirsVdirsVd ir2H8q/PzXix6BqblrpFpYztv6iKK+mx/mUDY9x79et7F7T46xT+r+E9/k8J7RdjeHefGPT/ABDu 8/j+PLpmdI8g+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f/ ADHSf8mYs7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf8RfJe0H+L/5w/Sw9lf8AGj/U P3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8AGeX9YzuOwf8AFh7y+be0/wDj Z/qhmskaSI0cih0cFXRhUEHYgg5uCARRefBINjm8J/MfyE/l+7+vWSltHuGoncwud/TY+H8p+j58 R2t2YcEuKP8Adn7PL9T6R2F2yNTHgn/ex/2Q7/1sJzTPQuxV2KuxV2Ksm/LX/lONK/4yP/yafNl2 R/jMPf8AoLqO3v8AE8nuH3h9D5375Y+bfO3/ACl+sf8AMXL/AMSOed9o/wCMT/rF9a7J/wAVx/1B 9ySZhOwdirsVe2fkl/yit3/zHSf8mYs7P2d/uD/XP3RfPfaz/GY/8LH+6krfnP8A8ogn/MXF/wAR fJe0H+L/AOcP0sPZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/k//wAoZH/xnl/W M7jsH/Fh7y+be0/+Nn+qGbZuXnlC+sbW+tJbO7jE1tOpSWNuhByGTHGcTGQsFsw5pY5icTUhyfPv njybd+WtTMe8mnzktZ3B7jujf5S/j1zgu0ez5aedc4HkX1DsjtWOrx3ymPqH6fcWN5rnbOxV2Kux Vk35a/8AKcaV/wAZH/5NPmy7I/xmHv8A0F1Hb3+J5PcPvD6Hzv3yx82+dv8AlL9Y/wCYuX/iRzzv tH/GJ/1i+tdk/wCK4/6g+5JMwnYOxV2KvbPyS/5RW7/5jpP+TMWdn7O/3B/rn7ovnvtZ/jMf+Fj/ AHUlb85/+UQT/mLi/wCIvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FX Yq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3LzzsVQGu6HYa3pk2nXycoZRsw+0jj7Lq ezLlGp00M0DCXIuVo9XPT5Bkgdx9vkXzv5n8tah5e1WSwuxUfagnAoskddmH8R2OcBrNJPBMxl8D 3h9S7P18NViE4fEdxSnMRznYq7FWTflr/wApxpX/ABkf/k0+bLsj/GYe/wDQXUdvf4nk9w+8PofO /fLHzb52/wCUv1j/AJi5f+JHPO+0f8Yn/WL612T/AIrj/qD7kkzCdg7FXYq9s/JL/lFbv/mOk/5M xZ2fs7/cH+ufui+e+1n+Mx/4WP8AdSVvzn/5RBP+YuL/AIi+S9oP8X/zh+lh7K/40f6h+8PDc4p9 FdirsVdirsVdirsVdirsVdirsVdir3f8n/8AlDI/+M8v6xncdg/4sPeXzb2n/wAbP9UM2zcvPOxV 2KpJ5u8qWPmTSmtLiiTpVrS5Aq0b/wDNJ/aGYWu0UdRDhPPoe52PZnaM9Jl448uo7x+OT551fSb7 SdQmsL6Mx3ELUYdiOzKe6nqDnA58EsUzCQoh9S02phnxicDcSg8pb3Yqyb8tf+U40r/jI/8AyafN l2R/jMPf+guo7e/xPJ7h94fQ+d++WPm3zt/yl+sf8xcv/EjnnfaP+MT/AKxfWuyf8Vx/1B9ySZhO wdirsVe2fkl/yit3/wAx0n/JmLOz9nf7g/1z90Xz32s/xmP/AAsf7qSt+c//ACiCf8xcX/EXyXtB /i/+cP0sPZX/ABo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/wCT/wDyhkf/ABnl/WM7 jsH/ABYe8vm3tP8A42f6oZtm5eedirsVdirFPP8A5Ht/Mmn84Qseq24JtZjsGHX03P8AKe3gfpzV 9p9nDUQ2+scv1O67F7XlpMlHfHLmP0j8bvArm2uLW4ktriNop4mKSxuKMrDYgjOFnAxJBFEPpuPJ GcRKJsFSyDNk35a/8pxpX/GR/wDk0+bLsj/GYe/9BdR29/ieT3D7w+h8798sfNvnb/lL9Y/5i5f+ JHPO+0f8Yn/WL612T/iuP+oPuSTMJ2DsVdir2z8kv+UVu/8AmOk/5MxZ2fs7/cH+ufui+e+1n+Mx /wCFj/dSVvzn/wCUQT/mLi/4i+S9oP8AF/8AOH6WHsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdi rsVdirsVdir3f8n/APlDI/8AjPL+sZ3HYP8Aiw95fNvaf/Gz/VDNs3LzzsVdirsVdirAvzM8gDWr dtV02OmrQL+8jX/d6L2/1x+z49PDNF2v2X4w8SA9Y+39r03YHbX5eXhZD+6P+xP6u/597w8ggkEU I2IOcY+iMm/LX/lONK/4yP8A8mnzY9kf4zD3/oLqO3v8Tye4feH0Pnfvlj5t87f8pfrH/MXL/wAS Oed9o/4xP+sX1rsn/Fcf9QfckmYTsHYq7FXtn5Jf8ord/wDMdJ/yZizs/Z3+4P8AXP3RfPfaz/GY /wDCx/upK35z/wDKIJ/zFxf8RfJe0H+L/wCcP0sPZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdi rsVdirsVe7/k/wD8oZH/AMZ5f1jO47B/xYe8vm3tP/jZ/qhm2bl552KuxV2KuxV2KvLPzT/L/mJf MGlR/GKvqFuo6jvMo8f5h9PjnMdtdl3eXGP6w/T+t7P2d7aqsGU/1T/vf1fJhf5a/wDKcaV/xkf/ AJNPmn7I/wAZh7/0F6Dt7/E8nuH3h9D5375Y+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/U H3JJmE7B2KuxV7Z+SX/KK3f/ADHSf8mYs7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf 8RfJe0H+L/5w/Sw9lf8AGj/UP3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8A GeX9YzuOwf8AFh7y+be0/wDjZ/qhm2bl552KuxV2KuxV2KuxV53L5A/RXn3TdZ0yP/cbLK/1iFf9 0u0bbj/IY/cdvDOfl2X4WqhkgPQTv5bfc9VHtrxtFPDkP7wAUf5wsfaPteiZ0Dyr5t87f8pfrH/M XL/xI5532j/jE/6xfWuyf8Vx/wBQfckmYTsHYq7FXtn5Jf8AKK3f/MdJ/wAmYs7P2d/uD/XP3RfP faz/ABmP/Cx/upK35z/8ogn/ADFxf8RfJe0H+L/5w/Sw9lf8aP8AUP3h4bnFPorsVdirsVdirsVd irsVdirsVdirsVe7/k//AMoZH/xnl/WM7jsH/Fh7y+be0/8AjZ/qhm2bl552KuxV2KuxV2KuxV2K uxV82+dv+Uv1j/mLl/4kc877R/xif9YvrXZP+K4/6g+5JMwnYOxV2KvbPyS/5RW7/wCY6T/kzFnZ +zv9wf65+6L577Wf4zH/AIWP91JW/Of/AJRBP+YuL/iL5L2g/wAX/wA4fpYeyv8AjR/qH7w8Nzin 0V2KuxV2KuxV2KuxV2KuxV2KuxV2Kvd/yf8A+UMj/wCM8v6xncdg/wCLD3l829p/8bP9UM2zcvPO xV2KuxV2KuxV2KuxV2Kvm3zt/wApfrH/ADFy/wDEjnnfaP8AjE/6xfWuyf8AFcf9QfckmYTsHYq7 FXtn5Jf8ord/8x0n/JmLOz9nf7g/1z90Xz32s/xmP/Cx/upK35z/APKIJ/zFxf8AEXyXtB/i/wDn D9LD2V/xo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/5P/8AKGR/8Z5f1jO47B/xYe8v m3tP/jZ/qhm2bl552KuxV2KuxV2KuxV2KuxV82+dv+Uv1j/mLl/4kc877R/xif8AWL612T/iuP8A qD7kkzCdg7FXYq9s/JL/AJRW7/5jpP8AkzFnZ+zv9wf65+6L577Wf4zH/hY/3Ulb85/+UQT/AJi4 v+IvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/ACf/AOUMj/4z y/rGdx2D/iw95fNvaf8Axs/1QzbNy887FXYq7FXYq7FXYq7FXYq+bfO3/KX6x/zFy/8AEjnnfaP+ MT/rF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f8AzHSf8mYs7P2d/uD/AFz90Xz32s/xmP8Awsf7 qSt+c/8AyiCf8xcX/EXyXtB/i/8AnD9LD2V/xo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7 FXu/5P8A/KGR/wDGeX9YzuOwf8WHvL5t7T/42f6oZtm5eedirsVdirsVdirsVdirsVfNvnb/AJS/ WP8AmLl/4kc877R/xif9YvrXZP8AiuP+oPuSTMJ2DsVdir2z8kv+UVu/+Y6T/kzFnZ+zv9wf65+6 L577Wf4zH/hY/wB1JW/Of/lEE/5i4v8AiL5L2g/xf/OH6WHsr/jR/qH7w8Nzin0V2KuxV2KuxV2K uxV2KuxV2KuxV2Kvd/yf/wCUMj/4zy/rGdx2D/iw95fNvaf/ABs/1QzbNy887FXYq7FXYq7FXYq7 FXYq+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f/ADHSf8mY s7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf8RfJe0H+L/5w/Sw9lf8AGj/UP3h4bnFP orsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8AGeX9YzuOwf8AFh7y+be0/wDjZ/qhm2bl 552KuxV2KuxV2KuxV2KuxV82+dv+Uv1j/mLl/wCJHPO+0f8AGJ/1i+tdk/4rj/qD7kkzCdg7FXYq 9s/JL/lFbv8A5jpP+TMWdn7O/wBwf65+6L577Wf4zH/hY/3Ulb85/wDlEE/5i4v+IvkvaD/F/wDO H6WHsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxVF/ojVf8Alin/AORT/wBMt8DJ/NPyaPzOL+dH5h36 I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/ AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h7h+UsE8Hk+ OOaNon9eU8HBU0JHY52nYcSNOARW5fO/aWYlqyQbHCGZZuHQOxV2KuxV2KuxV2KuxV2Kvnbznpmp SebNXeO0mdGupSrLGxBBY7ggZ5/2hhmc8yAfqPR9U7K1GMaXGDKP0DqEm/RGq/8ALFP/AMin/pmH 4GT+afk5/wCZxfzo/MO/RGq/8sU//Ip/6Y+Bk/mn5L+Zxfzo/MO/RGq/8sU//Ip/6Y+Bk/mn5L+Z xfzo/MPZfyZt7i38r3STxPE5vpCFdSpp6UQrQ52Hs/AxwGxXrP3B4H2qnGWpiYm/QP8AdSXfnKrN 5RQKCT9bi2H+q+Ht8f4P/nD9KPZY/wCFH+ofvDxD0pf5G+45xfCX0TiHe70pf5G+448JXiHe70pf 5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe//9k= - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:76FE812EFA94E911B987F622BD994B0C - uuid:7e67434c-0358-43b8-a083-32c919d418ed - - uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:76FE812EFA94E911B987F622BD994B0C - 2019-06-22T16:34:12+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Mograsim Orange (255,83,0) - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - Mograsim - 1 - - - - Mograsim Blue (7,83,235) - SPOT - 100.000000 - RGB - 7 - 82 - 235 - - - Mograsim Orange (255,83,0) - SPOT - 100.000000 - RGB - 255 - 82 - 0 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 40 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 36 0 obj <>stream -H‰¤M …÷œb.P`føëV4®ª1¡‰vaMLïŸ8Pc»7$<Þ0|ó‚¹f0C¶p8fP& ã°Œ/eÎb‹zKÁÊB`´r²³ªµYõ½È³Š ¤õb,°K:¥zžÔ]ÝVt.]òåO¤mד*ޑ8 -Íj‡6VºhµM,ošcòÒD ´3kЍ‡Ì@»T]Œmn՚ ŠC’.&í‚û:¯™}ӏ:úü4È/ã’IÅ -endstream endobj 40 0 obj <>stream -8;Z,f;%eL($q0Q6V0qA?>c.p\KFl@jR6%I"`b"&5enRg,EA4tSL@q4UW+U\jLhRhO -$!?/HJNpuMSaa;s1Mu:O%#RsUT3XVG\S.mgLV[5@nXj_deJ\:_"I?4%4s]&jBDJ\C -fW'sM)t]R&hqS7cr8-,.@%e0[.tO0S1H8uq^,@s-$biG&"I\K@?RI6iLu7[j3lh"P -?:F],:I6?OrHF3DL@U8dhD*7##3=`=kp=/?FS.:9%.i#!!QpbTR?K:N'u'dRs(a\> -^3Cadn.WrG]ghke-bK -endstream endobj 41 0 obj [/Indexed/DeviceRGB 255 42 0 R] endobj 42 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 34 0 obj <> endobj 43 0 obj [/View/Design] endobj 44 0 obj <>>> endobj 39 0 obj <> endobj 38 0 obj [/Separation/Mograsim#20Orange#20#28255,83,0#29/DeviceRGB<>] endobj 37 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_orange.ai) -%%CreationDate: 6/22/2019 4:35 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -488 456 -23 -%%HiResBoundingBox: 56 -488 456 -23.5352 -%%DocumentProcessColors: -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%DocumentCustomColors: (Mograsim Orange \(255,83,0\)) -%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) -%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%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: 1 -%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 47 0 obj <>stream -%%BoundingBox: 56 -488 456 -23 -%%HiResBoundingBox: 56 -488 456 -23.5352 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 20610 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 -%524C45CFFD6EFFC9B4CFFD6CFFCABABABAFD6BFFCABBB4B4B4BAFD69FFCA -%BBB4BABAB4BABBFD68FFC1B4BABAB4BAB4BAC1FD66FFC2B4BAB4FD04BAB4 -%BAC2FD64FFC2B4BABABAB4B4BAB4BAB4B4C3FD62FFC9B4BAB4BAB4FD04BA -%B4BAB4BAC9FD60FFCAB4BAB4BABABAB4B4BAB4BAB4BAB4BAC9FD5EFFCAB4 -%BAB4BAB4BAB4BABAB4BABABAB4BAB4BBCAFD5CFFCFBABAB4BABABAB4BABA -%B4BAB4BAB4BAB4BAB4BBCAFD5BFFB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 -%BABABAB4C1FD5AFFBBBABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4 -%C2FD58FFBBB4B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4C2FD56 -%FFBBBABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4C3FD54 -%FFC2B4B4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BAB4C9FD -%52FFC3BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4CAFD50FFC3BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABACFFD4EFFCABAB4BABABAB4BABABAB4BABABAB4BABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CFFD4CFFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4FD04BAFD4BFFCABB -%B4BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4B4BBFD49FFCFBBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04 -%BAB4BABABAB4BABABAB4BABABAB4BABABABBFD48FFC2B4BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%B4BBFD46FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD44FFC2B4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAC3FD42FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC9FD40FFCAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAC9FD3EFFCAB4B4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BAB4BBCAFD3DFFBABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BBCAFD3BFFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4 -%C1FD3AFFBBBAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD -%38FFBBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD -%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4C3FD37 -%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C9FD -%36FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%C9FD35FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4CAFD34FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABACFFD33FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BABACFFD32FFBBBAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABBFD2CFFC3FD05FFC1B4BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BBFD2AFF -%C2B4FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAC1FD28FFC9B4BBFD05FFC1B4BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C2FD26FFC9B4BABAFD -%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BAB4BAC2FD24FFCFB4BAB4BBFD05FFBBB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C3FD22FFCF -%B4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BACAFD21FFFD04BAB4C1FD05FFC1B4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BACAFD1FFFBBB4B4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BBCFFD1D -%FFBBBABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCFFD1BFFBBB4B4BA -%B4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BAB4C2FD1AFFC2BAB4BABABAB4BAB4 -%BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD18FFC2BAB4BAB4BAB4BAB4BABA -%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BAB4C3FD16FFC9BAB4BABABAB4BABABAB4 -%BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C3FD14FFC9BAB4BAB4BAB4BAB4 -%BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4CAFD12FFCABBB4BAB4 -%BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CAFD10 -%FFCABBB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4FD10FFC1B4BAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4B4B4FD0EFFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABBFD0CFFC2B4BABABAB4 -%BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4C2BBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BABBFD0AFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAC2FFBBBAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD09FFC9BAB4BAB4BABABAB4BA -%BABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%C2FFFFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%B4C2FD08FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAC2FFFFCFB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAC3FD07FFC9BABABAB4BABABAB4 -%BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FFFFFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAC3FD06FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBB -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD04FFC9B4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BAB4BACAFD05FFC9BAB4BABABA -%B4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4C2FD05FFC3B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD -%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD -%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD06FFC2B4BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4FD05FFC9BAB4BABA -%BAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4C2FD07FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05 -%FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD08FFC1B4BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABACFFD04FFC9BAB4BAB4BA -%BABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4C2FD08FFCABBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD09FFCABBB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABAFD05FFC9BABABAB4BABABAB4BA -%BABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%C2FD0AFFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD -%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BAC2FD0BFFC9BAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4FD05FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD -%05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD0CFFC2B4B4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%C2FD0DFFC2BABABAB4BABABAB4BABABAB4BABABAB4FD04BAFD05FFC9BAB4 -%BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4C2FD0EFFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAC2FD0FFFBBBABABAB4BABABAB4BABA -%BAB4BABABAB4BABACFFD04FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BB -%FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD10FFBAB4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD -%11FFBABAB4BABABAB4BABABAB4BABABAB4BABAFD05FFC9BABABAB4BABABA -%B4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4C2FD11FFCFB4B4B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFCAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BAC2FD12FFCFB4BAB4BABABAB4BABABAB4BABABAB4FD05FFC9 -%BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4C2FD13FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD -%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BAC2FD14FFC9B4BABABAB4BABABAB4FD04BAFD05 -%FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4C2FD15FFC2B4BAB4BAB4BAB4BAB4BAB4BACAFD -%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAC2FD16FFC2B4BABABAB4BABABAB4BABACFFD -%04FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4C2FD17FFC1B4BAB4BAB4BAB4BAB4BACAFD04 -%FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAC2FD18FFC1B4BAB4BABABAB4BABAFD05FFC9BA -%BABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4C2FD18FFCABBB4BAB4BAB4BAB4BACAFD04FFCAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BAC2FD19FFCABBB4BAB4BABABAB4FD05FFC9BAB4BABABAB4BABA -%BAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FD1AFFC9BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD1BFF -%C9BAB4FD04BAFD05FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FF -%C1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD1CFFC2B4B4BAB4BACA -%FD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAC2FD1DFFC2BAB4BABACFFD04FFC9BAB4BA -%B4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4C2FD1EFFBBB4B4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD -%1FFFBBBABAFD05FFC9BABABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1 -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD20FFBABACAFD04FFCAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BAC2FD21FFBACFFD04FFC9BAB4BABABAB4BABABAB4BABABA -%B4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD21FF -%CACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BA -%BABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD -%27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BA -%BABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FF -%C9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BABABAB4BABABAB4BABABA -%B4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD -%05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1 -%B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFC9B4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%C2FD27FFC9BABABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27 -%FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BA -%B4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA -%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BA -%B4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4C2FD27FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05 -%FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BA -%BABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBB -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABA -%BAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BA -%BABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD -%27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BA -%BABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FF -%C9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BABABAB4BABABAB4BABABA -%B4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAC2FD27FFC9BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BB -%FD05FFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BAC9FD27FFCABBBBBB -%C1BBC1BBC1BBC1BBC1BBC1BBC1BBFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%%EndData - -endstream endobj 48 0 obj <>stream -%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%$ûíIÉÎ -c:’Ì,rȗهÙ[ý>U(`æG±9ӕ +34ÌÃ¥ÐãSÅßü¿ú͗×_½þ·»/ÃÕ°{òÅßüÍáÍݳw¯ßüxGòî§/^|ûöݐ~ðëîÆùjÀS×?-Oíɼ{óöþõ«ówW¿½Åû?8üþÍýÛw÷Ï^ínï^ÊC?Üýà‡øíoïß½¸“ßß?ýêéë7Ï^}}wõìþ‡Þ¸Tv|öNž˜4M?š†qÙŇ´ûÕÏùȳWxööíýŸïÐb(lpÿúÛW_Ý¿úzÿúþx—æݗ±”]Ä?&þþïï}÷ö¡‡®RHž<¾~þíË»Wï~õæõó»·o¯_¼~óöÇò›ëŸ¦§·÷/î¤o/Ÿ½Ûâú§ãôtÿíý‹¯~ñíË»“nÏËHzxÊwÿáí³¯åKùoÒóӟ¾ÒoîÞ½“oyûãÝÐ7{Á~ýÒZÝýà篿~óìíýËÝ/9L»ýÁ”ÒߕðwÿþöëŸì»W¤²«aÊ1ò0¥¸ÈßË4¦yéêÚ¿ø5eÔ3…d5ýŸ»î¥ÇµÜ‘4Íòƒù•ÌΝŒÑ›¿{õßXÇâÍëo@Bw_¦qÚáÿƒýö·w/¿y!SΙ™Ò|•dNøWÿC}X&~Æ«’—e÷凫y¤Ò¯FY1»1-WK±7ڜÞýáþî?Þýâõ«;›Òë7ï~£k)ÆaÐÿÚ¯~ý틻7ÿðêþ|ôLÚ¢súó×_ݽ7Z·/žq*YÆö_{â·ÏÞ|}÷N–àëß¾ã^)ފ¬›Ÿ=ûÓ¦{´F~ùÍÝ«ß¾þG~ê—ã4‡]ƒLN’nMe·¤¸ IÒÎ8{»cû¯ÕŽªPQm"cê~%ëï—oõãúùéOÞÜÕežvEÿÃ~\•îÿKý¿}®tþÝ»»WõûeC~Þ-ïáêç¿D«7¯¾:¼~‰yxË-{'íË -zñúkûmû¿“*¾ýƺAÂS™¶_½¹…ŠŸ|ñ ý]yú«ßÊ/òæõ·ßüôÕï^?ùâʹþñî¹p'™Û¯v¿ü·ÿ!?ÿùųç¿ÿúîÏw÷ÏÿêîÝÝÛÝ^v®ÐýYaDßüð=KßÜíô·ò.”¿‡¿óþñîwÂCZJýû 9¾xq÷êËÿçÛ·ÏÞýùå믾}!¿½yõ‡»¯¿¹Û={õÕ½ùæ1MüêųWÏÞìø‹ÚB_ïÞݽyöïïîÿ°{ùL•‡~vÿyñ™Œï£ZåôŒ_â3ëÖz ûÕ£šzöî÷´î^}õÖk¿~õõ Ìâ·Â›¶#Ǝèó©þ7zùo¯_Ü¿}é•÷ÿ÷#¿T†õÕ/_é'¿ùöíïw¿}ýú…×üsáÕwo¾¹õöîÅ櫅‹è{U ùÃçÁæù_¢‰Ã³/îå<ûæ÷÷Ïϵòßì÷¿»¿;Û؅÷µºžsªÎµú›oîþ|ÿìÅÙO_û«kÌÖàîæ«{᝘ÀƒÏüæÏÞ=ÿýîg÷ÿöæٛû»÷ìVLöïî_}%ú›oïßÝy#è Ε¯ïÞÞ½ûó;aÐÂ^Áfä…Ûî…V}z*ÇMœ|ùåÍœ±ûWý#?yóì«{9ÊDFûÉë_ÉÃ_KÕíßrlæÝþ«'_ü˓/†îcý_ÜýÍÓ½H„ÿEÈÛ?ã¦L] V¢•Äÿ×2ãÿRã¼*ÙK–U¹îÊ^ÊÁʱ+7íÔx[ËêÓú?SWBWâª$-2ø;³”Ì¿KW–U¹÷^^öãQJýé(5ÇҎãm_úáãçÕ?¡+±+išQž|¡O¹+eZ¤è¯»²×òä‹ÿûüœ^šÕ°š×ØÍn›c)RcçØͶÎn?ËE -þÆì–Õæ[Y0c™J,©Ì%—¥\—}9–›r+ Gæt K\¤¢¥,˲_ËÍr+Ëg¼×ñ:]Ï×åz¹¾¾ÞK9\¯o¸¤&éBܧ}ޗý"¿Úïû›ý­,3Mz8ÄC:È'–Ãõa8Ž‡[Yv#'#Óq>ÊçËq9ãÍñöfé 7ñf¾É7åf¹‘Æn7²Jnnnn±4neÐnÓ­töV>ÿöZŠ4z+¯ÞnþpNN«ÓnºrìÊ¡+ûU¹îÊR‹Ô¸Hó­ä®Ì«’º»º"«Qjœ¼ôœ­qå¡ÿø›þÏqUZdÈð÷¾+×]YV¥t%weîŠ0ô›ä%®JèÊԕ±+C_t؟|aÐw ÿsèÊ^Kݪ«ù\Ïâzîꬭgj=;2#Rcìg¤›‰õø¯GÝF{3ÂU¯e3¦6’«1\Ûf´Öã#㵓k+ K±’­Ì,ÉJd VdÝq3ڙª§‚o…Ú9m¬þÙ³\[YXŠÙì²ùóa¶’¬D–`Eyr=„¯vszÃyÜsÞ -ç)q^0GÿÈѾæØfŽfä荭ŽÎž£Q¤w™}GÑˁ½:²×üî̯Œü*ùY672¤ag×Â֊°·Y˜\f7 Ÿ—/•%u#ƒ}fx-l±\gaIeóf”3øV¦þ(ƒ²_®…–% cMÂ`ƒœP£œØ·² Ž2X{aÃK‘o–< kŽ%“ål¿•¥r”¡Üçkaâ%gaçIØzæ>Š,p+‹è(ûֿȐå Hr 9ÆY¾Q–ôLöAk9<Š!sJr˜9TF‘/neáeJörà,rðä8Ëå(šä@d ÜÈò8È!u-‡•|£[sHr€9ÈF‘hne±eqÌâàÅQœäèÃQ óœ²ßN¶'ñl}’ÏÊӣ℅„ -"bÔµq¡UÖÄ:j í}(ӊ_Üv'rŠEÖX’õ5ÊÚ:·²¦îá)…?zRÜ°8­·u=±ì̉%‡’ õp6ú¹8ËÒ+gNÆà'#ÎÅk´Yßw#˜›«œA)ã†rÆh’FrYãz;Èxí×,?SÆá`ø<]S´¹ '+€"æèⓠ-Œ*B©`x x#Œ&ºk7«(ÞDoª,¬­ÖÕjb=(}ÿì ù÷÷“©¹<(tY!YVʞkf#hôÓì©ÌªgWmY5–Õ3-²-ý3ÌlÍÊÞÇÈ|:6[ù³lä½Ë×µ4©¬t©lú•–´ÒÁL/“ƒ1ý£2ÿJ%^k{õ´r]е ŕy „^5ü½lJٔ¦±ê¿fÓeûOJ8)әb¤ÆþωêˆÝÙË~þ÷ñlÖ"«ðàeïåúBY.–R5L©1oÊüÈÒ´×Ô©qõ³[8Ú¿OK¸P¸4¤Æé‘åÜ Ÿ)Rããž|ôŸ³¶‚OúóùjìŽ×ÑV¥ß*Å­¨ÜVm!Õ6RL÷®¶Û÷²«UO¯»½ÚcÚVØîí*ûÖ½ÜïÞ½íêjE8ݻ٭³•ä6‰f— -ýnukÆûTþ嶐fÛìͺ;<šª¥·±íÏîÍýÊ2wº;« g»[ËÊÊ׬BÕ2tn¿úÏ+Ûa:)qem¼¼+ז«­Íòܾ}h7oö*wõ…ß}øŽ~pWÿìÁÏ_ã¡·W¯N,•ZN¬*« TØo(‘,¦`Î&“L®^ÝvRI^I%S§bDÉ¢Šõä Q² f©’5k Š¥JցV'U´Š+ZÁ-¨ZQ³öT´ -mX²©lÜ(·Ô¿hB*(¢j©²ukRu‹ -×Ñ®=®B… *X™¬S»n©KCñRÕ ÊW¡òõ+Rý¹­n©‚¨‚A ƒ–¥Y<*š–¨hÊ˜¨c´ÝP!;ŠB• JÔ2(f9&ªfPÎY×@íÖtø½áà å;Hx™RތþŒ°g‡¬Òä8•Ý -Õ3”HÞóîŽkwRXµçêß=Oîe(ÊKÂoã‰läœuÅKW’ÍŠk®x¤ì˜^fAÙp»³|îùâŒ<ñ8®q‘›|æ]íª¨–ÞBÖÿY;SçÚWÏ\ª£©´­„UYÛüҦ̫"Àʒ˜W6ÆBk]®7e¿-fÑìËñ¤œþ¹=-uµ ƒìOòñL™Î–p¶T+âiIÊ|±¸=Yj̛R,Ë{Šˆ+«öù²d!Ǘ,ÇÇ©ñ”zn*]¤ÆK¿ûÈ?gŽ×®É Dƒk­“9Q´D+jO­öÕl¥Ú_+f•ÕZ[ÿTVѶP–Êo«n]¥þj)V»±¬oš§´Ì^ª­¹xY¬\{ٟáYG˜—N8Ö9^Õüç¹SǗV~ŠOºÀ.q¡žóìiºÌ{à9+c|†¶´Ë<æ gyG‘ä#à NA/—sæÝî¿È'ÉNùÀ»úáòÜÕd¶]nE°;¨-•ŽbÈb!ʁpîÆ{a ê4Ìm Çq¢ë¸ˆàYÝÇG8åÐQr È -'²œ1d«+Î亓ա …Ò©Œ?p,_ST†s›IÌp1Cþ¤›ùÉt5Håt7ï…=Ýé<ˆ”‰Žç(Y:S„_Dœ¿¦ú ìãÆ\Ñõìú' -ÿpJÃ-=_gªK瞦ƒZ -&äő¶Ê@g5ÜՐÝ3ÖET…®ku^Ȝ°ÑoéÆœ Wþ[9o帍ӏ~[¹k㪕›6>Ú¸g㚍[ö<òhjçŠ+nØxàZ&ë¹ÝšÃÉÀ/kœmÍË6ÜëŒdtʟz™ç¼\s‰ël¤’¾Hp‘÷rÇžþ¿««9Яš=î&ù×¼+ÃU”½³Ëèõ ÿæÉóô1Ïîߞ©ó*ɓiؕñJôÇùr…ÛYÛÕ8ç%û?B1ž*à;•2EùGN“ýZãð€Ö2]…!ÅÖÜ'פß3ˆR›fD2ȶŸñ¢h梺³²%¦a!}FœƒücÒx‡VY¸„ÓtŸõ™*´¯›᳨,CÊ|±ÖÊD·,ÚÀ$|•Éô¥eUY†¥ÿºÏSá'Ì唯J ª*)/Ÿ:¡ÛêέYûøe¹>qÁ®ŸB=ûcÃoVæXæßß¿|y÷ Lû—T+$ó¿8ë¼5†9«LææËƯ{Ÿ­±¹hh£Š˜çÂÇFÃSEr@Tíy¸ÝÒü¡‡ÚÌãìšÙ 9ðT8¸ôк¦mëxM¨ÈÁêQۮڈqš †½T—gÅNÒqê´ôFñܟËhÔÞr›:ûcŠH &ÁQ [óX6t‚â ¡@ٍaÉݞc/:äÅ£p[Ç¥Ÿì£¹á{G|sÅôôîÜñÑO륺ä>qÏ Æ©¬Te1ðÊ_» u%HZYƒ¥«d`½cvo²Ž²¡®a…Œ0ãÙànÁÍcjËföŠf@›QøÑؔGáRܓތÁꢞOd8¢£c‡® 1TÃɐAŠxÜߜ8;à¦C7Ւ¨ÞãàÒs¢=SŠÎ”¤ M£×”§÷T§eö(8ÝR²n²µB11*_«„ÝdlJÙÎTx&älHÚ"ñRÚ.”¶«¼}\ÉÜ©Ûdn¬… -á¤Ü]%oÙekÙ«d1X灢㍃;'JÞâÙKÞJÞ7¹dîUòäMêÞSê>RêVøg“·c'oCÖvi[¤ò#%î*oŸJÜÉ$nÊÜ.oï)sSâvfe7ƒ&w`AºÓNÿ}ãÿ^S͐Lgœ™•ÍewӜwõ_ý߀îïj¤®ðçÑÍÖÁaðíï°ú;£®Péäàx5‰ ãDÜA¯ ùlÿUcºþWݞí¿×+ÓûÑ`Ô$O œªºÁ¨ƒ™ögRÏæ¸U@¾ðށ§Ûþkû.P²Ýs\:žùcîô:÷ïõñtòÝz½ñ}tƒ}oº?užº£;¶NËӟú¿·ÿîiɁý-”#^„=\E„Õ¿aõ§¸qhônŽó.Þö{wøÚ7nÇdì°mdÛ(·™X»'VPÑý¨h6hƒ‡V`¨ABõ @ "Þ{Š×TÙ ÙÉlâAõŽ&$¬½‡×î=ÌdaæAÆ5qU?⑟§£õpôãÑÈzDÀÉcRÊ'_ØQÙ–ýqÙ9×PÎ5˜ÓáœO¾Pqɼ‰[@ç%Hç NŠ+ öQh°ÑÙõ)œ»+ït7s°ˆE„¸v³ñĜÝÔ¼2wPf+Yj܂™+0óåõYÌ°>¯W©¬ìdîã¯Ù[³­h紁½¯^]¿ B®bYÙº’g•m=ƒÙ)—W×g]Û76d‡ÎC®ë\Š¬l]íÙVüL­ƒrŒòdòv=Cԑª;à†»€ûÀñçœYÛð…m9ï2›NÌÞ'gÖ û“ Y‡'¡PþùˆÓ ëKçB!òÆÁ9oܟ—"Ñ´çƒ"ÆvÑ¥=t"øìNÚw—úýÔíªCÖÕ"Bi€}dΐû¡õ ÷(Pÿ‡QXX¢m $áRÌU€´y¥ÄËӝµësU¨†2ÏˈWã"¢s1C‚üè¶ -µó4»É|%’Vé¾ç£«Ð/È1K„…&ä…94ðò8fQÐIü ½-Qxi׏4Ë«cgµûäšÌT†8˜),…æ/9ŠKhé2*€‘I‡ØêY®RR¢3}jUhºùå›ç¿¿ÿêîÆÿ·T3õµW³Hƈ>¯ “ž5¾VfŒÆ2>SÞÖ"koîꋚ¬ÃÞÚÙKf€E‚aè-Tñ¶YÀû&Æ.ÎW"8¯¦ác+øÀÁÿ rt¼ÁÐÛ¿hŠkßËéUzî%à>05;±Â÷^|Sõ-ƒ;C ©:Qr½'»vÓBCkˆo¯½´p^*ë0­°Ó -Cmº -YUëe›A¢Õ€º £\ªö¢6ƒ¥Óbö&iÜTËA¸U0–!\Y­º¨æ˲¤úN8—Zª5a_å;1ª EEóÉPæfÎHVm!“ö¢ÓhY*fsÐb2D »J.-¹;¼"¢%K!SK𒼴?ÙKñríeߊÔxèJƒ ¬ÝB=Nu\•Ðߓ/rô’VåôOٔåLa3_Ÿ”Ã…r| ¸s †á Îöრ´(Óç(gƒ›[xsöç}Û³ã:¶¦p‡î[¨6ö¥ì@µ'¬bt¸çn;û@óg/tì¬n±îØÚd¿èþ8Й9xt²@èB[êµ­ìÚÕ°–­ËÉV)¬j{®É#×bõeO\Q͏}M?¶Í#¡ #¸@«gµ£š÷aGƒL¨6´Álh‰4õ[/îµ>šÁ,q¢¸Ý,hÌ·¡Ñ_MÚC>ëæµ^:ûف×°ißFÒýÕ¢¦¬=Ö3U™†ªžkÕO"¨!ˆFÜO\á~zÄÏr‚÷Yy±;|#{L\cyªø¼Eìœ"uNQ‚‡x—³Bä\D笔“UTöeìß%%iÐ‰ð—°–jk×±Ð5 -ºF?׸çó\¿¤)j¦„uj–*Uë¨æ%^U¡¦ö´øeWh:æh(¯u¼rSKN£”›Z¿Qé{UÞ°kUþ¼¡éDß¨ð¦Äþn­Æ¯ùµ*¿Væ‹Y¹³„2K®Ò7µ¾*ö“g<:õþ¶Sòo\—ópkáµñögñR¼´c­ÒÉKlEj ]i1}ãªô¸ë5t£× 9©Â!C8¬Êþ¤\oʹ?¢Ç®ËكF»ËÅ%©1](ñƒ 6¦Ñø å£bᎆg©ìÀuéiDü:”tßÇśwVV÷¼òÐ6íqez]^Õ[ëþÚê±½öyÎ6O:®Ó&ãàÞÉeΚñÕ̯7YÖ"Àž[a1¯e¦[=ØjŠm>ìµ»…ydJÁ²r,ØC½ÙÓ*àㆠlö±PjÉn²M&Ë{ˆÈô# ñ5DCAfÌ]„hHˆJL50DCCT ¡³Iä¨$rkúŠ2Te{{€¯Í\ÃFúÀ‘ÙSj‚¬JjK5fw<.x)`°†™¬C†EÖ3méDÕKaíÄs!ÄH|úç4²ïR,Ùð?°››ró1å}˜1bjÊÚpþjgHC­ð!‘~3$؏ÆfIr»ÑÖÀñ¯ á^½zöòî«Ý×Fڍ°7œ¡öFŸs˜’«(]¦ñrè¿&¸­ h&äv ·]çHXm €ë¼v‚ÑÉÁµË‰[³K≂U¿¾&/h}ØöbϬXG7<6ãÃÐaYÞ«úê½}uK¸ÐûjäÍõ|k暓ô d©8w–±n3±ÎçôÝä‰ùLYb®…s´,1ßyv›ï¿zýÕ+§Fˆ9 Èe®X4øãÊmò´XÇg,ß×xé‰Nª¨òÛì\E¥¶‰’C^e͜G˔Ôxܤ³‚ìUšPÊ%3H}žÌ@ñlÐK trÀe[zx“¨phYÛÖÁM΃°< oRåìÆaáG£ö]“q& uˆ -ŸVOɃžj©f ý#5«©Ãی(Õ´ÒÌ.-Š¦™iÆm!⩕p¦Ä %rG©q¾XÎøW.”f´*†]ùrbAZ©ñ=O|hytþ#5~æ?ÿ{ÔøGNrc±‰Zȵ:§<ñÛl:G; ~bºžp”µ u@iî]hy·ÚO«¼»êjªðíÞÍtž£TžRaÛgB&Ïr•ÊW2ÓB*w¹^qµÁoyKã/“Yt—Ifú”Óºã4õO[®k>³maR•ã¨µâ:—¸Ït¡l8ÐÆ}™#½?y‘øíG”‡¹ÞG•ïküKÕøqQþó`kz8±³ä•uÈ,CÌÉLZê[öQ^´©]¥ÊMÕá>›U‹p•œ6^C”®iÓºuù)Ò8Ý;×o)? XÊd"PäP˜Æ“/èNWX Líꯈ!Бž ‡¶£>9øq•ww¢'åMÂQôÏÁâæàé̑®¥îù:§•U·X@RÛbÂÞÛN³ê5§^Zë/[é¶ûcXôã™rš³F=ÓÃe²|é+ñ1ÅpÊï/óc‹Ôøègÿ3ÕؙɎ'é„÷²|óM’-ˆ\ºG˛63_ÚÀLi{š¼fš»Fˌ¶—õ¦Î5¹`â‚y î4¸Òԍ¦q Gf?Óh…T³žÑUæé¥K®!|"QÔ¸„Ǥ–Þ&—öôÒ-áÉææª.®êÞ -•0ºSëØÅ&\w¹Íš‹.,áQÓ*ÇÙÚuUWÍiÕ\V½Ã*4g•e¶Ïd¶Üº©¶Nª î©'_lT—ÜS+çÔCŽ)©ñ‚cêœSên( {l9<¦Ø=ï/— Z'…ùFè韎G˜.à&àB‡GðŒo7öqľXêiw}<)‡+^Óp?y~N¼T3ß 1ƒäŒ?½Â«œÆuÌþ–ÂÜaäú{>û;>7寶¦>eÓÁ36ûš­Ÿõ¬­fܟ9‡Ý¸®Ø O`ä7.Ù¥F~»S—¢¦¥Y*]‚¥.½ÒgyfÍÃ\”Iåp-¼°­!2ß]‰c`n»!Åe˜Îüã”éóÕi±Ñi˜FV'™Ö Ï> ¦Ã8Gó’5.tôqX럥7Ÿ|>užgœÓGÁfo Àyæ¾,‡Ìl“ãlú°h>‹žƒ¹nÀº&dð -Ø[8ߛóÚU¿ì¨£á¯?:ú^0#øq ¨ø7؊´`aïiá@™ë6ZhÈ)ï)0qÍA¶¿ùË@ÃÙý¶ûÁ€uÓ&ïoŸL–ÏõÛ2ý¦îz>Í -¸gJ#ËìÛÅG¶|¾³çñ½¶¸G_×t²iL÷DÅ3Q ÍYZèrÛ[¼öA |)t‘ØpÉ01k¼5üˆª¾±ê`@ÊDw\ßÚçÔ}àùŽ¶úœG‘ñ5ïQŸù¨ À±ìGgBpüf•€SjÎg„_ؓ‡ŸYùš,d³=>æu=ÍäÅa@ú0Ž9 ôUáos™û¼©}ƒòÖ'ïÂr~–m -VÏXóö»+|ÖĶºN2„WHoƒ®8¬×ß¹q0ðÐbÚÛõ}ùSßYåç<˜Ë;píÍÉl/y;îP½lë/øN/4chúˆÔmz©s ¦Æ3 ¦,¹ ¦òÔèRÌg%õÃoõÔ$¡²8ÒãŠ-]c®ìj§ÛY#§èm·vÒÙÖ¦R^y‹JÛëHÄÉVÖà,Ñç‹æÑIXÉ /¶Zx¡U؏2žG櫝åK&iV-4…©FP?ƒ°K˜<YmIV²r಩½¬Å,¼?È&¾edá5/‘Âêð;LÏKpºö½A7vÃÀö~øŸºín¯u™Sý¾-¨·KpÍ2ÀX–u6ÕÑ$™ÐÃû{¾Ãâ+†XùÌ] ðÚ-·eZ¸DÑPœ¡˜½¿yÕuXg—³6­²m´o¼ÄÕ·|½A¦u.zØb(6 âi¸Gj¶¼Î©Qm2<Ô+”ë/!õzúz›E»£¿,¹¿J~9Yþž -”· œ¿ù½µŸ¿$ùâeë}éú_Í2ÑË ôróD›O‰+–›B3SxVŠ‡o+2W3¾»ukexßwy¯ªá½æ¾êMïc(6 <nÜ´l¦{3Æ_{N¬j–/fœ¯º”¯¼ñ©/ñ¤„ e:_x»Í¹2~lá5ퟵ|xôhîŠÞaQ]ã ü£‚?ŠgCì3!BȜVYÛuÉ¸Î€ÈÜn"¼ôaFkÄÜ&déìE¯7¼aëR9+龧òÙÊ_C[â¼ ýÔø J"5žÿÍùËBN/:è/< :E'öéÕ!óIfÑuvÑñdWÕ=µçíÙ×æ2,~aMtÇaËNt>?Ѹ9ôjœ¾€[ƒF«7 Èq+¾'‡Ÿ…§OÅϜÿxAú“j<¯XÄ ªˆ)*´_¯Ë‰’³ÉµÝ#åšÚ䪔ðóš#¼žlšc\O‹4õðÁæ{*pÙ²?Fʄ2 .D £|x°LÙÀåÌëhÙa;T09,‡°ŒDåTIQ­…*%î™Q%Dʆ&B„üyRÞ5Èkî{û—þÓ׸Ví,ìۀ‘íN²àø¦þ¿M‰¬Ø§àwt­ÕԅêlUTËFQÍ+×J§â|âøœüù Õø°BqéþR+ÔÖO¯}Û^ÛÖ«A® &Õ)©q1k¿Á¶ú%„Ý5‚SkW_¿¿uoÙ«;³wh>äÒ<ÍaÙ2Xêõ‹»«ÖÙ̑4ÑR…‹x©ßqû.HRTŽ Åf3X—S%g­u -Ò¹ (¤F¿pÂÊÞ²À´k%nº|0ƒç„y(+Ì%7nïĝW{ºK=':>Óµ^æym™ëªµ|2[y¡ãñ@ ùH×c’O†EÜ¡0ÿñ‚ôwRãƒ* \’ù¡Ç«¯n³wUª&ß(\½*Ö´šµ¡©q³ù+r»ÜAj\ü‚‡zÅÃaåÃX{1ê% Ê8›Ï¼"Z¤ñä>í¨øøÕ]ڇ›ã4]F؛p3\aäp¸ê_„¥ %ó0år…v9^)÷ÁO«Gji˜Ḃqšyϖ0Ó1iÏ–i$ÌÐóޑ8†]ÌW°»Ïùäªìn³êUÉ»)^åõ—|tŸêÈKgyi‹È=‹ÑÙiN ã Zg‹×»š‘Ìkö¸Þ[o¸ªÿm7®ïŠm2YØþÜÝﺽåu+N@Bél}Ëw…­~8hÕôÎMV\™Îõmé- ÿE ¤qû»@n»kOïYº ×·D¿ D¾ä⍠M£¿îl_*§nƒEgâåÃTr®—å̓쮉á¢-=¾u›´÷Ã߶ûõd¿Ð.«$NÙ^-5ØcQï8îG¼üÉ;ñ<8>}Ž‡Pø=:þ{tü_?/g÷¡ÏEmˆÚº|݁)ŒŸß´>£¹‘¾[ÖíΪ£ÝÒ\ï­j7W¿¹jîîÑj ó–®3gƳßõúü¨×írŽ“›;ÖKñÒŸºêòyA,ŸHbnP™V÷yžÄ×=pÍÆ -y}1~¯ÉCó¹uݵPÍ#i!ø@\`«³lb·WTœ|óåhÀË û2]-ïyöc¹öÛæqgÁ£®b8wô(§YÐÐ@æe±õoÜÙ7Âö‚âí.úäʾ“¨Âº»ÿÿþß¿Ûýæùïÿøì͟±m6”¿Ô¥4§&½¼–æÉ'i‹kôš´¸OX|ô;1× Ðk¢âf7–¤xêúëH‚Ë—0ôW0ì»èO‰8t×*0B‚’ìGÆHXñ¼¡žÜskژq¾ë+NÌ¿}é]^35ñk²›UuÕ´t×UÆn)¯![/ ’¨ÒõÝäûˆ4ú›t×fÔ|Рù¸¸”3—{|ldÊ:1Dw¹Ç65Èñ|š‰G­‰¹Piø\W*õ×@ùŠXE8уٯˆþ®Ýºº$讉÷%B_§A7s7=ɟ ´]Ç.néƒãºµÒ­»¨à|²ÿUZ‘Ï'‘W¹ü/Xã9§Ú¹›àóšãI§ïŒær6•õ:‘µE`=ùâc°²Faµ,Ye…e®½Z=hïG9Õe£¬“ÈܜO#óÝ©õ1Öó·j1mö£í‡Ž_¬èŚâïؒüÉx«1„‰þ<ÍßñQ‰þÖiþ,vKdžOŠÞÒèiCí2zKVÙGÇo± ”ÆlH]`t±·n7É~òù”@߯‰ï×Ä÷kâû5ñàšX§û€ŒY§ù¿>üåïÔ¼%”§¿xýêWoî_½»õõ—_öª{ÿ›'_üâþ.èï~õìÝ»»7¯D«¿~ñ§·oŸA›·í–åj™§nà8Ïa7Åx5Èìì¦q¾’Å5ë_ë_ÿüGüý­þP¨ÿü'ýù¿Ê¿ÿ‡Pÿ(C±ûùî_þû°ûê ßú5¨-Պw/A=io÷³¹~×Ïú*Î×¼Â~týæÝñþù»ûׯž½ùÓîÇjùÑþõë2?µqyzóÕý»×ožîŸ=ÿw½§¿½q÷ô×wÏßýp÷wxãÿ¼ßû­ÖrÔNÿR×ʄk/Õ:N‰«&Êj)–%Ò. .õÞ˸”!,»~¦u­G2ŒãÕæq—ÊU%ÁJú9IE»´\Í"“í„5\¡¶”qEqÜMEf°Kéj”¸{Î×Jº’Mviºš`+ZÄUœæ²‹Ë•è¸4y¾ƒ<ÕìÈ©¾·\ 9L» ¿Í¬>³¹©\¥ n‡2\¥ïç«C°¾–ã•è3»iFè³´6K+"”î¤Bε Ò ‘í5¡Ž¢áìdÚË(«pÎW"²Ž€,ÁJ&7M L¡ÔÎ̓Ô:Å]œ¯pEÕn’ÁYq¼’.á;쉐®¢¿5^‰´;ú—Osº>™4i’ÓÍóU˲“Ìì<×÷æ«E¸Ñmà·ø¨˜—´“úJÄmÐ)È\0X’¿'ÂÈ}9^ ?ȅr5ˆ¾·‹2”Â,… _2Ï -Èu’½'C?cbÆl‰Âz|¸Ì|Lü9f|7f~©3°!ÐáQ˜ïµˆ.ZvÒ(Ft -Qç-¦+akuÞÂx%?Ț›e|G雼/êʼ›£L`’Ž“Ìì²ìfi S¬ïÉê§y—gÆ¥pë¯É&Ù«A4  ^žÞVׄ=!•!¶zéÒ"  D™ðe‡=ÀÅ,‹SΛ9ù°«y‘µ¯˜¬*4'Íy=ÉPYx\ÝyÒ¨ïÉL‹ÆŸåžg¬Fy¾Ì ›gHXåÛ=Ç÷~§{ü¨³_®J -^á¾y¹¢Ê:C–J.¥È~‘E†ŽLˆÁ¶•$_·ÈÄùC²—bW¬ ùRM–ñ2ã«AVœh€Sk§ڒÅ×´Çj/¼¢M·ZÇÃX®„ëÈXa²¼^®©QXå)ÇxAå,ٍ³,ëJ°¹“õ&Êi÷XԖ[E•`íÙ{•:]‰,sçWQVAמì½úYþXýp¯hÓ¿Öõ¿ýü÷>à ùéÛ§?&Çðáõ7zúúw–1ÕW+™¬%Ȃ„Æ.`#'™*ÙÀ!  #æª~°ìÃÀ5-Gê I&ù*DK²89NdvÁ°qlŽ¹¦i¹šø ©y†å<óÁŒÍ.+/ãÅaéÎY.ƒq€&à0Ø4ŒŒiȺ–çY¶xtƺŸä§8Ë'ŠRD³O•‘žº[ý€íb==Ö¡‹pŎh*W©¨‘!fJ—fp·¬‚Ì}~ŽT9âk%LM{p’A˜Ç®.'X›ö¦“e8‚(i]]"ÎβºFb¯ú×ùƒÞ¯lÛÓ6ãÂa -\àCšLêÇ<—„Å]É¢f‹d-,iE1¯L>5NÆ^+i×U&dįZ«F±WÃÕ$¬¾Pd ÍºÊœ²nÕÉþy^™waÛ×ndßpŒDMEZ~¹¦"4!a×îˆÏQbu#`YV‚s)d jÍEgØ+r‚µ÷¼.>¥Y/a{E“õÊÛ3‚íúúYþXýðZѶï‘ô>ÉÀ-t€©ª7hû‰Báö,( ¸ÓjУHo¢Â­ ZlE[Ü ¥ê‡¬¦jЂ˜+ë-® Z¨m‰0˜A ¼”íU‹ÖHK‰ð•E‹ì<±š´¤ûW0­»I „I>heѧ °T‹Øo˜d ªE‹œ3¿²h‘±Â~e-*Ã~œ;qvu6µêÄ'Çcç C–€(¬¾Ñ`cuïsi>>¨x"Iææf(ÍsKÖg`¨‰UKðêÝp_ u036†â>óRnMqê܁ðÀEh÷ŽXê ™?ª;”÷Br•skê‚ÃRņæ”#OûU]‚#Î\™´æ¤E#îL¤WÝW¿Ou Bù_&,÷êÄ0љbõ R[ZÐÏê_øˆ1îÞ*ÒR=·ªsp¢ §ŒÍ;È7(Õ=Ãn[FÕ=ˆúJ–*Ü? )õ÷Ê (^µ#¹‹pš dÊ7¹p»éý3'!Œ\¦k/!LOQÝM5Ê ïN·éeG!á6{¹!9ÆX¨Î9XKØ'wâ9eí.ì¤7°«Ê~¶{—!؂H´KóB7¦uÙÛsÊÚkØ=èï•m{yÆq(s-_0¦çF.B÷ÑM£œÃyl®¼JX»ÛcæìjrŠ5¹vb¦ìVt›qêš4ÂÚ{Øó÷š¶½üO"u Ó3¿]€5².pœ›Tñ{Ñ:qä擃: ™foR„3’â¬Ö8#Öi†º!¶á¤:n“p~'chccöWS©¯Ê©ÅVåÕ!ÀD-„†“®žêS,sièîŽ<ꡄº`‡x± ØB•bzNQ¥·=(Œ©@wlu5Êб¡F–ŽP˜k•EaÓ»V+åyT~]{®vÀë:éé{ä¡Ï⢆w‰Kbí£†=Y§»:©áW"ìÚÕK=ŠðƒÄÆMM›5_­hð]vN ©_dNŽu‘UOõ”b]Ÿæ©vÊÚSݬ艻"ô”»UÖȘÖÔû¦qæ ɦk=L—ÝÕDi\ ñrCÆá=ÍÍaíglõ";aí´nÏUt««Q¬Ñµãšg1M^„lÚój£•°ö]wÏy¼®mO¿3÷58š°²Ñ<\5O·EVÍ˄&œ•æ ö":Ãäš'ô3‘9×TôC9K2½÷BLÓ¨Ns$‹ì/ò(W5”ÉÐ(wL[ÑDÝÐà±Aí“4§ú›Ê\òxEóæ0i8 -´O]XR§V%;¢é¼4•EKѬý4(àA°Z¬8ØޔVŸ Iõ”f@_ä“-ÖÓeÊm°<ÛC—hµ{¹!ËñShv9&B³¾Q¾…ÇGd/+Å6‡ xcmÊY–úªìçÐÛ +1áƵq×UCLw­=£Ø‹þaþ ¼W¶íeç”õKÿV>²—ò¢&TÀo蹃"MX–ó¤ð<§`cTTR÷ lÞ)­*sŠµê¯9«Ü*ƒ{†ÖÖj¥Ø«õóڃÞ¯lÛ×ndz–„sYÔIb1_®É8Àa'å®U³ &–Ã\ˆâp‚s€ø…ö\DšÁÐÕå”Ú¨½êdˆJtÔʁSÛ´ŸsÔO«OµNՊNºÙ†6_ñ -§zÕCܑ#$gÅ%Šð¦æ%Jæ°ÊNd •büvë+™Ðµiž[eÅZµW"%¸!¨Þ"ÒAh7ö˜fæâìœC_™S¬ÕçÕRhä Á]e r@ê[5Š½êŸçz¼²m_ûQýîÊ!«ú’òR¥ÙF†9iE€¿ÇqÜ=Uˆ4à°RL“«iTüAF(¦¹«¬Q¬Ucú•¼P„šw­2¡ä…^ïÚj¥X«õóڃµ ­²m_;n‹É&8 °y^nÈeCÙ-)Yr—–Þ×µ4ŠuŸ2õ@>ö•9ÅZõÃÏÉe&h±V›]éÚԟíµúiõ¡®OVͶ—Ÿkon“¹Q!N#jêå† ÄÍ´˜U&æE“HÝKGilWˆóÌ}eN±VÝÆädª¸­.˜f—¾M%8;°o«u½ÒŠ¶ÝìôS´€-³S• ! -}¹!X4¦<ÐK*sœ';×#…øJ1Ў}®T°×Õ(Ö¨{«œa¸w­.˜y§Ô·i”çUy¶ó½^׶§ßÙ"…%FÔ!Q!—³º¾Œõ<ƒ Jôœye¤¨þENl?[¿DNÌ"¯ûCˆX)¹«¥¬-×ü•*Û;Òu_ëÉžÞZË}|¼“Qý£­žmÏzß鷺õ‚ wy:U†l˜ÕYKkÁê ê¦v\ ÆvUŒý1`)Š*Z‘¬={¯R±LÀ«¼"l(íޞÜY¬ŸåÕ¯mû÷]mHžÈƒé-3®’|¹!C6œ-Àh‚ -*Ï0©ô1˜æ+Å9Ühåõ1K_W%X›ÎߔšãÞÕT,Š¿5Yº\'Ý·ùƒþý^Ù¶£ŸIôØè”ÔNVٗk2,:pcC݋ã¢à -èM8“LV…‡/¦î±A]y]M•R›´7<±;»V­E¡tmVŠ½Z¿­=èÝòʶý®$dðÔْúŒŽtiÔɐð.†=j\ ²^I*ÁT€[Ñrÿ¶Ý¸ôu9ÅÚtmÒÈpÖªÑ*CÛ±tÁÞôóçê÷{U›n~7 ”†žz“ˆ¹8ÛÉ0k%ÒÔ¤ˆ\OH¢Œ36,ÌAcë³+ÇþÁÁŒM­2§X«þª‘'e­2¡ˆv»V+ÅçB?¯=è]ðʶ}ýl‡00KA~¿¹¦–šb6£%ƒ¤¢”qíC£˜0k¶EP„3d‚ê*sŠ5êö%ËÐ1?^«l4dªµZ)Ïë÷êçµ­­®MGÛ~ι÷¾}Fÿf©©ÝVÐn@Ü´ªÈnéöÇҀݠñ¬^ẠbUJCuÃ90‰º3&‡f×Ó-ÛB˜FnndíÎØÝ3ÒbâݺÓedž熱–Nå -ç†w„軚ð¡â· ÚEâ2CÃr' ó©pöPniO#*’{6ŁÜ3p°“ô8î ´ZXŒ;/²©Ch(nJÚ`z+7LɆ3÷¨@˱¸‰‚År âh,/}æ(›W ÷É̟Ø< làÄÃõîF5£:næÒá²ONðÛî Ÿ*5Ë'Kwʊ¡‡R7ªA®[E†ÊníõèíöYõ1ÿp«è¤ïq}BE”ÑÀ†tÛɺ½ ‹Žü\‘Ûðyðç¸ 7¸QÅm ƒ—s35Ø6ó‘5ö(øl¨ÈTÔvZ´1Çbc` WmÙò C£*5 9`ÃF8׫zÒÐÚÙ=4H6ÐÒ\UDöug‹Ç†öްؓ}IX#–I•­‰˜Û_‰HÇ?…Ø@ØÑjYA° ÁAB²ñuì50ß5ô+5Ç¥!¯Ñ祯±âM¼^çbìÀp× Z’*ìš)ŠSÚ ®…ù¤‘™Œ t Ã5«˜ë’°‚\Ì?µªB®Û⬐ëÓåzÂÀ»"¦k…¸nTCI3™T®ÎÕL¶B[cSêóÇO0Ì­žFè¡ÏjéV‘¡¨[{=ÚÚ¿Êˆí³­ž“ÞµþÃЗRÚ­µB£Íªîài5ä-ÆZ„\FÖ4ˆµœÏs_ÖëJ­èZ‘£¦­¹5¸Ú¾©ÛG[5'}kÝŒÇî Î/WÔ -…ÆÄ城–ђe®Pհ͍¥{ -D/¯§VøæF5t­Ç€ÒÞX§öOªyOj%Û®µ^#ý“5® Ôjàg èØæúI=`Zˆd˜þXT¯N«È =œ¹Q öÜ*2dtk¯GP·Ïªù‡×Š¶ýk]‡ -~úxº+ÚYö‹æᬀhǘ_uœƧ¡±þ˜ˆBCê0ØNXA˜Õ Î^‘¡½¹2íUª=©•lzvÉÁÿÄ\â+He#W$}GÊe))çxÉ%n•p±snԂlÝÌ o59a…mtjÅ@zE&éí­à”í»*¹}{­ê´“ߍNóIY?.~Hv?úõݳswàï_>ýÕݛçw¯Þ=ýow²ÚãîG?}õîÌãøëÙ¿½¸Óüìõóî¥té¥_½¹ûÃýÝŸþúõßÖ~¸ÈD+¹ô]¼“çïïî¿þý»ËCSŸ}ýÍSÓÛ7¯_½ÿáŸÝýîÝãŸÆðHWïïÞ~HG¯_xG5¨n~¸£ÿtÿÕ»ß_œÙ›'z·ÓÍ«¯ìå'g/{ú¯÷¸ÃUOü›j£eçU!Ê@§¬ê©ŒÁ´dýkuӓÁÍ?ôƧÚdm á·Víê…MNöüY_Çy꺊¿èO4Ëy20;jÄEjÐrÊ8 zy÷T/ïŽëä9Ic¶‘;2zöyPւ¬ñìAä› ܾF{J‚£µ |”œ@ÕoàžX}©¦áØ rM¨X•„F ¯–£BVôèÞÉ5`z”ã]T3:{D¦ó{'2L•ôî ‹]ÏÁp!LL B¡O(ØøÚ@jLPÉQûˆŒ:%”%„©õNo - €ÈE[3x»ž¿”AàósYû&§ú’sZ,€Y‘’ƒyvƒþ<3ô„H³Ú·žçQ_ qQJâ¬$äÔ&ŒÃîՄš…Êၞ>—,<.«²ã\g)éó8ò¶¤Áîè’‡Pù¢ŽßÊ»‹ÈæµFv¯Y3Ìâ±qÒDR˜ºf‰M+•˜g‹?g 2œ”4g•L4ÎjžmÔÔMLíëÞ&íÆ8؄ͣ d†`’bA]p!µW#5á÷æE3¥ÏÌm Ae±VJHt{ ä­9¨ªEÜaõ¦¡OYmècäu t“~\¤Ñ*#{ìÃlqt0³±ívuõõ™ƒÎp(EIKÄì 0+((70z)ˆFO¹M¤…°å c¡$ý‘[³Øæ!eö¦0 ö`âce,*ԉ"ªà`\óHJ -~D¹Š®P[˜û¸6DIˆïÃ=‘Xü3¬3"Û ï'ÐÔ~QÌp§Fföƒ‘kQg-t—/0Á“8h .€ÛeR÷ë„5¨8Ì©{/LLùœÓ¤µÃ+Gä PŠ7ëÏÑÝòðzÏÄtƌñ„'s‘¯[¢¥@?J" -3-u -™)£„ÖÀÂ̅¤§…éV,̬`îǓÔ!ðN2.˜ú–¡ˆ{ÛFKÞÂP±šWŠ>ƒH1^d¶` ru‘ŠøÀ<èž!`†`áYŠ&º›ÄϳÉ`9@ öš(K÷ZÖfôŠŸ×9à9‚ Ì(¦x† CdNŠÎÈmϋòpëÞ¨íå¬+”f¡eä-^+´!ÿÂÏã *6ß L$“ùف&ž£ü"TBÿڐ#+cÎHi‡2 -Åâ/ÁP¯G¥"ÑŒay¨™1eb}3PYSÄ8ÑƈJ+Wš4{é tÒ¨NZ‚HóE–ƒ€ ´ -ãrcf ê‡pÚ¿Ñz¤{ w Ç6nŸsa&ù\@c³á5œ9zJȲ²´p);5åoÐ„u¢®í‰£:•˜‘|QNjå(˜ç"ÓSp"/êÞ+òbW,ÌHè·`H˜ÔÎêl‹g¤ßžf瘸S”UFY¥HœŒñî-5èÜËøǀUL#R™Ç'ꔍ¹8±[`j$àHBítsÇ¢‰I„À¨#onXÌ¡Bc+f`ñar[ýl½í ©ìEœÒÎÉÀê2Û##ŽámŒê¨‹fŸçvß@ÒNÀ`=¨[†g\6~q"AžX)#àƇ{z»¬/JD—§ÿÄT›¸þ@Ȇàí’1z(úÌÄe¤’_0 àk4y -n±Qùµ½'L¯à,*vZÂ×2{‡ÐN•LøTÂóªè¹[Ã=܋É!u¤Œ°[aiêksÆY²èÇ%ñ^´Ù2ð:äqó + õL8À£»ŸeÅÏ|kô£òsÎZ¨™ñˆ!LSå#Í`+ƒî1ÔôáBH6<ögqS÷sÑt‘VôŠ„Û<£Ú@c‘WNÈfUË‘!* Ï>3èó°ðÕ<Ó0;‘½V¦ 2¨xoðË_8ȶa£¬ïQÓ¹*ßÃ,…¨g¥uO>KNf°”3Â"¼ŽÖye:“rlð’;AO7&D¥¤¦·…· 3Ùΐ” ÏTúUü=~ý¼ÔîLz‚,B‚ï„¡ÉëY×2;'KÑdãŠ¦TÀ‡L˜ŠæÄ:T1Ÿ£ÆšœŠ©4ՅJ& -ÁÛ:ñnïÉهÁ¥> }Šä[Ìã-I¡gÕû܍"™\eȋ&暂Þh)‚f•y¨ªòøkD8áxJ°â“^Lüÿ¢ïáÄɃvÏØܨ[…šƒ)ˆÀc °6Û&ìÈ%8›C Äõ èµÊö•…‰àêJ¸ÀÓښìož‚þ˜ÇÙR©© p›C/Kòº(Y$¸í…;|'? Â<k0d„›û{Óò$¬0ÚT3w‚TG%0Ÿ7¢!äù{ 6V¬W€L4Qs価x”ÆhrZôsaÄÅ÷’s,šˆmÀ«Á§t0E䜑‚Œ^ÆAkFà ‡¨1ÃàHýçx㚓…€ƒÊ Š´Ø0 ”š°T–Üú´S53Ÿñ©‰„‰ HPœ8$M$†»ÃB†jŠ9ž¡@ʧÄÓØöØ©ÅÔHÆ[̼1K±r*¶é϶ M¼ò‡LͩրFà<wgTØ6¨Æ3Å­T¡âHª+3Ìͦ9ô"©êóå2'ͨ•Yp”aP0) ¶-ÔP8ê+ ÐA„%^2ù‡ÏßCBTµ?#â“¢œ èÕACŠ Âð,³¡„#s¥«vE“v"SŽ†ºÄ&ãiH‘b+lbЅIôØa´0ДãÍaß!³ l9s5Šõ ™ÆLϵ6·x(Ã@üG!KfYQHq¿Dµìqû×m @$ÞVΏï¤Р¦O€‰ -q»s§ `ÖUÈU¦Õx„“FÜO°~ðj¬Pyt´<^8™••ƒ{">Ï,\X…qaêDÍ´âkS”-ŠZ…k3è¬K1¼xmdn‡ZÚk”Ì(|MøÆA›ª¹‹~dŽzò cÑ*& YÊ\=zÌú‚¨Å¬‰2ŒX8àW©T䦉çÔ¤W/qê8FøZDÒ¦.\VS eËgs+fc¢ `*²*gþš–… }±~‘Ü”C‰ãqÆRÏ*l=¯¦q•ŠêdÀؐYÀ[¥ú™’ç¤:¤Ÿ®º+‘çËRBÃC¤rM{„å\võˆ×ÉûCP)ä4’³C}Ëú3Bê’TVbR³T±Â}©É(6‚wçGŠ.„8¸îìVDÐ%F-2—|⍵ŠØc„¹ ~™ç«êÉȆÀ›0 –CýG2iÍُhOŠ¦ÉnޘJg?yN£&A1^ ¤0¨/+ÔJäÕ  ~Eg„5-ëWyµ‚¶Q¢QÍ3}›°%ք$vqEZ荛ôÈV;g3õótЮ†¢’=Nzê+‘ÞO †¦å i³ã°h0ëÒFÁaxE»Á°0ì =Èqԋ6Æaғ6H{Ó1Z‰wt`‹ÙL5)±LvhÎ]£Ó¨|ÉõñÍÌú½ˆ¿D¤oHŠK¥¼j¯Ó¿˜l’5»S(0=‚G3¦Ìo²«¦ÔRÃÛPŒÌNštâ5&H¤ñFîÝ@ÐðÒÙXÞ¨÷¢à8ˆŒ*6•JÃ@Õ§ÂÌ°£jˆö¹˜‡¨ijÉQ^Dz’ÅíëªG¶­œ;œ>WÈ\¬,d}UøŸ†OÒMÊâ7ÚS}#ˆrRÇó%E“p¢e† Èj&qƒÛdYßǑfÈÅÂ?G¬w‹â¦p6Îêuy^mnÊ&G…J N)Zqu1(£¥à¡%ÔߌeP2­j|pJêsÎjáªY@án.•‹N4Tck1ò‘¡Ð ña¸ï`Öð_žGجÀ,hÙrÛòÊLæ؂鏮{ȂŒØÆ-svÛfÜA3j4j`ÀàhÆr yVãzUjÓ't©7Mf_,æu1Y‹Ç}NFaëë?Òà–©éS-KޘÕy¢é;»½X2ó¢‚v#v4µ,pBy V3Lu´éÊÐ´Ö x€ƒ…'¬Ž`¾ óÛÏ%òæøÅ7öÀBÄLVZhg.õÒਠ-_›ÛêöØ%Y -‘QóÀ.Æp°§Ó2©»†©eµwH>¦5 jvº¦Ò¼ðÊ΅Á¹4 *çlþXÃ@G öqŽ/¦·‘«,Ò'äš>ˆT˜:àMƒ6Ɋì¦Ý0G¦á„±ÛW ScrçA;ÈÕ²˜S!"Y¶êŒI5Ù`ß"ñ?£R'MãÃÄKÒÈç1. -æî³íë[&BÛ¯B8p֟á;c²Ü]ÉØo¿2 Y‰!9¡2 RÛ©U N³¨I–%ð‰Îþ=ñöÎD¤ t °ÑiáUo40Àç@¥·¹c:~†Q7œ*Ÿƒ5$;²pÏ_èý$‘q ¨/i‚°]…€óG~,~?…î­í -r¤Ôæ›Zc¬˜Qʏd؎ ÐXuñ -—- ºQ¤\ÕÛ=)ëk0‰Ä Ô‘ ¢ì(EÊØN•À› †àiA ÷ ÀÖÉz¸ ¢ -slVê‹²÷ðë‰k~ÊLÄÿÄÀ (æãÞÜø¶}À䣢#„ ÀÌ¥ՐóTL^"€:sÓ'7¹€ -Ȉ >äÞ2=eôT¤€Þ/jUooašáÇå9’ªñsô(eN‹ÞkͅgoBÄ&èaÐxPô'½zAvaÒ7áæ«.<€“²>=€š™"ShÁ4׬ú­kÚâlxøF…i>˜Ò¢>_Ú8•ÔÝ;E_h3/€P·*mÁ¬L­0ƒ*el•Y)@i­Â ÂÏ£Z‡Ý«PA0þ¤Yم’}Òjiâ_Ò5®RéÑ ÎÆlŠr±tQ4ˆA(αá^ç}WcÐtªXcËÀ,Q=Èzg[Ðä¤óRBmn “ÑÐt -©“E„àBJöµ@L¨ÏÑ1G -/g„äßÙ©.Ðé àé±êË5YÓKâHØÁ 0íi2ñ·}ã̞g›5֌¸'aw0é)çu—ðVD{gaí½R -¨£4 1T¯jê`ž²¹Ót˜ª¬>)¨w’K -· 3Õü€ð½^ß]e3óÒ.J&mÁ*ÀŠÜÀ¨• bט WC’ ȆÈ((pHJ–Š&¿¢JÈÀbc:´cÕ/ø³ȝ‡­ÎŸá]à ìnñ%0H žOÑV†u´ÿA&Æi¨-8‡ƒ5›Ø'՝G^CO3µàÚÉݍ0J\ ØHý‰"8ðêzPèae,ÔΖAÝÛSÒ‚’˜‘òdªÈär¦c9«ѵzÁÔê† ®  ŽÞ±ÆCæÎsª‰‹­‹BÍXYxgÌߥKp«)’JµM  -¯ µÌ+Ä8É°!)€?Þ»’é†Uß6ÓËéSœ:^!£´ø%&ÌzÔz8òÂ4HÓ)[ÄLáÅ“‹«°k†!ë˜Cž¡`teçZEûuRÿù¼=ÄÿɨÁÊC ³ú¹Dºã9{.OÆ.3ŒmƒÂs— ̈…ë -s,\4—EÍ - çõ&w,׉b½/ -ˆ Àš#“<ð1µ@Ãö‡«~+ÁµEޛ ' œVžI·Šæ³Xè¬ä!zpi+¨¨2Gf!3m¡k”îoy5{,®1Š‰bÓ̜âp½â»£›(£ÚNãÊBÕŒ´Ñ0Ú°öÉH60CŠP:#c†2€Ú !™§0íhó…dÿdÕL­{&ªB®“-ɉ‹– VQКWöT+ü¢oÆ˖Åb¿°{•ü5J]“Y|@ z c$ŒŸ ãìyµFä´äŸ4:%EŸ2aT…ÑR#ɖ»{[ƽÀ¦g$Š‡ ŸF"O}Ü[];£Lœ‡ÖƄþcÝ Pv39£¦E†R;bXõ.Z:"'c -|€ÖÁAÝÖí5‚â ÝÉø¡DBö,o܆ƒZÔí+‘1¢ìô­Â«Âp_#;ù×U;JÀrââí2̒T±@Ø)‘1°^ñ›õÛèq‡hnŽò¢þ3`Y±d§YÁ”Ld -ÿã:K¨àGb˜žÄ¤á>?: KT„Ò§JH´ô©©ƒÙ"³Ü)°•žAGÚ_£ “K¨3 ™8îÃh\MÜüo³‹^xbBõõtȔ¨ˆG”Q6Ë!¶æ:À Õ5óðÏf–Ä6牗M.û/.DåI8±Auú‘ƒ1h¯'Á=b9SŠ„Ó˜6ð2(*MXâŸ‘)›È‹A÷›ö÷¥c7'xàãQ·ûlÿô£e7ú•¿ B$Ԏ¾D¸íàX&°3ê{ØøxŸ¿F€¨Å’·3}ÁÌ)„n"?]ŒMYqX)(¸h79L[΃=:b‚ûݺW/õ†ºD…"Û±X!ˆ{‡+›4OÎ<Ä„E ŠÊ™ƒ‚¤æQe]{/¨åéêyE±‰iY½G¶ÅšnsV Ê&÷‘j @’L@ÉYM4ÉØØ¡*l/Õû笖ÎyÐ3Låðæä:1¨™Hhªÿø™p`œ)LA”g=¥÷{ã3Á;gUÿñ3Õ|‚™=´ûÄSö»Ý0êhÄô’0ÚÒ¢†5͑1›S/3 ̱AŒ%áÅÈëab<,)‹s¡7x¡}ð ,hÁmÌà¡Èí!uÔSOVÅÖævÕ!Ò刍þêW€ùªªÔ`Áۏîǜ)™"×!ÑêÕí602X`iéÜåuùT+;SÏ òŒt·ÀY0Ü;¹h3©ûs6ô¤§Ã\ªÄˆý¦3ëDé•ÔÔ*‰…ƒû^H8`.Í¢áuÍ’£÷³ÁÚÄËoÕçG³°ô‚À%3»ן¹NTŠ¦K¹pYè6«{$t¨±>ŠwÐ2Aeõåïd†€1±Ùë΅›ýàKŒG™ûî~ô›woî_}½ûÁ~ýüù·/ýúÝ3<¼3«—Ü@œˆfQ¥Éàe%+Naª¬•-ÃÄhmÊzÏÒÐÁ‹h‚‹v;­¤ÌÖ‘´¤ öC[óAê¥OÌz?¶ûó˜&œr ˆTÿ*ÅDŽYñ0í9˜h&KÇ¢z—ùÁf ý:Ô÷TçDä 5¯±^ ¼ð–˜Q‘‚t†É5¶Ñ€PÃA6s ¹š1GˆoÞô`™`Ró“k,Ȩ!* c¹¾§\E9¾ŸR <¢„ÙÏ@̓øHÌS¨,Š‡+“hxä’M&íÜqÝY/=_HµLtf+a´¹%VïŘÚ{ôÇ3«bÔ÷ˆ®†K2æil½ š ¡$µ1å4¬(¹Ú¶Á¼Àwq˜5ŒÉ`Q™€ñ2f0Q‡ ¯s ÄËÍ18ññ ê"·èàz)»ê‡Á~öQéÅ®O†gÏêeœ-‹ÝeJ·ϺƒëÀ3¢Ç“§IñkŸÍ1;0d€›ÕߛådÜ1ëÖ1õ¢…–pƒ2yèMê4iáÄŒ_BDDHã\Òÿ¡<B½kkŒ¬ÀÙÇ»1ʎ” ë± {g;Éí5ð€Dˆ±j/ı !ÌÈ+®`²’Šau„ f½+Šà½(+däPÀê&ÄRóÍÓ@ã2·‡pâÂK'҄ú’!µŒpmÆNڙ8ýÈ~4Q“@F „{&;wq½@”C¡uÞ5àÿ¡ —º7!ÓA3Ô$ õú£Â¬ S»4 )Œ€(„5œ$À0à– À@ù^žƒ 'óìíÅ!QL3RŸVÒ5£"äáªá‰?a¥¶©’à3±N¡ ÀÄˁ`:/Q¬6ƒ5þ BáWEå5$À‰9¢a€@ŌCã!b‰ajjKÔ À”›ÙçR°öÌ؊QîNÝðê3²ŸE~¤\ooÑ,‡è M&¸[DïëÍã>v¡4s¥I#eô±<‘ Ü‹blì=£–¤þ‰> ©žèl]–p},~‰1qýÈã5P ¹TaᇸÈp6(:B{¤ïx8×áú›GFæÑdGÿ]VI¯EÊp͝€ÄgÑ)9“îdØÜ5΅­Ó9|»us#<$C5@bÁþ[h7?Ô©ÖþQÅèç&}Kwä¢ÞvpßPÔ3Ïn a~`<¥J̟’ý‚×<Æ|¢"•ùt¢âg8@á¨'3g<•ÖÛ¶ÁXÃь˜R¬>ø‰+@1jÀԇ¢)Gšj¹V$ãö1Ž2*.󀟍×;â˜Á!Kïê‚ÀÝßÀœ©Oa:ÞPÉÍkHšˆËÔLÄÑ¢`cR01ô’´#^`Py«Å±Æ2«¿{R0bÑÕB -ûŠÚ×HéÀ~ê=FÖ¹E¯É&ҞrŽ½1zÚ;´Äˆð‡:BH ýñ­œGŒ×4è}{  Î›°¸¸FõԐ³>§¬o‹4Æ.ŸdάâîyYä¨oª) >ð@R:s\V‡ëHYbѤµó¤÷Q‡©B#,´ÃÏY2qÞÊ¡×LΪ¢ù­Ðè¶n„f\Sx¿=†+™™ÓØA2§@XJØiäÙBw±GuñëR<‘Ï?¿*À¸†O™—Ô³Þt y˜aþc½«Â„2^D _T±MõāFÐs雅¡­ cwªêàמÀ´½À{ƒE¥€VrÑ@c– -îÔ¡½GãX{Ï´ªZ½è'j2#›cƒjÁD}Ò߸¨iŒÑ“ å-5Éiçý4꿇ßvÔk+Óµ8-˜sIcèà‚O<÷%­@»]ƒ,éªÔ©<¤$UGبڀ¥õ#Ð-kڎ@+n/,}s°‹'žšÌºMûÊ¢x‹Ñ®­Õ×pÆ槭ymĂÛ¸ jo5/&ÈvrbÈàÄ Ú'Ú<ü5³X"sEb˜æ¤@¸R4švi+óN´à½h˜„&¨êx?Ó§†ÅC0¸ én @†`BÏðd-LL9+b5š ¹Yc‹ûƒ16¥/‡+Kð]ׂ(ٮꞡ½nēÎÙ wŒÕ´°¼°°£Èõ -<0¶jYC”"1®I¡A$D^-©vYO×j¾lêcåO4Ùκæ›e³šk:IÍE£k1ÏïûT‹­*£®üiÒé&(½„Q-êƒnèiê yhQjIæ¨X"PcP‘pj«XPiåš4†ŠŠú“Þ„ËŠè§Q“¼™ò¢ŠÖ°óëàW±s±XÌd±*Æ«uòԂ‡15B˜—`FWúۡń©Ó—éßÇ*1քúp²Æ¨“öºï “öÉ£àCµúfK{/ºµ2ª-Ùó=ï±ÊA?O#Dé¥Å^{MŒ 5 ¬±ÐӃZC™D<·]C—Z…CjhþlBc0•ŽOÀŸ¬gn·MŽz †Å"²g W( „3ÃØ ‚Ëü´¡Cã 8§'íE`þFFÊc 1Ì6yæÆ$5w^²°`±“E®Ú.Ÿ〴À4ãÄY+©(¨›—ÁÈBNë¯yª†ÍÌݐÔ#Çq\&K¯aoe WI‚f45ƒO´ Á’§ØÔMp5ê†OáØ¢ñ–÷ܙ±7åÞÌŸGø(rº` Ú|; ¸Y Ô¨Oi\t0<åÖ™rN³G µõ²ôɐß_ÁÆ ,,Xn -} 2›Eæ) h´0‡àæHCe³?ù{âg&‡\,õ´4U&°ÀÉīِ̍šìm<Û¾4Æ8ª+S±ð Z€@XÈ<3`ž„‘§˜gÍZ•û;÷ù^4S=º%Æb!åþ‡TlfFÒásPã2'Ç¬)ôÜÐÃX$JÓàʨò#N`fàøªÑÃÐÖAKѲ*GKUÎ@pCƒ?=w`oý4^3›S 1†œ¼ÉRm‘²˜diN8[¯¼§?Pÿa\n UÔj²:«mî«ûØÉYW–`iAœ›¨ëâhö tç~’†¢ª¸Sj¶ÊJ1F‘M ñá³ vSQ$|©º -@¨Òœ-jèaVj⹫ 3Ɓ™ OÌ% -^ qt#Šó.Ǩ^ŠKÙâ%ùL!Èmœm:¨]kÅÉÂÊëÏc1Qi“^b-Oœ»ìÑ×4ÐQ§†–!N;ˆ - Y¦榪Ù1`?Í¥CQRãè¢)ç-[fT—.“‘'ÐÆꏧ¬óç(ed=Ѥ–¨†åۑš2:XôÁ`¬(uÎâ^yZ[SðŠ(6íO?}ŒWE0£*ý ¹á_˜I3ƒ %…RÂ`zs5˄BŒš½ “Ã0v㏨BÜ|P™.tæ»,Î[&Ô¢L>™Qf1 ÑVl:|vÁìo/æÙþ˜Úþj²‡Ÿ&>þȌÇ'÷ÎH·J€ŒÝ üyÍ<ÍEWÓè̌Š}öã°¨ƒ³&?ÆÕ·¬ÙrC¦j¥O} ½¼„♏¡Ú"˜°&>†½g•÷d¦<´´Çø_[³ãgv­²ó% h6C͹¦8Ίv^6­x¹&<†-PÍwœ0ÃöíÒû=Æàَ-:(B„€”h¸­u²ãžÊ4¾¸µ˜hOuƒ¥Ø]e:Ž5sÍtŒœüIj¢ãh¾øu¦czú4áìÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc a)ˆ“èøôL»Ž!VȜc¦á{™œc„4"¬˜cDBPù›”c6sºû„SPï7Æ1ÄD™âø(4Çü{¼ái|žI7Æaê}N¸ñiÁÛÎ6F÷$r<Œ6†l³1h´1vbN¬dãд&Øx˜ÿ\㡒¹jŒµB;'Óø‚[5îDcš>ÊИ³ùùLž1ËÕJ™kë˟Å4¾‚"ž1Šã®çœ8cP2²ÓŒá+k˜1µÒ'ËøêŠ=m(c¸×‡ÙröϗgҞ#óLýÆ1FEé¥þŒ&½þ~P¿cü]®aŒ}Xø-„1Ž‹ÚŒál¡ÎbßCÑàã£FÍmà‹qîøB6z1„d¸Ú€³DŸNÀ‹9#‚“¿Á‹5Oªu‘HÔ'ጼ™fœð*ފ‘Æ—Ú}ôr&»˜Syyo0°!)K°‹qûØ v1ÚO!ã½¢‹qÙMˆXJAõa¿6 -r1'qTÙläbYahHFˍyº˜ïÍÓŁÌtÙi”Qwn1V(Õl1@T-YB‹¢he6hñƒòï$síôò%Xüܖy­¼bñm®øñ,´bœ²ÂŠ¡À¬b|‡ŽË¤8¤}Ôã.¤â§éS P1ß!|Éâc2…‹¼aŠA‰ÅZ,(Åç#¢oPŠOãO6Hñiµb@ŠwÀ£lhí6Dñé¨ZŠQòŒ_ -B1þ>DÈBdF€ >1ÕóíN<1¼ -øù+˜˜®r'œx(?hbDؑÖØÐÄ,15ÈĐN¡þ:têÝ—ùZˆ‚K „Ü¥Zê2ˆ÷N%F ‹pÌ -\„¡ÇÌ$&þ¾Ä»žÑœ‘˜™è+$î]âGÜø&´ç üz{ @xh&N|0ô½¿Ñƒqøì -Òdʦîè`í’Œ[Ô'7øàð·Qƒé!‘Ð`¨7›zYª&¯s±°!ƒþż‘Ä`$Dú˜ÀàGœ¦líwà‚Qԓ\­#Ü&^äTñP̍Z¤`ºõ» (øÒ•œà!‚db‚ãïƀ?Š ÿ þ*}¥\íØÄ&^; 8ÿ^ùÀa <0*œpܤû•ÛàÀóØ=ÙÀ@ À¡ 4ðÁå´¾Þ©¼L%T ®zM4ðA‘[»w40¾W±¬Íþ?+z­áÀ ˆKÛáÀ(‡¥Ì%ØÀðÃڕh`¦Ïs') 1¾ÁÀ¯÷†ccr¹ooX`´H[±¿jtr•äþê‡Ì¥çú z‰çræ"Á¿Ú+ -ü‹íä ð/z©q¾ÝÁ¿43Þ%$FÙ#Ù¯þ-,<ëø"Ç”_ï‰%ÚõLî/-w¹ß¸¿8`= ï5÷WØVSӔ ¡Ò£Ž7î/Qðí~’û‹=yÁý%Êö*íûK3Û÷ÿq_cbù£7ì¯h¿­Mì//𾟉ýå?ÿÓd„UÔè¶>±¿L‚ñ% ì/ytö™*±†ýŽ:؏9°¿z æØ°¿ÌÐÕ1©¿ÄÌbÔ_¶x˜è\©¿ø…ûd›ASqJ‘AýåAûØ©¿¥V0¨¿TiU·ÆV‹º­§¾Q¹+‹*‚†ÉßàëÔ_XÊú¡¤þ’–Ëú‹°¨âÌAýe|qœoÐ_&êô]™úËð‘PÔ¦þ>¯ÿgCœú LE;“ù þd-×Dþ¢;Ot#þÂÊTY¹Ù8'ïz‡ý>nБ¬_½TDbÜ/.„SΎû}Aû}Š Š ûENBe%+ë±Èê0¦Üoên&é×z¾~o¬9'å÷¶Ë”_fM®çñ‹úõs”‰øelNáÆ1|¤®ú†øåU×£LÆ/?Èl"×ùÜ¿j2 øEŒù~ñ7À9+ß6TÑÞG dº/)¨ˆ(¯pßB5À1î«À¼Sjixi¸Ó}9¨ ·qTS)rî‘t_Þ- èݗ1|•‚îKc°^NрòF÷Uþ§_I÷U‚&`¾Ý)Ðg7º/N›Ý ‚îË*#’Ý—rKG4á¾ìNQU§T1 -;ðٙîËû‚ÁïK+< ã}™µG°;ð¾00u±á}a *ðP­û%ºlà}i`öaÅûR¹y#ñ¾ì ø¾M°¾Úù¾Òr‚ä`ð+7cI¨ù¾¥:Y²~aåš#¿’|j³K£4š´l|_émߗ„ƒïKôà#¹ØÅüªƒ€¾àm<Æ  ð ++‡ð[Ènm-¿4`ìÝ¿²ÞO~y V_šð éûá—=,°` ¯ÊBPÓ.Â/{ÃVI'áWÍÔΞ„_ô!┄ßBF¦¨¼“ðK¡÷s•Dü–n貿ü›ï÷Šø¥µ×$üJ/^•Gl¾ø#üJ ^”î ’„mF’ð+í÷qï„_úgÕÐ'±*š(ÐÝ Æ/êHwÛ¿0—f¢/¿°xú2㗖ÈwNÆoÉþFüòX‘Õ" ¨a&ð6Ä/.TÎX ~9YӃÄ/< Ö_nˆ_j³8‹D[¬pÔÀք_܌‹6Â/DúF›ð‹wì휄ßrz‰µ~Y$DW0¿ì½¦D± ¿tÞÕ2`!ü–HÃ'ᗖËúx™>ºý˒ã,¾çð+®D9“ð‹÷5ñ_AøÕkpðK+^ã üâèOò—„_8qm„_&ðo!VDÐ9Œ›¯ £ï„_üy»AøåWr´übò8®±ñ}™é;¯‘|_¦IKIx/F¨[؉øÅpç<' á~ð;0ømçûÂxÄ{kfxD÷…èNæ -÷eWB…‘ÊCú £‘·ÁŸ-6²ï¸2¡@¦ãe8¯™½è,ÌÌÆÂõ%$÷~¡#ûâyÏø{Åú¦ÍXßÛÓsðzÁ°Åòv£ú^§¢Ô¹‘IÓÁô¿W¤oÚLô}ÿ5‹‰¾÷¡þ£ Ï÷ö<ßûÐÐ8_ü›ºÑ|±—ç¦ùÞÖºÌ÷>ô&o,ßË Žå{Y$_ Ø@¾¤ºö–_þ-à!#Xˆw#í°Q|aÄ{_ü—&¾Šò»"|¯ÃÉQ#|/·¦ ‚/Ãâµì_döpîÁïÅ'ˆòà÷^ÑøaÅ÷Ë5ÚTHë¤>Þ;ª„ñ+»—6QŽ™ÍÆ>¤AšÜ šÒ©Þv)Åw¬3¹½È¯"#.l/˜cÀ.mÔ^jQÏkh/2Æjs(fïå¥å†ìeï[VàŠØ;¼N -`/ÎÔû×˓Ó̸ÞáUcÐz‰`ƒj…õ²Ú /§Y½¬‰ƒRɨÞy…Ô›ÝK ꍎâG~Ýæô‚î0½W€Þß…Â#ï配 ØèáÂ+½$Š!Ù¶zE9|‚Ï‹?k“Åç½­¬Øð¼0>¢ñÏ u?â÷AçnÃêçEÝÄÁ«›«W6îpõtü½’yÓf0/h9ƒ š”ÄsÁ²ay³v‚Ê‹ešÓZAJWú+•VµPLŒB”óN*/W+œþW*/‘SlÔ~ÈêSy¹éþ+•“CÅAå…GZÅqdY%VÑxø“Ë.xÅÁäå9ÚJõÑð/nStgÁ|ŒSw€Ý 5 )Š®¶3yåaÔ;™¼0p¸ &/ lv°2yé¦ñäÍä%ˆt0y?8*ŸÓ‡ùc2y¬CQÄÆ䥕YD3y«W"x˜c9èÊäeܲ™`ò’›ÁËÉût½’—ÎÕ ys…µ¬ˆ°‘‚²!yÕSž‘¼4à´{†‡Âš}‹šýH^Åïü­jû98LlD^F°ð~‘—1¬Ý‚ÈË æ’È›®¥‰¼|!-jY€>1g+‘wµV÷Æ`>ˆ¼¤d`ðڈ¼TÙw_…ï ¹\Iä -¤>;‘—ÊGjÊT~3ÐD^gpp½\[¨‹ÞÛà颪® §û .|ܙ)`º,“¯·ÂtaÄ°,]Ö==QºÐ`#Ø·’t)Ö>Ïé>¡GÇ%G—‰Ã‚­KAMáÆè¢Ö °«¢‹úÅÞ&E÷1L1 ºãÈCY ½&Ë.b·Wô¬Zw†.­·šØ ZB´iy’¡ËP:ÜÛ ¢ËVéˆ5Dó>Ã~Ñ¥q¾¢;6¢ câË)Š.‹ìØ(ºpuâåPÆ ž;AÑÍ|ñFÑ¥‡ÆÞJ×,äŒÝžÝ Š}cŒîã\×NÑEÈ÷0˜ Ã""¾Q¼Á5Ñc¥ÑNÐE-Áánhª‹{¢Å—ù¹ØÉœ ŸËÊÍ&ÿ›ôÜ'¸ÅelŽ1ö ž«Êˆ^— Ñ· ¯|Òsg¢iÅç҇§® ð¹\1±Ðô\F ‡Kë&—qÃq¹pÀÁ»©" #„ܑóbÂsUt×OIÏ¥…=|7z.÷`Yé¹¼pL7¦çæß=—áddàƒž«zæëIz.“j,­X鹌À³uà¼C¢Õ çÒ]ÆÚè¹t´ M z.’¬Ã -ñaaåFÏåYµ–ð\Û ¤ð\Ö-`”Ý๴òk7<—Ž6†çr¤CáÄÏ¥ˆsx. _iÀsa À~£çryÚˆà`֓Ïå°q+G5ñ¹\®âÞ>o9kŸ«Ìg}v|.AèÅø\¥áKI~.’n6~.i)]‚•À"nü\%4šM~.E¨ö -~. M¼\µÇ>…ï]ñ¹Hð鞟KP ÏżM>ú 6·|.ó€Œ9?úyÙº š1“ž›ÁÙÀ¼]äaø²l]X;)£肿D"ºH1µtI€ÃÚ5º0ÐÍ ‚. P¸n]2‘ºÂ՜IJ~.÷bÙÏÊÏ-§}»àç¢,˜‹’àçªüFÏe6­È¦’‘çÜå8¨CB¾¿ÑsaՏ™ž[jOÒsi@8f£çÂÚñÀƒžËÍxLÏ呋ðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ…*êÚv€.’ºôÔr³êPt§aè¦5º… 4¸Iè拹!t™}&A—×È£A—鵪ү)¤K»`è2¹†uM0t™!C ycèòµÇš– ]s#e†.ÿ+Ñ ¢K¼\é€è2Y¨î«±€Gh_áÑ%ªñ(R”\úTÔÎ< ºü¸œç^;‰tz†èâρôb@ta¸Xš¥Ê°2S]Üǖ/¨/OU*×]怙¶Š.”w¬Ü)ºxà’E—D„KdIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±ßƪòEƒüu¼Ñ……1±£Kߔ)Zct »N;ªÀèŠÃv¬+º‚HŸvŠ.” -EÊŽ‰Ñ%ü¡º5ûÄè2<ÌÊîÀèÒ¡{>.?^ùŠÑåÊç˜ÆÇ"…„è¦acèN«±FhStù~ðÍÿ«Öh‘ã±tUœ_  gŸ«µàç6;>w(–‘ôÜ!5yÂsoù;;÷e¼DÊôVIt’sïhW¹‚sor‘—}.V]5×Z֝š{;bj.š©ˆöâ~RÕ©€•™ 9ò»fæ"¼†hgÀh«_1Fø€ÌE,𸗋zÌÖ-zt¥¥ËÅßÊH –‹¿Qg¶±rIF§=£r¡¸Çë“gç&å)—ùxÔ¢)AMÎbz½øð#[8¹ÐZ¥Á¶=ü’Û®¯„\øHþ —=ùŽ–|\ÀæÞñ¸Íz‰¤ãBþŽ0nքÀ€ÃDž3V°q››$·5©²v4n{¨“%IZDÕãA:œm0V,n,¬1—¡¶§%A®‘W&.â}qQu£ùYJšaÁØÆő‚)ãp±ÅЦá*–òì0ÜÓb­`ážnL(Ü3&¢…„ ½ £÷áB€XppáQâãÜ0¸»2×f -.tÏdà¢Fkæ ‹<}í Àş qÿûà-Üø·éT·¹cÑ&úuŽ+è·P•Uáa'ü‰b”`ßâ&ð;r4ÁÊ¢¾„s±‹ŸP–L0ÞïäÞ#6ìípˆ ÞFmu@o‡a -ó–]-ZOämȚxÛ\Õ½o¡D¬baJ -ÆMgÞ-â¾t7Ü-åIÚíéÖR»=-ÁÜX·0"f¨[ð:à­é¿TL¾Mç¼»¬ 8·ð¹à×æaý rK}´f܂ƒ‚ïȈ[ܼ_áFvM1à„L„íƒoۜxÙø¶¬ ¼-þFÈx[ü‰ ÃF·Å-³pÛ6¬“0´¥s°¡mQÅz8••4«Šl‹+|ŠזÅØ_ÑF!€ Ú"i:®i[í Ó#¸H[ü,ôF´­]‹¿Úv¿@âٞ€Þp¶È°¸¤Ì4öBnÀl©c¸Ïe{¢Ùѳê s'¼È Ù"ò„èÃF²}Xv_&ȶ+ä–ÛK½vŒí©ðzRl‹çTCloé¥7†­êJ"lo¾Í“`{“”ñ°{‚ð{óko•,˜^{K3ôÆ®•ì'ѵ—Å:&×V×GíäÚ!ÞH‚k-‹Mn-EÌïØZ†3ú¤ÖjfIf-2®e¼1kó~d-Þ[¶‡0±–zŸö¬mòr‚W[={®–µÐgßiµÐŒ+YµX{O¨Ú¡Z“7Tíëôž¤Ú“±Ä Z­{zÝAµS`½gP-•îà-¥ËÁÒ`9 “TËlÿ)«áýåõß4¤®ñ·÷¾1¦^^ê&©Â¼Bª nUpj‘L£tÅÔbe+(µ¨‡;ÚÓõˆ£Ô#½¨Y - Ö¡_úç¹ú8‚>-2–ùž–œ–Ñw:íéÏNP…1 ³Àª8_6Ñ´wÉÔ,X{ó>¨À, ,ï7.-Œ—³œ'ðwQ®[@xUw"gòÉëS·–¨‡£aâ@ßì4®2ØÓñ´Kž:ÏÅ\9*äV=²(©ƒ@ ;#ÁÒʲ+ŦÅu0¸ Ö¼ìŸj‚‰øM° -`³TÊ°"‚üQ‡dJQñˆ¡Ï`·â” €­ÄU*òS$°ÚK½°ªG?Â,ðbg{$lÐÖºqµ¡õ5‰±ìÏÄå+`J¹øR']«K¢­¦,¼‡ÇSNË"Û¹Ÿ 1XpՊ#Aá WJüIög„eDœzŠ5ý$ ©øÐÙ­ëps1.ªêå=3S•0lÏ®–Ðþ -t3¤½…EªbDÜï@|¡ã„ZãQÑY‚N¡ÓÝÑôvmn#¸ó—{—ãم.«ó{ o–’g o‘]9#‹ÂJø’`©·ž\I&>_.Ôñàý¨¼<ߍƶwÕô‰¶‹ÆåvMm®ñ‘EÉ3[\?ìÜíbøxXǧ¸$IDJF/Òr]ڐñf ¯,,™Í+ÍO0Ó§¨AH ÆÊÒd|ˆ´dùÇ: -ÂÌdÁìøSç€I†4¨ç(7ƒ¥å̍ZOÝeƋ=Dæ‘¸vãôòhÂâ<“#66\˜èIÈ=8æí(Þ[<5¡®‚¤¬Žù1Š<ôèµ(F˜ïBÀ3þå—ë6™YܪÓçã¸ïËåjö3ás.‡Žax¤«Ø,¥T—Õ顨< °°~1Zˆ¢À X'‚À…dc®Zûc-¨ä§¯€Mæ -£gq¥(FÐK丙ø|e\iKg’rÓÛ5ãߧ×)vY—OC %¥bÑ^vsXgÔՊe:¨H*ìÒ<¢ë'Ì£ŒÀa!ˆ -ƒ¼]ôWOFè˜ €…•r ƒÐ_ƒ…þqo/vêW.ċúu ¿óZª°Îþ`êƒc‹ý®Ó \rCm%³°0*›b -ßp¥yZ$Œ²´Ã­NÔČ]⪻™±¨²5I®}‡_Ôfâ5NÒôÍR8pלæÉÖ¼tDÙ ¢&XX&Çm¨ªFUÑu¥lɎf áêù -œæ¯.–[Ô¾ô¥Y”ÀŠ³h—TÍ÷h4ŽÂ6¼ÙäN¹Ûˆf5èOÁ«ŽØÙ·²Æ ÜÁ.Rî©å6Ö¼åў\Á"Ø›Øßz6œ”}©·e=ì¯Bê-5ûãjખ\^Nù΁Kßó­ä6-\‡_·ÀCÚ¬ff†«å®º "âý†ª?Ù èV#Xõ ƒåœë†+ ºÞzEï t㆓^ŸcÉ!ö_¶®Þ3¡ÓÇK¶qõŠ‡5ÞÈYV€CÚ}j¤RÏÓË¡Ò¤_Õ|E*•‡øя—¼$c™'›JRçÙè™²»è®s;/ Ç÷CAîJ•bèó»é%¼×ç•n‚a֏½ú¾Ê!Ýfs³Ë:p}Þ]C(ÓbPŠ¹5°-Nˆu%eç†h§ÈÉòŠ÷ñȖ¶«›Ò¶r>Q[ÑísP9J€EBãäWŽôWÅ(x ‘eȐéÌ i‰àX orWÑEÌiÂò©G+^)u¹cܵVð®á1REs¸dW še‹”û±ÌÝpÝ^jњ¢ì…À+zú - â-)}‰9#Ê…ù4ýPZaø„º]x½»5L›¢íª,DðX¢BYÝå]‡ÇLj¤”™ò|žEZšÊʽgš]JÈ8/£ hÍÀ”´ r#mñ‹~ÞÜÐ+4úY¤LN‹1Þ3¬§ Ýdò'ðõsåœo/Ð0ð:üL/)iÔ´Y^È4’¹),ÉÞµsÒ\È[7áµ£÷På„ï€*_Xúdõ¨ª‹‡{Ü=K½ºñ ˜(€…k<Ñ9 -‚ÂFGÊý[En'÷˜åŠ¿Ûî²»Ïñ2¨H Ò8}j·[Û4.=X(Âtâ±Á7Z‹X"_=NÄÓâ]©bç®=cqñ¼_*3¥…<ԎRӇ]®"Ýe~jEŇ¢‡1ð}{ -¿Ríz¹é7è8¹l¡€Z ±îe±& Ô/ƒ·Þ¦"NÀ£`U)$†CO ‡ª`WŇPïȘBþ¶À0õòºÙ)ßE²T±k´úcöȊU?h‚vVmƒpcËEí…`dú+WfOé0 vï¹¥ÌÌ=YWRéª3k' §»¬ùƒe̞a„¼àá!ÓÀ„ Åè·S 8Ãy³¥Æ­+Å 8µ'Ëpù8«ï=&vê=šâ¿Œ“Ì@$_”ÃpqµVÊios8-Ë9?n˜/fnUóX -«ßœ˜Šë·ö¬ù±ÙޏãôDŸ³\wøŽUŒ¡ÒeVCæ˜çâ‹A"3@Ç)$þImž€¬yrüCÄÂè®Q•-Á¿?´D¤atwB.Aï¢ùnÚNhë¾´!ãڕïjK]¾2Âãx¯jyœÑéjÍd)Þia„ŽSeã~¢vÔQBÇoI4 -îÇc?‹‹+#¨œ=&œ*‘d`µú‹·ú¶,”/ Üfö#׌žÖíºJYsՆì?ÃmØU-@gÌBy®°žh±ÁΣÕ·&ž¢GøÊ ÷3}¼žCMÐ:»¸_žÓàQâ7g«@9g@ýÜ¥½C ‹jÚ`I11Ìú8o‰x*éMÇÊߤ3ÉÝÈÉ¢t.´(ªÄ«Ú]ÛS‰ÀýF؉ƒ5†¼c -Ìú÷#z«žûs$F–Ga–ЪAºI÷Äcé‹iø>|}ê€k´M¨ŒüÂgåv¶0ð ¹ÜU òP­ÄnVə _úÑ})±,30ô\™¿Þl-3Xñu((ÅNƒ°H–>ÂA„€á‹k¨TÒz‘莡GÎÅüïËÝ{`áœÇM®ë™{Õ2V›pÎPÖu¨íˆìáX–LØÕ}¨šf4<ÔäaKrAæ‹îò{@n§@>s½'‡ÔƒÂ‘Œ?,rD Vê;6¼zÜ Gß-z*-=„èÏä$ÿ‚YRB¥Qc8LõƒEpȕҟ€Yüᚠ¥áZŸ2—Æ*ðqè‰z×ÓJ?hìç"ìׁ~EÙn“BÂ`ŸË|Ϲ݃ÁKõ§„ ’@¼´¦‹‰.Kò‰p¢^Óà›Ûœ ˜Û¹îÏN…ƒiah>ñ ÓÜ=ž.ç7ì 3¦³ç½$ª•k­²>ÖEȃ¯¸pƼ}÷Ïg 3Ýî̌Ðõðv’b«DT÷m!ª,¥¿AÎeðÉÐfâsAäAi˜psõ¤pr.ê\ñZ|¾,I£¶€6ôD‰Ó‚µQÿT #B -•¡vhŠ0m”˼çÂĄ´²Q´¶S?ÉUk:]UBáX=‘UèMʸÒbt6˜É=²cèúŽoʸLHíl«úÉC µ˜â`õò À;t×üV‡@4?˜Ž>LÁŒÉ Åê`ië®nlÐÔ‰ iJÒ µ. -a³J–5Á:Ü¡¨7GÓØțQ²’³v>Š‹o_ª"0{C/þh¡v'ƊvöŠI OÏ¡,%ñ8çø kßÇ3©?gî9¢íÒ-´`iNÀèå]U–ûë¦ì›^/½ J»Ñ)ˀ])³\§:쨩Rñ¼¿„¯RÞbFvZ<¤t÷ÑÉ Ÿ@ݐnvYÅCý ñ\çÅÄcÜO£Qs+¥fÎÆY˜ùsÏfü®X Sr{£D9§n“ã:Vôóòs¹ìŖý›VCuLJŒØüX¥Ê¾3ÃÎÌfÝBáËx£:ÓÜ)Á©Ã\ߎ¢]ë„JœqÙr-*‘9„mK4†å!fÛôE¶¥Þ5œ+XPÿÃP0ƒB%¤¹Ø±¤æšþ;ùžŒÌ“JFÉÛd88”×I5&´Ô-b%É»Íð2±â.¸g-ºÄÓ̜7+ûf,ò`hQð´¸Àà}zÐp'©îiz·h`5BõűÃßiB?óGw§êGtŒT ‚ Xý}ðÅ>§ŸöÇä23Ê©Èö{ýcš©`Ã"8?aUQs˜“ 2’K]b§(ž¥]\;EÀuj‰§w\í¹é6;Mœç’ØûˆŠqnáææB'æ*wî®083 -Û­E9÷(l·¬öŒ¦’ø ª`Q®L)h Å,ãXb©šúXÍ]ä*²¥8»VƒRbÅøÌk Ÿ::3덭z«©<©,Á=•®ãª#_§'$œ¹h¡ •â‡{ÄQwÓ®¹«<ÁÀ)QfÌn+Í5t´‹µþ>".m萝Q°í”ÞŸ+)ŒÃ±–×T‹ ÐHÓá•2¡yôìÊd§ùÇx3à ¡r`ÕK¬­9¶2p(ÚtR)AT KÁ¹«Ízͬd&²b“; - ØÏ¡ ®SÊ,É„aÒ9'צ[Àæ¦ÃZN -G»ÓÔ­R‘S«°#[#õâOZâS¹C‰ä/‡RññP֕‹&­«áœQkaÑTz9HÉɤ¦73§ÒÞ}ø ¾£½‡Ó dXfžò¸„ùJêA öa‹‚>¬@%(5/Ý¥zºPhôª‡Eê°~¢í41ÿA'‹½3=˜Y$~Eÿ>ä8)gº\±‹:»6¡-sOéA®hˆu…º»Vç/)dæԘc¥¢"ùæiºEzVDúã -¯B³v|©·Ê½¹8ãúg¸Ö˜u š|ªjVðԖ¥̨³„YJ|X[¤– QŽˆÒ†š¯à0î’æ󔪎ÂûmWõWæá§VwÏ*ÀG?f=Oµèrh‰þ$Ÿc¤_…4“EÐS«r©v_¡†"(“OºÌ×e<îè˜D¡ðMj*ë^Ã¥nTî©cÉ°Â$u¾CÅ.Pq\žG -3'.†<6šéÞ3k+ÆD=Mekâbi×,瀯)YôðoÀ풴Ÿê˜ôî·Î¸æ7ÆNÓ{a¯o`E ú1Ì·Ššžðô.-³iÝU(êþ,Ú/Æ'»ý6µ‡eDpût uݬ;gAé3|ö̉ðWe”x3beÎ6,vl†Z˜Ïí¬g͛ֆ‘hê}÷9v$åLU|¹tÑt¸˜ÄL€ðÁ -7ûœáƒ7à’TŸ'w•Ç–*§‘Zû÷]§U‹EW´œ -Å»´¨¸ò©¨—u.H]%x9[‚Æ Çu#Ó*aaÅd(}±§¸*HÊqÕS,¹bªöñ#½T2e€}>R.ÑY4FÇávˆ´œ~Èp×{”¹+yd4S ÃjrÖä€Å®m®ãÜî mbÒ;ԅõðŽŒÆ8ŽÓ]RÖCñ^‘•Òlež< -ug˜Ôq†:–=ûpÅGÓ[ÿ¸K.,\@nº CΟ\¢s®éøŠ˜u çë$0¶(ÚjÌç\³+r8\Ýi -Á§@NkÙÁñFyFî*Šš`)o#ñ|aƒj¢Äc@p&$š; -Ṉ̃u ë]GˆtºÅo—9x¹ TmæO|0p’G\’=å›[ÀrÍw¾¹M+n’VTՍK©«VVë‘F—¥ÈG^¡T“sAјé0ä£ú”Ên!óo§®®pb3d‘X¨ürE”чKTìÙOoª’U^UYÈÐ(ƞì(Vâ4~šËQØ"/Õ"’‰Ä· ä—°Ñ<v¶ÅdËhoî*j>œia¡s”Ô'aWŠ-a9îüÕÛÂ`$#p‹ÎNJbô-„{…ü¯ê»¯¡T—î.“ª—äíêFDaNÍ¢3,Û¹p‚Ûqe<UúÑ®ªg¨ìurQ– ³BôOrì¼¥žÛñŽt¥xpJ€'4½çéb oL‘B*‰°$æâïÛ´~ïÖ(Åº‰®8ØEHŽÕ^BQ–*-ª$Ê Öæ7z›²XPœËæ4?&W6²dTöQ=»ß\¦ñڙÙðn9 ø÷Ø¡ôíÒJä}ÃR½Êœ+£ìä;c`ߟ¢zÑC»IH¿³üŠ_F”þ2z]‡õ|FÔÁÂÁª¯£ÊN°§[c)·¦NE2à Ép¦ás¼ -’0»Z¤ûtnñgFúÿcDÞ ,‹4"7`2g‘…Üña´õlϼRRÑHR¾u‡4 CAñh”(Òkø½Ï UΟJrܐț°î·úKQc)D”s­C$’ Ô±A¯Ju# -GyÔUÏ#ŸÅ£ßã¦\—Ç„Ã%:ð%AÄkÜòÅúôŚ[ÐÁ|êŽý¨¨Zh’ºJ£Sž¥@Gd”þžÄ¥·ð÷BÊP"·É¾ôt…™Ñç$HWÐÝâpñ¬/¤PSéìKáçðÈe.VûPÒÔ,¾ÓCmñ¢]`+TJñ «S^´P'P]Æ])-«}ALÐÌG !Æ|< Ž¡5¾BÖ -O×RJ -Sh7× ÿ>ªž·V-ՒÈy±Îɛ׍#K)ürÛ¸LDì™tn*ݚ%¶´ÌÀáñ,fªw*ïM¸aZÐÒ¦gLwš‡‹Î!*R_èµü°"øö‹’pùˆâ¼è*eW¢Sµ8"W€AÈþ(X2³ Õ9uئ䚵vk¸â$=ÜhG$ã\C4 +)ž8´®'ÀùÝKu¾Tæ³"£zäDú§2´Qb‹Æ¹k´ŠßÅ9µ 8óG™‘*¦C!7º*˜.•e(ë è%¬Î Aôî=ÑÄU^)ˆÅ2=PØ ›1;7Ïõ¶2_÷1{8öž!þa¢ ­ž‰!‹ÂÕ>¬ýV„¡êƒqïb‚,,‡ÊÜ°—9ëùêZ -0”Ÿ+Q²Z™áD°è5Ñ -fo֊w ‘Ìt‘F@좸Ï7á…ZYª¥†9Â3Ã/TX"ÝÝ؍©æ™/ÿ§ª7RªÅ\ÊÀúEcÃøóÒíž>›Dþ¦ªBU<|3*EŸ.&Õ½þ}Ä5’¯&D7ÀèeC…-<áêډÜU”x,fB@ D@=ýrš -ÕjIÊ8ãQ_´©Nü¢òŽrQj^óæðe9ÛýuàóºLz¸'DLY…Ãß?jfpe­åVAµ°OĦŒÒ´ˆ˜Ð¶ú˜©Ã!ãÖu³ä•ÀóX—² 896ÙՅ†É)Õq/MZ\|FY“‡úÏñPUׅ/J`ˆ*‘Rwx™rÑ{]÷ -Ò29k̸ÄN}1E,Ý›yTÅNf,õf‚ª²–IxHÚej -˛Tý¬¹Zoâûè9Ñ šhÎ]èJ»{p ’ýMˆâ¡¸r^³Š™ûF-b×ã'Ft[é^mr“‡É÷[§5÷¼ì@,~A€“P„ÏÊeZf¯—Ë]£À»+ÝR‚Tºs·ÜƒŸU7ÚÓÏ4:÷²Â³ ¥uÞ:W¾¥¥‚s`V™ 6‹Úì>,/bµóõΦ w×È=UV -³J؆@/ÃùLÔ~âR Æ{^FÆ@X£†“£Èä«LTmaágŠ’µ¬®Øâ†Ãi’îZm~ñãZSȨ2Ç3c- 8]*³ø¡S7x)o‘»vo§’þ}mÐÁJ?Éb)ò´Æœ ›1dÕ-Qº¨´Fˆ¬q ìÆ´hWÄ´T zY÷T\.ÛGnE Lwd-weo‹,]•vê”Å¥ÚM}ð ã]~ô2>Zo¼º r®‡<ìñÖSklŸª9áÁî[ìDvØAè-JЋe˜Ïø[©0aswsÅùÅbü§¼c^舆^EôWŒ8Ô?1I_¢vwÝ©}ªb銮®œkNin„8«.^Œôez‚6±ÊíQñ:9¹”É°ác¤ _sZÃ<͎Ô-Òuœ¹] Íˆ¯,ª;-çZu¬~\ÏD¢âNBbú¡Yóz$¯SZ‹0ÝÔÂ/aE]’º†Ý;ê-D%9øSœ k5áÐZ‰"z²:Œiý9³Šª °¢ä-äfä) Øƒ¾,£Ç—]ØéÌ!z|»Ý¹jQ=îªêW{Xë)PKu ª+_ƒY÷a)ñGX®PfêŒË«ÌómƒŒŽ§¸A¤Mâ;BcÝÅ/ñtrLiµP oÐÛgS´¦T›æMX&t`:M0%¦)ÜÝ ¥Bû²‚ÃoHꁰN - [Ê~Ñpœª&¤½È¤Cç̔.1i<Ì}¼=BVŽÆ—")yDn´¤'„¸´²ùÞ PbÝ!y3ö8vÇeIæZ9ˆ?G”=~çw€…EôX¦O‚–¥Åúva쑷åÒÂá ‡O‰ oµ!^ãrIi‡¢AlÚ;ZLÞƉˆî¾lÇnâx' ùPf ,º-{Ž¨Õ‹^a·ý¥„YÌu: û™·rsC¦N%tξþ},2Á4ó‚9õA­~ñäš}À»YQôÔ5ï~G7/˜QqA uOUü…ržÝŸ6ˆ—ñôá Å»{ܦ…¿z•Åâ]/M`Æâ™=âÓÕÌPÅᙼÐkû¸8…‘gR­ˆ©.:Y…¼ñFs#Ö>'y†–Y_缏5áïf©¤60Ì/›xS*ELyG©„å‘Wj§Ûš3GfÂ3zîÈ;\f– s=þÔ+›M¤‚¹¾1èÒeœ¤p³ -«ð)Vé<ÎLúW‹éÇnwíN^”ªcÉ]}\!ž{J;€”k|ÃѹawÑda± ûa%Í[ÙþÝtU ÜBXŠ¤ñdŸfž™â±“͗WoW‘¬<ÙÚ£¨$ÂcY ³C"’{é!ˆáv§Q©ê®ÑŽ+÷¤+3ÅÞ´¿‰¦[Y`Ǻóö–'ráý0­è©d°˜›¾b )iñ•ˆX¶ÎíðÕâö²Ü’>p´‹‡”ËìÚܳV®«j†¡ÚÇYÓƲ‡Þu{/îéæ,š´X†Ê&–H.…·f³ö¼YÁ^5´Ð#ëlÞ&We (ùî2Cɸ"ÕuVñ\J.%8a,îx™1Ʋ=¶¬†ÿ¬QÜvÞS®DóáÄ[¡OpÕæR‚² .Ï¢ãbŒ`Bb°²ⶠ¯ Ðޱڗ8\~LùâìVs›¸I%é IþšS6' æ¾o+’Hgªž³ý- >‚ųº¤>KØ©…hzu•î‹„\Uç8G\jŽ(®¦Ï²w³—JéfàÓ·ú:’£‡ðÈQ–'pmù’÷¹Ïõ9öqyèKÐs'ïï‘æ7¤yNìDsDßXo@sÎkâËÙwQ” gÞç~ƒf|¿Žn˜9dò37–9*Sï&G(óh5–$s,÷(RÞ@æ(ÄvÔóê^ى1‡ƒÏ†1ç~E•8 øáðW"ËouÅ{âïö$;æ71ðs´¾›æ‘É/ŽC‰/ïN‚$¾¼[5·Ó˧ÕðòÉ.þ‘L ]$ü±D—÷ͬ¿éÖ1ìèrf< æP‚0‚ª´M.?cJ^Éåð -®í`: ]É?ÆyYîÐ¥qJRÁYÐÀ–£nœùü –S[Qï7h9»ñ÷d–£³^mA,ç_cç•Óö<WŽcÔûœ´òÓRÃV~ö€Ó˜UŽ°–:+šUŽÅãe²Ã„ô2/ÝË$•SþT>T’¹cÊÑǨ™'¹÷²o”ŒrÌâ‡páÓ ã\KÁ6“Ë„Q~ù3Ù åWPqPŽºËëñŠÜ ÑϏè(“ž":å¢M'ÊuÂɯnvÌÆ&GK ÃÔ{FX^Ë!§%™< ;˜Ë ùyæ’?î XòG­JN±O3oÿƒ?Ídh$[÷ Þ‰ä÷ð€@r`4†}[òÈ/«$wùs«F/i䬴ã”4rv!Vk£‘«IH—c%Šý!Û ‘ÃBÈÌN#/áx'öý 9 ’ÂÞ+/Eþ†‘cÎFÀȱbb}ÑÆ"G}c3ÒYdZ”óq»@‘³Ÿ‰ŠÄW¹Ì,ª70EÌ.sýŽ({]Yä0_ ‰œ^(νUçˆ(uRԂCþdÎFRg¡P~´QÈ1“,òÇˀ$?wèëV9¬Qáݚ4~§Ãmôq4çê;àãO„Îú¹LÁßÐãO …ƒ<~Ÿ± -1xÕË\ÎoÜq0¹Ø ìøù„_fìxV—oÔñÓzRSÇA.áÏtäõåX™ãg„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆ—¿"P;œ¼ Ö8ýLál¬qä¡øújrµc´Y€0ôi–Á#mÅJߍw¡’3ŽrÐÓӉGF¤—Ò¿F9€?†_Ž0\¹ÏÆz#ƙŠúÌ([fc ` C½*æ‹#›©’(ãÅáÚP¾ÑÅë˜uRj˜â©.Ùâ<DZµ*ž%òYE@·Ò´üW€eXÆ\q8B7¬8!2EArÂV˜A­.Ÿc‹ÛHAnLq¬˜ô ¤8~ ƅ³™ãq¾ő}áëV–g=Êcö ‡wš8ò=J/&Þå+%Jé@êX6’8`å| Ž³ZÁâð‘»áà“"~Ÿ–q¢º—¹gD(XâPSœætSˆËåTñiXùáQšøð3âA?O vxø]ɂ<ù0œ„møÎÃd‚,ÜfA q¡‡cE©”‘¹á¤/?zŽ³:넆ƒÁÁúý`†ŸÝ9³ «¾MÃa(¦\0Ċ±I3ø¤…àRÍç¥t#ÿƒ„“ +*ébí&…÷`(¼— Ï¯œðjÀ„#×\̑®ÅT¼AÂ! /8áÝRõD„·€Ço„ð◠„£E­ê6 gÏZë!&¼>nUxðªf ÇnM‡™•sxß5› Ž€Ò`U™Áà-ÄÊ+0ÍÈÈâҀ}µñÞ¡à#Hk6\§VÑ-¼ºÆ›â^ œ+¼sÁG0Š~8k¸ãÀ];iàQǜ0ðÃIènšäDô}'^XyÀÓWzàL-wö_UŸ]¹ä~3ä­Z)!ÀaÆ&üq:g€‡è?øß\þLø7þ¤úb›í«UíÉþæf&Ç(Á€f¢v7ò·Ã þª©ŸÜï4lØï´õûq¨#XތE–ktšáaåfö§“ø= ð;Áû®Yù¸ïx-7Ú÷CQ@ÿ°o¬µ¨‡ Ö÷Á¨§¡ÞS>‹cH,&Ö·X½NÖ÷Áäv¿±¾"1)N1ìû;dý̞6í$MÂínÊp[ IÖFôö reÄ7Ô7VìL‘éû¡+™¾!Ú§7Î7ʍŽ€z$ÜÉ:Ш§¯eÃ|ÃR -10ßáü!¶hlS}I°Q¾‘£’ñi˜Áý*ÖZª BJúñ]MkHÂw«*ÍHÀ73©ŸV¾7D-·Þ»U§Çƒî œºÄž+Ü»F#Â`{W·ŠN´7 Ñfu&q4Ô,ØâZê‹OGÈ6¬7|Ié? ¤aÑü­ëe $‘»ãþ´C½Óå?Ðk°¾:˜Þ¼OöÚfQù0íšDïæ¬zc .16 w‹øb𼡒`ñxà¼q–ÐÌOÂúï2aÞíñà,ïå­(o¨è8€É…!¬ -D7˜L¼ÜäÍõI[¬#X ŠMÃFòžV“¼ÏÇqúypħ«ŽÉ5[+Ç[ý–®2AÞTø±É|¼)odÁÃFòÆÇËØB’¼±¡°™Aòƃ社‘¼ie}Að¸õº×ž$ïÂjܳ¾‘¼ñ¾=Æv{Ça´@Þüû6-úX`øÎh&ÈRÎCŎ©Ÿª*ʘ oò1Ä"1ț²P‘X ò&‰…+țf"äÍ'uÉñ¦È†9àãMaM”{0 I .'9Þ܄ŸìÆñ†™Í¯“ãMÑíџäxC2$@äÆñ¦f_S—9ޅœåë™o¼¡ªÚ8ÞÔj»„#03Œ‘o¦Œ0_úDfÁr`¼!—:á Œ7…Ϥülo˜Ì Œ7¥r äã-í«ÕVŒ7÷dUM`¼K/㠃w;Ævù€¢< ´Ë{`¼) bøJñfÿåø¬.@XLpyc¼æ8{Ù1Þ˵sB¼¬°Ê5QÁè­È]ޏ‰fIð~¬¦O€7ŽóNï~îxº†w3˜Ç sð»qœv~7* "¨O0ÂS¸dz7ÉÇM•L ïFԕ ÿ€wC‘s{#LÓw TôJîFƒwE´I¾ík%µ{ñ½Ý ÝRqÌnFYËÌnö†'îhcvó¢ë¡]•Ãû]`Ì© Õ¿#‹²ƒmó4×Âù3g;v§ZH”| çځݰ²Š*xÝ8ŽâÎÂuã×TJ´Ðº E‡JÔÜI(ø³ëÖã$ÍÄu‹²miÙَDŠ[Š\ ø®fU<®›Ò׌릡Z¨6qÝ4³+pÝü‰žpnLÁL¦=íӎëF`[õªëfí† ±nF•·•Y“ÖÍzVú®úõÀuó&©Ôtåu—€$¯›Úë^7‹7T§°òºYB“¨o9 —K‚×M ©‰¯›‚ZŠ&‚×ÍþP\°s—*>7`·$¶”šØÍ Ue|Gzç‘vb7]®h‚Ø--®7ì͂ÖnîövÃ*·ÄÀn†Ågù› ïÄnFø$4±[ýXnixD>BÜêvK‚IìæªJmHŠHôrs–­Ã¡zCvË|GÁjӆ.æ²Ñï7d7›ÛÈn­ ñÖZºE¿“ ٭µÙÍx˜¡‘Ý\æa{"»©=–ÆÌnêÓõ˜ÙM‹>†•ÙMswæWaÁK°€DvóGY¹!»%ù/*¥uàñVÖ7‘ÝÒòîÁšÈnº ´÷íõÃÐn…E\»œiFt›Ý=ý´[¡’Ó¤“„v—ìGcfwZ’ÙÍà Ÿ³—*g.˜Ýôé€ä‚“/ x7f7'폰rR9,‘ÝDÝñEڐ݊,?c"»ñÆñ“ÈîržAÇYÝ,#:<6„äTÈnºþê ²"»KªÙM SÁìþ¸jXV™ùoÈnd"Sp¥<H!* -gÌEöLߐÝ4³Á™‘Ýø ªÖÙ '¾Ù 3á<‰ì¦EÙI#»eaÒmEvãGIéLd7R¤o±)Eõ.\Ý̈’tÀîǹ´dqcdMÄÆì¾Zä‡mFK÷ÇÄîÑ£HivÃz8òÅÙÒN×=ú²Ï%Áp¾'aÝ#ƦØltµ£º‡;¥'©¼ºÃÑuÆÆІóÐê&éú~¦õ¾‚ffNw6N÷´šÓ}×hfü6ØXjØ»bº¯ÓaøÜ̜ù„t§actO«ÝW4% D7@ ¾®€nÒÊÛèF”[qæsàidÅsc?Îûç¾CftîûðÛ¿Á¹¯h ln0pÔ.Òhn_8Lmdn²˜»Bx¼‹4]§•«_¹b¹a$å2¨Ü0t—)ÐuEL9¸Ý“É}SùÇ4éånW‰ä†:ÃÈ äë#ȍ0+Yää¾âC^xÜ@Ö ÓnÝÑC9hÜ`´²äaƒqÓjˆ9ÕØOV£¸_EÖ6÷ˆõAÜýªw›yI"ß0ÜÔ¦²ÍŸ)ÜÈÃ+`÷åÅîÎàf“ðç™îµÐAàÆ ±ähpó´0n·šBà·a w¿Ò·˜ðm–Uök²·×ãLôvvqòöy¬àl籁·/ëՒ»}¹UDÒ´QTÁQ~£nßÃU¹ÙÃÕb"·!G¤Öc%n‹.úLà6 œc¸}‡ØeãmÃÊá(xÛ¨ë`#pÛ Š«6n¥m£Š† €€mcéÍô›YÛù÷†ÚžV“¶AÇnµÈ -¶;¢Mgû üT`¶±4uGïènL}Þ0Û0k%q=ʅΗ²Ðk˜º¸b¶a¨50Û°Pؒ˜mnÃC,˜m̵ -‹fû1[*)ÛX©íû -Ù~]¤*_²Íã]È6!w ±gõ œN^{@¶IA`_‚€lóÞnÑ=!Û|¬¬Í6d›ï‡Ð€lÓ¢é -Ùf³Ð¸ -؏Û&†lôž>§gõDŽl3É`ÙÙ¦YÙWC¶™¬×Dj3â¨ä²ÍÕMÙÆcöo² &_˜±{à:n3¶ç29ÛúÖÝc ×è'ŒmZxgFH‡"·;c»Ý&Û°HÜŒm–ØÞÚd"¶q¥Ùb¯¡°XØ†WèRï±=}àTVà} Y‰%ªœ6Äöb6b›Mž™yÄ6,R¹mˆm3Äv!ÿ¼¨tVÝè!æÀ³!¶ñ -[9bÄ6%†jLlÄ6ž³@wbåz¤§cukâÜ»$Ýó>í|mh䔊2^n8‡” kãu‘'¿ÒµDâpxm‘Ô Ýc-\³®tmY©H2^›Ç:¦­òàêáeÃk3.Ê%Á×ÆsgÌ1ùÚÏô°z¢(×e2çFFàµY_T„Ñžtm´ùé [BPFR‚­®·Ò3úxEÁ`µY¾Øµ¢e/Û²¯\m¬„œqЅÂ/g©°ÂÕ¾Üb,™Ú—‹×© #A Q 8nP›úÃÁ¸žÃÁΝ§ ,ctÁÓ-BÆi¤¦tõ„i³£Ifiã8 H{D¢vãhãµ²šEçÅe(¶R´¡¤`Œ1 ÚHò³ -†váކÐ&cî‘‘±m8,@»_Šªìmè½TìÀ9´ý¬ÿ|v=ÄFφF‰`–€gCdwû<éúìÜßÀÙ(QèÂÜìSÜ €fcaÅBۍ™ «ŠÀ\ƒ±t½†Kô—˜}º%yÙ§{0/»·¹Ã²³áR°²‡c¥‰Ê†þ…“øFÊÆEðç”}F{õàd£ÆL­®VLö€ŠÀdŸ1§%gԌǜ¹yL5 Ž#ÓÓeh6}¢Ó…x;"N¿Â áôø† º,*ªW>6ê­‚qõ9£ý¢éØÏp:{¥cÃÈ0SÀ±Ÿèilì`fîhìǂ$c?ÎC$†ø¹ Æf¢å°êŽ¡³H…$ê´VM,ö}E; c±ŸÀœû‰ü -ÅFªG/ÑÈd@qŸŠksñD÷oƒbÓÌÀG@± ÙÄåù”Plæ$èsoTl˜•W -*6\ůƒ4lns»8`–VÎ#‹ ‹ò[Å.%ªð7,¶ÖMOŸXlæÀé[£Ý—¾ðÕ<ÎXl&žÕ<.:}p5gððs±ár°Áá†Å~T žPl°ԉÖLìǚ°‰ýxO"6 ‚ˆý½¸ó°Y=ÜÆÄa?Á´Ê5£—L‚n4lB1H®Î ÁádW×Àa/™¼•‡Íu…:ˆ˜‡ÍUÝ5&›QÕáºÎÉ´fl•úîÀaóìZ›4lúçíi_ÙS9Ë aÓ"~èµ-Õe7+›…,*=3›—~QovZ66ö4äÁ8l|¨ '.XWÉΊÆ¹©ê"JP‡M¯jÃaÓ©#»2pØ]¨òO4lnÁG·á°yr­Mv9\)™4lVÁpT^iØ´j 0 ›–á,V<ŠÂŠ; ›.iu]BÓRĕKIÆE•›‹éfî‰Æ –Vi–uT((ÛxØ\^רwW”£yä¶RÎø§‡ÍxL1÷BK ¬¯8„›P:ŽG›  Iª Ä&”N-> ÄVŠ¦KÉ9Ø¿ðß Ä¦¡=Ô!ï4–{åa#—êç1‹e¨ÁÃÆ6ºm›Ëè]¡Ü’®ŠÔ?ÂzÝوØ$˜QGšžÁÇ "6֞z“6"6ÃÚ›ˆ ×T®I ±P mCb‹ u׉ĦŽQ_eLï°PÒ¼!±¥ m"±…›@l³ˆÍØ|àÑ ->‹×JÄæRT‰Ã–ôi‡Í³gâ)p؈©ôcÃaÃìŸì^=Q g6-W¬8l˜(›Ûén‡ÍƒkÄZqØ\‘»8lˆØ‹e%bOs±¹*”¨ÀDì|ww&6ÓãςÄ&8€‡@b3©Y]Ž8õŸ4ó] (6³š|›Åfb’Q‰ Š-QþõL(6KC” -(6·áÚy£bKq}IŞ}ɂŠÍØ}ŸoTlâTÕ³ÂTl¦¢Ø¢!¨ØüC|°v-R>©Ø0ð&›13vºØ¨ØŒ8±½Z`±iÑD',6 E¬Xl>u:{ßwFãkc±WP¡ë†Å&N¬»#£Ê*f)}`±1ê«Û°ØÔ¢PC\l8›nþa.61D»l\l˜¹€O.6-|XÁŦEíW.6HAQp±ŽQAú×êÚ¦‹M_˜ióàb“ÍǞÁÅfC 5W.ö4›s [›7Žý6.6Ìî¼ã,Òz›ÛPõq±iæ3 .¶P‡W™`l*"Ç›:OV š#Ž5ÉÅfn¨ºSËäb3FNVAp±YÕü¬¸kx—Ú ®\ìÇ8’´fs¥@¥¦aƒbO«¹_è]ËùN~X üÖ¼ïÇùiGb7Þåò)‰Øxؤh%{x8ÚyØÃá—Äa‡¦“†}Û×ØaØ·£ ´v‘ÿDaßñn$ì[½–Ý„/N öí⚃}GÂÈl¾/g -6Ô.ʏ¬ì`'4ŽuÁ•®ómlÝ4)¨ãžük&³žö†¿®#’y¦_Ãð¸K®†Ç¡¾;üšXq¬‚ľF¯*ÔòŸXK¯èkÔkÐá òu°¨’|Ý¢Qø¾†ü éÀ^SýÜÛ¤^UõìÈëv†ßiâu‹NμfŠë¸ßx×-.»Fƒ×»nƟl´ké¢캅r1`×H‹±¯÷ƺF-ÐS'éé - ü*¡â†u6ÎuLVÌ5ƒ‡O›”ëÊÔ rÔQ&â’Òõ‚p=¬Ü×˂ä[c?âo3þ·Ñ­Ï+§÷gtc ¶õé9lG[£Ýad3u‚æ溂w‹~ðœ7®5jJV -k‹@C­/£fv¦5֎ŽßӍâZ²+;@_»ñ-݀ÖådÁkŠ»µ‰³†\PSæJ³Æ÷we”‚šS|Â(aökeY»€.IÖ58ÁÄ4ì0dçXèúëäÅz pƒX³KNÓ„ ÓYØ퉳¸`CXCƒÊI1Ö*3áëÓ|¡_M€ bÆWŸÁ zõRÜ ^ + òƒ] ª のƯ•dY×ùý(tàjøt¤n·šõçÓN­Fò„‘¿€VƒÄÏ.˜ÕÍr¡Yݲ‘£‰Õ¨KàÔÀê)ª XÈ§àUà‰ÑÉA)ÙpÕ-ú­t?Ž«NXûƪF…ê0]’Ô,E7©º¾¨º†Š08Õ5©†ó1®7Huµ'’jÄ£ºFßÔ Qýò´8MBu÷ˀê“#Ø;Ÿúä8¹à©Y2¤þåòŠ’’Û¢ÞLӝ(ý;ú,·ÄpJâq ©´"yCS?Ì˖OI¦în…–`êˬv.õéDCb©‹çí R[B»C©UŠb+&5‰ ÏO‰¤¾I•y'RÑÂƤ¾½ uÄæß`ÔÖo%‹úŠîFQר¾ÛQÔÃÀž$Q[c™ j&>p¨™‰rM|ܞ´B÷£¸’oB¨QG4Euðr{ £†#¢–C“@Ýì^€º†Ÿüiö¼øiÔÿ •¢Ò£Âzˆ¯g²§‡{ƒ¾±§-_ôôɐC™äi-Éz}#OKãrµIžF˜öd„ OSŸz„%µZÔ\ƌÃÀ¢þ‰žþè²ûe†æ+Ö䁞îÎò%y:@q ž>kè„Wî4bs; vˆ:N›:}FYìA„žL0§QÖÈi.o1Hgˆ œF -˜â®àM#q݊¦ŠçŒÒcÇë!ƒåˆjŠ4šWG¢1YÓw‰¬·ŒÄùö6IÓOQDbMÃÊ6@Ó0ˆµë ˜»¬@ß0ӏ¡8I™FyšB„Þ ÿÀ ÏƘ¾]Ɍi•ïk¢£Aúà4´¦/“0Ò:\š€é4l|é°&^úò\ŸÐhˆ”¹–ÞàÒ+Ddë]ÜiLhéùçJ–k‚¥¯ÐWú -èꆕ†àºlÕu=ÙPi¢ãâËFϙ@J_¡§ -$Üu:±º¥üb¬ÉíˆOš†:&Nšñòã|£I|įÑ0é»v[0iö¢?Ï7–4™JŸ% ™i0¨"¾ _ÙA҉+ Žt¢0#}ûëÝ)Ò(ß*î\•…¬DK†4 Õû‰~"ÂiP´ŽàEWGnãƏ~Ö֙ø ëcÒ£‘íajcƒGVÝf6êP/Õ«}{»“£oñí’ýxu–ØhRžm§F“ζy†Fã¤XèÌè§I¼3£CYýDeP£×M`ô™âàEßN’%:†‡ %/;a-ô6Rƒ}EŸÊ ¡I¡aEbýY@ÑÔØ_Ï'y,Æ7‰Æ߬˜2%ú:¢Ø|…D#?çâT‚"©6`o„èáðz¢G”Ý": #zZ ‰fI%¡+dF6D4º¨²+z“£bwá⎈¯ëôÍdR §:&+*5.\ñÐX–ÁK<4Voª·rY·ìa‡CŸV‘$T'5-6š’2¦ò'zXí•dh.ó\üÇzpBfµŸrúq¥L.t,“ ÍÅó¸Þ°ÐXh“÷¼×€" -Ý­4ݙÐàvŹ󃉬\"¡ß]£ÏßÜùú¿ ý5ÒóÏÿ<>ý£¿øá/·ÀóÛ_þÓ_ÿøË?ÿá·ßÿðÓï~ù/øŸ>zÿôþùO¿ûÊæø¿¿üÏýƒÎëËo¾_v:n§?ÿíÿã×?üþ—ñ›ßÿM­£zãçÎëÿýõëGþŸ~ý_ÿêw?ÁŽmóß~ùºUÿì·¿ùéoüå‡ÿò»¿ýÖ¸=¯Kýõów¹ÐÏ¿ùëy¡¨’}ËÿË ýw¿þÕïþêgŸìŸ¾þúÇÿ¼ýòOú•w¦á„á—ö›Ÿþüõöýîõ~÷íÿä‡ÿúºÂå_~ñ'ößøo·þíŸüö¿ÿÍ_å±þÁŸýðûOþëSù‡¿8>ýã_üÉñéßÿþòßñ+öûøô/^ÿõÿ½l¿ÿÔ?ý«Oÿñ?Ÿ~õÚãßÿÅ/þä»ëÁЏÿùqþu¸ííš&þ¼ýµÓ—íX¯¿~Âÿë×ÿ¼Ffâ´ ­ú¬vQ¦pÁK˜éµ¼|­ñð¯|ÐÂ! -p\r¬).n˜¨³%™§¬voÉ^F`¼V »‹†“#ÝfÇPz½~c;,ݨ×ð¶Cu¬Âá(î…¿¶ÃNã~‹}žð<ìriïÃëÿ7ùBÿ4í^ë~xvlâƒé™pø—;t£jäµàng#ëÿ…Û[ŽOÿêñ8/ %+¾Ç4çj‡Ñ5m/#eýíÍhI…®o±w¡9öÃÂ{½û9Øøý|Õ¶sûk^wüÓx¹!üˆ*¤Q¿­vŸ «„òÆ(oFÈ òÁ.väñêø´–tŽöi?¿ÿ™sËÓþû7ú½ÑýîÕH»›¡œ×Rÿ9Àl;zÇË|²Õ.jy¯»ã¥nDÌÃ.wlžÃ~{ñ#pÊ÷áÔÖ·xßñ´/ïCv}s>܇oöŸjêù>²U -ñWûwx:ÛF¶Å¸l‹}ŽlËaçȶœÃ6²áG…Ø7¾ y?ì4îç0íË ÏÃ.—öá>|£(æ™~”·óÌÑގƒ)¥ó“Y~q1n§·Øçµ,‡W½œÃv‹01^ˆ|nƒ¦€UÞvØiÜÏaڗž‡].íÃ}È[4ïÞ>­ÏǽLëóÅX¦õŸMë‹}NëËaç´¾œÃ6­Ïǽnœ/ÆzØiÜÏaڗž‡].íÃ}øÊ[´ß¢ù¸—ãÌcùÅŸÞbŸ×²v^õrÛ-š{Ý8_Œõ°Ó¸ŸÃ´/'<»\ڇûðýGw…D¼ëü஄}ó@ÈιÞ|˜Ê:Ë냻‚‡Ý ºÕ|jwl|wW֍§2;û9,öyÂó°Ë¥}¼ßd2sô~{§S±œÃt?–³]ŒÛ¥->̼‹ 4ïØâ'l·wq*–§û±<µ4¾=âi_އ<ìúæ|¸ßj2Óô~‡§_±œÆô@–^ŒÛÕ-n̼‹4oÚâ*lwxñ+–§²<¸4¾=åi_^‰<ìúò|¸ßäžß¾¥«}¾}òÍýrwã‘"ð}Ü@{¯ãÚLJj ùþmÚø>>¬ÏO~v÷sXìó„ça—Kûx¾ýrf¿Ãó[^Nc~õË /Æíꖡcފeä™7mù<·;¼|ËËÆó«_\ߞò´/¯Dv}y>܇o¼œÙoïü—s˜Ÿür¶‹q»´eܘ÷avæ[¾Ííö.ò²ñü䗧–Æ·G<íËû‡]ߜ÷aú¨x>z’Í - Í—€ðêŠÍëXŒ›‹²Ø§?³vz>Ë9lnÒÇs›‘–+(º½­ xZ{Lo{1n®ùbŸ~ürØéñ·‹§í—užÿÆ¡Þ?ýéW{ ÷onß ìø^b½xñ~λùxÄ-ü¦llÈéëí׋5gšª £íž<€$õ2¾œoFŒÂý\fÙ ¸ú§í° %ÜõÓvaœ3Ís]o[¿v÷sXìó„ça—Kûx¾åLƒ Þïp1Šd; ½Ïý„ãvuӾ܊yØå¦ÍsØï°Ü›ú¶q•Jopi|{ÊÓ¾¼yØõåùp¾ÕLÃB—÷Û{¸4i;^e{{ãviӾ܇yØåŽÍsØooaññ¶±UûSKãÛ#žöå}Èîo·ûð-gмxmÏò€ÌrÚ¿ÓÐ\¯Ã~»ÞŒ8ÖµÎlï*±ÙÛ¤ÝÏ¡%}ü;ýÈɃëƗÂûa§q?‡i_Nxv¹´÷a yœr ·[Äù÷|;§ÚQö_\ŒÛé-öy-ËaçU/ç°Ý"8 ÷ý¼mìʺý°Ó¸ŸÃ´/'<»\ڇûðmÖóùžÌ•Ð4ÙMØ^p(¶ÇÆ÷WgÝ8߆õ°Óx~xs_¦ôæÚë‰išœÏoùéyïöóœ7zÝ8ÉzØiyžßr@ˆ_|¾Ý)^ÈÓߌ¾ê÷Û·h?ìõ9|ˆê©¾Å@õ×ÃNã~Ó¾œð<ìriîÃW„ýÍ'¿g>¤åãvz‹}^ËrØ=êsøÕ õíï·h1îç0íË ÏÃ.—öá>|“žrûx{‘N&Hl=$žñžog»·K[ìó>,‡Ý“ë>‡Éõýܶäú52¯ÓŽ_êj÷™ŒûÜGÝŸ ы}ŽçËaçÈ¿œÃ6M|<·o5\L×:œÅ÷%FØ·UH§+¦ÑNäûC^o»½r±¼»÷6¾/1֍çªav÷sXìó„ça—Kûx¾Y°[~õ~{çB`9‡¹dXÎv1n—¶¬;æ}X–-óŽ-¾ýv{—…À²ñ\2,O-oxڗ÷!»¾9îÃ7 vÛµÞïð\ ,§1W Ë /ÆíꖥǼËÊe޴Žßîð²X6ž«†åÁ¥ñí)OûòJäaחçÃ}øfÁîá¿û*ãÃøöí“gè­¾ŒÓ÷‡ñW ÿ½}™4½ sÃù±ÏNãþë‹}žê<èrQïÀ·>ì÷v~ÅËiÌï}9áŸ]Ý2hÌ[±Œ9q˖Ïr¹·ËœÎ/}yXi|{²Ó¾¼yÐõ…ùp¾qØa¿±óã]Îa~æËÙ.ÆíҖ±bއe¨‰ûµ|Ë]>ÜÜp~à˓JãÛcöåȃ®oˇ;ðýÿfìõßüôÓ_þøï>]ïq׿[èµìiÜë'ý×QÉáþ®= ]Vû—7;ºJkûåí8?g_Žó“Ïóۈs·“’ây–‹@.Œö -4€¯_”ñµ\ÆóxN ê>ÇÆѽqo÷ÇÛ¿øEëËúú©•:·qÇÉ ãs©²ßØYÆÑPÞÀß}½n6žíðÉô»åÉ°îÖ?ZÆë³Õ`ºFTlÉX®Ãçðb–#¨´Ó9ÜG\ûƒ^—º!ÌEÈ胖¾ÞŽ/¸ï]mÞôuV—Ï ÚôZøÆ¥.û³ÖD÷ÏÖ'u¥±Ÿ#.Ë7þÀR¡-÷½¼}=ïøR:¼oÏás<¢"TÈlas\~D`½î·íÃϚd²xp tˆØ¤e?hþhÛ%ÇñZkø÷Ptç÷Óý}mÄ™_ÒóÜӈŽÚ4Ž;nìו{ӎÉZe¨ókg0OÍaù¬_‡Woqr¨¬³í¬ljg ãë{±ñàM;‰_¹ãԚ ²ݤ¨Œ“•¯_=ƒ¿Í“:ûí‹,ÅÍì£Å³ª}øÉt¿ààύû<®‹ýšÞÞ×˖c"Û9úc=QUdcŽìö #û xKr¿>çð5È6JöŽQ´dãßú:ÀÏ 8BcœcËÔ¯^ż«(Ž*ñÖ@[úcڏs„½ñz? o\ÑÊÂÆ+~Ž_ÓWÏ!ï‰w lîùcØ__—þš£®O2ځàë׫§>(~’â~Ø~Æ ~𵤱 Ìu™˜¾vë×Ƕ6H1æ×7GÑÓ_SM?è<ì-‚@#9ÇÛ‡kí91”û¹b㜠ÞN`½uoþã×ìo?_îðÈûì1hËþ´èñóAŽ˜_wôþÙû¯3ÓºÆÔÌièÇ´—ËïÃÙôpÕ=ׯÙy-Œ×nÀ1Ⅷ½¶Øøê±ñ}Æa»¾Óç0}—KZ!Ï-+ÀœzÌ€$| û=ŠõZ€q<‡±Æ'CøW<ï æO]¶ÿ1ìv38Þº¢—ñÌ1… 4ž-~^yOÀxÎ<½Ü¸æx{Oc©1b{hõÏaÔô‘[‹sèñuÜð¾zóÑD븖_ü1íǜã^÷DÆñĄ¥†W܊§ÝyC½\m¯#6®éÃꕄ En¶éöõԾ䔂Žy‡ýú#?†½Åkú™6¶æoý:j£†ô™+ùªÂ^Ób‰ŽŒÝ³°oWýôÕs؝ÊøEúì9q½9]Eëµz?7ØÞbAK܋ö}p„çüCNåÎ>ßav*1H|úêU¬ŸWM§¨C²ß}„k¾/a·Ëû¯ê8"ìÀƒ|õÈù£íÍWt×;^UsU|c¡ú%íG¿–äƒøø0ãÓW<¯ôí+W -ÊÚðêX+7Óa¨’¤±ÀI’ñX_ïr~žzÆ^ŸUlÜó³«G¼ ÄT|þ™s[?â6ýzçlóöÚk¶ùø-ü‡?°ñväËEë8ü3ª¢ ö~~ {=5·Â~óË'->/ÌãÉËØÆõÄçz…‡p² ¶ïø@c^m\®š·&pÔÛ¿UFŽHè“98`OT2ž£ø1¼Üåj#a2ö¼ã°÷ˆ•Üà¿ÙXâ|{l<ãC}à¸çæ—6ÀÑ==k,6ï爪% û9~Wº.gÁˆA"ï³~ýQå¨g××®A6oYçÏÇÎåXÈ9ì@~ÃX´T¤Wñún#T„‡ôŠÖ›=ão6F`ëè1nZ¡ÂxϽoÄ4´7> /awœ/'Qb ¿Á¯Ùö£ñpÈ`Ä̗sc™_†gJŸðë¾ {+1X3'c=ãV”82ò%“%¿äæ,Ôò‹9"bǫ֔`nÓk^¾FŽ»öËGÍwÄç!Ÿóe¼„ÝÓãp@¶;|ò^ó¾5bãê$F¢±¶’¾\áã yíŽðOÉ7¸°³…EW2ÖÇ·¦qŽçk 5¾ÆÐQ§óy•œ¥1#¦ýLWóé¥/ÎêÏ8±½†‹A6~‰'xUEÎÔ5&ÞC$e?ÇʕOöѨ‰6¨9[*4hã“ÇqÅÞØZ7Þ:DF¿„}Ž²Zaó Žò•kñs¯ù?Œ:eèñ‘¼æ‘ûç  ·‹yæuf5ÇìŸÙ³çÔ¸‚ÏXÅ·Ç^Ése˜3xòÄó㉍ãN¯RSUcïŒ8,Šp|„C»ïZyyqwà} ¿Ê%ݘhæ8¤Œ‡ -þâ¾çÕ¡æ/¦¶ç¸ãG±g{î8B.q_?³ -šÑž1âܬ| ûhñNĈ|ïOŽÃ‰^hÇ5.‰¨2žíÌ©Æ/ÄñŽzéϳEmN@óæ¹µœßbøV“–ˆô:À¨>+qß¡G®gù‘SQ„(^mr‘1¦øÍ]‚½iuÇú‰sCŸt{ïp£4f|]^ò§žH ?ãJú °ÖH ]C þù5s€„]¡ÃÍ=½–½gÐ|ÜzHªîû‹Øå\«Üé~C.Yrr³¯$yúäN¡Œíˆ÷¯_¿Ær S?ZšåƯ± Ž0Ó]÷“cÚ"\±z¾OÅÐÉL¸ó»ÕPWÑy%^©ÑrR»²‡þ 4̃jž#7ƒÄ6æJ‰Šy„óŽ·„k5{¹óCÊ#ôv­þO¡_yÓÎ\Š@9:…®>ÐzÇfÍéØÉ3®â9«À>çL¼Á_ÂÞêkà’³M-‚‰Ú¿Òl\}:È!ï±âŒbžy}2ùDÐÜ(ÂE1¬ ÷¤£Mv¿S¹o¾nFðg;^ËYny¹wÏÊ?š9}Â*ÜF¡®9Øašúö’73æsë{è} •#Á‘g ²Ì¯#ΠÜ3œrÇ—òגAV4š¯1ꏡÅ*`ù¤"éF ¨ŸUý¢9®°W¸ÇŒæ©:¢;>Îð”JQ;?°\ [z#¼Hxö… ðü’yª´jL:zŽ×“É/þvBÇöԘDØáx–ÅskB„èjƪîôž4íˆq®VGÁ?ò~óï|ɏùó ¯÷LÁÆéB>w‰#Ô3Æn¾dy„£ÅÈ[«è5Ç·«‡q80l¿R瘮%Æn'! ύMc8ìqÄt~<„»Ô Åïm‹Ÿ;ìå±ïYö5´ÄG=r²9Ћ*fôçñ cyó.µßý/B‰ ¿µœ,4œpãòÒÐÛ2Ö}cÆdŽ9 WIº¾SÔö9é>‘K8S±,`ÍÍ0v& ¼ˆ74&&æN2F1§64ŒóÕ-·½åBÕ¾‘g.w®\RèÐ#šàà=zÎæWų‘qøŽU44É#`:Šxb$Ðå4³ -£:§r¨Á î9æoÙù;oÚQã'9GOcÏA¬å¢äX]«MJed<Ý~˜Ä.hv7b9/»´—''¦&ñ:”]GúO§üìî#²ìxN -Ôc‘Rµ=hF’Aâ^2ߌ/+ˆwÞxô‘!‹ŠðeÅZ„ÚåsÙá¾$b­³âšGH'Šu+™œ*¶†¹@Æ#gÆ»ÙèێFÜ4™I§ñ¼òг²eìØÚ4_M]c—Ø‘š¶H՚bK2Þ3Ôß˚Zh‘&ë~u¿ó ŠúÁµï*¸íqúÔi½ìGëú™ÒÁ+¿ñr0žÓ>î¼jȃbqÈXޗ°OÿˆÅRiŸá«z.[?©(=}ïj^ä¡Å‘·l!ÝJ‹öXXÀ -#;ð”Øx„ÑÚ´±ä$l¿VûGãkÌø·±qø¯‡|›Ã_¯ŸC°SFv‘Ó–çyϟco`]2<(k®š%rØ2C‘‹6?2ÚCÆc ”58 2¶ EdäCö2@%QdÌ9©-9¥µÞÚ< ”1òù%ìVvŒâTŒWfB]2€Š¾Œ%õ½ìY1l¬9›å¥áã iVšÝÎ%ú>jt֙ãîS³òŠt¶O™(ì©Ä÷ëxH½éw7uºOÏì¹ú"ɽ- D¤PóéTúR4_â°ËÈÝÊrf·¯mjñ¹q܅rÔ0öô–ëv„ž+éâ)ò>Ô4ŃP¡=ÿ?{oºÝFŽ$ŒÎï:§ÞsºÝíê*щ-‘Yîê)K^ÚÕrÙc¹–^j4•²Ø¦H5—]ñ½Àœ{Îwî#Ü_óëöËÜ7ø~ÎE’L’™ô"‘b/DF ;È؇QíC¢|” -gƒ Œ%]FCîuqÓ[Î}øLnëi[úÀ2‡ׂ8½»B Ò$û¶ÊP8>â²<æàªCœ0„†Ä£õ9qüqùÎ0tÇß bã3IáìÃâ0dÞ±i.8(·ÚªZ‘@CE;Z”…CJ1‚û×å‚$U.%Åak¯UáJõtJ²Ï41.×øú¹Ëy€‡í!¤ŒàtƂCÚeй=øz™ îאFžRîGj+»¸Æips¹ø{¸ã‡ºM tvdØÁ!TJG>‘û>°4óœÝ…“jÛ{ h’i(–À¼ëÐS[êLƊ˜†Ü{σ™W4®‰ú0ÓØ!KÁ¥wéú „3és2ËC¡±æž‹§è'ÂåfXxpéà±@²6(´Ë…€û§ü¹Ë}¹–‘­Ÿ «pÁ}Cŧ¢]hƒÎ2wôb q0 ”Ï|ÚOJak¹ÈiÁÃYôgß؋]Ì)AZØ[Ð܁dO)핂¶m9ä7^8J¹oì9˜ -á{i0¤…pqŸ¼!(ú6w²‘恹+/Ahn"Ž]*Ê5É|®•µe,I@ Ž)0pgÒ5¦ø_ RBkö&Mp–E}0ËÚKü>ß%x$…t¤¼Hb^2JáâöfYwV'”ïŽ.S5‹\yx³“Æ#bvy”•‡¶D· rîä‚ùý6ƒß62zÔ7¦Èœ,ÉuØ_W˜!\³€!q¶p“KœàÍu®o"¯žf·v8­S<4¢µCÇÆHúlÁ=/W^cƒ¥P˜õœX òr d¸%œ³D÷_ïJR$†@žæšâJ5®2#SÉe–Ø뛐“ˆAº@e&‹Û͒F¡¢1g.’¢„7·¡ÏQR´ô 8JÏ|xJcN¤#½¿Æƒ5#`šûì¿(fVZ÷Ž…ƒŽëú¦¼]:±®%ۘB°› f[’m3±NÍ€NU„#ñ˜ÉÏ Ø2‚‡”J*S6¬Ù‘ÈÅÿ9]ÓEÈÎÒ`±!Fª\JV>è+±®:´š’ -ð&¾p¤´ -}ÎRêAãש5bYº…´"¸PÒùéTâ5-üRœº¬Óƒ&úà~î´õ9$^`¿ñ ´ù£™;Yn’eôºÜçö% wNô$ÖdP– ¾‘í EZÂBÂØ¢”3NëGRÎræã8–ìD¾Œ²G‘LCæ3Üp-Zé.M¨1ºØœè›Ò®CsV‰C˜>ÐÇ«äIÂÌj/lç”egŽ Fz„ÒÄ픊þTÒÎeÎ - *ƒóYA7lF6¨¡*‰Õ¡9Š$d&.XÎj(’ÖŒô´ÄÓ{¢D KúxH*œsÆُèk%"sNYp” ²l\3¿æé{åi7§/ña`>ÉGgRSãœØ®’š’îB65ª¹]‘ÞABc†7¦t¨¤ÔžsîÑÆ}ð锘vHp‘/Å bÂì9Ho®¥ç2‹1 ¯Šr'Žfœrºp±ù¾Iç£I ×J $€„¼P@Ë}Ç4ó£óœ?6qwžxA.ƒ Zi–IÊ­LktpFªVâòÇBcDkÏKÌ5”A¯âtrҖÊ"=5qiøYfCjÂÖñ˜³ŒRÓàiËžíé é·ä;I"æ-#c{jü°l‚çdx'9•bÉçðI(€y€óž%Ñ|úø„kѓüIês3ÉÓË(_±÷EùTPJ`J«Ò¦, §'a”ƒŒ‹Ùc0›CÍõ!÷Jp69ðI’—%D[x…/AP óÇò8ÙЙª±d†gNIap¡ÀÈéÂüº¶;|Iyç¶ʏØû0óR[K ­Ê€AQÁ ÜÁñ–¤ŠÚ;·'×]ytéQ.&ú=fg" ªK0¸ÀˆrQp7Ú£‹y(*â¬$ؘû² j„¤’Îûh½¡Ö¢G¥¨¥Ÿ·hŠ$ âØaANV<ìºæ®cÒ[]5A¥álKÉÑël@“È¥½ŽÑ-_ÇÀCR;†žX Sùpg8: Œ»Þ¢t0ä4ËÚ¹`ЇMsasM¨-ž¨Ö4¶a¶PÖÉC‚;ىǬ÷<Æ:¾À¿®¸oÉ#ÌÊW¶À°Ù)Àw‰«p­ºU·¨…R3ª Áͯ‰n”ph=ƒ§…­¬@àuM!ƒf„H”z~âæÁ©Z‰ÖÞº q !i[kß8£jR ¬Rš¸L¼Ð†´2¥t¾Q¸LºQÈr!üJ]:`p€»ªJ”ÄnÉL\Y†ÁÂuF›Ž<™áá³ÉS'ç:b·¸«=† òÙ0Ylì‚ áuÎ.a.~/cʚq+הFï²âðu¾N¾Á3܋} ”x~âDpúSÎ&¤‰êì|×ت(x˜xÓ À5 šž!h,äN?Gá,RáP p˜3:ý`QQ'2Iϓ *pRpQ`ðϓ‹À)Oè,î8C9³„ä¬{ã1ä))¾>V+³Ñáv ¿Î(?æ2xü 4,0÷$ċi"w¿Þà×zV““؃3äJ%äÖïlÄ¯s[H×íÌ°Rs(¬å–CêO³Üçr8 ‰‡“C!HTˆÂŸ0—‘S [› ‹Æ,É’8›9é8$½Z’w…WM¡9U±ÊhŠrŸ4œØÒ -.O“¸Á_à^nŒÛC‚+á÷²‹N²l¢NeÇŸ ‚3‚ÁRîWŠN(o(‰W0ûÄ1ŒÄ0¡Qb'ÀS/ø$Iæç¾ -zÛ÷–—÷H.û!ŠÑa¤¨Ô'oª¬>ÓÅÀ3I}ÓÜg%‚ -wÁ¹M„(τÊ#qŠÑàTó*÷A¥Âz±ÝÕŏ†"Ⱦ˜úÒ#x. ísÌKÂà¥ÈT»¹”b¢\i%‡A’)MQ)5›’ˆ’èœâe•úPšv3…¬cý²ɓ0PìLb¹Çà¸(rÅÌøêÔ÷Áˆ‹öËHlˆp¢ÈŒkÞ¶t‡uêÜûîuŠb¾qQ¥Ó̽GB¦šbš«Ë‡èÈ6š$>Œ[ú²„&NCRš—B\µŽÌ1Ö%ïûòf®èV5÷-CúT’E•o2Ž¼ìJ3Šy—ޚ샡NÑ2TTÌ¢õõ½Ð,åß½k0Ñ<Šq—6ÂÙ³ nùá1ŠÜçŠk¼cÍaÈ)øØJY¾(GN9U°C‰>9t”-2ˆ9<ñÜD†Œ Xu·!z®±/zÂ÷ÔXz š7]#K'zl,P2R·…Î|³›Ý­`W( BLÈôˆR¼º˜9œc_½±Èʘ¸€Á[÷aA;`ê͟Rûðp¨ôʽRØ@{æ"›(æl$žýa؅Çàr,QKôùŸÌ{.•3 -¸Ä&üÞ”g³p„L0v>¥(ã”qr•à‰âˆÌ}hâ“p[Ï# }Ïa§!‘8§3‰È•ŠŒP(ÁýikKl0pÌÑyëK’!<÷UÃr.}eTø/¡Œ›”‘éJ8~b€¹7Ø sù€ž×Þýšd–K +ÈA|Ɲir™¤5Ý;8S®q”´Ë²0À,¥Ùˆ2c qîO:F‘ÓŽ£´7ë‰yHÉ̾ú©-o‰éH”ؚ̛< -a¢€ç0(ª -†çµ• ð’oÂÓ6ûÛÃ(0ÅaЄJ·Å3]g9Rʩؘ;P¿ó¹ÃP;õ2v"¨¼YXÂÊe<dÈóƒÊfV—Ãî*_x_€xN‚B¿}œ'T‘'2ñ‰tNHˆ4v[°.!½K78 ÷ü7L0Oˆ_£*hY0O¢õĝØ-5ÕÉÄܚ€yõ.÷´@ÅH_BMÑ]ñ4øœ(ÞíMN˜…áG—{¥ ddtò)•»t@™§TW0Ӟn.ʙ dÜ­±í)§ -ÎÒ -¦Ê¨}Y6Lœv˜¡¤$½Ñ†% Ð% 1%¡u¨„ûeÍAþ£9µ–iÌÅ$µ$w‡¤eBÄ£{^F K<¨18 {˜”ê\·V¶åè#¿ †YÌ×¾¬¦°rYÀ¤«Ã&“@2O#4T÷®’E^0æjŽIFekp6BÁÅbfeÉ©2î×Ny¾¤9 <:±°ç!ÁƒÁ.Ë]1zÍÖU'ñÝÜo ¨‘ã«ñ&ÊÊtôj1 1so¹Ï¥ßž¦1Y£lü(‚BPÖDz@å=µø&ÿ¼ôË‹hF5ˆ|•eW -€‰÷*AÝÍ´Žµ6‡YRyTïF  ñ:.V‚}À{ˆ¢úJ’ªÊ ­ê+qÒIÑ[F^µHP¸×(Ip—Òæ)[´®=+‰é«([+~"¹;åCª8ä(÷ÚÀ½-3wª˜ôɄH^»å%T_$ր’ƒÇJ‰âáo\û¢ª2#´" ’mõ!ÀI<´‚$å²£¡¥ëxT‹IQ #[\駔jiR‡-P2/œ&^O¸ð¦â,ñõ¶¤N©ÌTê™F(…ç9ù 1…öàáÄ@?˜zîI<Ë]}r0k!½Ø¬©1±Båʯ¥‘ 'ª°UǼ†8ºÔ^rÒºŠØÊ°>ÀúC; }ŒèÕsrÌ"ˆêŽ\û½ª]-4m™ª[ -Œzåî¤P®vºÇÀ½ð˜I߸ìn· AâYÌN¢#‹  A;ƒw+¡%ÅcpE9âÆi$ñSå˜/g<^¹wäSÍ#@뭉¾Ì ¹FãŠeÚg&¶´££cJ*A”ÏìēÑ?N©ÜI¹2‹ÍT™ã‚ŏãY¢‚{Ú'u¥ elÐJ©èؼ|àM¨7å}"—Œç>FŽ,D Q¡Œ;`6NÚ9Ð÷°ò|ACæ7Èê*¡âaÑ)õsbºt¨A¡ÅÔÇóøçY£™h{V«$ªBM\Ta«Ÿr_ÆI%TÚ ™g -Ëѐnª2*ýêc©¼¥ˆÃ3ªIã„«b¡/2rRÙ'ª¹iÇ|?Kî€ÂÁu')–=²#wUFRUTËRoÚÃD,*ãé˜;ã«òëáÚ×äÁÂò‘©Ä\",»$¡N+£…@¾t*óº¥ùÙÆ®8hÊü%H¡,3&ÑQæ\žz—g - –TF s ®ýubíc)¦(y˜Š~BËP|5óšHê¢êÝø%-Ú¨p©«4 萫J̡ǖrÔPJpÀÜWwz3úBÍGokÂE•BÐ~耾BF&RB+|Ιwå;ٛòÀ´óãá«ÌsË})¬o~G ‘í1ñÓqŸì¬\¡Lµäž_ˆ‹$`•Y_½rb5* ¥Ë0¡ã€8[îxw)ùŒê–:;]Á6nKP^šúŒÎK¬[R¾sNüĖ°VɐÂý 4Ê5Í}MV«((§8 Z» -QµÌ‹n -$]_®'“”™/ªe„AúýŒ6M õÈÑ­ ˆ‰Ðb§Ã ÈØOlÏaÐáλ"ñ¨£ÒZL{Þð<”γ‹O©¸Æ¯rÓ£¢²©Ø1!dfÜc¾¶vª°r_Ò «x !‹iX`T8LZuSI+~»}å%@%£ªAX¬Ø5fT‘¹êaP#>õµ U(ï.e㡄ø\éù?cezÖºObo`Úԋ*¸×¬b`Æ+€y¤×„”wŠ)HÆÛ÷b,u5½»ƒeÔ8$+GhgFq@EÿQ󤕈 ×>Û[R`EÑDLIUF_ehiæ eH;ž‰©šçÌ£MÐohœÐbÄT0×1ŸX,¤& 3£ÔvYX½N -?ƒyN†^òÅÐہlŠ³z› Ï?˜Ç`Ëáë/@ªÔëjX‚/(בZF}6¡Ð%iâdÃF É«)碄Ï¿ÎÇ0+æuÞ:Xýî;¸ió¾WÑÊ -셇ûðåÌÉ?ôæaW@Y -9 -Ê_¸CÇYÊñuùDÁLKÔGîE;òO¡í5cíuÊEJ0O\sÿ:¯{É0Š9EÞ_88“’²êjHA>ÃH‚kÖçœr¬NH©È+ eqlÄ,Ð¥RV¦Ïœ‘ý–áT S²[]~ê³WªêŠøkgŠQøk•PDîê Nlj…û -l‚n-Õ^õ%N·´îD(Ò(\X=bðÅb ¯/ÁXœšZîÛa|V¹Úž¿F‹Rµ®(z7ˆæ>\~¾N´NS—u1²¾®…µA¹è]_c4ñõúæ+þ¹îÍUíº ¸ö#¥”½œQö ÌNâKy… ÜG³2ŸÌ e좄—ùB3DZ¤WóBÕ¯‚¢mÒjWTƒE¥HüeUoŒosžy$tÆW]FÝ1tÆW›@¸j/lQe•ªÎø—†òèX—|åKµWÎý `Ìó—Îá=ˆ®'KeP—Y|I©WÑ°ìY¸¤TQÉ.d¨„„X¿¤Û¬ç0‡—J[¥Êþ”úÛ}µ´– ÏüMŒ™×ní͹‘¯]»´Û¡š]k¬ãë ì=TU} ÝNíÞ°çnº­È5F¿/А ŸL¹÷P@ÇÏ\}IÀ ½Á=aQy’é&[åkž%¡Ó\ßâÃ) !tRðp8¹pqï(tƒ![QI£–†•hüÑ¢}”© µ±@i–ÓÅvs}’—¶|@zó煇3ïáÉRŸ(iºb9e³rC½žGޙ۰Z{V¦þîk¬ ˜û½)¢´ÏÌWÊátçLžÀj“(FB…aA©D«Gº;è³alÉhœîŒnaÄT‹|õ•˜ý¹ ÚǓ)ƒ/Œ* -r$§:„€z?pêœ;LØâé%)Ü5mw &¢õI­® ö|‚,#Ïfe]<ÜӌIu>è%\‘‹!Շ ðX²­*oÝþ¬õãsŸoÝ{œ?œî¦ãógÉ¤ ªzüípðlÔLzƒ—{{¾_¼ì â_>ýäÛKü%öÇ£ï=ìõ ªO?¹ã?·¾4ß~|røíð´ÀÏ÷{ÝIo8èŒÞ®øénëö› -endstream endobj 49 0 obj <>stream -‹þÀü¸g:8êL'Åø³Ö¦á½Ñ¨3Û¦{Þ럎Š¶à­;“ð#ü3y{Yà·™Ln}ÖºóÝ ×5ð#ƒ{ð²Üöu§?uîNΗ·t.lcÓ×ü‹MÚyÑ{y>©?6jUƒ»÷øøÞÉËâ¬ßéžOŠ?u“âIorÔ=‡<8fµÞ;5MW]ÕH÷xƒi|SßlȐÞÖÒ[?¶Uý¾nlHÖ&Çxrz¿xÝë@·êS¦üÔUÍûI:ª=ÐQ1žöp$jUƒ;NGÝâ^ÿò¼SŸù4˜ÂÞ öê^4¶lÕ\0êìYñ¨3{ÁþÊyŒ:¾|>®ùn;mÀ}Nß^Ýâk0¢GÄéžó³q1Y½Ò6˜c4b‡Æ*žâôm2“胀 ZOwØŽ¾üù¼7)œÒoû+Z—gl~ešBýq]Ýi¿3:Æ#t7âܓW6Ú¤ñp¼¹Šu†ž¼ªáªú£ŽÎ:Ýâ¨Ûi´vKO]Õ(ÞO§+&hwV¼ÓYqÝ8´Q#ÍjSå—úDùå -ucÕdL¢ï³FõA4þ%è<ö“ÃFƳ/>\oŽÜ±s脗MÀVq±hàÃËbԙ ë+¥Ñ›e/àM8;ߝÇ×e|¦¾ /.‡ã•Ïõf õ՚W¢þì@Û«ZuõÏÐW+,B¥ɍъé,ˆm‚2ýª3u…¼¼3êMÎ/ŠI¯»Õrs–¾)‡q¿7yÖé­2_lðile©G£ÎåyƒEzÃÏäMTù×ð -lØ,?)F/  ë&K^ÎM˜¤ڙkÐŒñªÝ;÷‹³ÖÝO¯{xX²½áaM†¶iáaÓ¿ÝÉþp:85ýÜ®°“Î-cÓv2®?ÜÒCW5f‰kÒ6¿m]èÛ.ð­LÉtt2íƒn}ߺ}¸.iü«®dx+4ÄhTƒéÅÓî¤óºhÀvâg®lA·“úæ“θx8*þ15Þ`yÏPŒÁ&²É^Wô*·Üºå)w›î}l:½Ûtn|õ)±Ût»M·z=1µ½qžM†¶‹ó܈8Ï?û¿\tÆÅhºªþØ&{î±­ ÷l4¤ð¹+Ã?o>ٕ‚™åB›2uÈS몾¸}Ý$ÉÍe"»Û®L4óu„FÅi³œ›Æ?tåè+œ¿m儛yÂY8hg6yµlý•; â#6õΝݍ° ‡»¹wîÔ½fƒ…ÇõeuXmÇ­Bƒ®~5:Z‰ûoÕ'©=vü؀×Pû«ÿ#óôxuÐØs™5é†1L}{Rc^o.s3Š݈DÓp²oKõœ½úºÃ¦”ÏÙÛ¾ú9OoN’úM04n~Á™-á|‡ý¶9Þ)pnÀ_|¤ë}7DÁÙ0^²Q#í©N,ýÇ[®~në¦í¹µˆm»m‘ÿa®~<+F{£íµ]›CàºÍþ¤sҀ(›dØå­úŽ?¤Â÷ -·¥‡®˜=œºÏ7™ mï:lëVÒºY+ñÑn%^˕ÈnKÜ¿!B¨ŸAь£Î`|Öගk¸;¶Üì³nšÉ&Y|ì·ZÜ_K§Ù0ýs+Ì>>y¯ßÿ+qÕ³5÷ë†-å͎èý@Ùʋõš\€µaëÉÝÅz —ñw›y±ÞŸþùßçýbÔ$4þúß«§ê¯Ó ¹V¯ÉÖ»×ê±vßRç´7m°9©ýUÍöi¯ßiPrµÐííùHq×|Ö6¬ޓáèò|ؾ¬Ï;¯¡ª¹ã‰Í·7@iû8aƒ˜'¼ -yyë"¾OšÞ@³9ìáƒP]÷ÉÚ0þ°ùaÝ[_ ~˜é¦VHº»ju‡¯A5€-nrlÊ ·µ×mG=ƒ…'cŽÑð>•«½H¥ÉºÛ˜˜•“ú³µc}WÏúêÏÖ¬ïj<õKçÁ èý¢ÛÈÀ6ÿäUvEyì\{´óO^ñ±v¿7¾ìwºÅE1˜<é\nòٶŵzB=žÖÜGVúX{ø›V®ç¤¾ínãÃ'Ǧ†õgkÃô€-)9ÔàªÐ N:>©oôÚ8¦Ñ`‡m -Ó¨?[7ä"ï³QQüRß}Ö[P>lØ¿ºÉ õÖév§ÓÕ®þxxñ3W5ÈQÂuýqžžö&½×MF韸ª1ö{ƒ¢Sÿ†×n§ß}2lñ=qUC¬ÆsI}øÇR{Bˏ]ÕÕ -Õ v•7(a_Õ :ýŸ;oëÌñ“Ψ™L`¸2=±þàNŠ—Mä×üʖc}µ~Ø@©^݈ê àg£áEƒS[_©’Ôô.šÕ_|¨ŽlO­š½lë"—º»È¥ÍQÍLֆÙsv‘KuÊ«­T¿ý™$»›L– 75v©»½±KM„M9ãv±K×úœ«/oVìR“u·1±KÝí]ÚFÖ·‹]ÚÅ.íb—v±K`h+–nBìRw{c—šœ›rîb—®7³¼±KÝí]j²Ã6…i\yìÒ¹Ð61«É7_³W9Ák¡¼nÓÓ$vp7=}z¶ö>»]׊ŽlcW•´T} Ւày%5z䪄˜ZíôYïMÑ_öŠþqÃ0‡-=ÃUÈzÞœg½ÁÊ -ò% ë²èLî7‰t¹ªîbì«Æ¹1öãKˆ²ßêûš'æÖس±Ú»ûÈrµ‹°ÿ0ë±Åîò¤Å”ù7i™ÿß5ŸÍß»æ‡ú·¸½ƒgæê´¸5âÕ¯›´¦o„Iüd¥ rƒâÛ\!¼ÑÄíìãW¤՞¡M,£½íÜuéV´§ÓLoƒyd3>²Y–ä­¸Ö®¾ýìՊÀ‘xv í• üõG´Â«]‘܈­˜Î҈Øê.õGԀ¿ºBnÞõ&çŤÁQµ¹‡rS™wäíMv]Kð¸ágó&:„Ö[Í6Ñ;w~EGvîü;¿öˆ¯•;¿aFçΝ¿sç/³vîü;W2oçί6AìÜù;wþ5rç£| }žÜm&ëî\ø;þ5ñàlš)lçÂ߹𯒅¼-úýáϵg©ß{y>1 öº\ÆfŸ»2™«¾ÄÕ;;›Ž‹ƒáÀȃeîÁë?Vˏš•@*=te2Kýp::3JbÃA–ŸºªQº%µµ‡à‡ŽÑ؈I»!÷S쬊;«âΪ¸³*~¼!֗X·Ç´¸»‹cgZ¼F¦E«eÞ}9*ŠÁ]#íwÍYÙ{9¼ûº7ì“»£âôîpÔ¬Š]ØÙ¯\~K뛅‹¾ùÖÌâ=re¼3«?ÂÎ/½‹édE]òÒù@\±ùê~‡p8^ƒp!ÓT–Ýa½É¤ÁÕãË¢k¤ÜQs#Óü“W'j4îƒ7—FXg¸áÉ«Ó -V¨éÛd,½Ö5Z\»,¨õ-l;KÔpg‰ÚY¢v–¨%jg‰ÚY¢æ¥…%êzX¢œÝÉZ¢œY - R;KÔ¦)Ú;KÔû²D]ÝqxÕÞñ›b_;r:î6ØnDՙmMp¿ ƖuƸaIÏ[Qy¦AU“]噫’êhC*Ï4˜£]å™ët07èܘC¹ß›<ëôV9ä6øD^·’ßîL¾Æü~w&_ÿmș¼«·¡gòzªÖ¦ËÛ[ ®±äqÃÏäMŒ³h¾Š7l’wà*:²ànhu´£î¹AZ vWyªÔ¯·«¼qMETyã*¦m)RQÿîïÓ· "ˆÞ^Ýâk0¢‡LiDo®nDó³q1•6*N›íªMã×!˜úC±Œ§87X[y‡u¼aS½·„ßËþNÁ¼! -&“É­Ú‹øçÞi“€?×üªM& í¼h8çÛ_™ðsà ¦hú• k©ú봁l~…¢y£!5P Þn¬ù&ݙo6] ۙo6FF϶Î|Ó`D;óÍuã;óÍÎ|³S½3ßlõLíÌ7›g¾¹©f€‰QtÆݶ¨p6êt'þ·Ã^ƒtûxݹ÷/»î5ÎӋ§†¯›dÈÇÏ\Õ“výêW'qñpTücZ º 4˜™Ç®j¤ƒáѤ7i°}ÇØüE¯ßdNK]ÕP»õ •›¦Õt?hxåuŸ­]ñüRÅ®dÙ®dÙ®dÙã (YÖ@°ÙšŠe»‚eY°¬]ÿ2ÄÉ°ž5Ü äl4¼hpÔcëšBЇ1­Q€ìC™Ä^LG'Ó¾aqmJݕEªPt6%Ó³‰ª³YÆïµ2 w6禸í l2´]ÈàFø -¾/F?÷F'E:xy¼¢‚Ç&… 6X©›4Ø`@7"dpRSHÜPNýˆ¦Íuè$;Î‚án®G¶åÇðé\¥½ÓOwúé맍¶ÙNCÝi¨; u§¡n†Z_bÜi¨×x@7BCÝú¨ÃúES6WG­?ƝŠºSQw*êNEÝ©¨;õú«¨·î=fÉñƒÁ©WU¦tüípðÌ`ÁË1÷|î Œùô“o/-itNúÅ£iïԉ·Žù<Âo.‡£I„ʍÐ/ȏ3Tu†ä 'T ÷;“éņa…`Øý‹ò@[±Tjؤf)Ê\Åm¸"ƒ °<­ú`·uÒÎ,ñR…Ýïæàu¼^“$»Tû¿ÚmƒT+‘JxO¥"Þaúg:(4œ"Bs¥*xKjOû=íÎ8,刺ÄŒÔó©‚w_DÈNTø»ô˜V˙½ù8­*sÙ ø1CŸûP š¨¶=˜—bÙ_…%)³sÙE4Tø ÝXe<ö5E“%½MVY®s²rÌ"/yjGÉì!íAðز‘§yº¬:Ê ôÄ,TóOFC6¢ô‹ÌhœóìW?"f¦ÒüÈݐ¸QâÆAùªáì1dG ¢ÜÂlØ¥#[òhÅ•¡r#¤™¢¿K—*ŽP¼ëøҙñÉúãKWŒOЪd´*-F}x«R–V¥.ÿ UÅÐdiQΡčQéGÃËÓáσJ…Þ™ù­^¿¶±?oç9ˆfŽÐ‚~1:  ½´-ñC ËÚL¥Z¶²vª”7k”R  —LõÕ< -(<М+ÐNì’FØõu)Ìc£7殑ïÀšïúŸD4Fï,í–Z÷Ìy §+­{%cëηÃÉó¢;žà**æO*2ÖNE -»MäI:¿Iî=~äøȋ³áèÂþFËÔ¬âÓáIq|ïq~lú|4yÛ/ŽÃÛË«^ûã©eS|slú”¶„e±4YX°•§f–‰m¤Û)þàÝ=,^´â:°¨Í·òüÍÂ:KÃZ÷¨àInW¨tk ' €:›Ý3àe˜ßZ¢¡ZkêWXÙ,êZl–,wn0\ÀSûàï/A¾˜eóÅà ŸJÌ«X’EáYÒô]ûuÞ%ÕÌküá²Û„u6áïžÁ;J•)+7SÑY;»¹/(fAslb†ÌñšÒ©1 jà ƒ/å7E½;°Ëúéu°p‚ka8F8ç"VˆI¤Êè0€¸ngIŽ¦ª¹'-“R¡%Žä"€prmCsü© -@€LX‹í!cPjtc\#MdjÙO®@°5o•™ap" 5Ù<è-‘<ô¢fÀò ¸'”90rĝ DIÕåò3½J¡9Rû2úîŽ;:à`ÀQè;Àœ[†çH‹>˜˜gZàXad õ!G|­è;PÞõÅA\_͎”Â@é«À÷šÁÀô …饧íZ*-,Ë8øKDK"ɒÄqN£&Òôۜ™rQá„ó•YÏ+=ZòØ,M \ˆÔ75ï04ÑÄ|†§¨­efiêŸL@Š—€áYdÕfݶeÖ²¿oÉJÞæZ ä‘õ›­6û00ËDˆx([Ï Ž×ºYü<¥=½d[ð)ÕÚîcó È5øîÞ£ø£@Oh™]iD®4|—¸ãPÝtŒ^ã0àAӃ}‰ûÞE%D¦å[.M Ó (½…@Ô‡ƒú93« šçµŠ‡gžÎEâŸ223a„“¾ú·Àõ‹žvývØøL;<æD0| =M_=v¸·ÓÓ®oå¾Ûñ,>LM+.UK‘L Ç*W «Z%üf«{ý‹ê–Ò±ZÿD§UÁœ;ð7wææ3Æ[ì0‚Á¡sËܳU°èÙ3§ÓÁÖIò ]÷E۔d…9*SsV€èÉ%V|éì²ÚnÁuI²6·âuï{Ûúñ[€üÕ¯‚=Œ Ã~ÝNÿøñ|I#نöY´®d °O·°C÷;“Ηf·ñìÓO~|üÉ¿¼óþÏÿ,üÏÿßÿü?ÿóq~_ÐñÝï»ßÿå:¬Ï忯Ú_ïöà æd®€폞}h`^ß.”}‚Ø‘·Nùåm ølY’¸uŒ\9Ç?~î¤ W”?BthôsÏaï"âãy”–½q`©«‰] ±7`V™iá˜ú禮g—§ÀSûç%Bç%“[ÇU²I%‘€¡ZÂpfÑÌ (4’G –y!%#1åÖ1*0ÆÆ¢Š‘%×Vn¿‹¸rëø]–[Çï ²Ôíx¥Ðrëø¡]AÖsg=ô‹Ÿ·o„‡{[÷¦“aËnÉÞ/Eð Í{מžŒ‹ÑëâôØ(Ƕո¼}Ì|ß ­œçvÅφ¡%‘›#œVæƒQkÌJ  8S‚ÅjöoCƒ¨É©È4Ɔqž+Òº=0„Ló7KìȬáÈ,iü…NfO„ ÀC äLÊøQ³ ¬I€°GìƒC怼Í`Fg€BcH¡7¬%È÷‚ ˆùW!ÌYì Â£~Ü}Á^Tь”F¸§!0•á¹‹ Ex¦â.՛AB~Üy³Ûó4Ëʽó¢Â£y›i­E„>†øÞ`è} èæÕ¡÷Óæ{O9u7žq?(ÿh¸ÃüŒÏÑÌم¤i"SV¦e ´ƒ•†mK%"‚H`R—‰©Ú -í³%bª¶µ©…gUÛ°Àx%DOJ‹(Áp¨µ§†ïALHßט’~HþÙ0l‡>xJÎQŒ,læô«Å”ŒnÑ·YF»Ìm ӑLÎì)؋à",QÒ|̅Ž°hŒ]øcˆ§eFȁ‰Í wè=E|/Jœˆú[âD4¬À‰üЉE€À‰f©vHöݬĠ.Ê0«áE,S9ð•—(iøK|( VYQ"/dðr‘E¼!JFÀ@ɆÐ5B/"JúîF„ôc"XµÅ'*ÎQ‹|›"OgˆÃp˜Ê`Q1ÍÌÉÎdZæ’Òœ– ×% -3¤DD$íTBÚ¯Gˆ€èÃ`ˆ3ÑÀ¿>"žïfDÞ´Ô͈x~,þA?Z‡9úNě£RðÔ 2ó—©L—dÆÜ¢™“$P¼ÊÛF²È‚ÈHßc‰‘`±ÀžsB_ÀìôúX\D¥,Õ%iþZ}Ï¡_v‡¾Ÿ‘¨H XR Ï<æÀ×TPɏĜ˜xóC$ÊÁ Z1ñH ‹‰Gb›Ž;™1ñ<,"^³C$Ԟôþ˜x®›1ñh(þ9OÂ<ñf©4# ÆÄ#˜"‰Mž$\ÅÔ#),¦ÉjþA'ÌyÌî{L;E¤ ;>Bë)@ïŽ)G}ŒIGñúáêàI7K£᯴i,l-wL‡Íç$©˜t$rŤ#ÁÌ?H¢›GM€˜xQ/‚Ù1jOzi׺~–¶­LضD¿m lÛ:•¥½ˆzÜÓʎä""ÉN鼌‘ÎKbó²!ö€ˆtHÃp|5QÀ¿?"u3¢„@<ñF߉l³ô)‹wÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(æA`ÇEXiÜôâˆZÔ½ˆZ4ùA;¬Ñw¢Ö,]Êò\D-Ѹ2PØq“œQËIS±Hà" d„”¾GÄò @¬„Ã"¬4l÷ވVÔ¹ˆVY`õòCvH£ïD«Yª”¸ˆV¢a‘Èã÷£‹"Z‘ô‹$,ÿ”“À¹ŒO®gô昧«ü93àód•Oǀ×õêà£ó~pÏnηƒÐµ¼;U4\:•nŸpǏy´Êõƒàuœ?øàœû§ mà‘ͻ€¼–¨Š‚Ë ^åš7ñ™G«˜Ø*‡ø‚ý,\|[b…â,–*T‘ÔADG}Í\å¤*XxËAï+@ p%ÒÖlôtcPÉÖ類Eíf:[g›é¶0Û*…$PrFj¨’Ú’^é )ÀõlxùÝeéúÛʪøÍo¾ê†ˆÔvb¶2§½¸Àʈ>óðy/n´'²¶fømOÂM3›d‰ÿêb\᳍ŏØÏO|žF¬ «1ÑÇÃÐ?÷-ƒr]ø­„Æ¡‡ØC÷ÒCúHMèQèi<èƒP  ²'rÄuAÝõö3þȰLX oƒqIðtáî3Q%hôÙ=ŒÏތîõu/· -=ñ2ÞÂ‡Ñ -ëÇaß½‹òG×ßÏÃxâGYÄ -_ÃP¡OD„ß¡Ã÷q‘/<™¿Í<ñYäÒ¹a ³WùªEm5›½¤c)ÞÙë|âårõ…¾1/Êč‰ÍE4CÑÔEÔ'âÓTûխęىç-êÐÁû¸²—'³—æf¹°´T¥9©ï'¬n­óùËT–âÞ¯›«Ù Ìh.¢¶ç·Z´…ÃÂÞ +{vCÆ[ÕMßAigÇ~/^‹èÏÑ?MiÔXìŸ%UôwµÖi5ýâÞ¯{–þïX5ʋ™Îᆲ³Žkޕ1äXæ3ópŸÅ8 ÿK×µò± ËbÁöÄ&ÑG×â,šc*}J³ò2˜_ËÊ¡5,6-Ú¹6<,…R·6 -vûëK??:Zz«ïT<àÂU•¦xz.2Jc·0Ã$L†‘ʵPhvÊPG€;Ôs†öR 袀J–†6¹³„z, Wu1¡ËÂ̤´a_ˆº1ÞD€.¦2ÙîøFÔaevTÝ%…Õïüøäð»Ç÷[_¶nw{£n¿8ǟµ0ºÒLyÀüXž]ÑN2†&ÓTKaí(I[dÌì}´*—äX®YùL%¨Éø²l›CXa¹I&Á€+pz¥+ɘå ”¦q"¹¡¦Ág+»º¥ -~J Ä¯bÜeÌY €ÖiêT4Ó–áì9ø[ðWkˆ^I±Üöìhæh·¸™+fPÄÃN#Ñ ä¦mžæ ,Í,řۃë4lܓùM§”©vJ3C×} „EÁmEEb®&M¶~[Üü"t¦Ü©ƒù~®`P -õ‹–d†óÀî 胗Œç¹Ên†öõ/s˜Ùãì­¤™×«¢ÂœdNÅS^Н¸_8 /¼åõ/ûK°\.à³ÚŽýpè_ͨ@2O £E(T ±:3£&C"ü–C5uûô*C¤M;Ãcœ‘8ËaZ)—ޝP4}‚¶šûJÏ{ Þd†¨qÜÌ«g,’ìèa”úô:·©Ç‰3¹¤^†fá¢4‹ýÀ å½i=iV’£ð’“j§ªeµÆ³g…¾SÕr‘¶Sºë'¢ÙE™–^ú]ð1žÒñ¶y3”âB5*“†ù3=çœQ¥âæ-°ÿPDȕ½mǬCÎp×XE"I\Ö}`uÔ,EyÇ,d #éÎ$Íý°R7ªá7a#Q!WÞì¸f„@{p¿„ÙàäºKe[¦)^èeúmGŒŠ`J“õ¹cYŠ»4Ã&dŽ×TU6Ù–ÔÈ3ØÏÌÌ(Óxå>gD'˂¸3À5m"·>³¶”‚÷˜W!§‘mÅ~Rè;j£FË®áX‚”ÁÎΤ»he³¼è ÝÀÝDöÖ5 ¢.\Ë¡„­(kX–µ— ÃžÂš¨6\Ù  û¼2ÁÈ3 ïø¶¡:x cÆ©­sÃl1ia©åŒÀ’X˜™¹Ù;¨˜ÑP¸ÔÎ̃º£õ.µ“xÉúü¶@·W†#5ÄÝꖄ`^eïÎâê†7¼èœ¦cŞùT©Ü'k(öVÏj[ŒÓ…Þ¸k…S…ÐõÀ݇4$ã-<øݚñ^ ÿT™ýÎ¥kLx= uØÜw0Ñ»y¸Z§â Ðrë2S¿ï~‹ûŒÔôxüEZ«zayÐâ×Ó={%O¸7HÍ~¥Þ-Ò¾T囹(7Òàa2r‰¶?b!ây} /¤ÌV=šæx¥Ê¬ŠÖཱི:[½÷VÞx:ë¯,­’‹è»_F¥E¯ÀŠêW/~.¯ëҒWÑd—×_Å*•å%ù>\hD{QAÀÌÓ^VÌ9”á†Ìà另ºrμwNO¯õÞÊ9wÞ0¼N‡¡˜—§o#Ù@Ùéô·*œŸ,É+– MËEå¶ÌÃuÅô@(zè̽JT¼Šž¼˜Ã _³y¼ è¡÷ês3b^T„A…»]ù ºâõEñfrRŒŠ^÷üøáðÕt¼È!÷uŽ,M*DÂY­½ÁF͐˜J‘qaäÄï-:RÁ`̈́áCó'«†k)‘ObFÿ퐾íÑ׊oôelWb½tf¶Åϟjp.K:¼Ã·Cú¶G_+¾Ñ—ñû[€ ®°4B^eÙÊáBÂÓɳä#EÁ]õúûË´õ°óz8êMŠAë¼7øezöÏÿ®¸‘òãØØ  åp©(½ÕÙà¾ÄåE0{уÊíí`"Á$-Õ¶ؼ²Œâ£ ÈÀå˜hœŒ2™¹3ïcLÚ6Ž† ó°!>’Û !Eš[ç/hÕÚZz/·«f+°Ñ¨Át€F͌¦.ÓÄÞÓșÍì³õ ²6*@1-@ 5/F¯ª […†‡ H ÀiQA¶Üàî߅Šüò.jyö–JßH™™Ëxƒ‹-r^"˜R :‘Éü5š¸”„yQïèm…e £‰qá2ÇÉR)SöŠ?a«¨¨Df(Û(×ÜôhçÄî$à =£CZ'3Ü·‰šfƒpäL /^« Š0{¯ Ú<@‰‡x×'þÞC}Ï]­Àmi‡0 O¬ïgÄ,¦`"¨“ - {°\$W˜p¬)Ö´”æ„]¬JhÓ & I˜½­&í´ Ì\§p‘´5C ÝÆ5ƒAæÖwOˆÂ¢Œ^«)5ƒÓ—éÐo¼—UŠÒà`ûk"q$Àð%R¿J{‚‡}‡ëDõ;T“žM9Ü˸Ù%]̃”`â”ј©›° ¦Aᝊ)ûØVl05dú¤f‹HeDleÄ!‰ŽyJìßèßW¹»Î‘@f›²<çx½dÆrëÀt*ðlw†¸ÓÁBãö­ãJ^ÆÇ5¹>+ø€×äh¶3kñ4›Þ¾W‹éó5H—œãlה·™u-îfž[‹¿™£¹‚ÃYhs‡ÏÍq9­àsF|^‹Ó™ç*xb[ƒÛAÎÎ:üÓ6×âx˜”¾ϳë}®g7ÙZ|Ü<œÀëð>ÈfnÊý ¯uŽÿì;ÇÁw³ĄÊà-I½·ÄYöðò¬<³…F™×¥!` -êŒ-ãG 3ù–5`§f•0zôÐ -¦h¡®‚ È¥ˆ­! uêBO±# èAœY˜²yPԋÙq.95*h€1\fë ]4z™õÈÍÒ&‚FÝ*9B·*¥Ç+耥>UÐ*^]«¬î)8˜ò–4{#ÍÐê®9¾–Kþ‘ -ÙèŽ5A¿žzƒ‰é÷ޞƒ£žÿòé'ß^âo™ýíYjþ}zòw£MS–[û£éø¼õ¤3è¼,F­§£S0Ú¯ø±e=èôû½—£Îåy¯ëš¾0”¸Óz>œ¶öZ¢õlÒ¾3×ø³–éñíêGŒ†XùÌLë‡G¿Ó=7©ø³Jž ÏKüixÞ/ƓÞلڝî[بԴ3ù¥0jñàeAmÝ|Uàµ8þ4*zãâÎg­¶#·™¢2±?ÀĝîÏtf&ê<|…Ïà0°ÿÀÝ!àÔ|­{÷GfA÷ DqØ;1ÛêøàÈ´Lö;“c;¸gCÓ©;´ó#zÏ9˜ùhãêrüŸûïò¯ùòÒ"µ/7ŸñöÿÁrþA; ÂûEK”Þ^køï{¾ªö®F¿ëà›á€-r=è;-ú/PìNË¥šÛóŸðO|Ìá,ÚîŸù­NÃù¶ø™Z·Xù«˜û -ÿ…m(ͬíނ ©Ì7q„,3"-·´HÒâLmn3³x4yk&ìÓOîüi0üy€ßà ½}¯ÿv<î?:ú¬uç[3p\ݹgÎâׅotç`xq94 ôa¯o†ŒÏœwzƒ–mbÁÖÓtǵùú;ß÷Æ=s\"Ò -$G“N÷U#$ûq¯[Â0¾*š àøSÿéÈ= -XcáÐa8y^t‡æH<Å_mCGV( …wîg­»­O?iݎp¡dp·…/où uçYg4©åÁpp:íMê p9*{#Š/¥—¾^ƒ§§¶²8’8Pì©_hŸÍ¯úÖ_Y[;O›ý¤Ày§ÐÞ „ÎPIû©uÙÈþ MghïûԀòWE.8ғLbršAäù 4³7ä¦FuGÓ¼QÎñöÜ,—ŒeMmôëÑh9Áöû…9ÈÞÅî ¾5ö^4¦€bé Ì3ÞÝ)tÆþˆ(*X&j/›À-ßKOfg؞¤Ž{>=;“Ïp^¢¸ý¸ßŸ¢~5µ‹7Pcɞnpk -‘шƒÉtôº»ç½âĺ_¶ a÷œ¯Ì;î¼èMÖäᷟN'c£²Eb÷{ãË~ç­ýúÙgô~ëÛ,Ýl§j³£ÍÝ]ætû üÊxþ"ëÚÇ?ö¶amëS-¦¸Œ«£ÞÅe?VNØÈ2 ‰¿r–FêÙÚëï™Ù…“ZÝS׸{hߝô»“~wÒïNú÷©Ý}ÀÈ«°f1ýÁ±ê£ã9àm GÃëßËÑñ ûª´:'#ƒ¸Ä'ÅòÉam&·.ÃÖmˆŽŸŽ—l†­òÆÚ*߅b;ëYm–”m†\½ÛÛ¸‡QÄJ„†H?󁫭äôì,JzÌþ½ös{pÆ7½.?5±%èMÝI»Ó»¬>5€œ”¢õ§Î`RÔ?3!õWetf>_ufÞ\^–ïxَ—m¥#=cdP4(ÆÖòŸ—_b™È£§'n–ï—­™ŒâÖ*Z߉S.áò&ü±Î¢ºóݠמ BLŸ7¨6¹¤â_Â%Ëqß7—þ“YâVO‹'ryjæ'¡úqB^~úšhî2¦­z\¡¡BÁåCFëÔy®4~P { -¦gÐG¹~öòe¨2­·?¢}Ñîw€ éÚç«øiÔt1}vÖ9mùàõ&AˆP¨®óqûhx6ž I$A.ú½‹ÏÜìã^úû`rÙ`ûì“Ïá[}˜¸}é.ò\²WEʳtwd¬sdpôk~”#c»š«bPÁœWU0O’å5Ìm=ïëœíÀgêËïÑÇ_Dî^Cêj²¶¶`þEöÞ§ÿƃŽºç…á,e:ÓþW1ˆDš ´ í,è+ì_ׂ/\ƒpاSøþ¨?üy•Ju4¼lwN‡?/V£ÊûèoBèF‰mD¶é¸xvt¸ßŸŽӛÜuò.¦ôq·ïT-¨IHÚîe§[6ñP_IÛ=é윳””:$¸ (n=xsÙ1Lu¿8ŽŠÖ÷F'=âœÏ׆'÷;/ÇÝs¨M·‹ÿÝñámæÃw}_Œ¸¼yš²àËNÏ24oâ{]Œ¬‰OySÈigôªÜè|8úå3‡¹^w<ê~V¼Á̝í˜û{bî5¼u`–ÏéO++æ´J¶Aœó÷âª2k-,ªƒ%H N£¤«+™>ëô ³í0žÔï÷í¿>ëŒÇÅèÂl±bðÓgHҕøô“gÝ**AjÒ?ÿ‹~n°¥€wüÜ1ÛØc®®äuûù£ýÖóáÄ¿"IÜ-Š¤ŠÉ¬Eªoþ¨èŸøö)×)$ƒŽþùßßR1Û›×ڌ+a“4ÂH၃·Ð~y%l F¾=Os›: ×e»ËêX¹ý“ÎK£|wü#,ÍÍpa¨:Ë5sp͙Ä"—Zº,›4ÐlFé6ÌÆa[¬_ÁE¾ykÿ+©ótj/D“\â+\퀡Ý9ÖÑÌ]IàÒ^ô€aØ¥ÃÌ µ}Å3ƒY¤ÑDjÓZध™¶ ÅIÂì2 `|á;[Fi`¾Ê“Jxܐ³’4ÅÎf*U.1y.üœ!Jè%3ÿœIŒÓRH¸¯¦E3a+ z)ðÇÔ¬Û<ÅØS&ÌN݄~ï¥ò€S*&\¯Ë2鐹\Àpy!a=2dHGæî4Î,ñ†N›u/lÈ}FåL5tt#É1ÓZ¨ õˆÙ$aWSžˆÌ.yåòº5QÑÐ-Q¹_E2çÐÉ4 Ô2eÖÈfpi\#pŸ$Ä鶹 å6hùpKM‡Rá¼dÌ`Ô2ìªT@[XÅ -R~°¿ÂŒÜæL)Í.)nkþ8\Ø9 ӑ†é0ÂÍ#„„뇁€X6×ìÄ$Uv¦Á¥+ñ¦[6ƗýTØ3ÚìEe»a–µÎì\0šU?L»Æ&!ý(‹peRb:XždØ7©´Bw3,Lm;ç3éÒùÎ¥°¡™ÒÑ5,dI»Š¡oœ‡í–i%NŠ§Ò›P#w7eÒDÝaº“eø¹ÙM– (‰H„Ì¥ÍÁ›;}•ïî|aJ‡é¥þ¥µÄJêòz3ƒf ⾔Š#RF P í a‘ÒžÀ-Œü#aý*Ž]1 …¹Ý–ÛUÌ9ËÀP!8À&W¹=‘ÀÆ5ý S+s¥°'†9ÀvKìÈmò_Ä«ˆº 7¿Ý41m&Ãv3¼ -0âè4Opm°Šã"ÉÓ£5Úfútâ× S™ACÏ#öÂÌ -´Ä”9·7Áfpad!:öHi{éÙ 'ZæI|€k¼e6‹Üi£„3Ä2e§€5U:BN gá¨äìO³É%GÆoNci}Mk&…ShÆiH ë9ÝQÍ°s‰Ó va›ábI3[é"µPd-VR˜ -ç'w°Ž¸©°Si¨…b€!¾Ý‚†ïåÈðýaG'€(v†Àa“œExá>3`"â5“‘!:s”KÄçy ›®|5ƒ7ƒã®NUDÒT[n˜á¥ì˜Óe…´„1̛ó¬ßgãHOpC •â& -|V0•c¤©ÌYf9¾0箩<Ë1š† -pKˀ` Q8^RØê O¬ŒÌ)vwh™ æL&æ3ž.)ðÀpp :³Ý¹S:¸ð܊˜¥0Î^* ›ÇÃU˜í€ Jf÷²° -àÔr ÍÌ,]"QÅL™MB4è-™Í®à¸Q u”B‰Ã±nǚ‘9RX"K­-óÔæ0Kí.Õ ÷mjäIäaœzÌhÓ%..É"F dԴ՜û¥ø/Z$“Gb~µãgö²?ö.. ´e%×°ôðÓQ÷¼wZ5÷MÁ÷ÏÙÑм`T•k¸Ñ£aÿÔƖ¬Då›Zd‹ƒ×# ¤n[º§–ÕþŸ}ε¥ãñö£Qg:žLÏÀ"ÃZÏ^6TÌì9:&¹² !MSäðFóÊò ³ølpˆv¬âqzX|Vu$i¤¹´¬NØ(¤–t"‹…øDܳWµÍ]\Cz§Oí­î”ëYî ÇÕ«Ã6ã†(\h\[±T§Nx¤´ÑHÌ%údyXr,šË'×£ÎÂLi* ¡­™f*%æiKE%é,·ŽGÐÚïO‹Ößnë/2ñ…Òß>sö¶7¦Kúd`SPd!£Eox:ê ^Âã†:€ ©~GU3û–gûÁÞ譊ͮL:ì'eÛ뼧`y0ħU•yæ’i> ù‡ŸÆ·2ÍÛPmÖ¼Š%ñ¥ñ€ê_lï;ýÉYÿŸÿÛ ãxøÚÞø¢srX˜Şù Å›ÉI1‚NLJ¯¦c>^~wY\/§ÃŸ°_@LÎYÑ?=:ö - Ö^éá§ôlg2½cSzúa¯Äz~„„:ššæw}×ioòª3šà^zƒWéÙøg°AbŸ±½÷Ž^<€o™¶v^G=3­óÞà—éÙ?ÿÛµ¼?šB•ÙÏænitäZBz·xî»S3ËÓÿ^pI°ÐÃיË.ïüøäðÛái±àç»­Ûo.úÓ`Ï,¸Qïd:ñ—OÞ¹7u>*š÷ô–¨|”Y fîÓ¤ŸáŸI¸JóöoããםÑønTã=nûºc˜5†Æ B˜kçz3.ÝxRô§fج¥ IŠÉ·H“䊛q-;u½4ÐþÐlïÓZƒ¤¦ïsQ¼;!ØrBԛëÜc[kgԙÝ+ŸüæLáË×õÙ´½‹ÆÙ5 -ñðâ°¿ºD¿wÀ³ g¨a4õWêÇØ7GpÊõêÏvmåñÙÏ×`}o'Ã=ç[3÷2ñqR Güsï29kL¹ky-·LeÛü?[9<£G¾<¯Å]|Ók1@•®ڛzõš hOf«gëm­!½½&Còñ„ Çs2œÑâ°8›<õŒ&[kxó])ÙãÑp:êû©|=Äsº]‹~\“Ω‘¯ÞCgòwî̯N‘¤Öš‹Z#ȟûý¢8…µø}„œFÃË{£¢c£á«NüÙ=©Á÷ÿ þgÃÞ`‚ºý|Ú/F¥ҙ1û EúšÁýkžœ} ®½ŸÍúŽ4iFcyvï9qWÆ[{ðOèÅó¢ÿbøÜvÀöèÙp܃ÎãÏÜw*©ÿ›eÇ÷F““agtz¿8ëLû±ÂÖµABUg))üqÙ9= $³/ºÀêòeØør8™…uú=â!š¸Ýée¯MÇ,…P]”²íßãÖ½édØzÞOŠQï—bë½ÇŒµhEµ^ ŒÚ?œNZ/GÃéåò¶½ñ°ß™­ö¥|ýRë¼uÙ¹,F­qïbÚ¹ïaÿB“Ž£`Ët|H=çQƒÉ¨3_v̆ë¾5ýê|~ŠKž-ÄÖâ¦wÓÚm_Ž -¿«W6yëHªl’EMY܇•mã>¬lúÀR‘ ߔŒ®ÁëÎø(‹•¦òÙ¨£×E ,Û­§½Iç¤×ïMh!ߞ߫øœ·éåkzÙzØGg€™hD8iÅ:„ÿÞãs¿qE´žfM£Å!’Ò#O§“K³ W<$ʙïàagðrÚyY´ž /ýªöñúúÓNÿyq9íÂ2W}1¼œaªÑÏA¦åýêÞãg‘-ð0þáÜðÁg£áY¯_ü©x;;!¥¶]dHYîÎ<Ê'ÅiM”Ïî?¬†|¥)Ž÷vÒ:ó3ix@¿7(Z³2*ÖNUÓ1fç¶8ãÇG†Àš}2<õjÊ4ñ¬g¦ƒ—žLÌ?~ØG¢ÀÃ2šmûÇ¡YÃÁc@e ›ÃùøàÍ$ŸbaӃ¢ßöΤ¸JX™Z†õÀdsÇw%èîÙ‹‡má6lÊŸv`F[‡Åk×±]J€§—nXÀfL4~^œÎ,ÂÙV†G„EÂæąÙæGÝN¿êJ£EÕLz-3¬ÎØS?Ïؒ^î‡íÇS_Ü´´°´{©w+f¨DKÁuª—­ê@͕M£!ePù ã¢pAé¼Æ‚‚)Öï -sÆ«j½}{Ì8óÖä¬>R¹â×x.ÒEN‹7{£ñª.Î>sTt‡ZG:Wf« –Ö§ °ô÷ÏRmp‰Wáp²Ã 7>7Ë+¦oý-8°#vžç°Ôšç€¥æD‡ªg Øj2`š£dbt¿$YÁUMÃUTIN¤Ê’\t4=1ìÃá`2~œ³BŽš‘wºýÞ¥‘ÀÁCóÆHà/Íf÷zYÖKŒPxÝ{mzläv#mFÌvÑk.I8‡øK¶ðoѬæê²Æ€wZ\~‘ϯ­»ðpHá}s‰¥A&<4ä Åùñ}bµ}Rœö¦‘lÿSÄwAŽlmv™²Q&@õ)âHA?é`>Ü|>/Íç\Û§NÖ=*ɺɢf/‚ô/ lcš;ßÛ5±?»&JmŸÎ.ÕÄb­ώP Z¯"—ÅY“^¶ñj‚•Û- ˜mT“dã,ÍXl˜ þjõ¸ŸÁä-c+–r õ`á½ó÷áIûÒ(š–7Ó±¹vðêN¿¿¢ÙøUïòÄ ôÕ 7žm7* 0g]­hÚöûMW(ù³Ý¡É°è™Èñèl@ño†'gÃV$±¬¢xDÜû¡8¹ó}ï´Þy24çÎOËGÃ-uÙÐ8×ýñ¤ß>µ¶>…'ä -ÁsîÈR[ç¡ËÓ ósP¿_—§õÑÛ`‰ðHÕz¸¼¹vK:\HˆÏUÛםm;3ÉÚÙ¢†%/^ÞÖ 1ö.̦j÷ÍQD:G;_Ñx2ô†žL­D=Š:’%ª\zÕí­ß‡¦âþtÔ=o½½Ãi ¥zƒ–¿X6C€lPâÆó/ìΒsq«-— Æ…%èfÛÍ- -l†¶Ùìæ´÷^bó/_Æ;Nœ³j)Nl‰v¯: ;ã“Þä¢sYŸã•'f~ìýQû"˜²51Z”Acþ²AS^ß%^¯yeóÑi{8‚â~1Mµ<3§µ/³‚VÏÊf—βtaà‹_¶—/F׈ÂÆ"¹{¶Ùì@Ûʆ¯WŒtܽìwß.ac¶Qw0§Î6š]&ög,¥™²~ç²9\Ãe¸|yñª] @‹_Ê®¡ÙØVY¹–±½åïÑf©óÙ(DϪX"´5„·FUÝù°G¬jÔ /Wµ9«gdˆUí@C>µb¯Ø÷‚ú¤3/›Ò0 Ã#ãC©FëI<®UãC©ú<‚æPÙe<ӓ­COj4Ž{Rµ³Î“öiG´.GgÃÁRvíÆF+÷úªÙ›ákw¥Ð2nŸô@š\6éãö xى<â Zu:dæšsi°[ŸuÑC¬æ|¦áø¼cÄùbµ U1³¯ç¹ÑgZÎ4ÓU§Á›ËvÙ@Ý«j6ÍzáÐÛWÕôå\Ó ݑYv;-ihN+šö{˸‰iކNYï]ÐrxÙ]Æq°ÅxÙôc‹ÓiÐã{ÃeGEëÞô¬ÿÏÿg<¼\¡Ï +Ä£©k&Øìl:è.[5¶‘3#ø•³âÁ‡:ƒb¨V—±ÙJí£{ËZ·†Fw=m=|úèù=‘·þvûñÑÓã©Ô{üKž$Rå–êƒF*ŒeÇ*qÔ4….²V7"+]÷âí2 =j9œœ¯ÔЭ¸ZµgV%Ťg/µ¯d£%ôÓqqØEŸBµbžŒUûØ,¤‚sþYïMÑVŒ  -^Ì@È÷om_¨’5ɳñK#ìS‡`Lº7²OaxÃÜSåwY£Qã—ÙÇj¼­y€Bd$;ê¼.ží»wÙ/îÍVVÚMþ¿ÿûý¿ÿ×ò-ѼêÍ©Ûþ±dmºvÝÈ}MÓÿxðªY‚ñ¼»:‡Ïî?ÜûÞ蝓ÄÊáåĚ ˶Ýo†'­§ö§ØJ‰U"khÜ,rÎßÙïî<~œ©ûŒ•ÿöô7ýü÷?|õÛ»¿øFüæéÞþ×£Gç_¾üë7ÿõ‹Û¿=èuÚã_§ßýñAú«/¿þîÑžÈûòðo¿}òõhÚÕð'Ù-&寒d|ÿï÷_~‘üúë»ÿÑþÝ׿ÿârüõøOüŽyÍ×wÿuD­¾™ì¿üã¿~ý{Yô¾úC÷~»ýۗsï:<ý³y¡¾ÿð֗ú/&÷ÿþÓ¾üËÞ÷.†‡c3ï“óÏÿþjúð¾üõûïÿöóšûgÉ7'•Ø~­ó3ýý¿ÿõo÷^´¿_üָݗ?}ýûWúúËqûâóû_ܚ>¼ýèô̼éõð?ŸNïŸýôƒÞïÝÿñ˳ýóÉÁ¹þ +Qä?s¿Ëÿñõïÿí·?XD¦ÓãƒÿxùCóé7ÿ¸ÿøôñ¿îïeÿõ½£½_ l'~ìœNÍkò¿ßþ¼û «þýöÁ¹<¾ûû{·Äo>ßÿö‹ÿüüëƒß~÷ð ˜þîßó«ó»Ýnç|ê}þàìðܾš%w:zÔûõ~ÙûoN÷û·þí·{£Ïÿ6½wxô›À>ûúî7ç¼&½ûýO_ßt{ñùWOîÞÑûª§õñ™¸7ê>fŸ¿ú’y”Ýûߌ¿7”Ó¿-ô"9ý²wp§c&™=ùêöÞÅ~_?»°cøóá­¯ÿþW?<ø"WPáñþ㿦¿úƒ>þÇç¿ÿþô¯_ò“_ý„xÿ0¸e†ô‡ôw¿‚iùkúCúï Õö_}–î¹úýéaÂ~úՓûw:¿ÿÍÿ_Û{m§Ó#¢÷ßZ¼ƒ1˜šM¦ÉÆ$›`“ Æ69íÙ³/öӜg8WçîÿbGR'uÓøÖÌüÓM•T*•*ªH½½€h‚ðÁAA¯4Äô±äGØdœþÏW¨÷³Žü˜‚æíyK€ƒ»„=‘È;¼¹äâ™ôþÍþ^†h5ÙxõL€AÞʔÙ!|rCðXž›ð­¹}Ðgr#DîÜü˜ôûÁ¿¯t;÷gÏ}»+ûüdb6f‚ÓN#òúÔí¤ëÙÌkî»õ»Oí?£ €&ãïµGAûÁY??òØß2þnºNæþÞGÙß¿ ;ö½~ZÙo›Ð01…š³-‡0ÜÚ¯+ézÕV!sÖY…¢Ckj @8í\ {òm²§¦”†'©Xûô˜n—OçËÉ ˆ‹Q‚YŒîAπjTÏÂZ¾?{ZxÇñdŽ ?R>ÄñqœÌ±9ì™md(\/>qñÅeƒbŸäÏñŒègƒ“ª\-¤Ge⛸}“–ïŠ+MÄÛ}¯Õ8ŒS#áS$xnFæ¤Å´³f‚ÍeÞ^u‘¿‚}ÐÛ"aÓÊÏ £¦ÀîZ›Àä Öìâ' ž:Ít¨ï}®ÃkqõÆþXÈ;ӈزD–óJ I·k3;6‰H.Sí-ÅƋ^ÅÞ+ôBß`ó佄·à¯]²Ï镴¾®bd.Ð÷Ú…1,Sç¦æõõMæsP&謿!ÙãòßkÎ=ÞÙ2§Ù:³Ú¼mÓퟮÀ¨ØY»¼cûâ%MÎÐ Ýüþ1ƒŸ}š2A{õ‡ÖÜ·¹ãÝþP"1ÿÖ-2`¨|¶}djñ܅ò~œ›úÞӝ§¯#ÿ=SºÙ¬Â+gI7î\€h¸¶e"žYZv¿d¼à±`¢¾ß´Mp²€³ÝbzÎ[ž÷ïÜÉ#x -Úr --À筋Âc{¬tüòûËÈxΫAº5.g駑ô8/f]à•ñUSÆÓ?Ò­sÛÏ=E/C™¾Y§_QµdøFuÔãÉzv -U&¢¼ì$‰ŠeG‚f¢â™¥‰rï9B}¢X“MðiÂ<€Ÿàˆý}]>u ÏÀ°t؏¨?=“ó'DÃÁEh¨ŸÁÖÈ+ýç/‹^¡Ðüå˜Àèq ’·",1(ò±Á_sŒK¢Ñê¦4­êŒöõU†ñøC¤Y@íØèáà4¿ 85:À ÕÁ÷+÷ -Zv͹ÙÜÄú“¡µ,áö èÀ²öÊùB£ñê 44ˆ³ÓÀnßpcCÜÂB£)ͧ¦7RGÄ̺þÌû–¢03VV „¢{”“ü}‹q û38ÄêìÐâö-…FìUœ´<ºŠ}'`|0Øê<7f–tI–=Uo#k#š@jb/£Ù€ÍË2´Ø(•˜—CÃÉNì2¢Cƒ(Íp+Xо®iK·ß*2ež·}ñíÅÏ¥HzNåE•×zQRosýói4̨N#@ô¤Ü2õnè,²¿ÃQ*ÿµÜ›¨3Ó]§Wi3 -×qìï2f”-·pZ“”®ùZ²~p‡)ÏÎ# ©7³%’ý97û¹JeŸÁ§”ÍÓÍM®žj S`Œ­=hìÈd‰¾«QÜ9&·Ü ÔS÷£u à·]þËÑvg‚¯3Y=™é"7·å‹˜*×.Ÿ#aZëû×±éâ °‹¡aY‘Ûo1@×~æܺk͏4˜>gA‹@³Q¤Ý"B -”V£H³EµN8?Ê`çYÞÃ%g…W®C‘^‡ÎӒVǺå Ҝù¤¢Añ­J¼¿A#°f§ý  2â3®ø J&h¬ÓL#5°eOŸ'¤‚å‚'$B*ÜBܟV\¹Ò_h" Mÿô¦úmUm§ë -`{°M…ƒ‘²e(’&‚A» -™Up1Øœr‹ u^Ï–Os°ÏqèVùŸ§Âîq‰Øcþ>ܪ„m7#¬éÖ*e¿]ìÏW3Y÷¦:úm&·ms@¯¥_Áéàí/ ٟ} z4bXàÓ&ìªd–5;°~^¿ýÌl A£Ðf–Þg=÷Œe{":[¯¸Tež…̐ñü‡‹Ýn!røi3ùÍyì}Š¬Ãs9Œî@}U˙ÆkêÕkí­_衞{OéÆKë šú̃÷?Í[Zž§¯DuçZŽõùA5@#†ývÔ [’©Ã᧝ÑÚ{aˆÉØ–Yâ;’-aÀë»L1ã?g£sÔóÖa0LGb'û íß»~Óàiޑ:<–‹¤Íêð4@t½ÃÊ1ۀãªI’#«þNחŠO‡›Ô{ÃnŠþØ[¿à@Œü!vÇdõ… ¥è̕¶±€ih)­Ï'¨Wٝ̃VüP³½Á´‰>yÛҗ;ÙÇù?¹,¶±‘Àm ¬Ðíwö÷øÌ};@Ëï³Ï¥ªÂˀÁmèÁaÎlcŸ§­¬Ð+QOXÿBZ{¯§t¥ç™±ú¹ò2ËÍÖŖÇÜ·9Iä²EERçVŸpQŽêÌzDçcӜ&Uñ՝Y¹š·µát‘èK'ü™ Ÿ”3e¡Oí3C {„ý°ÜdpÐøˆ)Á3h‘Ÿºû¿|ÍÉïrÐGxu¸ª¶kq‡9@ýŠûòóü°>%eÏ·5ÿe'>Ò~K¤¤á{˜Òhü>C*žì˜r¥õï xëºÒ Ûë"ÝlÛÉÂSá3”Yzf¤½ÀíI)0ÔóìΕUÔ@šè- «ã-±á‡Û&c‹L½Ü7 Yf6:re‹Õ©<´n±xZÂ}ó{Œ<ƾ­\m¢±úÁ±Ú<æí¶à7~ÞÁõڍ2ÃԛñtbQWÁ2/ôÁS•lfm—“{@±€YO”…8 ƒ=r‘¿¸ö÷ýý57j@×s¤É\¯h›`=ö¹|p¯0‡4ï­7[èå+VŠÍ‡Ö%òçE_±ß¼cÛ÷1ð¤[ò³°>ÙÌð½?JØð‰R9 Gp¶Ô~($ì²/Ù·$«ðѼDÅTúP©÷M°Ò©=¦6ÒlA¸…ßw((#PnéupZ ŸÉ}1ž[Uœ‚L¯åРÏ}·ÆÛìï£1øÛ_Oo¥­È’º)Æ«o¿v‘Ú·Û÷M=š¯¤b™®–Óc‹[Rgä %t*úœ½ä¾#cw¾??™$üÌm  {éíOÝ&ਠ0naôÍ7|0¬d c£ÄsÐ'Æ%‘e:ßN‡"M¤OŽrߍc…ô`‹èX˦?d6µhÏžR:â^¦oѯ¤m©·viBÆs'l8@.SÑ÷ù"ÞF˜‹”‡&ïµÚВ^zýLWr®”þǍB‰Vµµ=*Sû~¬Ç.’гuþC À#¦ÔÛwûŒOË眫9s¦¢/KLsÿ´ƒä&K‡„Ø}»O{«™58 y€Î¼rÿ̇c†Ü´BOS¤X?çŠÃã1瘒ù¸ÕøÔÙÛgÖõDà’iàD[ö3˘Ç$žÿ (pm7:oÚ`ßkl+–ŽŸã©¯¤†á)÷½=¸Dø6Îхºdö;é»ÜFŸ!è.C4Põ"Ý¿_ÂXþä -‰§9Ð;"AÊ#üõÖ?²pc¤¥4{‡è”ÝÜ<>„†ÄÙ.˜>›Åbï@S*ü¡}ãÉø€5ž\¦â‰ߔŒv>ÍÜ âèè>pVPdx„hÐ+hœCÒۆœ&vH=’ÕMþ+°¨.«½ÌéP«F‚u车·éï ñÑÒWÂdK T‹hÍî¤Ûm“^Ֆ•ã~€†·ØxqÛ¹½IÞ$Ù¬5&ò_½C —*îöÌˎ-Ôõ‚Cz© -k"•Ãþ\îsVݽªägfJ‘¥AZƒ0ⲝ¡èhFßñ;WÜWQ+Z‰Ìjµ í|þ9Žâžëßi~JÄ͸’Mƒ RÒ«ÉÆJ 0ˆD¤›Ûê)ç¨ïgŒµ<³#ç΄Ɣÿz ~BNk­ô2nLh_lV‘9û^›LÀÀÿ òU$VPò;ïcÚ¾aØ{Þ^7Û ‡N±s„y/Qû±b¨I—,ê÷T|EZ)†ft!´–Ì{yŸ}ÉGÆÔ“8ö#œ¬DSz¶4¬=h¾@¯ºû׍Óê.ó9Z¹ƒ@`W©Pw‘O‡ Ç Ð;IKÙù–õtÖÇØçàcÜqþø…R ±·å™dۓqò‹fJVV±bŠ‘P´L;Ò6Ç«Éþœ -=æP’Ég6ԚmㅝqèäL€&:›}µ£Þ‰í5³rzڅn¿»ksÊpþ?ꕗáôLŽ?Ï?03Ȍ'çÆÑö_¬9qš :¼ó,}ÇY`3]YQÇ9ô®Ñ©ˆåƒð྽vx4ì=×8󟾧۝P‘²¤`d™ú«‚ɯßynNHéñ;8³vÄ1MÄ_v˜#Ñ+cŽ·s¶_÷WÜÑ«dÒaG ®ˆéW âꠀúÌѪ_èX™¯t½R„ñÜEÃËSãœóAlò¾ý˹ó@5‹lóÃ.r?ñã쉼?vêƒ?ZØTÉIà¤õÛ濂Ö@¦fµþ†6¥†]àæ,‚Ðj¤pµ±Ÿwö‹ŒÿÝçÄXàwèX¤Û¹£-¸¯L’ÏÀ‚¶ë+îá#d¡ØžcÓèò9÷ùÛ3 v£mO 2ÿÁ´–‚ákdR3g®´Ê¾ ÔÂÛø0–J&œ~í;¶Üüº.&~¡™ÈOÛù'&y¨ûPŸ(ΐ§›q¦ô#Èý‚rŠ8ÙÏøÓò“ñŸ#½Iê_ɱåÓ 7ÅG®¬ÿ&°ÒÀGÃX©^l£ÝÎÌfNÒº#`8Zn”‰Tþ¬Ãåäg³‚Qçªl¨@ddÏ×ì°í°—ÚÇüW¢ uL;c¤“#‹÷X:ô]Ãtûçë‡ø\b ?a/‡nÜSYîYZ­Î¨pc{pâýµ–zŠfÍœÅ×9bï̓I…Ó€ï2ƒIdÀ¶¿kx ž\æ>óîëd1/ñ -Y†Û–/"ὛÁó{åFќ/ðKнÊÜN•>ÈV¾ðÆÑÄ*H,¹ßùñáø»™=Ì~ai8EÖùïæxšƒEß,曇éüwýÐÚ¡Ë›ðp~xÀYðÒ^tDù¥¹í%Ôº`íÿÌ73¢€ÇùCíxÏÙ§œãîþؒäwƒ#y|†¾ƒè×ÕÉ·çÓîÛ¯¬×ÿ¿þ?®‡Œë¡´É¡"G0jØ-µÖXÿÏÿ »œl(ð`T‹ÿùÿV§ßŜ%ÐñÿügþµD/PC9o¦óådƒnØ;¹äžaM€þëð»S¨¯`V„œOïó)¼üGÅrS[䗭@—{—-ºW1 -t!X†Wl%¹õڇÉnÇ]v'þ¦Q‚NOW1Xæú;lÁáx€ÈÙɎº ½¯‚a@Õ¶›íìf3Ïmÿ³¡®o¿H-·ÑvSˆ$¨[òàB›}#¯ÛÕ¯lM$o1¸±W~Ùûp¤*ÿ„¢î/@V¨á:»ÝÌðâS¹yF D_q…ÍM%Bìç/ªKõ™7©JÂÿ¾ÈWßp셮€´Án“ø…ìÝgA,…Ãä¿ØuØÂÉ-w"Ò¦ýs^O7“ß•šƒŠ¾L¤ÝÇ©bëvŽsD‰6^Të (Í ¼>Ç/®”Ý~Ü%>è5(DÙ]¬Ú?øD.PTÚÓ"w)ÊÏmF4í¨ 9À õJˆ 1P‚7¤§[¶6R´œˆ•ü辈@ üg xžÕRÔÈàô×a;œÀ ;g¿*+Îüò3å¯þÅD%†“¾|ñ*5o–˜% çœ~¿ي2‰¡«¼¿J¼~SœjǛ"G‹¯Ô5%‰/·B׉_<Ëÿ¥ºKhý²”€Üw·¢Òú I«^ÂÓOŽaÅTü”¨@$Èà ©¬îÞ^%}§–Q*sÔt§­Øòж´ùʤp}€- Þ¡x4ËÚ¨¨h‚ºÀÝdÃÖ¸³å€7~þlÿSüÅKï%ÞÛ°7 ÄD í·(hâ©Ju÷ƒ¥ÌCÝ?ˆÜøWâÕwöD`²'ߦnÂm¯9íɟ“~òú㍨}Ð`?¡1_²}Êä¾#…eÑÐ|žÀ8[‚}êµ?7ƒ?z«¯ø¬wºÍ0ÝZoO,ãzëK?¢wüü‚gão—Þ~Ž¶ôŽZ7§w5/á~îYþ€>kmøÞc Œ.·ô'ëã„/ö…ƒýຏ²N›†{JGsX©r8$ž§iÇªDŽ‰p1þî"·}ÿ[þðÑ'r}²×&ŸÓÏ_[:´¡ÑøŒ {Öik„Õ Ô„©)¹|ÕÌN½|«z<bÇ6Àâ(n‹š7¶c˜<½y‡Û¥‰˜™<uƒ{ø$Žq<|¶' -zš:µ6¹¥Ë} üá}ìüYXŸ÷r|¬‡ÏÚGCk!4 DKC—(Ö¡ñú8ˆ9¬ÁßJáIk\o9=Oq¬¯žÿ£7jã°Â+ñÑì¨9%°~,s//ŽÕoý°Ç½ ñ¹>’C˜beèìVU±éd¦’’À47ë³Öސ ¿_ZVªZeôq“§Î‰*Dl½\ZKÏ7Xy¬«{ÁPU"Cc}5›XõhÇaÅšB<:|þlÚXS“`ˆ4zD±“ã¦V˜ÏiôYbâӍë?†ŸySk#kMìëªV{lMpXáÚðʖì§êâXý½AFˆQ¬ä"dl®½u1¬(6ðùIJL7hxZnjY)¬¢à¿‰c-ióÜê!¬È'ƒ#Icí9-"'_üÏ4…óK’‡µ'ª!§bµ °4ÇÇâ|lNœ^€8´²quПH` BË9”š#j¶ÏŠ8M0ÝÒ>šú;¼4E±¶bfŸ$Öʼå#Ä°¢ƒÀ?p­‘õQlºÇÇJqþ2è[-¢Xß̛…$ÖÖOc?E±~֗%„7—Óýëf¤֏0ñy\9ű¾üíÖõHØ'À -Ñ Ä£’s#IäÃSË®—ÀÚëùßuYkøÅù¨O}:QyÏÌÝ 7ÏyÑX§>«`óXûՉ aõš–"®Ubl‹¦!V‡¢ˆÜ¿=s<„X[Ó3õ”´ æªÿ˜ ¬ÖLÏSâ EÇáØIè!€Øu)¡JN4]€5{º‹ÅÇ …5é©8Bѱó¿P'ÏÍVV„†Fl<&Ó ÄJ°éù–aã²^€õø‹Ò'O2Úp (ü¸Û”fÚùdä«Ø1 ·Qɧ½†gý&õô‡(ŽŸÎÜÓ˃âœIâç`Lö,3°¿yHð4öŒÚôÓã2|¹=ƒ›ŸÇ®Ø ”„|-E?$Ÿ†½¶æXúéÏdhæˆvùBÚkêI>­Ú7I¯ôÓiý;Æ=-h¨?~M‹?MÅxçH=ý6ï#‚ßv쿌ÚúíyŒ^­3-·6b/P/g_$Ÿ¾?MÝz駹è3K4‘ÆOÐQòéßéuW”|º|ófÜÓK¢­—db(õs0¦F, ù´ìõ'º2D{úÚL[U©Ÿ›ô¦Ò‡Mòi>]›Î%Ÿ–½ÉG ÑÒz¯Ñ•x(ùg3ë¨%&xjo7ŽIúiÖ¿ØžÅö¸`Ks/ø~G“o£e‰™y¥EÑøiŸîh“•()”Ù_¨O|™æ=¡šÕ;ˑ°BÿÚðüŽÔ;rÍ,üç™x¬}GI ᤙa¤àáÑk~~uÒÒØA|=-að™Á/Ëk´G )„í w-¼1c·{röÑ~ÇY„÷ïóÔ -Õcþp»œ<Ù{€¹Obd -I`  4Çêïõ%±‚3åÏ#ÔÓðé"SH+<¿¤°Îp¬þ´¤1Äá—L Ã:3™ Vd°X} -CۀkaÅÃjíQ&.Ž˜Gäg¯$VdH`&#° †V8Þt?%±"ýÒX¡m ‰ æÁøtãz—ÖªY+R48¬H -ðCE£Í[Úy„Á>ыaÍögk5ï Ïë O -H¼4ì‡ùn]ñ½ÀÍ}´ÜȀY¤Ñy±‰Ç–5$Psæ$Èó–3¦VJ°÷a¦¦ƒû'±³ÌÚ´MÅíHì¬ñ ҂`$"EãG"R䀛ä!j'¦hü‰üý£¶¥1 í˜ÁÀi`D`~Ï;ê-³ -ÈÀŒûgž{bÿiâÚ4íc«³/ç š>áq9Éx À ;¯àÔuÏ6†@”VO gl¯&> Y1Q<=¡ [¾ Ì(±a-#%Á°ð1ÎfÀÁ5‡×œ$0¿›Àˆ¨Eçç9SQ"<ü‡>eô‹ÌЬ—œ!\v’èÉedÖ°õ¨¼†v†6†ÓÄ& õڎ ½Ô¯áq)mx¨¤— 4-óGJ‚Òý£†ízŜšø‹c.þ!MñWác¯ú¢¤*OŸa蛩ïÍô#eyÒ#¢IЋ/…¬—Rh˜çK!Ÿ¤B2MvEò¥NCvÐ<š()$N¾ai64‘%FäÈ;¨hòy6âäë9õ’B\r{"žèäzÚ'Ç;ÖÐü|É·vM‰Ü…Š‰EˆŽ$g̋w¬a󚿺L4 \ÈÔ<@ó¶Õ4%Qa8X|]Œ¾ì~ÄÙ}l5ÑusKåØy&Fs ‚Ž\IBúàþÙڟöÁy€Ä¡yÔB…H‡‰l—pBªÝ€ò»žž“ÇîYvA GÇã€ÿ ìXˆã‚7€˜´ä+bK -‰†¯*ü¬*çÁ¾d0CV$^2H½ÁŽ 5›SAtl‰Âô(5Í1?uÜÚÙå²`FaÍ~¹,³‚’v¦V --ÃÐ-yR©Ð&¹—Ž38ISÐðаÈH–¢v¥JT -Ì -|©-B¯Ú–;‹eÆtJ–¥OÏz“‘]ŒIZÑc–:=U,cÄ(¯m(Z¼eÜ<ÉjÖ°ðºæ@Ñ }´ÖFÅÀàöTÀh,¦¡õä-Óĵ½Û‰6:ܓh|é¦q`;Ïf:\X·§ÄñJ͙¿#*ŠŒRº®è™íÍtôJ2 Ӿŷç)ùx¿í™éîÚÌi*²{±šEq©rÔA»võMjmNë(qdOjEƒ¸ÆXˆñ}£¼T‰£¼( ÃЗƒQªF"Ô:¯#‹‚ÀFB[Òv‰3kQ„>ïӝŠmò󗸬!ïçqêÂ\áàS ò~^ ÷Põrš¨$‘Ø(%y]„Ú7ª‡e¸RD'Ü{Ÿ§'ù“Z­((q¢@µ_@z†fT§½êŠ„ç)ʞ¡šyÿJ04ø~Öʝ<ùÏc“ül;QËHÂt[àǧ–K™ —½ÔovI³ˆ2£½4nv½Ø͎~á3F–nþN/£Ùð7»¨q®ì‹Ìû¨Ò™"çt( ¹ÂáÈ9r…Δu™¯ßK˜Îʎ\09lC1, Ù£R†™5µŽΌ¦|æŸÔW8B3ì½hJTÌŒ©_/Á)+á$¢õ4)¿Þº ãĽ›œD0*¼ƒ¡ áہ -ªchLˆò\;žš: ÕlÀ ÒþGFB«Ð´!¥+B5[ ùh= èI~Dj¾d'd°n­i:+-ùÊ}mXå'§Ìîî4äΛ+ÜØ»Šð ”š“âxÀAücðQì<„zڕ´)ø÷»G¥Ô\@ Áɧt.áj.=ìðƒñ.3žç¾SÃ’»gè,‘K›·ürÖݖØñ'¯ªehR^Z1-mxHyi!4 »PÜ › ¹9āVNþ ä"…Š€øƦ¶á0v -Э[‘‚ÂZœVBk¤ý äü"ÐxFmÇ*?Êh¦T‡…¯ŒfQFì]ÂY”æÊÆoäö£ŠãBóº´G -%4 ˜4jSEML1îùǚPº—Ö év\ -À*¤›¸3% h“Úß*Ý:œtcM\-ú½š²tãü -1(ízéÆmÏÂÛöÒ ¬œ˜tÓ. íÒíÒËAº]ºA(wˆâ"@2á$GÆÂFÜ˜fÃó„á§ÒÛVÎÎÆ#âŠ‹ßÑäu£è«¿»5”Ëž7ßæ½´HR©±eÁŽ¯ŸÄv5í¼×&t´7½&‰ #RB÷ʄ -þ®~C7ß`¿Fm+'H˜’6ʀÔ)þ’P(Ÿ t{V‚"av ùʀø1|•ni±P‚v'7u8‚¢Kç#øÚy‹ö±êä±y¼Ý(쾫u~á^Éóñ]“ö¯à¹…Ðn×þ?öb‡£æc ®œv˜È±Ý¢ýcPØÃñ†c ÑþÅ p&® µç£üáH ›ýÍç#ïp CÎðõ]R (ÍòbNO^j—Ú!©Œ2˂SÓ¡&„×íÞâäÆ´[÷960‘M®Ý-C4Uš0³š”ÉÔ¥jÇ˄a³€¤o¸:xMƞ`L’lAe )î3áI•u9/Ž©¬Ë­ÎöTqRy3ݙd tjœ”_ŒÍ«Žš*6ÙôxÇÔ^M2öù†Ôæñh>c¬R½‹3-¤MïHt„«9r©óÜRÐ$¶}O6ӗb Ý?Œï_Õ°T²ÅÅ&cijs\"Pۈô: º½ãBïÜ4FzÇÛ0¯w¦}CXÁ—«åÓQÍÜ^·k—µ|:AÑÒÕå|òµ|”„¾C9Ÿ$VT˧“,]ÔXÎ'_˧ÃKo)瓯å㫃7”óÉ×òéx¥‹7”óÉ×òédJ5•óÉ×òéPéâÊùäßÓÑUß7—ó]ì`^-gxÜXÎ'_ËGéiÊå|¼h™J·W3)¦‰ËdÞK# ’hTŒIÜAœSη©+Ú"…–ôՉ·9¡b,âDPí äø€¶åÃ#…9aÈÕ¤ŠÙxL+¨^eÏ}‹š¢´ùßüMÉß"ˆÊA“ÏòR7CÊ;¨Tħz†G—ȾQOx·ö1‰VEÀaÉ;ºäÆ$V¼‡f£©~O•ØÉ òK°¬!me\'Mù%t~šhŠ‰vw³”¯™ºØìf÷VÏiŸk­)•Ýñ.µº)† «§™*»“ -ûÌ(¥²;i#V>Z‹Î¼lŠ Ï~U²Rò‚: -¯€Y4~‚—ç2â3õî 1Õɯ ©É2¦¶§”q<õI§jj*zÕ¡*¼šÊHe —X`œÓÓ.}mJ¾Æex'ð¨€ßvDt¯ z$Õ1Éb4\Ö£)ªcªk -ϊ™÷j -§Šõ7žKºFNºG^Íɼ7?ÿ¤†•«•^CåÌ{Õi ³ßë)º†:µ5…áƒRMŽGRâ!´»Õ¬¸¸‰daŒhʌ¯h|·ì­DS,\U?MNº]G4¾¿Ø›éöœü$ª¢ _'RP¦Nͽp_ÚaìžoJø:åK÷0$,‡´Œ±wèÿŒe÷yQ…=È… -öࢨÚ”p‘ y ¥{\ÀZëØë?ÔUí]µJ#BÅyÃ(:âÛÛ){#tÿÈú²ayœ„wÁýrÕz‚ÜAŠÈé3`Jò÷³0k£NÌ/J,¹“ -ªã)†þ+ió‰ØR´¥P«w!€¤Ë²N¢ü5zZIíÞç6¾´žöWÒæ ’®ø»HNºšT? -. zßXTðFï oL<ûË«ÅS"3&þ®Vq¬ÉÊ¯vL -)ñÊåyrcº¸eÄ%ðSeQ÷ðޔ‘÷æÖ48 %Uxo˜H¡B1ê2Ýâ½ÁýåÛ½7€E.eDC=Ü5ÞÝEéâíÞX'ðÞ”[õµ‚~MÞñAYEºê X-6ž -†V—"›”|EºÂ)Ò2¹êji_²c7¨à|…ä®rŸÜ´6цù> 0¹¨E)ƒXM=ܕYó¼óV²Iû¢4”±]$CèDK•Jü4'èŠ$â?•9²%~X1«@åИvR‘½_ ÛƸÖ)›øzy¿*üNåÉÇÌF2éé>•yÍ=Òöä+ód¢¸÷¬ÌM»~]ß»2ï– •y²É°÷«ÌCîî·¢ŠÊ<.°¢œ„xCe?Պù‘ùޕy:á]ªTqÞ½+󰀤òav}e?è¥"¥óºÊ¼ kM*.kêîPø¼»¥^PüÔKI­SMêåÛVUꥢ8.}·ªY”s¡.áRC‘TRSÅ" …ÖÓ ;”]äFÈeÞ+K7Xç'í@»Ì¯ÖaÝ|$R¬Í{ÛEŠµy¯°‚Í(íê¾Ý²¹ú'Üýpë~Ðd¯Á•i’û±·S»åTuHsm6¥(»ÝéªcHÛ67q »ÔeæÜ*5E@Ò÷K]&•Ø}yß±âun|o¶ Š;¶:.]^° -NþF*E³›õÙ|{¯M;Áf-ukò5~hm¤¢¬Um‘ìäqªÆ· PvxŸ"ُýŠd! »ɺµÛ‹d!”»ÉB@ê.ºØÍ¢¹ƒh£H_«9ÉêdX€¿»7ïGAQž„L»wQUG ›+t¢<ñµ¹{QÞ ¾N>ÑäM|-¶ç Ey¸?ªËûWŠòÄÜÿBQž„?M¥דÓq¡ Ã«¾ú‘L‹Usû½@O˺ì&µydT@R…ãB“¾ŸO«fsq…²ÖȄ+•ï©ŒÉÝ< »Øˆ¡Q®º–ø}H^à#<+X—ªÈqÁídØJÏ!†^Ô4Qÿ)¬Þ&£œavΓcjH¶¯ù”ûd†ÙN†z¨Ýz®Ÿ?¤ÒÅ`»œÍ¸¾²ÙŒ»Û.´vÌùô´âšöOñ+ÂĪߐEJ ¤ àè+Îdü²»ØW½†;­1¬ÛS\¿ÕIûù{]¹²»™[+A¶3²Å~OõßÚD -ëXkÁÁ° -+¢ö#Ýù»?U¶i£ íÑ"Wvçq °êø} -ck©b¿ Á°ž?¤ÊîrÕok…b¿m»-‰ÕTÿ̤°Îú6ºÒXó/ƒ‚$…_l$…*·K ¶.=qô‰f÷¨Ê÷bbïÑîÞ«þª*~ë+õ}˜Vƒ"*ê kF%ÈóJxÆÊùœUä÷ò•[û†ž /ÊôjÚÞ§¸HE2¬ÐÁ"ÝÓk¯bLxlMfXJy°JÉ#´‰{Ïözb-Wt"7À¨ðEɵ×Óæ¶äTgb*gR7\jÈTê¬'Ÿ;¨ž«:ëIÎð"~“SÑhEí UtWPMx¥+ÂÛànhª§aßæÒý˜$SkÕvåSp_SØw¥ÏFkaŸ˜•À¸íîXاö>› ûļˆûæöÂ>±ª>ݵ…˜Ò…}bn|‰ÿ[ -ûx„¡7/)¼[aŸ(Âe&Wö]{Hk,ì‹óp§çÝ -ûĪúx~ûö‰Uõ©ÍÒPØ'æ¥gLÜ;ö‰­0å ¾kaŸ˜ÊÃËR½OaŸXUŸNâjý -û.ÇôcQ ®-ìS[Ñî[Ø'¶†b©V7ö A)w`¾ª°ORë¼oaŸ¢ÝRØ'ua¿SaßuDÓ\Ø'_éu·Â>‰ªï{ö‰€hî\Ø'lfÞß¡°OLPLÜ{ö)VîTا⼹GaŸ90Uý^…}Še÷)ì«êO)ÞÅFtr6"F´¿’¶;§¤{š]öð˜Qª«¯ö -۞GÿVJ帡‹ßŘN(Ltï.~2*‡:RìfM¤âèÄO¸„E¢ŠÚ†J>à•Fè$ʱ¥†%“Z¡ÀF£d†Åm]5&D40,M}ªåÆ$ž›!-ldH%Ó§ZB~¢co2%=å£Àdò#;…Žðò®<öX“íÿwsó?vG—J}ýšæ’†×ÿïÚÉ±×¾é¤ -ÊÔÕô©Ê¹Pȇæúÿݶ^…ÞN§¦ÍŽ¬SKUó?e'$¤ÍÍÍÿÍF¾ÿßÍÍÿtTžBÿ?uá§]åwtù’üBj¨ñ¨Ü-ýiWáÔq±tՓ{¶ªåRé0lÛ§˜á¨Ä¥° šØòÎ{U5}j2¨!¥zGéÌÕŎLr£†$5H Ig¡€¡Õõ¨ faI¼ -VrÖ:±[­¤F…×õ•õeüT+ÀZ -9èªS­(åü4Õ©VšÊ$rùLj$ïSˆy{$öZ”¹õœa•€TõÀƒ‚'Žµî±”‹2{h³r¥=‚¦ªÚW²ó…°Ú·µ¹¬ömmîx½!„v—¾Ï§ñªløa&IͶ5Å×76岶m—ÑaXx™²-o°KemϏËûÆ°7;kW/.AUϪ´N5%¤àÁ«t´Y½èhjî-ƒ½ènÖ1((²é£Ýã -Э¾)(ÌfäNOM͈Õ³Š%ڂÅV»È~|SQB¡Îysß?Sï)ÕúïŠý(’¯¡,ÓîÒ÷OZU§[ÿÝÈntß?Å÷èû§"Ïæ}ÿtlÁÛ÷£Lß?¿6JMuÊ5}ÿtr}qaë?í}ÿT_ßK°n¯öýØsʏ¤‰«ºÚ@SV~X3J©Ú÷ceµïE!fàVo,v¬‰Öió¢Q*]!D/¼Ð] -Lk„JkMt}® ŠU ¤k©`A-Õ÷b…T¼ð*”Ž‹ýµ(,† -7˜Žé…§²–JM!•ùy(´VñcMM-š -W·6’µTQ‹ªòyYëžÛžQ‹ší©¦Êü¼*æW۞]M…T’ÉI°¯¤Ìá«McìêèÊâº4F‘{»= -Í]ên³.éKѐ}£µOŸ¦f˜ˆš2zZï~·jõ¨ޝên{’·j]¡ÙLšša*5t_Yw‹mT6µC§¢[¹îŒI}9¶\Ý-í.‚‹Q ‰#dtBX{W|n疞lÆ]~ÏæeèÌ%í­öóvl‚O…WTjHv?șלxÌQòc>gú¯ð%Ùıò*óš£á­÷Š{¶ø­é¢ÙAO¢2Ï*]x8£„”6©BÄ ÁjZ?¥ê?$±ÂÙ<’;Ÿät‰‚¡ß‘Äj.M] ©ÖtV«Ž-(ãˆüðbXù5rGsÈÄuXô Š.­–ä`%† Dvâã•N„…ˆ8…+ñW ¬AÓÿ%7Æ<·Â⼑ ւ1(µÐ0ôÅ°êP/¼p‘Wê)Äڔë°Xy“ÆšÏwH~â@l„/8ØOtUèÙöì泀Ä{¾,!ùž¯÷$ƶhZH{t{Ês'˜uÏ/TGÙ`ã⟧Yÿ2{ò©ÌÎt XQ8 ×lr*4U×ø³°¸Jٙ"]u™¸%9&ÄÐÒÃʪ©¯R.®:êî՘ù•Ó¨õ;åä·$—ÑlxÃjiÉq“+^¤yCyœB&(E'Ý?ê¸J8Ó:CÎÝ k5· ”ÓEØžQMxM9`Ü°¤ýËÚÆE§t=¢‹<\èÊ$lüHx^¤cÌu–^Rq½·’çv˜¿×M”=§^(l®¯ˆ’uK« ó·\±«ã*$/î½»ªìN<þ§(ª*I¼Î#ÍÏRE%‰·Þ®+vߝN²nMɪ¹¼ïNÆ@’ð§ñSQD‚µRS‹aCÞ͒žÂæÚ:Uû'µ¡© —rS?Þ؄1eŸõ)”ôÀø÷ ËðA»’"a°ƒyu¥cŒÚ -Ú.ûxÜЩN¾šJ§©Ò+¢é*lLÂú›YAÎ笨ªóƄU0¡olÿj¬K\UԖêð;ºdê•:@+¬!ȟ”K…Ts„  ´N´ÍŽhJ„Ì%¿2Ч̍DS¬&R?M~ôV¢)¶ÒF´ªÿCÚE³˜ÚÈíʒDµõˆJõ7ʅjªêåRâU”$ª­GñCk)IT[È%Ã^U’¨¶‘rw_]’Èã+ô"çV[I¢ÚzDD´ëK9’ÊK¿ÒKkI¢ÚzDΒ¾ª$QbLõˆ¼¸'5¢ËyÝÞ¬P§¾IÝ-Í -ñÙü‹Í -/ÝÿJ³BR“ºû4+¤+VäՖۛêþyÑïÞ¬ðÒm÷¯4+MQ¼³Bªþž·4+ä¹ం’⩤T±,ÝíP¾0FCÃCy—„r¶Ê†‡ênµº¹á!6¹{Üj%ÕðPcÔµ 廊9!¯jx(ïB’0ص7<gAù[­®hx¨‚¡ïÑðP>݄stÝØðP± ìN~`Ùn‡ÌyssÃCùÉ ½W7<ää¢Û!Ï×yKÃCù)‰&Ã^ÓðP´8Röúvõ´Q]½ËøÓnnx(oa¿±á¡ìɗ¥Žµ;4<”÷&ë4]ž%ÓðPÞO»¾¢á¡XÕ&·¯ç4AÃCy(rîM å¡ Á=ÊÇc8÷Í å‹yuÂ"ÙkŠ(¡X·CÜZƒRãꆇ‚ýHð»âÊíÕ1ÛðP¹÷. å»r }cÃCùoL¹½­á!WF&Ƒœ3E[ÉÅEÃCyRÊíÊì¹ãÒ§2ô­ÜðP -«@ÝÚðP}ŸÂ›²PD·‘æR’‹†‡2%Ê©½s­ åÕ|8›»4<”:ÖßD’ו‘©Ðõـ¤Ò~Tjx(»¤%\ßðOp¡Ayª.ÚðP -žgsSÃC)(jÛïªlxxã— ÚZ^ÉÞÖðç¿èvHVîÐð­×’í½zsÃCyåGŠÓ47<”ïv¨»ùº)ºáá­ÞA• ÕÔâÞ¡á¡|·Cæ>…W• EçeÃÃëKõ±n‡8š›^º ñn‡¬„¾v?2 å³Ç„ÇÚÕ 哨„¨«Š¬ ÖíP’hZÞàëäM{ᕔíyCÃCNˆ‰u;¼>EQÐðP–-ðæ'·5<”×i÷ö†‡òEºÌ!}sÃCþ4…Ý/õ4Õ·pñJ«F´f£p —ʆ‡ê4››â«y¯X¹¢á¡üY!D®±á¡üYAën‘ã¢/§»Õ;âi$±~¨Û!…§'øZÚ#,Ÿï/(¢ä±Ëi\ø'ñ¼Ã«ô)WËÂ;3][Ž6„»>²$}áY«UXæs8x?zp̔õöÁ‹‘pw—!ê-XÕ¥7Ö%aÙèÝ_ƒßwø)“‰Õg¤Ñ±Yœk«9³ÏÅÅKÚ°?g‚úÉÌ>SOp¬hªÕ÷ÍÀ~ك}™ÐÚøŒzÉé¢KËÄ<5¼õÛ ãæà&M^ÿâlXÍô3XÛZfÊUõgÇÎÿâjT!©O“íöaœÏ(¿À떯ÐïÛLî5‹Õïq^Zlr@ĉQ"|ÊÂÜÁ\ŸœwQ‹ÑìgÙPÌñªÎŒkïÙLÞÛÎå’öp…{ŒZ{èmÏÀ¥ú‹Z<öeVö†©XU@óJ¯·ˆ¡Ó•÷÷‘=ÿÖ-ÂO`ί+,%vPæ"Ð; ӊpŸ,0¿at¢ä²;à23Ÿ<äs4 mÀŸ!ªE²§´>;(ac0ƒcmpßd]Ì/I7™÷ÖÂn‘°çOgÒR,•<óÏ:ÿµÜGw"dEC…£ûôزžXöwâö€ÏvìÁĘ}h˜gY'÷̛éw’̃‹°‚#tK? m^¬@xl—žBõqÂ~gç^†¡ˆÂÐõÅ>sb€ -»(¿sÓjSà…€•NkO1X Â*K»/ÙÑáøš²±C!w øŽt@:ـ>Ï0b(ÃPè…Aë€|¯u7äÔÜôÚñ ùŒ‘õ ü9ð¹k­¥ü¶m·' q|j\kÂÝ«r„chƀ"Á¾3çžÄMÑÅÆÜ!ãyÿŸ  \ëeT_V.GÀ7Y1x͕ ™ -wÒZ7"á™2ÏÛ¹ÒìYOKí^׃֕šMÛË­ˆ×ºh^êMüìì'Í)B³Å´îD <4ÓN‡^d{–¼`ɦóiæG0èõ]6H'RLÁŸ]7ýóå€`> =ìp¦àЫ&èá,g>|{N½C½oDŽ¬ƒŠw\Û?ѳY®ƒhŸû2a_86Z¿³?A²žY… ǎdûRSâþ¡b)˜? lñ®‹ÑÍ2§!á)xRðiâa>ͼÜ{@o‚žþüà œÞH›5 ½9aăמ"pi3>Óè"Ê{¬×g@]  Si½¾Å#ì<»ÎÅ¶Oò¬wüüuõŽ·a^ï¨u‹zgØ1қwí-øä¬èiß\o_ù«z§ÛüõªÞ¶7°cŠ@ · ®¦…ÙÕµ #ƒ j‚°¸»e£E' 9Ì(sJ ¾ä{~‚Ö:X $-Zd€*"ô¢m.èòòæœ;#:Y éD*’ŸPëÒºP±Ò¡Q NÅ-Ó@‰`vtp0^ ý˜ïB¾N‹%ʈÉ(šˆÅ“FãÌw)$œ,ôrIJ¦xpU\¸èÞe‰\9¾%À+uŽ¿‡Ó`ƒâ´Â³ÍV6AÉV¸‚ˆ- `uR2•’Á»¨›§¡·bv¼LÏ]gG ‰çd*:—qZžâ,j$lBŒPZ1PÐI8­•Ÿ³§Mîpxþ2áê j¯¼³ÊGћmOýœNŠ¾ƒ k €ñ“Àyú -oƒŠTøLqµ©ï-cš6úNÿ܃ÙÍÔN;¼+1ªGx—Â+ °%…|¥Áš2q)-~£ãµ”p$Gf¯u AÆ·€õZp·Xéï&{ýÝòÑ–j`u‹?&Mm,8qt?×x<õn›€£ÉN‚ˆ^·——c •Þaázl³êè'ÒD)`­:/p¨ðY]ˆ…[›®~ëÎSúß!Ó0ªÐ§Ææ8Öüa¯oh9`D;ë!b=EPÿq`‚¤Ò3W£D ÜppCi -Žš)Ÿ×}}ÌÁïf´NvDK¬±º]‚¢CîØbéðÁiäöØyPg‰ ¸©ÅÁ ‘¤ƒ/Õ°Xh:L’õ˼xH«_–K"ÀÙè@õñ@» c­°t(~ºÿ:*˜Jþ£x9T_rw¦xÏœ_õš3˜©;0¨‘{ CIÀM\3UŒ.ŔÊ •æ‚]l”P5œ#4LÏ0SµQ7L¨£K·`E¸åටÌD,øŠ\ÃÚ”5Ä­C 1 Žšba:]n6A/{ G ™AÈ *Äß Ñˆb®5eïÉÙð_µR÷@Q·þ´3ìê÷> Ľw=§á2øjN‡„ëJ§‰ì}­œ†ãZNÉq |ïKp 8Œ nÅöí5Ô´ å`‰v «*Jˆ$`\)1ìƇ³¹jE¬ÜŠHî}n:êŽ.á8n‘ÆlIÁ,Ñ´N„Ûd*&‚AI†”S=u‡´ÞœûhÐ0¼Ç!†íʍŠÒ6Ž=%‰!?ÉsI :eˆaÃÏ¥+E§M {ʝK6yÞT%:mÞLÏSÂþüc4[¡B<ó¿9´åŠÜ6ñáöÔ;ˑ>4Éûzû—«¨wÔ­dÂьr´Qv#{Mm—{íÈöƃähĸæ^·Œñ܂^c±H )íÞY>ºÐÏ)ßaq¹ÑŸÐB·ÐŸþæð‚“¢•6ÎÍ{x~ÑNÿµ8iËýYEª:õËïNôD{j€ù͹#‰â´ÔEŽƒØŒ™¡Vl¸}š²øƒŽ‡"eð-ïÅ3ƒ0QÅú’o» M›BéVÜØ/¤8Gê·ø ¤z Øg¨9øºÊ¸² -u‚ri£OЏóB-‹g:|b=§ ;åÿœî<T 'ËF¯9aeª tÞ ·¾‚Y/ü†€•µÏW±Žþ¤á~õzåz¤us:ÐS¯51XÛ. - a5† ïªõ”wD¬C€&#ތv,éil¡ (gÊE*ü@ºÅ@ŠÁ£ƒÅ*@HÛpŒÛ;±C0Ññ¿¤CŸ3 Ú^k¿¥g˜Îï6h|Æx|L9­çْ™ý;Æ2Þ\ñz›Þ]•rý’‡rWå¾êúÓªã¥?C´[½yëdĤÁyóÞ\ßwÊàõSd߅ìWïhU%¨ŸÎMøØÚeê}Ü;ŽÍþØ~Ö90åÏfü®ÏÂ}ƒgF3³r-léׯïj®RÒ·¸€ ›êže3¤LXæãÊøžÎ¥9¶o>ݔOÎäíø)`Š ô§Üä—৏~ïm§žm’¹ÕãWºÙþ0ç§ÎÔ;ò(¡Z`Î;xÚ)DÉ/r÷+jr*B¢]çWÔäT¦Z©÷+jr*¢}s•_Q“SÅo®ò+4Çÿ›ÐýŠøèwó¼šê‡ßÅïæÁ¡û'¦ûǝ.y<ÍlKæóöüŸrÛ¯óz¾9=DÜéV¶T -ró¯ílþࠃ/!V&:é™ÐH<<ÎóL"FÌä¾#…eÑÐ|žä¾‰^ó[R:Ì®½‡pèׁçê“Þ1š ô/ÙÒ[ŠGü³Gùk¨h¹h€Å]l†Üü9çíµê»`"?MdÜ.Àø[þ=3o¦ÜÇEÜ]L÷alò­•rŸˆ-réÐaQ^6æj‰¸ádÒ[ã/~ÖC“2õÆ\Ø­wXS)øuYoo<¾À¾ÀIè֟Qþ~ʙ?هñXˆ:¥Z›Öî_VP>;Д”.X¥!"ʅCñƒ\ÅTcl‘fvŒ%ƒ †© -êBցG¬†8öBÉå4P»v¤}€­öwF[ ý©6"ʅC©Ä¿)"ʅ/aþ_‹ˆrðOÈ¿å¡0”ô¯ED¹p(½D” ‡ÂÙükQ.Šï›»GD¹p(<Èÿµˆ(…¢ˆ¾wõ֗¾…¢çè+°Àü²&Ûzëï*¡wnP°Fà1adášÐHèE{îQblž4r¤Q}¿(…¦µ£ßšìL2‰ßÂ%“°zˆ^÷³‡¢ÓN‹N¨Ã`¢³·uQI$æ”þ-=Y—Y±ÞÏs¼äþíž\”øëˆÚQNiù²X=<°‹^*€:MèÀÉYZ¦}Ò[A eQŽ °”óyœ.3«Ç éq Csք#X5c&°Æ ƒÔPJåA Sú³§Ð±À3kQ‡ZŠƒ†.üh/”&4”›Öˆ€!FIRL~:^´à;VUÄ%ÌrÙ°@¶s2ew kCX[Ðw–ÊzËlì°!t¸Pf¾A~…+1̓åÈÂx½ŒaÚ -.1½fB¥[¶…/Üê¬aáVK¤çã…[ƒýSƘ“‰×fÜÙ-xP⡎*ÙÎÐp<ÒÕÝ¿‰Ni ÝˆÝ™ïÞöÌw½ƒû·¾±sÖ b<^Š;£ÝG -᳋"gT ñÙ+Hõ¸¸Ø@#Ÿq-µîAkO,Š\{ªc©žK‡!N䖢‰Ðlj†#¸ƒ`Þ©ˆ¥JRY?«lAΡædé@c¥ -Ѳ¨ Âóéրr2úzRHå”…uªÜù†È·ÛV*¼òԤ鉝¤¶=r1ˆ`ՃTõöH1Ùô* âp{ðCºè?¹:q Ætøtۑ0]Øíì!-;™Aì<Ò¬%#„ãø2†œ7±Å—óÙÅQ -G#˜Ý쒃_ÉRÿ³XOá6:idK z ¤kr½ÛÐ`ÃNý—?—´º¹ó¤PÍ~–©âÊH1~*è€ä°¤‹ö“Ÿ­ƒàÏ>eF¡ˆèZý>[öÓ'ØO<úé²Áž[/æ_€™M?È:ˆ•ÃÎx̙ûGsþĂj>“µéú þé½[èبý?yñWk ?üÎ/oã·^6g[I2_{cb§u€˜O£AÈ¥.Öýѧ÷!µÞÄ+]‰H¦ið&^éJÔý£Í›x¥+¥.hð&^éJDî•ÞÄ- …Æ w´äñŒò›ì_?¯ZóÓy‡^ Œ2óÅï¦:ùï7žê?øüoTቇü²:Õýc)}m7և*¬µ¹Ó‡Sî÷ëô»ÝLÿ}ˆ¢ïºµj§”{ˆ>ЯÆ,`0ļ ¾·¢ëq¤û‡xHúÿØÓ;ø¹ÿ!\aO8ì Ñ€ÿ¹|ހŽÃRÛ.“ãïú¡~˜ló‡ ¦#ìsV+z¹û¿!„æÍ`ºE 0Âÿ¿ÊàÓøî?â¡ö0ø$f:ð ó‚®ÀƒÓÿ֕?àþ®²{ý®pÈãßпðø® ‡c_±?šª ræw1:ü.~N£¯íê¼V 8 2X9Ÿ/=® ­7cóy\Á˜Ñ`hTðmü3ûKðÅ·Š!¶Ö“ÕJó =>…Œ/À~„T D~/ú;àw|Aû…/D¸‚ADCÆ델¼ÜŸ4(5c¯Î¿O£×ÉéG͐«z[]†6•žFO¯“ż}˜ü®à.['ÿkþ0Ùl¶§Éi¾‡ùñ´=ÌŽ?ÛÿÀoàØ€=[FÔÿ> endobj 6 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 50 0 obj <> endobj xref -0 51 -0000000004 65535 f -0000000016 00000 n -0000000176 00000 n -0000046761 00000 n -0000000000 00000 f -0000000000 00000 f -0000175934 00000 n -0000175867 00000 n -0000000000 00000 f -0000046812 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000176141 00000 n -0000176172 00000 n -0000176025 00000 n -0000176056 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 -0000048487 00000 n -0000176257 00000 n -0000047167 00000 n -0000048963 00000 n -0000048784 00000 n -0000048671 00000 n -0000047428 00000 n -0000047925 00000 n -0000047973 00000 n -0000048555 00000 n -0000048586 00000 n -0000049037 00000 n -0000049233 00000 n -0000050430 00000 n -0000071235 00000 n -0000136824 00000 n -0000176282 00000 n -trailer -<<0F2930700671ED40AEE68045EC3FA770>]>> -startxref -176470 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_orange.svg b/net.mograsim.plugin.branding/raw_files/icon_orange.svg deleted file mode 100644 index f6b73f82..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_orange.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_tests.psd b/net.mograsim.plugin.branding/raw_files/icon_tests.psd deleted file mode 100644 index f81e5905..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/icon_tests.psd and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/icon_white.ai b/net.mograsim.plugin.branding/raw_files/icon_white.ai deleted file mode 100644 index de2631e8..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_white.ai +++ /dev/null @@ -1,1225 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R 6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_white - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T03:02:05+02:00 - 2019-06-22T03:02:05+02:00 - 2019-06-22T03:02:05+02:00 - - - - 224 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FX//2Q== - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:A71F418A7C94E91197BDD9C8DFBF9319 - uuid:aabf7faf-1f61-4e96-a376-801cfa691496 - - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:A71F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T03:02:03+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 10 0 obj <>stream -H‰|SÛj1}×WèVž‹®` ö6.B)Ý·úВ”?´ýèh$e×n¡]æ\4»û8ÛÝý öôn¶mý~=™ÝûÏ`Ÿ~›Ÿ’‚|h9$KÁ~»˜š_L)2½ÔÉGrHE°ì³ã\ãæÑ|ÚÞç$5ÀyĸV™"Ú)ƒÌrG3¦ ‡HËm’ÛzÈ|ÅgJI ÕYy” IN19}ÏÞ1-O!¹^‹ß݋»f6CN‹ipՓ™¾Öpy4EIÑeáÞe„åböpG?ËHËð²†$#Èþ¬±8Ãay6Á„`§èRNdûÔW%H¢Æ3;âB¦–öYƱAjŒ­l…™+Z v¶æXdp‹}i{!ô<ô¼ÓÕûQâs_ç†b¥< oä£ïRs¯ñ+t‡£õ宏 G9ɽ€+?ÅO½fîùدqYה÷¼±·Û:]ÛKÙ; -, -Þa‘>l2ÕA% øØöÔÎt-UéÆI羞þ–4¤T+4ïõÇ}Z®OZeT»§ê»O3‹ïÒ~¾ŒÿÓsC…î[>ØTàažœ¥¬†Mò¢Å{;‘X’ƒ]¾›/ûëÑA­Ã^¥tõGg©Œ¼vÙxÓ]ÇësoÕX±»´ß°á·n–æniÿùY=ý -endstream endobj 13 0 obj <>stream -8;Z]L!=]#/!5bE.$"(^o%O_;W!8uZ9(]Y: -endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 7 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 5 0 obj <> endobj 20 0 obj [22 0 R] endobj 21 0 obj <>stream -H‰\“Ûjƒ@†ï}Š½l.‚§=$ Bb*xÑMûÆS¡®²š ß¾ëþ!….(|̎ÿÇ0†EuªL7³ðÝ͙fÖvF[š†›mˆ]èڙ N˜îšùNþÝôõ„®ù¼L3õ•i‡ ËXøáŠÓlötÐÅ6Aøf5ÙÎ\ÙÓWqÞ°ð|ÇêÉÌ,byÎ4µîC/õøZ÷ÄB߶­´«wó²u=7>—‘Xâ9†L3hšÆº![›+YäNβҝ< £ÿÕS‰¶KÛ|×Ö_OÝõ(J¢ÜÓ´ ½§8• ô¥è‹9( PR ځh’ž’tZ)N}BZ Æc_Ï äIäqäIäq JAH—HçH—HçH—÷„H0 ‰IpLBb¼ž¬å O O™IÌL`f -3°V°°V°°V°°V°°V°°V°ðTÞ3Ù˜ òJx¿÷ XWÄm2{ì_s³Ö­ž_w¿së¶u†Ä8ŒÌu­Oð+ÀøJÏ -endstream endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <>stream -H‰š a{ Áÿç÷  J `Já«Øå -endstream endobj 26 0 obj <>stream -H‰\U P•×þι÷"ˆâ‚ˆŠ>|î< *QD À`•ˆ¨Ñ -¢êŽ5&ÑZ·£iâh´".5“¦:‰TLB÷b\f´©ÖFF¤1Þ{@§múîüï?÷üg»ßY.@VC!jâäç†uŽÌÙ#œSòxf–-rlŸß ž@› %³‹§íÉmø_Î.ZZP÷hÑ! Ã`dsa~K/Íý…Âð?B5²ÿ@ö} ‹-¹¸í£e²ÿ+*š?3WõɜäG±‹s—”tÎiû°[‹¼s^nqþ¿Bc}²ï+þ›Jä—=2 8Ðð?¥ëi,øY;­áeØÓ·ÊEw²,n£Ú2[¬õ 1§±$I¬¶•iIN$Âišõ}{•œ¥‚g'‚Œ1¢§·´xG°¾ÝCÞ½Tzæö³çë­–ï¶Ï¾ÖbòÙóô—!ë7­ÿ”öôY¸ŠblÆÛÂNçQ!tþU(e![ñsü ™æ[á†c/ÍQ(46:¢6­Ä^b°hÅà -ò±‰ãT„na0E©JZƒH±’íÁ±8ØøËþ8‡qœheàœšáç6Qæ;:­kMöP7è#¨ÃCê£a¿f֛]æ]´Ç÷*ÌwÆ 5Å¢• c…D°²9ž?5oJLYC9>Â9ŠÐÐtÂ+"ýKìÀÇøðîQH«é -]µà«±kÌ8“gæ#/#«åkõ£1œ£rÔauÍ÷ûŽé%¶3P†%XŽ_c*q ×q“ûsgªÃèxä OÐÜ*1U ·É¢)–i-â2­|5RÓÁ‚`j+ú›±K0݇£¨ÁE\›ß -¦ŠB)‚2i­¤×i#m£}tˆŽP£ÎWJ©_èÏt£Ý`üÍNS!~{ §ÔÆ ÉL &H>ëñ@Î7˜Üô]æv+Òí|¶=ܼdÊÍYs . Ùx$˙Ó0U¢^Š×pŸ‰n=Îã¯ø‡ ¤ÈŸ: NrÑ+4™K‡é1ù¸«ä/†‹ø_Uª^OÕG|'ì`û˜ýØ6¦ÒxÍSךßâ'I2ð*J°°5cŠŸ³¸‹oðD|8¨·ÄšJãå¼;Äþmj–ròãU|ˆŠW›T­Õ;ì—íb{‡}ÜD›4©-%ŠhY±RM™ÈÛkͽ8(™9.ÕӀGԍzQ£)”E*¤ùTB¥´œVªt‚NRݤG¬ÙÁÁ‚SÏä5¼•Op 7ð]5Ye©Rµ\mU'ÔEõ7¤Ý:J§i^ª—Y°”£«_]sHs±/Ï·ÓwÆb'Û?³×ÛÕvƒýµ 0Ÿš{p JbÌÆl‰q¥œ-6â}©ƒãŸq’óï Em©»DÜ»5oIwšD>•²©@V!ÍüWS%£Stšª©–ÎÑeºE™$ú!²FKdrœa'W²—¯ËzÂÿTý•[ SÃU‚òÈiÖ©7ä›ÿ òSu\­Tv#•zÀ—9ŽVrýŽÃ¨Z¼…©t•ÎI<L'¥Ê‹Ñ¥Í.G¸#œ» ¨§Å¿Ã‘jªî¯Úa‘ô8‡×²ûéš8U*­LÕónž¡vé-:®¡\|‚éŒÁJÜ]A©d(RÕç[,Z~ªÙ*æ@³Nß·X]–9O¬¾¤zHéÜUÐÍá’}=”÷8éÀëRùÓTÄè;jÿ„o -¯[©ZÎxE|’öH^b¤P:½«†b• -£0—·¡—p©çLüÖP°tn“ä¦/@«@ž‰«œ-Y¿Hx­’:-Æzz nòÑiÔñfŒ |õIs¨o SóCªR©¨¢&]«kY‹¥jA3J¦G¢TÈ^™™Ò™áª¿TM ,vKý¿*p:òZÁE˜C;Ô7´Ç`"òÕBKÛí'zŒ.ˆýA¦I’c”¬8+LGë–;$Aªq¶Ü1…ú¶µ¦…VWÔ÷&ۄÛ3¬öö-,tReº­—^JÅ êJÓi’6<^3•|Tß2!ԎÂqÉH‡ÙRõ5N*54I*|º£Â÷Ž^¯_׋õ -¹›šdj®ÅìÄå6ù@î­‚ãAsšÌž9rGDaž—Ó%àE™Jãä[:¦È<õȔ,À<”Êäý-¡Jn¨ñ‚ÇtÑ+À\á/”j9VIÿ¯Ã™Û±—ø ¿¯Âù >Ëe<7pC}®i -®ê7u9&£/&Qgñ¶©ëŠß{ígûÙ/ö{/þz~Žóž_b'qB$ä£ ~MHF¥ã#e6!•C@@7:R[ÚI„MPú`ÒÖ?¦}HÕ j7UzNYê„QåI¨Cýkü±ibSÖ±ªžV(+8Þ¹ÏNJ¤iÚÍËÉù¸¿{ι'÷š¾”Õ Y˘Ž!Ói-£¡»Aç•|ë¢q¡À£ý¹w@;0µ/cÚ¦²t !ën3C¯,…¿arq(óÚãVÙf ‡(T4Œ×óâÎÌãV•Òl怱¤q$gŒÀÒÀ‰£»XœÉfL|–TèNè®*û;¨ SMîyÅdµAí°ñ|B1L´ë¤:‰èóåÛ(2¬ãM5Ó²–ÚÍû‘±ëä{’®Hë-m­y^¨86ïõU®æqæàšÍâ¬î”ݵæYLiOAB˜Ê´H2쩇’ƒ=ȘînвF™ "GLv(gð}TOǛL#¯)Æ= ?]¯™ªjü=DYš'k©öUÞL¥Ì–š"Î!ˆ)`ÜjÉ]m­/Èí¯ÀpÚ¾ÊöµƒûU•ø|AGûA0gvf*²‚ö˳HoOeM’£–ÅUKàYj™Yµ¬ ÏiÉW}fLWbíóñÁÚáÃ}&þóÁŠ}t·6ºsoF6rUߎŽ¯“*öž5[•3k‡26™T9"Û,+$å¾µÎTÈp¦½>‡•Ô -Nd¥¥ÁʈÉç¶WhÖ­ªÿç Bù_t”õçËaU˜f_j½üÄ:y<ΰ`{‚ŒŽï5 ÷:ÛT Ãє#gLÊ3û5…׌y¸‚$ŒcùՈÊ çesäB6q÷A¶4˜×ð¹yŸÛ½73ÏÃsçÜxf.7C¹Ál¾l™y!ÝÒª¥J*(T@£}®Ž´¿<¯#4cYí–Â’§ Y:ת£é©èøÊB k!.¯Ó{Å¢¯ö¶ƒÎUÑÍTz7U{»ÀÂSËÜ{àJC•F«ÆÐxæñ|°™U0ÀbbÍ|U{YÍà ó[ÚI‹1Lj ô2§£YÃPàGƒù§÷d*Üoâ J­Ïš0¿iQ˜;K‹¼9³&0ö{5jHÌRQ©TôF³Ö ‡Eá0Àfá6`?ÄÀ9ÑHÞá,`î -성SƆܘ9›DX'ÕÍa$¹¾új8õ ¿Ü?Vꆿß?ƗúQº¿ÔO7vlT¡QÔCvôH±->Òô)öE„ÉäÊ#¸»ý^.;ôd3×Â&ä­u‹A‡ƒáCÁÚÀÖZfŒek/zâž½±€ÆÒºâäXi¹Ÿ/òK°\º_{{1%;ð$îÅî-›7Áÿ['\ëý"ýÏëÐâÉIÉþ_$9¯(9_x’èåßÖñݘà]š',¸¹+…K—W -×9· yâøé„qÛÊ#rªŠ¶™%lD"RÄN³¢#ä u»4àõÁu‚ HÝ¥<¶Š÷>Å»€-¸ëÐú qºDWg÷±«“$ô¡ $§þ+ÚÏN¬”Wލs ½Ž·_ºŒ·ß´aO|eТË_³}·ÕûX6ˆ%ÖփzÙü;Á~}¿Ì¾îzý!þ1{¿ÃΡ9ü[|ýþÿƒ½°!‹=ü»_Ù<[Ñ[À³ºO¸®µÛ°í–PÀWó¿§ ¥ârq µa#Ç''á-WÙÞRq¿íviŸ ’›üÜã÷ -ÓðE¦QòqæíWòyÀM+ÿÕv‡¡o¹vüî{"qk å»ÈV^žms5?ÉßT^FÉòç(¿òçsQ/ëuyÉBùâËwgë¼mtDKù®®53Qo½7.uÅ¢"ڀ“LM\óªbë#2LMdȇs¼RǛ ØáiµÒi¬È߇ؤ!£ŠŽÐ[‰ÐÐI}/ÙÀ'ÂRH -JÉ/1Ž¨\'ÇäzÙîH&š͉–„ÝááÜ˹8'Ç8l‰¸Ð #¥6¢ã”£QGmövk>UDz$Áµêh’‚†)Iµ@KF=Ն{oPÙõ€«•Òþ˜J ”c11/”ê:0IT"ó@$7­Q’ôk€bóC?[Lô¤ÛÜ@‚”«óK*äS=ŒÏª§£êÓÄÍ [C”TЭovx+o“ øººxëȅ‚ð9;A“LhqøA7o»lwNüÉÓßÝP7ì 7ú ±m|p|¨EjêýÊ÷.¥ÂM½Û/\$üh峟}û‰.õ='>Â<åãoôï9õÒï4I[¹½8ÿÒ́¸Ô€ÕEÙ¾%ëŽýœÍü¬è’ åºOp +ëòq‡lg} äÄáŸê,Ïq>þÖE¨†ˆ†à\Õë¹S”ý 伪½ÖÅIÄ•œF -‘›º|ñ˜¿FŽ¡(z߬dœïb?_*òËÖ/áx‡z_{ÛØ¿·ü›uÂÆ4iEYP7YÅI[§^˜ÕRÐM¾•X$+}ƒR¬¬üÓÏú$·K²?x¸/T+†ÃbmÈÞ±Ç! ¾ žø%x✥îΓL*£óÍ5B£=î–eÿ@œñ0ðڝ@nÔ^úpsº¸¹bìØ(ÏÃÑú³Þ*7tn÷½â=›<Ût¶ù­¦·š¯rWZØÑìâzZìÍZK,åOƚ4Îï¡ #}"ƒ_ˆ¥ ½ÉÕÔ"†ŸMYtÕ¹z¿ê[æ^B,òਤWXÖÍE -øßW(&tA½ë/Â@ã“5ä›ð 6ý=ä(jÅ?X=¨üýezN€›‹Å4¸|‰/âªgõ,¤+8m´¾A •D@ ë¨Vtª÷ëXlR=t§OW ÇÇSÙnÕª½Á@@íjèÞJº:!‹NGµ@W˚ã?|Wkp×¾ww%­´’vµ»zìZ¯•%Y’eËÆØ ‚DE8!úÙWÏ0HYüwÝì®·¨õ‚ ›¨N§–÷Á›‹#á,>ß/(eÆbû×îøFΚ®ƒýFFÓ#ˆ ”Ø“Ô°Ãá'òRÇk0{  3\ŠŒ>+¬¬j¢Ð©°¥3Ø1=âcn[„ªI5ˆŽás‚Lð3÷wÕo=síýÕ+fêQà^ÛûÒÑë×m`*î'˜d6åځ }'¾®ŽLÑ\¢"þò£·_xïÁã¢Ê°¡'EÈ® -|RŒ*p¯n-ÉáÉ!©_óGò7Ê_ÒíÕL-;ƒidg3-¬1 Þù Žï¡Â^<9œÍŸÖ-p‡o‡Y[¾ù Ã0¬ÌÈl”‰² iºÔ(µJˤ5R—Ô”úÂg¹³âU›Äak -£ -F´¶àBm¶&¶*µ²b_h0ñ™õ’å²UlaA\‡”ä€Óïò¹Ác ¡°Íá¢\‘¢Ê“@SqSiÂà6ÚmáJ葞¾²zš6eñݨ— %õf›çoÆz”ÁDE‚I¢þ„&¡0#+µ£?T_aÇv¥rOÅën[‡t!¤Ñô(XÑ`%RëaReB¯d -í$ƒ# ¼ƒyÚhµq6ʘd:J¡,~Ww¢¨4ø¬ o`–ÒVdMž²×ÆYêk½Èæ9Eõ1Í"†/¦Ä‘ïø‘’ ¥€oˆŸœPÄÂ/¡¿qÇTÞ*h"ý2¹ÞSý¹dåN¹%ÉMqÔEúŸLT|½^µ„ýÛÅÒfÎlâZ$ 2›Ìœ©•BÀ¨à™!¦Œ4/ÀÆXÍ¿Cºq€¦Á>(º3ˆvÓ¸n§_¤iZ•à×xüóÃÂåt))µiÔ3¬B›»§ ÀsöòRxvO! >ãñRܶËÔ"œ”]¹“¹“0¯("“ÏUºí¢GŹŽ"ðýn˜(ÑÆü3‡î@1TƒÕì5mô–ÓQS$P˾qÞPFè̺֧Y8¾Á™Íßԓ|è<ùKÉÅÀEíjäJ‰)ì,q};Øi*™LGZJ–ñ˔¥‘ç+x“¯ôU’iˆ àDm‡-n´ôá)NŽ{eÙçՂ¬GËgZYdƒîüÚodU Až%Pê$½ -£¶àBYØ_ µ£6¯ìï.ˆµ››Ä}¹%³?i|±PüFȽìƒÇ˜ »àéӞŒ º4OcÄLùâ<Ð¥ -y«rÇ?éÓ³¤IFÉìlð(ӆx'¤œ=MÊVh"æû¿øáΝn½sÔouõý„<sR™e薲=ü©çþÏV}Аíä|\⋽ƒcCÀÕ÷`—I·::núÁë'Þ«Kº$·›+]ä+o#rücï«¿8y)ˆø=AXW e–ýzD·/²µÛ^¶ï-é´wÙϼSp³€õÒ.ÆÞÇqSVL”€’h=GZ1¤m=@×ý)wV¾FDZ£¡‚àU©¸ÈG24‹Bâ~­ -ê0¤yDwÄE]Ü,^­¢T¾ýAðú4w4nžÂ–Daa<¡E9Öä½8Z‡ƒe4Î̯Y‘–L~­*Åãpy¼¤¼¼´D«j4²FóóÑqWVŠciF•†|ՉzV5RKz ˜èížÝüÜõ±—8ÃQäãïa÷c?“þOøÕ/IظñŒÿ¦[žU†²ÌÝ.·¿ uyφäü²"#²MR€Ÿ -˜–DžDJá'‹9>rVµ+‚™~ž­Xn£ œÊ¨“Ö5s,õ_óÉhñ¢Ž•m¯´¬R$Iû.«^ÞÞÒß°‹b̐ÆjÃÙ(.knúÞÂô?'ýkY¹«Hݑ~01aF%äÞ_!5xln‚ì=¦I¥’.-–ÖHÛ¤ïHT¶ƒ[. Kڙå6›f÷¤#"ʱ–wa8|.@:ì,.‚Õèï!jCœV«M -@ržÙcB§T.mœRmý—Ï€n:ç=Äpyö ¦…&6|i˜‡?wڇ?%˜÷EPö+6÷G=óðói¤BY3ÿ"údÒ¹hÕËÚÄ­âË"‚…}9f<¢úrLtÞ'q»5@NÕÍq ¹^ÎÂIÒôÕã…?aՏ]ñ¡G×û9^ïD©Ÿvh­"Zk/bh -ÆôZW¥«Ê9ÛUíªuÍqé®FWÃçÚ+ìgä®Bk¨pi j l£¶lTi ‰j -,¥l ºrŽá¾¡jPª«®žS§UŠ.<Ty°ˆ¿Îßå?ã­Ïñ:oáSNžw951¢Æ&4NƒZ*¨iJP‹T$ÌÉ$—„ÉT<™LĵŠ”Ž'× 5‚ÆT}c£^¯ÅÉ`nqQ~N€T¬R¯!Rd,dñ‡ÆBUVTD""ëpª^®”'<íèy˜›Tórñ8·=æ>¬#âj}n<‰ºÞº:KÔ;å›Ö㠇‚ÚÉ: ìt“ÖõµÃîLÇÉÏ&ãî'ŽZ·<Îü$2¿Ç0ÿLd( æG}k·Ú²"Qkžl¤Äzo‹)Àg÷c* ,pµ˜ ˆ ­­r ,ÁŽJXы¿þ×m›µlilA+ ð -üudyÇ+éBwc 5[Ä(ñ©s -(aƒ$S Ï$Ë̞ëÏë74´…ª¶V¯¬hnÆJ}í«Éâ¯5¤ŒÇ…%E…sé?à‹ùKÛÒ­M©TSÍüé³XÍ𘾤i]ú†ñ|¨qYNt­9˜ -HåÊ—!•W}zå-ò /‘—hx‚î"»h˪‚k¨µôZÙòšü ¿¥tƒ3ÐP^P ¬‘_Í$*"S’(ú$ŸYƒÜYf rgŠu:³XÍmÖ Žˆp8£9ÊSf!*­©"Áp—PQ’²R¨&ñ¼›eXÕ?$ —#Î(G¨I¸M!.S‰Lq¦GP¢ø_*ÏÿW‡9`£)š¤!°!ÁÉtŽY‹bF-š[ׯúØ&Î;|ïs¶ïlŸïîõù3¾;;‰“æà $Äé™ø)kÕ]VRHéPéšÐ* ƒM6ÖIãcPV í†(S骕ŒP jÆ`0Æøк…­‰U…‚(C*YaŠ¶J«íýÞ³C-ӒÜÏ÷Þ½Îïóüžçù©¾zñ­0.ЫŒ®nPÜiÅ ø9vÜÉ¢ÏÙÑcó7w=9'µÀâÃe"s³~ðÜ£+û'»Q‘+kºÚ«¢Ê~2áF]«fþ0{ë.‚€m)' á)?zÐLIŠMÁ~…9ƒÎðïÑï—|`g—Ú{Dz ½ÄÖãèázÝϊKä§ýŸÎº“áv—N‘~‚ëÓã·>M·¯i…¼T=õ$˜Õ0½Î H:kÂ6ք=}ìQv„ý½É–°ÃèʁHÐxÎkÍv÷‹…¨AtÇ -…üíP¨@(Äù±ƒ^ìÁþCù+”œ¿rÀ£ùN´µÉ+ØÎ`RÄáü¿LYˆfx ÅÁA±“Ïo˜¥Ÿ±c^‚—P,ú[1)20Ùq”à†ã\^ø&šÔ4ª&ê0ù§ ajbžš<•¦s£ÇOäþ¤ǑÜyy×®ËäBƒÇr7‘xôs7÷³‹—v¾úá%À¦r>éÞrjÍL'´$àjª‹:én÷S0a—º—£U÷-«ãÏã.Ø/8ÿ–¸Ðpýˆs™f•}³`X%bµl0Y FJcJÁ¥xéô–4#–,ºrW%Ã1€©ž¤ÎsU:Úf³SªQÎVè‚9BSk(Jç”.*í+µ•§<±y"ô“M“Ø?M[ÿ‹òþ½»ñ®A`¥«þ ^ ¨W»Ü"¨7ä?x+¿¹…8¦Ðed ÷l©IРûX±ú¯ßÌe\ÞôŽÕRÖ¸Öo\ô‘ü%&ÝԎn™ëq&2ƒ–¡º¨žöm ùç©wä3måóÊùÖ÷Û>–¯6^oûLkü´MâeV)iu¶©²Oñµ†Û6Æ^nüÀ?&?žêIõ+Sß36¤6¯ãý˜Ûl ©ô\GuU¼¢Áœžn Ýçj¡§ÔÇmuӏ‹á(F Ó§ë¢>“FM­Õ £WÌHÅ4]§ {g‹>'º(Úe¢¡Y _‰U>Ý$Šª€vš]}U¨*øÀL;ÃVp:ÿÄ÷ =G&² "ðÎCÕ£ÞìU«ù²ÙQŠ`Ü %+¶$I÷À·#œßÂ\j±Ì-ÕÜ&i‘r¹ÜßêS)#Ü¢¢f ŠÔK%P) uúý¥i𽐑N©ÓT -Ï­ØEL¸PPA-?Gÿ ¹Èáüß)þ՞¿±¿7ƒäˆ)éHj¢»ûad³’X -ôØ ÕÀPRD^¬ ´9nÇ Àí˜2òàdȦ·‰ aR&É18A£E¶q¶%¬|æ£#¿&0K^65¶Â;" M‰Š² -‹…S˜ÕdÐ ÈÀ)65oÝ Ƭúµƒí_[ôçS§Ö8|n"RÐßÞ·{×Üy¹Së9·m/S] -L}1R‚éDª¥º)]ä@|õƒKßXÞPôW@__ZŸYÙޑLjÏ¤Ÿ]C&”­à̆m+UC1ËþFîp(Lï憸ãÜ»ÜU®ä[žµž—=¿ðœäÏó¬ßìDAlh™ésØlvG y±Ó' -^QÂ%AWÕ0zÍ£FY™Ý@ˆb]zÇëmÃè—&®©q8µ -ý$ñF´È7"G#%à¨%Cè*ˆ¤­«TAÁa¶´FÉbÐ]‚ ,ò„Âχœ*Ņ]*EÂp n4Þá¢%ºÍ…£¶N~¼Ý§!€hxÚâԊþΓÍØí ¸µ÷oۻà -Ê f1iîì_Zò(j€týË"&‰&§(MÆX–±,!Š#^ –öcpN6nàaÔkò2m$Ō8(2â!ÔKÉÈiºM ÕK}Ò.é¬d“Ž A`T9ÒÁëŸVŒu÷_ëõŽ)Ò£¤·È_&L®+©«^÷Ýëêä#@9n³àVwH1i}×òî×dMt°¡žÄ£n=ŽŠÐ›1Ž¦Þý„Þ·9÷ÆW ²È u#j,Gu›¬i5T;7AØüK…i"PÄ:•ÏÛ^¬+™s_¥’ð¯eÞT^÷Ó¿Vúí¥×(?V•ß*—”œâØEïû/ãUÅq…ßìÏííýíÞþÜîžíóÞÞÚ·¾ßù8[v𶍥U Ń¹(?NH„µª•4ÅRA•Phƒ#¨”–¶4IEՒ@Š\‰ÔRhPKAj*ᤆ¤ -V‘J¢4ôLß®m~’ -uG;oæíÌìjç½o¾z‹¢ƒLPÕ]u¨&ÆQ³ZÓ¦.g–«k˜5J¯Úkô:[Év¦_ݦm3¶9O2CêÄóڋÔæeõöu’Uj¯¯;gÐÞNœ×þ‘˜ÒòáDM"Oåym—±ËùUâdb‚Pþ–xŸ¼¯}LÝH|¬Åûñ…5ëÇ6?¾°•ýxł"Š²bE5õ\ l¶i»6}Ík²ÏÙô€=lS¢½Â¦lû cÛYÇJ; xšâwò{yZàëùnžþ'O~Ïó—<áùƒ,ÏX+Â2fҏۺº‚QW—4,ÓÐG¨„fŽÞ|À-© m*,ت¢àqæ`XêF¬AŠ&¦®aÕEhSMàˆ5N&QÚ}ãm7G%“n†Bè&”íH';L¹#舤M3vèD?mQò¬ÛÏn±Õp|Ùp²XÕ¥°2’X ñ²Ñánpˆs’¼„ZE#ϸZb5嶴—)o卣\1^¦FÉKn”57¨D=­0Ï)ø›÷j±Õ3ÇÚÚË~7?ÛÅ×øWð-Î÷-.æYWJheÖU[w²{Y -Øn–bO‘w¡éŽœú¨R¹uöOOâT%)V½NU¿bˆÕJRŸž}xýŠ÷ô.Š=–ä³áëâ”רN{9|J|­~»áÙÙ¬Ìçõ{äa¡R© ~Ö÷Yç­ü¼­p_s‚Fo“"òxš£é,=Ës™*ˋdùS>zwÿØhÿ¯›¼t}Ï«¶Û<º÷‘TM²þŠGœBÕV§È9¼•RªW©ݙÇ#¨>`—0d>¯ƒ.éV>šÖZIk¼;êj7ä[a^þ’ü€ÕOúãCòµ[ÞmÅOÉ'¬ 뢳t^øÂêŒ_ƒŸX±YàvßD*Iñ’< á©h´p »k¬ÔpŠ¤Z)”£5V&߂CŽ7}¢¬¹áRssKÉʗdžòӓe–¥ˆÅH*~þhEhYÓÙJÊ¥œíyËf ™lÖÎX¹Œ%—JfÆR2+.I&$H HqÁ+ñÒ×Ô(É$"=å!½Ý‘kéÈçs1H­HQ©ÉÔ5¦—W°X‘5Ùv’½ÆXcQî„’xøÃl×à-ÅuÖû4Jkßlγs¡…æ^õÿâÿ|Wüôh.(v;É­C!=‡ÿ·Cˆ»b*€gÄ]Ú,M=:ó„‘JFÕÄ/ÂÉòUŸ\®OŠJsõêw}êVëFšUy?Ôº©WfÃ,šànüޗi²¬a4ÕT?ýe–…&83&=2ãåXDñ­»0,uñŽálÉÌÔb²¡¨š£6­Ìnmoäb¦^¿ þ±7ßÌ^Ž¥ª¯¥9—‡Å!‹a*é*Ï3`.@“¹°,E¸žl,ÖV–Ý·Nb‘X<ÜõÈÖÝRÝÓ¿ ~Zˆ„¹ø—u‰.­êl‰2υš¿9tcª8ð ?‰™Û‹J×Bíðш7']A·Ë_#«„Íd“0!°¹Qôñ £ì˜ »ÁÞ±Dª,x»G¶Ñ+ˆeۍØå Á-¡‡å!m 9`9‡Éaá89.L á<ÿWá|òOöUaʖ{øžðf~s„ÉÔ¥D°Ä&Èԅ{šÒªÊq™t]Øxފ5¦»1uS/ê+ô ú€¾O?¤ŸÓ'õ®§biš^2ã -kŸ5nÑփß×ó…Ê äE¨[as*º|RÂv¼Ž‰È©;;ñ—Ïã>Tòl#åÇsÉWªÈÆýž¤*€ÿùœÕ*—æ6C¥˜±sk8v몍¤57°räüÌô˜bær=çÞ~ùឥI¸C§†jµùÑo͜é!ã/ìY?ó¯gªdfjéR²ãҋ/\>Š¨ÙLw ¢fés—wsÝ|w¨;̸¢w%Waº¸.¾+ÔfŠb1^”Š -Sà -|!T3‡°®çêùú°)šqS2•Dc5é㐱8³Ö5©BM*U[c™Šµb—Ô-QÒzA’DÁRTÃs¶h…¤¦IKm¨5Óf ÀqH1Bш é&;É8¹DX̚bòP’J.£Uð6÷ǯ`öõ¥Íÿ–/÷P6•{÷(¦/Rñ/Ü긷³F­e(é»zϤ=}j ­m杶¶uÕêÚööT<è¡÷à­.ËáEÍÛ‚:î@àƒ§ŸX÷¹¶‡„΃|¼ëç +7zöBá{ÂMî“}̍`»<Ž÷fàøeõ îüٛÜÍuÌ ß{çE3ga›×@ëMø€„à$Lá=CÞ¡*d!¼ ûHN³p.ã“#p.ÀD‚?Ã{D&gIl‚-°ŸÈpâ°v¡~ðgµØÒ¡#ðÞ½0{aˆÐ+àëðê>ø;éĕüöÁBœñœqž‚Õp -ŽÃ8~ -ÂðÙ0>} ~}¨ÜÚð­#0MF¨N²ÇıìÄõ½7­Â•n—#8o¶œ˜+Þjó¥o®ü‡¬Ä¯ø6ì%;ü¯ö 9Iºð=~ëc¸Ò&؏÷:8 -ÿe½Üƒ«ª®0¾Ö¹ i ¤!DÒ  $\Áˆ”Jkr­`‹TD åph-A‰dìXƒ01 --CIÐ OK•«Ž¼ ´„‰ Òœ–Øê` /iUŠ·¿µï=—K þèùf}û±öÚk}{í2D~+iPóäfó”œÖ2ÏŲ]Æ2³ -ڙN%Hº,œgþ'õ²æÒÏKh^Œå;I©7NRåër Ké+9˜a½(JÆ:ìÒc†´Àݬ»´Pc½ Œ¹Ë4ÉY/¹,ÏÓû Œ—Ïê¥ê3:^‹c+nëRNŸV»‚yš<iñ³ÚÉjÞ/3z¥“JzöåìfR‚ÕŠhgbý,cELÆbE´pRÁ 'c¯íš-µòžÌ‹´h:Ï©âi¹/v—W±Õ*©örÌA½/ÇîQñ/-ç¯ÕvW[Ïm_ÞtÿtÉ¬wž€§Ãä-fé1¿5Ú½¿Æªð™õÚÍ?OŸÐ'ä |Ãlä[ηRÔRåq)ÅwKå»Øyw‚ì¡Å6Ã"ÿ–þ‘ãò©‹ÔDZÉEé$¬a1úkô˜†ß4 C1#äHˆ¿Å2•U[¢»e¢vûu‚,‘­^W$÷Koð ½o”ùÒWÐj)­OöÀÛdpä+6‡¥Œ\K„’¯èd:ÉÇ«{¡À|Ù¤‡ñíÕÚ]6ÈZ-ÓXݝÉZm“}°ÆBâïòCž?•/å/²^ÈkrXÖ²Ê ù»Wþ#hõ_ˆœœ¥Þaìeòžƒßót-Hèw¡ëÓzŒ÷G«ù÷¥¼æ}O«ôQí«õ \ò*mÖ¤Y7 zRÿ¤Ó`¶ÏØ?Çé·5I;i?Y©çå´7RéMÑ~šÆÊ^‰¿F/à©Ðõ$„a}RÄ·:ªâ{¹®Jg¹ÉÕì†vUcy‹-»’]›`ÊO¤ù„Z«‰€&ÆÓÑï5º@›Ðüm¤~ë0 ^úÏÿ‡ Ýë4YM« ¢­×ϝžŽ,xŽÍOé/âsõ¿ÅæzM¹Zǘ8˜ÜµM¼l}u‰Ù'VjOÖ7¡ôm‹÷žpå6âÝþ'ÉÏ]¹E·¸ï_áÕö~]íb>n.›ä÷>/ë¤&A¼›YmüB~*£°ÇI|#؀%¦È­Ò‘uhM¬ÆþÚ(uR§ÿЋz‘ø.Õíú™žÒ<¯«½IÜ “<ý/§ôœþŽb…ÕŒõ>yûrDgè,4<"õè—ãiro¯åEøc‘Noƒz}QÿzÅÚq+˜§˜sœ?ˆŽErAþ¬Ÿ³^ïòÉøÞD‡UZ« úŽîƒà¹;u‘‘¥?ÖïÊåk¿F÷èot¿î‚‘8°@âûÜGm$¾Þ¨$îדXÉö w¸Qi½s$J±Ë;¢b:Øm´Ñš!¸~΀Gç8)Sio2Ͼ nµýî>t¦/ü¡Jѐ—ïån(sQdžè{c«(ºÑ²Íhk' -¯+5ÈK ږ´ŽÜv"øšˆm¯´ˆö¥#°ËgÍX”_SúlÚNg‡6JŸ-Ú+ãö„UÈ:/¸gJäP|]ے®DiŒMcëe"+'Ga;§‰"v•}º–ž‰¿%ë9/¦Ù§3õ°Î¯Ë Ç -çt_ëUð­“oqÖ °Ó×ÉŸç…þË-ôÒ½ltX*_hŠËEj\®Ò<(Cöѱ,:“¿ùN¬F˜üؾTÊv"õi†­ä<ҝh:岻ݰ`w¾Zf"º2i·Õev äN+`V˗CDÙ=Ô²LyÃI²‘|n…äs¦9#q¢HÉè“D¼vɌEäêÀxèçœ6²Ïë¤ -_‰¶µÉh`Ùfkî‰rÌ®«2PŸüì> ¢9í"9ã4ö{±ˆ^Å?Æ-%œáú» lOvž{Øíð%òKPÂò2udzM—=䒖!ïæT™†åºÇ¬W@‡Ùe–ËL‡0jæ¾åœe8†vv|‹õ°3á0ÞÎr2«’×ñ°mH˜Qç1ªÍ`§üŒÌ®ÒýIŽajüéUN“éàIÍ×þ _þÆn¨äFœÚô²—ê¥rÞêNse®7„¥ž{ˆ}ªÞöW£Ö!„§ê`}H'é]:”÷§?ììv/±S¨!Z7Q#7p³ë+ÚÙ+½Ù\­ ùü.=îÆìm½¹–œm7–Ìý4íBºI{é~O¯=ƒôždíðª&zŒîo3tG,€úñv§ŽÖ<í¡wk€•8† -ÙîŠÎA6+Èrù&{µ­uë° åDPÅ®l+õ•ÙØz''‘ýX;LÆ~†•îüSÂý |'È{q¾’¼ünǟivâ‚oc_±òY"2‡…Ô“Õ5éE~?T~B» fj­+èsVy)^Š(ÒïDyÜEn®|‹­v;Wòþ4LM$¾í· ÞílëW™´Ä÷»>œ'Jc°Yr Y¸E}ì|®…³;Øø&~DIðÝLF{/’g)ž#<;ñìm"¡ù(P»ó¤c´V­òeĞYð" áG -ð&86Ho"¸<6ˆV'ÙïÀŸb;Ié ùYàUàŸì€Jû؟Øß±æ¡oÒÛHÝX“"ºë<?FÍð *r\0Ë|ƒ~=ûT§Oÿì7¯ü>‹ž° 8y¶výŒd§Ù·ŒØÉá$…ïm~Î&Økì5ƒ%{‘îØ×Õ;ö ;C7}ÐÎÅÜÿ¯¹ˆb­' >ó³ ïÎ"ÜHG€*£&¼w¾›mÁyú)b¼"DK‹°w í­éB¼Ðê A·“¾HWa1¹°ògØ)´ÿUVϾ„_‚ñ®r«óºÑy7Ùҙá„} -»÷{DÄ_¿×g^§·P²;ønýOâ´Âc=Œ^Hëp~£?‡w‚|·ÖÁ‡È´˜RwGÝÌÙ´'ŸRþ:õ¥|nÄX©ÎÂËthfzfF•-ÇØdŸo%FY€™ŸN{tËÒa%]·¼9¤gNí]Æ^§=¹Ÿ}kú`aìÞaõ'zx‡–²z:˖Z£ Ý>ä•ÕþMÖq<“Nå|:‰¹G‰æÀ,[ÿ .þï‘÷µw`ÃIZˆ[®ày„XÙEMD‹'‰îl'ZòÑ]÷Ì¢bÌ]\%*yŒ¨´)‰å؉òÏUü‚hUÑêz¢µÙIÔîÑÐxïp÷IÖ;44444Þ/Ô½­¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ñ®Áˆò§ø£ÔBS6ô!ª¢n"þç9]”…<ŠéÛ  c‰¤JΡrLå‰åY2§EüIK΂ü¼%gC>aÉ9TÇ…š,+mgÍ·dF+³+,Ù ü쭖̡÷Zr佖œ ù˜%c<ٗè9TCÕ´–ê y¨ŸLð-¦§aŠ(M#rQȒz¡¨kP⢠’ èvàÿ8ÅTÎ7Q{¨_ÕÌCjF®Z“vCãV­‡ÐoªŸÍh}m¡vÃh3@>È>È”EÓýˆôè«©Ҋt®Ž*Õ¼h!‚ºýzяlÃGVÝVäú¡•¥Cc,='¹5à-ÇÓ§ÖBÐFä{Q"µ^µ7Î1ÙNؚ©P½ ¡Ô§æ+s}h{7þ*ÍjùÕÊ èSûт1ÉÕ ¨ÿBjm7¨ÿMUäAô)WÚ¯¨°F”ª+”>\¿Hzߙ‡,cüÃ*4Zã Xci»a>^5:i ~Õ·ý€šgß»±£çDMõÚ:áé7Ŗp(Ž˜¢1„£Þx Z#\Á èìèÇD‡3£»Lÿ‘—×löFÍÝÂ1CùÏfïpx(.‚áŸð…#ÃQùÍW׊’ÕUŠo0Ò/š½!_Ø7mk¸?$š‡ü1ٓ§?ÁÙíô…£bc 7ðyƒÂêuÂèTÄÂCQŸ Öß퍚b(ä7£".çÑâ›>337ˆ˜i -s°×ôûM¿&µÂoÆ|Ñ@DNPõá7ãÞ@0¶ÆÝÚ±±«sU#š˜Ñ6swûÖ-žÛWZ9і¦WÄ£^¿9荈pß­—øvó´;øqn¬Of×E´*Ã9$]C;mÅȾüq‹ïç{ì6W.òŒ®Îæ6‘Øä®ùžêJOiƧ ±»ŠøF5QM`TÕ5P†VÇ¡‡~úq¥'¦šZVa5e  ÛbKÁ5wóNœd;Ðâ]¼3Qc?áÚη¡é#ŠNr蘢=ŠºQ¥#J+9¬d§’–,iÕ,jWÔ&)ïà[©šóVÅÛùý´܍¼äm¼Eñ-|“⛡¿üc¨WÞÊPùä›À›‘—| Ñd¯vEïA™þ¤¾ ch˜š°HR3L—”¦t8pU“ñ&¤F$wᏴр’â¼ɉTÏëQrêÞÚÀjŽÔr 'Öʁ–ضÇA9Ü*ø:ª€v`;0íTâ¿JŒ«=TòÕTŠ¶–û¨\XÜnì¥bðbco¢ØÞàÊ5ŽR;°ˆ£ÆÑĜ›«õdÝ*À ô#À³À`.9“% ó §áänÃͳ`ÝSGâµë“ü#K“|Á’›+Ê+°Lô,—ñ± ´ -p¦svÀ€é”Ñ à

ö~ -Öø³ão¤\Å]°°ËŸ\Gî²ÎÿY0bœùà -Í°0ϹÈ]´ò|†¹±º}Ï2—xɋ0¾ëÃW¾Œ1Zôb¼-L· ãÌKÎü^ÎÊ^ÎŠä¬ 8©„CwqÔ-D%‡ª[/qŠ¯À9¶/g×ÓlYìî£:ތª]§e8 ÃiAoð;7oäùê²®÷Qo -—ÎSÇË×oÝlÅxÓhÙ¼jØzTï¾ìç]á®v„ºÎ¢u͖½Q7ëŽÑ´ý‡µædoOº¯ž¥‹&›ûkŠ`“"W­·»'Ü5‘«'rõD®šY“¹dÕCYjÈò«A¢*3PÀõ­±ìÇge5ÏÑü­Â£4ÂÐAæóaÃâºpMW¦+Âo™póëWþÖ-<®,˜G åm8Âp0xÅ#­}5¼*µ<Âvº˜(øä Ûî¡2,Wå¬ÏŠ\™ÅŠ,VíTúm$g5ì ¯-ÄNøç£DÆáî2@á‹MÔCI‡paK;ƒÂ 18! ™Øþ`‡Û7 -endstream endobj 12 0 obj <> endobj 11 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon.ai) -%%CreationDate: 6/22/2019 3:02 AM -%%Canvassize: 16383 -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%%DocumentProcessColors: -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%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: 2 -%AI9_OpenToView: -497 224 1 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 67 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 29 0 obj <>stream -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 1982 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 -%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDDFFFFF -%%EndData - -endstream endobj 30 0 obj <>stream -%AI12_CompressedDataxœì½ms$G’øfýê>¬ÙŒLDgfddDÎÉάªìRš҆íJ{2¦$!u-4zFÜ?s?æþØùó¸‡GdVˆ~áìè–²òʌȌyÜãïþ¯¾þ|ûòîOן‡³nó쳿û»ýýõÕÃÝýo6$o¾xõêÝۇ{~õ‡_oúé¬ÃUÛ/ò·vå¾¾{swû~wðí%îÿÕþ‡û›·7W·›Ëë×rѯ7¿ú5¾ýææáÕµ|óâîöìêæ×ÞªÔr~õ _MχáùÐõó&ü¦6Ûßñ’«Û?_½}{ó/×h*d¶´»{wûòæöûÝÝÿúÍ&N›Ïǜ6#þF|ÿ7¸~ûØEg9μòüîÅ»××·_Ýß½¸~ûv÷êîþíoÚo.ïnÞþf³¿{ws}ÿûë¿|õõï¾i/øýõõË뗧.Û~¿½¼yu-óúêaÓìÉíýðíîÝÍ«—¿÷úO×ÒoÓܓ¾å3üñíÕ÷רNþ&=}ûÅk!}}ýð ï$-q@þð÷»öɅÊò«þJúìZZ¼ÿ×·ÿí×¥æû»7 áîÍç±6ø¿³o¿¹~ýæ• ûkˆÓY”žâ¯öC¹X^‰~ú³œæyóù4vgÓ$Çñ¬—qÜôq>›³ÝQ{úúÏ7×ùÍæ÷w·×ÖAÛû‡¯u„DZëô_ûêï^]ßÿñö;‘6kýîîåõ+¹£VqùêŠÃÒ×íŠo®î¿¿~‰q÷êݧnöVd~{õ£ÌVyskäË7×·ßÜýg>êçãœ6Ã0nðNCÞÌQþÌl!J#ýäöõ_«õ –Rÿ”0p_ÉX~yóýÍíoʦoÿþþæeà4l²þ÷8ËÍÿsùßV^ýááú¶t‡L®ýҝýîK´zqûr÷£ð–ËèZڗùóêî{û¶~àwRÅ»7Ï>ûçgŸ…ùùÿ|w÷pýVj|u½™§çßß_ýùZæs~~ñîþnӇ®¹âOWo¯Ÿ'£ts«Ô—RÚõ«W7oÞÞHóÏ_^}ÿýõ½ý’¸¹—)òÝ«ëÿõüÍõýÃwïÞ^ݾ|þõ‹«û»ÛçßËjaݯ®¿{xþå…Ì’¨uƒ õñoéÒ¼I^Z>èWz'ԇç×·/¯Þþðüú5=ÈB¼~.üîå5ևTövÕ¨Þ|wýü坰1áG˜ÜÏÿËKYëòÆo7Ïß¾¹z!Ý1Ï_¼»¿¿¾}ñ£|˜žÿéþNVàŸ®d÷S~^®þâî͏VçýËï®_ßÜÞÜÊíix.ýóâêÕíÝÃó~|óÃõíó{Š·òj×/Ÿ¿¾zÇ’n•AzþF˜´Üùîíó‡¿Ü½}'vswÿüá‡ûëkÿtõâÝÃõó×ïd¾†ç¤½|!ãÏÚ^\¿¼yõêJj’¥èwȽ¾zûâÝ+>QÎøò¾»º—{ðçW¯¾Ó6ŒøvÓÏÃó-çƒTµÕ·Íhnµ·þö[¼ÀóíÅó½=Âó Þþü‚7K-Íí~ßzÕÚÄÍ5_ø5?<ÿ=”j¾Ô¾Ô¾lnøRŸéK¿ïõ»W7o^ýøüË·¯0'þX^èzó››ÿèwýýò›îîe¶€ãÞÊT{ûüJ¾*ïsÕÜ}¥M_y%W쎫ëç/Jw\ëí×Zûu½Yªºöûnôª½ê¦iâƯ¹–î¸Õïôò»òLwÍ wv‰ß÷òæÏ7 hg¼Ó[ßiKïÏóÎïùQ¿~`güXÈÏ>ûæByaüß~óV6†÷‡oÉh.n_Üa¯þÍæÛåz°¡þóóÕÏW7('þæ¿>cíÂÓJݛoîß]ó㛲é°áoåI¾’îàŠúý~—¿ýêÕ;ùòïïïÞ½ùâö»»gŸýJå¢ÿ|ýBdÙª^n¾üÓ—"ÝüþêÅß_ÿËõ͋n¯…ÿmvҕB÷kEÚyó럨XøýõF¿•{ùQ~‡ßO¹ÿüú;0jJý‡ÿ;¤QøÝíçÿUxéÿ¼¾{ùî•|{qûçëWwo®72[7ÿxuÿæ)M|õêêöê~Ã/J m½›/ÀV®þÇÃ͟7¯¯¤Q¹è·7²G|u%ýû¤„™¼‘^ãM¼fÙÚc4_=©©«‡6;yȗo½ö-¶6Åw·ßô_D¯Jõ_ÿøúOw¯nÞ¾öÊ[ŠÿýÄ'•n½ýòVùþÝÛ6ßÜݽòš÷›Ã››Û·×¯VO-B‘Þ÷7Ր_|¬,žÿ-šØ_‰(#lñÍ7/ŽµòŸìûïn®6vâþ'Í®ªc­~ýæú_n®^mñ𶿹ÆlndËÞy‚ ÿüñF´†Ým{ÉßßC$¸}%ùïï^½„P U׿EH›ÝKÊã]ó__þ7÷íN$Íÿ äõO¿*CS‚•ÑJäÿ¥Lø_jœ%yÉݼ(Û¦ì¤ì­œ7墻”/KY³h_ ýÙ7e§¥,ÕÅx.Gq9veԖ#µ©qlG¤‰eÿ/{Ýz{ÕÃìUé¯yէ֓‹>\öÛª·–ý#ýµì퓭•™%[IV&–hed VdÞq1ڞª»‚/…òrÚXùÙ±l­Ì,ي,vYüi?Y‰VF–`EyrÙ„¯6czÁqÜqÜ2Ç)r\0{ÿœ½½eß&öæÈÞëÙ[ì{#ËÛ%¾;ÞoÙñ­Îù[>wâSŽ|*y™6Ò¥{ag[akYØÛ$Lnf7Ÿ—'•)u!½f¸¶˜·IdFd¿ée¾”¡?—NÙÍ[a§yNÂX£0Ø ;T/;ö¥Lˆs鬝°á9Ë3 -Kž„59“îeo¿”©r.]¹K[aâ9%açQØzæދ,p)“è\ºw'¬–- ÉFeC²-ô“<£Lé ì½l[Ù<²l!SŒ²™ÙTz‘/.eâËìdÙeãIã$[Ð([Ñ R'KàB¦Ç^6©­lVòŒ²mM!Êd#ëE¢¹”Éz.Èm/¶â([¶jx”ý6"°]‰k˕¼V˜ný÷ Ì T £Ì­²&ÖQj¨÷C@üâ²Ù ”SÌ2Ǣ̯^æÖ±™54Ûw)üèNÕsÁb·Š\ÖeDz= ;–lJ"0”GÀÞèûâ$S/ÙƒïŒØ·h³Üï2F0 69ƒRÆåŒÞ$è²Æv=èÈxÝ¥×,Ÿ) ž -”.§võ ¸\Æagø8m)Ú\„ƒ@³wñIF¡T0ÜS¼¿FzÝõ5‹(^Eoª,¬­ÔUkb=ì(½ÿh'ù󷃩¹<(t™!Ifʎsf%h´Ým )̪eWuZU–Õ2-²-ïý#ÌlÉÊ~Š‘ùp¬–ò'YÈ;—¯K©S^èRÉô+-q¡ƒ™^&5cú£2ÿB%^j{e·r]е éŅ¹§„^4üžW%¯JÕXõ¯ÉtÙ¶Œ%”áH±©±ý9P±:[ÙÏŸ-ÂZdî½ì¼lO”ùdÉEÔÓªLO,U{m‘ŸÝÂQÿ>,áDáԐ‡'–c|¤HO»òÉ?Gmõóéjl¶×Þ;V¥ß"ş[Q¹­ØBŠm$›î]l'¶îeU«ž^V{±ÇÔ¥°^ÛEö-k¹]½;[ÕŊp¸v“[&+ÑmÕ.ÚÕê֌GÖ©ü嶐j[­Í²:Ϲ5KkcÛ]›»…eîpuÎzµæ…•¯Z…ŠeèØzõÏ Ûa<(ãÂÚxzU.-Wk›å±uûØj^­U®êß½ÿŠ~tUÿ ¬ÁO_ã ¡·U¯,•Z¬"«tTØ/(‘̦`N&“ ®^]6RIZH%C£bíEÉ¢Šõì3Q² f©’5«£Š¥J֞V'U´²+ZÁ-¨Z{Q³vT´2mX2©lõ\(—Ô¿ÏфTEÕRe êÖ ê®sS¸vT¸2.¨\`e2wLíº¤. ÅKU/(_™ÊÔ¯‘êWÏeuIlO JÔ°$ÍâRÑ´DE TÆD£=è‚ -Ù¹(dPÉ ”A-ƒb–ÆHÕ ÊY ëꨠ]š¿ÓLå;Hx‰Rބ~z -X•³C Ö©rœÊn™êÊHÞòî†k7RX±çêï–'·2å%á·ãläœuÁK’Í‚k.x¤¬˜VfAYq»£|îùâˆ<ñ4®q’›|âUíª¨–ÖBÖþ,‚©si‡+{.UŽÞTÚZ¢,m~qU¦E`aIL c¦Žµ,ÛUÙ­‹Y4Ûr~P.K™m ۝¼?R†£%-ŊxXâ‰2,nO–ÓªäGËüEDŠ…UûxÙ=±ãKû'–ó§©ñzl(Ÿ\¤ÆSß}àϑíõƒkrQçZë`N-£µ§ûj²R쯳³ÎJj­-?…UÔ%T†¥ðÛ¢[©¿XŠÕn,ó›æ)-“—bkÎ^f+[/»#<ë楎uŒWU?ÂqîÔ𥅟bÁ“Np£S\¨å<;ڃNóžGx΂ÇŸ¡-í49ÂY~Š£Hò‘'p§ —˹ÆsŠfõŸäOä -‡|à‘Uýxù+®ê÷2Û. ·"ØíՖJG1d±0ʁpjÆ;a ê4îÌm Çq¤ë8‹àYÜÇçp ˦£ä@‘NdÙc(ÈW2œÉt'«C9@ -¥S?p,o)*ùŒÅ¤f¸˜!ÒÍüì3ºš3¤rº›wžÎÝé܉”‰ŽçQ²t¢?‹8¿¥z/ìãÂ\ÑÝVVŒý…8¥á–ž¶‰jÁܸ§é –‚‰ y±§­2ÐY w5d÷D§uÕc¦ëZ×{2',ôKº±;ç…ÿÎ[8nå´Æc…ßîZ¹jᦕVîY¹få–-<7 µsÅ7¬M…1–C:Ë!̨*Ç4쀮«;6gíáçùLøüÉ »¼ -õìÎ+~³@0OÀ2ÿáæõëëWeÚ_RñX ™ÿÁYç¥1ÌÁXe47_2Ƹ5VxÞúlÍ†6š ˆév.|¬7<ÕÈMˆª7·Kš?tS›¸m¹‘]ÃO…K7­-m[çGЄŠ,žµíª»IgØKuyì$§Ž@‹`ýœF£¶–ÛØØhSD1 ŽJX›Ç’¡Ÿ`È. £°îö|{Ñ /ž„»X;.}gïÍ ß:â«+~¯»wãŽ}·ž‹KþÜò™Áø •åá£,¦¾Lù r¤®(=Ik/s°£t ¬wžÜ›¬½l¨†ŠkX #ÌxÖ¹[pOó˜šÃ’™½F3 ÷Õ(üdlʓp)îI¯Æ`uQŠ'2ѹc‡¶†*ÆáhÈ EuÜî/œÎ pÓ¡›jITïqpé9R‚ž(E'Jҙ¦Ñ-åéÕi= -N—”¬«l­PLŒ£Ê×*aW›R¶3ž 9’¶H¼”¶3¥í"oŸ/dî•Ôm27æBpRî.’·¬²¥ìY2¬sOÑñÂÁ%ïñl%ï=%ï ˆ\2ö*y‡FòN&uï(uŸSêVøg•·ÇFކ¬íÒ¶Hå甸‹¼}(qG“¸)s»¼½£ÌM‰Û™•AÞ šÜ€éN;üûÂÿ^R͐Lgœ™•ÍewQwå¯ö· [໩ ü¹w³up|ý¿GcÔ*¯&qaœˆ;hàñ$Ÿì_5¦ë¿êö¬ÿn¦÷sƒQƒÙ)—W×g™ÛÖeûÆC®ó\ŠÌlíÉfüD­ƒrŒòdòvÝCԑª+à‚«€ëÀñǜYëð…u9î2ÌÞG– ûƒ ™‡¡+PþñˆÃ ëKÇB!ÒÊÁ9­ÜŸ§"Ѵǃ"úGVÑ©5tDðѕ´kÜ-u-µë©YU†¬³Y„ÒûȔ ÷Cëþw½°°HÛ@ˆÂ¥`§ˆóÐÇ´PâåêÆÚõ©*TÃGž¦¹Ç­ã,¢s6C‚|t[…ÚyªÝd:I+7ÏóÁUè¤1K„…&$Ùìæ¾O¢,à%ñÞ6ÂK›÷ˆ“ÜÚ7V»®ÉLA¹ Üiþ’­8‡šŸ&¡™´‹­žù,ÆIr3ÐÇVõž¦›/ï_üpóòúÆÿ[ªڈڳI$cDÈӄA6Ï_+#Fc¯)om‘µ;7åFÍ=dwmì&3À"eP×µª¸Û,`O½}7Ng"8/†áC+xÏÎÿI‡îÑõöMqµã[9½Hϭܦ&#ãÎË/Š¾epg(!E'Š®÷$×njhh ñmµ—ÎKeݦvZ`¨5PW!« -`=m3ˆ´Pwa”KÑ^Ôf07ZÌÎ$‹b9— -Æ2„++¢õBÕ|™–Tß çRKB±&ìŠüb;Fq¡¨h>ÊÜÌѪ"dÒÞ@t-KÙlZL†(aWÑ¥%w‡D”£d)dj ^¢—ú“¼d/[/»Z¤Æ}S*L`éjqªý¢„¦°ûž}–F/qQòªÌGŠ›i{Pö'Êù#ŝ[0 Ÿp¶wï]8¡E¡>E9Ü\ۓ8ïêší—±5™+tWCµ±.eª=a£Ã5wÙت?{¶Ø óÆê6–µ[›¬]{:3;ƒŽiKÝÚ̾ ] s9кm–ª¶ãœ<ç\,¾ì3ªú±·ôcÛ8 -ÚS ´z;Z¦yv4ȄjCë̆iAS¿õì^ës3øƒ%·« ‚ùì64ú«iC{Ìg]½Ösc?Û3à6í ÃHº¿ZԔ¥Çz¢*S‘BÅs­úIEU$PÅqÀˆû¸Ÿñ3à}^ìßãÈS —Xž">¯;‡HC”à¾ÁÃå,9'Ñ9 åd•}ûwJIZ"tÆøÀSØÀGK±µôËXè]¢ŸKÜsy.OR5SÂ5K•ªeTs/ªPU{jü²+4sn(¯e¼rUK£”«Z¿Ré[UÞ°KUþ¸¡é@_©ð¦Äþn©Æ/ù¥*¿Tæ³Y¹“o„2J®ÒWµ¾(öƒg<éõþ²Qò/\—ópká¥ñú3{É^ê¶V7éèe¬Ej M©1}ý¢´¸ë%t£Õ 9¨Â!+CØ/Êî lWå؏hä±Ërtc§ÑîtqAIjŒ'Êøޅ[Óh|‚òA±ðGÃ3„TVà2ˆô0"~JºŒŠoãâÍ;+³{Zxh«ö|az]^Õ[ëþÚâ±Ýú8''í×aȱwïä¼ -çÕøjæ׋$s‘ `Ç¥0›×2QŒ-l5ÅVöҋ]Ã<¥`™9ì¡ÞìaðqA¶ û˜)µ$7ÙF“å=Ddúž†ø¢¡ {3æ.B4$D%¦¢¡!ª…ÐÙ$rT ¹4}Eª²½ À[3—°‘6pd2ÅԚ ³’ÚR‰Ù폄 ž -,a&ːa‘õLc›QõTØp-ã±b$>ü9Œì;Kvüìæª\|Hù)Ì15yi 8~A±3Ä.‹VHøH¿³™ "ìG}µ$¹Ýhmàø€ÛßÓÆðÇÛÛ«××/7ßiÓÃÞp„Ú}Že`Š®¢4Y˜úÓ¡ÿšDà²$ ™Û5Üv™#a ´U€B¶ xí£“ƒkç·f5–Œ -Vyú’¼ ¾Ãú-v̊uî揧f|x:,óÏß꽞zgO].´ý¾èys=_š¹æ }Ã#Y*ŽÃ¥¯ëH,ó9ýQ–˜­pŽš%ægÏnóËS/ŸzáÔcŠ’³I½ ÐïMîgj×:òÇqÆù êÕ¤ô$ÕÊďæµ]wœÛ -Iò×üv0¤!Öûž˜@xÊÌu .™iV½õ«fÌ«ð7Ía'àð·|2Ñ,yÞd­+ð·dPsÖ% -``A6=ûÌ¡MKX“šÁÑL2Ë`‚Ö0s1ÄSÌ3 -rLùÍPS &S¡ŠRUõ”òcÊÕ²¢¤¥mél¬ñ2‹5íå²ÈJ8ZÆ%.‹)£µLO*ét¡ïúxÉV,üiåˆ6yX,Èã–_j‘(J\ÂSRK¯“K{zéðì3ssWqo‹JèÝ©uÞÄ&l›ÜfՍE–ð¨a‘ãléº*Ž«ê´ª.«Öaª³Ê2[öG2[®ÝTk'Õ ÷Ô³ÏVªSsê1ǔÔxÂ1uÌ)õ7”=µìŸR윎Ÿ.§ Z…ùΉPQf!()EuÆ÷Â÷ŽüÁ?§cŽüOZmñé#¬›ØŸuÂížýÕW~‡4+ßLýMlÂx6õMº­G.YՐ¤â8L›¡; ܎հ¾¤ÖÒ10BKÿx<Âp0<‚g|»X°ÏW@쓥ìvÛ󃲿â5­×øyÌósà¥ò˜ù -é îÀøÃ#¼òa¼QcÁlO)L F®=ç³=ãsUþfkjS6í=1cµ¯Ù ñÑYŽÚbÄýšc؍mÁnx#?qÉ5òӝš55ÍRn,5é•>É5K&¦¬L*…Øg²­nd¾»<ö¹íº8ÎÝpäP¦OW§ÅFÇnèYdZ/<û€˜vý4žÕ¬ApΨ y «ÀZÿ$oóéûçãYçqÆ9|löœGÎËrȬÁ6y0.Á¦O‹¦°è1˜ë -¬kB€}´…ãosB»x/;êÜð×ýI0#øq ¨ø7؊´`a?ÑÂ{€2—mÔАCޓ`⒃¬¿ùë@ÃÑõÖëÁ€uÃ*ïo›L7– Ïõ[3ýÆæx>Í -¸cJ#ËìÛÄGÖ|¾“çñÝZÜ£Ïk:Ù4¦{ â©„&ƒ,Ít¹í,^û ¾šHl¸áD˜˜4ÞþDU_Xu0 e¤;®omó -ê:ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£#!8~²J ÀÉ%çBŒO¬É§CŒÌü÷M²Zr»îfrc×!ýGèûÀz«ð·)OmÞÔ¶Á÷¹ë£Wa>¾ ó:«g,ùیÝ>kb[™ ¤·BWÖë÷\8¸k1õîr¿ü”{ù9÷æò\c;sr[KÞΉ3TO$Ûú+ÞÓ -Íèš6"u^êX‚©þH‚)K.E¨ª<%ºãYbI}ó[\õI¨,Žô|Á–¶+;Ú©Äv–ÈÀ¡FzÛµx´µá‘”WÞbe…Òö2q°™Õ9Kôñ¢ytVrÁƒ­fhv½ôç9óÕNò$ƒ´‹«fšBƒÔ#(ŒŸAØ%Lž³Ì¶(³Y9pØÔNæbÞd_2²pËC¤0;ü ÓãܓŽ‡ýÉ ;a`}¾Àøoºíf­5™Sý¼-(·SpÉ2ÀX–e6ÕÞ$™ÐÂû[¾Ãâ+†XùÈY ðÚ5·eZ¸DÑP¡˜ü}Óªë°Î&gm\dÛ¨ÏxŠ«¯ùz…LëX´°Å -P¬@ÄÃpÔlyc ¢Zex&xêÄþv£dd ‰Š„Bí  -„=ìtA€ÓH8 L,‚’fB!ôǟ®=ïûãNûÖ‚ ‰ýà#‚ËéÛ¿<ÝG>ÝBd= ´<ôÝLËÃÔu#DÉ3Y3!2MÄþQ“èeÛ##>q½&²ŽÝÀeqê{&ø“^”¦8šÔ²p”Àpä¯sÎfQçÛgý¤õš±èãŒÿ¥Îþ Ûõ§s*¬êµ~íû¯-̆ïû.Ì¢nÊúþ­àÜÖ÷˜ÎsÂ<–æ”·uâN‹ƒ=÷Í¡žŸq«‡yn-s]±–f+Ït<îi!ïézŒòÈ°ˆ;æ__þYj|T%Ëã}2?´xõÅiö®J•¤ó+…«UŪ‚V²6T5n2Eª‡;H³ðPŽxØ/|K/F9ä¡B'óY˜—BDkƒ4œ§=*>~q–öþâüš. £ìM¸Ž0r8\ñ/ÂR£y˜R>ÉG›4žõ1µÁ«Gj±fBÌ»~˜xΖ0Ó>jÏ1ÌCO˜7 ç­#±›1 Ãn磫²³ÍÞë­rÚ ãYZ>ÉWñ±Ž¼xԑ׈ܣõ–öäÄÀãx€ÖYãuúæ„f$óZ¦=.§Æ–®Ê¿õ¤ÓåY±U& ëÏÍù®ëS^×â$4‘Ζ§|ØêûƒVMï\eŕá\ž–^³ðŸ´@·= ä²9fñð,¹9 qyÈ见ȓœ<¤jôÛÆö¥rê:Pt&Ø 9¥rXÞÔÉêŽ!zÐÜâ[×I{ßÿn;_OÖ ýá2KÆ!Ù­¹{Ì -à=Çý€›?z%ÇÇ_Ðñ -AÇÿ‚Žÿë ã§ùè:ò±¨­þ Q[§;0…ñÓۀ–{Ô'árÀ7ÓºžYun§4—s«êÉUÙO®ššs´êAÃ<¥ëȞñÞìw9??èv;œãàäŽåTXëÌ«˜ÀõÏ|:ðôÄ>Í_ÓûQžýT®ýø¢yÚ^𤣎ÝË®F…F&4´Pºižmþwö…°> x½Š>º²Ÿ%ªð¯oþßÿçßo¾~ñÃ_®îÿËfEùkJshÒûÀciž}v¶¸$A/I‹Û„Åç~&æ2zIT¼'Àì’ RIpú†ö†]=ð1ûæXFHP’ýÀ +ž7ԓ{® A+3ÎÏ}äρù÷ƒýa¢¢Ós¦$~v²ªÎššîºÈØ5å5dë™AEº¾°“|ŸF•îڌš4Ÿ—räpLY&†h÷X§9?žfâIsâCTê>ՑJí1P>#Nô`¶3¢=k·Ì‡& ú£s⧡/Ó ›¹›žä‰Zώó&né½ãš¹ÒÌ;¨àx²ÿEZ‘O'‘¹ü¯Xã1§Ú±“àӒãI‡ïˆær4•õ2‘µE`=ûì#c°’FaÕ,™e…e®Z=hï粫ËBY&‘¹8žFæg;SëC¬‡GOÕbÚì'Û¿XЋ%ÅßyMò'ý­Æ&úó4çOJô·Lóg±["ó|Tô–FOj—Ñ[2Ë>8~‹ˆ] 4&C꣋µu¹Jö“Ž§úeNü2'~™¿Ì‰GçÄ2-Ø{dÌ:Ìÿõþ7ÿ¬æ-¡|ûû»Û¯îonnn¿ÿüóVuo¿yöÙïßð» ß}uõðp}+ZýöՏoß^A›·¿6ó|6Oà 7ð8Ma3ŒãY'£³úéL&פO¼Õ_ÿôü~§ŠõŸ~ÔÏÿQþþïBý‹tÅæw›þoÝæå3Þõ\PZ*o^ƒzÐÞæ· ry®ß¶U%.+¸Å?Ï·÷ç7/nîn¯îÜüF"Ïwww¯¤/¾°~ùöâåÍÃÝý·»«ÿCzïÛon^]û‡ë¿Þü{Üñâï÷Nk9חþRçʀc/ÕÚ‘³f”Ù’-K¤œË¹—㜻0oþéJëZödèû³.Lý&æ³ J‚u”¼ç mâ|6‰L¶Öp†ÚbÂÅãfÈr¹0ƒMŒg½¬ÀÍ Þ–ã™,ò°‰Ãل[Ñ"ÎÆaʛq>ý‡&Og}ëÇp&+r(÷Íg] -Ã&È·‰Õ'67ä³8À퐻³8ãþt`ÖÛÒx&úÌf˜ú,­MҊ¥›0èC„sm‚¼†HÈv›P{Ñp62칗Y8¥3Y{@f„àŠN%ƒ†ËËMÔ:Œ›q:ÃU›A:§ŸefŒý™¼žÃ®ñlô»ú3‘v{òaŠgÂ'£&ÍCrºi:û7eá½p_^\Ë"7jõÂp†Y'¬Þ'ËT+ŠZ½f»Bï+Ô¾›íÆ{J?E8£lî EoÁãÊ„Ö »¬Ïæ”9«\ wªp .ë ~8oúæ€ÈܓnI«é_a:¯—T‘\ÀÒza˜£ˆÑ…¥õؓd|죽òdOõteöå•8ÁÚª=Nj/›ÑV©§ÓUìuͪ®OäW•gözV¯¶^«I‚pcÀ÷:ÙJ轒}­Ÿ,¥vÇ°YáòÇ<ÊoSp½VºWîr4vŠµ=0 ¸l®Â®º c…qcŠaƒïd[’­OÜõ…vÂű!rWSë…Ï‹ò³™Gو³l²ÔgQ#6³ì"~Ø}Ø,‚ôÇ, Döˆ wÁ^faIt!¯é‰ gž‡²{ U´+Ýu²¼Ã¡Hv7t¬‚ ÈõY:TXKÆrŸPÇAZ—MX¶'ÚE®›Ç÷­zåpÂ¢é¤ i;vÒÂë%/Ží[^8Žœl˜Fƒ0CY^>¿ðÎM±^$’°‰¦’B°¶ì¶B•Ñ–nØx= °ÈdIL,–>Ãý-Br!h‡@sè¦z•,%ò÷ÊÆ`Q€ÚmÀ¨"þL‡ò)Ùþh÷‰@•¶a;ôÐCR‘ŸŒˆõS.u!WÊ zô[,¢5Ì/Ü¡fŒØ.|5T?‹pZ)z«ìÈ"²çæByÌǑ$¢†"ÚÇÜÇrk!“µ™ÐÀø -XÈQ†JVpx…cUXÖaàœ–-u‚€$ƒ|FlK29;ÙNdtÁ°±mö©é¦¡“±x¡©y†åŽ4ñ„Å.3/áÆnnöYNƒ¾ƒ&à0Ø4Œ„aH#t-ÙΓ,5ðèÜõe=ɧq’G¥8ˆf!*=)ȦõÂnŒ¦*ý\ZtCú¬:E'¢í¦VeŒCèíŠÝXÌ/¬ïT*;x˟QFrÄeÙðǕ×j9|qûáº0 ^ü~pcœÜgŽ?ÙÛE†ÄÅó×˽úm]`ÿ]¡8žŠïBb`êüÃö"›s_½PCDšò¤î?(ϲ·ÕÿÞLJs ö®Æ¦V<€Øãd{l|€"aÈ…Õl 2ï},ÍÇO$ÉT݀ ¥y.Ér 5cÑ|¥úk¸/:€ÆCvŽy)·Æqh܁ðÀÒÑîì)°”N2 Uw(5î„ä*ûÖÐ8GtKªGP¶<}¯âì±çÊ U§ -±wg"½‚x}õû· ”ÿyÀt/ŽAtc7:S,žAjK3Þ³¸EÁþ#bŒû…·Š´Tö­âèÂÉ}õòÎJq°[§Qq¢¾œ¤ -÷ÂBJ}Ç=„²Š€WìHî"(™òLî#À.{zÿÌI#§éÒKÓETwBc¥Ó7‡Ëô´£—p™½^‘³lã,ç¬%|'wâ9eé.l.¤7°©Ê>[‹­ËlA$Ú¹ú ¡Óºìí9eé5l.ô‡÷ÊÖoyÄq(c-OÐǕçFNB÷Ñ ½ì鯮¼BXºëeæljrŠ5¹tb¤#ìZt›~hš4ÂÒ{X/ó‡÷šÖoùoDê¦g~»kd™àØ7©,â{Ñ:±åv擃: ™foR„3’â¬Ö8!Öi‚º!<„yGxˆš¤1­¬PL ê|¬Â7HuÜ&bÿŽÆÐúÆì·Æ\n•]‹­Ê­]€‰&Z ¯z¨Ohh°ÌŮٸr¯›ê‚avà¹Ç2 p|` Šé9Y•Þz¡0¦ ݱÖU)]Æ*Y^„Â\­lV1ôcÓj¡¼(ƒÊ§«×•ðºÞô'ä¡O⢆w‰Sb飆=Y‡»8©áWèFص‹—ºá ‰•›š6kÞZÐà+:íœb;ɜ<–IV<ÕCËü4OµS–žêzañ@\¡¥„Ô̲JÆ°ÆÖ7=¯‹6\Ën:í® Jã`ˆ×+26ïaªkßc‹Ù K§u½®ø£k]•b.×܋i"ðÊ dӞW-„¥ïº¹Î_ÀëZ¿éÏæ¾G¶‘Wš§“‹æé¶È¢ybšÐ„³Ð<Á^Dg\ó„~&2çìš'l4º-TO7"ÕÓmE§„U<ÁºP=¡Ov‚ -ÛdQ<Ëç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgiÄÓù…Þ}Eë<ìÐ#–«I#K­³’‹ªH;íE™Ätè/µNڙ ßÔ ûÂ/½2§,´À†lêb­¬¨”µÕ…îY¯^èo敭ßõ´3ü£Lóc4Ä ¬àðW¿^‘Á‘èy‹SsR«­ƒØã·ÏÓÎÚ\1~ÄZ™S¬Ug,Fža¦P‹V&»–°¹©iµPܺoÎU¿Ð_Á+[¿ëÏè°€§AÕÃ+XµQFæÔ)c Ì1׺òbÝ§¹…p”ÙÑ*2[è5ƒ蕷Š¸2°«sÕ ^Øþaiž¦A‡l ð™b W³A}¢¤“‰ëAWž·§®Ú·€À™{3ycµ'ˆš4ðÖ4Ã6!܇Fgô°ôX™ç0#´!òB_.r™¸ÑÇHt@?Ño7»ãCE?”½$Ñ{p!4Á8ôê4W@²Èþ"_€’qDPE™L=V¨ö| ìR¹C]WVì„ã‡`”ÜÛ8À–ßA€€å ž¦YÝu´ËÒ7Ìày¢:…àÚ5|û8 -O—uXa’íõÅè–<œ‡ªã›¬%rӘÆý®äb¥À4ê`-‘þIJ ‡ÖNXˆ'®õ›¦¢`º«íÅnôó ýá½²õ[6^A™¿ô¿aæs+{½"ÏjBü†ž;(â€i9 -ÏsŠ6zE%5Êââ¢2§X«~«‘“JÀµ2¸wah­­ŠÝZ¯^è¯à•­ßµéž9b_u’XÌ×K26pØI¹jÕ,ƒ…å0e¢8œà #~¡^7"Í`hêrJiÔnu2D%ºJe„@Š)mÚgãåÑÊUõ¥JE¯Y»6_ñ2‡z -ÅCܐGHΊKáMÍK”Ìa•È -Åøì&0Ö2¡kÃ4ÕÊŠµj·:y€(˜7MepK„ضj”åíñüB«ìð]›~pIŠÖý§¸öœ ›dxpÈn"ae”éoª”Ez‰qšÚ çÈMeN)­º0ad3ŒÔʄ«2†Ë5‚9-ÊÕËêk•š^ôg38ª›I- vÇ~61ïlA»c›š"Yî«GÈî(€w¨ -tI9âØô˜hñ6Èû BÑ@>ļC@…,å˜wô™z^ è׆è$½ÓÜ2NcE½S&bÔ_½ƒé†y {Çûå¸w˜â0®Ã.:²]<P¡[Bß¡ U‚hÎ]ðZÇ£;å…÷?v†æBƒ¶7uJiÔ*#ç3€Êj]Ò֐(–F ÅåÇ8†ö:­RÕú=O«þŸO÷Üàx×JVÔIœcŠÉ\š+2Ý)f1{s¡ÜkUN°&íN'ËÆ?uaÓԕÌ]M­ÙÚίóÇ÷ºÖïÙp;G2—EÍ-'‹Ü%·"Ô%¼lŒ½ù<;øê[&ÂpÆ©o. °–禮B(m:Ë"&=€ÙjM˜[ãÜ6Y(&–gó ýù½²ƒýmµÆÂ"Â|@aŽÆÊ€ÕŸÅ@Yj¢LKpݏàiNÃPÃœb¢‘ÆÔë -ò»ä e‘Ém!S{ŒåNÕk,HL¶ -è%W¿ª"ü Z)Ì~«“Eꆜk”@Kx”€SLr²(zaÿÉ•R,.t¹?#Fº tB…© l4Õç-Ap¨a® Àã’yÏ©èB)iԘ$œ‘ $@í%ÀhRÂP}UcÄáì=´D=F³GØÉëYT:Êíh|¾ù܄ -‚Ï¢ûëeÐÔäkÒîtr_ôéR@aCžà»µ<[½ÐŸß+[¿h£4ôà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q~ÉçD &pD\NÐ"â<žÀq5   â<¢`ˆóˆ‡Ä•ˆGÄyHÁç1W‚ -W -–h¸Wàp¸Xàh¸Z°ÕØÇ•à‡Â•è‚%Îà  -çñ…óƒÎ  -çÕý^b –P¸dàH82p$œ‡,‘pgàH84p$Üáê<â°5<þ א ¾æÐ~¸•€%Îêu%– ÖU)-0­!‚Í+s”[it‰†ó‡k®ó(u¼ér 8‰†kȆa+0ÿ‚ró`€ÎcêeUÐT䔙֐ ÂVë2”[m²ÃùƒùUþè^ÑúOé¬ÕÝ ;Ÿ0b_r2¬I´˜õ‘æbéÉ=3ŠY° ©½PXXS[—S¬Ñj˜P²,²ö¯ÌD„¦ÕVh¨OW®«/Pê:xÓf|”æ¾N½EM1Œ:Áë¹×à$Ø|D6Š:p]P½E¤ƒP)nì1ÍÌ/ÄÞ9…¶2§X«/Š¥ÐÈA#‚›Ê"ä€Ø¶j»ÕÏ/ôWðÊÖïÚöêGè¬pWvI՗˜æ"ÍV2ÌiL+ü=¶sàî©BÄ·…bš\I£â2B1NMe•b­Ó/ä™"Ô´©• %Íôz—V ÅZ-W/,¯P+[¿kíÆl² 6(,ž×+2zÙPvsŒ–Ü¥‡°¥çu͕b/ˆOÚ ïÛʜb­úæçä<´X*ƒÍ.7mêg»­Rˆ/SmÛ÷ër{]•bº·ÚÈ †‹~S낙wˆm›FyQ”g{8¿Ð_ÀëZ¿éÏ6Ia‰uHTäå,®/#ŽºŸÁ%zδ2’Uÿ"'¶Ïö^"'&‘×ý"D¬äÔÔR֖kþJ•å=Òu_êIž^[Km|¼?“Qý¡­žõ›µ¾ßAuë!@îòtªtY7©³–׌ÙÔLí¸ŒíΪûeÀRdU$´"'X{v_¡bš€WyEXPÚ½=#¸³XË/+^*Z¿ßϵ ¹#w¦·L8JòõŠ Ùp²£>*¨<Ý ÒG—aš/çpS •×/D'Ìm]…`m:SjRŒ{SS¶(þÚdnr4Ïæúó{eëýD¢ÇºC‡¨Fp -ì°Ê¾^’aсêÞØÏ -þ¡€>Є38ÁdUxøÆØ\Ö©+¯©©PJ“v§“¾Î¦ÖEkQÈM›…b·–g«úkyeëý¹$dðÔɒúôŽt©ÔÁð.†Ýk\ ²^I -ÁT€SÑR{–]?·u9ÅÚtmÒÈpÖªQ+CÛ>7Áîô‡óëÊó{U«×üy&( =õ&Rv ¶“a֊*¤©I¹žD{l˜™ƒÆ(önÌ®<¶vflª•9ÅZõ[<(³¨• E´ó±iµP|,ôñê…þ -^Ùú]?Ù& ÌRP‡_À÷¯—Ô\RCLf´dÔ¨eûP)&ŒŒ%Û¢_(Â2A5•9Åu{’¥ë˜¯V6t2U[-”åyõñê…öµ®Õ‹Öü”r?øö ý›¹¤v[@»q#Ъ »åµ»Ôç -ì{õם«’+ªȎH ԝ084»¶˜nYÂ4R…t#k'pƎ螐ƒïЙ.{¬xnkéT.pnxGˆ¾[ ¹aï -~ ¢ÝH\f¨Xîd>ÎÊ-íiDCArO¦£8{îv’ǝ€V s…q§YuÅMILoâ†)ÙPcâîhÙW71@°X.AÜ åe£¯Âeó‚á>ù›g† œx¸Á]©fTGÂ͔\6âéÃ~;Á=ãS¡&yÄléNYQ%´PêJ5Èu­ÈPÙµ½½]«\æn¼ßO8€>¡"Êè `úíäݞ‘EG>ä6|üÜ·áá7*¸mað²oÆ -Ûf> ²ÆŸ ™‚ÚŽ³6æXl¬tä²-K~fhT¡$l`ØçZcµCKê*@»[!³» -ÉZ€«‚È î¬ñØÐÞ+{°')käÃ2©²61FÅö"Òña¬ ìÑjY@° ÁAB´þuì50èß%ô35sE^£ŽK^cÆ1šx¼NÙ؁á®ÑA´$Ø5SǸB] ó‰=3è†k^V0×9a¹î™jU\×ÉY ׇÓõ€;€w®âºR %ÍdR ¸:3ÙmL©Ï/CWªA¤kE†¢®íµhk*#ÖǶzÞ®¾? }1ÆкR 4Ú¬êžFPCZc¬EÈedM…XËþ<µÕ8a °.Ô‰.9jښ[‚«í™ -±>´Usðnõµã±ˆóëµ@¡±qø§£¥ÃhÉ2¨jØæúÜ\…¢—×S |s¥ºÔc@io¬…Sû#•‹üMJ%ëW«oô[LÖ¸€RWªŸÑ¡} ›è'¶€i ¢búe£zujENhá̕j°çZ‘!£k{-‚º>V¹Ì¼T´~¿úê°CÁO¿ObA;ËzÑ<œ ãó«.€ÓÂø44Ö/Q¨‹ Û s¥ÔÙ+20´7×B¦ý¡ÊEåMJ%«7;åàƒ‡`.ñ¤²’ ¾=岂””}<§<®•p±÷SªÔŒlÝÌ o59amtjÁ@zE&éí-à”õ¹ -¹>{©êð%æ£²~œ|qóü‹Û‡#'àà×՟^]ëóüöîÅ·ÿéúGk!v›ç¸¾:vpÎùÍëo¿º¾q}ûÐÜ`ñcÓÉÛxÎÎ?Þ¼|ø¡4qê¹¾º¿þóÍõ_ä±^½=Ý3ÍÓÈóß\¿mæä忽þîá[‚Ëû»Û‡Ÿ¼ú›»7¸÷D£zô=ÿáúæûžú¢¸ûËۓ#{ñLÏvº¸}i·?;zØÓ¼ùó5ŽzâoªyŒ–Eœo˜U…È32«‡ÜӒõ×â¤'ƒ›¿ï‰O¥ÉÒ@Åo-ÚÕ›œìøÛ¶ŽãÔeÕ3Ÿh —ý¤cvÔ©AËÉýÐéáÝC9¼{\&ω³Ü‘£gŸa-ȏÀD¾@Àék$ðMIp´”œ"¨à Ü«ÏÅ4<D® k¯’P¯áÕ²UHÇj‚žÝ;!¹L²½‹jFgÈt~îD‚©’ޝn¶ã9Ž#„©a@Èô …àoëH#TrÔÞc#†N 9¤Y a¨o§' @䢭¼]÷_Ê ðyȾ¬ï&»úsZÌì€Y‘’ƒyvƒ~ž˜z@¤Yy·–õ=a‹ìŽ÷@ò*_Ãñ­t± ±ˆåYÐXl¸ {Žî2m…0Ï5\ÊvMù­š°®CTÀ±=c¯N%f¤_”Z9 -Æ9Ëðdìȳº÷2€4Û úÍèf'µ½:Ùäéé·§ÙyŒ\)Ê*G™¥HœŒþî-5èØËøǀU #R™Ç;ꔍ¹81g›`j$`KBítsY“QGÞ\7›C…ÆVÌÀâÃä¶úØzÚRً8¥/'«Ó¤Wl LŒŒ8†·qTGMŸ5Ûø4Õó¢¾ ֝ºe¸Ç%ã䁕‘2¶Qa|8§·Éj0ð T@t¹ûLµ‰ã4A€,ž.9ŽŠ>1q©ä$tøêMžK¬W~m÷ ÓË؋²í–ðµtÄÞ!´Så>•ð¢¨ºï–ËpÎ×b´DDH)#ìV˜ûr۔°—Ìú0DÉC<‚m²„ ücÀ yœÄÔé DB=N:ðèæ³Ìø‰wõ¾õB~NIë¢51^1D€iª|¤l¥Ó=†š>0ì@ÉƆǷÅÞAgÜÐ|Î:‚.Ҋ^qšGdT{hl䑲XÕòE$E†gôzXøˆjžh˜H³+“;éTÜ×ùaˆ/ìdÙ0‡QÒû¨é\•÷a”¨{¥½ž<–ìÌ`)F„Yx­óÊtå"Xà95‚ž.LˆJQMo3OÈf² )gî©ô«ø}|úi.¯3è&B´ü ¾gº*¯'cÈì-ES9Ž#"˜R 2a̚k_Ä|övìKr*¦ÒT*™ÜÈPžÖÁˆw»Oö>t.õ‰`èS$ßB`OI -Ù8C¯¦ØnXHä*]š51×ôDK4«tÏMµS•Ço# ÛS„Ÿðbâÿg½;NêôõŒÍõº¸Q¨9˜‚<ÆkÓ±nŠœƒ³9Ä@̣Vɞ231\]xA[“õÍ]Ð/AbÄ6F¶”K*œæÐʒ<.J& N{ኟÀΨ0÷ǒ á¦öÜ´4+m¨™¿+ Aª½˜ÏQ€òü¾ k,G€L4ì^sfä¾!{”ForZìôqaÄÅó’s̚ˆmÀ«Á§´3E䜐‚Œ^ÆNkFǨ1ÃàHýûx嚃…€ƒÊŠ´X0 䒰T¦Ür·C53Ÿñª„ HPì8$dïM$†»ÃD†jŠ1ž @ʧÄS ØöØ©ÙÔHÆ[L<1S±r*¶ég›Ð&^ùE¦æk@%ðD»3*lTã™âV*¡bK*3s4˜› r荤ªÏS”ËÈ8hF Ì̌­ ‚Aqøµm¡†¢ÀQ_"LñœÈ/Ø}~r 2¨ üŒˆ Šfp‚þ¡G5L )6 óÜM†™+]µ+šŒ°™r4”)6OCŠ›aƒ.L¢Ç -£…¦oë™a˙ŠQ<«gÈ4fz®µ¹ÙC:â?2©X’0ɌBŠûyTˇ±Íê4@âmåüxNjq jú˜¨·;5šF]5€Tdº^G81©WÀýëÆ -…G–Ç ;³²rpOÄ癅 ³pœ™:Q3­øÜe‹¢VæÜ :*À’è^ÜÖ3ˆ §CÍõ6Jf¾‚&|c§ Å\‚Iß3G=ù†±h,e*=f}AÔbÒÄF F,lð•«*òÓD}jУ—8tì#<-"ic.«©„’峁¹“1Q0I•3¿M·GK€Â„¾˜¿HnÊ®Äö8aª'¶ì>Ès0¸¨NŒ ™°EªŸ(yªCúy¾,Õ!4/â/é¢âR)¯Ú­ÀôÏ&›$Íî2Làь©óìèŸ!ÖÔ°Á#³£¦xŒ 飿‘{74<76V„7ê¹(ØFF›Ê -¥a êcffØ^5D{\ŒÃ¨ijÉQ^DÞ$ΊÛ×Yl[)58}Î49 XYHz«ð? Ÿ¤š”ÙO´§úF堎 æKMÂ-CP×EV3ÁˆÜËúÞ÷4CÎþÙc¾[7…³~R¯Ë‹bsS6Ù+T -uJÑBˆ£‹Aé--¡~ç˜;% ‡¨>礮’îæ\¸è@C5–# -=†ó& ÿå~„uÁ -̂–,·-ÌdŽ-˜þ躇,Ȉmœ2g§mŽ;`F0؛±ÆBîÕ8^•ÚtÇÄ MêM“Ùg‹yMÖâvŸ¢QØ:äúÙ·4¸eJúTˆ;&užhúNÄnϖÌ|‚¨ ¯Š;ê‚Z8 Ü‹¦:Út¥hZ«¼ ÀÁ̝VG0ߙùŠísyrüì »c¡b"«F-´3çrh pT™·MuöÀ{ì-…H¯y`gc8XÓqÔ]ÃÔ²úvHÞ¦Õujv¼¦Ò<óÈΙÁ¹4 *çlþXÃ@í{ ö°Ï¦·‘«,Ò'¤’>ˆT˜:àMƒ6Ɋì¤Ý0#LÃ; }³®¦ÆäΝ¾ gËlNA†ˆ$Yª30&Ådƒu‹ÄÿŒJ4ÿ’F>~Qø3WŸ-ß2Úy“~†ïŒÉpv%c¿ýÈ4d%†ä„ÊÐHm§V58ÍFM’0ρW4öwF"m K€3z£)€FØ?h*½Óñ3쌺áPø¬¨!ږ…sþBë'ŒŒ£h@íxH„í<+œù°ø~Í]y´#ȑRšoR¨A²bF)ߒa;‚ @c5æ!Ä+v43èJD‘|VN÷¤h¬·Á$2¥öLe[)RvÀvªž\ÐO;¢H<¶NÖÃe0ª0Çæ`Õ(¾(»_œóCb"6ø':¨@1çàÄ·9è&eí!df.=¨†§lòԉ‹>ºÉT@¾@ŒðÉ ÷V—è)£§Š ¼ý¬Võz†~\î#±?»N·"P¦8ë¹Öœxv'Dl‚:Åû¤ G/ÈêÏLú&ÜÁÜ`ŅpPÖ§R3Sb --ø&âšUŸ£uM[œÌߨ0ÍÌ cœÕçK§R‚º{‡Ñ'ÚÄ Ô­J[0+S+L§J[eV -Pj«0ƒðñ¨ÖaµE¨ ЬìÂÉ>iµ4ñ/êœÇ«RéÑÎúdŠr¶tQ4ˆAÈαá^çyW}Ðtª˜csÇ,£zõ̶ ÉI§¹l… GÚÜ@&£¡éR'/4ŠÁ™”äs˜„^¯£cŽÎɾ³C] ÑÀÓÇ¢/—d!L/‰-`Kk€À´§ÑÄ;œö={š4nÖX3➄ÝÁ¤§œ¿×UÂSí>îY „)Ôû:H) ö¶ÓÌØÄP½ª©yʦFÓan¨°úÄ ÞIN)œ‚ÌToðÂ÷x|w‘YÌÌK»(}˜´«+rS ‚Š H\c.\½ I6Ð!SGÅÞ6šÿÂ¿sÛ(¨ØbçÉEF™54ÓñTìA­ø\æˆÜ4ƒ¦Â4¨Qή¢gÙÿQk…/ çžìŸÄjæðN½[Qíº@`£³&aÊ5ÌTDÓñ̐@û ­Ðû¢ÐzÅ!€Û´(”g  AÇ>[Õ=êUŠä-BVï–pÆ`œkÇ+q´3Üe‘93ᢀOžËtœ«ŸDt7hÑ÷¼4pÜi¢ï¬]Œ³¦ºö6$ȅ©w°«È«±SœŒÌ³ÞÖ²3N»€…gÖ¹ÆԐСaD%Ä'eUTFsŒ¨%˜)ˆc±¦€Ç„bœõ8É;+Ð<Éï5‡Ük0:´IÇÁÕÉÞ„Tó5Îêÿ̍™fuìq¯êõ1™­·u>ð'v#½AzÒ3ÎDPNSo¶Å - k{_¦ãˆYpSm®SÛSY%NôŠ£0HìI¤'Ÿ·ÁwÅTI£=iannã¶óº¦ÏéÀÔlúÆ!TÛ8 'ˆ3¬pj¨‚‹<ól*õ7±k9âÐsÝûxö2z¥hi25 <žv!>Ç&c&ép±†I½Ý‘p®¢šfu8a¶×3è'Ûè‘5“jP%GṈ­(Rµ´ö̋Øs |:š:ç]Áèt*¿Æ3]‰ -˛ ‡•ç‚ºR‚1‚ÑÒ¤–ËIÉbÖäWT©ØX™íØAõ ~–͹ó°ÔùÞîÀîŸC€ÔàxmeHQGûdbìÚ‚s8X³ùbßIuçžÇÐÓLí¸vRs"Œg6R¢¼ºnºY µ½¥S÷öu„ $&¤< -2¹œéXNj@t­†^0µºá#Á´aÂÑۗxÈÔxN5qѬuQ¨é  3é&@Ïìù;7 n5ER.¶ ¤Qᤖy…'é6¤3ðÇß.'ºaÕ·Íôrz‡ŽGAˆG/Í~ˆ ³Þ0¥nŽ<0 Òð`Ê1SØGqÅàâ*욡KÚç'@Èè]Yy„VÑ~ÕÞoñÒk°òPÂ,~.‘î8EнKDǓ±ËcÙ …ð\Å%3báºÂÜGΚˢdýz•»–ëH1Š^È×ND`͑ŽAîx™Z aûÃQ¿…àÚ"ÏMŽPH+ϨKEóYÌtVrÝ»´TT™Ff!3m¡k”îOë¹U{,Ž1#Ŧ‰9ÅázÅsn¢Õv:.,”£Z€‘6FÖ>F2’ Á"$äÆȘ   vBÈzæ)ŒÚ|!™Ã¿…Y5c}=U!W„Á¦äÀIˍ³ƒ(hÍÎ+[*¶~†¨Æ“ñ’e±˜Á/ì\%¿R×`¨Þ€Ã }Ç+è8{Q¬9-yâ'NQѧLU¡·ÔH²${Ç.Àޖp.°é™‰â"d§‘ÈS·VWàÎ(F硵1¡_T…Ý Ψi‘¡ÔŽV=‹–ŽÈÁ˜/ u°S·u½ 8Cw2~(’<Ë—a§u{ʙpdô(_úVæQa8¯€‘üuV·0¤99Dû„ 3GU,vJd ¬W|æYý6ºÝ!š›½<«ÿ XVLÙaR0%™Âÿ8„Æ’*øú‘&€'1h8ϏNÂ<ª BnS%DZúÔÔÁl#³Ü)°•îA{Úo£ ƒK¨3 ™ØîCoMÜüo“‹^¸bBõuwH”¨ˆG”Q2Ë!–fÀ Õ5qóOf–Ä2玗L.ûÏ.D¥A;8±Nuú‘ƒ1h¯'Á=b)QŠ„Ó˜6ðÜ)*MXâŸ‘)›È‹Nכ¾ÏKÇjŽ*ðÀÇ­n÷ÉÿéGÊ®÷#A…H¨}‰pÛÁ±L`ç¨÷aáãH|~ - fKÞÎôS0§º‰üt16&ÅaÅ à6¢Ý ä0m97öÑ\ïözYñPo¨Kh ²‹€±7¸²AóäL½A¬A˜• ¨œ)(HjêUÖµû‚Z®‘®žG¤›çÅ}d[¬¹â6'å¢lr©–$É`””ÔDí‹2Áöb9pJjéœ:ÝC0ÀTÎoŽ®ƒšˆ„¦úÏ„óãLa -¢<ëɭߏ Þ9©úÏTð BRdvWÏëLÙïìtÔU¨£¯ÓCÂh_ˆ³:LÔ4GÆdL=Ì00Ç1–„#¯Ã¨ãaQY ˜ =x8Á íƒaò€@8ncîEn‡QB Pg@=¹ódUlmªG"]¾Øè(~˜¯ŠJM¼ýx}ã˜%Sä:$Z½øO =ÂÆM,΍»¢NŸbeg*à©Bž‘î8 †{GmuN†4Ðaw˜r‘±Þtd"} rƒ‚Z%1qpÞ L¹Z4¼®ICrô|6X›xø­úüh–· pÉÌîÀõ'Ε¢éRΜz¢MÀìî ª¬â´LPY=@ùÍp &V{ݱp³_}€q/cÿëÍó¯îon¿ßüj·Û¾xñîõî®pñ:άrqb4‹*M¯ Yq -}Wd­d&zhS†Ðs–º^DÜh§±Ó*AÊdmIKJga?t°U¤úĬ÷}=?iÂ)çÀ€Hõ¯PLä˜S¯ƒ‰f°t,ªw™lÒЯ}¹OuNDN‘PóêËÁÀ3O‰é)Hw`\cë …>ìT`S0G—Š³7€øêÎN7V ö!…1?©Ä‚ô¢ -9–ë{Á••Càù)ÕÀ#J}jÆEbîByV8\™DûÀ#m0i§@àŽëÎzèùLªe¢3[9½-±:¸oc½þxfUõ>¢«a ƒ„ÄÏ܍íí‚&HÈQí_L9 +J*¶m0/ð]lfcÒYT&`¼Œ€éLÔÆ&Èã@@ñrs N<<¨:É-z¸^Êîúapï}Tz±ê£áٓz'ËÁbg™Òmƽnï:ð„èñÎdÁaPüš†Ç'sÌvÌàfõû&Ù7̺yL½h¦%\EÆ LgêZ“:MZØ1;ã—’†Ë8–ô(O£PïÚ#+°÷ñl ‚²GJÐõXн“íävx@$ÄXµâ؄fäW0YIÅ°:B³·ËŠà=++däPÀê&ÄTóæi qžêEØqá¥iB}ɐZz¸6ÇFÚ8üÈ~4P“@F „{FÛwq¼À(›CëüՀÿ‡2œËڄLÍP“€–ã2³‚õÐ4¤0¢Öpn ÀS6å}Yx2œL“·— „D]4z0ÍH&|ZA|H׌Š‡¿+†'zü„•BÚ¦J‚ÇÄ<…6 ‚é<:aµ¹1Xs£ÂŸAÈ|ªQy pb@Ž¨ P1âÐxˆXâe腒Ú5°åfò1€T¬=3¶¢×»S7¼úŒì³È”ëí.#šåïB“ ÎÑózzó¸÷M( À\qÐH½,DO$CW¬»Ï¨9ª` OBª'zË@§%\³bL\?òxõC.UXø!.2œ ʆöÃéûÎu@¸þ¦ž‘y4ÙÑ—TÒ«‘2œóY òšYtJÇ +ö0f•sa©ÃtßnY\}IW X°þfÚÍ÷e¨5„¿cT1Þ³ ƒÞ¥+‡ rVo»w¸oÈê™çk a~`<¥J̟’õ‚Û<Æ| "•øt¢â3 pԓ™3žJëë²A_Ãь˜RÌ>ø‰+@1jÀԇ¬)Gªj±V$c7*ìbeTæ?wÄ)<0ƒC–0Þԁ5º¾9SŸ8Âtн!+’›ÇT –©‰ˆ£YÁƤ``è%ïi-F¼@§òVbyR÷ `Ĭ³…¾gÈj_#¥û©÷Yçf=&›H{Ê9ØnôLÄØënïÐ#ÂNè!1 ÷ƳrÑ_C§çíU€:OÂâäêÕSC˜ô:e¥¸“X¤~lñIæHÁ*鞇Eöz§š’é$¥1Ç%u¸ö”%fMZ; êpïUq -4ÂB;|Ÿ%ç©zÌä¤* -ß -.aëF¨Æ5…÷Ûe8’™9́$“q -ôˆ97Fž,tS°W¿NÅùüÓ«Œ`ø”yI=ëA·‡æߗ³*L(ãqAú*¶©žX"ÐÚ`.}³ð ´UtìLUÝüؘ¶gxo0©ÐJ.hÌRBƙ‚š""Ôûh«÷™VUªWýDUfdsŒbP-˜¨Oúg51zr¦¼¥&9};àæy>úïá÷€5ÃÚÊtmN æ\ÒÆ:8ã‘:Ï}I+Pàj× Kºªu*)‰ÅÖ«6`iýtKš¶#Њ†Ó sÛìâ‘û‡&ó€nSŸ2+Þ¢·ckõ6ìqùßik@^±àAÄöÎE‚Ú]YMÀ³…I2‚•280h€öÀ6¿Í,–È\¦9(®ƒfG;´•y'jðÞh˜„&¨êx?Ó§†ÙC08¡é® @†`BÏð`- L9)bu4r³Ž5îÆ8ؔ>ïÎ,ÁXt™O¢d»ªx†ö²\O:%3Ü1VÓÂòJÀ>À6Ž"×#ðÀ؊e QŠÄ¸F…‘0òhIµËú}:ÿcõeSè ¢i ÌvÒ9_-kÕTÒy j.ê-X‹yæxÞ§ZlÍP9êÌn‚Rðö€0ªE½Ó= ­!/-J-ÉõKj ª3N@Íc *­\ƒÆP‘@QГpYý4j’7SÞ¨¢5ìüÚùEìœ-3Z¬Šñê}<µà¡zæ%˜Ñ•þvh1ahôeú÷±Ç€JŒ5a>œ¤1*ÆÆào] Ž€÷…AßÉ£àC±ú&Ks/š¹Ò«-Ùó=ï±ÊAO#Dé¥Å^ßn41&”4°ÆBOj eðpœvÙuMjv}(¡ù“ ÁT:^°ž©ž6Ùë†f‹Èž,\¢,Î c3.óӆ7`Ÿôí(‚ó72Rk)ˆa°Á37&Ù@¯Ép¸ò¢…ýóˆ9-rÕVù¤¤¦gœ°³‚ºyŒLäha°~‘ç jøÑÄÜ Q=rüˆí2Zz »+i¸J44£‘ü(|FË`,yŠ Ý —£FÝð*l[4Þòœ;3öÆԚùáӁãEN „C»@€o7«:êUL©6Gf†…Ãä‘ÄACíÇrXú`Èoˆ¯à }P,7…Þ™Í"óPÔ[˜Cps¤¡2‚ÙŸü>n¶%‚BËR‰† 4ÑásӜŠÙ‘f_DNfuj›ó9+¸Ô$œ f~€ ‰Q7ïPb{'F6éä -y0˜ÃŸË zlœõq#ó»W‘Æ‘‰£……ði ҏú™ €`1€&àô:¡•¨4 £4X:¦AÃˊÎÅ7æœa RÖxM²oF†ïíÏo·À\pb(hg²#1”4À° óTC¢GkÌv<|oÆ:ƒ: fñ·Ó³jf}ܾñ>t ƒÕG嘘ú&¿M:ÍÀÌ4%è´LåÄÄVˆ«tž¨)ÐÆ`6çb6¯#NWD}Ó5ëÒÜJT°Ÿf}ÊNí»Ù2{Í -ë!a]†~q ˆË¢ ÂÈtÈ6tk‘ýgÐ -À¤OC²åғ©†IÅãX'õ¢rÇJ±dë >5—ƒm¾ ̃Œd‚yÒõ4ª¿“‰/°Á1ÅVjqjé1hGFí±èЋz„Ú©%ÂïÝYX:%x4@¯§+ЈàGÆÐ×9i¾9¾4Oº7J¬°æâ#Á»œõ²9Y·h4m=7¨Wӟû )–¿®Â¤†å.q þƒfoUX˜ š-“nGð±r à4¨ÇápàAuI¦kòxIôt23-㛴ÈF“2%¿ -÷ÃIE(!æt!äqq›Q™63>Û€ÏËQ%®B09/ëºóËþ?öÞ­ç–ä8ϼÀÿ°/=4\™••UyiïÑÀžÙ–ÁG¡i¶-ê¦AÑCøß{½‡ˆÌ\ßnS’7_è†ì/vU­:fFF¼ñÄ8$“CyëÅÓp,³´>A]FØ/àõn`Áýxêš!~'xLî ÖãÖð4Àç{v?öt)K®Ô¡¸q3•Ãã÷î2 Þï–RVèøXôO€Á»t AsôÔ{ à)\Áä!’QÎÆ}UTŒ{,BZñ1âYq´ZÚÝ~±ð7Wˆìv_ëp™¬VZòñ7áÃp8ÎÄTÙaA’‰­ÙsãÊñ6΋ß/ƒ1©*ě)­ò‚.c/2ç „'äyœYó/~ç}îתÇeÁ@ñqIyîÇ[ +>fVÒátp ÖeVÕcB/=¬(MŕMþ#f`R'xô°úÁhDÌZXœÁᆊY?ݱ·N­bº“b¨1äëFmÑ2 3 ç÷•}êñ×?¬ËREæV²ÚÏ>Ò·ÐNv½YÀ2‚Xç0_bqsÇìÿüYÎößçhÿÛÐÃ?‚ÿžÄãý» -é62¾^èσ\»ªèŒ 2‰Š+ýøJpü­oyd³áÓBµ²¢±.Î'ÉÇXÚ¢˜0ÀÇXƒaݳq!A&òÐØcü³ ê1þFa×F=æNr 6Ñï@ßR;7â1¤•/ð±\H Ä;¾ 0Ãç»àŽ¡ý.íLÚ1ªE)D(HiÖmí°ãÕJŒ/º¶B¨ãv±»‘Ž[€˜ƒt &?]’7çâwÒ13}Î2„¥ NR ãË3í:†TX!sŽ™†oerŽ҈°bŽ AåoRŽÙÌéirLu@}ÞÇeˆãK Ðóïþ†7¦qŒI7ÆaêsM¸ñeÁÛÎ6F÷$r<Œ6†lódÑhc,ìĜXÉÆ¡iM°q7ÿ;¹Æ]%s;Õk…óšLãnUiŒiú(o@cÎæטZ¹’]Ì¿©¼|6X—”%ØŸýì»í§ñ^ÑŸìSˆXJAõa¿6 -r1'qTÙläbYŸ–€ahHzˍyº˜ïÍÓŁÌtÙ©—^wn1V(Õl1@T-YB‹¢he6hñ@ùw‹¹vzù’,e^+¯F|[+ž…‚VŒóÀAVX1T˜UŒÏàÐq™‡´z܅T‰'†W?¥ÓUž„wå'MŒ;Òš˜%ƽ™Ò)Ô_‡N½¹àcã#_ ‘@p‰»U«@]1ƒýÙ©ÄH4Ž9B‹Ðõ˜™ÄÄß·x×3šÀ 3³}¥€Ä­‰C¼ñˆO›#Fتӈáq]øø6ùfV©öØٓR ˆß]¹õ´œ“øSû"FåäGƒ°q±)%ý’µ¬bò4Xߨ€<“„Øñöc§ªŸÕėµ­A Æ/‘øo²ðUÍ[ùÃ,“RÌ¢f‚ÙDFòˏ>ŒbüóÉFU»î‹2ՀîÚÁÃ`¨âý2gøb×àå/ -ü6è0 Ә¥‚9Œ¿]iÉHþf©êJFòdŒó«EՋ@‚ùçŠF± æ«  ¿V^¤~l};ONÖ0rîp5 qw'³Sñh^œÍà cŒaâĘaü;ÆF¾xÆ0vpÜ1|5y6Â0ŒüÈÄáKx°+H“|(›º£ƒM´Kr0nQ›ÜàƒÃßF ¦‡Ô{Bƒ¡Þ<ÕËR5y‹…  ð/æ$#!Òúqšv^°µß FPKVpµŽp›x‘SÅC T07:ë$#Эß]@Á·Æ¨äw$o”à0$x(6`ü/ø«ô•Dpµc›xí€àü{å‡1ðÀ¨pÂq“ìWnƒæ±[²€ChàƒËi}½Sy™J¨@\ ´šhàƒ"·óÙÑÀø^Ų6ø;ü¬èµ†, .çF9,e.Á†vމf`úºv20’ã üzo86&˜ëñó Œ‰GI*ðA…y«IƨÁÀÊFÆ-¥ãTàƒtn)ì8øxƒ‹TV&ø0°/ÀޜÏNFŒ1«CӃyÀ@øÚpÀ˜p°Œ 0( ,”Šú „¡ÎsgW÷ð2 -˜ßDH€¿á¹n `è¼îä#Ù-.“¨—‚F+ŽˆgAÆ­–ž[At%ÜÙÀa ðÉÑ%À¼+—,Rxˆ¢ðÚJ ŽÁÿÅ¿XºòOGØÿ{ºÆ=è¿ÈÿSAµTàՍlˆÙ¿4kô/Âô÷Vò/üŒ@þň‡úŽ`ú^ˆ$`çüKgÿœFæ½ðoü½Óhð£äþ¾»¹ÓF<Úà³û«F'wIîo¡~È\z®¿ —·3 þ-Ð^Qhà_lG _€ÑKóíþ¥¹˜ñ.!1ÊÉ~ ðoayäUßÀ¿i S~½'–h÷˜Ü_Zžò¼qqÀzÞk­¦¦)AC¥GíoÜ_¢àÏg$÷{ž ä÷—(Û»œoÜ_šÙþ+¸¿øçîûËÿè­¿aEû=ωýå>ϘØ_þSñ?MFXEîÙ&ö—I0¾$ýå"nÃþ"S%Ö°±¿¸Wû1öW¯Ôö—ºÚ'õ—˜Y@,‚úËöƒ‰Î•ú‹_x.¶4õ§tùÔ_¸ú[j`ƒúK•Vukle°¨ÛõúË]YT4Lþ_ÿ þÂRžÐ%õ—´\ÐÐ_„Egê/ã‹ýzƒþ2Q§ïÊÔ_†„¢6õw¼þŸ q6ê/0ç•Ì_ð'k¹'òÝÉx¢ñV¦ÊøËÍú5y¿8Ð;ìw¸AG²~ôR‰q¿¸N9;îw AûEńý"'¡²’•õ‹XäaUSîu7“ô‹¿k½Þ@¿֜“òûØeJÈ/³&÷xcü¢~ýêe"~›S¸±F )»¾!~yÕõ(“ñËÇÇ2›ÈŠ|nˆß¡šL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK -*"Ê+Ü·P pô„û*0ïԆZÞZ'ît_jÝmÕTŠ€§'ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿiwÒ}•  ˜os -ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥<ÒM¸/»STä)UŒÂ|v¦ûò¾°`pÅûÒ -Ãx_fíì¼/ L]lx_Xƒ -ÜUë~‹.x_˜}Xñ¾TnÞWO¼/»»`,¾/F¬¯v¾¯´œ 9üÊÍXj¾o©N–l€_X¹æÀ¯$ŸÚìÖ(&-ßFzÁ÷¥!ÂàûҀýøÅH.v±¿êà  /Á0h1hüÂÊÊáü²[Ï3¿4`ìÝ¿²># ¿<«/Mø…ôýðËX°áWe!¨iᗽa«¤“ð«fjWKÂ/úqJÂo!#STÞIø¥Ð{Ü%¿¥ºlÄ/ÿæû½"~im5 ¿Ò‹Wå›oþß¿ˆ¥;¨$a[§¡ÂH~¥ý>žðKÿïªú$VEº;ÁøEén;ãæršèKÆ/,ž¾Ìø¥%ò“ñ[²ÿ„¿ÖºÌ÷9ô&o,ßÛ Žå{[$_ Ø@¾¤º¶39¾ü[ÀCF°ïFÚa£øˆ÷> ¾ø/M0|'äwEøއ“£FøÞnM_†ÅkÙ¾Èìá܃ߋO%äÁï½£ñÊï–« ´©0ÖI­'¼·W ãWv/m¢3›}Hƒ4¹4¥K½íRŠ îØÙ¯äö"¿ŠŒ¸°½`Ž»´Q{©yD=¯¡½È«Í¡˜½·—–²—½oY+bo÷:)€½8Pï7^/OL3ãz»WAë%‚ "¨ÖËj7¼œfõ²&J%£zçARov/5¨7:Šùu›Ó ºÀôÞz7~ -{Œ¼¤b4.tb£Á…WzIC²môŠr8‚Ï‹?;k“Åç}¬¬Øð¼0Ñx‰ç…ºñû ó7Œauƒó¢nâàՈ͋Õ+w¸z:þ^ɼi3˜´œNPMJâ¹`Ù°¼Ã¬ òbY§æ´V@Á•þJå…Uí£åz’ÊËÕ -§ÿ•ÊKäõ†r„ºÆT^nAºÿJåÅdÇPqPyá‘VqYV‰U4þÆäŲ ^q0yyN‡¶R}4ü‹ÇÝY0ãÒà„F÷BÍCB -†â€ûܙ¼ò0ê“L^8Ü“—6;X™¼tÓxòfòD:˜¼•ÏéÃü1™¼ Ö¡(bcòÒÊ,¢™¼ -áÕ;¼ ̱teò2îÙL0yÉÍàáÅäMïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8í–áî°fÛ¢‡f’Wñ;«Ú~v‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Õ½1€"/)¼6"/UöMÀWá;HE.wy…©c'òRùHíB™ÊoƒÈ‹GɅÓFäE -V§äE™Yתÿe¿©Ç eU×÷H×>-F‡€ñ2JÕT:9a¼Œ¨ô§&7Å´A㥁­Ö ÉғD‘ǹ ß q-‡æÆːàEø¤ë§°ÎD°Í8^³JÙy¼ˆö°zÒ8^ ²‘A°vDiü ãE U›(ÞI™»$Š°ýçÜA¼°DÏH×Ïj³ö$‡÷öw±ax¡²CþÁ^ü‰¾á…J õÆà½Ý¶'¼7¨õJ/"9ˆlÞÛÁÖàïv¸˜GIþnwloÃïòDL‰ñ»ÝAÃ ï’ -uïì]6‰êEèÝΨNpw»3v·›E¿hP‚ÐOPwq꧄Oè.ûW#igæ.kÔ˓ÈÝf©×FÜ¥ `Ü ÜE I„ž‚· èUßx»XâÜ.ÖhH´]ü '~ƒíBƒð~°v¡ÎBn(P»@ö³‹QD·³{¡¾4»Ðâ`Ž!vaDì.»Ðð n \h|Ìɛ…÷WS>$ðº—zŽ.û¼NüÙÙº(¥§Lݐî`uQUCÉö -Ö´?\ÝË́«‹Š ,‰7ª.ŒøŠ‚ª{yÒ ¨.Îä4œ/Sȼ#ªg¤.œ· »ðYÀT8Õ>gpp½\[¨‹ÞÛà颪® §;Šwf -˜.$Ëäë­0]1ìK—5E£%JlûV’.ÅÚו ÝázptñwüPrt™8,غô×nŒ.j»Ú(º¨_lç¤èâ;GÞºÈJè5‰Xvs>´¸¢gÕº3ti}ÔÄ^ТMËH†.Cépo7ˆ.[¥#Ö]Ìû ûD—ÄùVˆîŒ‰/§8(º,Z@°c£èÂՉ—C3xîPPE7óÅE—{+ݳ 3R`t?xv3(ö1ºÃ¹®¢‹ïa0†ED|£xƒk¢a¥ÑNÐE-Áánhª‹ÑâËü\ìÇdΆÏeåæ)ÿ›ôÜ܀â26ÇûÏUeD«Ë†èۅW>é¹3Ñ´âséÃSWø\®˜Xhz.#†Ý¥u“Ë¸a¿]8à€àsª" #„ܑóbÂsUôÔOIÏ¥…=|7z.÷`Yé¹¼pL7¦çæß=—áddàƒž«zæ{$=—I5–V¬ô\FàÙ:ð Þ!ÑjÐsé.ã mô\:ZÐ&=IÖa…Àø°°r£çò¬Î3á¹,¶AH#๬[À(»Ásiå×nx. m ÏåH‡Â‰ žKÿçð\*¾Ò€çÂ@ýFÏåòô ‚ƒTXO>—ÃÆ£ÕÄçr¹Š{ø\¼å¬Y|®2Ÿuìø\‚:Ћ+ð¹Jגü\$ 8Ülü\ÒRš;+=DÜ&ø¹J.h4›ü\Š.Píü\NñrÕû¾wÅç"Á§{n|.A,P4>[ð6mø\è3ØÜ>ð¹Ì2æ<ô3Ùº š1“ž›ÁÙÀ¼]äaø²l]X)£肿D"ºH1µtI€ÃÚ5º0ÐÍ ‚. P¸n]2‘šÂ՜IJ~.÷bÙÏÊÏ-—}»àç¢,˜‹’àçªüFÏe6­È¦’‘çÜä8¨CB¾¿ÑsaՏ™ž[:GÒsi@8f£çÂÚðÀƒžËÍxLÏ呋ðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ…*êzî]$ué©åfÕ  èNà -ÐMkt Aip“ ÐÍsCè2;;&A—×È£A—鵪ү)¤K»`è2¹†uM0t™!C ycèòµÇš– ]s#e†.ÿ+Ñ ¢K¼\é€è2Y¨î«±€Gh_áÑ%ªñ(R”ÜúTÔÎ< ºü¸œç^;‰4z†èâώôb@ta¸Xš¥Ê°2S]Üǖ/¨-OU*×]怙¶Š.”w¬Ü)ºxà’E—D„[dIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±=ƪòEƒüu¼Ñ……1±£Kߔ)Zct »/;*‰Nrîí*WpîC.ò²Ïͪ« æZ˺Ss§CLÍE3Ñ^ÜOª:°2s¡1G~×Ì\„×í mµàk#æÂ0€¹ˆOârQO€Ùz£åB®´”`¹ø[)Árñ7êÌ6V.©Ãè´gT.÷x}òìܤ|#å2Z4%¨ÉYLï¢7Ð?²…“ ý UlÏ¡Á? ¹ggÃõ• ɟä²'ßq&°A„¹w<îi½DÒq!G7kB`@ˆa‡ãŠ+ظ§›$÷<¥ÊÚѸç N–`\$iU7ép¶ÁX±¸mXXc*.CmãL(.‚\#¯L\Ä=Ú$â¢êFó³”4݂±‡ #SÆáb'Š¡MÃU,eì0ÜËb­`á^nL(Ü+&¢…„ ½ £÷áB€XppáQâãÜ0¸»2×f -.tc2pQ#‹5ó†ÀEž¾¶àâO8‚‹}ðnü[ÈtªÛܱhý:ûô[¨Êªð°~‹‹D1J°oqø9Š`eQ_¹ØE„O(K& ˜NoOro»‘ö¶»eCPo£¶: ·Ý0…yË®gKämȚx{ºª{#ÞB‰XÅ”›®¼[Ä}1èn¸[:ÊHÚíåÖR»½,ÁÜX·0"f¨[ð:à­é¿TL¾Mç¼¹¬ 8·ð¹à×æaí rK}´f܂ƒ‚ïȈ[ܼ_áFvM1à„L„íƒo{:ñ²ñmXx[ü8ñ¶øA†n‹[g5à¶g·NÂЖӘƒ m‹(Öé¬ä´ª8À¶¨±Â§¸qmYü€€ý}`ª-’¦ýޙ¶ÕB0mñ7‚›´ÅßÈBoDÛÚ´øK mó $žíÅè g‹ ‹KÊLc/á̖:†çÚY¶‘-«Þ0w‹ ’-"Oˆ>l$ÛÁ²û2A¶M!·äØÞêý°cl/…דb[<§bûH/½1lU7Paûðmžۇ¤Œ7€-Ø„ß›_û¨dÁôÚGš¡7v­d?‰®½-Ö1¹¶º>j'×vñF\kYlrk)b~ÇÖ2œÑ&µV3K2k‘q-ýY‹˜÷XµxoÙÂÄZê}Î7`í)/'xµÕ³wàjY }µV H¿“U‹µñ„ªíª5yCÕ¾žAkIª½K,ªÕº§ÕT+1Ö{Õ"PéÞRº, –:IµÌö_²Þ_QÿMCúà{ïcêí¥n’j!\À+ ÚàV§É4J@WL-Vöp±‚R‹Šq¸³©½\¸1j1@ éEÍR`°6µøûÖ?ÏÕÇå|ði‘±DÈ?ð´ä´ô¶Ói/xFp€*ŒˆVÅù²‰¦}J¦fiÄڛ÷Až`ay¿qia¼˜å<¿‹r݈Ø≲ªJ‹:fǀҢ.ˆá3o„d]’öy´2$-Y¬Ï¬Yz0ol@ZDñàŽ„±?’º6þÞp´a ííy8(³Ð bIº±h¡ edÅƧ(’$Úü{ц18´Äç>#1´÷%ÑÆF¡…Œ¶ MK!!s-ƒ–Ä9õ-[|ÈKÅlA ½­Î Þ,^õS;ÍH3®Ò~qDö3}²½®Þf“?‹ Þ©Ø$Cü»ö¤Ï2fy\;|6|aÁž}Ü})س»‰oèYIÛò,3°âÕrVd†¶Œ;̤ÀÎ>uöñ¹CgÁÆÌY m‘… ä,þ® -QOâ,åLàìÀ¢ÈxY¬QµÏmÃ͎ÙUŽ¥o„ùö°YÖ½”kgÍÐT•zŽ²>’iöñjpÍ>¢i%fvÄ¢'(³¬Ls/©E&M˜®fÌâœX9ˆYÔâ\†ÓNÄ,bœÔ*40;±òeŸHn/û8Ù0Ùøä7¸,$ -;.ûÝÁDÆÞÍd¸ - ¾ -©ƒaEÊgL®,ÕÒ÷xÃʂ4°_Pe‰q92q÷1«vSÈ|³pWлCþ$ʾ ªd݀²Ý1æÊö#*M]°œ†);bÊvópiŠe'ÚQ–bnæÅÊm²GG¤¹Bl'ÊBi¯ºje)ÏwÜ·k˜h6S™H3•Óãџ€#]Ҝ¢ßY²—‰’EŽ ÄA’¥l‰yç•$‹Ä&V?’åÂÊ[¡¨–°Jç˜Sý‚©Ów€µÉ­Jˆ•Y,[“[)² KöRç‡AuåfÈ6Ë7„,º$ê̝ŒÌSdßݙÏßÜaú‚ìߍ Ën]Ìbԅócš)@ †°+×'59,CIê誅`ÎrFóqŽžðdýÄc¹D¤#rdÆ·ÛÀö}©) áU%'>,(«¡ð”.©Ck«{ʝ¡ fBÑò˜ å沧¹ïŠNŸIû9%ÈcÕ¤š8¾˜WÊbHþ˜F% 9…/<>xUw"gòÉëS·–¨‡£aâ@?ì4®2ØËñ´Kž:ÏÅ\9*äV Y”ÔA „‘`9˲+ŦÅu0¸ Ö¼ì_j‚‰ø“M° -`³TÊ°"‚|¨C2¥¨xÄÐg°[qÊÀVâ*ù) Xí¥ÞÇXvUŠ£ax±³=6hk}ríµ¡õ5‰±ìÏÄå+`J¹øR']«K¢­¦,¼‡á¿)§e‘íÜO,8‰jő ð‚…+%þ$û3ÂÒ£NN=ÅNý$ ©øÐÙ­ëps1.ªêí=3S•0lÏ®–Ðþ -tÓ¥½…EªbDܟ@|¡ã„ZãQÑY‚N¡ÓÜÑôqmn#¸ó·{—ãٍ.«ó{ o–’g o‘]9#‹ÂJø’`©ž\I&>_.Ôñàý¨¼UÓ'ÚB.—Çq4µ¹ÆG%Ïlq=Ø¹Û Äðñ°ŽOq-H’ˆ”>Œ^¤å¾µ!ãÍ0 ^YX2›WšŸ`¦OQƒ@ •¥ÉøiÉòy”ð ø³$dÒræÂ{\»™†¬Hª‡ØóÀ½’Ø·“čq‰\‹÷Bò®{½Á4³Ðs¼7|(ZÃ:œ½× ãÛæ`ÛujçoE¼¸¡::à706ÒÂR„½k¤…ŸˆQÒÏ(zFˆÅ£O†Z@1`¨ð¥žjþÈöÙaOmø˜ÑÇÇËNAXe°‰f„  -NŠЙv†LC“¡‚?KÞ¢cˆòUMö~ª0ŽýP%Îp’ü}<pñ ÃÎn 8WHž Ëë‘Åy†ò ¾ÊâŸÄ‚™0-08Fqg@Fãø¬ñš`ÙÞ2G3;ÞU«%Z8Bó±OŒ»«ÔZ¹+«*ifö[ª9n§ÛayÔ¢Šrã]«PllĶtX>±KðÃlæF-EYTeUd¼oJ ²,ñáàG•F%‰¯¾Ž‚03™E0;þÔ9`’!ê9ÊÍ`9sæF­'€î2ãÅî"HóH\»qzš°8ÏäˆMÀ{¡« &z²EŽù8J…÷–OF¨« ©«c~L„"w=z-J æ»P…ðŒûåzLf·êòGÅù¸îûv¹šýŒ!|ÎíÐ1 Ât›²”ê¶Z"=õ€àƒ‡`ö‘ÀO &@ QxëD¸ð €lÌUkÖò€J~ù -Ød®0zWŠb½DŽ›‰/ÁWƕ¶t&)7}\3þ}zb—5ù4´ðQR*íe7‡uF]­X¦ãŠ¤Â.Í=ºþöÈxÂL1J¢¸¡0Èۅ@õd„΁™XX)2ý5XèŸâíÅ®QýʅxQ¿.áw^KuÖÙL}pl±ßu¹Knˆ ­dFeSLáîô//‹„Q–v¸Õ‰š˜±K\u73Už§$×>áÃ/êiâ5NÒôÍR8pלæÉÖ¼uDÙ ¢&XX&Çm¨ªFUÑ}§¬Ɏf áêù -\æ¯.–GÔ¾ô¥Y”ÀŠ³h—TÍ·h4ŽÂ6¼ÙäI¹[f5èOÁ«ŽØÙ÷4d%¸ƒM¤ÜSËm¬yËО\Á"Ø›Ø?z6œ”}©e=ì¯Bê#5ûãjખ\ÞNù΁Kßó£ä6-\‡ßÀCÚ¬ff†«å®º "âý†ª?Ù èQ#Xõ ƒåšë†; õºÞzGï t㺓^ŸcÉ!ö_¶¦Þ3¡ÓÇK¶qõŠ‡5ÞÈYV€CÚ}i¤RÏÓÛ¡Ò¤_Õ|E*•‡øя—¼$c™'›JRçÙhLÙ]t×y‰—…ãû¡ w¥J 1ôùÝ´ރëóJ3Á¿°FëÇV}ßzåîót³Û:p}ÞMC(ÓbPŠ¹5°-Nˆ5%eç†h§ÈÉòŽ÷ñȖ¶«›Ò¶r¨­hö9¨%À‰"¡qò+Gú«b¼†È2dÈôaFдDp,7¹+ƒè"æœÂò©G+^)uybÜ´Vð®á1REs¸dW še‹”û±ÌÝpÝ^jÑNEØ W õôÄGSúsF”? -óeú¡´Âð1u#ºð~w1j6˜6DÛUYˆà±D…²ºË»v™Ô.H%(92åù<‹´œ*+÷živ)!㼌‚ 5SЂʍ´Å/~øysC¯Ðèg‘29-ÄxÏ°^&t“]ȟÀ×ϕs¾½@ÃÀëð3½¥¤QÓf5z!ÓH:äSaI ð®]“&à@޺A•¾ª|ai“Õ£ª.n¸{–zuãA1Q ×.x¢s…Ž:•ûŠ$ÜNn˜åŠ¿Ûæ²»Ïñ2¨H Ò8}j[ۜ\z°P„èÄ3bƒo´±D¾NÄÓâ]©bç®-cqñ¼Ý*3¥…<ԎRӇ]®"Ýe~jEŇ¢‡1ðýx -¿Ríz»é7è8¹l¡€Z ±îe±& Ô/ƒ·Þ¦"NÀ£`U)$†CO ‡ª`WŇPïȘBþsaêåu³S¾‹d©b×hõÇìy ¸€ì}úM¢ïȸáéx ,xzï…ýW?è&Ñ;µü":ãBt&r@J3aTÉRÊæ/犻Æqÿg&ç½q0U€7†> - ‡`1å€+ÌÜS Vž;Rüš³óÄS]:BýâÚŠï{¹õș+BI´Ê#°ñòC܈Sí~rg!<ä҂¹î[­öfzOC®ì¢OŸ7S7g•AÑý¶ÂÄÑÓÿ ksrŒÝJNå©ô:~XÌÕCí†7UÈ ñbº²_ˆæy1YÍu«˜4Äñ·ˆM8kùß Û«§u+ßC¬ˆA¬åõÒ0!SÏgFNaUhž î,̉ÒB&J½NíÈç˜{Ry¿íI8¡øo4“>­ÈéUÊ)™À Ž{[«ª¸‘ˆÂr~Ñu‚O†w´bròªÌnªgkn•Xò,ZÈ>a–TˆWÉi·–§ÊÂw–Ù0FÿpD¹ë©W:hp‚‘š—z…¨…?Ê'ç¥ÉÒùÐùâ_¬Ã%3å=]õ‡GÏ&1µ@ˆJâ?Ȫ(¹®a®]IçuŸfmFS@üˆªóÊôrÑÌ3ß3±†r|FT¢Èy©‡Då°<-$0s]C3"é°¨Ý Úî@`ßz%£Ì=¹Â„™G ò -XèÅòG!/”%4d•ÍY ømE uFíÛð+Gû-|n8£óPd¬ Eшˆ(ˆø+ð z$YÂp‡Ã£¢á(H$8“Neò%<.-`VÁÒk›{RÂ+ƒ…Ü®òc¾LÀ?,o¡%û>ÔÃ=ï+9b·Ò?5—)ž­ø¤ïÐ&"¾Ý#—A8,{Z3| -«~ÐíªÚáǖ‹Ú ÁÈ:ôW®Ì Oé0uvïy¤ÌÌ=YWRéª3k' §»¬ùƒ¥Ïža„¼àá!ÓÀ„ Åè·S 8Ãy³¥Æ­+Å ¸´'Ëpù8«ï=&vê=NÅ'™H¾(‡áâj!¬”S'ßæpZ –k~Ü0ßÌ<ª(æ±V8=0×íYób³¼Çåˆ:?g¹0îð!ªC¥Ë¬†Ì1ÏÅ‚Df€ŽKHü“Ú<Y3rüCÄÂè®Q•-Á¿?´D¤¡7wB.Aï¢ù9µÐ.8ÖskCƵ+)>Ֆº|e„Çñ^Õ2œÑijÍd)Þia„ŽKeã~¢vÔQBÇoI4 -žá±ŸÅŕTNŠ.•H2°ZýE‹[ýXʏÐn3û‘€kFOëqÝF¥¬¹jCöŸá6ì*€ 3æ¡©=hWÅ4 ýfwó=šÕñ·Šíˉ˜x®î6,kÍAUö›i¼Ó<…ÙH¨«5ŠõI´Ì_½ Ñ@ÒR“R Ÿ$ZæTv,ëyáöځ4ý†°Uðk°š©ìzD[Ó?–‰ó®¡OÆp%~B©GÑÆÜ{eè—N¥øàûðõ©®Ñ6¡2ò Ÿ•ÛÙÂÀ,ärW5ÈCµ_¸nX%g‚vëG÷¥Ä²ÌÀTÐreþz³µÌ`Åס ; Â"Yz†/î®RIèE¢;†9gó¿ows7¹ï1÷<ªe¬6ᜡ¬kPÛÙþ,™°«ûPšÑðP“‡-Él˜/šËsì¹UœùÌõ^LR -GD2þ°ÈX©ïØðnqƒ†¾[&ôTZzџÉIþ³¤„(J£Æ°›ê‹à+¥?³0øÝ5JÝmnÈ\«Àû¡'ê]/+ý ±gœ‹°_úe{L - ƒ}.ó=çvƒ—4(,êOA%xi5L]–ä- -àD½§Á7÷t2`nçº<;¦…¡ùÄ/Lsó|x¹œß°/̘ -Ì^ϒ¨V®µÊ:¬‹_qáŒùøî_c 3=î̌Ðu÷v’b«DT÷c!ª,¥@ÎeðÉÐfâsAäAi˜psõ¤pr.ê\ñZ|¾,I£¶€6ôD‰Ó‚õ¤þ©F„*CíÐaÚ(·yυ%ˆ ie£hm§Ü/)L’«vêtU …cµDV¡7)ãRH‹ÑÙ`&÷RȎ¡ë'¾uR(ã2!µw°­ê'5ÔbŠƒ ÔÛ/ïÐSó[9Ñü`:ú03&/X«ƒå\wucƒSý‘š¦$ Zë¢6«ô`Y¬ÝŠÚéhy3JBröÑ®ÂGqñíKuBfoèÅ-ÔnãÄXÑÎ^1 $âé9”¥$ç?`aí{“úsåž=Ú ÝÂA –Ó ½¼ë±ÊrÝÔ}Óë­·Ai7ú!eP +e–ëR‡5ÕA*ž÷—ðUÊ[ÌÈN‹‡”æ>:¹áÔ éf·U<Ô¿ÏuÍQL<Èý4n¥tš³1"«3îy¿+VðsJn/c”(GàôÃmrCNJvÝ~.·½ØR¢Ój¨îø‘›‡Uªì;3vf6 è -/XÆÕy˜æ.é.5æú¶µè’X'TâŒË–{‘PqˆŒÈ! lë\¢!0,ƒ˜lÓٖZx×p®`AýCÁ -•JT`äbǐš{úïä{22O*%kl“áàP^'՘ÐP·ˆ•$ï6ÃËtĊ»hàžÑ%žfæ¼YÙÏ0c‘C‹‚§ÅÀïӃ†;IuÏ©w‹Vc TOQ;ü](´+ôpwªvD'ÀH"ŠÕß_ìsúiL.3£œŠlw¹×?¦™ -†Þ-‚cðóèVs²AFXr©Kìųô±‹k§¨¸/-ñô΀«S£=7ÀÓN'ǹäö>¢â@\[¸ùt¡s•Š;7W\…mÖ¢\{¶YV{ESIüU°(W¦ô Å,ýXb©šúXÍ]ä*²¥¸šVƒRbÅ8浆O™õÆV½ÕTžT–à^J×qՑ¯ÓIg.ZèDBe£¸ðáqÔݜ÷ÜUž`à”(3f·•Ó5t´‹µþ>".'ÛÐ!;£`Û%½1>WR4‡c-1®©A ‘0¦Ã+eBó†ôìÊd—ùÇx3à ¡r`ÕK¬­9¶2p(ÚtQ)ATE.Eg°ªei£RÝé. 9´‹¡^êS™íe÷ÇSÊüô>a¤žt¸7“<‰€Áâ,USõOîʲ`˜¹Îd¦€¿‰ ™ôàô¢=¹*ÎñZ·‘e†¦tóü)¬gç^HÑz*å@{ôò²k_Í.˜$).ÜýögJ਺yw¦)ÅM¦&è9Š\n÷Ïü>²;úï''ãòØu=%Á&©.…UúçÛ$a†)/¿ -êUMVFwQFÆqæ#DÍ6°—¾IöŠãò¼)̜¸èòØh¦{Ϭý£õ4•­‰‹¥]³œ¾¦dÑÝ¿´IÒ~©cÒ»ß:ãšß;M¾A0èÇ0?*jáéÝZfÓқ«PÔ=|,Ú/Æ'›ý6µ‡¥Gpûr uݬ»fAé3|ö̉ðWe”x3beÎ6,vlºZ˜Ïí¬g͛ֆ‘hìê}÷9v$åLU|¹4Ñt¸˜ÄL€ðÁ -7ûœáƒ7à–TŸ'w—aK•ÓH­ýû®‡ÓªÅ¢+Z.…â]ZT\ùTÔË:¤®¼-Á?c†ãº‘i•°°b2”¾ØS\$å¸ê)–\1U;üHo•L`Ÿ”KtQÁq¸"-—2ÜõéeîJÍÈ°šœ59`±ëGOW‹qn÷…žbÒ;ԅõð‰ŒÆ8ŽÓ]RÖCñ^‘•Òlež< -5g˜Ôq†Ú—=[wÅÇ©·~¸K.,\@nº CΟ\¢s®iøŠ˜u çë$0¶(ÚjÌç\³+r8\Ýi -Á§@.kÙÁñFyFî*Šš`)o#ñ|aƒj¢Äc@p&$Nw¢™c+êÖ»é4‹ßnsðrA©Ú̟ø8`à$¸${ʟnIË=ßùÓmZq“´¢ªn\J]µ²ZC]–"Ax…RENÎEc¦ÃCõ)•ÝBæßN]ÝáÄfÈ"±PùåŠ(£—¨Ø³ŸÞT%«¼ª²¡QŒ=ÙQ¬Äiü2—£°'D^(ªE$‰oÈ9.a£y,ìl‹É–ÑÞÜUÔ|8ÓÂBç-(©O®[Âr<ù«…ÁHFà]Êbô-„{…ü¯ê»ï®T—î.“ª·äíêFDaN§EgX¶sá·ãÎxª0ô£MUÏPÙëä¢,f…èŸä4Ø"x J=·ãiJ7ðà”'4½çåb oL‘B*‰°$æâïÇ´~ïÖ(Åº‰®8ØEHŽÕVBQ–*-ª$Ê Öæ7ú˜²XPœËæ4“Æ+Y2*;TÏî7—i¼óÊlx³ |ŠûìÐ -úqi%r‚¾a©^eΕQvò1°ïOQ½è¡Ý$¤ÆßY~Å/#J½®Ýz>#êƒ`á`ÕÖÑe'XÓ-Œ±”GS§"ð†ä 8Óð9^I˜]-Ò}º·ø3#ýX‘7Ë"È§ 0³ÈBîx7Úz¶1¯”T4’”Ý!ÍÂPP Ez ¿÷y¡ÊùSIŽyÖýV)j,…ˆr®u¨‚äCC²:6èU©nDá(zFUÀòY<ú 7åº=&œ1\¢ƒ_D¼ú#_¬M_ìt :˜/½¸U §¤®Ò蔱¨ñˆŒRÂߓ¸ô± þ^H@Jä6ٗž®03úœé -º[.žõ…j*}k ü¹ÌÅjJšN‹ïôPÏøÑ.0‹*¥Æx†Õ)/Z¨¨® 㮔–Õ¶ &hæ#ƒ„c>žÇÐ_!kƒÂÓµ”’ÂTÚÍu¿÷ª€ç£UKµdr^,¤sòæuãÈR -¿Ü6.{&›J·Ó[Zfàð‹™êÊ{s -Ü0-hiÓ2¦;ÍÝE琩/ôZ~X|ûÅ I¸|Dq^t•Ž²+Ñ¥Z‘+À d¬™Ù„êœ: lSrÍZ›ƒ5\q’n´#’q®!ꆕOZ×à]Lªzýûˆk*$_#Lˆn€Ñˆ -/ZxÂÕµ¹«(ñX̄€@‰€zúå14ªÕ’:”~Å£¾hSøEåå¢Ô¼ óæðe9ÛüuàóºMzx'DLY…Ãß?jfpe­åQAµ°OĦŒÒ´ˆ˜pnõ10S‡CÆ­ëfÉ!*-æ±neprl²© “Sªã^š´¸(øŠ²&õŸã¡ª® _”ÀU"¥æð2å ¢·º,î¤er֘q‰1œúbŠXº6󨊝ÌXêÃþUe-“ð´ÛÔZ–7©8ú XsµÞÄ5öÑs¢4q:w¡+mîýÁA‚J"ô7!ŠL„âÊyÍ(fnµˆ]ŒŸèÑm¥yµÉM“ïNkîy؁Xü‚: “P„ÏÊeZf¯—Û]£À»+ÍR‚Tšs·ÜƒŸU3ÚÓÏ4:÷²Âó8Jj¼t®|K;JçÀÒ­2AmµÙ­[^Äj-æëMë{ª¬f•°u^ºó™4¨ýÄ­@Œ÷¼Œ*°F 'G‘+ÈW-˜.¨ÚÂÂÏ%kY]±Å »Ó$͵Úüâû½¦<QeŽ fÆÎP€àt©Ìâ‡NÝà­¼EîÚ¼JúÏèkƒVúIK‘§Õçlx#AÖÈQÝ¥éJk„ÈÇÀfL‹vELK• ·uOÅå2¼yäV”È4GÖrWö¶ÈÒUi§.Y\ª}ªd¼ËÞƇ@ëW—AîÃõ‡£#ÞzjíSNx°û;‘vÚ%èÅ2̉g|‰­T˜0€¹¹¹Š¿Žâüb1~‰SÞ1/´GC¯"ú+FꟘ¤/Ñ@»¹îÔ>U±t EWwÎ5—47BœU/Fú2½GA›Xå6T¼NN.e2ìF8ŒtÁâkNk˜§Ù‘úŒtgnh3â+‹êN˵V«…×3ф¨¸“˜~GhÖ¼É딃‡Ö"L7á—°¢.É MÃîõ¢’\ü)Άµ‡ph­D½XÆ´þœƒYEu -°¢ä-äfä) Øƒ¾,£Ç·]ØéÌ!zü¸Ý¹jQ=nªêW{Xë÷)PKu ª+_ƒY÷a)ñGX®PfêŒÛ«ÌómƒŒŽ§¸A¤Mâ;BcÝÄ/ñtrLiµP oÐÛgS´S©6͛°LèÀ.tš`JÌ©” ‚n˞=jõ¢WØc?B)as]„Å~æ£ÜÄܐ)„K «­‹L0ͼ`N}P«ß<¹Ó>àsZQ4êšw¢›̨¸ …:Q¡…†±ûÓñ2žÞ½¡xwÃmZø«wY,Þõ6Ðf,®Q‘Ù">]Í UžÉ ½¶ÃÅ)Œ<“jELuÑÉ*ä7š£±ö9É3´Ìú:wàjԄ¿OÃH%µa~ÙěR01å¥>–!1®ÔN5gŽÌ„g4žÈ;Üf– s ê•Í&RA„\ßtéˆ2NR¸Y…UøŽ«t†3“þÕbgzØ­à®ÍɋRu,¹«Ã⹧´Hi°Æç06MÛ°v_Ò¼•í/ÐMWÕÀM@ „¥HZOv„43ð̏]¬h¾½z^E²Nðbk¢veu€Î‰HvìÒC#ÂíNžF¥ª»F;®Ü“®Ì{ÓBþ&šnemëÉÛ[FäÂÛaZѨd°˜›¾b )iñ•ˆX¶ÎíðÕâö²Ü’>p´‹‡”ÛìÚܳV®«j†®ÚÇYÓƲ‡Öt{oîéæ,š´X†Ê&–H.…f³öü´ƒ½jh¡3FÖuz›\• ä»Ë %ãˆT×YÅs+Y¸”à„±¸wâmÆËöزbü«FqÛõL¹<̇o…j<ÁUO—ú”Å`p‹Œ‹1€ ‰ÁÊNˆÛ&¼‚@GxÇj[ràdpù1åOˆ³[Ímâ&•¤ƒSòל²91÷ýX‘D‚ÿÅÞÍ\*¥w˜/ßêûHŽÂ#GYžÀuh´åOHÞç>ÔGäØÇå¡/AóÀå¾l¬?¥ªïÍûü͝¼@šÿݐæQ8±Í}c½AÍ8¯‰/gßEP6œù9œû š9ðý:ºaæpÉÏÜXæ¨L}N9r@™G«±$™c¹G‘ò2G!–°£æ˜W÷ÊNŒ9 |6Œ9÷+ªÄaÀ‡¿Yþ¨+ވ¿Øì ˜#ÜÄÀkÌÑZø95L~ytJ|ys$ñåͪ¹^>­†—7wTMv9ðdêlèr ¡à%º¼ÑÌÊñ›fÎ.gÆÓðh%#¨JÛäò+¦ä•\ ¯àÚ¦SÁДücœ—åM§$\‘ l9êƙÏj9µõyƒ–³ßõLf9:ëÕ3ˆåü«ï¼rÚƘ¸r£>פ•_–î°ò«œÆ¬r„µÔYѬr,o“&¤—yéV&©¼›òŸ ò®’ÌSŽ>F§yò˜{oûFÉ(Ç,~>Ý0Îõ—±l39\&ˆò۟ÉN(¿ƒŠ€rÔ]ÞÃS(r/D?ÑQ&=EtÊE›N”ë„“ßÍ옍MŽ–@‡©÷Œ°¼–C,NK2y,v09–òóÌ%î Xò!ŠÖ%§Øç4oÿƒÓdh$[‡{PïDò§{À 90ݾ-yä·U’;Ž|<ªÑK9+í8eœÝ@ˆÕÚhäjÒäX‰bDÈ6hä°2³ÓÈK8ÞI#‡…}FNƒ¤°ÏÆÊK‘¿aäX†3„0r¬˜X_´±ÈQßxé,2-Êù¸] ÈÙÏDEâ+Š\fÕ‹"f·¹~G”½®,r˜ï…DÎN/ç^ªó D”:)jÁ!™³‘ÔE(”mrÌ$ ‚|xòñ„¾nÃÑ­IXàÇq:<ÐFGcp®¾>>¢è$tÖã6C@ yü¹bbð8ª—¹œß¸ã`:s±Øñk„_fìxV—oÔñËzRSÇA.áÏtäõåX™ãW„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆ—¿"P۝¼ Ö8ýLál¬qä¡øújrµ£Ÿ³aèË,ƒ Gڊ•¾oB%g堗5¦3ŽŒH+!¥rt¿`¸rŸ!&õ.FŒ3Ýõ™Q¶Ì" Æ@À8†zUÌG6S%QƋõ# |£‹×>ë¤Ô0ÅS]²Å?xŽ3bkU:<Jä7²8Š€¥iù¯Ë°Œ!¸âp8„nXqBdŠ‚ä„­0ƒZ]>Ç·‘‚ܘâX1èHqüŒ -g3ÇãzŠ#ûÂ×'¬,ÏÊcö ‡wš8ò=J/&Þä+%Jé@êX6’8`å| Ž³ZÁâð‘›áà“"~Ÿ–q¢º—¹gD(XâPS\ætSˆËåTñiXùáQšøð+âA¿. vxø]ɂˆÄ¤8Å°ïïõ3{Ú´o4 o´o¸)Ým5$YëÑÛ3ȕßPßX±3E¤ïAW2)|C ,œŸÞ8ß(7:ê]p'ë@ £ž^¼– ó J)ÄÀ|„ó‡Øâd›ê[B€ò}9*Ÿ†ܯb­¥ -*¤¤ßßÕ´†$|ŸU¥ øÆ`&õÓÊ÷†¨…à–À{ŸÕéñ {§.±ç -÷®Ñˆ0ØÞÕ­¢í C´Y A 5 ö†x ‡Öúâ˲ ë _RúOiX4ÿèzYIän>íPï´Fùô¬¯¦7¶YA>ÌyO¢÷é¬zc .16 ÷ñÅàyC%ÁâñÀyã,¡™5ž„õ?e¼ÏáÁ#XÞ)Ê[QÞPÑq ’7 -CX ˆn0™x¹ɛë“s±ö`-(6 É{ZMò¾†ãôòþàˆOW“k¶VŽ·ú-Ýe‚¼©ðc“ù ySÞȂ‡ä—±…$ycCa3ƒäÏI}#yÓÊú‚àqëu¯-IޅոW}#yã}Æv{Çn´@Þüû1-úX`øÎh&ÈRÎCŎ©Ÿª*ʘ oò1Ä"1ț²P‘X ò&‰…+țf"äÍ'u÷Éñ¦È†9àãMaM”{0 I .'9Þ܄ŸìÆñ†™Í¯“ãMÑíÑFr¼! rãxS³¯©ËïBÎò=&Ço¨*†6Ž7µÚ.áÈÌ c$Æ[ )#̗>‘Y°oÈ¥B8ãMá3)?ÆfsãM©¹ÆxK;ÇjµãÍ=YUï’ÀËÀxÃÂàݎñƅÝ> (í2Æo -¨X'¾R¼Ù9>+… \Þo„9®VvŒ7Ârç5!Þ+¬rOT0z+òDW„÷0Ñ, ÞÃjúxã8ïôîñÄÓ5¼›Á<™ƒßëà„´ó»QA}‚F à’éÝ$ŸªdJx7¢®ý¼ŠœÇaš~Î@E¯än4xWD›dàǾVR»±ßÛ Ú€ ÁìfđµÌÁìfoxâŽ6f7/ºÚUù0<¼ÇƜšPýÛ³(;Ø6ãt-œ?s¶cwª…DÉa8×솕UTÁëÆqw®¿¦R¢…Ö](š8T¢æNBÁŸ \·æ'i&®[”½hKËÎv$R<:˜P,àJpÀßpÝ0«â1pÝ´¾f\7 ÕBµ‰ë¦™åXëæO´„sc -f2mœŸv\7ÛªW \7k7!ˆu3ª¼­Ìš´n֋°Ò'pݨÀЯ®›7I¥¦+¯» yÝìÐÎXðºY¼¡:…•×ÍšD}ËI¸]â¼nZHMÜxÝÔR4¼nö‡â20€Ý˜»Tñ¹»%±¥ÔÌÀnn¨*ã'ÚÐ;´»éúpEÄniq½a;-hmænO`7¬rK 즡[|–¿IÐðNìf„OòA»Õå‘†Gä#Ä­·$˜Än®ªÔ†4 ˆD/ŸîqÀ²uX8ToÈn™Ÿ(X=µ¡‹y…ì†Aôû ÙÍæ6IJ[ëC¼µ–>£ßɆìV÷GÂZŒìf‘ÝxãˆøIdw¹® ã,ÈnH Br*d7]uY‘Ý%U ì¦…©á@v\5,+ -ŒÌüÎ7d72‘)¸Rž¤•G…3æ"{¦oÈnšÙàÌÈnüUk‰ì†…ߎ솙pžDvӢ중ݲ0é¶"»ñ£¤t&²)RŠ·‚؍”¢z®ÀnfDIº`÷p.-YÜY±1»ï3òö£¥ûcbwoQ¤´»a=ùâìi'ëîm -Ù璠;ߓ°îcSlÖ ºÚQÝÝÒ“Ô ^Ýáè:cchÃÎyhu“týŒi}™Ó†Ó=­æt?5Z†¿ 6–ö®˜îûr>73g>!ÝiØÝÓ*D÷M Ñ ƒ¯+ ›´òst#Ê­Š8ó¹aÐ4²â¹±çýÀs?!3 -:÷søíßàÜw4P 678ji47€/¦627YÌM!<ÞEŠ.‡ÓÊ]Œ¯\±Ü0’rTnšËèº"¦ÜîÉ侏©ücšôv·«DrÃ@áFäòŽõ‘äF˜•,òrßñ!/nÑ=!Û|¬¬Í6d›ï‡Ð€lÓ¢é -Ùf³Ð¸ -؏Ç&†lôž>§gõDŽl3É`ÙÙ¦YÙWC¶™¬÷Dj3â¨ä²ÍÕMÙÆcöo² &_˜±{à:n3¶ç29ÛúÖÝc ×è'ŒmZxWFH»"·;c»Ý&Û°HÜŒm–Ø>Úd"¶q¥Ùb¯¡°XØ†WèRï±=}àTVà} Y‰%ªœ6Äöb6b›Mž™yÄ6,R¹mˆm3Äv!ÿ¼¨tVÝè!æÀ³!¶ñ -[9bÄ6%†jLlÄ6ž³@wbåz¤§cukâÜ»$Ýó>í|mh䔊2^n8‡” kãu‘'¿ÒµDâpxm‘Ô Ýc-\³®tmY©H2^›Çº¦­òàêáeÃk3.Ê%Á×ÆsgÌ1ùÚã úØF=Q”ë2™ó##ðÚ¬/*ÂhOº6Úü´…­ !(#)ÁÖF׎Gi}¼£`0ÈÚ,_lZÑ2—mÙW®6ÖGBÎ8èBኗ³T‹XHaƒjßn1–LíÛÅk‰Ô‘ …¨†@·¨MýÇá` -\Ïî`çÎӍ1ºài÷3BÆi¤¦tõ„i³£Ifiã8 H»G¢vãhwãµ²šEçÅe(¶R´¡¤`Œ1 ÚHò³ -†v áކÐ&cnH‹ÈØ6 – ÝnEUv€6ô^* vàÚ~Ö>»…b£gC£D0KÀ³!²{|žtý@vnoàl”( tanö%nP@³±°b¡íÆ̆UE`®Á‡ØŠºÀ^CŽ%úË -̾\‚’¼ìË=˜—݈ÛÜaÙÙp)XÙݱÒDeCÿÂI|#eã"øsʾ¢½zp²Qc¦VW+&û -@E`²¯˜Ó‚’3:Çœ¹yL5 Ž#ÓÓmh6}¢Ë…x;"N¿Â áôø† º,*ªW>6ê­‚qu\Ñ~ÑtìѝÎ^éØ02Ìpì=̓Ì̍=,I2öp"ÁØ0ÄÏM06-‡Uw E*$¹ØP§E°jb±Ÿ;Úa‹=sTìøŠT^¢žÉ€â>!Öæâ‰îßŦ™€b²‰Ëø”Plæ$èsoTl˜•W -*6\ůƒ4lnó¸8`–VÎ#‹ ‹ò[Å.%ªð7,¶ÖM£M,6sàt‰‹- -„ÑîK_ø‹jg,6ÏjÀ>¸š3xø¹Øp9ØàpÃbƒ'¬u¢5{X¶#±‡ð$bà X ØÃèŝ‡Íêá³Oö¦uP®½dt£aŠArun'»º{Éä­q،ªv×uN¦5c«Ôw›gwž“†MÿüçWöTÎ2hØ´ˆzGmKuÙ͊Ãf!‹JόÃæ¥ßDÔ‡– ‡= y0*À‰Ã† ÖT²³â°a>ÕFõ¥¨‰Ã¦×ÎGµá°éԑ]8l€.Tù'6·à£ÛpØ<¹óœ4ìr¸R2iج‚ᨼҰiÕ@`6-Ý 0X¬x…w6]Ò꺄SKW.% Ufl8l.¦OsO4N°4°J³¬ÓÀ BAÙÆÃæòºF½»¢§GŽàa+åŒÚx،Çs/´ÔÀúŠCH± ¥ãx´± -’¤Ú@lBéÔâÃ@l¥hš”œˆMñ ÿÝ@lN㯻:ä]Ær¯f±±öԛ´±ÖØDl¸¦rM‰h„m[©§N$6uŒú*cz‡…’æ ‰-mh?'[X± Ä措8[ØŒÍÐâ«x­@l.E•Ñ™8l‰AÇ9qØ<{&ž‡Ø˜J?66ÌþÉæÕÓÅpÆaÓ"pŊÆوá°¹î†qØ<¸F¬‡Íµ¹+ÃƓ—(Ò<ìi؀؋ÙDlü„‚6ºf*tî ¶æ —07¬1Æ{±¬Dìi"6W…˜ˆïîÎÄfz|,Hl‚(p$6“šÕåˆSÿI3ߕ€b3«É·IPl&&•Ø ØåßcB±Y T@±¹ ×Î[Šë»O*öìKTlFÀžçz£b§ªž¦b3Å AÅæ×⃵k‘âðIņ·0©ØŒ™±ÓÅFÅfĉíÕ‹M‹&:a±i(bÅbó1¨ÓÙ|ߍ¯ÅF\A…®›8±æŽŒ*ÿAª˜¥ôÅÆ ¨¯nÃbS‹B Up±álºù‡¹Ø Äí²q±aæ>¹Ø´ða›µ_\¹Ø<"EÁÅf8Fé#®ÕµM;›¾0ÓæÁÅ&›=ƒ‹Í †j®\ìi.6ç@¶ .6oû/l\l˜ÝyÇ (X¤õ -.6·¡†kãbÓÌg\l¡ï2ÁØTDö7,6už¬@,64Gk’‹ÍÜPu§–ÉÅfŒœ¬‚àb³ªy¬¸kx·Ú ®\ìaIZ³¹R RÓ°A±§ÕÜ/ô?Š®å|'?¬þëÞ÷ãú´#±OÞåò)‰Øxؤh%»{8ÚyØÝá—Äaw‡¦“†ýØ×Øa؏£ ´v‘ÿDa?ñn$ìG½–Ý„/N öã⚃ýDÂÈl¾/W -6Ô.ʏ¬ì`'4ŽuÁ•®ómlÝ4)¨ã™ük&³Æù†¿®=’y¦_Ã0Ü%WÃcW߁~M¬8VAb_£× jyŽ#ÖÒ+úõtø‚|,ª$_ŸÑ(|_Cþ…€t`¯©~nç¤^U5väõy…ßiâõœxÍ×ñ¼ñ®Ï¸îE ^îú4þd£]ÃH5`×g(v´ûzo¬kԍ:I×HohaàW 7쬳q®Û0Y=0× ŽsR®{(S7È5RGmLÄ5$3¤ëáº[¸®»É·Æ~ ÄÞfüo£[_w#Eµ«ù¼j41:9#%®úŒþA«ݏ£AÀªÖ¾±ªQa§:L—$–¢›T]»?ß T]CEœê -ŠÀTÃùè÷¤ºÚIH5 âŠQ]£oꆨ~yZœ&¡ºÅûe@õÅìO}qœ\ðÔ,éRÿryEIÉcQo¦é.”þm–[b8%ñ8ÐÔZ‘‰¼¡©ó²åS’©›[¡%˜úv«K}9ѐXêây;¨Ô–ÐîPj•¢ØŠIMbÂëS"©ReމÔ@´°qF©/G±ù7µõ[É¢¾£û„QÔ5ªïvu7°'IÔÖX&ˆšÉ‡jFf¢\·'­„Pãý(®ä›jÔÆMD¼Ü^Âè£áˆ¨åÐ$PŸv¯@]ÃOþ4 û ÞNü4êÿºJQéQa=Ä×3ÙÓݽAßØӖ¯zúbÈ¡Lò´–d­¾‘§¥q¹ÏIžF˜öb„ OSŸz„%µZÔ\ƌÃÀ¢þ‰žþè²ûe†æ;Ö䁞nÎò%y:@q ž¾jè„Wî4bs; vˆ:N›:}EYìA„žL0§QÖÈino1HWˆ œF -˜â®àM#q݊¦ŠçŠÒcÇë!ƒåˆjŠ4šWG¢1YÓO‰¬·ŒÄù¶s’¦GQDbMÃÊ6@Ó0ˆµë ˜»¬@ß0ÓÃPœ¤L£â×h˜ôÓ»-˜4{Ñ_×K€L¥Ï’†Ì4Ô?†¯ì éĕG:Q˜‘~üõîi”ow.ÊBV¢%C†êˆýDHˆðA­#xѕǑ۸ñ£ÇÚ:_ aݽOz4²=LmlðhÒªÛÌFê­z££/bwrô#¾]r£‡Wg‰f!åuîÔhòÂÙ6ÏÐhœ }ƒ=N ’wfô0”%‘Ñ#*ƒ‚½h£ŸÈ/úq’,áÐ1<ì´h(yÙ 3hÑ ·‘ - è;úTn¬hH - +ëcESc7N4òXŒo¿Y1eJô}D±ù -‰F~,*ÎÅ©<  D4Rm,ÀÞÑÝáõ$D÷(» Dt6Fô´Ý͒JB1VȌ:mˆht;PeV(ô -0&GÅæÂÅ ^×å›É¤NµO>4VTj\¸â¡±,ƒ—xh¬ÞToå³fÙǾ¬"I64¨NjZl44%eLåO4t·Ú+ÉÐ\æ¹øõà„Ì:k?å6ôãJ™\èX'š‹ç~¿a¡±Ð& îy«E0ºYiº3¡ÁíŠsçY¹DB¿»FŸ¿¹óõ¿/úk¤çŸ=~ûôÿùO¿[Ãýæ·ü¿¿üÿþúý̗ß|ÿËÿ÷‡ÿî_¸ŽOÿø/~øË¿þÊnÿׯüåŸÿðÛïøéwË…á¯×öçvûW¿~ýÒ¿ýõ¯~÷Wñ?w^þÛþÿ_ÿðû×iýõßü<{9›×ùÿú‡¿YOæg7ÿòÃúÝ/_wöÿþío~úÝÜú_ýæ¿~Ø8*Oþ§×ùÏ~øõþ«ßým/ô/~óû¿ùÙ'û§¯¿þÉ??ù§?ýÊ»ÓpÁðË?ûÍOþzû~÷z¿ûÎöúÃ~óò/¿ø“?û¯ü·GÿöOûßþæ¯òXÿèÏ~øý'ÿõ©ü¿8>ý“_üÉñéßýþòßð+öûøôÿ¼þ뿼l¿ÿÔ>ý‹Oÿá?Ÿ~õÚãßýÅ/þä»{`èÇÿü8ÿ:Üöö M‡ ÞþÚéËv¬×_?á‡ÿåë^#3qڄVýV»(S¸á¥ÌôZ^¾Öxø×Þia„ 8.9V€7LÔْÌSV;Œ€d/# -0^«†ÝˆEÃőn³c(½_¿±–nÔkxÛÎ!Œ:Váp÷‹Â_Ûa§q?‡Å>Oxv¹´÷áu„ÿ„›|£€v¯u?<;6ñÁôL8üËzP5òZpŸ×Iրÿ…Û[ŽOÿâñ8o %+¾Ç4×j‡Ñ5m/#eýç›Ñ’ -]ßboBs쇅7özös°ñûùªmçö×¼îø§þrCüˆ*¤Qÿ\í>V/„òz/oFÈ òÁ.väñjÿ´–tŽóÓ~6~ÿ3疧ýoôz£ÛÓª‘vC9¯¥þ8Àl;ZÃË|±Õ.jyï§á¥>5ˆx̨nûý~‡¡Àªb;âu×v‹q»ºi_nÅ<ìrÓæ9ìwLr½o\…Öß\ߞò´/¯Dv}y>܇ÿõ1ã;žÎ-nü~{qîýxös8œ9ÚÎv1n—6íË}˜‡]îØ<‡ýöâGà”ïé­o/ð4¾=âi_އ<ìúæ|¸ßì¾ÔÔó}d«â¯öï4ð t¶l‹qÙûٖÃΑm9‡mdÏ -±o|C@ò~ØiÜÏaڗž‡].íÃ}ø>FQÌ3í(næ™ã|;¦”ÆOfùÅŸÞbŸ×²v^õrÛ-ÂÄx#ò¹m šVyÛa§q?‡i_Nxv¹´÷!oѼ{û´>÷2­Ïc™Öã6­/ö9­/‡ÓúrÛ´>÷ºq¾ëa§q?‡i_Nxv¹´÷á+oÑ~‹æã^Ž3_Œåãvz‹}^ËrØyÕË9l·h>îuã|1ÖÃNã~Ó¾œð<ìriîÃ÷Ýñî냻öÍ!;ç~óa*ë,ïî -fPdv/èQó©ÝU°ñÝ]Y7žÈ<ì4îç°Øç ÏÃ.—öñ>|“ÉtÎÑûíNÅrÓýXÎv1n—¶ø0ó>,.мc‹Ÿ°ÝÞÅ©X6žîÇòÔÒøöˆ§}yò°ë›óá>|«ÉtNÓûž~ÅrÓYNx1nW·¸1óV,^мi‹«°ÝáůX6žÈòàÒøö”§}y%ò°ëËóá>|“x~ø–îóãøöí“?Ý/w7)ßÇ ´÷:î}|¨Öïߦïãúñüäça§q?‡Å>Oxv¹´÷áÛ/gö;<¿åå4æW¿œðbÜ®n:æ­XFžyӖÏs»ÃË·¼l<¿úåÁ¥ñí)OûòJäaחçÃ}øÆ˙ýöÎy9‡ùÉ/g»·K[ƍy–agÞ±åÛÜnïò!/ÏO~yji|{ÄÓ¾¼yØõÍùp¦€€ñѓ<­Ú| _ ®Ø¼ŽÅ¸¹(‹}ú3Ëa§ç³œÃæ&}<·iù¸‚â¡Ï·OBkém/ÆÍ5_ìӏ_;=þóãâiûeç¿v¨÷OúÕèý[€Ïoö |/±^¼x?gÝ¿|<â þ_SžlÈéëí׋5gšª £íž<€$õ2¾\oFŒÂíZfÙ ¸Û§í° %<õÓvaœ3͸﷍­‚ß;û9,öyÂó°Ë¥}¼ßr¦Áïw¸E²†€Þ×~‹q»ºi_nÅ<ìrÓæ9ìwXîM}Û¸J¥·?¸4¾=åi_^‰<ìúò|¸ßj¦a¡Ëûí=\š´¯ò|{ãviӾ܇yØåŽÍsØooañþ¶±UûSKãÛ#žöå}Èîo·ûð-gмx=Çò€ÌrÚ¿ÓÐ\ïÃþy¿q¬{ œÙÞTb³ö”t?‡3éãßéG.6–\7¾%Þ;û9LûrÂó°Ë¥}¸[Èã’½Ý"ο×Ûq8Õö²ÿâbÜNo±ÏkY;¯z9‡íÁaxžñ¶±+ëöÃNã~Ó¾œð<ìriî÷YÏç{2WBÓd7a{u¡Ø[ß_uã|ÖÃNãõáÍ}™Ò7šk®'¦ip>¿å§ç½ÛÏsÞèuã|$ëa§ñúðúäy~Ë!~ñ}@ûv§x!£½}Õï·5nÑ~Ø=êsøÕS}‹ê®‡Æý¦}9áyØåÒ>܇¯ û-šO~9Î|HË/.Æíôû¼–å°{ Ôçð!ªê-ÚÞoÑbÜÏaڗž‡].íÃ}ø&=åóãíE:™ ±õxÆ{¾íbÜ.m±Ïû°vO®û>$×÷sےëwϼBN8~©«Ýgҟkuã6D/ö9ž/‡#ÿrÛ4ññܾÕp1]ëpߗaßV t"®˜F;‘ïK y½ìöÊÅþñîÞÛø¾ÄX7ž«†yØiÜÏa±Ïž‡].íã}øfÁnùÕûí åæ’a9ÛŸ]Ú²î˜÷aY¶Ì;¶øöÛí]ËÆsÉ°<µ4¾=âi_އ<ìúæ|¸ß0Øm×z¿Ãs-°œÆ\5,'¼·«[–óV,+—yÓ÷~»ÃËZ`Ùx®–—Æ·§<íË+‘‡]_ž÷á›»{„ÿž»ôãCØ·Ož¡·ú6>0Nw=Æ6^yÎ}|`øïíˤé}l˜Ώ}p÷__ìóTçA—‹úx¾}ða¿·ó+^Nc~ïË /Æíê–Acފẻ[¶|–˽]¾àÜp~éËÃJãۓöå5ȃ®/̇;ðÃûïró3_Îv1n—¶Œó>,CMܯåk\nìòáæ†ó_žTßë´/ï@t}[>܁ïÿž±×ýÓOùã¿út¿Ç]ÿn¡×v°§q«Ÿô_G%‡û»sÜ,tYí_Þìè*¬í—·ãüœ}9ÎO>Ïo#ÎÝNHŠ1–‹@.Œö -4€¯_”ñµ\Æë—ŒuHŸãýhÞ¸ÏÇÛ¿øEëËúú©ÊƒÏþÄÉ ãs©²?ØYÆ~¢¼¿ûzÝl¼ÎÃ'Ӟ3O†u·þÑÒ_Ÿ˜¨Ó5¢bKÆr>‡×³á@¥Îá9âÚz]ê†0!£ZÚz;^pß»zzÓ×YÝ>ƒjÓkIà”ºìÏZÝ<[ŸÔÆvõ¸,ßøK…s¹èåí+hyÀ—Òæ=x{Ÿã= ¡Bæ` ›ãö#ƒìu¿mï~Ö$“ŃÓ` CÄþ=-ûAó÷@Û.ñ8Ž×Zÿ‡¢;¿Ÿîïk#–Èü’Æx¦µiìOÜØï;7ö¦ “µÊPç×Î`žšÃòY¿ÑïvÆÉ¡²ÎV´³²é¼J_ߋoÚEüʧv -Ú){×MŠÊ8QùúÕ3øÛ<©«=¾ÈR<ÜÈÞÏxVµu?™æü¹þüÇu³ß©·÷õ²å˜ÈvŽþX/T٘#»=ÃÈ~ޒܯÏy| ²ƒ‡}bc-ÙøÄ·¾Ž°ÇÀsŽÆçØ2õ«W1ï*Š£J¼5Жþ˜öãêa/#î*>çîG9Š>:QÂä~LûY†íMCŒ(^õSÓ=lXâG†ˆM<ÊÕþ â>ŽP›×<ì~>=Jç…FG‡Ã:¶7 Œ …1Þù×(àïn\' mx&—ŸÎÕ°¤´ñðÓa5ããé™ùk¿˜È`Ÿ?³´x`RÍö[ciWÀû£±^añz„º7®heaã?ǯé«ç÷ -ˆÄ' 6÷ü1쯯ËÍQ÷'í@ðõkÕÆK?Iq?l¿b?øZÒXPæºLL_;‡õëc[ ¤˜Nó뛣è審¦töA ˆ‘œãmŽÃµ¶œ Ž˜ Ê3îØ8'ˆ·XoÝۅÿø5;ÆÛƗ;üïóþCg#{ Ú²3:@ü|#æÇ×}~öþë Á´®15sú1íåöûpz¸êžë×캏3Œ÷nÀÑㅧ½ž±ñÝbãçŠÃ6}§Ïaú.·´Bž#Ît¬sj1w’ð%ìO/>ÔkÆñÆŸ ià_=ò¼'˜ºlÿcØífp |tE/ã•c Ah¼Î<øuç=b\yz¹qÍñö™ÆRcÄöÐêŸÃ¨é#ŸgœC‹¯ã'ðÕ«˜ˆ&Zǽüâi?æ÷º'2ö -—6Þq+Æùävõrµ½öظ¦«W6¹Ù¦ÛÿÕSû’S -:æöwèüör¯eègÚxžþÖ0jhAŸ¹’¯*ì5<)–èÈØ<{ûv×O_=‡Ý©Œ_¤ÏžãכÓU´±Þ«÷÷s‰íg,h‰{±Ñ¾Ž0®?äTÞqáìóÆn§ƒÄ§¯^ÅúYÐyÕt:D’ýi=ìXó} »]؟|Uûaä«GÎ=/ðÐ|EO}âU 9WŪ_Ò~´{y@>ˆãÑ?}õÈóJ/ðѾr¥ ¬u¯Žµr“1öA•$N’ŒÇúz—ûòû3êGx}V±qËÏ®ñ2SñùgÎmý@ˆÛô띳ÍÛk¯Ùæã·ðïÿÀÆۑÿ ­ãðÏx¨Š&Øûù1ìõÒÜ -ûÃ/Ÿ´ø¼0'/ãÙïŸëÂÅ6ؾãyµq¹kޚ<ÂQÿVé9"¡Ofç€Ù=QÉxõâÇðr—«„AÊØòŽÃÞ"Vò€ÿfc‰#ðí±ñŠuÀqÏ#Ì/­ƒ=¢{zÕXl>㈪% û9~wº.W‹ÁˆA"Ÿ«~ýQå¨g××®A6oYçÏÇÎåXÈ9ì@~ÃX´T¤Wñú#T„‡ôŠÖ›-ão6F`ëh1nZ¡Âø̽Ä4´7> /aïOœ/'Q¢w¿Á¯Ùö£ñºjGöʈñ¿çuöӗKKÆRâÊê5÷ݦx01ùAä4ˆvCey½.YÎ`ä2¾·ym-?zR¾cϙSÁãkÍ4–-óÈõˆõO¹52á2Z¼£Ïð£³Q„óFÌ<´/ïèá«C$÷‰©Õ7-¡bØ%fI@²·½x‰ÔÉ>¯óÑíiðrK|;gó¯uSNäW÷Ưo=žÅ­ Àœ×ôó)Üû:ðò4bJx¼ çöW‹{c1˜©Wl|ڕX/^qÆ£4óÌA¤µæM{“ 'ã_ºrË.œ­[t'ñzêö6vpŠXO{ÂøúÊÊbÌ#G> ×ÅŵÌÙ|ðÁC>rõâwµõå*.¨'|ä¾|½j"Eº·‚‘Bo9_‡a¿^wë¾ã…×›†fwù(4·–Ÿ&ü„|}ѺoÜé×=O\[)aúèÛ Ÿàa–fãü´Æý,Gnw~Zq#~î°Gޅ»?ËÚö«ŸÞxæ ¸(ñ–£Çduž}aF -c™ÛrՅ·21óåÜXæ—á™Ò'üºï_Â~–¬™Î“±^q+JyŠ’É’_ rs:ó‹9"bǫ֔`n‹Ó;½|!Œ<2Om· šoÏC>çËx »§Çá0€lOøä­æ};AŠ«“‰Æz–ôå -ÉkO„J¾ÙÀ…]gØQt%cÍq\qkçÈq½ÖPóák` íu:ŸwÉY3bÚ¯t5G+mqVƉm5\¤¢°ñK<Á»*r¦®1ñ")û9ŽPî|²C£&Ú æl©Ð GLÇoøÉÖºñÖ!2ú%ìs”Õ -›qp”¯Ü?÷šÿÃ8Ô)CGˆä5ÔØ?‡µ¸]Ì3¯3«9®`ÿ̞Kã -6¾b9ß{%ϕaÎàÉÏ#ôǓ^¥¦ª“½3â°(Âñm¾kåå]Ä݁÷Õý*—8·b¢™ã2*ø‹ûžW‡š¿˜ÚÆñÄŽb¯sBz¡­÷47ŠpQ +è=éh“‡ÝïAn›¯›üÃَ×r–[Þî]À³²Ç¦DNŸ° -7†Q¨kv˜¦¾„½ä͌ùÆú:BHåHpäˆ,óëˆ3(Ï §²óOÞ´£Æ2Nrõ–Æ–ƒØ™‹’cu­4)•‘ñtûa» Ù]QäºífÐ^FNL§ÄcèPvé{Œ0NùÙÓzd Øñ6œ& ¨Ç#¥jhF’AâV2ߌ/+ˆÏÙ½qo=C"áˊµ´Ëæ²Ã'|KÄ:=Z3fÅ4NëV258Ul'揜ìf£o;ñ”åÜj~ž‘r}YKmDŠý¾·XBæãûˆ!õ5¶Fòþÿƒ½7[rãHEçYfú˜]Ó5in˜±åÒ²~`E6§K"ÉVkNŸ¶2ÅBÔÁBŠú™y™o8Oó¦:sÃ=Â="Ä’àR@1{aŽHϏ߃8²³%¸–‚…{Ziîu»«©Ã ȑ´ª‚<ú†‡–&êCPËxŽR-Li¥¹½Â“EÁ„1˜ØЖܘ-Nh¯phƒŒšA´c@Þ rL%Y&•ò‘ PʟTp Šcðñ -8.L -g+āKfXh4÷î¬Tl;ö±pù*Ç5jìˆ1mä>’’ƒ-±Æ;›Úi¿Ä®Eh¬u‹ßŒ¢~┠µ -uۉ>:ÄiYxÂÆ:m8t0ã=.ò”€&ÀIΣ†ð RіwNð a²ÃùJš¨uÁ¥ÆÓNò §ù–ŠB·XÄB8)$>€€x Æ)}lZù$<<‹á«@Ë3~¦Æ$¿&N–q@åÍ_öu`ìt@¼Eε4&¯Ã»ÝA‚r@ɚƒò!rВM‘Ql ÜüÁÖ±˜D†2ˆ*6E°åÃÁS -tNä3I%Š|¤)­TÀ ehù<'¸ìH…w8`ÆA "%&šòdÀ½,æh¨nï_æe½ÄO\K5 -= ýÝÁ™] áÆÀ`µ4îLƒË‚3Èßuàà!ܵÌáµDG bA f0ŸyNÑVȓ|Œ\î¬çŽÚ±ü.çeɋ¤!„s¡ö½yæʟûq¹YÏíù@{*a®˜§§MSæÐÚI¥у Ҝ–ž0 xw@ѝñ -A- Õ¾q8têG–FOì1ŠIɜˆ@©IK’skØ8+/;¸É„Í‘HFŽæÕl0%f w[0cÆ`6‚ѐx­ -|$±”€ÙPcÍlU¦ ¶èlñdät–C ߋwV¤(ù4ã¡Ai…(i–{_¢§£ãnВ}Ü:Äì牓Š\o Ma¢çH|¿½é×.Ç隶Y‘é($7÷”`)tçiˆôÅ yAh#έDԳ܏-Äâcc¢‚H$5K˲‚A³&-ü™'îÒτƒ*È؇QíŒ!1¥"cP”Q`´Ïh(X·½•’Ãg -WOÛÑ®9'x¦ˆÓ»¸+šŒd?ËV¥*ÏG|Vc®:TÁ CH`H-æÄñÇEä;ÃÐL¸Ä ÆçšÂÙ1†ÅcÈÙ±i>8¨pÚª:‘ ƒŠv´(# -†”b,”ä׊$U©5Åag¬UáJe YJ²ŸÌ3b\^ãËsWÈÛCiÁ錇´Ï ±r{ðõ -ܟAyJ¹©«ìâ§ÁÍåãïáŽê6%LÐۑa‡P©,òɨ‚û Ҝ9»'Í\wÜ1ñI–A±Ár¬@O]©3+bäÞ3¬h<#6Êa¦±C–6‚jvérP…æ܀ÜñPhœIæâ)Ùq¢|n†ƒ—+4 k“"ó¹pÿŸ»’ãÈ3Ùú…r -Ü7”S|*څN0è,÷G/"Ã@ùœÓ~R -[+TA ΢çÆ,v ¯eÊ݂æ$wJAh¯V´m«!¿…bá(•Ü˜9˜ á{i0¤…H>$'o(Š¾-¼l”ÉÀÜ K™tNÏ. åšäœkålP‚c - ܹö)þƒ”ÐÚ½IœçQì²f‰Ÿó]‚GRiOȋ$楣.én–õguBù^áè"15‘+ovòÀpDÌ®ˆ²òЖèD!9A.˜oÐoã1pø¶•Ñ£¾ Cæ dI¾Ãl|Ò00 Bx&†ÄÛzÀM®ù8Á›ë|ßTQ?Í~íHZ§xhDk‡Ž/Œ‘äl%™—ÖØ`i'”æ<'hXn,¿„sb–èâõn)E*`äi‘Q\i&”ïƒNãÈTr™%îú&”$b.P›Éâw³¦Q˜h̹¤¨à-\ès””-9áGÉÌG¦4æD{Òsø5¬9ӂ³ÿ¢˜YíÜ;:®ï›a»tâ\K®1…`%.A͵$Ûf✚g„ªG>˜ÉÏ Ø:‚‡”J*3.¬Ù“ÈÇÿZ9=£7ª•Å†©ñ)=™á ¯Ä]¸êÑf”T€7ñ…ã ¥UÈ9K);4‚ÆŸ¥ÎˆåèҊàBIï§K\P‰?Ô2ÅCNHq -è²N# ѯðó§-琰À~%âhâ£YzYn’ôº‚s{”Ñ„Az'zk2(KPßÈö…" - -!al]ʙ¤õ£)g9ç8ŽÄ…%{‘/§ìQ$cÈ9à ע“î҄£‹Í‹¾)í:4g‘8„é}Xå OfV³°]P–=2é&#ngL$ð§šv®ðVhP¼Ï -ºá2²A5}0I¬­ÉQ$!3ñÁrNCÑ´~„¤§%LLö6zE‰–0ôñœT8Ñ×JD–’²à(A4dÙzx&xÍÒ÷ËËüœæ²ÂT„Ap’O–ëŒÄvÎ(é.dS£šÛg ‚ôs¼É0¥C%¥>ÈBJF÷Ó)1ìœà*!^ŠAĄ™9Ho¾%s Ç˜«¢Ò‹£¹¤œ.\lÜ7í}4 äZ™€ -h%w,<:æü±yHrÜy‚\´Ò,“”[›Öèá‚T­Ä珅ƈ֝—˜3Z‘‡YöÞÄGáaã"¤Î†Ï]¤<:Æ uï\ôŠñ¶1ò.P,؃$Õ¼C½áF‘KÓÌ aHCNº0†¬ .‘xíL92ÏhÛJJEËOF–2 sËg.+Œ/(‘›RI’ñæR†€‚ZFf&]“®ªi¶Ú&z04ãÎd¹f5Ü¿×8é¥J=΀ąY²ÙŒ‚«gý`ƒ^¨\ 3Å6ÁpH—ŠläÇô§¼Çœá3†; àk¦»áŠÄU\u`—,X¼Á8J†Òvke˜d²zt0„$·Â+Ř甐xƒ^ÆþÆ$ø<]Û4œ~Éd¤ÞaV²&3¬,ˆIvCîÔŸ|'Èêëc í§&‹}!¼ÎÛ ̅÷2¦¬qø‹ÏXAxFiô>+_Ç}ðò žá,öA$PÂüċàäSÎ%¤©úì|ßØ©(x˜°éà šÌ2,äO?Oáa(.£ @®6AY“1$ñ6=JÒqHz´$ï*VM¡U±ÊiŠ -NN\i—‘¸!.Hp–›0ãöœàFñ^ö1ÀIB–MÔ©\âX "8ó!(,å¼R²„ò†’8p³OÓȈ@ƒ%vLF»™BÖ±~ق­äI(v&q\ˆ1x.Š\1çß,å>Xqñß¹q‰ N ™ƒqÍ»–þ°N½{ß¿ÎPÌ7.ª”bš%{$tšQLs}ù,²& ‡qk!Khâ2HJc ÄUg‘9ƹä}c.oæ‹NaUsnÒ§’<ª|“K¿5²ÈËn2A1É …pŠ–¡¢b-×÷B³”|g×`’É(Æ]»Kdϊ0øå‡$(r_:¬ñŽ5¡ àc'eqQŽ‚rª`‡} -2èWds -dÂÜD‡Œ Xuw!z¾1=ágj¬ÙcƒæMŸÀ È҉ԂÔm•åœ!Üf÷+ØJ‚2=¢ï€>f瘫7Y_"0°u´¦lþÔ‡‡C¥WÉvJåí…OTˆl¢˜³‘0ûð Æàs,QKäüOÁžKã>ñC(ÞŠòLdN‚©ÆÎÀ§ eœ -I®ã€´ CžT6sºv×py4â}œ…~÷¸L¨"Nd‰t^Hˆ4vW°.!½K7x dþ&X&įQt,X&Ñz’^l‚–ÕÉÄܚ€A°z—{: ¤/¡¦è€¾x8çŠw³É ³0xt+]( {  “ÏJ©Ò§ê"¥º‚yÆtóPÞÄ`H “¾hkO9…Pp–V0Uö°ÀŒË²aâ´Ç %%é.,> ‰© ­Ï@%œ—µùæÔY¦1“Ô’Â’”+ þy1D,upNð Æà$œ`RªwÝ:ÙVz ÷Бä1Š Ê'QWgÏ$¡ g§gª4$"¼àÔZÃKêžHCqHG>&¥‰¶,ºòýèRgavkÈpÚoÊJ¿+å‰ÙÄR°* 3—EfKª°#3Ê0wë•3š%W«LBZ+g:C4çxJÐl³bia¤%/”„òÀEP¢4þ$2'¨Äí%‰ÈÔ7㫎)ö*šÂí?ë3¼0Ü8'íÚY)\!¶s`àcÈò‚;ì_§8G3èt>b\?œéêÄ{ƒ -MBƒ¤BÊÕ¨ôÛ@Ðë|øŽŽ‹ï@ ‡0ъ9…Ò‘‚JbAí -˜©¯‘–Fµ81ÇcN#c$ .Poà/sFåhSòŽ88ób }ô}Ë\„º‹rzž‚üwšf_ Ì59/Aލ¶©'‚U’øm{É -åÈB5’P\Û§Ž+ÞɔÄ„cÏwCYä¡´ÿ½D¬@Ž–aò\¡ËæsòÛ`ø‘à ðŒËj*'çАLû:l: „ ó4BCu_å{ Eä¾æ˜T¶g#|Q,†NFђ -)ã>ð=”çKÚ‘Ç £“ {ž<ìò£ k¶¾: t ÞP#‡«ñ&ÆÉtdµ˜ -XŒ[î ÍÛÓ6&k”‹EPªÀúXhØS‹oâç5/S,¢Õ â*˾(öEÝͳ,ÖÚÅ´uS"N¨¿ ŠXdøÖ,¥"¢³Tn¦0»„E҉© tN'ˆ§M±|Fм]cÉù[ —c…b’¡4ì3£š4^øpJ!ú"#'•}¢š›nœÁ÷³á¥¸®?I±ì‘¹¯2’Š¨¢Zž²i±¨ŒS¤?`î Wå-–á×äÁÂò‘©Ä\¢»$¡N/£…@\:U°îEi~®±/š -¾)”eÆ$:ʜ+Rvy¦`Ie´0gáœà1Kœ},Ã%SÑOhŠ¯æ¬‰¤>ªÞ_Ó¢ -—úJÃ`€¹Ê¡Äzl)G ¥,¸¸×›Ñÿj>²­ U -Aû¡r…Œ\¥„Vqλò½ìMy`™÷ãÁU批d -ëƒÍï¨!R¢=&~z®ÂÉÎÆÊ4îIáB\$›Üùêݐ§QY`(]† gÄÙ -Ï+¤OÉG`T·ÔÛ è ¶IW‚"ðҔ 0z/ °nMùÎñs[ÂZ 'B -÷'Ð\ß´àš¬$VPQNq´v¢j‹n$].דkêœË…f: y?£MÓC½rtb"´Äé12öÛó²pç€[‘xÔQi-‘1ïxJç¹ÅgL\ã×øé1QÙTìcÙ£¹d Škûd^¶@É%Ý°Úc‰XLãÂaÚ©›F;ñÛï+–Žªa±bßXP5F᫇Aø”kšPÞ_Ê&C ñ•ÒóÿŽ•éE牽ik8Poêà¬YÅÀ\֋H¯ )ï#R)Œ·žÄ*Xêkz÷2j’•#´K£8£¢ÿ¨yÒJĄÆ‚gœí­© -°¡h"¦¤*£¯2´Œ4ó„2¤=ÏÄÆTMGJÁhÓäíZŒ˜ -æ;ƉÅJg„aia€™[N/„“‚g°(ÈÐK¾²È¥8; Û±xþÙ*W._—°iRÖÕ°_P®#µŒû\B¡jÒÄɆ@’WS)Uƒ\}Ç0Á:ï‰þõ¯pÓæ#VѪ -ì Ã9|9÷òÙ<ìã*¨+!GAù wèxK9¾Ž"Ÿ(˜iƒú(Y´#ÿ*Ѭg¬S®S‚eà™ä×±î¥Ã(Vy¾pp)%eÛՐŠ8ÃHƒk–sN%ëRjòJBY± ô©”µé3Wd?QS½ ðºÒÔitƒ ʧçkðœG—.ÕôàKUÁ»Ý‡$Vjz`m~äº÷*áXf„S1IÉnItù)g¯ÔÕák—ŠQ𵂆Up@½…‡ŠjT^ €\@Qiˆº2þ¥`Kâôq:Nœ+°)ºµ4c՗8Ýƺ¡H£òaõˆ‹3Ä@®/!DœšZíÛy|VµÚ_£E©Ú7½DsŽC—׉ÎÒÔgBŒ,×µp6(½Ë5F®×·ZñÏwo¥j× Á3)¥ì‚²_`v.åj$HŽfœÌ eÜ¢„—q¡ ž©íÁY|í‘ß„ÒEG·QEK2lTÓE)j_Ò%¾¦€¦Qӓ5×#Õö,L¸Œ -èJ¨ -ÃÒ&|½…;‘]Ò ——¦ßµ-R*’%}¶u!#Q–Š®¬ö l"”é¸~ àû<ÇÒ -endstream endobj 31 0 obj <>stream -¬æ…ª|¯‚¡mÒj7TCD¥Hø2‹º7Æ·9/=:ÃU—Qw áj÷ÀŒ…-ª¬R×~i(ŽuÉ·¾4cåœo\DŒ/3\Á{]O–ê .‹ø’RVÑ°ìY¸¤ÔPÉ.d¨„„X¿¦Û¬W0‡—jW¥Êý”òí¾™v– Ïù&Ɯµ[w3€CÎ#âÚµ»ªyѵÆY|=»‡ª®o¡Û©ÛîÜMB· ¹Æèàç …â`ʽ‡:l<óõ%ƒfƒ{"¢ò -*$ ÒM¶†kž%¡ÓJßâÃ) !tZÉp8ùpqvúÆÁm¨¤QKÃJ4|´deêBm#Í -ºØn¥AòÊÐlþ¼a¸`Ožr¢¤ívˆy””Í*9†z½Š8¼³paµî¬Lùîk¬ XðÞTQÚgΕr$Ý9S‡'°Ú$Š‘0aXP*ÑéÑOLTj1 Îp¾Ïyt_cg±L(ßGr9ƕŒVÁé.èFLpøÁW_‹™Ï=Í8žÌð ¾0j(ȑœêÊ~àÔ;w„rÅÓ+R¸oÚþLDËI­¾ öj‚¬#ÏfeÝ<ÜӌIuô®ÈŐêó5xÙ­VUt¾ý®óËßV>óði~ñÃxp:]Ì®Ÿ÷æór:F¨èÅO“ñóép<Ž_Ÿœxøiùz8Žùú«Ÿnñ7‘¸_þüäñpdQ}ýÕþÜù£ýöˏç?M%~~4ìχ“qoú~ËOßw¾ýõf4¶?žØN‡—‹y9û®óÛðátÚ[nÓ¿ŽÓrŒ-dçÁÓñ<üÿÌßߖøã·B'ß|×yð×ñ°oá/-îñëjÛ·½ÑÂ7~7̯7·÷n\cÛßüÇ0´ërøúz¾ûبý] îD6ÜûÝÇõþH†ôëîCúõî†ôðéÅÃË×åը׿ž—éçåÃùËþ5°™ñ…Øy¸Ãmºm Ðè» çÐØÐËÉbÚ/Žn¯{»Ód¼ûŽïn\Žӝ5-g‹Q>Díïjpzç‘ÍæƒGåÛaºµûøªOí¸º× ElJýþŠpU>é-f³ao|ºuF£!lž™Ÿ´A>;¸CFÛ`D ÃÁž†¸Æ±°ÂÉÕÕ¬œoß>‡!Þ%«x†#=f&1´žþd4™þñÝõp^6`öïG[ZW¹<6¿3M!Ù}`·e1êMøõv2.Ç æê“w6ÜÆ£=›ŒgóÞ>£ OÞÕhÍî£]L¯zýòe¿×híVžj‹8(XDÏ[VÝç;+CŸˆÄþç¾YL“1‡àD6š¨ßvÔow.è<Ÿ ÇóóFƳ?|ºÞ¼ôÇι^ŽYÛÏ&"›°vyw{bÛ jr[N{óÉî*wôı]í‘|PêÛÙäæv2Ûªñ6Ù]ÎӀk¼¹C¦±ûúfËà+#G1¢-6®Êˆô1h—oTƒ©ãáyÇs÷¦ÃùõM9öïõaì$©'ÓÞíuƒ‘ˑ<Ο÷†ÛŒ3홼όڑ¾‡}e|—³üc9}]]Yòj¼%¿„Iú¤9€Ž`Œ×Îýxð¨¼ê|ÿõ¡‡‡%÷7<¬ÉЎ-<ìÞ‡ÝËÐ00í}¢ °»‘N.ÿYö秓Åx`ûx:Ù2+ÌÓ¶ÏvŸ½ÊC;žˆ‡Æ`ç‹éåbTŽû»ûÖÝû‰_u'ÃO^·óþ–S¡8Í_ Geƒ…PyèÎ8T7ÙÝÕ|ٛ•§åÿ^ؙoÀ€—»«¡n1oDã/nžõç½·Mf3~æ®FÛò¾ëÓ¯vd=‡­j5š©ã±ÌÝs÷Øg³ÈÁªUN[å´UN[åô0”ÓÝãê[åôþ)§WӞÄG?M†³V==zõtwCÓqk§»ó¬V;mµÓš©V;mµÓV;ÝޏãÐN­ ý¨¼—ã‹-an_PšÿöÃEƒc™ÚßË G½ù‘-W×õ>|6«":h Þá:¸ßÕ_ÚÛ¾tIòИÈd‡ÒçGÈFÚKvQ{i§ªù4-ÍÊÁiì÷ñ_žp5šLþæ„ËQ¯ÿæûŽMn{ýáüý“n“³í˜.SÀAß;îßlTGºïÃ=æm7»î &ïÎîå -ü€c M,9ÏoCÞØ -(Ê(ïEyðÁðêjÑ ±÷Xåîy®žÍo7ZyððÇêvNû*ÝÕ›ÝèUw$gò~zV{.Ô¹ü9îå=ŽµGòÎ3rh'ú7^Îw9Ûí]à÷u’>igŽyµ´Wî,îx¯Üùr.„mâs¬wîìç$;éq×»vŽ_~¼· -Ýô,ºÝ˙Óñ :‰ÿoÝ'†ì~¹*§‡Óƒ1ÚìÏ{— fþ˜ »²³»©ðsCËmå¡;fFãþ‹cæB÷wv³NÒù²Vâ“v%äJ_K<=„!ÔÏ DÈ«io<»jp[ÎîŽ}MZ‹ÏAX|ö‰IÞwëó$þÖì³aÊ0|òáht(“uhôÙsI·½ؙèȽ¼X¯ÉmfGv±ž¾Ïë5ܑ\¬gvÑÑÜ«÷—ßÿëzTžN›Äò·×êU‡z®Õkà‹?–¢jÝŽ³Þ`¸h0ãÔþ®Æ6Žz jZ£ÞyŸC;ï}°Ò“éíõd4y½ûÉ~€ªfƒ°‚–'¶<ñøƱpÂ{juO8áîÙLÇ -›±IÄ÷ý ƒk°îŽ”?X÷½/Ð óX˜ßTá i òw…ƒÝciµÀA1äXN¸ÏÝ}—'Üý¨gp¹¥à[¢?coÆÙuo<.G/ËQÙo¤3¯>yW£}¸»7jïÑ®>yW£Ý}µîÈ_9Óïøޟ²ØÑDÝÇcm÷x¤ÇÚ£áìvÔë—7åxþcïö˜Ï¶{\«çrw+ϱÛ¡ÄPg壨|ÜyèÇV¨‰0v, s÷…z¤ 󞔺Ü]Í>ŽÒ„IËvÚ}–Ž.iºÑî³¥LÚ.½š–åo»›£¯†Ûʗâ½FÇ0ÿWÓÉMƒQaë»Õîûu>i |NîPNÛ"PÅvçòuÆê›ßÕÀz£w½÷»ÎòËyoڌÁºîl-î>¸AƒJ®ñ] j÷à ÷á'Æ®]z쮆<ŽËÞî×D÷{£þ“)%Ñw5Äi‰FˆÝ't0·o›Ì%?qWcOÆ Øï/nÛ#Á*CŒž¹S%©7Þ4éù>UGîO­šþ=Œ\ÊÛÈ¥ƒW@¬»#µç´‘K;ÌÕÝZ¿ûmäÒQG.µ—³¬ôXc—š"ÇrƵ±KGqÎõÛØ¥6véxb—vWoŽ+v©‰4v4±K÷ñXkc—Žçl»Ç±Ký/ vI|q±KM„±ca˜mìÒq0Ëþý‹]jÂ$e;µ±KíuûÏÌ13æ;ô.'x¯"”‡6=MâYÛéùìÓóIK¾Ýì|ÒÎ@GîcׇO/ž-G³Ûa9ºhŽqÈ¢§I:fw=ÕÍí‹&ªjôÈ]±­¤Ù˜dÓòf²-ÀîHCχãAy5o­ _ÑPnËÞüQ“0Ù葻h»Íúå‘Ån‹Sw<ÁÛ;÷&r{v ±Ûmäv¹Ý(rûn8NG|/“Ž0öߤcÿÿ½ýlÿ~oØý·pcܝ·G¼ú¡Ik—[sGh¿Ïµ³MرÙdzÖ>~|,¤½àj7;Ž„Kö骷g‹-ìï>8çïÁµv»ÛEß4àoîmìn}³e𕉣і¨„ʈôê.»hKØReDêØDßc9Š{Óáüú¦œ73ŽñHÞëô:Æ£ùÞ'‰~ì³ùBûMxëÎÿÀÎ@Gî¿;¿a‚ñ!ÍZw~ëί!YëÎoÝùë׺ó[w~óQ}iîü¶[ëÎ?w>ŠàЗÉ÷ÍDÂօ œÖ…ç°Ö…-[þÁ°ÁðêjÑ ܱp‘Ý͍žg“±•øÇ öÛʃ‡?VÇ"^6+Syè®Æø¾&ïvèhøúznœô!}÷±.?wg²Øî¼t1½²âwÃ9­>uÇᱜñM9ê'öoځÓZ[«bkU¼3Qá^ÞðÐä´oM‹­i±5-މôþýëiYŽ¿·R_ù½=+‡¯'ß¿NFåüûi9ø~2퍷Å.´6Ç;—ßD¾»]¸÷Ûðf1ßR±¼²V遻Z¨éîƒ+Gö[3 VôÈ›¯ Ñfqç„ Ùþ Òtîò£Þ t÷Û²o9óô‡_oí)ÐÄö´úäI”»ïêtsSÛê“w'’l1€Þ##T“•ÜZ¡Ë -E;怲 Q·–¨ÖÕZ¢ZKTk‰j-Q­%ê ±Dy»“³Dy³¤ZKÔ±)Ú£íƋc \iík®ik_ûˆýyéÕÁû``»ß‰î÷¼æÌ>v‰Öærï³Û½ªÉ‘TžiPÕ¤­¨s¹ñÉulGr[®á™|ŒqÍ'»­÷9€ŽÜÓ -p/û×i9¾O×¹µµÑöԘÛ"GW¤b÷²m‘ŠƒÙm»ßt>Øý–zl{WË°ÁˆÞ7Ñû#áÇ -'WW³rÛgZšqû#UXžáˆ¿`må¦üKP[mº>›ëâèfªU0OÁ:ùfçEün8hûç›ßÕQ*Tƒ¡]—ç¸ý] îD˜Ý×@ »Cy®ÑHÝw(tÇæ›{T¾¿5ß´æ›/Å|“¶æ›ã“Ñó{g¾i0¢Ö|ӚoZóÍ1Lù—`8´éjÍ7­ùæþ˜o@Áœ[ÙqÖßb—iÕË{­^^M{ýyoôÓdØ +Â=¾+™øew2À~CóÉ®¼ú—ùxòr>œ7ظ3lþj8j’û_y讆štw/ìuٛ•§åÿ^”ã~Ufé±»iƒâtãÅÍ3»iß6™Íø™;ۊŸ4¬òйK[²lËܖ,;¸’e ¸ïÕtrÓ`±õݍk÷  æ“’ÎäîÆtï«°ÝË"l d–¶Û®ãlk°ÝÇlwgÛ£Ù§2‰½ZL/#Ë,î)µ-‹t”™žM *ÇeüÞ+²µ970qÜߐÁ&C;¶ÁC;Ž€Á:špÁŸËé»áô²-Ư/¶T~h}:›,KGïәï($©Gç‹r$_Šÿc÷8µcuÀ¶<oA«Ÿ¶úé=ÕOm³VCm5ÔVCm5ÔÚQµê§ÓPwk[ õþi¨÷>êð‹ÒQw¯sÜ*êîãlUÔVEmUÔVEmUÔ#TQ¿yøT$?Œ¬ª"Ìèâ§Éø¹Å‚gžxø)Ü¿ÿòõW?Ý:<ÚýøòýÍådd»tZ†åøª  ¾ÃhXþþåøJ=ŒæW£ßÿ³]>{kûüuÒyøõWIç—w_µ ÿýë(òàÏàÑIð¿¿¼‡oÿf?ýÓÂÞutçÇÎßÿ‘t_‹Î//à7Û£´›$‰.:'EçÆ~ƒ¿ç_u²nj2©à+ü¾¦Òàç´sfþžÁ6´‚?çáeø…šÃ×ð‘âƒçø—~‰^uÙ¶½‚ØÁçöÑø“uEbt†µm?äØUøëÆD¿œ„æ'¹{·ýë^àGit‡q¿žänP'¹ÿ=’{åŽ>§—0Ißþu +kÐy=íÁŒÏ;ê;œ«“æÍÍý{j§ç$Á&‰èœ‹QÊNd…ԝ¬ÐºóËM¥¥õ-SÓ9íïŠót7œ2Eœ8 §§v1þ¦-éfÑ"DBݸUUœ‚@f"ډ§Zô—ç)š½¥‰­þ íÂÃ~Ž=Všé¨QÇhš×͜Ü}æ,*™Tig€ÊjyæDQß2•+3·çén8eV9œ¸o¿ëüò7ïCË©’nZè&=Uv¥Ø?Raì“«TÀáÿ¿ôVypÙÍe.TGw¥V÷è |–)¬=ÿ#L1|.l÷ðG,‚>ڟ”@-£;Ç|saO°yõœþæâ[K…,7ªÈ#SÁééC |1™‡ß\¿ð=´ôš›ðƺŽÕ j¶‚nsoeW™Tz×Þþu*3ìI£žCµ éø‡_o'Óù+:$¿¹H:N'“QµÑ¸w9*Ÿ,†/|s!VQ½°G×l>ÅEu×t„¢à,„/ÊÞèǞίШ‚¨x9ö˗ýÞȎõÉt8øKù¾:B^Ÿc¨æ0†ä /Ô zóÅÍ †I`¸ý‹ò@׈Tg°IíRԅ‰?$™åŠ6t"Š´îƒÛÖI7_#Tˆ„¥ -·ßíÁëy}F’îҌÿf~X¤™Q©†—ÉTⶶƒ*ƒSDeҘޒºÓþ$óçœ Ž÷Ó_b VêùÚÀ»o¢ÎÀd'&üÝxL›ÍÌÞþœÖT¹lüX O€}˜5ML×̱œnÒTÙ9Žì&*|Ð~¬:ûž¢É†Þ&ÛǬ·9Ù:fUTǼp£çîƒ"ð±iäi†®ë‡Ž²C=± Õþ“Ӑ톨ü¢sçê#§õ¨¥©´?J?$éG”øqÐ_¹m8'¹Tãł„ª¶°vãÈ6|ÄU©+«2«þ MÍÐteQ.=Q3"é$ýx? -úûqפ^»Ëôº]¦×î²5#2~DƏˆæ…þ~Ì5¨·î1½né­{¬n|‰_‚Ò/3é×]þ~Äå'*Ó¥«?hY3*Q™­¥'V#ÝX¤JâFàÿ|ܕ'Öí$±n'‰u;©~(Æ Åé7?þÏÇ\rbí붐X»…ꆂ¬ìÿ -/aÐ_±º²ÄœP3/^¨Z =±2/Áà3n5·¶ýù¨Kli(zi(5»ei(zÛPŒŠ—uýdø?q‰}ê9‰m‘Ù3éR -‘cÇ@y…LP 98k§“o‚lÁ[,ˆ‰‚4@‹'ÛM8ÉødüWúö`ôò&Ð^:AOõÈ+F¨«ÜÔè*¤Ä¬›‚l‹ò±tˆ¬*(gn ­;(T×´5ywÕN¸ïŠ$´¯,Væò€TzÔæúG݅J?Ü&ïƵ -½7ó;½~ocÑ- -)ì¡ýft@'iW㇖w…I3ÝÉ»©1¸ |£”Zà í¼dª¨NàQ@Á@{®@;°Ha#`Ô׍0ÆFo,|#îÀšïû_D4Fï2íÎ6Z÷ìy%Y‘nµîUü?Mæ/Êþd:°<Á¯}T"ìŸT墛ªv›*’tu½ž=|úÄó‘WW“éû–©]σÉeyñðiqaûürþ~T^„·WW3¼ö—cSrslú”¶„c±4yX°S¤ ³ËÄ5ʺ)þÀ€ˆî ‹m£¸jûÁ¯<^ yXgiXëŒ -ž”n…j¿ -¨óå=^†Õ­E  -¡¥±¦¼ÂÂȖi´«ÅfÃ2ñç†À85x ºðÅ~P8(w„Ø/‡ZûTb_%’üµ=/§Weî§\½ag%M||¿kžeÁðú?Ÿ_][ôߔãeEm)Ë.$t½ -kÓi’åàõL³Ää°¼ò<•Y›s£§U·›“¢]¾Ëo„RYtU"0®%K”ÕÞe>[¦iùDšft@Bv•ÌEa vՃ8–({ÚÝ-*ûiWªÌáu€¼›e©v =)Œ}B‰n‘f.øÇ5Z…žs/ùU^u²Ü™“åÃ)S3®“xèø}™6'1åNbª³†ïÒöcìÛ!eu¿w?Ù¡¦™HØ4¨œ2¥g4@ÿQ ö{hÁ—ꛢN„ޝ¹å@ýŽÇô6X¸,Á3a8V8—*UNˆI´)è<€dÖ͓MU+O:&eBKÉMá了öø35€xŽÖAñùê»\°Yôú“ -€ 8ûDxùò÷*RK~Û[ ëŸÿ•f*ƒ§e¦v8 ØÜ·®Ñª Ìa!ò‚>ó²ßºFj-àœXýf¸KÅöðê3¶[–N¤w´%¿n¹íþçæí? Çoz‹«Ù»Þëzÿ˜»°;¬ƒ–,Á 9Îæ”H^Ê (†Åf×m¦„†¥‘[&ö}è_ Qh¥ËäVZbwW^ä’#“î -ŒÛ=Ã×;˜å-Iî”aÔ¡}Ÿ‘pƸïÒ~·ƾ[á#ȕ³Ø¹è<¥ÎHG0!3䢉Nû) ¶ö­:·lN´&[€ç½#ƒÐH¯ºi,Ÿ€'ÊØ£@܅B”@1Ü8.O0Û«:Àxì‘âñ¸—Ñwܸ±èÐŽBßqöܲ¬¸@Z$ðÁîÄ"ÏŽF&PòÄÏ }Êû¾xˆï«ÝZY(}Uø^;ؤ0½ô´[K•…å؀‰ÊaI$y’xÎiuÃDÛ~Ûs#7>*܁p¾rçy¥Gk@ŒÍqÑÔ•J¹©}‡¥I–CÌgx:€º™ÎMùÉÔ)edžEVm×­å v-+ ñkð–Ü£”]™e -y$â~Ó£5 Âæ^f(…a°õ,êx­ÛÅ/sUÙ³ÑKV°Ÿ’U­Ý>¶¿€\ƒï‘þ=™ è »+­È•†ïwª›’Ók<Ü!hzp/ñßû¨„d–iq «Ó¥©e:¢·ˆ:âqP?—†âTû|fâáÙ§ •ðSöOn'ŒpÒW~+|¿èißo=ŒË¶ÃcÞC”À—ÐÓô•±À¿žö}«öݍçÀSÛ5©MÇX90SŽUiŽnêSX*Çêî‡$:µ¨ -ö܁¿…0·Ÿ1ޚ`ç >¨¬plÀ?[‹ž½ò:l¤ÈÑ!aqßD0°MiáPØ£2µi ˆžÜ`Å×Þn¡ëíX—ÆCG<4­0®'tjR Ï°ç˜HÀíšÂ¹i¥0Xièj–ᨤ–õÏfvٓÒ>[`DºóÛZޟæNSÒVžYó^Û¹¼0`–7Y7Qcp©Y* -´7¡’|ͳ0KŒz{>º[—è}ÆÅÒ&öôÁ?&s·“?ø±7{³dy:~[Nçå`y“ž†··v_,à g°e©ý/‚ð&…Ù=Pþ‘¿áþxћ¹d² Û?Ñù剳¹•o‡x¯ØûÎ/?äï¼ -N0. ÿùèv -¶ò/×È5tÿË£u¥;°€}ú;ô¨7ïýÑî6™ýÕ/O¿ú—þÏÿýïµÿù¿ðûúŸÿû¿?Ïïk:ÞþÞþþ/‡°>7ÿ¾m}Ø€/ؓ¸r´?3û²ÐÀ¼~ZÇU#3pÑy¼øí·÷à³UI⛠äÊA ¸øåÿó‰¿]"Btnõsæ°ß#â‹U”Ž½I`©Û‰] ±7`YYjá™ú¿.\Ï .NgîÏk„®J&ß\ÔÉ&4–D†zhÕC³* DÐH±XV…”ŒÄ”o.@P16U¬Ü»¿°òÍ҈+ß\|ˆÀòÍň,»v¼Vhùæâ±[AÎsç<ôëÎÛ·ÂÃ睇‹ù¤ã¶äð·2ø„V½kÏ.gåôm9¸°2ý…k5«n;ßǓq§…[ñËahIäæHTN+ûÁjv¥…œ©Ábµü·¡A ÔäTåƆIYÒº˜@B¦ý›'näÎpd—4þB€3/³'Jà¹J¡uü¨]PÎ$@Ø#öÁ#ó@Ù0£çK@•aH¡·œ%ˆ{AÄ&øUó7¨ð(›ÑGìÅYÍH™á0“ ²Sž»Y:ôà&î‚U½$äǝ·»½Hó¼Ú{0o!*FÓnnRmæ@´ °@»#dÌDz{D:îdD: ÁÂXâø;‘n…Fþ¬Îë“.†á…‡¿Û¼Â -¦yõ@?ƒÖUÚÁûUÌ.¡ƒ©ŠhˆvhÃ`ˆŒ™hÀ¯7-u3"…äÑzÌÑw"Þ -•‚§‘Ù¿ÂäYEf,¬ š{IÅ«¢k%‹<ˆŒô=–  Œá9/ôÌ@¯ÅETÊÒ¬"-Â_§ïyÔà«Éü!…ï'@$*(–ÃsDÆøú³*y⑘`BË wǔ£>Ƥ£ðƒ<|B˜tË4Zþ*›ÖÃÂÖòÇtØ|^’ŠIG"WL:ÌøAÝ5bâ1,¢^sc$ÔLze×ú~V¶­LضDÞ¶¶íªÒ^D=É´r#$¹ˆH@²SD:–±"Ò±$F0–Õ1"ÒX ] Ãñ1j¢¿?"u3¢„@2ñF߉lËô©ŠwÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(Æ @°„ã"¬4nzqD-ê^D-xÐkô¨µL—ª<Q‹@4®œ -7n’“"jyi*" \"ŒÒ÷ˆX -Ċ@8,ÂJÃöïhE‹h•V ²G}'Z-S¥*ÀE´" ‹Dޏ^,ŠhEÒSD,’°ø)/1Vÿ="ƒ±"3*{¬4nzq¼}÷"jÑø)4a ߉ZËt9ß’øiý³‰7âT?mÒÁþёVKÖøi¹€\C÷ï.~Ú<Óì¦õ®$ú߇ïúã¿TÿGŸÚÿ´ÿáÿÔ¬¡ù8«oýûþ§u†Ö;C´ÖI³ÞÝMã=—ËŽÞÇUãž\qÖ,›¸kàÑU‡ñ^.›:"Ʊ;¢È'—áÉõŒÞût?g ÜÀ£cŸ¬óéXð¾^|tÕ¯³nàÙÁÁ­øvº—w§Ž†g Öí³nâø±Ö¹~¼ó\qÿT¡ @8²U‚÷rÕQp3Áë¼CKà&þ!ûh‡ÁûùˆðÑU/ѸŸG·ê)Bð^¾¢:*n$z© -Ýݍd_PçHðž®$x´Æ™´nàN² µÆ¡ÞÃ¥TC½´®ó5U¡»{› kvÕߏöñ8Ás«>§*tg¯ iÕïÐ=Ð¥ªY¨R¾ˆŽve„àՒëXÙýcÔÁv~gKƒ¥MPt]¤DŒ®"@`û®@ðÁÄU9ÄÄè— àãÛ÷(gqT¡Š¤r YÔ×ÜWNªƒ…'±¼ô¾ -W¢]ÍF¦›€2H®Nõ,j·ÔكÝfYWY^•B¨s£3¨’º:béç/Àõ|rû×ÛÊõ·µUñ›ß|Õ Q©/ì$\eNwq›5}–áóIÜèDåÝLà· —@Îl’'üÕǸÂg/Š±žŸø8<XVc¢ç¡þ[åºð[G±‡þ¥çô‘šÐ£ÐÓxÐg¡ äDˆë†>úë)Üg,†|•c™°Þ㠒àé"ýg¢šHÑ賟¼9Ýëë_î:zrÙÁ‡Ñ -ËãpoŽÞ Uõ£ï÷ó<žøÄS±Â×0TèáŒ;tþ1.ò'çÛìÀŸ@®¬° tù*_³®m&–/é؈wù:ßµx¥Þ~¡oLÁ›*qc¢GsÍP4uõ‰ø4Õ¼¢•¸4;ñ¼E:ûWöÊdùÒܼPŽ–¦2G ãý„õ­³bõ2•¸OwÇ-Íòf47ÑN;á­má°°OÂÊ^ސñVõÓwVÙÙñ†?‰Á:ú‹FôOS5ûIý}EÀu­³´žþkqŸîŽ{™þX5ʋÙÎá†r³Žkޗ1”Xæ3g8gq'…ÀÿÒu­2F¬Ã²X³=±IôÑ·¸Šæ˜JŸÒ⺠VWĦrhÇPlZu‹Ì2ÎêëºÐÛÏ*½xùrã­¾ŸPñ€ WMšâmè…Ê)ÝÁ,Ð@+•gÊ Ù)GîP/ÚK vªEÚÞÊX@¯êcB—ƒÙ7hí¾ t!"¼‰}LerÝáFÔaƲ<ªþ†Âê~ùñü¯OuþØù¶?œöG兺ø®ƒÑ•vêìöÇêìªn’ 4™¦™VΎ’tU.ìÞg S¹´Är͙•ÏL‚:N€/ë®=„ –› ¸ -§Wû’Œy‘ÀAi'ʓ -`Z|®²«¥[jà§Jü!}ƜBè,M½Šfû#r¼€½þfD¯¤Xn{y4g«t[ÜΕ°(âa§V—Ðèâ†iW¦EK3OqæNà: ÷dËR…NÊTƒN{%Š…¥ƒï¾¢®"€"± -WSF¶~WÜþ¢t¦Ú©³Õ~naPw£…Áíª£…åñhð&3Dã¬ž‰H²£‡QêCBÒ{èܦ'Þ䒲 -ÂEiû™ÊGÓzÒ¼"Gá%'õ:O]Ëzg Î}§®å:m§r×OD³›*-Yú]ó1žÊ<1OˆÂ•i^YnyœÅ ¥î-­Q˜Z7³¤Vùåë'žôx1DCî,}jIŠS\4ÅÇêZ¦ùr<á\žý58—%ø£–Wu'M@TUŸÿ XØb¥N>ÿï3¬PڊŒpTZAÑW Ê»Rè¼,  -ϝYΔ+Áiá|“B/¯ -­ˆ}M -™ex#Ofe"pƒÐ¾+Ÿ©= ,ÀÙÕà’¨gŵL('øÚÏÂÊypÁ!"‹Àöd]-½ô•©DƒËÙ½ž*À·jõ<+ภHlwír5àd’¹p]‚jÆ9ž²D¸ú€E¦RW#€!¨H"ÀÆcZ¢Òˆd ºŒŸ¢’ýS_üЧM>ó‘) 'bkVç  {ÌF̝֭ _k<{ö±šùȤ=fÐ=.Ï¡¯ùØxk¨†ØP•ù«›7[ß\DóõA³”c]z±Ít„ z ¸½’… Ê@œDÖåÒÿn © ¯’Ñ­¢]¼rü’Çò×Ø/ŸqqÂÏã•3]þ˜»”ÓxŒId˺…Âë÷ðʼUV¨²ÀýÈRã,xµ‘ÆI¶ZŒ'·R ÞV”à…±ØÀOg2£¥Îý32µúš×® w†U–¡›ãíªŒ¾Ÿ¹ú öHvµ* -˜¡ªU™2˜?Ûs)U - mßûE„¸Ûvì:”wS!’ÔÀeÝgNGÍS”wìB6°€1ҙîŒ@Ò¬Ðï +u£~S.rå펁kFt÷KØ N®k°Tvušâ…NP¦ßuÄªØ ¦49Ÿ»…‘§ø¸O“±lBxM…Uµa“aI"‡ý,쌊 ¯œÀç¬èäXôƸ¦MÎgcז1â ðû*ä4ºk„Š'…¾£6jõ@°ÜáÚ‰%Hìì\û‹P6;Û1¬* Ú ÜMä.@Ó êµF¹Š²–e9{ :,á)¬‰êÀ -rÁ+Œü·“ ðŽoªs†×0撊ÑzW1̖Ж:Î,I„™Y™½³šÝÁ -—ÚÙYPwt·Kí4^²¾z†’noì `›Î Ø7ëhˆ 6îÂ.i>pëÞåyi;ZžØOµÊ}²‡bïô¬®À$]荻VyU]Ò8CC2Þƒߝ ïâïð ÉÝw©}cÂˀÔcóßÁDïoä‘f-ŸŠ¿çîN$@+ËLýÜ%ü÷¨éÉø‹vV ôÂÊ4 Å/¾§'îJžpoYþJ½[§}™Ê·ð#0~¤ÁÃdå’Ìýˆ…ˆWõ1¼2ßöhZà•*Ë*Zƒ÷.ël»½·öÆÓeee•ÜDßyUY¼kV(¯^ü\]ו%o¢É®®¿šUª«Kòc¸Ðˆöª†€9Ó^×Ì9”á†Ìà͏¦Yíœ7x¾Ó{kçÜ{Ãðfb^‘b|¼¬de§Ðüªð~²¤¨Y&4-7µÛ²×Ó5 è¡+ÿ*Uó*zòf7|ÍWñր¢‡Žßçfe=¼¨ÿ‚ w»Ê»¹âõUùëü²œ–ÃþõÅãɛÅlCîêyš -T4rˆ„sZzƒ­š¡1•"—Êʉ¿<\w¤‚ÁZ(ˇVOÖ ®¥D>‰UùÛ9};¡¯5ßèËÌ­Ä4z50èÜn‹w_gà\Ötx‡oçô턾Ö|£/³#_€îÍ´BޟÙ)àÄsØóäóGÁýÏEçqïíd:œ—ãÎõpüÛâê÷ÿª¹‘òóØØ  •p©¨½ÕÙà¾ÄçEwу)Üí`"Á$-ÓuØ¢›Šœâ£ (Àå˜d$8Ye2÷gÞǘt]*8 9æaC¨¢tBª´pÎ_Ъ3ôh è½ÒAœšmÀFcLÐ5³šºNwO£.³ÏÕ/È»¨Å´%Ô¾½ª4lžƒ"¥§CÙpƒ;¿ ÿøå}ÔòÜ-•ÜÈؙËeš€‹- -Y!˜R :‘Éþµšx( ób0ÞÓÛ ËFãÃ?t“eRaÜÊUQ1‰ÎQ6vQ®…íÐ΋ÝIŽzV‡tNf¸o5ÍáȹB_|fr(: ܽ&hó%â]|Ÿú{Ï\ õ½ða´ -´£€<2q¾œ»P„‰T N4ìÁr\maZÁ c@ZË 2'ècUB—N0eI"Üm½0Áhç aç:…‹¤í6¾ ²p¾{Beô:XÍH騄" ýÆ{Yµª ¶r&O _"õ ©t¢dØwqNTÞ¡Šœìðl*áÞX™ÀÍ&(éb¤§ŽÆL݄…1 ïTL%Ø7À¶â‚©!Ó'µ[D+b+itÌ3(q7~£ßþ:GÙm*ŠBâõ’¹(@®Ó©Â[°UÜâNgkÛß\Ôò20>îÉÍÀðYÃϼ'GsÙ‹§¹ôö=¸ZL—˜¯Aºä -gƒ”¸¦¼Í¯{q7ûÜ^üÍÊ5ÎA›ó8|n…ËYh Ÿ³’ì^œÎ>WÃëÛÜÒgöáw˜¶¹Çäô}xž[ïûp=·Éöâ{àæ©á|އ÷A6sSîy­+üÄо›=x &ToIÊÞoÙÃ˳ŠÜ¬#JKÀÔWƏ@v† ­kÀ ÎLÔÂèÑs'˜¢…º, Ð*~´„4ÌRzŠ©EâÌ”­‚¢^,ó|éQC“Œ)à3[—è Ñ˜Gn™64ê~@P ŒÈºU ¬<^C§¬ô©†Vñê:H«{ -^­¢£í†Ls´ºgÇ*µüä¬ zñÓdü|:Ï-Š“G=/þåë¯~ºÅßr÷ÛóÑÂþûìòŸV=¶š ¦,wN§‹ÙuçÇÞ¸÷ºœvžM`´ßòcÇýz֍†¯§½Ûëaß7}e)ý ób1tN:ªó|Þ}°Òø»Žíñ·õX ±ö™¥ÖŽQ¯m2ñ3v•<_WøËäzTÎæë9µœ:بҴ7ÿ­´jñøuImýÌÕàu8þ2-‡³òÁw®'·¢*±?ÁÄ N—º3u¾Bgp¸ÿ+àîûi¿©Îç§S»¾G%¢8^ÚmuqöÒ¶L/zó 7¸çÛ©Ï;´5ó#zÏ9„ýèâê -üŸÿïæïùòÊ"u/·ŸñîÿÁrþI; ÂûUGUÞ¾Óð?ö|Õí9\¼ëà›eÖr=d:ô_ ØƒŽO5 ¶#ÁŸðO|Îá¬ÛîßñV§áüT¾£ÖQýªV¾Âaj{gnoÁ†4ö›„8B‘[‘V:Z$kiñ ¦¶p¿ÙY|9o'ìë¯üe¨mM¦ÝòW(±ä7¸4…Èh%Šñ|1}[NgýëayiåÜ?vÎ-aO~¸º*ßØw`Ý@ (‰u/)”gJ僓"£²–`>&ÈnDiÌÊèI–Ob$¼»í©R£0jÚ(¼ÐªH8ŽßUnÅYºg©ÎßCì¦Ü@éOº?±àbüéD—{»€Lªò‰J”@õ[ӝwp)¦ÈRw¦‚‚}ë—NzÔKGšví4^;Zç9œ|"ÂÝÂ1$¤P‡Ë ;;ÕÚu“÷ºù,˦µ´ž‰&úó¿Y¹ÍƒhyÇ1Ë©6 ²4^Ž1!JË´ ×jwDaåÑ®*’// "i -sRH'›Ej¤íæV¡NXì¹ù8äù° C9»žNnŽ“OZÚæ¼Ð-æö5­7½ÿÅ?p5,o‡ãY9ú°XËjÆnçÁ_ÇÃþdP6¼|Ñ ã†2x‰Ô¢ÀÝÐ\&~ðäÙå?_؟ÿØYжÙyçhÂmOø#b-rU<¿ÌÆ{/`Ë™s`?ÚyÂ5仢ðø£òÖîäÙ³qþöso: 5Ž+½(G=ؘ¯&•ßè=k°rïê1óÏk'ìÕ§Dóð×"}nÕã î²ZgV&Ã& -cRÁô ú¨7×/Ø´áLžåûm·Ïh_t»×`C¶öõG A|~Õt8x½I"•4ùçx~‹´Ð´gnFÄ@)s¸ðÇÃ'W³yƒíÓ&$dûÛ-7¬`•Ê<=Ö#C¶GÆg92$ú5?ˑqœ ÍU1(T.ë -•'ÉæRå®l÷1f;È¥òòí"út‹È_1w/א¹›¬­#š•¶éÿâA/û×¥å,cz‹ßÿ£GÂÛZ†Z úûWëó -å¾?MÞ}}²ºþ—RÙ>:ååh<¨Z“.G ¯@a@R(o{ýïÖ°áFW¡|ˆ ~Ö¹žñu ‹Yùüåù)õX¤¤’ Á]@qç‡_o{–©ž–W“iÙùÙjà¤) Oõ^Ïú×Pš®ÿmùð}æϦ“ÛÎËëÞàã1âêæÙ5·Ø3«þlêx+›ï®'ÓßSfSÇ 7}Smô¶œÎ«Üð¶7dþØ2÷–¹{æþwË[Çvý þ±µbN§bÅ9ý(ž¶Ú!‹ÎÚ¢:Xô‡ñ ª?º½éóÞ¨´;Ð ãùåîýþöïÏ{³Y9½±{¬ÿã;¤À/¿éª?|ýÕó~• 5é÷ÿ Ÿlàïzv³3æú -_ß¾xrÚy1™ó+’TÀ-Ÿø@j„Î;¤¹ró'åè’Û§2KÑ ”ÛÐpúû¹¥Yáî@ë -i”KÒ#…ÎÞ÷BûÍ5–°=$q{™.¥nËöwՉjû{¯­RÞãGDZØáÂP³¼È0ÈCfRh,~™iŸe“æ’-(ÝF¸8l‡õOpÁ“?©¢sú'mûtêîCÓRã+Ü쀡ÝÖ×,cIàÎ^ô€aØ¥Ç,-µžüIæ³J£‰Ìlk…“žæ™K4Ná–ã+îl¥…=ùS‘TPÂã–Ԙ吤)v67©ñ Ë+áç PB/…ý×âLbœŽJÃuÅ0-™P.±Â¢× -Líº-RŒ=ÊNá4ÐMè÷éŸLpj#”ï•y®=2Ÿ£Q(ø./$,#“@F…tTaîáJãÜOaè´]÷ʅÜçTæ4ƒŽ®b81vZ+ ¤ —ƒ¤Üj*•»%o|¾wFT´tKLÁ«H'0â:™”™N…3²Y\®¸Nât»Ò…rÛF´|¤£¦Gip^ra1f:ìªTÁµ9°Š ¤ü`•¹Ë™2™4¸¤¤«äqaç4LG¦Ã7R.b5]»“Ô¸™—®Æ‹>\ÅØ_ô3aÏdv/× »¬³Üͅ Yåaº5î1)Í£"•ké`E’cß´É º›aaf®sœI—®v.… -L]ÃÂI‘v«ú&eØnyfÒÉÈT³ 5rwS&MÔ¡ ;yˆ_ØÝ䘀Ñ؉DéB»Ü¼¸“‹|'på‹0Y˜^ê_jQk¨¦î!¯·3h· îKm$"”•ÐžP)í ÜÀXÀoÖ¯‘ØËP„ßm…[ÅRbй ‚\r•ß l\;Aп0µº0{bIP`àl·ÄÜ%ÿE¼Šø Ïpãí–Ó:l7Ë«#Ž.“ ® ‘@±c\$Eš`´F×N_–ðz&·È`èEÄ^„]Ž˜ºî"Ø®î€,DÏ)]/™½H¢e‘Äx†—Ì&p;m”p†8¦ á°¦*GˆÂi‘"•2‡ýi7¹–Èøíi¬Ý¡ŸÑšIá”Z†qZÒÂzÎqgDT³ì\ãÆ´h•[Øv@¸XÒÜUÀHY‹†•¦ÂÀù)”ÆœEÜT¹©´ÔB1ÀßmAË÷ -dø|ØÑ  *‡åpØÁ$ç^¸Î ˜hxídäˆÎåñ1ôó# Wé°xsè0îêÔD$M3Ç s¼sºœ–ysÌú9GËx²€û[J˜7Qà³J˜#Pu!rÇñ•=ÿpMyÑ4T˜[;c°ˆÂñ’ÂVxbå2`N¥r»#Ó bÎub?ãé’ —¢3۟;•ƒ Ï­ˆY*+±áì¥Ú²y<\•Ý˜ dw¯«N-¿ÐÄÒìÁÒE U씹$D‹Þ‘Ùî -‰ÕRÇ”8øˆõ;Ön´ˆÌÂ9ÐXg™cž™=ÌR·K3û6µò$ò0I=´é—ä#2jÚjÞ-„Rü:$“Gb~½Chù -²?on ´e+ß°òð³iÿz8(Ë禉à§×ˆìåľ`º*ßp-¢'“ÑÀEÑlEÅM²õAí ^w-ýS›®X~η¥ãñÛ'ÓÞb6_\EFtž¿n¨˜¹8rtLJãBš¦Èá­æUävñ¹à8íDÍâô°ø$¬êHÒH íXryð–' Û0VµÂþOB#ˆ,x› ÇEjT†–±ªžÚö ÆP=Ëâ\÷õjùƒÇ›áf!‹X±åç(º<>$Y†ø¤=Óñ°ÔüÿŠTÿ— ¼Ìʏ`S…‰?$™ñòunùá–ȁQå²ÿî -3Çñê,wìÕKƝêV´Éü —VŽKw°µ|\ZÕyµ´Šaê„,;ûN™É¨cËiæÎ`”\²À¿ìѕbÈ~~0Ê«Û9ÿŸK¢Q€ãÀþ¬\›Â]ý ®?+Èg©W¹¨GËXÖHPς¥-cMp¿rX¨Z¢ ¤aªí¿a þ­¼¼êM/ã藸eùš’@IŊý¢"¦Š%} ˜öI2²€à†A±ÊË Ò!å¥ã„6 ²Hj³CUx,YR¥Ê[JÖ*ÓÆÔ(Ó®'nZ ˜^鱸΅ԊNä°H—Š»b÷jærZ”Ì ½Ó‰§îRwÊõ¬öDâêÍÂ6“–\h2s‚i–zá‘ÒF#1—è“aÉ Â÷ü4ØßØÊÖì¡óál^µE®ZÎ7|]W©f%¹ä됏÷u|IѪMÑõhÏû‘Dß¡¨þÅõ¾7š_~ÿO;Œ‹É[w5Þ«Þåyi[”'öS€–¿Î/Ë)Ô4ºxøåÇóŸ&ƒrÍÏßw¾ýõf4¶ N삛/s¾ëñÁÃé´÷YÑ|¤·Dí¬ h¥®rì[‘‹Ÿ~†æáÎÊoÿßñìâmo:û>ªy·}Û-¸1ü0[Ó‚©|;ߛYõëѓj<—»Pi4±+~°™¨éb€—ÃñÀvXì2H»f^–óŸp4; 4nþ1ŇEl&Ên¤µ±;íŒ]fúÎBs¦ðÇ·»³h{ ÆÙ· -âäæØß']¢œõÀÓ g¨Ý‡»¯Ôϱo^ÂÍ ‡ÕŸûµ•gWï`}'ŸÁ Ü÷fîµÝ<Ï8Vhí°ß Þ¸Ã¼û–Á½[GfõÈ××;qnzc;1Iºupïw×û’ëƒT[Gõën è@FÅqjkÇs9™[ùâ¼¼š?›­:»ÓðV:QyäËÉbÚ/O!|÷0d {ÄD?nÊyo`…¬Ð™âƒ;óÿ ¼¥d§5µFGžŽÊrkñç9eçžM'·§eυˆ×ûË{2‡0þƒøŸO†ã9èÛ‹Q9­,øAŒùÛ?Rü«ÜÿÄBàcoä‚«à—“¾#m“OŠç_ðñ!;'ðOèŋrôjòÂuÀõèùd6„Îãϒ;•ìþXfOg§óËIo:xT^õ£ªRL“AmDÕeJ*>#n{ƒA ™{Ñ –\¯Âf·“ù2¬7ÉˆÛ n‡]âÛ <ñ¡¹®O;óIçEo6/§ÃßÊe¬ŸÚã™VTçÍxÒ3YÌ;¯§“Åíæ¶ÃÙdԛ—Kˆ€¥týJë¢sÛ»-§Ùðf1 -)ßaÿB“ž§`Çv|B=—Qƒù´7žÝöì†ë¿·ý,>‡‘Zæk±u¤íÝb綯§%ïꭍ§lJM²®©ˆû°µm܇­CDªrÅMÉòzÖ¿íÍ^r‰ÊT>Ÿ–³rú¶ì€y»óÃ`8ï]GÃ9-äoW÷*>dž]«-n;G谍çxC‡ xÁåìš×"®ˆÎ‹Ò®£E´8TRyäÙb~k䖇tX1«<ï_/z¯ËÎóÉm´ª­ð–¬ð¶çåtv["“|b×Ú•Jx<šL¦?÷ÆÃÙµ%>à¡+W"ݎ $×ç£Þ¸<+G£~W˜8vý#Վ³órޛ}s¨ˆ”A Óî/5¹­ôP``Õî(NQî©`I3‹P턥–’Yav¤$œr ά§ãAùë˲?>ôx8m{.” 3¶î9҇N4#Ú{žÃê4g™Øqš R3Ë1J:W̪´¶.x5qe¡»I7‰dÅ7Ÿ>^ŒFÄõ|^ý•8ªÌÒlƒy:9ÑiýIVÛöNá ¨møì¶×‡Ž6?îõËP9gSsX€+­óµ]ùyX¾³Ô´ììXa¶7ã­ºuíŽÚÆA­¨2ç†^îBKTê«+3żÌÛï,zÀ¬;çå[!¬²’úò·l{ i][8Ûάê>gÚoÞG•sP­m h#‘pV A©\O®?O¬p6ÿ9¶Îi“gë"^YA'òâ¥ÕÎ@Èýq2ØÆÑ­º2ŽËÎ Stg5«¯®õ܊¼µ|ߋ'•uýlÕøGž¼'£‰=€^”·‹Ñ¬¢è¸^Xý¼7u°fÏ=†¤jË/*â6­ëJÛn.ËÁóéäj8*ÿR¾ßˆÚCt¶ªhUšýíÚjä«(ƒØ]iýrqiëã‰=Ž_‡ O|íC6åÒ¹’mzsnÏmRœŸ>¢cíï?–ƒáâ&’íÿq°,:V›Ý¤lT9¨¾Àj« úi¼ŒãHg^"xQ‘VÚ>ó«çåÚµViö*,²X†Á6N¡yð³^N—…—JÛgËÑvb‰ÎÏ_6 ´ÞF.‡sGz¹ÆÛ Vm·†b®ÑŽ$ó—i&bÃÄxÄÌÎpŒ!˜ƒje½š¥hý XxüsrÙ½µŠæÔ*œË[i¯îF[šÍÞ o/í@ß,1‰åvÓªU–ÐÅ閦ýÉh‹%ù²;4=y½Í(þo“˧ã«I'k·Qc1lO¬¦6Ûá0ÁfW‹qÓªq¼WΖêÇÄP¯.c³­ÚGÿ&–µ¾=›XÝuÐyüìɋ‡ªèü¯oŸ¾|Ö2Õىü£Lý¿¾Û¢ÞX©0–ëÄQÛºŠ×ª®9­ú7ï7ièQËÉüz«†îÄÕº=³į́(&;pöJûZ6ZA¿˜•&}4„Ö+öéÉXµÍB&8çŸ-GÏË)”†‹ùþíë •}†Êq.~`cĀ{êŒI§î) oXyªú.g4jü2÷ØoÛ'@ÁSmÅ2îmos=y÷çá`Õ:V,¿û¶7æst» &ª±xWªûöKýüÑã Za6 L34}5íÝÞnk) %zNƒh·¦ؖM‡;´uAwÍö9jû¸7›ÿ­¼O#›†å¬cAÇ®»QÔòÙ¼´¤¿.ǝËrxÓyy‹qtÓqÇþXN;ñD<²\j³Ž}Ëɣɜß.X|WŽÅK‹Ü¾`Vv~ˆQÿ¡cç_;Ïìö÷ÿ„Ýá8~IÇÎ.Âàõ7vžŸ,斏¾žönn:ïìÓ¿u;§ÝÎÓñ#Ô÷m¯!›SMo~ÿ?õ;v8àÿ¶W¯ÿ¯Ñ|øº¤^ÚÍ~{Wöß`וÅø²|cÏ6«».¦nIØ×÷§ÃÛml³2/¶È·a91ðát“ -I­_”¯!r£2QéÆǐ·7µQI¢¦Ï-_ùÿ»û®ìÖufÍ÷³–æ°%Ëʁ¤rŽT–eåd+˒­|ÿû¿ô zýÒéÑô03ERTØ}{õÚgùH"ˆ -…BU¡> ¯ì'1E‡Õ¿Å2¬@lfDUukKœ{"iwޖÛ!Û.*] æTüžè=.¨vÞ·›¶h™Ö–·¿Û)„§ƒ¥î_¿ërñPâ8½ÒófÌ­›ï¨ »Õ\ éö秠"”[Àë„Ì‹×wF%­Võ¡°_ôÈø¿¶‡uòšÀ¼ –Îó6 é]qeG}~Ÿ´g!PîwŽ–ÔpWlj˜Òø ²)äˆ\ Ïm\æM·bOak¹væa0:1Ù²î+ϦóYMêå=±ÔV#o±÷^:žÜðY¯È (o·¹ÊT°+þPÙÀS¾Qð4–ÚÓj±bíûۄ@ý*$d™pª„Œv•àڅü¸UM™áR¡ÓÃv2>ëa~¸Oq‹žrGE*ᢧ7ðÅrÂ4ÁsU´àº ï^­ÖæÅ@¤B`|›DœIrMOKk:ÅU‘KAY ªI©ë?âuó8GNdC~—·§)ž5x5 €\æeãëü3ù¯6GjJ´ºñØ&Ó@Ō7E{ÚI†v/GO¥¸Ö¨`÷¿ßTïCóÌf`¡ŒÕ¹iâ7+ß}ºóÊ>ƒØDmÏoQ–’ò^s:C-V)ÖGe<áäŠñ‚õT>ï÷¤ç°Gè©;V1ô­ávÄwl—¡bOÆٟ¯àòW[Èhm&cj5võÞfŽô¾ãÍl´ìŽKÆrüpžú2$Qö¿ân÷ †Óßé¥ ÓÇC‡%¶íŽñc‘p2ñPI{`JNÉe®ZŠ‡Ýózj‰NÓ‡qyA«4낾tæ5èëeOéïϤ»g·%~¶¥c"_?}Y£Þ—s&íÖ·“ßcI/°ÂD²6½/°ðµªýD#åhÉSå— ~ÆÃëÌgÁÞðYU(eÃŽä&l݅FÓ¢èH`áF0ëaª%BŽxϵÀ_qü‚ÖÍV4í2àÏ,‰ñY+t#êõÀ«Ocæü@2è%ôsáÔáKP‡©å½D}ÅÇqæ+$ÃՋÈP¯ÁæÀ;ýÿN¡"™ï4S¼D·£Ô® -ZҏòŸšþÉt6‡WÕ,I‘áºË”¢ª\ÏÒmãZNuu~5'ëô»=}™á0ý”e¢ESGüBõ2Ü/œ*aêͺŸàW„*7{+ ƒ@¯9Æ ú…žñ ’¡+'ù}Æw$¿<7",3(ö±!sž”0L£ԉß4ªCÚӖÁ6‘µm£›ÃçùéÖ)õï\46ì˜s½yHPUè+ÃkE2âéAñíý&Ch³ ÔԈ>3ÓÀnÞpmCÒÂÖFsZÈM"PAÄôº|EL€¥8Ìô†Õˆ ä崀pÞò¤„} 6±4;Ô¹yK‘‘*Êg­€¯R¿‰4¶4O˜!]ò´+žª§‘H´O 7y…QoÀäeZª•×„—#Ã2éNí2ª€Gqš‘V0 B[Ӓh´Š¿™¸qÞþłà¯KÄ/X•—¥Ì¨Ü f´Ç6ŸýŒYa×2ÀNJ¯ãí—æ2µ ãät½7Pk&ÏvñœÞåÝ(¾cm+¸Q–ôÒnŽQ¶æ{ÞüÁ-¦?{‰·Œ¦@êë\륋Å}’ߥäpž¨ý¦+ñúà0ÎØ~AƊ\–ආí£Ì–+@=uêÌ}à·väÔÖp&½6ÂÎsYñäd™ž[ÈϔkÎŽ1€ mõ}ø+¼îò-àCÇ:°ÉlRu€ -:nðš}ë,×>°avà xzœG=‚›¢Û="d@ÝêÝìA«örØž÷`ÍyFþã£Ç¡ùº¦Í±N!‰,g!«èª„Þ e>ß¡y3HÒþ‚CƒœxƍË}@Ç£˜ôó$Y÷-Éêëç ™àX!‹û$XÅwôG½EG:ÿí‹8Gó?ñ›ƒÝڔ‰J³ÄLSqcä|Š¥Q¯×Â΃lrã]öE>gÜòš:¯¤³ë×9˜gÕ0 «LÁ'Û)»ÓMkÈý&¬·$ㅍˆj¢¾‰[Á»Ë= ƒOk± -oj´›Ü°Ì¿Öî+A¢·~I}}hƒ ÑÃ!#ŸÐaG1¹.[÷ó¾p3½ Bd\-÷Œ{,8ûÙ`p¨ -ݛ̄É;Ý|™Á§å%CþžGÄkàÇO —Mïì2~ß´THVßãûóF7õÜ}MTßê-èê3Úß.Z"¶Ì·>OÞ±ÒαÉ+óƒ2i@FŠú㤱Ìć¯& BËí¢Âb¡t,SØ"Êó*¯ì’¹¤ûœÄp[ó¨ŒC„ŠvöAýw¬à)i‹t…\Æb¶¹ ºÚÀ±²Í~ÁrUËd†fíì®+ž ~ãíªÕü²ÖW`A |#qçéê‹JΞ.,#‘ÐÐZ4ZKF©¢ìLԖûP3 oÂ@/‰‚i é˙ìââŸÜL–šÆ¼–Ài ¼Ðí"µ:®¼é…½l1rŸBõ Bª*¢ ¼z«Z°˜3Ó؅gSÅ *ÄýÚ·Œ¹û~J»øŒÕБâÛ,=û Ø)4éÒ c K§r/Kí[mÔA"¨5«ñç#ÜfUîݙÜ8j8¨·þËÙ"Á·¦ÿ“^ûT0e©ï“»„}±Òt°Wÿ -˜ÈÃ5hINœ½•Ð²Aú»Bô^Z©*ïêÜbÈpE}a9'•ÉX,!¨{frjÅ>nS  -´aÛOÙ4}×K<kÒùŸU?éiu‰ªå}™¨5¬™ìköӗ\ã³²^àô¤ j‰8Óù~É-*tu¸.Õ|à¯g†/†nzX–Üøõ¶tÁd6q&m[,_×pÞ¬Ž]h¡¯ñÍ&šª,«µ#iµxüõŽ×n˜Ä[úӉ%]üÔzO¥L-éi8ìÜJŒZ,ßφé:Ø%ŋËߋEpe¬–­gKdÒݜEªs‚rkèsÛÿàŠ0‹´ TËâ{›†*¢ŠBóyâyÁ·ehEÚ¶=¨Iž¨{2ŸÙŸ“ÅË}SÊF(H”ÉñrkKù‹²IbÞN6õ–jÅXƒ–%jOå í“z_#ßóÌFZ,0àp{‡6eDÆ-=0Q‹^o$³Ï…Ó›’‡3é±¼hӋúh›Zéô ßîJâ7šßJ ©“¼Êvº ”NΛJ,ÆCÉß,§Û6ÅöÀjèxÂ÷9{K/#'ٛŸ "–¾Æ°ÝÄö«bÉ ´˜°0úåƒk>hV,Ï£hÄ뒒’À:A6¾@ ٓÃô¢z,R*ƒnl-k©Äç2“Š/k9}Ï'ÎuBTŠ.’°|Ç[ü8NŸxÍzùE¶ç˸wòB¤2$a¶ !²ôþ%ê®l_)ûk ¬%œÝ”¬Q_6ß÷B]v¨†žýG¸uP2òmˆ·3¯ò¨·pN;j3{<øö½æYîàOëËü¦è-!vÞîD)ùCÁÆ - gÜ8¿æƒÃnÚ §9’«œÓ¹Áñ˜¶M2dجm‰ìî“?•¨çRhª:°¢­{Éu7ç~\É֛ÆøƒØâ‡7óÇÏQö5£-Æ/ƒSz±=8$ä6ÖÑ¥n:u2©EÌu9>}0&\€d é•Ñw¾WáY¥³Ñ×9°;^*"³-çÖDÆ@NuÞO(iõö!ýµœhñísµr§C‹ƒ8øß^¡‰$² -Ê@“)¡¡ýÖеIkÅh<Ø¥Ö¦\´ æcQHgŠ¤Ûñð&c¦š5ÐŵÕ& ˜ËûÔQ LôØ pºu)bªš»Ð}Quçê%¦Í]¦Tf¸qzÂônâ¾Î’Lø³ÇÜ ·gL{+…7Ž¡yÐðz]3óIG÷?´y›Î/Tç9áŸì–¼E©ß^uœFà -ÎóƒXo-i'ï 6Rƒ$Ç»Çu`‰×3™ø2¾A"pnÌ®‹±9LjÐK(1jÀH —u[ŒÍÒò+PrzÖ ~»C˜Š^‘õéwžt¯g3o«ùÙòûb©\ê«?ÓA/LW]ƒt±Ö±ûÙâ×B™±Œ‡>›ÀõU­Ð lû)Pú½5X†»Dmãi Tò¸?š;ºt±àúLÔ_’;)íÊ$¼÷|áù”KEÒKW¶?VP D÷¸I–}&œ™ÒBÉê*VM1ŠÖiGÚçx7X#qŸ.’@K>S¾úlÎîô;ç‚2ÁÙlÚcË{rcÇÙN¯ó Ææ”äâT‘·Áäœ}ž¿`fˆ9Oö_[Ã}1æØiŒFØðö6ú¦ ŠÀïdydU ÊñƒVE^>ˆ Þ°kgÀÃî+PqÕ³ði;Ñhúˆ}P ëøw tþ§-sBNÚ`ÍÚaÇ~Ûñ©ˆ_Ic¸‘¶¬œÓ°­[L&ü¶<ÃJdòÍA÷™¢M?ØXÉi¢RÌÁýÜe2ƒ´©ªkż··ßi'ù L³ÀvE:(üԏ½+Q~ämVúß´²)e>d+ϘO¡-9õš=ɲټòýæ«VQ ›òªÀ(gŒ@ªõ=ÒÞõ/“î¶Ë΁ÕÀ¶L4ÒG‹w_Ç"Àƒ6ï+Œ ²µX"¡IpI®º/HÜhߓWrÿÁô#W‡«šúŠÏìéü&Õ™QýxɘŠIâ½gÛrýÙ|5±‚nª‡œ4H§&¤{ОÈÍP¤› ¦ô(ü‚rŠ8ÝÏÄÓÈñèۖøiß3#Ó''ÅGº ]`¼ҕ¡|%Wó;Í èÍUeCyC+Y¶À´ÚÀ\jÉi4jkvú@“ìëËö4,úŽA¢ñ5=Á&þ·¨†Åðè ?ï9B”ИÁ”øÝÜùÇ¢b¼üSSb¶ÌNªµ=,Ǔ9<é`K7Ưƒ—y %'•Ý¹ú]oŽ'ǔwœŸéÿÏÿþ¿þ‡r²$ýÚqzXö"Àeþwý^ÎÇGZòÖªÿc^>oN«Ýfž¸8Œé²Õ! {é¢è&?HºâB™‡šPŽ%ÿ'élIkÔ3òYc­‰sZËvkìë䂟w¸t±ªì'ô äŠ5NI`Ue×¹—Zd ý¢(û”°FjÞ/­É>6kí…ÀÑڈ ©µ;>­uê¨kÍoÝ­ÖìÊþ8\¥€ÖÍj î£K_EôݱÊ(ŠåF…lŸ2™ç‡ä™´–Kít1¯­3OÓk‡óèÉF,Ôâd;9¯ÅÇe8øù^¤{éØW(†ûI󏡞úÌoÒddãÀêúõhSæ*Mõ†Î¡¸ìŸq×Økm_ß9Ø%ÐÃᬻYךrGüÚ¥;Ù½r‹îÌáhyá‡î渖t˜êҞ›úî¢Ôpž:ú3¿ Âè걙G©pŒ?|—~@Ú¦ùJËL½þ¬«zY€¯Ù x·›†dèޗŽ‡CèØ;|†Þ+˜Ó]7ñQÍâîÎWÉ&Iõs™ÌÉR…f ñíÔr„…T'‡Óږ¦ú–4¿4w›’ÕãËÀ›ä¨ÂÈ»€p.Zõý¶¤©ºÍkhZ)KQ=œGA“å5¬IQE 9 Ët×û¢÷‡ªÝ,ÓHV%ûªË삯•U¹†¨2"ÂXöe[’¥j,”Üe97S¢©šET0Bº¶ëÕs2‚7Ýۋ¡ ê£4Õw£Q4´î†/»ATÁ¬šBªŸ‡ÏÖ¤†¨"I TpèiΖNIª{ãM–ªÏ¹¨¥¨2‡CXk>ƒÖ£Twþw߀ã ªGc´‹ËPõ|™ÉyQ…ûoâîºÍŸÖpè§&IU—{^öÞsYŠ*–)V“RT4´¯¿'&Ídwwˆe¶†4Õ¬>b(Í¿š’T³U QEÊæ‚É9ƒ]ëø¢¨’ë ŸjXg>ã6ÄaËÕÜðdz·ì0@Õ·ã¨2ª+åß>éîví&‘û<GOšª»—ÄJ?UŸ4Õ¼îì/u§~8=…„)ª•Í<'KµèØïl2TûV¬^ڟET!ŠpÑ5(e21­$ÕF~•—¥Z/{#9ªi¬… ŒdwKö—Ælh IRm "GYª-Ó|¸QEdhÂe¬m%e¨’ÖvÜHIRíÙYªßºF)I-kRÝýðbŸã‘Ušê[sµ¾¾Ù$©¡ˆ*E†&¼ÇLK9ªelD–ÒÒT3M\×9UóRT‡7; ‰Ó„'.³hòXÒEQëNYÁäÑgW -ƒTmT+Ó~@vâ€j䀨Âe%l n»6šê:`Q}]ôuÔòN$»x^¨(jùÖÏBªöËUö f¯è]¡w@8u3™$¿՘‰´‰ô¢qf¥Õ“KL…JqnøßúªQÕ ŒGØûª‹ts9@µ QÕÉÊM5Xuˆúú½kŠj¬Y* 9üŠ‚ï¯-Zhqõžâ N?Z"ø;‘yz6h]³ŸôS·Lž¨gŽž"-pQà$¢¼’y½ûŽ‘á -I=½°z¬wè)§ìyÓ³ÃJµ˜[T€}šÀJ³¢Wîi -+kÛ~¹§(±2Í×ä - ±zj}’yÚ·aõ֋Vî©kÄË&†i¿6¹§lÐ ¹X¦]ˆcCï0 óúð€;,EÌÓ± Œˆ²<Ó&/xÒ0Èȼ>©ãŪ® ótºÅßÖÄJæé šƒx÷»h.àü6BáSOú)q|×ͅ7ô”0FM9áӄ֑‹G¦](Bâ´Ñ†Ý…oêuô4e·Ôø>šiÖ°&·Ç7JQœÛVƒê) ¤ožDZ(Èé¿;ç<bøkÜy2¦2˜¯›îeºt ;ÀoX&•tLS©¤³håûw£× lŽ‹"È#ýâ2"oi<@ºB}N:Ëþ_#æŒtÎpŽô®\„YwöŹŠLÌ`.éÈ£¿|(ýƒŽ0FÞíԚý ¡Æ'ìù‚®ÐVšª»Û‘§ªË̜²T‘\!žÒçSV/p…ÆrTG -T³ö€ÐN› /aä°T]"&Cß ÄPÍn֙øTÝu=G®7çîàuWHù2T½/Ð7ø¦êîòƕ6õ&ÿ²T‘o Kú3)ªhõtwç²Ý wµ#O²†VƐg§‰»[½ڗ ¦>ÑâTY.DÙi׋º?Jêʙߩr”Þ J^žêd‚`¼Iœ9—ÜØOqÁdÜQz†a.7÷㸭‰ÛØ?}¾OOPµ;A°Ìú ë¨ñ"vÑwÃ6šêõ8šA<úÏë+ú‡´Í·ŽA¥B«´( Ýà *% -VEÙæ;øjx¥ÿŒ;PÕBluÞŖ+ -€i ϓî¥×¬SôˆV@õÎ#ÚÛä/ñc6vÔ,.Zôú`Lª§ þ€:íóø+‘Ó$rå;/k‹hþy½©Y M§—ÛU_Ò¸¹—š*øÎ#UpS\@¶‡'«Q™ëвQÉx΀Pùà›ùÂè`̔>á–äwæ =<~œŽ`֛+ž‘Œë<¢ìÇ^…”¢Eú:¿TNvY·ˆu£ ¿nœì~Ñ ý†C4Ó©Õó§ œì2ÎùÕX”KÔéTSƒ?WP)+L‰áTDáZ0åz t§&'ÐwDT~ -®X«QV¡ÉUÉ¥ì±GƒD@¦ ”‹^¨î’x••QI -q=0T…³PÁß$d o<·…Kdb;ÙØ΅@sJT’šÙ±àûIdf»bÍWÉø#ªžÖÐW,m†Ó»â16ÎN£Z„+K„¼•,d_Q´. - ¨[—Æ]‘³’˜7±fÄü ¸ïŠh5dö=ï cC{]+\%»„È(I<” ÷£ª H‘®€÷ñF´ò CiÑâ'cæB W¾«ëcæ2všpñ3Ò/FÞ¦.ø”¿™~®÷Zrö‰Ãúû(n/Zþ¤¶WՆ·`mQZ©-Ïñ‹Ò‚ÚÔÎB% çþ¨È‘3›dkì^¯Èrgsø;ì¨"ëSúeÕ"ÐзTd¿i!äòÓ¤ks<°¬òvi[À|évvO۞èPvšÐ3»{ù “Ù5RÜ)”åæÌ@8o2L‘†¾ôã9í\Y¤ÝÀoÁíMÚM>˜Òi>C»µ.·¾UÛ÷’µ)j7a\àšvkmïÔnÂé9?®]k¸¯/VJwiË„Šk͑Žr ŠÔ¨“ëÍq*/Žœ²ÁuöGÖNjÅ1h²q‹#G&hºÑɐI4L–ôO¢©Í_=©Y\j‡œ}&ï² -¸IMÏ+[xÀ—¸3È-±G€j{`ž‹&šä*²»˜æU;šŒê”u™À€¶Ô»³2jºCºZ²N‘ŠŒ=Q›$łhóL´RÉN×.Z¦.’1TÄ¡eWª®’'§mû’`ß6É Ó)ÇçIm6¬Jr€U6·lÿÀÚT˲ -¦uu†[ì¹DÇN—èwÕ1L™i?9*eúV -ÀI†Šf)F“å'‘Þñ§Ç<Ô&3””jzn/ZùÊnZãaúev&3}|iDßI–yœO˧‘-ÝçSÆòÁm¢§Àù”±|€Ìsà|ÊX>ºx7œOËÉ<׌åÓ\@ï„ó)cù4ð˜gÀù$¨VEÐÅgÀù”Ë!2πó)cù„ŽÇp¾K ËÇÙiWá|ÂhžD͕Ì{y0Òþ¦6ɈA³®åŠ—·ª@[ë@^èIߝxÛO cq›n -¿oÊ_WØ)짅©ûYu ó¹Le8e - 4U)B…Ú®ey]í!mܪñ©î¡”€ŠæjÆ•«â6É¢" ðJ K¡MbðR½ ¿§Ní H.ÚH{Ò÷Á¸*b¿\6¿„Ñr)&äs6ø¨4¸ùpx tîãE¶sütž«°;aÂå-¡DN !ìîH3 »“ ÉH¸Q×`w÷䗈U'àBŠ ß½ê¥Àªk ÜV›G1!¶¢Q„Y˜Ú{›þšgµž1›Ô'‹{높©š7^5,¦P¢RE †- Q7vš(Ö¦"֍`›0¢’…Œ!Eƽ›^³¬ÂRw F£<Y<šÿtÍƸS88ß xNÞ¬x“PSháǸä1rsYŽ¼™-¼Ï*eÞWj"̨òªÈ¼W)¼r‚æ&L¡(ê©^"¦ k»‚ð¹¥a;Õvýƒ[j“ßû¸‡iÄó˜æziÂx1uॠ‰j™ã y L•™›“…‹æˆ‘ºŸÇåI™ë”-ÀY˜2 ӛb_Šg@)`õ$<,ëÒî¸×NûۘûÜħ4´<«TÏ[e¨ØErÒý¬í ä@ÂýÔÈÁuŒžL›4bœtþÖèR›X‘R¹¬)°JUôæzJ¼xžB›.N‰œÄÑ‹zFôæ˜ñpº˜K4镣7üBe¯¢ðHôFø)<½s›RFÔãánŽÞh¤ ‹…óÃцãí§‹¢ê·aÕGoä÷ VP ¤¸—µûB†´óҐÞ‘!}%W]!]T‘:¯¹Ž V_¯©‚«~¶sŚ>ãà çw™¥+Z¤UááÌ·§á]¬7E•ÉW!~‚d·vÄï+“ !~j­Ê?nÑã2ºîM;8?ùóµø-7“Eé€@aŹòà·+V> ‘/›ôô82É³y8mO™we÷YÈ<¹´ë'#óL†U‹Ì»š ûd­¡oK;–kŽ|*#ãªD©ß‹Ì»LµbŒÐ§"ó4Rg©‚ÚžŒÌÓ¨9Æàqdž`løiƒÏEæIzkrûBÙÖöÀ¸ä]$ªN½Uá*­N©— 6ñ–Ð})ñ–D]Ŧ—2^ª©>áòJEŠyÈê7‹QEBû†æðì4TÑÃG Z.ve3ï¯j7åŽEùÕܾ§â|$?¢ñ|$?RÊ<äMF ïz*IÄÙS`Y/üðh*´q/?ƒdušl*´qÀõÂTO)gK¨Ç/>å¨cT‘Â|Tí⢊‚Z>öª–µëÉïÎË&›Øݺ8çÚqn¼ª4GO‚N^$,Áß®œH¥ävk Ù±®&{>³Z¶Ÿ -’m?$Û~HIÚ@²¸Îþ,¨è9 YXÑãÚÖò,„Ñ©;蚣“Í„Eá(Øó—(Ëfx¸œÃÃ#󑛌”§ Óž ÊC:íz®°›·{÷òcóTPœžjüAy·úžw‚òÄÁûN節òdÂÏå)ÄÓTzp“£‚Žb”‚F|>´úJ˜sqËé÷—vÚÅÁÉw «ÚëU!Užam§+ö‘z˦+>Bù– ®7œNŐÒÉÃP±;Ek ˆÌuÔµ¨M¢ läĂR•Z.8ï:‰Î ‘ (¸F¾¦÷ÁkÖëZ`F•´v¿}¨µC¸Þ*Ÿ®µµ¶Ö ¯[oh-„~z‡ESZ{qèÁœµ6#Û5¿ÑL|J»3‰CtÊ»{wb|N pG£~Ë¿&V»3Môµµ úÍü¡Qûé2»,U,“ôVd¨z_Ø, °ß@ v§õÈSÍf]–ªÈ(àÂÚO…kåªñªè -½Ð¦ùÆQÕ\ÞSo[vrP´®ìn‰ÉR… Aæ3'ö{];[9ªcªY,(´:ÅØÆeáE–ªöãÅ۔ã°Mì§Ëä ¢¡…S׎è£OÌ癪r•—¹¨½‘QTW‰hUTy8×üca¯/LT0ƒ7 -¼n3‰ÖX¥˜óõüÞKãöÝð#ÎÏÇaïí®æu^XäïôŠ+ŸE}‘Ñ%߬«WÔ(%ð\Üg]¯'u·žFæ˜ë±(ÙëõnÛ½uÏgj¨.•ÎKå*ݬw5wð©R¸YO¶‡’û7ð.¼k­¨íáÅipw3^EÆ&“ {½YW²Ño˜7Ø¢äþPÅ*þ¾…š[ùTˆoöݳ¹ Ø'å%ðÃvOöI¡úD6ô3€}RQDÉyó°O -Õ§yˆ) ì“ -ã+$øß ì“Bõ w -Ÿ쓪Jsý0“[}2™ÏöIíóVÏçû¤P}+û¤B2ÑÙvOöIEéù.}R& ~°O -Õw‘¥ú8°Oj§ÄOöIµIsypó£À>©1䖵§û¤ÆP&Õê`ŸDU±-ð`Ÿ2båiÀ¾™v/°O¢*â©Ls=È´›€}R.cÜ>Ø'µèk(Ô÷3}RÐé£ÏöIm¶HdÞ? -ì“Bõ]º¸û¤`l⍕'û¤P}—ëÍÃÀ>)vˆLõgû¤|ċüǁ}R¨>ù”جÇ}ÄàùˆB¦A€Òs€j¢;<¥Ü(µè+µzƒ19ž{‹ŸT›®˜÷ÜâwÅäPǪ«w D•á#iV}É/ê7ɍÐÈñ%›%Ѧ«¸zQ‚¿Ò•{½­›ÛĤŒÀfÝ4±•Út™›¡¬lXå½I²ËšÐerék§Ðe*ˆ]¦ËÄnùPž`Y“½ÿï&ðœT -†(ÏF¥½~óåJʆ»ÿï‘Ρ+¾'}'¦ïG„nJx”í$sýþ¿‡/ÿS„|øò?¾e#ÿŸ*¼”Ò匲Q¾ÿOõöX&^¤zͦÁ©Æˆ=ã±+>)ý tîh¢¢ªü ¥Ó0}ÊŽj¤Œºëjð^¦ïZ¦1sõÚ>ùÌÕð8tcߕ:uIjA>u­â¾1 -v iªË®|¹S­d6Œ`Tÿ|ÙeªhªûJTYmªòž–j…Î&x\ÒÏUΫ@Ì'줠ZdN=çD@eE÷­âÄ1XуS‘®Eàç -¶WoCÚSµ]Eû*^^/Fû~ÏMhßïù•Ý(.z¦¹v¼!¬MÕýȊ¬²µYT)6Þb&ËÍú¯ˆ›²cÃw6•6§€w™²Ýç+}¨ª¬í‹|”;1Íç]îؔpØ6e!·iÖöN…F Ä´>lc Z”ÓGo©è ÇP=zÃ7uSŸøÉ/#MEÅí›ÅÀ&»œà7E…úàýC÷þñÂÒWÿÝ7Å÷þ©Òißû§hªCž?çÞ?†ÌÃ)CšÔ¹¸ßûÇ.krWÿÝÞ/©Ô@QÌF-:åÖ{ÿ4WïŽëÞ?ÕÇ·g?öOÁ—)"VnDûâº+ø\Aîà5´/®»÷~yˆ9W>:Lóz±¥²¢ƒ_’QTÑãhß6—DuÍ[»^‘üÙv¼”q }‘µsã-‚\â‹¥ºÌځ­¦òŠv% Æ)Ð{X*•@ªŽh¯J¼¬]ÃR]"Ó&W¢} þF –ÊùR‘“(ïÝ ¦'¨m­bzªRuD.þC¾çð H¥ao`–=:ß,F ’U‰¥Rg1NŽ"‹‘"~~î6ٙ¥—Îå¸w›r¨IåŸy¯€L{ΩZ Ӟ†»¥@·wZ6)‡dHS6ž©Q¾uq¨þÌ'™‰ÚEk F%û:î´Iñ”Õ¸[nG=å_I‚ô(•Ž‡qÒÓhÁB^‡¡† ø'®µN1L!œ¡ÃU -èÙñ5ˆH`äGüõÀŸ¨ | ¡®¦ÓÁ€Ìý:ƒ,2ïp9äñ€Ö0±¬ -5´èj:ù[Ýݞ -ñ—¢ -ç D\¼Õ¥ºK]M‡†S9ª3<à[².Œr1rǗ¯¹2ϟ‹îõ?l_EÈ<³$ΚÉÞM|˜ø¾ö&CÕû¢¯ý9< …}äÛiB âÑ-O5kµd©ç&ߗˆª†½ /¬u(ÁKFYª‡c3ª•¥ªÚ‚Ä1@x`š€>уaNõf?jÊ Î?¿Rå4½Êõ¾ìd§rµJÏ-}ô !: ‘9ÊDoL?‰[°2çƒüšÅ®|*³3MLo;Jýôµ+ÔÔÞ.ön̈6½®e#)\(Lܒm¾PhÖ ‰[²{eÔôÌ(Ÿ!¤v—+-›µ%ŽÜªˆ;õÓ²‰[²ÃÇw šuSâ–ÍòíúÆ åP›×Ó®oºðð1D¾ê UÝSøø…‡Ê· -’ȹðPÌ«‘ÉÞsᡌJßv(Îå¸ûÂC‰D;Þm‡¼¨{Ñ1 õ:=~á¡òm‡Œõð…‡Ê)Þ"ãöþ …02q¯5gtÝuá¡2لËG/<¼ªžsá¡òF³æ¦{ -ï>o„·'ý؅‡‚Z.,ü{ $—Ê@.Ô¥öÞtᡲ™OGn¿ðP -rÁì.6$ï½ðð*hI=JéÂCå½ëË´„;/<«ðé{Mõ‹ •káº$*zøüú¶C…$òÛ.<|—ÞpE¡Höþ •o;ä6V¼ð'd·Þ£Ó$/il˜‡7»Uª»t_ÝæŽ5ì2ƱL²˜Ä2‹iËVÞ~Ž/ï‚iµ4Á螴Füo}̙j!B²Š‘-ߐA÷bÎÊÜ&šXÂi$¸Êpdúᢴ¼Îq«Ÿ'¸‹«5‡ßÜZ»Ó؂Hà4ÄýV´ú´??‘ZkU—¤°À֍»Ä–+i-ûÐ×ñÞO‹væ 59a…JT[Rx(µ;qØ/؛x¨¤= ʐDÙ>Õw¸m¹Œ‚O­=rÿ1çZç@¯»ôŸ†™NôjHýé{noäÌԅ¦ ãÞ -¿ZÑW86Àb±Ã_ìt’›®èƒ9]ï˜Ó“Ç?ÛÒ1Ql·?±Ü$ßÉ Íý"nÃ~GL;‹kÚözΘrùÙáOU;?@¬*Æmªƒ*5õ¦øC iø4WA_éz§½>N\7cu–ëkxÚ°¡§„ÙdÓp°d0³Þ›ú+i ˜ñÖÒóãt@‚)ùFîÑ¥éËêå†Sª>$iwW‰ñªÄ/Ç°µ:x£M÷[Â÷93!­M˜{u- Cm·O°#2réÃá’%Â|ž­™Þ·mœXé\ÄsP\J÷ò8P"=­xèO›&>ÁíÕô¹?@ëAšÇCú±„ãÛöPu {qXeρ.Û"†`ü£Š†ç]ùÈÜùbšÓ#xÍ…fß¼éÙs[ÉV'{3áõfÔÖ¦à<¹bS-¹q,-‰÷颔.æµu΍Ę{HSl˜ÄÀí¥ð£I×ë9?g¨~:QG\¢é¦€!Ô÷ПÒã[ÎE—ký$ÄÍ©¤Ÿ™ôF7…ó¦Öø0’{¼ ì„RàOϑÓÎK) ë:•¹{µµç ÎofÌA´G½¯©sº—™wÒ/³3™ú,¼äÈC?<ôl&±-yøl3}sž˜VG%²Ü·À²ž,A€~‰[Ö¡*0Ò²é)ü°ûž@…š)µ:֐°2¥€êŽRb$2L] Yu®¢ù(VøþuáSý1NíIG1WÒÙ.Â͘5F^|RʛÁÌÜtáP¨((ò¹’þÏÒíEèä$Ÿ|iŠÑæj0ó'Îu»W ÃÓ¯Êë…E]‚;ü—‚a¿äß¼é5ÔeyxyÇ2\0"Ý:ü*F–¤×YöŸ¢ød¹Äœ«÷ }# ‘þIV¨B§ÏùÂY—á°íÀà‚`yíÇ sÞU¡6P@>ƲÙûá'ׅ§$ (_àjG46ÂRC„cóׄ®žRoÞ+ "ëÒn‚ž78ƒè€rœE)mŒ>I„².}êŸè –ªM®9.ƒÖ[t®²M] u%žçrE„L{†ýÂ.ñހ½a»FõK囷¼Æ -´ø%ª÷ôï@¸˜šYF´;¯Ã­ë|Šêð07Cg°8fWJC¿8Ð: å€òCNÜÖÒ§ ÒÕ®R”ÅûÐN—ÛepÅÞ@cû¨KüxvÐIQýD¨˜9Ì°é¢$Y€m³¹’ó;>í¿•è—–ƒð…áØ$Â.”•Ó°Bg‚1/UËðæpXè¿IÀi/É#sËk¨7„ÍëzYÀ›£F@ø&Î0賆ZÉ'xÃkȲ¹|“ƒƒ] 4ÐP…E½„ùǕsFŸ!Ȫ¼s5ÙU°ÂñÔ¥ÝéH×Í9»¸%9KSñjèø ˆÓ/1aZöãx¶¹Ä±Eê;ō'7· Jƒ;õc`ñÁH(ñazð3A óZÀ‚ÉÀÅéĪ˜"̯Ú"¿°9-wA_W1©ÂPT—×ï -Àœø„A½Æá- –ö5*—Cõ›8Ýõù&jÖM¿fi7Øþg€Dä<ìk9WÒ`ŒqL»õÍ[xÍú7R‚ª¬e gæ F.2z00ŸÒNÂÜO­±3´@)å2¼å€É±ðE€òšsà*l1teA¢#†³ €É`Ì`…lÄ*R0F¤0—¨”Ú"|†óÊÅÊhõ¤ÙUQž76t—ô ¾b¡‡”î×|·\¹íÍË×xˆ–5FTh Ê m`ôã~¬ˆÏ Ê˜å€©ñi-© JوGŸKI^¤?1º8½!µzràaB´Ç*wPµõMMíàgÿ™*o˜ú‹"[‹h#…»ÃvjOùԄ)Ðuqî}MêÓLSAèUtò*À3,΅۩²æL(‚ lÂ&‰b’Ε-E1Iæ·Öžù­{p®*¿V.⊵ފ __7lÀ÷Åu5ô€Öpè§ÆDuÍøì… 27ßø›(r -»„ÝcOm³Äۖ1ðQ­ðw v¢fS¬¿¤ÄS£ŠÆÁ嫬éCïˆ3©êhªÓJF“u‡ÿ1ç!¦u´['I…ÛÉ./€‚íž/ÓD_û²ïÎR-â;/èhŠ^|ÇÈ2¡ÇghÇD#Bñ!îâñá5¬1|p;9>Àæ¬yWš£}WE&PÀ˜õ/ÃË«v–4Uî,DUL@ ¼Ú ïa-Ç­ûØ7¨êª3$ßIs‘eBîÓ¡ûn2LpØ4è MZøøˆãÚÌ02ˆË]‡d ãÞÂI$%ª„’_®³ÞÔ@梎 ÉöXGR»hj1LSߑfЩvD䦧-p²<"ÚpÂ*U £–p£Â~­#ãðW«¿Áý‚­oܶKa’QÉM§ÃQG]6—´²GYZú×^È´lro¦‹Â³WÙ¢¯î·ôèô˜¤Q·*="i%·CT¤¤)Ö1ˆcKšñËô˜¤a¿f9IS]GÉj»*%ü -8Np’6ð‰z7QÐX¶”v}½ŽlIw}Þ*TÉd›¦ÛáE#in²€ëòˆd—î«s_¹» r<éHNwªMf#_²#9{æŽ9¯À[¢Å´»æH.V#®4âuâüE:ç>9ša^“ÁëcKÂdiµrà/ҒínÄ¿"Z¢F2âvLõ>ûCb1µG"n2LS±4ÑuxSò“]¥êœÆò1þ×\%ÎÿZm&è-nB¶¦(Ço×NÝé˜uØIŸÇÙRê³l<:kí¨ÑWìÅ*Ìâ{0ÀÔÚ?ȶÖÚ3U´6slª5D*=fÖGmW„Ë_•#ÍÕ¢¹¸R6ko…^ z5 dÁÜzÞÁ®—‚ô'jÿ;»¦_€s™ˆd×JÞ@:§6Þö¬¸îZæìVè5õ{›‘`*Ñ4„~™Íúúñг™Ì é^¦‹ ¸­WyˆTcÂ;F¸Í,‹¡¢¶êéÍI>½Û+Ɨ<”'ÝÝñ³f<#ß«‰t7¨î%>l›þd¢·úL³&ë]£Ý銷:×G¸UŸì¹r|oãX%‰ ¡ù‹@ hÓyo€¾ cÑJ sËU†w)Fz¥vžŒ‘Φé´ùÙ£m¥Ëq9·iñ¦(2Ñì§T°ŒÓ©y—ï2Ùvª^ﬡ̵öŒüÖ¨7M 6¦å8Zþæ_ƒVç›' †}—|ØPöƒ}!†³°_;b¾z<áJ”CzäP’Ly3cE¼Ÿ±FÏNø»²+Öt»±ùº™ Ñ L¿`o¨®­Îè@©“±ØÝ1±‚úN0yE½ñØeHœ.ƒÅB‚A˜c(ÉQï¬[èBKW"TóÁLW UDÈÃÒn—>p¢ï¦އ ÔfÅà‚Aw]úYàï¸,IPs> -¯Y÷!¦Íôà—I>‰6à¦}ÔqôBñü¸¯æ,†-L57xÀlõf€ õ0Ž•u®l¸Ÿ•wSÐל‰Ë+ ÷=íί…; ÷á@ËÖt'…F¸YÅÏ«¤µËå~*w¤òŸ6Œk­ç`оš-º1WÏG›Ÿ½ÖÖÔÁSã»Ö0^0q­Óû:ðÓüԃJ´¡µûí-øµE%¸éR —§¡N²¦È1âéó¯¿È¦l\¾­&;ýO=D»“=_¡0Ir*ÉPŠ‚ѼTRH,d€^UÃ!•¡\þ›™0éÞ2Q­q×4P—yèÓ¾ƒÖhÒ{´†Qà¤âNp£Ô9(PÝœÉÙkc@,«w¤ó•ì· ÒrF¶‡´ Ón’üÍOfm¡ËQ¶Œ“2ÑA¤+ƒ³^¬KçhUž7† hã/¦ðÀ´Q{T:"‡ID!v§0¥éF0jLà òe=< ½ŸFÐt%ö9Ò0Ðæ*ø*½˜óáSN¨’xv¯wÓúx¨cÒ®Ek@(YkåEø2bDÆÒøôU›cÕižu¨S§”ÉÁjԙ±G0è´²_u™±ŠRâìë̲ý¬ÌLßû¸Î 44Ô.]!ojU6ÌÙg¡äÛ+EQR#=ƒ„ëâ·1ey¢ƒd†¹Y -+q˜áÍïž Ìö†Zêb–,1œf¼€Lٍ´+Üqñ‚üp &`ëàÖ?n™u' ²²8ÜÃ׃ÎÝô†¤Öe(/}@{{ 0!-@|ž^ƒèM¨¦#t‘P?7|ÌY!GxÄۄ0ë;1¬húÉSÛÖ¯ÓÔ®MXì9çj2@Ø(аœ¿#¸ý5V§Ô:Œ*_ˆ,¥ÛSÐÀ® ·¥*@–¾,eF±»Œlò•3ÒÌñW•3«l î¼Mk茵B˵AåYE<ÔÚö»Ì%ŽÁ¯M­m8íi­Ù}TkO¸&P%'èߦŽ}õP¹óÁ©i ˆù<5}ЊÔô-dPÓì²öwÕ4µSÈÛ!BjšxXMS)ö¬šf<•jÚ|©¦%’G€‘$«¡‡ÞVXçCðlt ih¬PùhÞ¢¡qè–$ўÈbV§¡aL–JºÏàihÆæ}‚Á›ÝÁÄ·`²Ž´ÀÖ…ÁÅÁe³ºD•qwœ”ëLe˜2é˜ÊQ°4#ZxÊfÀ'¥fæ<ÂÅ¡ƒ®wÜâù>9@T¿ (bBµ¶Ó³P»{í<¯0ÉÙCYñ=ÌZ#ŒA†~"P‘ YÏPßûàW„µÑÂOA@áõì2˜+>àDB"…ÍKg‚ºÏ6wn´‹k!KP]'a^v€ÒÕÙT)A-ØÉÑnL— ›ƒ0@@ -$bƒZۋgK¥0´L†JÏCI‰€Û,Ÿ…/Q·‰šÁW”³à(€·‹{Š½OC< ì`{‚i •¾“Òß6"Sgv~mð6ÒÕ¶¯U^7„O߀M¨ë\¦0ŒÜ -/‰»X.øÛÁék}{˜<Ü<½Ÿ²šY½…Në²,ðŽòx«•—ÄMíØÖé ys,b¥:é9½ëçÙÏÞ¦Ä'7þ?|ýni f Š`½ój ÖÜYôŸxÀ/zRtª|X¾MO”D²o ­dd@M+Rl<ˆB2æ왋ª“I$˜[ܒê÷`=îËübz•g¢ƒ‚¹ÿÞåÅl³›¤Ö áCij…MÈãŒEø*y-«6.!¥ìÑB@é{‘:kùù*‘ÊÒäiCÐL50ÅS+¥ ÆE¤ì¹îž’偞f‡¶D%Ώu 'gO!žµ§œ`íõԉ-Òú¼DÌFǙ²hA)ŠhZ³¢5èógXà¢~(æû…Jƒ{+F°èÖìaÄRfõä)›ÅИ‚ŠûpŠƒL4"ˆ4.´‰C”Á @ËÙ ˜ûu†›=Râ•á§lhÿ+2a¾h„)߂ošÎP%®Fhð[Ôß CUïÙt HÁìõ_t%F_*`]TÌ s¦ÐEQßÄeÌbx’ÕòPÅ× @E°Âø‹«xæd“ -"θ5֓³|)¾@Tuš3Û.O»FqЬçi'l»ÏJ’ÄúÓ$I4ÒÉQyšM’.[Ýp¿›­ϱŠYç•lDøò”ø{"ƒxL9"¬Dæ‰a^8ØèêL{bDùƒÜPQ‹ôa«rDXf¢LDؽ¿†éj2aÆ:]ö£Œu -m‘Ï#ŠÜJ¨òª3S/-”ê´™J6 ?_laScè˜JG«ÿf'¦ þ-Å\å쬙‹Ã43¥0秱Kd"S–ÍCV2êœSÙD¦D€³’Í÷ZÉôútǜ«G*@GšZ¤ë;xdjÿÂ,ª–ÑÆeJM¢ f¤&á³™¹0^ì…ÈK\6TLÅ¡éh±+q(±Ep—å…Še­çj¨ØŒáÖ5XIHó8̨ÎJ’>eù¿RuƋÁp.Ч†@k´€®ôGé^ê§_4É<ÙNžÚ‰œwôf ¸Êcw#ךÔëê€Â§Oúç§BaùbVOlÇ]pl@•î][fغ(«œ8Åz òâïòµŸÆ4£°ß(¸,ÜawrÄã½Màƒ‡Ü* ‰ÒdhWœÁiÓ8陡àD VÛy’vsÁ_ ø³™D5ÕGØNðz$w8D#ÐÍz#3Ízب¬2|ì ÔÿÊV#sTÔÓÀÙ`ÕÚu6" -'4UäT/‡u¬ËÚè -:Ø Ç4~Æó›èÄ -ÃÃS6ïº.çfÅ'´[8¥†14õ:- 'SWBJQp‰Ôaðé§È€/`|"A0 ‘Òçƒv æ«FŒÐسDºowÑ÷K&ÏÍ"µÂÝÏÕü”Q%t»)ŒG܏–fx¬ÿù ÐìÆH—FÚ';C%¶ÓZ‹PÓðê ÇΙP$‘9®-toиÎFï® ¯) çì›<86ÿ쇨›e• óÓØ3%DÀè)ûÀÎ0ð±hú"Gð Ë2Á¬àcPp͛lÄÂýÌ?¸#›²ñŒõ©ó °ïÃJÙ?ßg𠆣œ"˜!ӉªÔ!põD­œ,­7UzÉ*1H«i[yKAñ¦ö4¯ªNúŠX2¨ŠÓoT›¨^x{ø­_вzeOK0ÛÝиmðx#Œñ¨=¼àUø‡çC 2¹Lø‰Uæj)" -C2ÙϞ™¨Ÿõ+²7{DŽ çˆø<âôˆt.F–nþa1+/m;}âD53ºÚN$ó”Õ 7 &Ÿ02ßƹm£ut ?¹ØOnª2ôô—§GW ìT8,=vÞô0ö.h´²Ç9ô\üƒ(Òk=홭¿=LozޛN Ñ°(<îø”OÞ!-PéB¾~‚?Ý6ÌôøÄÙO¿\y醿¹E)#t‹ª™Q«›J[ýæL†,·üôtúñï'èE @ÒC§ˆœbúxŠH—:èèù„‰2n_, /;M•wá¡ nTúê`5¯^°¶‡‘f+­ˆÁ\â–ÓÝ" ‘‘0ƵŸpl ^„ª žön¢Î;W“ƒr¢Å€"f äPHŒv/™3"è?HMÓPD}p!àŽn cWш•÷ÛX—Þu4…Îc02YS§;´*_+—­3ÑQ:èh:@ìƒ[]Ôá'Ð=‚Öï²Â7·—nùØR¹©ôÙ -†t_uf› ö@¯ª{û߀óá ¸<Ðgí¼™*‡ÕrõûǦù'¤ùǙÈãxów¶ÍæóÆü?Oéíôü3ÿ=ý þq&ê©|ÞïIϧÛÙüu¾ gÄI…!Ú½uÉÅ»)‘^²ëÜK-2N/°nT´_©5î{¸Í/ՂqÿWÌîSÑ~Sîhƒ_»Z…‹þ\M€ŒcËKz~HžIk¹Ôi;ä~F,4”€£5¯ÅÇeؙKôŠÈ‹;Oؖñ/€k*Ž«U{£OûpS#.À-æ7ØÃ7ø w,fp'9wÓqU¢³ªÇüÙÇU‰ÎªB¶²ŠãªÆ§³ ûÌüÅõA4­¸•Ì-Á4v3Æ<Ë;ùG«(Ù *Œ sz•J»šr±¦|}s•ÑQ§à· 2Ô,Œ»š^ІŸží~ ;*`|ß+NèÌØÐёàkÕk¡ÈùÞw±‡TYy… -언³µF¯¸™–vŽÃv ÿûê®}"3·ëÃ÷GW)UÐR]%ã |÷¸qÞHçgíe^@ƒ.ÆæÍð…9Çjìf{?æ Ù¤‚Ô±Öؓ¦“–þICg+€O}œ^˜&"È`¼&cÚ¢¾Ìܨz|×5T¥@ ¾v˜Ã™Ö}Œù4àdnÂ% 3ïÁ@ë2Ë1*ï™S¹Ö?^žÛ8˜©/o¦BoéÉåVp¨uË­8uüy3¥Eæ4À d.Ácœù4ã›Òїӷû¢9žS+c1GC¾–]WΌʯƺt†GVÈZá_Ÿ^.ÒÁS˜RP2>¶ÂÞ(Z ,Ÿ(Tš¤­5 †lw´æ·ž‰V¢çà;T°9*‹Ç¼ÚDµößêT¬á&¯¼ñ‚&ú[Æ ³ú—¾Nû‹Æ ²\¨ðÜ_5^˜Ç©óQ¹ƒSiaÊHr*áé:’\Ý/ø7‘ä,á¯"É5Ô °É¿Œ$§“)´I®¹@Bþ$¹⡓ݾõï"ÉÙ使‹$g’÷þ2’\Ûû7‘ä>Úîï!É5m§þxƒ;‘äHü“‘äšû ñ·"É%¦çß@’kn*߉$×Ê IÈ 0ù_F’ËIړ‘äò’öT$¹”¤ý$9+iI.’´¿…$×ÜpøÂHr ‰ÿ»Hr ‰ÿ›HrH‚Éÿ2’\sÿ$¹†ƒÄÿM$9‘þ‹HrÊN»†hIÎh¿Œ$×È@⟌$—PIÎe9ˆ‘ä“JÝun]ûŒÐ70ngù—‹§qHÀ±Þ8¨=z÷³‹.k Â;Œ_N{퇑ù„›Ð¾íóΒ†°'b£œs¶_S浌“uñ!–¿yiübc®[¡ìƒŠÈìRKöÎ{ì¥}ãù”-{äÿ›ÿ`éfµ‡8µ) U•R œoô–¥p+ô‘}PJ Um…>²J…Tî[Þ¿ªùGõVè#û l¬óúV¨õ}P ð¿¾úÈ>èÅÆãÕ îÚ¥$MÕVè#û ÌVÚh❡D¤Ónˆ&ÞJÔüs[4ñÎP"?5DM4ñÎP"•rÃVhFGó8>$güÍNðó+ø©>?w¨ˆg˜œ/W¿¥ñ¿ç`¹ÁÿPÿ0ðþŸðÀ UøöÇ,M4ÿ˜òÓí¯ùO &z ‰Ã)½šžVÛßñáß‚è·N¹Ô̧ÿÿÐECL 1Ø”¿›Ñë6q¨ùû“€:ÿ‚Ôá_Œ¦~û7üVŸ¾ÁoÿúƒcÊúŸØŸ™<¬iþ!ܘ#àýc'|¸#@ø|€Oãö<J ™oæ?M¬o¶»ùð°Z~dZjÂ~Ûåó˜ÿ8ë§ÃêwùǔL&¦€¥µíi +ö ÿ“Ìñ¸„ÛE€æ¿÷ÃÖ^ÜáóxýàGð ÷x]·7u3_ȶÔ~_Sþ'vðsþÁX!Ã2ÖüãòøþØÝ~ŠÇ/õ¹D&Ü¿ÇáwTwù^ó³?Ѕ*:™\-©ÑN·›óÏñ¡ÚïrA¢€£¿ßø샭rᯠ@Ê躨4ÿ3û¦Ê&ÖƛÍ͍Ä].–ƒ<2üó}}²ãqyqö—sx½H®Q5pÜ×Ø[Ò3|Ÿ¾Ô4¹”¤•ÐHEØíZãi LVk$~i <þù0¥*oõF­™jä+of•Ú„WÅpøŸ„ȯüªÐ5Œ–QRԏöÇ sC`Ž| }ÿÌó¿³ùÒ?ÔOÛÿÙ`kዝÈMZ 'ìÌ åž üZ⾺@r½hLQiñwºø/3N+Pùœ©íïbõ &=_ØBâö.ñ{Z7«ñê*FŽÛ,§@[g ALæ?ð®â›8…+qŠ <¯Çõ"îwàn1Çá“ÑDßÔ&ê+æò ´¥Ï>Џ„Ëëp{=P…b~‡ i Q+Å én2ŠÒ¸MQ>Ñ··à±1!”ÆÄíñ807+•HåÐ2†>óä)*ñÓÿãRéR亃{€üx] N©Õ:ì Œ€úw9<­Ö„s`@·÷Ñë ÆóBƹ˜Ïƒdõ²VE¡ü/—Éÿ»"éV Sà1îÁ©éN¯š.æð`žÅs ‚ìonÁoÔ{nÄñ‹ºGØ>Ìðþ—Â­ xl<ŠÊÚçBv‡êW?Žá”qåBS˜”îõÝM™!nÀè€à7ô"æ§tÉEmÿŸ„´ýôú>^·ñj­§åqüó?cÊ´™ïÀ£?ËÃü†dþçøµýü¾Ä¾<¸JFóÏÿëHM -endstream endobj 8 0 obj [6 0 R 7 0 R] endobj 32 0 obj <> endobj xref -0 33 -0000000000 65535 f -0000000016 00000 n -0000000161 00000 n -0000036442 00000 n -0000000000 00000 f -0000038583 00000 n -0000038260 00000 n -0000038193 00000 n -0000172001 00000 n -0000036493 00000 n -0000036872 00000 n -0000059600 00000 n -0000059487 00000 n -0000037450 00000 n -0000037631 00000 n -0000037679 00000 n -0000038467 00000 n -0000038498 00000 n -0000038351 00000 n -0000038382 00000 n -0000038718 00000 n -0000038743 00000 n -0000039206 00000 n -0000039476 00000 n -0000039545 00000 n -0000039817 00000 n -0000039920 00000 n -0000059674 00000 n -0000059870 00000 n -0000060879 00000 n -0000063054 00000 n -0000128643 00000 n -0000172030 00000 n -trailer -<<79573FB5A12BB140AA20EB4EA35A55DA>]>> -startxref -172217 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai b/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai deleted file mode 100644 index 8ea0a6ef..00000000 --- a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai +++ /dev/null @@ -1,1213 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - logo_blue-orange - - - - - Adobe Illustrator CS6 (Windows) - 2019-07-16T17:01:17+02:00 - 2019-07-16T17:01:17+02:00 - 2019-07-16T17:01:17+02:00 - - - - 256 - 68 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4ql2ia/petQTTafN6g tp5LW4Q7NHLCxVlYdulR4jL9Rpp4iBIcwCPcWvHljMWOmyY5Q2OxV2KpfJr2lx65BoZmDanPC9yI F3KxRkKWf+Wpai+O/hl400zjOSvQDV+bWcseLh/i5phlDY7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+UtK8+6l5N/MjWL23rLYzX9wmoWdaCWMTP08HWtVP 8Cc9Kzdmw1WkhE7SEBwnuND7O95WGqlhzSI5WbHxfT+ia1put6Xb6ppswns7lQ8bj8VYdmU7Edjn neowTwzMJipB6fHkjOIlHkUdlLNiv5i+ftP8maE17NSW+n5R6daV3kkA6ncHglRyP8SM2XZfZs9X k4RtEfUe4fr7nF1eqGGNnn0eN/kZrGo6z+ad5qepTNPeXNnO8sjf68YAA7Ko2A7DOr9ocEMWijCA qIkP0um7MySnnMpcyC+js4J6N2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvDPzgvNWf zVJbXLOLGJI2so9+BUoOTgdCefIE/RnE9vZMhzmMvpFV+Pe+j+zGLENMJR+sk8Xfz5fKnoX5UXuq 3flKOTUWeQpM6WsslSzQqFoanrRuSj5Zv+xMmSenufft7nlvaPFihqiMdDYXXf8A2UWY5t3QuxV2 KuxV2KuxV2Kvinzd/wApXrX/ADH3X/J5s9c0X9xD+pH7ni8/95L3llH5TfmdceTtU+r3bNLoF4w+ twjcxuaATxjxFPiHce4Ga7tnskaqFx/vY8vPyLlaHWnDKj9B/FvpfWPNWjaZof6aknWWzkQNamJg 3rFxVBGeh5fq3zy3W5xpok5NiOnW+57TQaSeqyCGPe+vQDvfPf5w67e67oPlvUryglluNTCov2UQ G2CqPkM6n/ge6mWfFlnLmSP986/200cNNmhjhyEfnyd/zjn/AOTAk/5gJv8AicedD7Uf4qP64/S8 /wBkf33wfSeoahZadZTX19MlvaW6l5ppDRVUdznn+PFKchGIuReknMRFnYPE/M3/ADkqI7h4fLem LLEuy3l6WAY16iFCp4+FXr7DOv0nspYvNKj3R/Wf1Olzdsb1AfE/qS3S/wDnJnzAk4/Suk2k9uSK i1MkDgb1/vGnB/DMjN7J4iPROQPnR+6mqHbM79UR8PwXsvkzz35e836ebvSZiZI6C5tJBxmiJ6B1 3FD2YEjOT1/Z2XSy4Zj3HoXc6fVQzC4shZgoLMaKNyT0AzBch415z/5yL0/T7uSy8t2iak0dVe/m YrByG37tV+KRa/tcl9vHOs0HsvKceLMeDyHP4932um1HawiagL8+jHNL/wCcmPMaXIOq6VZz2xI5 La+rDIB3IMjzA/KmZ2b2TxEeicgfOj9wDjw7ZnfqiK8vwUw82f8AORt9De2x8sQWs9hNbJJML2KX 1o5y7h424SouwC9K/PKdF7LxMT4xkJCX8JFEbb7hsz9rkEcFVXX+16d5C81ah5h8hWnmG9jhjvZ0 uGeOEMsQMM0ka0DM7dIxX4s53tHRwwak4ok8Irnz3AP6XZ6XOcmITPPd5T5Z/wCci9futbt4dct9 PttKpI93NDHMJAqRs4CcpmHIlQAKb50ur9l8UcZOMzM9qsiuf9V1WHtaZkBIREfj+tMfLf58+ZPM Xnaw0ix0q1j068n9Pi5ka4WIVZ35qwSqoOVOH05RqvZzFg08skpy44jyq+75+bZh7UnkyiIAo/N6 X548/wCgeTtPW61Ny881RaWcVDLKy9aA9FFRVj0zn+z+zcuqnww5DmegdlqdVDCLl8njF9/zkx5q ectYaVYwQdo5/Wnfr/Ojwjp/k51mP2UwgeqcifKh+guml2zkvYD8fJPdN/5yRgudIvlvLFLLWYoJ JLFqtLayyqKqjAFXSvz+kZhZfZYxyR4ZcWMkX0kB9x/GzfDtcGJsVKtu5Z+Xn55ebPMnnHTtFvrS wjtbxpBK8EcyyDhE8g4lpnXqnhku0/Z7Bg08skTPijXMjvA7kaTtLJkyCJAo+/8AW9V82+btO8s6 eLq7BlllJW2tkIDSMNzueijuc4HXa6GmhxS3J5Dvet7N7MyavJwx2A5nueaSfnf5hM/KOxtFt6j9 2wlZ6dxzDqP+FznD7RZb2jGvj+v9D10fZLBw7znxfCvlX6Wc+SvzF03zKTaun1PU1HI25PJXUdWj agrTuDv883fZ/asNR6fpn3fqec7W7DyaT1A8WPv7vex38zvOl1putx6YdN0+/tlhSZPrsBmKu5YG nxqBsvhmu7Y7QljyCHDCQq/UL/S7X2f7KjlwnJx5ISsj0yru8mZeRtauda8sWmo3McUMsnqKY4FK xgRyMihQSxGy+Objs3UHNhjMgAm+XLY06DtfSR0+oljiSQK589xbzu+/OTzNb6ncWq21l6UMzxBm SWvFXK1J9WnTOfydv5ozMahQPn+t6rD7LaeWMS4p2Yg8x3f1Ux8xfnVHBcPBodqlwqGn1u45BGP+ TGvFqe5IzI1ftCImsQvzP6nF0PsoZREs0uH+iOfzUNB/Oyd7pItbs4kgdqG4teY4A9yjFyw8aH6M hpvaImVZYiu8fq3bNZ7JgRvDI8XdKt/iKZF5w/NHStDdbWzQahfMquQrUiRXAZSzCtSQagDNhr+2 YYfTH1S+x1XZfs9l1A4pngh9p+DD7b879fWcG5sLWSCu6R+pG9K/zM0g6f5OaiHtFlv1RjXx/WXf ZPZLAY+mcxLzo/ZQ+96j5a8yad5h0xL+xY8a8ZYm+3G46q1M6bSauGeHHH+x43X6DJpcnBP4HvCa 5lOE+KfN3/KV61/zH3X/ACebPXNF/cQ/qR+54vP/AHkveXp/53/lP+jJZfM+hw006VuWo2iDaB2P 96gH+62J3H7J9unO+z/bPiAYch9Y+k9/l7/vdn2loeH1w5dfJJvLt5dz/lcsE0rSRWusFLdGNQit b8yq+A5MTTOL/wCCZjiJYyBuef2vbf8AA6kTPID0H6Qg/wAwf+UM8q/8Z9T/AF22bT/gZ/4tk94/ 3zrv+CD/AI3H+r+pMf8AnHP/AMmBJ/zATf8AE486n2o/xUf1x+l5Xsj+++Cb/wDOR/m26l1e18sw OUs7aNbm7UHaSaSvAN7IgqPc/LMX2W0URjOY/UTQ937f0N3a+cmQgOQa/KL8ldN13SY/MHmIu9pO x+p2EbGPmiMVLyuKNRiCAFI8a49t9vTwzOLF9Q5n9S6Ds6M48c+XQMy8zf8AOPfku90+QaHG+lag qkwP6ss0TMAaLIsrSNQ+Knb36ZqtJ7TaiE/3h44+4A/CqczN2VjkPT6S8L8n+YdS8l+cYbw8ontJ jb6jB15RBuM0ZA60pt7gHOy12mhq9OY8+IXE+fQui0+WWHJfdze9/n75nn0nyOLazk4zavKLYyKd /Q4l5KEfzABfkTnFezekGXU3LlAX8en63fdqZjDFQ/ieMflR+WzeddXmW4la30qxCteSx05sXJ4R oSCAW4nc9M6ztntX8pjFC5y5frdNodH40t/pHN7hP+Qf5aSWZgSwmglK0F3HcTGUGn2qOzx1/wBh TOPj7R6wSviBHdQr9f2u8PZeAiq+188+f/Jt15Q8yz6PPJ60YVZrW4px9SF68Wp2IIKn3Gd12bro 6rCMg26Edxee1WnOGfCX0N+T3/kntO/4xXv/AFEzZwvbn+Py98f9zF6Hs/8AxcfH7y+XLO1lu7yC 0h3luJEijB/mdgo/E56NkmIxMjyAeXjGzT608oflP5Q8r3FrfWNu7apbwtFJevI5MhcAMxQsUX24 gZ5lre2c+oBjI+gm6obfpes0+hx4iCB6u983/mZ5ku/MfnXUbp2Z4o5mtbKPrxhiYqgUD+b7R9zn e9k6WODTxiOdWfeXnNZmOTKT8A9m8mf84+eWLbS4pfMsb6hqUyBpoRK8UMRO/FfSKMxXoSWp7Zym v9pc0pkYTwwHkCT83c6fsqAj695JH+af5GaNp2h3Ou+WvUg+ooZbrT3ZpUaJd2eNnJcFBuak1A8e uZ2P7Q5MmQYs2/Fyly38/e0a3syMYmcOnRgX5Kf+TP0P/Xn/AOoaTN12/wD4nP4f7oOB2d/fx+P3 F69+d+m3rNp2oope0jV4ZGG4R2IK1/1v4Z4T7R4ZHhn/AA8n2H2S1EAJ4z9Ro+/+xI/JVp+W+oaY bHW2e11d2YLdPIyJQn4eBr6YoP5xmD2fj0eSHDl2yd9/d0+bsu1svaGLJx4aliHSr+fX5PQPI35d af5emlvnmW+u5CRbT0oqQnpx6/Ew6n6B777s3smGAmRPFLofJ5ftftyeqAgBwRHMd5/UGAfnN/yl 6f8AMJF/xJ80XtB/jH+aP0vT+yv+K/55/Q9E/Kj/AJQWw/1p/wDk8+dB2J/isfj95eV9o/8AHZ/5 v+5Dw3W/+Ozf/wDMTN/ycOcTqP7yX9Y/e+jaT+5h/VH3PXvLP5R+Xo9JhfWYWur+ZA8v7x0WMsK8 VEZWtO9a51mj7DwjGPEHFI+Z2+Tw2v8AaXOcpGI8MAe4G/m8089eW4/L3mKawhZntiqy27P9rg/Y /JgRnOdpaQYMxgOXMPW9j686rAJn6uR94ZN+Wf5eafrlpJqurcpLUSGKC2VigcqByZmWjU3oKEZs uyOyoZonJk+m6AdR2/23k08hixbSqyW/zR8g6Rodlb6npKNBC8ogmtyzOoLKWVlLlm/YNanHtnsz HhiJ49hdUvs92zl1Ezjy7mrB5fd70V+Rk8gvNVt6/u2jikp/lKzD/jbLfZuR4pjpQafa+A4Mcutk fc9czq3hnxT5u/5SvWv+Y+6/5PNnrmi/uIf1I/c8Xn/vJe8vtSWKKaJ4pUEkUilJEYVVlYUIIPUE Z5JEkGxzezIt4r558j2PlLy7Lb6e5Njfar9at4DWsINuVMfIk8gCux8M1vtl2hLU4sZl9Udj5893 o/YnTDFnyAcjG/tDz/8AMH/lDPKv/GfU/wBdtnV/8DP/ABbJ7x/vnQ/8EH/G4/1f1Jj/AM45/wDk wJP+YCb/AInHnU+1H+Kj+uP0vK9kf33wU/8AnIXTri2/MF7p1Po31tDJC/Y+mPSYV8QU/HD7M5RL S8I5xkf1o7WgRmvvD1z8jvM+m6r5HstPilUX+loYLq2r8YAY8Hp14spG/jUZzHtBpJ49TKRHpnuC 7fs3NGeIDrFnOq6rp+lafPqGoTrb2dupeWVzQADsPEnoANyc0+HDLJIQgLkXNnMQFnYB8aanNL5j 83Xc1pGRLrF/I9vEevK6mJVdq/z56tiiMGACR2hAX/mh46Z8TISP4pfeXuP/ADkfpcw8o6PPGC8V jc+jKwHQSREBj4bpT6c4/wBlsw8eYPOUb+39ru+14Hw4nuLH/wDnG/zRp1jqGpaHdyLDNqPpS2TO ac5I+StHU/tEMCo+eZ3tTpJzjHJEWI3f62jsjMIkwPXk+hM4Z6B8sfnv5m07XfO/+4+RZ7fTrdLQ zoeSPIru78SOoUycfoz0j2d0k8Om9YoyN18h+h5btPMJ5dugp7J+T3/kntO/4xXv/UTNnKduf4/L 3x/3MXc9n/4uPj95fN/ksA+cdBBFQdRtAQf+M6Z32v8A8Xyf1JfcXnNP/eR/rD732nnkj2b4r123 uNF83X0Mqfv7C+kqrV+L05SQfk1K563p5DLgiRylH9DxeUGGQg9C+w/L3mDS/MGkW+q6ZMJrW4UE UPxI1PiRx2ZehGeWarTTwZDCYoh7DFljkiJR5Me/NrzPpuh+SNTW6kX6zqFvLZ2duSOcjzIYyQvg gbk39uZ3Yuknm1MaG0SCT7t/tcfX5owxG+ZFB8+fkp/5M/Q/9ef/AKhpM7jt/wDxOfw/3Qef7O/v 4/H7i+qNaudIt9OlbV3iWwekcvr0KHkaAEHrnleonjjA+JXD5vaaXHllkAxXx8xXN555l/J7T54H vvL0/pEr6iWsjc4nFK/BJWq17VqPlmg1nYMJDiwmvLp8C9ToPajJGQhnF9L6j3hj35W+b9Rsdbtt HllaXTbxvSWJjX05G+yyV6VOxHTNf2Lr5wyjGTcJfZ7nae0XZmPJhllArJDe+8ebX5zf8pen/MJF /wASfH2g/wAY/wA0fpT7K/4r/nn9D0T8qP8AlBbD/Wn/AOTz50HYn+Kx+P3l5X2j/wAdn/m/7kPD 9WAOvXgO4N1JUf8APQ5xef8AvZf1j976Lpv7iP8AUH3Pp7PSXx54l+dgA812tO9jGT/yOlzjPaL+ /H9QfeX0P2T/AMWl/XP+5iz78p1A8jWJHVnnJ/5HMP4ZvexB/g0fj95eZ9pD/hkv83/chB/nN/yi Cf8AMXF/xF8p9oP8X/zh+lv9lf8AGv8AMP6GNfkb/wAdTVP+MEf/ABM5rvZz65+4O39rv7vH/WP3 PYM614R8e+avKvmeXzPrEsWj3rxve3LI620pVlMrEEELuDnqej1mEYYAzj9Mf4h3PIZ8EzOXpPM9 H2Fnlj17z/8AOWxvbzQrJLS3kuHW65MsSM5A9NhUhQc0Pb+OU8UREE+rp7np/ZbNCGaRkRH09TXU PI/Pfl3zBP5R8sxQ6ZdyyxT6iZY0gkZkDm34lgFqOVDSudr/AMDqccOnyDIeA2Pq2/nd7znt2fF1 UTD1Dh6b93cmH5AaDrth56knvtOurWE2UyiWeGSNeReOg5MoFds6X2k1OOemqMok8Q5EHveZ7KxS jlsgjZ6/+ZP5e2PnTRBaSOLfULYmSwu6V4OaclYDqj0FfoPbOX7K7TlpMnEN4n6h+OodvrNIM0a6 jk+ZdY8peePJ2oGS5tbqwlgNYtQty4joDQMk8e3h3qO4GehYNbptVGgYyB/hPP5F5nJgy4TuCPP9 qFE/nXzVMluZdR1yVCAkbPNdcSa06l+Pf8cs4dPphdQxj4RY3lymvVL5l7f+T35M3GhXSeYfMSr+ klH+hWIIYQFhQySEVBenQD7Pz6cf2526M0fCxfR1Pf5Dy+/7932f2cYHjn9XQdz1LzDoOn6/o13p GoJztLtCj06qequv+UrAMPfOc02onhyDJD6ou0y4hkiYnkXyr51/KrzZ5WvJA9rJeaaCTBqNujPG UG45hamNvEN9BOek6DtjBqYiiIz/AJp/R3vLanQ5MR5WO9LLXWPPmsoNJtb/AFTUI3HH6jHNcTKV O1PTBYU38MyJ4NNi9cowj50B9rVHJln6QZHy3UfNPlXU/LN7b2Gp8UvZbdLmWBSGMXqMwCMRtyoo Jp45PR6yGoiZQ+kGr72OfBLGQJc6fSX5Qoyfk/poYUJhvG+hriYj8DnAdtm9fL3x/wBzF6TQD/Bx 8fvL5t8lf8ploP8A20bT/k+md9r/APF8n9SX3F5zTf3kf6w+99p55K9m8h/OX8n7jzBMfMGgIp1U IFvLOoX6wEFFdSdvUA2oeo9xv1HYXbYwDwsv0dD3fsdR2hoDkPHD6uvm8IS482eWLp4o5b/Rbp9p EVprV2APehQnO0McGojZEMg+EnRXkxHrE/JNY/J3nrXrG+8wX8dy1pZW73E2o37SVdYwWCxtJVnJ 9th3zGOu02GUcUTHika4Y19tcm0afLkBmboDmUX+Sn/kz9D/ANef/qGkyrt//E5/D/dBn2d/fx+P 3F7b+bfljzLqq291p5a7srZTz0+MfGrn/diqN5KjanUdupzxDtzR5stSh6oj+H9Pm+sezXaGnw3H J6Zy/iPKu7y/S8pTUNetom0xLm6gif4Xsg8iKS29DHUDevhnLDLliOC5Ad2/3PanDgmfEMYk/wA6 h97Ofyx8has+r2+tahA9rZ2p9SBZQVeWSnw0U78RWte/bN32P2ZkOQZJjhjHl5vOe0HbOIYjhxkS nLY1yA/Wgvzm/wCUvT/mEi/4k+U+0H+Mf5o/S5Hsr/iv+ef0PRPyo/5QWw/1p/8Ak8+dB2J/isfj 95eV9o/8dn/m/wC5DxDVf+O/ef8AMXJ/ycOcXn/vZf1j976Jpv7iP9Qfc+nc9JfH3if52/8AKVWn /MDH/wAnpc432i/vx/UH3yfQvZP/ABaX/DD/ALmLPvyo/wCUFsP9af8A5PPm97E/xWPx+8vM+0f+ Oz/zf9yEF+c3/KIJ/wAxcX/EXyj2g/xf/OH6XI9lf8a/zD+hjX5G/wDHU1T/AIwR/wDEzmu9nPrn 7g7f2u/u8f8AWP3PYM614R2KuxV2KuxV2KuxV2KuxV2KsS/M4+dIfLT3vlG5aHUbRvVlgWKKZpoa EOqrKj/Ev2hTr0zadk/lzm4c4uMvMij8HE1viiF4zuHhWj/85AfmHZXnqX9xFqkFOLW00MUVPdWg WNgfnUe2dln9mtLONRBge8En77dFj7VzRO54vx5Mnuv+cn7poGW18upFOfsSS3RlQH3RYoif+CGa 6HslG/Vksf1a/SXKl20a2j9v7HllxP5l88+aubBr3V9SkCqiCiqOgAH7MaL9w3OdJGOHR4a+mEB+ PiXVkzz5O+RfXnlrRYtD8v6fpEbclsbeOEv05MqgM3+yapzy7V5zmyyyH+IkvXYcfBAR7gmWY7Y7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWHeZvyj8ie Yrh7u9sPRvZCTJdWrGF2JB3YD4GPepWubXSdtanAOGMrj3Hf9rh5tBiyGyN/JjUX/ON3kNJFdrvU pVU1MbzQhW9jxhVvuObCXtVqSOUB8D/xTjDsfF3y+z9TOfK/kfyt5XhaPRbBLZ3AWW4NXmcD+aRy WpXenT2zT6ztDNqDeSV+XT5Odg02PEPSKT3MJvdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdir//Z - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:541D098FDAA7E911B425F35AB770E4C7 - uuid:486615b2-1b6e-4323-a473-deb008ef2504 - - uuid:004ce5b9-fc7c-4b0d-93ee-bf4717f6614d - xmp.did:73FE812EFA94E911B987F622BD994B0C - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:541D098FDAA7E911B425F35AB770E4C7 - 2019-07-16T17:01:15+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 2883.999023 - 736.000000 - Pixels - - - - - CenturyGothic-Bold - Century Gothic - Bold - Open Type - Version 2.35 - False - GOTHICB.TTF - - - - - - Cyan - Magenta - Yellow - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 2884.0 736.0]/Type/Page>> endobj 9 0 obj <>stream -H‰„’MKA †ïó+rÜ=Ìì$™Ïkk„"Åâ¡Ô¶ -®ÒöпofZµ¢ ›¼CòäÍ2Ãí†ùÔÂäj -j§,D@)±É9ƒ®j¿V÷ð¦&EYc)‚5L^¾™ö[5\ßYØÔPŠ„²QZ꘠¬àœ!X õœ"†eTݼׄÆuï½F2¡ÛöšƒÄ}oMì–ýc¹Qø9°«hÏ蚁 ¢Ô@yàáE†»±µÎŠZH=F=û¶\  =#„ºÇZmþ^o؜#pέc‚Õ¨êå¨D[x­Á2HY„vÉpªù³p?w¸ ÆÑ[61|cu@ùùb(±@š’~)¢Æ¿§ÿXÇè[×16ï56óE!1“qÁ•3̾ &Mô_cgsy5 ƒ¤uù -endstream endobj 12 0 obj <>stream -8;Z\t8Wpt6$q9pW3/fMoQ#<;]1kUN9.WJ^e=`dXojY-s54H#9A^MR+*mmk-_WT'j] -#;[)cme0 -ikIVjo,=N%.V<]^S'sc,N,q(P*kMSl:N&aJ(itp:R0j0tZ+13jBBUqkNNYX="IScK -4d/o^m'k=:3]imh[j,Uk?rG;/,@H\QKP(l2#/8HW1!N["X\"E5d<=2d:jpA"k*##= -#5DeQPgh0-VC/3:da4A$CbSR5HH%479J[eU@N%num.l*9@u7ZGXgj7+R/D\0B.pVi -=$8!LdZ]i%[4K:;p+hhbIK\1)2-fhHUeWS1A@^6gVNApWK0)E\"4IK*8Fc&3D_5&O -CoUIBUS^`J'E'fc)#sp`Y0?~> -endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 6 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 5 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream -H‰|VXWþÏ̼G…ˆ ˆóγ¡ ¸¢Y-ŠÝØEªRD ¢‚"E±aÛ{H4j4QWEÅ^bb,ë{ŶîFŒ®1 -ÌЏ/»‰¹÷»ß-çÜ;ÿ¹óÿg 1R!bhàOïø–ÓšñŠ‰Ûèàè Øk.Û§ä hý‚ä#%™½‹X@:=¬Ò¦1`ÃvétxTrXèì%=»—ì“r¢iôYÀ9…ÏëÁ ºîÖx~€ç­#¢’Öè_Øóü`œì¸ûš®ÑAI±ÚVÕ@ÛDö—gE‡¢5<ÏÄ'±13Ô~Z~–ÇÂ:{l|hìãÁcy^Xn‰w…£`ÍF{¤¿í{„ ö‚$4²ê‹ÄkKñ›28pH dÈo-jGã¾E’ÏÊn֛P}ïÈ·Æ#jÎM‹w‹Ü õ>ÿ[Ø(J­…¥•u#›ÆMlítöŽMš9»4oáÚÒ­•¬7¸·VŒmÚ¶kßÁ£c'O¯ÎÞ>]þÒµ[÷¾ôìå×Û?àÿöéûQ¿þúxðÀ¡Ã†9jô˜OƎ?aâ¤ÉS‚058$4,³|#¨jŸÏø_ gÿ-ƟÆø—‹…IM¤aÒ$)×-ÕígÙAn&Ëõø½å ø ‡¼>·¿Žñ»ÜÞáŸb©Ç/¿ÿÐü¹J¾²»ÿÆ‹ñû6à5FVáސªª÷ÕQ]Ôê€êüZÇZ‡ZûZ]MYMi¹ÆTStïؽáo©Yž^žWaUž^Aw­Ë“ʏóÊúr]ùå*º”E–%W´,V¶¯,¿4¯tKiPº£nW™¾4®t2ϼʆ””y›GšG˜šû™û˜Ì~ænf/s;³Álkª6ýjziznªªÛeºnºlºd*ö߉40 5š¼M^&O+ß®³æx½ŽÖ -ñmûã"DQœ߭ÎxŸ½ud]F¿› ÿ3ßÿÛÙ^ðh·ýC§wƒ"" éÂäá–`9²ð)va+ìÉÙa1Vãg_#¸ -qâI§yKX±b[ðS|áÏŒeÅd!›µ¼™UZˆí¬Ò ¬»̸—Ì»Zæt+êIýië%‘Šoa¬°FØ.ΏZ„¨›øùm/b$ë2†O\Ã'íD1óí>+§+u£€zýeP.¢úžîSµ&¬¶ %âXI«iYó¸öµ½úH}‰ïĆYÄÿ*s_ ÂxÆÆ7Ï:ŸÍ*_̙(‹3Ðf¾³­œSö0›2îsœAnã9ߏÀUÃՒÑëX‰N\}GwŽ$€‘Œg…Oe¥&³†rh'í%3= Gôšqµú Ó¹óWþž(‰n¢;×þâzq“¸KÜ#>‘œ¥Ž’·ä#­Ð,Óúks´§´O-jª—Ô&×^Ruj:GÐNpC+®mÑýÈ| áÂë³ØLÎYs97-æ{_Ëïë¿|W}pÇßÝûÐ×Ù:ù˒±ï|X$Ù`óaŸ±d,ƒí–dã/(-6e2 3IÌ&!™†I'M --MR’ÒP*&mâ™Òvš ӆþ¦Ó¤ã¶Ó ‚6Ånl©ïN6i§º»ÕÛ}ïî~ooß¾ûÄTv‡ŸÃ껳vÓX¥£¿A¦½ ¹ð ØþtŠ +Tàu¸²T 2ÑA@ÿ<>…ãøb%%p,"‹Iˆ ’“„’áø+¹ËXà(eÖ1f'svû b¹ÈüŠ™O -À6Øù;Øö[ì{œ¥ì öâ6rm\w”û%w“›á-|?ʟ4 ¦«f§Y±|bàq|iuý™¼±ó*þòO Äð·!ƒ¼€‹H=ªAMlŠ[ˆï0 +oG¥Ì{hpq?6[Ø?`D['¬¬ZÈIã‚e -= ‘W1? {Çä±\:ðgÀ–²W¬sÌÁ¾‚/›^Ä#hš8 BNH6ÂÜVÃʺ;Ô),¥¿Î~âå×i½ËæBþ ˜7¤oð ô#rC¯mÕG¬©­Y½¢ºjù²Ê -¿Ï»tIùbOÙ"¥T–JŠ¹]…΂ùy¹9ў%ج³‰çX†`ä )1‰zb”õ(MM~½¯ôÀ@Ï1*ÁPãÃ6TŠfÒÖ*X|ÉRÍXª÷-±(PÀï“BŠDß *Rok€|"¨D%š4äVCf=F' :² wH!çPP¢8&…hã£CZ(„çÅmÖ¥¡ßê÷¡¸Õ¢ $Ú¨ ÇqãZl¤1´&N9 PÑf%¢a%¨C LY¨§¶µGBA·,Gý>Šv*½)ë¨Ýk˜ ã5”o &ã5Ò.Ýt\Šû&´ñ„ˆzc^¡OéëéŠP¦'ª¿Ãá¥ë• ]`Òé÷%ð+›#ÔҐÀhsä -jNÆãÁ`T[NCdìAs7£…œ»$½«ic=ÝyP+ëm4 -õûZ:"2 VBã’îFGÄðŠ•RÓÝÌ8ܯ„ô‘Øn‰Z”uʐ¶;d¹4Š:“/¸šÕ+éPsHÒ6G™Ö¹•hO°(ž‡´ŽÇ.†U)ü°ÆŽÌLdzís‚õ Ð_gH†¹.êù©Æ:"% !B¥ ‰(””ÕèM Òvրü¢ftÌ_L×èDpePŸkSAIÞzx¤gn„/§.êár?ä@?/S¯—.]ªGŠ©¨dkþJ¿ïQÚ¢ ‹m)Cm¸)º¦¦\–u–'TÔ :ÚÉô%Ô뾀ÔJo”’˜®™˜×äoÑ5£óšû·ÇçKFiO͞û§]\ZCñ‚ÿ£îÏèaù„¤8˕imOvÜí‰iãQ ¦–¢¦5*R£ÓzéÑ^E-ÞÒ¢ ‡bó.%Ò±ãnzz<:„aRiuf6hnC„q“hF"n¤–¯*-íÛ"5s¤Q¶ ÎpŸêÛ!4Ú»ø‚³g\6YixZÖíH™x]yr^.Ey"Å6¦(—b >L™‚PúÑ…̍;h[œcØwñ¦7±„ñßÊ0ÈÊs ì½Ì0¤Ùb ï%ŒÂæĬ §w£x7Ð:Ø(NZÅ©ª ˆ³©ˆË—ÉÙQ †ímFb&fT -S‰€ -ùñ÷ þÐ-Õz͊°tÍÄ°R"=¤Ž‹YÂV‹å‚óÁ¬‰ç#›ÇAö4™ÍÏF—ÍPž «‰À®Ë`Œˆ`³Y,f3Ïsfd°Åʘ T ӒišL«Öi‰«6 ßÞþ$pv¡D¨vìá'ÂûÂY]šáU÷Ⱦ†È…÷Œ»£®ÂÖY—svÖU˜¬­Í©­u-r‚³sGF*¨ã*¼c¯ŽU8ÿûÏëõ._†e –se*uF†B'>+¢8û³Ô§/§~óïÔµ3©;ÜÛ÷R,ù¢ž93³C¿ E‘ô$ûÛuXjS+ØFDŽÎ,âkA§Éæ:Œ˜(!b1ÆÍÅ׋qÞà¨õº•Xà ·í7ÜiMŽIû€¥ÙÀ$ªKÖÕÕ%µŽœZ“C^™•R´rª®ZPÀ•òùy ª«V­\áaÎc1õ¶3ÛŸú-^z£÷pêãC¯½~ðð¹s¬zoâ›ðúÍàuÍÍCÇO\¾øìÓðnKm5ð– /Ú£–,ZµˆäxòKduú¤Î"îéÌ·r¶lĖÀW~–ÝÉÛsJ/Ià°jÃÍ~eÐö́oMôÖÙ»^Éd7ТfcÔ՝HbpÁexµ¸ìM¼\ZËŸºj-žóL\½ê¹¶÷ùÔ§?<µûËßú§V7½Üw3õ»ÓϾ³ýÕÍ©¿~í#‡~ø -«Ît¥n¡m/î­¨ îy¢©>ÅÌKO‡6}íÇG?§;§³´û, –³£5ûsîsáÕ¢âÚ4ùqª¢†ÐÇo·nrìpæMRˆ²…ªŠ•µÛG…“Q…6!ÂiIX&0BXüþþù¸48'ÅÉn,v‹·G¼ºë¹UPnðJ©gåŠU P:Õ48°><8PsR·y4ÔÜÕÒ4ÖÄ1„L6`ȃžT—3ʗ:¹üN›jÊÜn—ËaEåxGù¡rRR.•»˜ãˆŠ âºì.t¹£.Õ".‹z<"ÔÝ*|Ɍ"î$|(^<<6vvV_ FÛÝ=‚2Ë¥þ’b˜êråüµXgHo‹q>䎥4;#Uà9ñÎi|½àlUý/†÷ÓÖT²««qïªTÒ»õ+Á½«S·Yõ`놾X¬oÏù«³GHù•£m'¾›Ê'ö玪íϽ”*ÒyÚ«é]ð=¹P•ê^-b{'úûÕTÕu…×ÙçÜs®€.pÅ@à(¢AD. -Q|Dʼn†«ÜÊSyƒv,ÑH `T«F‘IӈAœN43Ó45c;­?j;m£3&?ÂhRk3v¦rú­}ÏeÎô‘N§¼{¾»ÖُuÖþöZkßkD–8ƒ£ª´¼WÕ®`%87zýŽ@êpøÝ⤹…lñ*³5Wd„ÐdÂÌ}"|TH‰Îne‘£Ã÷~øùð¹ó½×žëïÛµëTŸVÚ=|ïh÷ðÝW”üÛÖ©ƒÃÖ[{öŸ9»wïiœD\: s{GÎ4§ÇõXF±ÃØg¨ª'$,ãœz.Xôª½ÁÂ*” §1ô Aëíœ ðˆŒ ý#4È´Þω’aä¹V¹¥oºÐÐÕ°œ¶þgþcàS¸é]úYB&ÿVRv müYãU’¼Iásä L4@»91lrÞçÓv.OÿV±'.»Dþ³–Ó¹¦(f(ªçfúð2XO³nªóàw<ý)'mMxÌs N[èZ“¿A)p=aÜåq—ƒ¯EßtE‡ ¥,¡1á¨8¢¥(Ùø»5(¢sRV©Õõ9µKu¬”ª:SÍTÅx5F¿U?Q¿P-Ôö’Ɇî á¼f~Ž{µ»ÌÝèÞåv,p+ñî9n!Üánñ¾û²ûºûK·æ. ¦öIUãóº½*¶¯Ë¥¬rmt WîÔA%ù-ÿÉz½ùwoyåá¢$Þ÷6555ßôŽ(|ÖMLŽŸ‘wœ‚Àä›>—k ÍU†¬Ý€èñm ¤_£ÑF«shd -lÑ.)s0vœÇCÖ=â®<} •Ó|ðš?}Ž:ÌÏ#àsջ”Œ±ïê‡èuô“Hn€ÿ”¬'Ð\g/­Ã^6óùsìÉX(§5x^™¢}J‚¯I ¼{ct„+ðãl£ °QÀççä3¼Jǁ×0cåûR˜w>{e™ ÛAà)š¡=NšDM·ãò¯Ê¢D‹‰ôš-e,b¼LdYßΗekðk5p^6`¿V+ ïÃÞrpö2d1Öwaï‡pþEŽn%òGöœDÄMŒÛä b”ã12Éñ%Í法±Û+㨏cÍΝƒâ á@,|xÆÆ4Ø$™7ˆ]~¯m;Mæb 9–˜?qJ$†KòËñÝààCHø!c“}±¥AáëRÎEì7œ¥è :)/RDZŒÁ€L°.Ù<sžr®@þTtY§þqÞrîHù Å1—2m9ÂM@æ#ï7Q™Q »Ë°ŸE°½òSȵ4EoƒÄþPÃvƒû§´vªïQþ¸ê3ÆÓ õ‰ØZ{GÇÈ# ㊲Y{›Ú%ßWè€øvèg!Å|Zàj,·£øêýoö¹Œ•\ãä^›h -$ê±µyÌq# ¯áùEÈ x®ßY\ Qš¹rMbøϺà\_ë·àýþý¼ÇÚ¼cù+¹–ÊzfÇ#×ÁÀþ¹pN˚€¼VKvçüÒ>²zô«G\·z Åêq‡4­ø›¨ýêâ{ˆVȜÃ3'ì3×~Þ§c‰@Ýמ¤z¹æ y¡©¨Øû¦_§|®ùúz^¿J圳ÜÏ~ªí´–¹ïՐõ2þÿP«µ¨˜ÇÕßÀŽÙ,*–¹ìç7 }/ð<—ùSI™ŽyT¯†þÖQ&ÛÔËÀ1j¾ýT`×ãz»þÊ>Á{F̔ñYð>ÙW>[ãöz|´Q„vr2Mâ½J®öa¿6_z…°-£bµ%åxs€¯ñeóàŠcTޑ°©;É#¹"ŒÝ¦™D‘2—.Y·ùÝè/æºÁw3s,"­~}>ÞùsöÁº-}ðŸ['8íS›hO †ÇÊ@Lë\³è ­Íú˜ïCç ™C뵈òÐwÔ_‡E,îKÅ1€÷}¥\p ˆÝ¬?(ÇBùÐ?ƒ1zì?íÿ&¿Çý¼Eê¸/¸¾ñoKcHñf@boÏӜIÊçeÐX‹Ú»÷÷ZªÔ#ò÷ïP&âñQ')qŠj°f#LfýÛïþ½¦ÌÕúÐîû›hCû€›«^xض‡íaûÿ6R𠰛îP&e“ƒ…R<Í'Rëœ'HåQ -¡ÃRòg'à×Uš„'¿®AÅÖuègl݀¥_±mžþ®¶®Ðl¡Úº GDº­«è_dëô­¶®Cï³uƒž׊¶7VTú6U˜ýfQu…™ßPßЊ.sQCscC³¯µ¦¡Þl¬Ý4Ë\ìkõý‹IfŠÉæ̆ڭÜ×bæÖcejF†'9#Õ\P[kÔTU·¶˜-ÍÛ*ʋ—®.\Ÿ´¨¢¾ukóö¥ ­Õ5›’6Ô~ƒ»Çôw™5-¦Ïlmö•WÔùš·˜ •ÿ|{TDÛ©‘*¨’|´ Ò¤~ ˆª¥žO T´Ú³LZ„§fèüíCœa¢§ëgA[,û}ÿ¥%“RäêÀìBŒÖÒ֑y-è˅ô¿3•2Ð<”ŒïTô– ·D2îb:Ð)_ï£þ“|‘|™-§/*øªÙ˜b(Ä>ô)'Þ Îp7` ™5Âö§ôÊþٛɛ võE€³ÏP+­}¨Ië%Ô¯KËF½AZ¦÷$²çΞà7±gÎêy3 œêm2ºŒ·€Fý;ÀÙ*ÞbtÒR¢4E| m'®S7aÈ9âK`SŒ¯aÛ×Y7øìãÇÃ*Ÿ•=¨]€c=µxµ°Ž£>)­S\¼v{x•1‡ªY5q% 4ñÝ… -Š¶»D¡©ÏŒE}ás®½ðù ®^ðµ ^®Qeñ8ž~C½b|L—`UÓ¡‚£káF*R/¾;4*àúb´ylDL¥̦k…õvÑÞP=ê/8s5¬r³ºà܂feÁi×Â5´¢"ô³} Y -âE{W£ú ́Ðì^xfí) BµF½¥^=çÓÎZŸ,h?ۿèíRO:ªvÂY¨}}˜zÕ|Ҙ¥~)¸%ø R±K}Çöª¾/îTw¡]Wܬ¾j{3»êcêN{GƒºÝö| ‹)õEʇ´u"åFö—©)Û£t±]MÚ+ßP-¦T*d´p¹xìbúñcیÈûÌô=Šë¥Ò{̤.—Jû`=ˆ×€J{‹æ¯:–b2ÍÚz„eäð®¢ùE3ÜõF5ü¿eµ_L.hgÌRM õ'SDg߬þ(˜_™;µý¦ÇCF`™º7£kof,m2³Y{΁b·º%#÷祌Wõ–ü¼éUÕaÉÏ Äƒº{±/äQ͊~wF(BnC‚%VF‚î=í Oa½îÝí ·ºçÑdžèËå[(Ù,þ²ë˕“•YdO’„SÜ'‹/·Ø°Çc±a×ؚrõPԝ)ñŠ£-]OÎ w¼æ -endstream endobj 11 0 obj <> endobj 10 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_blue-orange.ai) -%%CreationDate: 7/16/2019 5:01 PM -%%Canvassize: 16383 -%%BoundingBox: -43 -681 2789 33 -%%HiResBoundingBox: -42.999 -680.9844 2788.8838 33 -%%DocumentProcessColors: Cyan Magenta Yellow -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: -42.999 -665 2841 71 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: 983.0205 -584.8799 1783.6602 -8.87988 -%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: 1 -%AI9_OpenToView: -2911 1691 0.25 1586 946 26 0 0 51 123 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 21 0 obj <>stream -%%BoundingBox: -43 -681 2789 33 -%%HiResBoundingBox: -42.999 -680.9844 2788.8838 33 -%AI7_Thumbnail: 128 32 8 -%%BeginData: 5449 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 -%524C45FDFCFFFD08FFA9FD11FFAFFD6DFF305BFD0FFF5B30FD4BFFCACAFD -%20FF5B0885FD0DFF85085BFD4AFFC3BAB4C1FD1FFF5A090885FD0BFF8508 -%095AFD49FFCABAB4BAB4C3FD1EFF5B080F08A9FD09FFA9080F085BFD4AFF -%BABAB4B4C3FD1EFF5409080F08A9FD08FF080908095AFD4AFFCABABAC2FD -%1FFF5B090F080F0FAFFD05FFCFCA310831095BFD20FFAFFD13FFAFFD17FF -%CAFD20FF5A0F080F080F08AFFFFFFFCFB4CA0F0F080F5AFD06FF85300F08 -%0F307FA9FD08FFAF3031080F307FFF85080F08FFFFAF080F08AF5A310885 -%FFFFFFA93031080F0E7FFF5B080F08FD04FFC9BBBAB4BABBFD04FFC2B4BA -%B4FFFFFFBBBAB4BBFFCABBBAB4BBC2FFFFFFC9C1B4BABAC2CAFD07FF5B08 -%31090F080F0FFFFFFFBABAC931090F085BFD04FFA931080F090F080F080F -%7FFD06FF85080F090F080F0831300F0931FFFFA90F08315B0F080FA9FFFF -%85090F08310F0F0831310F0831AFFFFFC9B4BAB4BAB4BAB4CAFFFFC2BAB4 -%BACAFFFFC2B4BABAC2B4BAB4BAB4BABBFFC2BAB4BAB4BAB4BACAFD06FF5A -%0908313009080F0EFFC1B4B4CA0F0F080954FFFFFF840F080F0809080908 -%0F08095AFD04FF85080F080F0809080F080F080F08FFFFAF080F080F0809 -%0EFFFF85080F080908090809080F080F08FFFFCAB4BAB4B4B4BAB4B4BAFF -%FFC2B4BAB4CFFFFFBBB4B4BAFD05B4BAB4BABABAFD05B4BAB4BBFD06FF5B -%080F31FF310F0F0F5BC8B4BAC937090F085BFFFFFF31090F085B85FFA95B -%090F080FA9FFFFFF0F0F080F31A9A9AF5B0F08310931FFFFA9310831095B -%A9AFFFFF080F0F0F31A9A9AF5B0F09310831AFFFC9BAB4BAC3FFC2BABAFF -%FFFFC2BAB4BACAFFFFC2B4BABABAC2CFCAC2B4BABABAB4C2CAFFC2BABABA -%B4FD06FF5A090831FFFF0E0F085BC2BAB4CA0F0F08095AFFFF7F080F085B -%FD05FFA9080F085BFFFF5A09080930FD05FF850F080F0EFFFFAF080F0831 -%FD04FF5B09080F5AFD05FF840F080F08FFFFCAB4BAB4C9FFFFC9CFFFFFFF -%C2B4BAB4FFFFFFBBB4B4BAC2FD04FFBBB4BAB4C1FD04FFBBBAB4BAC9FD05 -%FF5B080F0EFFFFFF0E0F5BC2B4BACA310831085BFFFF310F0831FD07FF5B -%080F08FFFF5B080F0FFD07FF5B0F0831FFFFA931090F30FD04FF5B090F0E -%FD07FF5B0F0931A9FFFFC9B4BAB4BBC3FD05FFC2BAB4BBCFFFFFC2B4BAB4 -%FD05FFC2BAB4BAC9FD04FFC9B4BAB4CAFD05FF5409080FA9FFFFA9085BC2 -%B4B4CA0F0F08095AFFFF31080930FD07FF5A09080FA8FF30090837FD07FF -%85080F08FFFFA9080F085BFD04FF300F0837FD07FF85080F08FD04FFC9FD -%05B4C9FFFFFFC2B4BAB4FFFFFFBBB4B4BACAFD04FFC2B4BAB4CFFD04FFC3 -%B4B4BAC9FD05FF5B090F0EFD04FFA95BC2B4BACA310831095BFFFF310F08 -%5BFD07FF85090F08FFFF5B080F31FD07FF7F0F0831FFFFA931090F5BFD04 -%FF5B090F31FD07FF5B0F0931A9FD05FFC2BBB4BAB4C3FFFFC2BAB4BBCFFF -%FFC2B4BABAFD05FFC2BAB4BBCFFD04FFC9B4BAB4CAFD05FF5A0F080FA9FD -%05FFC2B4B4CA0F0F080F5AFFFF5B080F08AFFD06FF0E0F0831FFFF5A0908 -%0F85FD06FF31080F08FFFFAF080F085BFD04FF300F080F85FD06FF31080F -%08FD08FFC2B4BAB4CAFFC2B4BAB4FFFFFFBBBAB4BBCFFD04FFC9B4BAB4FD -%05FFC3B4B4BAC9FD05FF5B080F0FFD06FFC2B4BAC931090F085BFFFF850F -%0F0F0EAFFD04FF310F080F5BFFFFA9080F083185FD04FF5B08310931FFFF -%A90F080F5BFD04FFA90831093185FFFFFFA95B090F0831AFFFFFCFBBCAFF -%FFCFBAB4BAC9FFC2BAB4BACAFFFFC2B4BABAFD05FFC2BAB4BACAFD04FFC9 -%B4BAB4CFFD05FF5A090831A9FD05FFBBB4B4CA0F0F080954FFFFFF300908 -%0F08313031080F08090EFD04FF37080F080F305B300F080F080F08FFFFAF -%080F085BFD05FF37080F0809305B300F080F080F08FFFFCAB4B4B4BBBBBB -%B4BAB4CAFFC2B4BAB4CFFFFFBBB4B4BBFD05FFC3B4BAB4CFFD04FFC3BAB4 -%BAC9FD05FF5B080F0FFD06FFC2B4BAC937090F085BFD04FF310F0831090F -%08310F0F0EFD06FF3108310F0F080F090F0E310931FFFFA931080F5BFD06 -%FF37090F080F090F080F0F0F0831AFFFC2BAB4BAB4BAB4BAB4C1FFFFC2BA -%B4BACAFFFFC2B4BABBFD05FFC2BAB4BACAFD04FFCAB4BAB4CFFD05FF5A09 -%080FAFFD05FFBBB4B4CA090F080930FD05FF5B0F080F0809080F5AFD08FF -%5B080F0809080F5B5B080F0EFFFFAF0809085BFD07FF5B0809080F080F5A -%5B080908FFFFFFC3BAB4B4B4BAB4BBCAFFFFC2B4B4B4CFFFFFBBB4B4BAFD -%05FFC2B4B4B4CFFD04FFC3B4B4B4C9FD06FFA9A9A9FD07FFC9CFFFAFA9AF -%A9FD08FFA95B5B5BA9A9FD0BFF7F5B5B85A9FF370F0837FFFFA97F5B5B85 -%FD09FF7F5B5B85AFFF855B5B5BAFFD04FFCAC2C2C2CFFD04FFC9C2C2C3FF -%FFFFC9C2C2C2FD05FFC9C2C2C3FD05FFCFC2C2C2FD2CFF7F7F5A7FA9FD05 -%FF7E0F080954FD07FFA9FD1FFFCFFD0FFFCAFD39FF85080F090F31855B7F -%310F0F0F08AFFD72FF5B080F080F0809080F080F085BFD74FF85080F080F -%080F080F0885FD77FF7E5B3031305B7EFDFCFFFDFCFFFD52FFFF -%%EndData - -endstream endobj 22 0 obj <>stream -%AI12_CompressedDataxœì½ms%¹‘ú}"ú?ØÉáaW -”®ãFð’Ú±%̈́4ò®½×ÑA±93ôv“m6[ò쟹?æþ±›Ï“‰ªÎ9löËheï4¤éfTá%‘/O&þîß}ó‡/O_ÞýéúËpÒmž}ñw·»¿¾|¸»ÿՆäÍW¯^½{ûpÒ/~ÿËM?t¨uúU~a5ÿËõýۛ»Û_ñw'¿½Àó¿ØýpóöáæòvsqýZ*ýró‹_â·ßÞ<¼º–ßß\ÝݾøÓ«w×_ÞÝ_Þ~}ryóKiñìòAª¥çýô|èúyÕõ›o~Ë*—·¾|ûöæ_®ÑmÈìu{÷îöåÍí÷Û»ÿõ«Í—cØ|9å~3¤ÿÃÕåýÝíóïeó°íW×ß=<ÿú\VJÔ¶AöøoÒ¼KV-?è¯þôN¨ϯo_^¾ýáùõkþõ ûòú¹p̗×Ø.ÒØÛU§úðÝõó—wÂ…‹É:˜Ÿÿח7×÷òÅo7Ïß¾¹¼’á˜ÆçWïîï¯o¯~”¦çº¿“ ù§KÙÓý”Ÿ—úϯîÞühmÞ¿üîúõÍíÍ­<ž†ç2þ7W—¯nïžÿðã›®oŸßËT¼•O»~ùüõå^K†U&éùaóòä»·Ïþr÷ö ÚÍÝýó‡ý§Ë«w×Ï_¿Ûô9<'íå•Ì?[»º~yóêÕ¥´$Ûџz}ùöêÝ+¾QÎøåÿ|wy/ÏàŸ?\¾úNû0âÛM?ÏO¹¤©Síñ´™ÍSßSÿúS|ÀóÓóç;{…çç|üù9–VΛÇÏý¹¯´ÖWÚÅWM¯¼ÎùÃÏÇ¥™¯õ¯õ¯›¾Öwúڟ{ýîÕÃ͛W?>ÿúí+¬‰?–ú£>üÇæá?úSÿUùíw÷²ZÀ€oe©½}~©_–ï¹lž¾Ô®/½‘KÇåõó«2×úøµ¶~]–¦®ý¹­u£µnš.n¼Îµ Ç­vx§ÕïÊ;Ý5ÜYîå͟o@ÐÁx§¾ÓžÞ-Þç?ó£þúƒñc!?ûâÛse…ñ?½øö­ ÿ/ÈhÎo¯îpÀÿjóbÿP=xÎþÓó5ŸxXó·ÿí{WúÚ|{ÿîúÛߔƒˆ/òBÞ왎î°ß½áïò‹o^½“_þúþîݛ¯n¿»{öÅ/TÒú/×W"MÉñõróõŸþ‡ü òÒï.¯~øþú_®o®~¸½~¸ÙÊÐ -ÝëŠÌôæ—ïiXúýõF+ÏòGùû;üý”çÏ®¿ù£6 Ô¿ÿB…ÿÝ~ù߄·>üË뻗ï^ÉoÏoÿ|ýêîÍõFVïæ.ïß<¥‹o^]Þ^Þoø‹ÒCÛîæ+°™Ë~¸ùóæõ¥t*•~s#gÆ7—2¾OêA˜Ë5>Ä:ËÞ«ÐüêI]]>ü°ÙÊK¾|뭟⨓Y|'rîzÄø!Zÿ)ÍÿáÇ׺{uóöµ7ÞRüßO|SÖÛ¯oõ•ïß½ýaóíÝÝ+où·ïpX¼¹¹}{ýjõÖ"(ésSyåC`óüoÑÅîRDa“o„óêå?Ûï¿»¹>Øّ矴º®8U‡zýÛë¹¹|u°ÇýÇþæ:³5¸@xç&ðh?üåòáê‡Íonþt/Çìõ{v+&û»›Û—ò¢xwópíàc 8ýöúá_„A {›‘.šjógM{œ|ùåãM?m¶·m•_ßCD¸}µû×r’AH¦ë¿E/H›íKÊç]ó¿¾üoÜü݋­HžÿQÈë?ýª M VF+‘ÿ/eÂÿ¥ÅiQ’—Ü͋rڔ­”•³¦œwÒâE)‹Wkÿ M M%j‘1Àß©Ÿ¤$þ›2/Êi¿õ²ó²íϤ”ŸÎ¤Å³þœ´³þ¢-íðñõʟД±)q˜Pž}¡©)y˜¥èO›²Õòì‹ÿûðœ›Õ°˜×±™Ý:ÇR¤Å2Ïc3Û:»í,g)ø³›ó<73-ÿ•uÎˬo}¾õoÌöy;ëò_ýÓœóAf ñ ó‹¿1Øë‰%s¶Ój¦O­,çsŠ¿ÏYÎV³Yº œË:w(:Weæf›3™'™S+ÌÙÎÊ˹• ”²Íð9«9í9[£æ¸n¹g.8BG`â7Îüž3¾uoo9qõœb­°oô5„Æ0…r˜ÃVÊY¸iïÇ0ŽcӘÇy<·ãÙx>^Èp1Ä1N1Å9žÆmÜÅó(ûT^©—%;Nqš¦<ÍÓ鴝vÓÙt!‹BTØ4¦˜¦”Óœ¶i—Î҅,˜>yÌ1O9å9Ÿæm>ËçùBŽÌéæq–†æ<ÏóvÞÍçó…,Ÿþ4œŽ§ñt:ͧóéééVÊîôìôœKjO·q›¶y;˯¶ÛÝö|{!ËLF“ƒvã.îävóît·Ýívg» Yv='c<‹gә¼ÞY>›Ï¶g»³ó³‹óN¦'œçÓy:Ïçó¹tv¾;—Ur~~~¥q!ƒv/äc/äõ/N¥H§òèÅêç´ã´:í¼)gMÙ5e»(§M™K‘g龖ԔiQbSƦ„¦Èj”/-g«\¹k_þ¼ýs¶(;-2dø{۔Ӧ̋’›’š25Eúyô2.JhÊД¾)][t؟}aÐ~@ûgה­–²Uó¹œÅåܕY[ÎÔrvdF¤Å±‘f&–ã¿uíÕsTe¼æ՘ÚH.Æp9n«ÑZŽŒ×r\tLN­Ì,ÙJ²2±D+#K°"뎛ÑÎT=|+”ÓÎʟ-Ë©•™%[‘Í.›?í&+ÑÊȬ(O.g€ðÕfNÏ9[Î[æFæÓ±Úʟe#o]¾.¥jLy¡K%Ó¯´Ä…fz™´Œè•ù*ñRÛ+§•ë‚®M°È(.´È%ô¢yàïyUòªTUÿ5™.ۖq¯„½2(öGZlÿ쩎؝­ìçŸ,ÂZdî¼l½œ)óђ‹†)-¦U™žXªöÛ"-.~v Gý÷~ G -—†´8<±äEZ|ZÍ'ÿ9h+ø¤?Ÿ¯Åæxí}`Uú-Rü™•ÛŠ-¤ØF²éÞÅvbû^vµêée·{LÝ -ë½]dß²—ÛÝ»µ]]¬û{7¹Õa²Ý&QíR¡Ý­nÍxdŸÊ¿ÜRmc«½Yv珦bcimlۃ{s»°ÌíïÎbÃYïÖ¼°òU«P± Ú¯þóÂv÷ʸ°6ߕKËÕÚfyhß>¶›W{•»úÈï>|G?º«ÿöàçoñˆÐÛªWû -–J-û -V‘U:*ìç”HfS0'“IW¯.©$-¤’¡Q±v¢dQÅzö…(YP³TɂšÕQÅR%kG«“*ZÙ­`ŠT­¨Y[*Z™6,YT¶zn” êßgèBÈ¢j©²ukPu‹ -י)\[*\™ -T.°2Y;¦v]P—†â¥ª”¯Lå ê×Hõ«ç¶º  -¶£ -% jX’nQU4-QÑ•1QÇh:§Bv& -T2(ePË ˜¥1R5ƒrȺ:*h¦Ãoµ#Dù^¢”7၀?=¬ÊÙ!ë„T9Ne·Lõ e$oywõ)¬Øsõï–'·2å%á·ãžläœuÁK’Í‚k.x¤ì˜VfAYq»ƒ|îùâ€<ñ4®q”›|æ]íª¨–ÖBÖþYSçÒWÎ\ª½©´µ„EYÚüâªL‹"À’˜6ÆLkYNWe».fÑlËÙ^Ùÿs±_Êjٞäý2,á`)VÄý”éhq{²´˜V%?Zæ÷)VíÃeûÄBŽ/-îžXΞV¤Å}ê¡©|r‘ýî#ÿ8^?º%7u®µæDÑ2ZQ{j±¯&+Åþ:[1무¨ÖÚò§°Šº…Ê´~[të"õK±Úe}Ó<¥eòRlÍÙËlåÔËöÏ:ƒyicâUՏp˜;5|iá§Xð¤#Üèj9ϖö ã¼çž³à1ÆghK;Îcp–÷qiñQ>ò²âôr9×øhNÑìþ£|â‰\aŸ<²«/Å]ýAfۅáV»ÚRé(†,Fك"NÃx+ŒAÆ¹á8Žtg<‹ûø d9tԁ(²Â‰,g ÙâJ†3ùœîdu(H¡t*ã˧•á\ÆfR3\̐?éf~ö]ÍR9ÝÍ[aOgîtîDJ„Ä Çó(/Y:Q„ŸEœ?¥z'ìãÜ\ÑÝ©ìú -ÿpJÃ-=&ªs㞦ƒZ -&䪶Ê@g5ÜՐݝÖYT™®ku^ïȜ°Ñ/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïåO=ý?~Ws8 _MìI¿ä_Ó&w'£ìM -ˆÃPùϾø»O©»}{ Í“(5c·Éý‰èÓñ×ÙÚI?¥yDMÅx(-1ça”¤8د‡>Nó´•á$tq¬Ý}rKú>(µq’jlû Šf.ª;›ÇØ͌´N9F„ýàï¾i,œtÂiš×úL ÚÛMðY4û.&>˜…?kc¢[fí`>‹Ædúâ¼h,vÝܾÝçiðærH'9„Må˜æOÐus‡Ö¬½ü<ŸŸ?º`—µÐÎö¬â7 ó,óïo^¿¾~P¦ýK $ó?:ë¼0†9«ŒææKÆOžµ>[cs£¡&(bzœ ë O5ò¢jËÃí‚æ=Ô&g§<ÈÎÉဧÂÁ¥‡Ö)m[gЄŠ,žµíª§IgØKuyì$§Ž@‹`ý9ŽFm-·±±?Ð8¦ˆb•°6%C'(>Á -4FaÝíù8ö¢A^< w±v\úÉޛ¾uÄWWüNOïÆ?úi=—ü™Oä3ƒñA*ËÂGYL|™òä.H]QF’ÖNÖ`Gé*Xï,¹7YGÙP ×°@F˜ñ¬s·àŽæ15‡%3{f@ï«QøÉؔ'áRܓ^Áê¢Od8¢3ǝb¨‡£!ƒÔñ¸?ßs:7ÀM‡nª%Q½ÇÁ¥çH z¢(IgšFO)Oo©NËìQpº d]ek…bbU¾V »Êؔ² œ©ðLÈِ´E⥴)myûl!s¯¤n“¹± -„“rw‘¼e—-eo¬’Ù`;ŠŽçî(yˆg+yï(yŸC䒹WÉ;4’w2©{K©ûŒR·Â?«¼=6ò6dm—¶E*?£Ä]äí}‰;šÄM™Ûåí-enJÜά òfÐä,HwÚþ¿ÏýßKª’éŒ3³²¹ìΫó®ü«ýÛÐ-ð]ÔþÜ»Ù:8 ¾þÆ¨ T::8^MâÂ8wÐÀã H>Ù՘®ÿU·gýïéÂô~f0ê’'ŽNÕH]aÔÁLû“©'sܪ  ßw -xoÀÓuÿÕ}(Yï9.OΡcnÿ:ôïåñ´÷ Ýz­ñ½wƒ}kºßwî»Gw¬–û?µ¯ÿÝÒ¢ûk(Çxöpÿ„Q”ŸÆ•C£usvñÖß»Ã×Þq=&}〭#[G¹ÎÄÒ=±€Šn@E“D+<´C ªÇ äðÞR,8¥ÊžÉN&Šß°7!aé=ꤸR°`…ë]ïù›ò~@w5›XDˆS7¯AÌÉMÍK se¶Ò™¥Å5˜ùlf>¾>³Ö§å*••]Ì-Œ¹ó5{a¶ý8í`ë«W×ïÌ£«XV¶®ä‰Ge]ÏÁ`vÊåÕõYÖö¹ Ù®ñë:—"+[W{²?Që £<™¼]Ïu¤ê8ç.à>püÀ!gÖ:|a]»Ì†=³÷^€ÃÁ@‡%è~/èAÖá^èà -”8b?ÂÀúÒâ¡Pˆ´rpN+÷çñ€ˆ@4í᠈þ‘]tl|p'mwKÝKí~jv՞!ëd¡4À>2%ÈýÐú…{d¨ÿ]/,,Ò6¢p)Ø)â<ô1-”x©ÝX»>WƒjøÈӄT0ÝÉ8‹èœÍ ?º­Bí<Õn2ˆ¤•›÷ùè&ô Ò„%ÂB’œ -öpß'Qð‘ø¾6ÂK›ïˆ“<Ú7V»OnÉLA¹ ƒÜiþ’£8‡š¯&¡™tˆ­ù$Æés3Ч6õ¦›¯ï¯~¸yy} ãÿ[šڈړI$cDÈۄAÏ_+3FcëÀ”·¶Èړ›ò æ#²§6ö`eXE|i-Tñ´YÀžú$ÆnœNDp^LÃÇ6ðƒÿ$!ºÇÐÛ¿hŠ«ßÊéEzn%à6059±À·^|^ô-ƒ;C ):Qt½'¹vSCCKˆo«½Ôp^*ë0-°ÓC­º -YUëq›A¤Õ€º £\Šö¢6ƒ¹Ñb¶&iœËA¸P0–!\Ù­º¨æ˲¤úN8—ZŠ5a[ä;1Š EEóÁPæfΈÖl!“ö¢ÓhYÊfsÐb2D »Š.-¹;¼ ¢%K!SKð½Ô?ÉKörêe[‹´¸kJ… ,ÝB-Nµ_”Ðß³/Òè%.ÊþŸ¼*ó"Âf:Ý+»#åì‘âÎ-†8Û».\ТP Ÿ£ n®áÍÉœ·uÏöËؚ̺­¡Úؗ²՞°ˆÑុhì՟=[lÐYcuË^­Mö‹î™‡AG „δ¥žÚÊ>§] k9кm•Âª¶åš<ãZ,¾ì+ªú±OéǶy$´§hõ,v´Ló>ìh Ն֙ -҂¦~ëÙ½ÖgfðK(nW óÙmhôWӆö˜Ïºz­çÆ~¶cÀ5lÚ熑tµ¨)KõDU¦"…ŠçZõ“ŠªH Šâ„÷3.p?-âgÞÃû,¼Ø ¾Ç‘=¦@.±ÎÉÀ–a3¥–ä&Ûh²¼€ˆLßÓ_A4dgÆÜe@ˆ†„¨ÄTC44Dµ:›DŽ*A"¦¯(CU¶·¥øԌÀ%l¤ ™Lñ0¥y©-•˜Ýþ@¸à±€Áf² YÏ4¶¹U… ×2 -!ö@âý?û‘}ÇbÉ€ÿÝ\•ó)ïÌS“—–€ÃŠ!vY´B‡DúÍLa?ê«%ÉíFkÇG<þ6†?ÞÞ^¾¾~¹ùÞH›ö†ÔÖès(St¥ÉÂÔý×$%̀ܮá¶Ë K ­Âpº€×0:9¸vÞskVcɸ§`•·/É ê7¬¿bˬXgnþxjƇG Ã²þü«>è­·öÖ5áB;7×ó…™köÒ7<’¥â0ÜYƺÎÄ2ŸÓO“'æ3e‰9ÎQ³ÄüäÙm~~ëå[/œaL±C²ö!©—ú}¢ÉýDíZþq˜q~†¶ÀE5G=Iµññ“ym×æ¶BGÎü5¿ iˆý¾#&ž2s_ƒ ‚EfšUÏeÿªY'sÇ*üMsØÉ8üm ŸL4Kž5Yë -ü­ԜuÉB XP€MϾphÓÖd ¦E0A4“Ì2˜ 5̜Ï0á󌂜S~F3Ԕð‚ÉT¨¢TU=¥ü1eŒjYQҊҶt6Öx™E€šörYd {%,ã‘—Å”ÑZ¦'•t¼Ðw}¸ä+ þ´r@›Ü/äñËÏ-«ÑHE~›œ«¨Ô6PrH‹¬™áh‰2‚«t–‘½JJ¹di Í“h ž ziN¸¬`Ko®-KxÓ2¸Éy–{áM -²œÜ8,üHxÔ¶ r2Îd¡NQáÃ"à)zÐS)Ŭ¡¤Ec5ex«¥˜VªÙ¥FÑT3M¿.D<Õ”ñH‰{…ÜQZœŽ–þ•#¥­²aW>¤ìY–EZ|O-OnñɤÅÏüçÿŒá(ÐIÎ-"R 9Uç”'~›Lç(ÙwÁOL׎²£–¡(ͽ -ïÂAûq‘wW]M¾Ýº™s”ÂS -lû@ÈäA®RøJbZHå.§ ΢6ø5o©üe0‹Nå2ÑLŸrZ7œ¦ü©ËuÉgà¡5Lªp•£\ç÷Ž”Z£s¤÷ñ'/Òâ#¿ýˆò8×û¨òs‹­?0.êÉmq B{v–´°™eˆ99ƒIKMbË6Ê‹Ö µ«¹©8Ü'³j®¢’ÃÆKˆÒ)mZ.?4N·Îõ ÊOÁ–™9¦ñì ºÓ„ÖS»úkbt¤GÃa€í¨O~\å]ÁèQy“pý³³¸9xz;s¤k){¾Ìia`Å-VÔ¶˜°÷¢Ñ¬ZͩՆ–úËZºmþýì@ÙÏY£žéîÑ2X¾ô§•ñ)ÅpÊï/ÓS‹´øäºÿ–ZlÌdg{鄷²|Óy”-ˆ\ºg–7mb¾´Ž™Ò¶4yM4wõ–m+ëMk0rÁÄóÜip¥©MãΘýL£bÉzFW™§—Ω„ð‰DQâž’Zz\ÚÓK×h„g_˜›«¸¸Š{+XTBïN­³&6á´ÉmVÝXta 9Ζ®«â¸ªN«ê²jV¡:«,³e ³åÚMµvRqO=ûbå :æžZ8§sLI‹GS‡œROpCiØSËî)Åîéx9fÐÚ+ÌçùYËÿ-þÌQ~æ(?s”Ÿ9ÊçkñgŽò3Gù™£üÌQ>_‹ 7û£—~ü/é½OØû™ÎôqNŒ€Š² -AI)ª3¾ï¾wàüçtȑÿY›->}„ƒõaû“N¸Ý³¿ú•?!ÝÊo¦þ‰&6a<™ú&ÝÖ#UV-$i8ÓfèNÂ0§C-¬«ÔR:Fh韎GŽààBƒGðŒoç+öÙ -ˆ}´”Óîôl¯ì>¬xKkÀ5þ<æùÙóRyÌ|…Æt?s`üþ^y?Þ¨±`¶·¦#×ÞóÙÞñ¹*³-µ)›vž˜±Ú×l…øì,gm1ã^çvã´`7<‘߸d—ùíNMŠššf)7 –šôJŸ¥Î’ †)+“J!ö™l«™ï.}`n».Žs7øÇ(ÓçkÓb£c7ôlN2mž}@L»~ ÏjHÖ 8g4мÐÇ5`½–¯ùüãóé¬ó0ã> -6{nÎ÷e9dÖ`›¼—`Ó'€EÓXôÌuÖ5!ƒWÀ>ÚÃá¯9 ¡]|—]ufø돀Ž¾Ì~\*~‚À ö"=XØÆ{zøP沏²Ï{rL\rõoþ:ÐÆpp?„õ~0`Ý°ÊûÛf ӃåÜsýÖL¿±¹žO³n™ÒÈ2û6ñ‘5Ÿïäy|O-îÑ×5lÓ=PñŒTB“A–fºÜ¶¯}nPƒ -_ -M$6Üp"LLo ÿ¢ªÏ-‚:2Ò×Æ·¶yux¾£uÆ£6çÑ@dAG¼AÉ{Ôf>jp,ûс¿Y¥àä€ó!ÆGöäÓ!ÆVþ‡& Ymy\O3y°ëþ#ô}`}Tø۔§6ojÛá‡<õÉ»0ކy‚Õ³–ümÆîŸ5±­,‡½ áÒ[¡+ëõgÎ Ü5€˜úty^þ”gù9wæòÜc[srÛKÞϑ;T$Ûú+>Ó -Íš6"u^êP‚©þ@‚)K.E¨ª<%ºóYbIýð[Ôú€$TGz¶`K§˜+»Ú©Äv–ÈÀ¡FzßµŸx°·á‘”WÞce…Ò÷2q°•Õ9Kôù¢ytVr΋­f^h¶½ŒçóÕNò&ƒô‹ «fšBƒ´#(ŒŸAØ%Lž³¬¶(«Y9pÙÔVÖbÞd_0²ð”—Hauø¦‡%¸']ûÞ »a`}¿Àøoºïf¯5™Sý¾-(·cpÉ2ÀX–e6ÕÞ$™ÐÂû[¾Ãâ+†XùÀ] ðÚ5·eZ¸DÑP¡˜ü{Óªë°Î&gm\dÛ¨ïxŒ«¯ùz…Lë\´°Å -P¬@ÄýpÔlyc ¢Zex&xêÈù÷N£df ‰Š„Bí -„=ìtN€ÓH8 L,‚’fB!ôÇß®½ïûÓnûÖ ‚ ‰ýè+‚ËíÛ?¿Ý'¾ÝBd? ´<ôÝLËÃÔu#DÉÙ3!2MÄíÿ£&ÑË"¶WF|ævMd» ÊâÔ÷Lð'£(#Lq4©e'à*áÀ?¼Íi8™Eoßõ³¶kÆ¢O3þ—6ûןϩ°j×ƵCî_|¶0~[ì»0sŠº)ë÷ó -‰ÿ8¬&|¦?U…jãÚÀdXHƔ햅 Þ°PX'îW¸°4K`àšž\Ós;>ƒp@"Žé´¦_\0Úuí…~µO{±OsQšìmÑ6W¤­.G[^ŒÖÂꗗ¢5×£-²{>~±ãÓ -îmýÀ;¶ÞWþZtá¦Ç^FšÁ(S …D‹h¸õeÉÿӕïì ×Xy=ê!Z:2Oû?Z -¾bºÙñ¹0Äô@£Íè)󈛖C§l4¯Ug Éšl(Ùõ²¥±«¡a–Ü8‚ÖéæÖWØ3•Ùá–‘œCeúØÂKÀ>kùð}Ôìz%ë`¹$CoŠ-©,“ýnè%:LÑÁS°ôØ´ ÓÛÿâï6 }פ£ocžCðQ~nñ©OÔ{m:ٞ;Qp­3.tîxó–×7C.(B"„<ipäµÌ/d†ØJ -í9&6r K‚gO9µ[ÊÊåΗÀÀr=}¹Í¢Þ‚Ñ^–Ü^%?ï-OÊÛ_ŽüދÚ_’|ô²õ¾týof™èåz¹y¤Í§…ÄeËM¡™)<+Åã·™«ßݺµ0¼o›¼WÅð^r_µ¦÷>w›: çn„?³l¦[3ƟzN¬b–Ïfœ/š”¯¼ñ©-ã^ GÊp¸ðv›C¥ÿØÂkÚ?kùðèQݭâ¸,ú=øGdφØfB„9,² Öë ž’ÿp™‘¹Ýd?sþõéOjñ°b1QELQ¡ýzYö”œU®í)WÕ&W¥„Ÿ—áådÓãzò¨X¤©‡w0ßRK–ýq¤L8P âBÔ0ʇ;Ëô˜ \μŽ–Í¶C“Ãr»aGÀøNTN•ÕZ¨Râ–yUB¤lh!$AȐ÷ åRA¼æ¾·} éß|‹KÕξ Yï$ Žojÿ[•È‚} -~G×RM©ÎE5¯Õ´Pq­4*Î'ŽÏޟ¿R‹+Çî/µBm}ÿÚ·õµm­äêÑÞ`R’gS°¶+l«_BØ\#84¸zõEöû[·–=±¸3[‡æc.Íý–5ƒ¥^?1»»j™‘mÇI-U¸È×‘ú·ÿê‚ô'µxDå8RLQa6ƒeÙWr–JP£ º€BZô '¬l- L½Vâ¼ÉÓyN˜Ç²Âsã¶NÜiq±ç®¹Ôs ã3žêež§–¹®X˳•g:w´÷t=FyeXÄ -ó¯/Hÿ$->ª’Àåñ!™Z¼úâ6{W¥JÒù•ÂÕªbUA+Yª7™¿"ÕˤÅÙ/x(W<ì>Œ¥£\òP¡Œ“ù,ÌK!¢µA÷îÓ¿¸K{w~vM—„Qö&Ü W9®øa)ˆÑ¿Wå¡éкnz(摸Œ|$.°¶™W1ë+*öÞùx4àñ…}œ¿.–÷£<û©\ûñMó´³àIW1ºº—S -,hh tÓ<Ûú7îìa}Añz}rc?ITá?\ßüÿïØüáꇿ\Þÿ ¶ÍŠò׺”fߤ÷‘×Ò<ûb/mqI‚^’· ‹ÏüNÌeô’¨xG€Ù¹%)¤þ2’àø% í Û&zàS"$v͵ -Œ $û‘1V!þ*ݵ55h>-.åÀ噲L Ñ\î±N rv8ÍēÖÄÇ\¨Ô}®+•Úk |E,"œèÁlWD{×nYMôG×Äû¡/Ó ›¹›žäO‰Z¯Ž³&néƒãšµÒ¬»¨àp²ÿEZ‘Ï'‘¹ü¯Øâ!§Ú¡›àӒãI‹ûï€ær0•õ2‘µE`=ûâc°’FaÕ,Ye…e®­Z=hïgrªËFY&‘9?œFæ'»Sëc¬‡oÕbÚì'Û¿XЋ%ÅßYMò'ã­Æ&úó4gOJô·Lóg±["ó|Rô–FOj—Ñ[²Ê>:~‹ˆ] 4&C꣋½u±Jö“§úyMü¼&~^?¯‰G×Ä2-ØdÌÚÏÿõáÿ¤æ-¡¼øÝÝí7÷7·7·ßùe«º·¿yöÅïÞðwA÷ÍåÃÃõý­hõ§¯~|ûöÚ¼ýk3Ï'ó4ÌpÓ6Ã8žt2;›¡ŸNdqMúƧú×?þ¿ÓŠõԟÿ“üûõ/2›ßnþé¿w›—ÏøÔïQ¡ôTÞ¼u¯¿Íoäò^¿i›8H\6p‹ÿ ¢$Ø@ÉwÒÐ&Î'“Èda 'h-&\Qð[¼Ô˜æ¸‘öòˆÛ c¹`4°0$N> -#÷e"ü #òI'úÞf”¡f)y“iV@®í9ú Ó'û˜QXό—™#Þ3?—™ Øøà^˜ï­ˆ.š7Ò)Ft£ÎÛO„­•y ý‰ü kn’ñíåÛäyQW¦Í4ÊFyéq™çÍ$aŠõ9Y}ý0m҄ÀøÌ¡n=ã19Ä {5ˆ´‘ÁKÂÓëê°'¤1ÄVoB'Ÿ4ËÈ£Lø¼Áàb–Å)çƒÍœ¼ØÉÔÉHÈZ„WLVº“n²<e¨‚,<®î4èÔçd¦EãOŒrOV£ÔÏSÄæé"VùzÏñ¹ïtŸéì瓟ב± Âdy½^RG]`A–§ã#r('!ÈnœdY‚͝¬7QN›j£ö\*ëϞ+ÔáDô`™;o¨?e4ýÁž+¯åÕʋ{C«ï«Ÿþïÿˆÿþñΐ¯Þ¾øí¥û»7?¾¸ûŽgʯïïÞ½±Cäð#¿¿~s}ùpýò…t²>mæÍ/~¹ùÇ8rðÈJ‰SGX•H'3ݶ0µÀGØTb{â$½¯ÞNœ1Ÿߒ±Á>m-W*ÒCÀã+«&ä6Âç¦,\¸îËȵ,r£ŽX/ g˜uÁês²Mµ¡¨Í;a¶ú\¡öÝl8؃PúÉ(Âåpo(úè·¨( Z+vYßÍ)sV¹@Ÿ,Tá@ÜþÕüpÞìÍ'µ'҄W 2¾Ât^/©"¹€¥õÂ0G£ Këq&Éü؏öȓ=Õ:Ê ìËq‚õUGœÔ^&6£¯ÒN§»Ø;ëš]]ßÈk•wövVŸ¶Þ«E‚pcÀ÷:9J轒s­Ÿ,¥vÇ°Yáòy”3ޖà g­ ¯0Üähì{{`p9\…]u#Æ -ãÆÃßɱ$GÞ¸ë ;턋ã@ä©¦Ö Ÿåg3rg9 e«Ï¢Flf9/Dü°çpXYˆœž‚½¼Ì,’è.B^!ËÎ<åôªhWzêdù†B‘œnXAúYTXKÆòœPÇAz—CXö'ÚE©›ÇÏ­FeÿÂ¦é¤ é;vÒÃë%Žã[>8Ž\lXFƒ0C\Y^~¾òÁM±VÉ@ØDÓH!X_öX¡ÊlË0l¼„A§Ú[!ØsúJµVygogõiëÅ×oNß|æ×Ca=Q0²¬Ô(3&3-Kõ¤Ï<2–48èÄÁ ÆâÊ'µš æ‰ÈÛ)ëΞ+Ôt}S¹;ÊR¨ýÁž³·òZåµ½Õ×5ƒhz›âgØý,œ˜r+ÈÃ:P80÷“Ì’ˆj½ð|9†ù†}°…… %Ù¥²§gl[²èf`Q&_V¾Ð'6™l‰©“ÍÒg¸¿EH.hÝTkÉV"¡ F¨=Œ*âτyè!Ÿ’íöœT9áøÖìç@=$ùɈØ>åâQg‚q¥ ² GÔÉ"ZÃüÂjƁíÂW³A󳧕¢Ê‰,"{n*Êk¦8Ž< ©5Ñ>æ>–G ™¬%Ȃ„ÆOÀFŽ2U²;€CÀ'ô˜«ò²×´©$™ä“0âX’ÅÙÉq"³ †c³OÍ0 ÌÕÀŠ¦æ –'ÒĊ ›]V^ƒÝܜ³\}MÀ3`°;h ӐFèZrœ'ÙjàѹëË~’ŸÆI^Q”â š…¼ªŒ¤ðÔÍÜé ¬ëþ±]„+¶GW©HE• 1S>iwKÊ!ÈÜ{áçH•S)¾Vƌ©©„©oÚr‚õiO:Y†#ˆ’Ö´%âì$Û¨éÔ(ö¨¿WôðÆÖ_Z£Ÿ9L ¼‹ƒIý˜ç±¸ YÔl‘ã1°¬…9.("æåÁ§ÆÉØk9nšÆdƒôøUíÕ(öh8„Õ·å@Ú¬iÌ)Ë^ì¯çù'¬¿µÙ7#Q“C–ž_/©MˆØuA‡{Äëˆ(ыº°, Á¹²ÕjSÖö†œ`ý]•Å§Ô ë loh°¯òþŒ`»¾¼–W+/^Zß{$½O2pA í`ªj Zà~¢P¸= ÊEî´´úQ¤7Qá–-H¶"€ÍnÐRõCVS1hA̕õ6. Zhma"0ƒx)û+­ž–á! ‹Ù)xb1iÉçŸÀ´î&-y¡…E«FH€¹X´À~à cP,Z䌘ù…E‹Œö+3háPé¦ivƒV©ÐسÀQÇ'¥½·º0ñônÏêÙ yž–ö,PS–¡Ø³\v(ö,l;€–ö,°fœ´dgÁ ïö,ì4¨' s–lȈY)Ö,a yâI@c–üF¼skË£]5fI!¾œ;qv56µâÄ'Çcã C–€(¬¾Ñ`cuïsi>>¨x"I¦êf(ÝsK–:0ԌEKðêŸá¾@ê`g l Ù}8æ ¤ÜÇ¡qÂ7Ê@»?°§ÀRÉüTÝ¡Ô¸?’«œ[Cã1,El¨A9òô»ŠK°Ç™+“V‚´hÄޝ‰ô -âóÕïS܂Pþç˽81ŒÝèL±x©-ÍøÎâ_øˆ1îÞ*ÒR9·Šsp  '÷Õ;È'#(Å=Ãn]FÅ=ˆör’&Ü? )õ÷Ê (^±#¹‹p dÊ;¹p»ìéý3'!Œ\¦K/!LOQÝMu”AßìoÓãŽBTá6{½"g9ÆX(Î9XKøMîÄsÊÒ]ØT¤7°iÊ~¶[—!؂H´sõB7¦uÙûsÊÒkØTô—÷ÆÖ_yÀq(s-oÐǕçF.B÷Ñ ½œÃ©¯®¼BXºk5ó 6-9ź\:1Óvm ºM?4]aé=¬Õüå½¥õWþ‘º„é™ß.ÀY8ÎM*‹ø½h8r;óÉA…ŠL³7)ÂIq V[œë4AÝž?¼#֊ð R·‰8¿£1´>‚1û£1—GåÔb¯òh`"‚‰BÃÞ§îëS,s±kî†Ü롄¶`‡xî± ØB…bzNV¥·VƔ¡;Ö¶*¥kØP%ˇP˜«Â*†~lz-”«2©|»Z¯|€·µ÷¥ï‘‡>‹‹Þ%.‰¥ödî⤆_¡a×.^ê^„'$VnjÚ¬ùhq@ƒ¯è²sJˆí"sòXYñTq,ëÓ<ÕNYzªkÅ⁸+BK ©Ye•Œi­og^mº–ÃtÜ]=@”ÆůWdÞÃTÖ~Æ/²–NëZ¯ø£k[•b.×<‹i"ðÆ dӞW:-„¥ïº©çàm­¿ô's_ƒ£ ÛÈ+ÍÓÉEót[dÑ<±LhÂYhž`/¢3 ®yB?™svͶ ݪ§‹êé¶À¢SÂ*ž`]¨žÐ'»FA…m ²(žåç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgiÄÛyE¾¢uîèËդƑ¥ÖYÉEU¤ˆöÇ¢Lâtè/µNڙ ßԊ}á—Þ˜SZ`C6u±6VTÊÚëB÷¬¯W+ú—ycëo=î ÿ$Óü q+8üÕ¯Wdp$zÇâԜT#Ánë ö8Åíó´³6!ÀXsŠõêŒÅÈ3Ì -cÑÆäÔ675½Š[÷͹êý¼±õ·þ„¾ñxT=찃U edN2ÊC q} û! /Ø}J[G™­"«…^3Øù‡^y«ˆ+‡:wPÍà…à–îitÈƟ)Žp5ûÄÑ'J:™¸^tå}{ꪍq œ¹×9“/V{‚¨IM3lÂ}htÆˈ•u3B@"/ôðåÒ)—I}ŒDôýöp³;>TôC9K½÷¡ Æ¡W§¹’Eöù”Œ+‚*Êd걃Dµçgà”Êښ°¹²B`'\?£ÄàÞƶų̈Ð(yñ4Íꮣ]–¼aÏÕ)×®áÛǵPx»¬Ó -“l¯F·äþŠØWØ`-‘‡Æ4èw%+–Qk‰ŒOBPµàiª[3AGM½֌¶©B°.íÁB †®- z¶Ö‡æ°mÞÌëùÛ{[ëÏü É!Ü@ AjI'@8ýØ+’!—‰ù"!žtCqÁ`}å Æ^o¨ºÂ:¿`W„R:Q¾ìq+­¶&átÇ"WìTŠ†ØEÝhdHx‡°pkÅ4 ä¬]p…*†c^ȐiE§TLV¨ -½N‘TeÈJN¡È©æ瓆NèÔM 0̼´“k`hÔ÷ÊûÊ?´ÓÜÙ§ŠóŒ´ «±ÇŒ•ò=ìL›[¥ |‰ï E@?u¶©†D§¦ƒo¹SCUð^¹Ú;à΃i‹ šQ§D74xlPû$Í©þ¤2—ԟм٠ŽíS–´©MɎ¨:/Me#¥Ñ¬ý4( "X-VloJ ‹× Iõ”f@_äƒ-Öýe¿Ïm°<ÛÃ'Ñj÷zE–ã'Óì"rÌÍøFy#¿²PlsȀ'0ÖZQβØ6e?‡ÖNXˆ7®õ›¦¢`º«ýÅôóŠþòÞØú+¯ ¬_úß°òy”½^‘g5¡~CÏ qÀ²œ…ç9Ž¢’šŠ²y‡¸hÌ)Ö«?jä¤pm î]Zk¯…b–׫ý¼±õ·6ã Ó3GœË¢N‹ùzIÆ;)w­še0¡°¦L‡œtÄ/Ôz#Ò †¦-§”NíQ'CT¢ë 4@¤˜Ò§ýlœ£¼Z©U?ª4´÷™u`ó/sª§P<Ä y„䬸DÞÔ¼DÉVف¬¡PŒÁnc}!º6LSm¬¡X¯ö¨“ˆ‚yÓ4·Dˆm¯F¹*/l¯çý¬±ýomÆ!À%=(ZKôŸâÚs2lzáÁ!»iˆ„•Qº -Z¤¿©R®Šôã4µ çÈMcN)½º0ad3ŒÔƄ«2†Ë;5‚9-Ê˕jõ³JK{ú“ ՍÃ$ȑ¿»ã<›˜w¶ ÝqLMŽ¬w‡Õ#dwÀ;Tº¤ñlzL´xä}¡h Ÿ bÞ! B–rÌ;ÆL=¯ôŽº!ºÉ@ï4·ŒÓXQõW`ï`ºa^ÃÞñ}d9ŒkˆWÇ?¨Ð-¡ïІ‚*A -4ç©x­ãѝrå㏓¡©hÐö¦­B)ºBeä|PYmKú¥ÀÒi¡¸üÇÐÖóÏ*M­¿ó¸êÿYpðtÏ Žw­dEÈ9–˜¬¥¹"ӝbC°7 ä^›r‚uiO:Yþ© ›¦­dæèÚijÍÖþr^Ï_ßÛZgÃí`<!ÈZ5·Hœ,r—<ŠPK@”ð °1öæóìpá«Sl›Ã§¾©`-ÏM[…Pút–E*Lz³Õ–°¶Æ¹í²PL,ïæýý½±½ý mµÆÆ"Â|@aŽÆʀݟÅ@Yj¢LKpݏàiNÃPÃœb¢‘ÆÔzù‰Ý ò…2÷ ÕÉÈ䶐©=F€r§ê5$&[t€«_U‘þÇDP -­” æ ÔÉ"uCÎ5J % 7¡…àë…èþZÍš–œb]ړNî‹>]Ú(lhÃœb–w«ýý½±õ‡6JCAÏÇ6öEZÀýNöìúpJl#d*2‚ ¼1Hì°Ô^b¸¿©hMcNYöêd=oÌ?aý­Í8$=–R݄^ÉÂ܀uqP¾ÈÀ'ç¼ïçYù׊% 6V)ÖëUY‚FîÍVSëìój¯F1à¯çýJc{ßú¡ù³„ ,!q%nÀq8à8XBâ•àìÀÞ­Tk¾JZf; Ÿ¢¬™ª„ YPèëÀº 1å^R™ã4ع>Rˆ/SíØ÷z¹À€½­J±NÝ[mäÃE¿©mÁÌ;ĶO£\åÙ^Î+úx[ë/ýÉ),1¢‰ -¼œÅõeÄQÏ3¸ Dϙ6PF²ê_äÄö³}—ȉIäu¯„ˆ•œšV -ÁúrÍ_©²½GºîK;IÃÓko©÷w2ª¿´µ³þ²Ö÷;¨n=#È]žN•!ë&uÖR㚱zƒz€©‚±ÝYc¯,EVEBr‚õgÏ*– x•7„ ¡Ýû3‚;‹õµ¼ZyñÒÐúû~ª ɹ3½eÂU’¯WdȆ“ ðQAåé•>º Ó|¡8‡›­¼^ƒ0·m‚õéüM©I1îMKÙ¢øk—¹ÉuÒ¼›Wô÷÷ÆÖú™Dõ€QàØa•}½$â76Ô½±ŸüC}  gp‚ɪðð±©Ö©+¯i©PJ—ö¤“~Φ¶EkQÈMŸ…b–w«ý³¼±õ‡þT2xêdI}zGºTê`È x—Ãî5.PY/$…`*aÀ­h©­‡m×Ïm[N±>]›42œ5€jÔƐÀ¶ÏM§F°'ýå¼^yojõ™?Í¥¡§£Þ$âCÊÄv2ÌZQ…45)"×’(㌠3sОÙ•Ç¶bgƦژS¬WÔȃ2‹Ú˜PD;›^ ÅçB_¯VôOðÆÖßúÙa`–‚:ü~ÿzIÍ%5ÄdFKIjPƵ•bÂÈX²-zEΐ ªiÌ)Ö©Û{”,CÇüxµ±¡Ó©Úk¡\•÷Õ׫í j[«­#ø9#äÞøöý›¹¤v[@»q#Ъ »å³»Ôç -ìgõם«’+ªȎH ԝ094»¶˜nÙÂ4R…t#k'pƎ螐ƒïЙ.{¬xnkéT.pnxGˆ¾[ ¹aï -~ ¢ÝH\f¨Xîd>ÎÊ-ýiDCArO¦£8{îv’ǝ€V s…q§Y6uÅMILoâ†)ÙPcâîhÙW71@°X.AÜ åe£¯Âeó‚áޛù=›g† œx¸Á]©fTGÂ͔\6âéÃ~;Á=ãS¡&yÅléNÙP%´PêJ5ÈumÈPÙµ¿½]_«Tó·†ö¾ï= OC¨ˆ2:Ø°€n;¹@·gdёŸ r>þÜ·áá7*¸maðrnÆ -Ûf> ²ÆŸ ™‚ÚŽ³væXlì ä²-[~fhT¡$l`ØçZcµCKê*@»[!³» -ÉZ€«‚È î¬ñØÐÞ+{°7)käÃ2©²v1FÅö"Òña¬ ìÑZY@° ÁAB´ñuì50ß%ô+5sE^£ÎK^cÅ1šx¼NÙ؁á®1@´$Ø5SǸB] ó‰=3è†kV+˜ëœŒ°€\÷Ì?µª@®ëâ,ëýåºÇÀ»FL×q]©†’f2©\Š™l¶Æ -¦ÔçÕOÐMµJh¡Ï•jéڐ¡¨k-ÚÚßʈõµ­½¯«ßC_Œq´®Ô6«ºƒ§ԐÖkrYS!Ör>Om3NX¬ µ@¢KCŽš¶î–àj{§B¬/mÍì}[ýìÀxìâüzA-PhlA\þéhé0Z²Ìª¶¹>7µpðAôòv -ao®TÃA—v (흵pj¥RÉ¿¤4²þ´úÕH¿Åd (u¥øÚ·°i€~b ˜V"Z ¦WÕ«SrB g®Tƒ=׆ ]ûkÔõµJ5ñÒÐúûê§Ã?ý<]ˆí,ûEóp@4Œc̯ºN ãÓÐX¯&¢P ¶æJ5¨³7d`hﮅLûK•JåKJ#«/;æàƒ‡`.ñ¤²’ ¾=岂””s<§<®•p±÷SªÔŒlÝÌ o-9amtjÁ@zC&éý-à”õ½ -¹¾{ijÿ#æ“²~}‘qóü«Û‡7àà¯Ë?½ºÖ÷ùÍÝՋÿ|ý£õ»Íóß__º8çìæõ‹o®ï¯®oš,~l:úïÙù‡›—?”.Ž½×7÷×¾¹þ‹¼Ö«·ÇG¦yyÿ›ë·íË­þ›ëï^È\ÜßÝ>¼·ö·woö*¸÷D£zô;ÿþúæûžú¡¿¿ûËÛ£3{þLïv:¿}i?;xÙÓºùó5®zâßTó-‹8ß0« -‘g:eU¹¦%ë_‹›ž nþ¡7>•.K¿µèW/lr²¿àoÚ6S—MüUï|¢\ÎÙQG\¤-'÷C§—wåòîq™<'jÌ6rGŽž}T„µ k<;@ùf·¯‘À/%ÁÑZP>rŠ j€7pOl>Óð l¹&T¬JB½†WËQ!« ztï„ä0=Êñ.ª="Óù½ ¦JzwºÙ®ç`8Ž¦†!Ó'‚ l|¬#uŒPÉÑzŒ:%äf%„¡~Þ4@‘‹¶fðv=)ƒÀç!ç²~›œês Ìi1sfEJæÙ úóÄ<Ð"ÍÊ·µäqêõÁ0ÎJ‰œ•ˆœÚ„±Ñ`Ø<ѲP9< ÐSÀzÑÂã’*›ã8•ÙCJúÔ÷¼„-j°;¾ÉC¨|Q Çoeˆ]ˆEä óZ#»×¤fQ­ï‚t¦®YâDÓJÁC%¦Éâψ '%ÍÄI%³š€gë5uSûº·I?£ïl¦Þ ²C0I± .¸ê£#5á÷æfJŸ˜Û‚Êl½Î”éöÈ[SPU‹¸ÂêMC’ÚÐ;FÏë@è„ $}¹‘F«„ì°t“ÅÑÁÌÆèh·+«¨Ït†CÎHšGÌN³‚‚r£ç‚¨÷”ÛtAZ[`1JÔ¹5³mR&Y` -Cg#«å>«P'Š¨‚ƒqÍ#)1øUæ*¸BéaBìWàÚ%u ¾÷DbñO°vîüÉÙfx?¦ö ˆb†;udf?ù°öuòØÂNwù 1‰ê¸u¿XƒŠÃšçÂÀ”Ï)Ú:¼rDj¥Èq“þ<º[^Î1a<áɜåíæÑR à;r$ -3Îe -™)£„ÞÀÂ̅¤§™éV,̬`jǓÔ.ðN2.˜ú–¡÷¶õ–¼„©oÂÈ8h &Å4%i–í§ÙGf‚é=£‘&rêÐ ~)3ü .p9A¨.€ØǍõŠÝѼ’µ "Ù@z#³c‹óˆTĦN÷3 Ϝ5ÑØ$~ž|L:ˁj°ÇD¹˜›Ç2°6½7|Uæ€ç‚F0£˜â j4 ‘)*:#!´=ÍÊÃíózí/%]¡4 Í=oñ€\¡õùæÐyOP±ù&`"™ÌÏ4!ðå¡!ÚǺ4²1挔Þx(£RÈ .€v=*‰Æ` K]Ɍ)뛁ʚ"`ÚqCiáJƒf/€NêÕI‹Ci¾Èr^a\®Ì T½âNû7zéHÄíHÀű•Û§”™I>åYÐØlx gŽž²l…0Ï5\ÊNMù[#4a]‡¨€k{Æ^JÌH ¾('µrÌs–éÉ8‘guïei¶+&$ô›1$ÌNjgu²ÅÓÓoO³ó¹S”UŽ²J‘8ãÜ[jй –ñ«˜F¤2NÔ)(sqbζ&ÀÔHÀ‘„Öéæ³&&£Ž¼»n6‡ -­˜Å‡Émõµõ¶'¤²qJ?NV—I¯Ø˜q o㨎š>k¶ñiª÷ Dý¬;uËðŒKÆ/ö$È=+#e£ÂøpOo“Õ`àE©€èòô˜j×h‚Ù¼]r=}bâ2RÉ/Hèð՛<·X¯üڞ¦—qe;-ák鈽Ch§Ê&|*᪨zî–j¸ç{1Z""¤Žv+,]ylJ8Kf}¢ä!Á‹6YBþcÀyœÄÔé -DB=N:ðèægYñŸêýè…üœ’¶Ejb¼0bˆÓTùH3ØÊ { 5}`8’_‹³ƒÎ¸¡ù9ë ºH+zEÄm‘Qí ±‘WNÈfUË‘aTž½fÐú°ðÕ<Ñ0;f½V&w2¨x®óË_Øɶa£¤ÏQÓ¹*ŸÃ,…QÏJûgÐC„hù"|Ï tU^OºÆÙ9ZŠ¦ kWD0¥68d˜5'Ö®ˆùíؗäTL¥©.T2¹‘¡¼­ƒïöœœ}\êÁЧH¾…À<ޒ²q†^M±WnXHä*]š51×ôFK4«tÏCµS•Ç# ÇS„Ÿðbâÿg}'NêôóŒÍõºxP¨9˜‚<ÆkÓ±aŽœƒ³9Ä@Ì£ž¡½VÉÞ231\]xA{“ýÍSЫ‰ 1â#[Ê%nsheI^%‹·½pǀOàäT˜çcI†ŒpS{oZ„Ž6ÕÌßǝ† Õ^ Ìç(@yþ܌5–«‚@@&ŽN¯93r_ƒ=J£79-vúº0ââ}É9fMDȌ6àÕàS:˜"rNHAF/c§­ £á…CԘap¤þs¼rÍÁBÀAåEZ lrIX*Knyڃˆ)Šš™ÏXk a`´#' ÙG‰!À¡šbŽ'(²Ä)ñT¶ývj65’ño ÁRG¬œŠmú³-h¯¼’©9ÅP ¼‘ÇãîŒ -ÛÕx¦¸•ÆG¨‡8’ÊÊ æfS‡z#©êóå22šQ+3ã(à`R>@m[¨¡(pÔW@ ƒK<'ò Ÿ?‡„h jFÄ &E38AÿЫƒ&†„áYî&C Ì•®ÚMF؉L9ÊŒ§!EŠ­°A&Ñc‡ÑÂ@SŽw‡}‡Ì‚°åLÅ(žÕ3d3=×ÚÝì¡ ñ™T,I˜dE!Åý<ªeÓˆØ¿fõ ñ¶r~¼'µ8€5}LTˆÛM³®@*2]¯Æ#ܘÔ+à~€õƒWc…£GËㅓYY9¸'âóÌ…U8ÎL¨™V|mŠ²EQ+sm`ÉG /ëąۡæú%3 -_A¾qІb.Á¢ï™£ž|ÃX´Š H–2³¾ j1ib£#øÊU -y„i¢À95èÕKœ:ŽÞ‘´± —ÕTBÉòفÀ܊ɘ(˜Š¤Ê™?¦Ç£%@aB_¬_$7åPâxœ°Ô“ -[öä9\T'ƆÌØ"ÕO”<Õ!ýtÕ]‰<_–ê"•KÚ#,çò³«G¼NÞ+A¥ÓHÎõ-ëÏ©‹PYˆQÍPÅ2ô¹$£X ލ)º âdຳ[AµÈ\ò‘7Ö*bRä&tú%ž¯ª'#o€Xõɤ5g?¢=)šF»ycȍýä)öšuÂxC§¾¬P(#¯¶¥ó+:G8Pã¼|”W+hy4ʬyFFß&ìcKB»¸"ÎôÆ z䫝’™úy:视¬’=Nzê+#½Ÿ MËÒfÝ¬ÁlK;‡áü †Å€aý‚4özÑFß zòÑib:zk1òŽl1;€i¢&ẽšSÓéÐk_r}Ô£™Yßñ—ˆô Qq©”WíQ`úg“M’fw -¦GðhÆԁù võÏkjØ`Š‘ÙQӁ¼Æ‰ô1ÞȽž+Âõ^#£ŠMå…Ò0Põ133l¯¢½.æaÔ4µä¨ /"€_gÅíëªG¶­”œ>WÈ\l,$}TøŸ†OÒMÊì7ÚS}#ˆrPÇó%&጖!¨ë‚"«™`Ä nƒe}ï{š!g ÿì±Þ-Š›ÂY?©×åªØܔMö -•AR´âêbPzKÁCK¨?9æNÉ´ª±âÕçœÔÂU²€Âݜ h¨ÆÖbä#C¡gâÃpßÁ¤á¿<°/؀YВå¶å•™Ì±Ó]÷±[æì¶Í±s̨£Q{3–ÃXȳ׫R›î˜8¡I½i2ûl1¯³ÉZ<îS4 -{‡\?û‘·LIŸjYÂðĤÎM߉Øíْ™OôS1`G]PË'”Ç`10ÃTG›®ŒMkՀ—8˜yRÀêæ;3_±ýœGÞ?ûÆî˜@(˜ÈªÑ -í̹\ÚUæcS]=ðAÀ;GK!ÒkØÙötœu×0µ¬~’‡w€iuš°®©4ϼ²sfp.MB„Ê9ۃÿÖ0Pû^ƒ}'œã³ém$À*‹ô ©¤"¦xÓ M²!»i7L£ÆÓðNBßì+†©1¹s§ÈÕ2›S!"I¶ê ŒI1Ù`ß"ñ?£RMã?†—¤‘Ïc\þÌÝgÛ×· „¶E^„pà¤?ÃwÆd¸»’±ß~e²CrBc -¤¶S«œf£&I˜çÀý{à흑Hè`£ÃÌ«Þh -`€Î$JosÇtü ;£n8>+jˆvdឿÐúI #ã*P;^Òa;Ï -ç|Yü~ÍSy´+ȑRšoR¨A²bF)?’a;‚ @c5Ö!Ä+\v43èJD‘|Rn÷¤h¬Á$2¥öLeG)RvÀvªÞ\ÐO;¢H¼¶N¶Ãm0ª0Çî`Õ(¾({¿¸æ‡ÄDlðOt¼Pb>î ÀosÐ -&e!df.=¨†œ§lòԉ›>ºÉT@¾@ŒðÉ ÷V—è)£§Š |ý¬Võú¦~\ž#±?»N"P¦8ë½Ö\xö$Dl‚:Å÷¤ W/ÈîÏLú&ÜÁÜ`ŅpPÖ§R3Sb --ø&âšUŸ£uM{œÌߨ0Í̊1Îêó¥S)AݽÃè mâêV¥-˜©¦S¥Œ½2+(µW˜AøzTë°ÛÇ"TŒ?hVvadŸ´ZšøuÍãS©ôèg}2E9[º(Ä dçØp¯ó¾«>h:U¬±¹c–ÀQ=Èzg[Ðä¤Ó\ŽB#mn “ÑÐt -©“"Bp&%ùZ &¡×zt̑ÂË!ùÃw¶¯ 4zxúXôå’,„é%q¤l‰` ˜ö4šx‡Û¾qfO“ÆÍkFܓ°;˜ô”ó÷ºKx+¢=Ç3 „0…ú\)ÔÞNš‡šW5µ3OÙÔh:Ì UVŸÔ;É%…[™ê ~@ø^¯ï.2‹™yi¥“¶``En` -ÔBP±‰k̅«Õd2uTìàm£ù)ü;·‚ŠÓ!vž\d”UC3oÅÔJŸË:‘‡r0ÐT˜5ÊY-zöý­VørîÉùIÜ©fïÔ»Õ® d:ûÑÄ¡ "L©ÃLE4Ï ´Ÿ¡úXZ¯X Äð˜Ńò 4èØÏ6‚AuZ R‘|EÈêÝrîŒsx%Žv‡;¢,2W&\ðÉs›Žsõ³‚ˆá-šã~‚—Ž;Môuˆq×T×>†¹0õV‹¼'ÁÉȬ1ëc!;㶠Xxf]kL FTB|RVEe4LjZ€™‚0k - xM(ÆY¯“q²͓üòPpȽ£ƒ@›t Yì;AH5_ã¬þßÁܘiVÇϪ^_“ÙêñXç3b7Ò¤7]0ãLäå4õfÛ¬°°·we9ŽX7Õî:µ=…A‘e PâĨ8 -ƒÄžDzòù|WL‘4ړ&0ææ1ë0¯kúœNLͦ?Â8„f§áÑc†N Up‘gÞM¥þ&-gz®{ÿïÁYF¯-M¦fA¢â‚÷Áێ"ÄçØd̤1.Ö0©·›"î5PTÓ¬'¬özýd=²fRíªäȅ9¶ Eª–ÖŸy{ŸCGSçÜ +Nå×x¢;Qay“á°ò\PWJ0F0ZšÔR ‘QPà”,fM~E•*•éЎT¿àÏr8 w¶:†w'°»ÅçÀ 5xÖ¢­ )êhÿƒLŒÓ P[pk6?¬ã7©îÜózš©×Njn„QâlÀFêOÁW׃B+c¡v¶têޢΔĄ”'CA† —3ËI ˆ®ÕÐ ¦V7üHpm˜pôö%25žSM\4k[júèLzÀ;{`þÎM‚[M‘”‹miTx©e^!ÆI† éLüñ¯Ë‰nXõm3½œÖâÔñŠ ñ¥Ù/1aÖ¦4ÐѦALÙ"f -ç(j .®Â®º¤cy„ŒÑ•Ghí×Qýç]ðþÿ'£+%ÌâçéŽKdOìÙ¹Dt8»Ì0¶ XÏU\20#®+Ì}D`ᬹ,JV9¯W¹+`¹Ž£è…|íTp@dÖé˜äŽÕÔ Û®ú-×yo2pœ€BrZ!xFÝ*šÏb¦³’‡èÎ¥­ ¢Ê42 ™i«]£tx \σ¨ÚcqÑ)6MÌ)×+Þ{t娶Óqa¡ÕŒ´Ñ0Ú°õ10’‘l`†!!7FÆe­BÖ3OaÜÐæ Éþ-<Ȫë癨 -¹" ¶$.Z$XD @kv^ÙRq¬ðgˆj¼/Y‹üÂîUòÇ(u fñê 0Œ‘Ðw¬AÇÙU±Fä´äŸ4:EEŸ2aT…ÞR#ɖì»{[½À¦g$ŠJȄO#‘§>n­®ÀQŒ&ÎCkcBÿ¾l¨ -»œQÓ"C©1¬z-‘ƒ1V u°S·u}Œ 8Cw2~(’<Ë·a§u{˙pdŒ(?úVæUa¸¯€‘üë¤%`H)rqˆö fŽªX ì”ÈX¯øγúmô¸C47GyVÿ°¬X²Ã¤`J&2…ÿq%Tð?Œ#1LObÒpŸ„yT„ܦJˆ´ô©©ƒÙFf¹S`+ <-‚Ž´?F&—Pg@3q܇Þ6¸š¸!øß&½ðÄ„êëé(Q#(£d–ClÍ.6€AkkâáŸÌ,‰mÎ/™\öŸ]ˆJƒpbê8ô#c: Ð^O‚{ÄR¢ §1mà¹STš°:Å?#S6‘î7ý6ޗŽÝUà?ŽGÜî“þӏ”]ïWþ‚ -‘P;úᶃc™ÀÎQŸÃÆGH|þ - fKÞÎôS0§º‰üt16&ÅaÅ à6¢Ý ä0m9öÑÜïöyYñPo¨Kh ²‹€±7¸²AóäL½A¬A˜• ¨œ)(HjêUÖµç‚Z®‘®žW¤›çÅsd[l¹â6'å¢lr©–$É`””ÔDíŠ2Áþb¹pJjéœ:=C0ÁTÎoŽ®ƒšˆ„¦úŸ çƙÂDy¶“[¿7^¼sRõ?S=pÀ'I‘Ù]½O¬3e¿³Û SV¡ŽF¼N/ £}!Îjè0QÓ“Y0õ2ÃÀÄX^Œ¼£"LŒ‡Ee1`.ôàá/ô„Å à ¸¹<¹FE@íäΓU±·©^uˆtùb£ ø`¾**5XðöãócN”L‘ëhõâ?ö,°87îrHˆº|Š•©€§ -yFº[à,î]´Ôý9zÒ@‡ÓaÊEbÄ~әu"ˆô €Êjj•ÄÂÁ}/$0åjÑð¶& ÉÑûÙ`mâå·êó£YX¾‚À%3»ן¸NTŠ¦K9sYè6«»'t¨²>ŠwÐ2Aeóåïh†€=1±Úë…›ýâKŒ{™û_nžÿááþæöûÍ/¶ÛÓ««w¯÷p‰Êë8³rÉ Ä‰Ñ,ª4¼.dÅ)ô]‘µ’e˜è  MBïYêxMp£ÝÆN«)“õA$-)…ýÐÁV}zé³Þ÷õþ<¦ §œ"Õ¿B1‘cRP‘J|:Qñ3 pԓ™3žJÛë¶ÁXÃь˜R¬>ø‰+@1jÀԇ¬)Gªj¹V$c7*ìbeT\æ?¯wÄ-<0ƒC–0Þԁ5º¿9SŸ8Ât0¼!+’›×T –©‰ˆ£YÁƤ`bè%ïi-F¼@§òVb‹yR÷ `Ĭ«…~gÈj_#¥û©÷Yçf½&›H{Ê98nôNÄØëiïÐ#ÂNè!1 ÷Æ»r1^C§÷íU€:oÂââêÕSC˜´ž²Rÿüªã>e^RÏzGÐ-äa†ù÷å® -Êx]~£Šmª'–4‚6˜Kß,<mÕ»SU¿ö¦íÞ,*´’‹³”q§ ¦ˆõ9Çês¦U•æ•@?Q•Ù£T &ê“þÆYMcŒžœ)o©IN¿¸yÞO£þ{ø=`GÍ°¶2]›Ó‚9—´3†Îx¥Îs_Ò -¸Û5Ȓ®ê@ÊCJbq„õª XZ?ݒ¦í´¢áöÂÜv»xäù¡É< ÛԷ̊·èíÚZ} g\`þwÚZ×N,x±=+A‘ öTVðla€Œ`'G†   =p ÍÃ3‹%2WD†i -„ë E£ÛÑ.meމ¼7æ¡ ªºÞÏô©aö .hú„k!˜Ð3¹öG’ŠRB¼Óax궛­Äæã<ÇC Áž`Ï-+ öó}w¹Ù8$“CyëÅÓp,³´>A]FØ/àõn`Áýxʚ!~'xLî ÖãÖð4Àç{v?ör)K®Ô¡¸r3•Ãã÷ú9 Þ¯K)+t|,zƒ'ÀÆàMºF† 9zê½ð‰®`ò ‹É(gã¾"*F‹‡V|ŒxV­†–vÝ/þæ -‘Ýòk.€ÕJK^#þ&r¸Ǚ˜*;,H2±5`n\ù ÞÆyqøóe0&U…x3¥5@^ÐrLáE朁ð$‚<3kþÅS£ßãyŸûU‡êqY0Ðc|\RžûñVʏ™•t8ˆu™Eõ˜ÐË@k`JSqe•ÿˆ˜Ô Þ_=¬~ðѳG#g°@¸¡¢@ÖO·Eì­Sc«˜æ¤j ùðŠQ[´ HÆLÂù}eŸzüÁõër£TQ‡éJVûÙGúÚɦ7KXFË&ÂàK<OQ¡;¿ÇãV)ªÜ'h•añ@ѽÉ ‘³¹Ü©¨R¾ôX]!Ô3gCR=¸ï1­²Ìf·ž†Ä’©¬¸nD:ïG%p¬ê¥»Ô]/Ém¦ EngóãàêZÅâ²òøû\+&ÂVÔÄ ›“„ä.¯‡êk ˜(­eªe¨ÁÄC&}Mt ÄOû³¨¸Rpt9oZfUJ—P"Ž Œ±fãñ»ëù¥JÔA; ªá&ò í¸çbôpõÁá¡*u>Ô½r¶~üNÇV)pJ(€a«?-ü´[E¨Ê|CŸúâ‘DyTJ ½„Ãë:².“P¨Qóž9çrÿQµC‰„R‘yva2?}qv™P"Dƒüí Ì°ÐèÝmúòͳÿñ9Ûÿ˜£ýwCÿ >þG?õ l*¤ÛÈøz¡?þqiª¢ ü1‚Ê$*®ôãk(Áðc´¾å‘Í>†O Õʊ>ƺü¹ž$ci‹bÂc †uÏÆ=†™ÈCcñ7Î6¨Çø…]õ˜;É%`Ø Gî8îR;7â1¤•/ð±\H Ä;¾!0Ãç»àŽ¡ý>땴cT‹RˆPR­ÛÚaÇ«•_tm…&:QÇõ2bw#×1éL~º$:®ÎÅï¤cfúœe KAœ¤@Ç·gÚ t 9¨°Bæ3 _ÏÉ9FH#Š9F$•¿I9f3§§NÈ1ÕåycC @”I ŽoBpÌ¿ÛޘÆ1&݇)Ï=áÆ·o;ÛݓÈñ0ڲ͋iD£±°sb%‡¦5ÁÆÍüïä7•ÌíTc¬®{2;ܪö$ÒÓôq¾9›ßcòŒY®vžsmÝýYì@ãüñŒQ×Ç=qÆ0 dd§Ã#V -Ö0c4ºÎ:Yƽ*ö´¡Œá^bdËÙ¿_žÉ5dŒÌ?2õÇ¥]ýMzý=P¿cü}öaŒ}Xø-„1Ž‹ÚŒál¡Îb?MÑàã£FÍmà‹qîøB6z1„d¸Ú€³DŸNÀ‹9#‚“¿Á‹5Oªu‘H”‘ðbIÞL3Nxo§‘Æ]í>êy'»˜Syùl0°&)K°‹qûØ v1ÚO!ã½¢‹qٗ±”‚êÃ~mäbN⨲ÙÈŲ>5Ã0А´–ó6t1ߛ .¦‹™é²S;[Ù¹ÅXI T;°Å]Pµd -Š •Ù ÅåßI,æÚéåK°x<–y­¼bñm®xx -Z1ÎYaÅP `V1>ƒCÇeRÒ>êqRñ¸ô©¨˜ï¾dqŠ1™ÂEÞ0Å Äb-”â{ˆè”âÛø“ R|[­bÀðÃÁ(ÛZ» Q|;ª„b”<㗂PŒ¿ÑD'²™`‚OLõüõ$ž^üü•NLL×ù$œ¸)?hbDؑÖØÐÄ,1n%ÈĐN¡þ:têÕ—ùZˆ‚K „\W­uÄ ¶g§#aPE8æ.BÓcfwñ®g4'€…A$ffúJ‰k‡xã_7GŒ°7T;¦Ããºññmò ̬Rí±²'¥@¿»r3êi93&ñ§´DŒÊȏ„!aãf RJú%kY)Ääi°¾Qy& °ãíÇNEÿ>«‰ok[ƒ@Œ_"ñßdỘ7¶ò‡Y2&¥˜Eͳ‰>Œä9–+|ÅøWÉFU»î‹2ՀîÞÁÃ`¨âý2gøf×àå/ -ü6è0 Ә¥‚9Œ¿]iÉHþf©êJFòdŒó«EՋ@‚ùçŠF± æ«  ¿V^¤~l};/NÖ0rîp5 qs'³Kñh^œÍà cŒaâĘaü;ÆF¾xÆ0vpÜ1|Wy6Â0ŒüÈ×½“„Ñóï¶AÂHbõ Žðeë†FÍΗ¸‰)tàöòÎÑÇte7£ l;¨ç†Sl‚ðÁ7áoá×ÛK؈ÂM3q⃡¨õ|ˆÃ—ð`W&;øP6uG›h—ä`Ü¢:¹Á‡¿L©µ„C½y©—¥jò* 2à_ÌI FB¤¶ â4í¼`k¿Œ" š¬àbá6ñ"§Š‡¨`nt•I -F [¿»€‚»Æ¨ä7$o”à0$x(6`ü/ø«ô•Dp±c›xí€àü{å‡1ðÀ¨pÂq“ìWnƒæ±k²€ChàƒËi}½Sy™J¨@\ Ԓhàƒ"·ëÙÑÀø^Ų6ø;ü¬èµ†, >¯ŒrXÊ\‚ ?ìê‰f`ú¾w20’ã üzo86&˜ëñë Œ‰Ç™Tàƒ -óZ’ -ŒQƒ• -Œ[JÇ%¨ÀéÜRØq0ðñ©ìœLàÃÀ¾@#xs=;1jĬ MV4æc4ákÃcÂÁ22hÀ 0°P*ꃆº®\ÜÃË(`V|m þ†çº€q ëîÉF²[\& PoV -07ςŒ[-=·‚èJ"¸³1€Ãà‹¢ÏDó®\²Há!ŠÂk`(08ÿÿN`éÊÿ½a üïå÷ ÿ"ÿOÕRGT7²!fÿ @Ҭѿ@ -Óß[É¿ðO0ø#ê;‚é{#’€Wð/ýk™÷^À¿ñ÷þM£Á¿7¦Ž:’ûûîæN?ñhƒÏV쯝ô3¹¿'õCæÒsý½ÄèÎ\$ø÷„öŠB£ÿb;ùü‹^jœowð/ͧï£ì‘ì×ÿž,¼Ëø"aʯ÷Ä­Éý¥å9Ÿ7î/XnÂ{Íý¶ÕÔ4%h¨ô(íûKüõŒäþbϋ¼àþeÛÏëûK3Û÷ÿñô6±¿üVÛöW´ßëšØ_^àóŒ‰ýå?þ§É+¨Ñ½êÄþ2 Ɨ$°¿|@äÑmØ_dªÄ6ö÷ê`?æÀþꀚcÃþ2CWÚ¤þ3 ˆEPÙ>`0ѹRñ ÏÍ6ƒ¦þâ”"ÿ‚ú˃÷±SÏXÁ þR¥UÜ[,ê¶Fy£þrWU “¿Á×?¨¿°œO臒úKZ.hè/¢Š3õ—ñÅv¿A™¨Óweê/ÃGBQ›ú;^ÿφ8õ˜ŠëNæ/ø“åìù‹îd<эø +Seüåfힼ_èö;Ü #Y¿ z©ˆÄ¸_\§œ÷;†¿‰ ýŽSńý"'¡²’•õ‹XäaUSîu7“ô‹¿K¹ß@¿֜“òûØeJÈ/³&}¼1~Q¿~·s"~›S¸±D )^Þ¿¼êrœ“ñËÇÇ2›È]Š|nˆß¡šL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK -*"Ê+Ü÷¤àh ÷U`Þ© µ4ìZ'ît_jÍmÕTŠ€§%ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿ©=é¾JÐÌ·:…úìF÷Åi³DÐ}Ye„BÒ ûâRéˆ&ܗÝ)Š -ò”*Fa>;Ó}y_X0¸â}i…‡a¼/³övÞ¦.6¼/¬Anªuï¢ËޗfV¼/•›ýn‰÷ewŒÁ÷Åh‚õÕÎ÷•–$ƒ_¹KBÍ÷=‹“%àV®9ð+ɧ6ë¥Ñ¤eãûÂHo#ø¾4 D|_° ß¿ÉÅ.6àW}ô%mã1m€_XY9€ß“ìÖëJÀ/ {7¯¬ÏHÂ/ÄêK~a }#ü²‡¬AøUYjÚEøeoØ"ià$üª™Ú]“ð‹>DœÒƒð{’‘)*ï$üRè=ú™ˆß³ºlÄ/ÿæû½"~i­% ¿Ò‹å›¯þß¿ˆŸJwPI¶NC…‘$üJû}<;á—þß]4ôI¬Š& -tw‚ñ‹:ÒÝvÆ/Ìçe¢/¿°xú2㗖ÈwNÆï™ý'Œøå±"ªEPÃLàmˆ_\¨œ±@ür²¦ˆ_x@¬¿Ü¿Ôfq‰¶&Xᨁ­ ¿¸6Â/DúF›ð‹wìn×= ¿çí%ÖNøe‘]Á ü²÷šÅ&üÒyWˀ…ð{F> ¿´tëã dúìö/KŒ³øž7¯¸睄_ ¼¯‰¿áW¯ÁÓvÂ/­xƒð‹£KÈ_~aàĵ~™À„XAç0n>¿2´º~ñ{äíá—_Éq%à“ÇÑÛÆ÷e¦ïî-ù¾L“žgÂ{1B= -ÀNÄ/†;ç9ia÷À߆Áç¸v¾/Œ‡A¼¶a†Gt_ˆŽád®p_v%T™¡<¤¿0yü‰Ñb#û¶ž 2»á¼fö¢³03 חÜg„ BGöÅóžñ÷ŠõM›±¾§çàõ‚a‹åíFõí·¢Ô¹‘IÓÁô¿W¤oÚLô}‡šÅDßçPÿхçûxÈžïshè œ/þÆMÝh¾Ø‰ËsÓ|k]æûz“7–owƒ£@ùv‹€ƒä 2ȗT×z%Ǘ xÈâÝH;l_ñÞÄ㥠†/‚â„ü®ß~89j„owkš ø2,^Îà‹ÌÎ=ø½øQBüލV|/°\M M…„±Nª-á½­H¿²{iå˜ÙlìC¤É½ )Ýêm—RLpÇ®v'·ùUdąís Ø¥ÚKÍ#êy íEÆXmÅìí^ZnÈ^ö¾e®ˆ½Íë¤öâ<@½ßx½<0͌ëm^5­—6ˆ VX/«ÝðršÕ˚8(•ŒêYH½Ù½Ô Þè(~ä×mN/èpÓÛônü.öy7H/Äh\èÄFƒ ¯ ô’(†dÛ -èåpŸ6Ö&‹ÏûXY±áya¢ñÏ u?â÷AçnÃêçEÝÄÁ«›«W6îpõtü½’yÓf0/h9 š”ÄsÁ²ay‡Y;AåŲNÍi­€ %‚+ý•Ê «Ú (&F!Êý$•—«Nÿ+•—È)6ê ?äu©¼Ü‚tÿ•Ê‹ÉŽ¡â òÂ#-â8²¬«h<üÉ‹e¼â`òòœm¥úhø)º³`>Æ­;À î…š‡„ Åýڙ¼ò0ʓL^8Ü“—6;X™¼tÓxòfòD:˜¼Ÿ•/éÃü1™¼ Ö¡(bcòÒÊ,¢™¼ -ᕞ^æXº2ywl&˜¼äfððbòŽªwcCòâÒ¹ú$o®0£–6RP6$¯cÊÓ!’—œvÍðaSX³nÑC³?É«ø€¿Em?‡‰ÈËÞÏ ò2ƀµ[y$Á\²yÓµ4‘—/¤E " Ð'Fâl%ò®ÖâÞ À‘—” ^‘—*û*à«ð¤"Ÿ=‰¼B”±y©|¤váœÊoƒÈ‹GɅÓFäE -V§äE™Yתÿe¿©Ç eUÓ÷H×>-F‡€ñ2JUU:9a¼Œ¨´§$7Å´A㥁­Ö ÉғD‘ǹ ß q-‡æÆːàMø¤ë§°ÎD°Í8^³Îsçñ"ÚÃêIãxÈDI4ÂÚ¥ñ'Œ%Tu¢x;’2ýL/`ûϵƒxa»ˆž‘®ŸÕfõIo÷w±ax¡²CþÁ^ü‰¾á…J õÆàínÛގj¹“À‹Hb#€·;ØüÝó8“¿ÛÛÛð»€<SbünsÐ0軤Bõ½Ë&1P½½ÛÕ îns¦qÃî6óƒ¢è Jú ê.NýRƒð Ýeÿj$íÌÜeúù$r·Zêµw)=»h!‰ÐSðv½Ëo«Q|âÛŚ ©‚¶‹¿áÄo°]¨`ÞÖ.ÔYÈ jhغsvQ Šèv`voԗ&cZ¬¸7Ä.ŒˆÝaÄm” 9y³ðþ®Ê‡^÷VÏÑeŸ×‰?;[¥ô”©Ò ².ªj(Ù^Áº€và‡‚«{»9p`uQ„%ñFՅ_QPuoO:Õř\†óe -‚wDõŒÔE‚³›° ŸL…Kís&×˵µºX!á½ ž.ªjàÚpºãtÂáÂáÎLӅd™|½¦ #†Ý`鲦hÔDéBƒ`ßJÒ¥Xû¾¤;BŽ.þŽJŽ.‡[]AMáÆè¢Ö °«¢‹úÅzMŠî0L1 ºÃq䍡‹¬„^“ˆeŸb·Wô¬Rv†.­šØ ZB´é9’¡ËP:ÜÛ ¢ËVéˆ5Dó>Ã~Ñ¥q¾¢;Ö¢ câË)Š.‹ìØ(ºpuâåPÆ ž;AÑÍ|ñFÑ¥‡ÆÞJ}–rF -Œî'Ïnž1Fw8×µStò= fðˆˆoopM4¬4Ú º¨%8Ü Muq#Z|™Ÿ‹ý˜ÌÙð¹¬Ü¼ä“ž;P\Ææcß๪Œ¨eÙ}»ðÊ'=w&šV|.}xê -ŸË‹MÏeÄ°¹´n2p7l݅>—*2BH1ðç9/&ËØñ¹u Wàs•†?Ïäç"IÀáfã璖R%ØÑX ì!â6ÁÏUrA£ÙäçRtj¯àçÒp‰—«öØ·ð½+> >Ýsãs -d¢ñ¹Ø‚·iÃçBŸÁæöÏe1ç Ÿ¡pÈÐь™ôÜ ÎæÅè"×eèÂZI%@ü%:AÐEʈ!¨ KÖ®AЅn^ti€Âu#蒉T®æì(HRòs¹Ë~V~îyÛ· ~.ʂ¹( ~®úÁoô\fÓNùÃT2òœ«õOBcHÈ÷7z.¬ú1ÓsOB®‘ô\ŽÙè¹°V<ð çr3ÞÓsyäSxèIÏEr’c]Ðsñ|)¬ |n6~î´ ‹Ã3¾dܓ*êrí]$ué©åfÅ  èNà -ÐMktO‚Òà& ›/æ†ÐevvL‚. ®‘G‚.ÓkE¥_S8H+–vÁÐer ëš`è2C†@óÆÐåk5-º,æF -Ê ]þ+V¢D—x1¸ÒÑe²PÝWcÐ¾Â¢KTãqJQÒõ©¨y@tùq9Ͻv©ô" Ñş éŀèÂÐXš¥Ê°2S]Üǖ/¨.OQ*×]怙¶Š.”w¬Ü)ºxà’E—D„®F²¤èR††Yy£èRۀÅq`táþ)±]¼„l¶cta&Ü91º´àÑ$F—jó6Œ.XcUù¢AþÇ:ÞÀè˜؊ѥoÊ­1º„ˆõÛÙ,PÉ!lµbtӘ]NWÃÝmõ$qÃØ|pÃè¬×Ë]>HŒ.7‘ìdÅèÒÌG]qغÁº¢[ ˆô±St©¤T (ºP®püHŒ.áÅ­Ù'F—áaVvF—ÝXø¸üxå+F—+Ÿc‡E - ÑMÃÆНVcÐ¦$:éò=üä›ÿV¬Ñ"Çc!èª8ÿL€.œ}®Ö‚ŸÛ4ÚìøܦXFÒs›Ôä Ï}äììܗ±‹”+裒è$ç>Ñ®rç>ä"/ûtV]5×Z֝šû8bj.š©ˆöâ~RÅ©€•™ 9ò»fæ"¼†hgÀh‹_1Fø€ÌE,ðx—‹zÌÖ-zt¥¥ËÅßÊH –‹¿Qg¶±rIF§=£r¡¸Çë“gç&å)—ùxÔ¢)AMÎbz½8ø‘-œ\臭Ò`{ þɽ®¯„\øHþ —=ùŽ+ù¸€ "̽ãq/ë%’Ž ù;¸YB ;VÌXÁƽܼ Ù¸×%U֎ƽu²ã"I‹¨z¼1H‡³ ƊŭÃÂSqjWBqàyeâ"îQ'U7šŸ¥¤iŒm<\)˜2;Q m®b)c‡áÞk ÷vcÂ@áÞ1-$\èe½7à ç†ÁEؕ¹6Sp¡3“‹Y¬™7.òô¥&‚Äü[샷pãßB¦SÜæŽE›è×ÙzÐo¡*+ÂÃNø-.Å(Á¾ÅMàwäh(‚•§úÎÅ."|BY2YÀtz}’{ی<Ø°·Í-‚zµÕ½m†)lÌ[vµ¸j"o³@ÖÄÛËUÝñJÄ"¦¤hÜt×àÝ"î‹AwÃÝÐqŽ¤ÝÞn-°ÛÛ̍u #bº¯ÞZnñK§É·éœW—ç>üšÀÜ¢"¬¾An©€¶ÂŒ[pPðq‹»€÷k#ÜÂÈ®)܂‰°}ðm/'^6¾mko‹¿2Þ"È°ÑmqKà¬ÜöjÖIÚrs°¡mQÅz8••\VØ5Vø7®-‹°ïÑF!€ Ú"iÚúδ-v‚i‹¿Ü ¤-þFz#ږªÅ_m«_ ñlo@o8[dX\RfûInÀl©cxîe{£ÙQ³ê s'¼È Ù"ò„èÃF²,»?'ȶ*ä–Û®Þ;ÆöVx=)¶§çTClé¥7†­êÎDØ>|›'Áö!)ã ` öá÷æ×>*Y0½ö‘fè]+ÙO¢k»Å:&××GíäÚ&ÞH‚k-‹Mn-EÌïØZ†3ê¤ÖjfIf-2®g{cÖ"æ=d-Þ[¶‡0±–zŸë X{ÉË ^mñì¸ZÖBßu§ÕBÒz²j±ö ž0PµMµ&o¨Ú×3¨5Iµ7c‰g€jµî©eÕJLõžAµTºƒ·”.Kƒå€NR-³ý·¬†÷Ÿ‡¨ÿ¦!}r¿½÷1µ{©›¤Zð -¨6¸UÁ©E2ÐS‹•=\¬ Ô¢bîl@jo×#nŒZ PCzQ³¬ B-þîúç¹ú¸‚>-2–ùž–œ–Vw:ííÏNP…1 ³Àª8_6Ѵϙ©Y±öæ}P'X@XÞo\Z»³œ'ð÷©\7"¶€x¢¬j£Ò"‚ŽÙ1 ´¨ bøÌ!™‡D׆¤}­ IKëӓ5 Ræ H‹(ܑ0¶GR×àÑÆߎ6ŒA£íž‡ƒ2 *–¤‹ -RFVl|NErƒD›¯ Ú0‡–øÜg$†¶ßmlZÈh«Ð´‚0‡Ðr0hIœS߲Ň¼UÌÚnuNðfñª_ÚiFšp…”.ð³ˆ#²'˜é³í5õ6›üYñ.Å&âàߥ%}–1ËãÞá³´á öìãîKÁž}ÜM|CÏ2HZGg™¯–³"3´çظ³ÁL -ììó¸1PPg‘;tœa¼ÁœÒYÈ@Îâï¢õ$ÎÒx^ œX/‹Õ#ªvà¹m¸Ù1»Ê±ô0ßÖ6˺—óÞY³4¥ž£¬O…¤Aš}¼ÜA³hZ‰™±è Ê,+ÓÜKgj‘If«³8'VNbµ8·á´1‹$'µÂû¥*ÌÎc¬|Ù'’›ÆË>NöL6>ù . I§Â‚Ë>§î`"c{5nC˂¯Bê`X‘ò“+KµtoXYFö ª,Ñ#.G&Ρ³j7…Ìý˜…»‚ÞŠð'QöeP%ë”mŽ1'P¶Qiê‚å4¬HÙiS¶™‡“HS,;¹Ðވ²Ûp3/&Pn=:"Õb;QJ{ÕU(Ky¾ã†¸µXÃD °™ÊDšé¼|0ý 8¢Ñ%Õ)ú%{[à(YäØP@$Yʖ˜w^I²Hlbõ Y.¬¼Šj «tŽ9Õ(˜º|X›\‹„X‰‘ŲE1¹•"[±d?˼ã0¨®Ü Ùjy←E—D¹€‘y -‚ì»;óå›;LÿDý‡dÙ­‹9@Œºðb~J3Ä6åú¤&‡e(iX]µÌY®Àh>ÎÑž¬Ÿx,—hÂtäOŽÌø6c›ØÒ^uæće1žòÀ%uÈ`mqO¹+ÃL(Zsá±Ü\ö4÷]Ñé+i?—y¬šTóÇóJY ɟÓè HÎÉ ¼Š;‘3ùäõ©[K”ÃÑ0q vWìíxÚ%Oçb.ŠäV Y”ÔA „‘`¹ÎeWŠMO×YÀà6&XóB²« &bàO6eÀ*€ÍR)gÀŠð¡ɔ¢âCŸÁnÅ)[‰«Tä§H$`µ—z;`ÙT)Ž~„YàÅÎöHØ ­õÅ´ԆÖ×$Ʋ?—¯€)åâK}œ t-.‰"´š²\ð†ÿ¦œ–E¶s?Ab°à$ªG‚ ®”ø“ìÏK‹:9õ»ô“,¤âCg·®ÃÍŸ¨*Ý{f¦.*aØ8ž]-¡ýè¦I{ ‹Tň¸?øBÇ µ>Æ£¢³B%þ¦º£éãÚ:ÜF>pç9º{—ãYG—U‚ù½†·F˙g o‘]9#‹ÂJø’`)žÜ™L|¾\¨ãÁû7Pyy\|7.¶…|Š¦O´…\4.ãhjs,JžÙâz°s·ˆáãaŸâZ$)}½HKïڐñf /,,™Í+ÍO0Ó§(AH ÆÂÒd|ˆ´dùfôññ²SVDl¢!¨“ §Ó Йv†LC“¡‚?ϼEÇåë$4Ùû©Â8öC•8ÃI>òñXXÀÅ/ :»à\!y>Y^,Î3”_ðUžþI,˜ Óƒcœî ÈhŸ5^,Ûkæaf§Ã^´Z¢…s!4o[ðÄx°^¤ÖÊ]YUI3³7ÐØRÍѝn‡åQoˆ"ʍw-B±±ÛÒaùÄ. À³™´œÊ¢z,+" à}S‘e‰?ªÔ0ú+I|·u„™É,‚Ùñ§Î“ i4PÏQn˕37j=t—/vAšGâڍÓËЄÅy&GlÞOºÚpa¢'![ôà˜£TxoIðÔh„º -’j°:æÇD(rÓ£×¢a¾ ExÏøÝ/×c2³¸U·?*ÎÇ5pßÝåjö3†ð9Ý¡c$†é*6 d)U·Z"=õ€àƒ‡`ö‘ÀO &@ QxËD¸ðà٘«Ö:¬å•üö°ÉÜÉèY\)Šô9n&¾_WÚҙ¤ÜôqÍøéuŠ]VåÓÐÂGI©X´—ÝÖuµb™Ž*’NvinÑõ·EÆfŠQZà° Ä …AÞ.ú«'#t̄@ÀÂJ9Aè¯ÁBÿøo/vêW.ÄOõë~çµT'`ýÁÔÇû]·¸ä†ÚJfaaT6ž¡§y[$Œ²´Ã­NÔČ]⊻™±¨òº$¹ö ~Q/¯qz”¦o–“ƒwÍižlÍ®#20Èf5ÁÂ29nCU5ªŠzO%X3’Í(&ÂÕó¸Í_],¨}éK³(gÐ.©š¯Ñh…9lx²É“r·ÍjО‚5V±³ïeÈK4p«8H¹§–ÛXóžC{r5‹`#lbÿèÙpRö¥>–õ°¿ -ªÔ쏫«Xrٝò—¾çGÉmZ¸ïÀCÚ¬ff†«å®º "âý†ª?Ù èQ#Xõ ƒåžë†„Z ]oíÑ{ƒݸæ¤×—Xrˆý×­ª÷Œð@è´Ãñ’m\½âaM…wr–àvß©Ôó´;Tz2éW4_‘JåaÄ~ôã%ïÉXæɦ’Ôy`v'SvÝuGâeáø~(ˆÃ]©C }~7õ ïÁõyg5Áÿd֏µø¾µÂ!ÝæåfÝ:p}ÞUC(ÓbPŠ¹5°-NˆU%eç†h§ÈɲÇûxdKÛÕÇMiÛy¨­¨ö9¨%À‰"¡qò+Gú«`¼†È2dÈôaFÐôŒàX orWÑE̹„åSV¼Rê$òĸj­à]Ãc¤ŠæpÉ,®4 Ê)÷c™»á$º½Ô¢]Š:°¯@êéÄGSúsF”? -ómú¡´Âð1u#º°¿»%L›¢íŠ,DðX¢BYÝå]›ÇLj¤”™ò|žEZ.••{Ï4»”q^FAК)hAåFÚâ?ü¼¹¡Whô³H™œ b¼gXoºÉ.äOàëçÊ9ß^ aàuø™v)iÔ´Y^È4’ùRX’¼k÷¤ ¸·®9ÂkGoPå„ï€*_Xêdõ¨ª‹‡^ÝxPLÀµ žèAa££Nåþ£" ·“f¹"$ÆﶺìîK¼ *Rƒ4NŸÚãÖ6—,á‡:ñŒØà-§X"_ 'âiñ®T±sך €±¸áX^»ÊLi!ϵ£ÔôaW†«Hw™ŸÚ©âCÑÃø~¼…ßF©vénú :N.[( h¬…{yZ‚ê—Á[¯S'àQ°¨á'†CU0‚«âŽC¨ÇŽwä?L!ÿµÀ0õòºÙ)ßE²T±k´úcöÚ³ä;Äfx?ŽÛ#u~ÎraÜá;B<Ôi •.³2Ç<_|™:n!ðOjódÍÈñ OFw.l‘þý¡%" ­ºòô.šŸKÛ í‚c=]2®]ØHñ)¶”å+#<Ž÷ªœÃªfÑL–âFè¸U6î'jG%tü6D£0àûY\\Aå¤è1áV‰$«Å_´¸Õe¡üx=à6³ ¸fô´×mʚ‹6dÿnîh:cþÊs…5¢Å;C=ªM<§zá+'ÜÏtx= 5†’ uvqïžÓàQâ7gîè2WrÎ>€ú¹K{…Õ´Á’bb˜õq>ñ -Ò/+“Î$w-'oˆÒ¹Ð¢¨¯jumO!R÷a'ÖòjŒ)0ëߏè­zìϑY†Â, Uƒô%ݏ¥/æâYò7cÔËoV¹àȈ1L€ÓÕ{w˜ -WI9S8#ØWÑ+üˆoW{Ƀ=ö²îàa}“Q!˜6Û*½„!&˜ÓÃ&J÷ ¥枬hÁÏë¹ïH¤ )ý -ƒyC£Û»Z+ -³[Œ59—É8 ±ƒì)ÃÈ|Â},<5!ÜB -£ Ò'¥íê4 C¿ÙÜ|fuü-bûr"&ž«y ËZsP”ýfFï4Fa6êjb}-óWoC4´Ô¤TÃ'‰–9…˚G^¸½v M¿Á„!lü¬f -»ÑÃÖô¥Dâ¼Kè“1\‰†Pêqjcî½0ô˧P|ðCøúÔ—h›Pù…ÏÊílaàr¹«ä¡Z‰/\3¬’3AíúÑ})±,30Ô\™¿Þl-3Xñu((ÅNƒ°H–ÞÂA„€á‹ÞT*éý”莡GΧùßÝÝ{`áœÇMzsÏ£XfÀjÎʺ¶µ‘=l˒ »ºÕ¥ 5yؒ\PÁ†ù¢º<ǐ[Å)Ï\ïÍÄ!õ pD$ã‹h•úŽ {4ôÝ2¡§ÒÒCˆþLNò/˜%%DQ5†ÍT?X'€\)ý ˜…Áo®¹PîªsCæÒXÞ=Qïz[é=ã\„ý:Я(ÛcRHìs™ï9·¼¤AaQ@:ˆ—VÃt1ñÑ`I>Ñ¢N”> ¾¹—“s;×½àÙ©p0- Í'~aš«çÃÛåü†}aÆT`ö~–Dµr­EÖa]„€<øŠOȏïþ=Ö0ÓãÎÌ]7o')¸JDu?¢Ê’Qúä\Ÿ `&ž1H”˜†‰7WO -g ç¢ÎEß¡Åç˒4j 8aCO”8-X/êŸNȐBe¨š"Lg7ïùd bBZÙ(ZÛ)÷ F -ӟäª]:]UBáX5‘UèMʸÒbt6˜É½²cèú‰oʸLHíl+úÉC µ˜â`µûàzJ~+‡Ã@ šLG¦`Æä‹bu°\ë®nlp©?AӔ¤Ak}*„Í*=XÖks‡¢z9šÆFތ’…œ}´‹ðQ\|ûRÙzñG µÛ81V´³WL‰xze)‰‡À9ÇXXûÞƤþܹg‹¶H·pЂårF/ïz¬s¹¿îaʾé¥ëmPڍ~ȹ (aЕ2Ëu«ÃŽšê ÏûKø*å-fd§ÅCJuÜpê†t³nõ/ÄsÝsr?F—[)]ælŒÈêÄ̟{^ÆïŠÕ0윒ÛË%Ê8ýp›Çб¢ÞÝϥۋ=Ïèß´Š;>d$Àæa•*ûÎ ‡™Íº… –ñFu¦¹[:‚[ †¹¾m§ZtI¬*qÆeϾH¨8DFä¶u>£!0,ƒ˜lSٖZx—p®`AýCÁ -!•(ÀÈŎ% 5}úïä{22O*%kl“áàP^'՘ÐP·ˆ•$ï6ÃËtÄNwÑÀ=»¢K<ÍÌy³²ŸaÆS - -žž.0xŸ4ÜIª{.½[4°¡zŠâØáï¶@¡Þù£‡»SÕ#:F*AP¬þ>ùb_ÒOûcr™åTd»É½þ)ÍT0´fƒŸG³ªèr˜“ 2’K]b§(ž¥}ºvŠ~k‰§w\í¹é^vš89Î%7°÷âÞÂ͗ ˜«TܹºÂàÎ(lµåÞ£°Õ²Ú;šJâ7¨‚E¹2¥ W(v`iÇKÕÔÇjîS®òI¶4 wÕjPêA¬ǼÖð©£3³ÞØ¢·šÊ“ÂÜ[é:®:òu! àÌE H¨l>Ü#Žº›«Ï]å N‰2cv[¹\CGËi±£Ö?DÄåb:dgl»¥7ÆçJŠãp¬%FÀ5Õ"4Ætx¥Lhސž]™Œã6ÿcœ¡ T¬x)‚µ5ÇRE›n*%(€Š‡Š‰éPÔ£•©rg†™± 8Âҟ%ü¦ÄáaQ/\AHRˆ?É!–ž Oʀõ ‚Q ^ÇâeX0ºâNsf ð³ VŎPˆÆhHN±E«<{w8ÒlŠJK’ì®` =r¸VònXüpªÿΌkžê> KÁ¹«—-ôšY;ÈLd!Ä&wðr<‡‚¸J)K°$†Içž\›j ››6k9)­NP·JY DN!¬ÂŽlTOªÐßÊJ$ßJÅÇCYW.št´ª†wpF¬…ESiw’“IIofN¥µú:ñ|Gk §'È°Ìì!‹]×Kâl’êRX¥î& 3LyûUP¯j²2š‹22Ž3!j¶½õM*°T—çmHaæÄE“ÇF3Ý{fíب§)lM|ZÚ5Ë9àkJÝüðG«$í·:&½û­3®ù±Óô^ØëXƒ~ -󣢦ž^×2›–V]…¢îácÑ~1>Yí·©8,-‚Û· X¨ëfµØ= ‚LŸá³gN„¿z(£Ä›É+s¶a±cÓÔÂ|nç`=kÞ´6ŒDcSï»/±#)gªâ#È¥Š¦ÃÅ$f„Vè¸Ùç ¼]R}ž\?‡-EN#µöï»N«ž]Ñr+ïҢӕO§zYç‚ÔU‚ÝÙü3f8®™V +&Cé‹=ÅUARŽ«žÓ’+¦j‡iWɔöùH¹DgчÛ!Òrû!XÀ]ŸvÎ]É#£™V“³&,výèåj1Îí¾ÐKLCz‡ºÐ >‘ÀÇq£KÊz(Þ;e¥4[™'BÕ&u܄¡´eÏÚ\ñqé­î’ ‡›nó'—èœkª¾SÌ:†óu[m5æK®Ù9œ .î4…à‹S ·µìàx£<#wEM°”·‘xþdƒj¢Äc@p&$.w¢™c+êÖëGˆtªÅoݼ\Pª6ó'>8É#.ɞò—[ÀÒç;¹M+n’VTōK©«VVkH£ËRä#¯PªˆÀɹàԘé0äP}Ja·ù·SW=ÜƒØ Y$*¿\eôáöì§7UÈ*/ª,dhcOv+q¿Íå8Ù"/Õ"’‰Ä· ä—°Ñ<v¶ÅdËhoî*j>œia¡s”Ô'aWŠ-a9žüÕÇÂ`$#p‹îaE1ú½BþWõݽ)Õ¥»Ë¤j—¼]ÝÈÈ#Ìé²è Ëv.œàvôŒ‡  -C?ZUõ •½N.ʒaaVˆþINƒ5‚× àÑs;ޑªtN ðpBÓ{Þ.ÆÀðÆ)¤’˜Q+Ab.þ~Lë÷~aX¬›èŠƒ]„äX©gˆ Î¥J ‚* †rC µù>æ†,gç²9ÍäñÂF–ŒÊÕ³ûÍeïº3^-‡Ÿâ>;´‚~\Z‰œ oXªW™se”|g ìûsª^ôÐnRãï,¿â—¥¿Œ^—f=ŸõA°p°ªë臲¬ÇéÆÇxž¦NE2à Ép¦áK¼ -’0»zJ÷é"Üӟéÿà -ˆ¼AXiD¾\€ÉœErǛAÐÖ³y¥¤¢‘¤üèi†‚bh”8¥×ð{Ÿªœ?•ä¸!‘7aÝoñ—¢ÆRˆ(çZ‡*H>4$¨cƒ^•êFŽò¨WTŒ!ŸÅ£ßpS®î1áŠá ø’ âÕùbuúb—[ÐÁ|ëÅ}ü¨¨Z¸$u•FçKÈ(%ü=‰K "àï…”¡Dn“}éé -3£ÏI® »ÅáâY_H¡¦ÒÙ]á—ðÈe>­ö¡¤é²øNõŠí³X¡PjŒgXœò¢…:âÊ0îJiY© b‚f>2H1æãIp -ñ"°6(<]K))LU Ý\'ü{+ -x>ZµKV çÅB:'o^7Ž,¥ðËmã2±gÒ¹©t»,±¥e±˜©Þ)¼7—À ӂ–65cºÓÜ\t)Ð)õ…^ËO+‚o¿ø`! —(ÎÁ‹®ÒQv%ºU‹#r„쏂õ!3›PS'mÎ\³–ê` Wœ¤‡íˆdœkˆša%§'­ë p¢{©Î—Ê|VdœHÿTB†6 -r@lÑ8wVBñ²8§–gþ(3R§iÆPȵª -¦®² e½½„‡­ëD6ƕ!ÊX@0×¢ß#‚ˈ«Rx¨àY­W]Í+(*£as3uI¼”XS¹^ô÷®w¤‹3èDýě{O\ â*{ -bñ£LœìŽ†Í˜›çúXƒ¯û˜={Ïÿ0хVÏĐEájmVƒ€þ?+ÂPõÁ¸÷i‚,,‡ÊÜ°—9ëùª/ÊϝQ²Z™æD°è5Ñ -fo֊w ‘Ìt‘F@ìâtŸnÂ7 -µs©f”æÏ ¿Pl`‰tuc7¦šg¾üŸëP½‘RÍ(æRÖ/Æß]·{úlJù›* -YñDðͨ}º˜Tôú×TH¾D˜Ý£— ^´ð„‹k'rWQⱘ åôËch*T«gêPڏºЦ8ñ‹Ê;ÊE©yæÍáËr ¶úëÀçÕMzx'DLY…Ãß?jfpe­ç£‚$j% a!ŸˆM¥i1áÚêc`¦‡Œ[×͒Ct¶˜ÇêÊ>0àäØdU&§Tǽ4iqQðeMê¿ÄCU]¾(!ŠDJÕáeÊD¯eYÜ+HËä¬1ãc8õűt#læQ;™±Ô‡ý ŠÊZ&á!hÝÔZ–7étô°æb½‰kì£çD5hârîBWZÝûƒƒ•DèoB˜§+ç5 ˜¹nÔ"vý1~¢E·•êÕ&7L¾?:­¹g°±øu&¡Ÿ•Ë´Ì^/Ý]£À»;«¥6©Tçn¹?«j´§Ÿitîe…ç%p”>Ôx è\ù–6” -΁¥Ye‚Ú,j³k³¼ˆÕZÌ×;›ÖÜ]#÷TY)Ì*ak½4ç3iPû‰®@Œ÷ìFÆ@X¢†“£Èä«LTmaágŠ’µ¬®Øâ†Íi’êZm~ñ­¯)dT™cƒ™1‡+ 8]*³ø¡S7ؕ·È]«·SIÿ}mÐÁJ?Éb)ò´Úœ /c$È9Š[¢T=PiYãXiÑ®ˆi©´[÷tº\†7ÜŠ32ՑµÜ•½-²tUÚ©[—j_êƒïò£Ýøh½ñê2È}¸ò°ctÄ[O­±}ªË vßb'²ÃB½¢½±X†9ñŒ/±• -0W7Wñ×q:¿x¿Ä)ï˜Ú¢¡×)ú+FꟘ¤?£vuÝ©}ªÓÒ5]õœknin„8+.^Œôez‚6±Êm¨xœ\Êd؍pé‚ÅלÖ0O³#õé:ÎÜ.ÐfÄW՝ž÷Zu¬~\ÏD¢Ó„Äô;B³æõH^§<´aºé -¿„uI^¨vŸ¨·•äàOq6¬Õ8„Ck%ŠèÍê0¦õçÌ*ªK€%o!7#OÅôe=îva§3‡èñãvçªEaô¸ªª_Mìa9T¬ß¦@-Õ%,Ž(-~ç‡;ÀÂ"z,Ó'AËÒÓúva쑷åÒÂá ‡O‰ oµ!^ãrIi‡¢AlÚ'ZL>ƉˆîºlÇnâx' ùPf ,º-{¶¨Õ‹^aý¥„YÌu; û™rsC¦n%tîºþ},2Á4ó‚9õA­Þyr—}Àç²¢h”5ïþD7/˜QqA u£(þB 9 c÷§ âe<½yCñî†Û´ðWû¹X¼k7Ðf,®Q‘Y#>]Ì UžÉ ½¶ÃÅ)Œ<“jELõ©“UÈo4G1bís’gh™õuîÀ;Ô¨ _†‘JjÃü²‰7¥"`(bÊ;J} ,Cb\©kΙ Ïh<‘wèfžAçþÔ ›M¤‚¹¾1èÒeœ¤p³ -ëä;rZ¥3œ™ô¯žv¦‡Ý -îZ¼8‹Ž%wu¸B<÷”v) Öø†£sÃê¢É“Å6ì‡Ý–4oaû tÓU5pa)’Vē!Í <3Åc7+š»WoëHÖ Þlíqª$ÂcY ³C"’{†ôĈp»‹§Q¨ê.ю+÷¤+3ÅÞ´¿‰¦[Y`Çzòöž#ráõ0­h2XÌM_1†”´øJOˆX¶ÎíðÕâö²Ü’>p´‹‡”nvmnˆÙ+W„‰ÇU5CSíã¬icÙC­º½{ºy‹&-–¡²‰%’KaÁ£†Ù¬=¿¬Æ`¯Z茀u_Þ&We (ùî2Cɸ"ÕeVñt% —œ0žîØÍcÙ[VCŒ—(n»Ÿ)W"‚‡ùpâ­P'¸êåR‚² >Ç¢ãbŒ`Bb°²ⶠ-¯ ÐÞ±R—8\~Lùâìs›¸I!éà’ü5§lN@Ì}?V$‘ ÏT=gûG|‹guÉiø,a§¢éÕ*Ý ¹¨Îq -Ž¸ÔlQ\MŸÿfïf .…Ò;ÌÀ·ou?’£‡ðÈq.Oà>4Úò'$ïsŸ ê#rìãòЗ yàv_6֟RÕ÷æ‚}ùæNÞ?!ÍÿaHó(œØ‰æˆ¾±Þ €æœ—Ä—³ï¢(ÎüÎýÍø~Ý0s8Èägn,sT¦>—9 Ì£ÕX’̱ܣHy™£KØQs̋{e'Æ>ƜûªÄaÀ‡ï‰,ÔoÄß ìHvÌnbà5æh-ü\šG&¿<:%¾¼: ’øòjÕÜN/ŸVÃË«;ª&»øG2u6t9PðÇ]^¯hfåøMµŽaG—3ãix4‡„T¥mrùSòJ.‡„WpmÓ©`¨Jþ1ÎËr‡*S’ -îȂ¶uãÌ絜ڊò¼AËٍï~&³õÊÄrþÕv^9mcL\9ŽQž{ÒÊoK wXù]NcV9ÂZê¬hV9Ýd‡ ée^ºž“TÞLùOPySIæŽ)G£Ë.“¡‘lîA½ɟæ'€äÀh4û¶ä‘w«$wùxT£—4rVÚqÊ9»«µÑÈÕ$¤Ê±ÅþˆmÐÈa!df§‘Ÿáx'öý 9 ’Â>+/Eþ†‘cÎFÀȱbb}ÑÆ"G}ãe¤³È´(çãv"g?‰¯(r™YTo`8,Š˜usýŽ({]Yä0÷…DÎN/ç^ªó D”:)jÁ!™³‘ÔE(”mrÌ$ ‚|xòñ„¾nÃÑ­IXàÇq:<ÐFGcp®¾>>¢è$tÖ£›‚¿¡ÇG …ƒ<þܱ -1xÕË\ÎoÜq0¹Ø ìø=Â/3v<«Ë7êøm=©©ã —ðç:r‰úr¬Ìñ;Â~¿çMä8 Á«œ8PäTMlàx´ƒ Þ8ՙÔë­¸q&DN—¿"Pۜ¼ Ö8ýLál¬qä¡øújrµ£]³aèÛ,ƒ Gڊ•¾¯B%gå ·5¦3ŽŒH=CJÿåþh~ 8>ÀÐrŸ!&õ.FŒ3Ýô™Q¶Ì" Æ@À8†zUÌG6S%QƋõ# |£‹—6ë¤Ô0ÅS]²Å?yŽ3bkU:<Jä7²8Š€¥iù¯Ë°Œ!¸âp8„nXqBdNÉ [aµ¸|Ž-n#¹1űb"Ð7âø=.ÎfŽÇýGö…¯OXYž5”Ç$ì-ï4qä{”^6L¼ÊWJ”8ҁԱl$qÀÊù6gµ‚Åá#WÃÁ'Eü6>-!â0Du/sÏ0ˆP°"Ä¡¦¸Í馗˩$âÓ°òã4ñáwÄ;ƒ~ß íðð;º’;xòf8 Ûð›ÉY¸Í‚âB NJR)#sÃI_zŽ³ºË„†ƒÁÁúý`†ßÕ9³ «¾MÃa8M¹`ˆc“fðI 'À¥˜!ÎK©Fþ+'A%VT8ÒÅÛM -¯ÁPx=ƒ>¿rÂk¨uŽ\Üåâ`ŽtWLÅ$Âò‚ƒ^-UODøðø~…ø%áhQ«ºMÂÙ³ÖzˆÉ/í -^Ô¬1áàØíÒafåÞwMç&ƒ# ÔXUf0øbå• ˜@‰æ ddqiÀ¾›ÚxïPð¤5®S‹è^]ãMq¯Š ÎÞ=‰à- -Å?œ5Üqà®Î4ð¨cNøá$ôÎ7Mr¢Àú¾/ì|ÀÓWkzàL-Wö_UŸU¹äþ0ä­Z)!ÀaÆ&|8³ÀCôüo.&üR}±ÍöŪöds3“c”`@3Q» ùÛáÀ7ÕÔOîw6ìwZƒú=ê–7c‘gŸfxX¹™ýé$~OÃüNcð¾KV¾î;^ˍö=( -¨ûÆZ‹z¸`}Œzê=å³8†Äbb}‹åPËd}¬A¾ž7Ö÷A$&Å)†}‡¬ŸÙÓ¦}ƒä Ix£}ÃMin«!ÉZ‹ÞžA® €ø†úƊ)’ }ú¸’Iáb`áúxã|£Üè¨÷I€„;YZõôâµl˜oxPJ!æû œ?ÄÛTw 6Ê÷Eä¨d|fp¿Nk-UP!%ýŽø.¦5$áû**ÍHÀ73©ŸV¾7D-·Þû*NÝ8u‰=W¸w‰F„Áö.nho¢ÍêLâh¨Y°7Ä-´ÔߎmXoø’ÒHâùG×ËH"wÛó±C½Óå?Ðk°¾:˜Þ¼OöÚfQù0WŸDïË5X ôÆ\bl@ï+â‹Áó†J‚ÅãóÆXB3k< ëΠ󾆏`y§(oEyCEÇ,HÞ( a5P ºÁdâån$o®O®Åڂµ Ø4l$ïi5ÉûŽÓÈû“#>]u L®ÙZ9Þê·ÔÏ ò¦ÂMæƒäMy# 6’7>^Æ’ä …Í ’7<'õäM+ë ‚Ç­×½Ô$yŸ¬Æ½ËÉïÛ0¶Û;6¦òæߏiÑÇÃwF3Aސr–à*vLýTQQÆy“!‰Aޔ…ŠÄb7éH,\Ù@Þ4  o>©Þ&Ǜ"æ€7Ž7…5QîÁ44$5¸œäxs~²Çf6¿NŽ7E·GÉñ†dH€ÈãM;¦.s¼Or–û˜o¼¡ªÚ8ÞÔj»„#03Œ‘o¦Œ0_úDfÁr`¼!—:á Œ7…Ϥülo˜Ì Œ7¥r äã-í«ÕVŒ7÷dUM`¼Ï^ÆïvŒ7.¬û€¢< ´Ë{`¼) bøJñfÿåø¬.@XLpyc¼æ¸ë¹c¼–»î ñXa}¢‚Ñ[‘'º"¼‡‰fIðVÓ'ÀÇy§w'ž®áÝ æ1Èün\'¤ß -¨êŒ0Î.™ÞMòñ¥J¦„w#êJÐÀ»¡Èy¼¦éç -TôJîFƒwE´I~ìk%µ{ñ½Ý ÝRqÌnFYËÌnö†'îhcvó¢Ë¡]•ÃÃ{\`Ì© Õ¿-‹²ƒm3.×Âù3g;v§ZH”†síÀnXYE¼nGqgáºñk*%ZhÝ'E‡JÔÜI(ø³ëÖã$ÍÄu‹²miÙَDŠGŠ\ ø®fU<®›Ò׌릡X¨6qÝ4³+pÝü‰špnLÁL¦ëcÇu#°­zÕÀu³vC‚X7£ÊÛʬIëf½+}׍ - ýzàºy“TjºòºÏ€$¯›Úë^7‹7T§°òºYB“¨o9 Ý%Á릅Ôč×MA-EÁëf(.؍¹KŸ°[[JÍ ì憪2~¢ ½óH;±›®W4Aì–×Ö˂ÖjîövÃ*·ÄÀnšÅgù› ïÄnFø$4±[ýXixD>BÜêqK‚IìæªJmHŠHôòå,[‡…Cõ†ì–ù‰‚ÕKº˜WÈnD¿ßÝlnC|@ »µn0Ä[ké+úlÈnu$¬ÅÈnÆÃôìæ2'ÛÙMí¹°4fvSŸ®oÄÌnZô1¬Ìnš«3¿ - vÁÙÍeeä†ì–äÿT)­²¾‰ì––ÿpÖDvÓ}d˜  Ý¸o·¨†v+,â‚ØEà„àÈeD·9ÐÕÓ_@»*¹M:Ih÷™ýhÌìÎ@K2»œaâscvãRå̳›¾"\ðbòeïÆìÆ¢òä¢ýVN*‡%²›¨;¾H²[‘åÑ&²o?‰ì>ï;è8 ²›EcR‡ƐœŠÙM×_DVd÷™*†@vÓÂÔp »?¯–Ff~ç²™È\)ORˆÊ£Âs‘=Ó7d7Ílpfd7~‚ªµDvÉoGvÃL8O"»iQvÒÈnY˜t[‘ÝøQR:ٍ)Å[AìFJQ½ W`73¢$]°{8—–,n €¬‰Ø˜ÝýŠü°­Àhéþ˜ØÝj)­ÀnXG¾8ûÀ@ÚIàº[Bö¹$hÎ÷$¬»ÅØ›5ƒ®vTws§ô$uƒWw8ºÎØÚ°sÚ@Ý$]?cZŸ43sºÓ°qº§Õœî§DË0ã·ÁÆRÃÞÓÝo‡ás3sæҝ†Ñ=­Bt÷hJˆn€8|]ݤ•_  QnUÄ™Ï ƒ¦‘ύý8ïžû ™QйŸÃoÿçîÑ@-ØÜ`à¨]¤Ñܾp˜ÚÈÜd1W…ðxi8u9œVúi|åŠå†‘”Ë rÃP]¦@×1åàvO&w?¦òiÒînW‰ä†:ÃÈ äë#ȍ0+Yääîñ!/É&>ÇGB±™“ Ï½Q±aV^)¨ØDp~¤Ù`s›Çų´rÑXlX”ß -,öyFþ†ÅÖºiԉÅfœ.Q`±E0Ú}é+QÍãŒÅfâYÍã¢Ø'Ws¿1.nXì¡bð„bƒ5 N´fbkÂv$öðžDl 4{½¸ó°Y=|µ‰ÃÁ´Ê5£—L‚n4lB1H®Î ÁádW×Àa/™¼•‡Íu…:ˆ˜‡ÍU]o‡Í¨js]çdZ3¶J}wà°yv×5iØôϯq}eOå,ƒ†M‹ø¡=j[ŠËnV6 YTzf6/½QovZ66ö4äÁ8l|¨ '.XUÉΊÆùRÕ"JP‡M¯jÃaÓ©#»2pØ]¨òO4lnÁG·á°yr×5iØçáJɤa³ -†£òJæUiØ´47À`±âq*¬¸Ó°é’×%\ZŠ¸r)iØ°¨2cÃas1}™{¢q‚¥Eše -Ê66—×%êÝå¸ ÄVŠ¦JÉ9Ø¿ðß Ä¦á2þº©CÞm,÷ÊÃF.ÕÏ!bg”¡Ûè¶mX»)ŸTlx “ŠÍ˜;]lTlFœØ^-°Ø´h¢›‰"V,6ƒ:À÷ÝÑøÚXlÄTèºa±‰«îȨò¤ŠYJXl ‚úê6,6µ(ÔPΦ›˜‹Í@ Ñ.f.à“‹M Vp±iQûŕ‹Í#RP\l†cT>âZ]Û´s±é 3m\l²ùØ30¸ØÌ`¨¡æÊŞæàbsd+ÀàbóƱÿÂÆņٝwœ€‚EZ¯àbsj¸6.6Í|fÁÅ갟ŒMEd{ÃbSçÉ -ôÀbCsı&¹ØÌ wj™\lÆÈÉ*.6«šÇŠ»†×ÑÕqåbãHҚ͕•š† Š=­æ~¡ÿQt-ç;ùi5ðGXwð¾÷ǎľx—Ϗ$bãa“¢•@ìæáhça7‡_‡ÝšNöc_c‡a?Ž>&ÐÚEþ…ýÄ ¸‘°õVXv¾81؏‹kv ö #c°ù¾Ü%(ØP»(?²B°ƒIœlhÐ8ÖWºXÌ·!°atÓl¤ Žgò¯™Ì×þº´Hæ™~ Ãp—\ M}vø5±âX‰}^'T¨å9ŽXK¯èkÔkÐá òu°¨’|}E£ð | ùҁ½¦ú¹^“z TÕؑ××~§‰×Wtrà5S\ÇóÆ»¾Bà¸kA0x¸ëËø“v #]Ԁ]_¡\ Ø5Òbìë½±®Q 4Ê$]#½¡…_%TÜ°³Îƹ®ÃdõÀ\3x8®I¹n¡LÝ ×HÕ1א̐®„ëfà¸n^$ßû1xk˜ñ¿n}÷xœÜßэ5ØÖ·ç°mv‡‘Í`Ô š›Þƒw‹~ðœ7®5jJV -k‹@C­»Q3;ÓkGÇïéFq-Y• ¯ŒÝø–n@k„r²àƒ5ÅÕÚÄÀYC.¨)s¥Y㊛û»2aJAÍ­>a”Š0ûµ²¬]@—$kŠœ`b¶²s¬[t} Œur‚bÝP¸A¬Ù%çÒ„ ÓYØí‰ó -pÁ†°†•“b¬TfÂ3Ö·ùB¿šÄþŒ¯¾ƒ ôê;¤¸¼Vä»TÆÿ]_;“e]æ÷£ÐQ€«áӑºÜjfÔÇÇN­Fò„‘¿€VƒÄÏ.˜Õ—åB;²úÊFŽ&V£.E€S«¯HQmÀêD>¯MŒNÂÀHɆ«¾¢?@ЪA÷ãh°ê„µo¬jTØ©Ó%I—¥è&U—æÏwU—P§º„‚"0Õp>ZƒT{" ©†A\1ªKôMÝÕ/O@‹Ó$T×x¿ ¨¾9‚½ó©oŽ“ žš… Mê_.¯()y,êÍ4ݍҿ£ÎrK §$šA+2‘74õ`^öüH2uu+´Sww°Ú¹Ô· ‰¥>=o•ÚÚJ­R[1©ILx$’ú!UæH D gúñB0pÔ›ƒQ[¿•,êÝ'Œ¢.Q}·£¨›=I¢¶Æ2AÔL>|âP32åšø¸=i%„ïÇéJ¾ ¡FmÑAÔÁËí%Œ>ŽˆZMõe÷*Ô%ü„àO³°ßàíÄO£þ¯©•ÖC|=“=ÝÜô=mùz §o†ÎIžÖ’¬–7ò´4.ýšäi„ioö@ò4õ©GXR«EÍElÈ8 ,êŸèéÏ.û·_`hî±&ôtu–/ÉÓŠKðô]B'¼r§›ÓØi°CÔqÚÔé;Êb7è4"ôd‚9 4ˆÒ°FNÃнÅ\ Ý!~0p)`Š»‚7Äit+š*ž;J¯‡ –#ª)Òh^‰ÆdM?gd½e$η^“4=NE$vÐ4¬`4 ƒX»Îp¹Ë -ô 3= ÅIÊ4ÊÓ"ôfø}6ÆôãrÎdL¨üô‰ŽéƒÓÐF˜î&a¤µ¹5ÓiØøÒaM¼t÷\ŸÐhˆ”¹–ÞàÒ+DdësºÓ˜ÐÒóϕ,ÖK÷ÐWºtuÃJCp]6‰ªßAO6T†hƸø²Ñs&Ò=ôT„ë·«PÀ/ƚ̓F­•jñ“ÆwÔܯq¥ŸÛŽxð¤i(mâ¤/?î7š4ÀGü “~j`·“f/úû~cI©ô¹QҐ™ƒ!âÇð•$¸²àH' -30ҏ¿Þ"ò­ÓK£²•hɐ†¡8b?Ò#"P45ö}¼q¢‘Çb|Әhü͊)S¢ûÅæ+$ù±¨8§ò0,ÑHµ±{#D7‡×“Ý¢ì.ÑiØÑÓjHt3K* ÅX!3ê´!¢Ñí@}”=X¡Ð+À˜« wD4x]·o&“rX8•6ùÐXQ©qኇƲ ~\⡱zS½• ̪e;ú¶Š$ÙР:©i±ÑД”1•?ÑÐÍj¯$Cs™çâ?փ2ë¬ý”ÛЏ;ÏɅŽ¥qr¡¹xný …6qÏk (‚¡ÐÕJӝ nWœ;?˜ÈÊ%úÝ5úò͝¯ÿ~‘Ð_#=ÿâñëÇ?ÿW?ÿ~=<÷»¿áÿýåÿý×?êg¾ÿÝ¿þß~üÿü ÷ññÏÿâÇ¿üë¯ìö?ýö§_ÿùóÏ?ÿ~ÙádAøëµý¥ÝþÍo_¿ôï~û›ßÿUüÄ/×Ÿÿ͏ÿïoüÃë´þúo™½œÍëüûãß®'ó‹›ÿãüý¯_wöþ›ßýüû¿sëó»ÿüiã¨<ù¯^çÿòãoÿÓ_ýþï{¡ñ»?üí/>Ù?}ýõ/þÕõë?ýù7ޝ††_ÿÙï~þó×Û÷û× øÝw¶ÿËÿÓ뜗ù՟üÙæ¿=ú·ù7ÿåoÿ*õÏþìÇ?|ø¯óøÕññ/~õ'ÇÇ¿ÿïþä¿à?Vì÷ññ¿¾þëÿyÙþðQ?þõÇÿù¿yíñïÿâWò]úñ??Í¿·½ýž¦Ã…‰¿líôýv¬×_?ã‡ÿ÷×ÿ¼Ffâ´ -ú¬vQ¦Ðá¥ÌôZ^¾Öxø×Þha„ 8.9V€Ÿn˜¨³%™ç\í0>’½Œ(À(o6¬nt›#iýÄvTzQ¯Ñm;…0êX„ÃOÜ7>ýÚ;û9,ö<ßyÔåÂ>߅×þ#nqG÷4àì^«~øuláƒÉ™hø—3ô fäµÜ¾î‹¬ï 7÷<>þõ¯âav%;}‡!h:îÕ£+Ú^FŠú¯7£º¼Å^æØ _ìõ2ìç`ãóEÛÎí¯yÝñOíå„ xE@£8þµÚ}&¬]äµv¾!.ÈçºØ‘Å+íc?,Ù×Ç~6þð 疧ýOïóý}®O-ÆÙ= 㼖ùã¯í¨¯òÍ6»¨ãíOÅ+}iñxQÜòûýþB9€Åv§×\ëù.¶íÚ¦}¹ó¨Ë-›§°ß_àÎû}ã"ªþþØÒøöŒ§}¾yÔõÅùtþÛNjïx6]ÄøýæâÔÛñìçp8g´žìbÛ.lڗ»0ºÜ¯y -ûÍÅoÀß7†7[Þ^Þi|{ÀÓ>_†<êúÖ|º ßìå½ÕÌó}L+à¯öï4ä d¶i‹qÓûӖÃÎ1m9‡mLÏ ú°oÜ!y?ì4îç0íË ÏÃ.—öé>üã'f˜zœŸnf˜ãz;&“ÊïeùÅŸÞbŸ×²v^õrÛ-”ØñÜ6E«»í°Ó¸ŸÃ´/'<»\Ú§û·hÞ½}BŸ{™Ð狱Lè‹q›ÐûœÐ—ÃÎ }9‡mBŸ{Ý8_Œõ°Ó¸ŸÃ´/'<»\Ú§ûð•·h¿Eóq/Ǚ/Æò‹‹q;½Å>¯e9ì¼êå¶[4÷ºq¾ëa§q?‡i_Nxv¹´O÷á‡ÏŽ -IxŸý›7׃Ĝþndueÿä§`òDža÷~µœÚßý”uãézÌÃNã~‹}žð<ì¼²O7á›L£svÞnít&æ L¯c9ÓŸ]ÖâºÌ{°8>ón-þÁvkgbÙxzËKãÛãöå]ÈÃ./ÍûMøV“蜞·»;½‰yÓíXNv1nW¶ø.ó6,žÏ¼a‹ƒ°ÝÝśX6žnÇòÐÒøö„§}yò°Ë{ó~¾É‹;?|A=Cóó ûö¡_|ï£Zy}Šõâû'iãû¨°n݇9ïCï?>{—Õ>›ÿ‘ ”›§±7·d±Of9ìôv–sØ\£Ïç6ã*ŸWM<ôõ¶jâIh½1=쟹ã‹}úîËa§—}^0m¿¬óü·ëþéϿكº¯`ïõ ‚½¼Ÿ¾KXïÝ/Y½÷÷ŸŽ·}ÿÛ#’ûr¦ÅûõVÍi¦(žh»g°G½l?ßlë2ÉÈÌp@¯ÛA8xÊÇvaœ“Ìèýmc‹Ý·ÃNãv -‹9Ïvt¹¬Ï÷à[N1Øàýîžæl§!j÷½ïb[/mš—Û0ºÜ°yûݕOSÞ6.âí-ûžæù.äAחæÓ=øVÓ +YÞoíáÚ£íx×þâ.¶õº¦y¹ó Ëݚg°ßړmÂÛÛÆFPíO,ûӝæù"äA×7æÓ=ø–Ñ1Z<ª^c‰k@C9íßi,.½Æ8õ7#ŽÕ×è˜íUõ3ûa/‰<÷s¸-þ~äf×Èuã.õï~ØiÜÏaڗž‡].íÓ}Øâ·<æíq½ߎùµû/.Æíôû¼–å°óª—sØn<„ço»ln?ì4îç0íË ÏÃ.—öé>|›…{¾'sé3Mô ö7'ˆí©…ñýÍY7Ηa9ê´ÝŸÞۗ)]¡ù¨æòašòxóá-?|e0ØoÑ|ðËqæCZ~q1n§·Øçµ,‡Ýƒœ>‡OAN½OoAÎú~‹ã~Ó¾œð<ìriŸîÃ7 è_Ÿo/2Å$„­ç€œ2Þóílãvi‹}އå°{ÞÜçð)o¾ŸÛ–7ï-9EàøgYí>“öÜûˆ»·áy±Ï±|9ìõ—sئˆÏçö­†‹éNËGü´¢°y[%Ðut6bí:¾/)äéf4ÛëûÄ»Coãû’bÝx.æa§q?‡Å>Oxv^Ù§›ðÍ¢Ùò¥·[;=ÿys‰°œébÜ.kYfÌ{°,RæÝZ¼ùíÖ.®ÿ²ñ\#,O,owڗw!»¼4ï7áF³íNoww:ÿóæ*a9ÙŸ]ٲҘ·aY§Ì¶8ôÛÝ]¼ÿeã¹LXZߞð´/¯CvyoÞoÂ7‹f·ˆï=ýü<(„}ûÐ[+o£q÷óiT`•çÚGÆ÷Þ>HšÞG„¹áüÄç§qÿõÅ>Out¹¨ÏwàÛö{;¿ßå4旾œðbÜ®n.æ­X›¸e˹ÜÛåÛÍ ç7¾<¬4¾=Ùi_^ƒ<èúÂ|ºß8Ä°ßØùé.ç0?òålãviËH1ïÃ2ÎÄýZ>ÆåÆ.Ÿmn8?ïåI¥ñí±NûòäA×·åÓøá\ý·?ÿü—?ýø›þXý‡ÅVëÁŵ|迎B¨öw×è¬ZYíß¿ÙÑ"ŒÚïߎóKöå8?û<¿Òv;Yð%&–É.Ú êüm|ý¢Œä2ÞǸeÀ¼oáK<Ÿ痓z?lҘ_Ñú5Ñ›Æ&¶ƒí½çÆÞ´b¢Ö1ÖüÚ ÌsC—W>è×!Z¯WœJälE_*›®û ã¸ÃxðžÝ䨱-jl|â+_¿~ØcÈaÓ¶àØøô«—0o)JœÎxeîR㖢Ìîna?GÜR|ÈÍÏqœúà`D ,OƒjCÆûôëÁF_~áç@‰Ò»xy^Z‹[ý ‡zôžÀXÎæçˆÁÍÆzÇsóV=*yöÆýöÆG«'ÎâÁ h†#^dÁóñh=øØ8¾‹'óÕ«Xߥ׉>:jóUb¥£Ì(æý>í5ímÄÛ@š‚Œ1d¿x>`–·ûl„û)í×9l¯-`DªŸÙ¶»øyuïæ5ó±©6Þó ûøäh8ß&´*:¿±½ú3`ð'Œñº¼Byqã¾XjhûÃ3áJnüôü¹²a=‡<½ÅU”J`4Ù ô´³ð0]›òÜ~4wÅ*ÒÆφõˆŸŒ—çã¯ýb~ƒ>ül®³Æ8; h¶w ¢MíÏÆr‡qÄ«=€jÞ¸ …=~Ž_ÒWÏ!ï ‡O lÏùSØ__–þšœú‡ŒvøòUÛn}Kü/ß Éb®:¯âmO”©.óÑ×Î`ýîؖF#(fÑüðæðyûC*éûÜÇÃzÉü>Î9þ–RsÐ܊ŸzFmcÿ·Ÿ_oÛ~Õ?}͌aö“ñåþþ‡¼õÎÈcµìãŠñ >äˆ9ñu;Ÿ_º÷:?ð¨KÌƜ{~JûÙý&ܗ«:ßú»ûq…±1ó-^uÚË÷?w¶ê ý|Ó]éÒþxf¸Ò•ˆ©ÆŒÀÁ÷aÚéC½Ö[ò±ºê}m´ãôéÈóž@$>ʲýOa·gÁÑïѽŒwŽ~¬å ñ¾òàwÏ{†Ã¸óôrã’#í3g‰‘Úƒª㥏|Å)Ôø0Lÿ_½ˆy}èuôåJû1'68¨4¶óW6ö¸‹¤/q„l/-6.鵖'€5uû¿znßçd‚nw‡½z!?…ýBk~y_Sìgã}—y\¯‚âqVW»|±t²d|]¯«Üsÿ×MŠÇÎ)蛆Îæ¯ç\^.FE–3¹`ou^ZÍï†Þ“ï×så'öZ eÃî©;‰—S··²áRuêÆ×'v.Æ<Âqäz][\8šÕ /øâ#W+~Uk[®â†&ÂGnË'Њ¦O´Œkq+ô–ó%q€öûu·z÷]ï zÓå“Ðô[k~˜pòõE§½Ñӕ{ž¸¶ EÂîÃÎ8 åYmœÖèÏràÚóÊûð G=òôœPp€ÚÃ~·ËϜW!Þr´˜¥®«Í#Ìx`¬ik.³ðî#¦¼œÏùYp†Œwj¼îú÷a¿Î§™®“±Üq'Î82òg†Ïü\üŸЕŸË9^µf+ÐmkœÞåõ -Éá‘ÁxJ‰è݇Ü̗±‹‘§§á5?èiOxáµä}»€u«“ÀˆÆré¿ñ¥$%í‰@ϙ¯5Ð^÷vMÉXr WhšÆ9jܯEÓ× Rbÿüø»âv1üά䈂ý3364ècÛ;?ñÙ±§ñ\æLî;Aî<@±ñq<éIjŠºØã"‹AÏꛆÐñ÷a>ï旘ÎŒ§Ác6Êx¨V/îz^ÊõbFC—Ûrd½¯ñÄr1û:~L&h{ÇPó”ùb"£/D ä€ìÞñØìàéx֖î7‘Ü÷º•ñ¾îœ`ü2 àh·àõÇ¨_ê<±+ç´³ÕG%B¹Ž ªJÜ3„`çËò# -‚ §×•:dŒi}s‘`¿´Žƒ'=b¬C+s»ëp4RîÛ»8Ç­ÇQÂ7Àp’_!¬%rC½É-g??c‹0¢qsøµ·W¼²×ŒŠ{õªš¬¶½# QΥɓÞ6dgÎgöNÀ O¼Á ”ñ:âÍ«9Îá¹b‰¹-ÇrÛטy¬gä=¸3R‰äD<ù¹ê¬Ð%Þ¥–c}©Êúí?½iϑš`s1ŽÄ<ÀýÄëqå¶õ|òë™Æ«¯¾N ö¼]w|ì~¶ð–ñ}†¶Ä‡}Š˜ÚÀƒ¼ã -ž6o-FŜñÞ~ö«±Ð=Û4gIGJoñéë‡ÜĂó‰Ie~'=‡"ãZB:”äAö;ņëæÓf`þp -ãµfå–Ý-xRvìÑ+È9ÌÆ£„–·äà†Iéû°Ÿy'=sÃVÞãBèΨ¼éÖDFàCp"„¤ÆÙmà¦MÆ]€‹#ۃ}x܀ʉÚE)b<¹‚¤ä™6ÄÆsÚ)±³@‘'ëÍÇ6c@C§Ÿ6%hBít¢ŽQVž°NŽúËxs‹<%  ‚n’ó !¼‡T?4Н¸{ƒ8Âï¹$2~)7P±-žRŸó‰8 CÊGqB¬ô -ÏÓWBÖ(„ûàŒTxÓ¿fìÀ*Râ)Ï\+Á"†âòþe^¬KœMĵô±žÐÒ9œù”nd vHc<,rìø›@í£qóÌ÷Ãr$°‡m¦„™ažR  ´L™ @ká”bD‚ŸlZKXaXp 5µŒSû¶÷ë´ !#€=C1)(5©B’¢d ›Z… wˆ°}IÈᷚíŸÄ"áV æÆ„@°‡U{ä!0j¬™™Ê4# a ý&ƒŒ|yÎh‚#rñ¶ˆÔ%Ÿ`<4è#­åcÄrïôdt< Z²£Z‡ûpwË)Á3EüÝM!Ðd$ìYv*=Pyâsspº¡šMB¾AÂh9®&."/FÞ8`Â}0°Ž0d8×~Ž1(CÎþqÈÉð±=…ÓI=Ð-ž ÊËњŒ( R -”P’‚¤ E¢©Ôš€«O¸NA–’´'óŒxV†×çòÔ2ÀÃæPZ0«àXö¹.VL.[áBñ3HòN)Q#u5W|ã48¬üPàjê5¥7Ðۆaû2)²È½¢ -î‚Hsæè>4s½qì?ã,ƒJ‚W0žº¢c:Ò¹2ȋgî+X¦xF ”‚Cc¯*í Ôì—åÀ„ ͑ü¹ãžÐ8“̾S²De:¼3 ó̀dMˆÌ§-À•O|ØJzՑå^('Ñà ?9•æ åþ´ÅPâ\ԞsvNJ UÐB‡èß¹1 YÂë;™r׎ùcHR̜Ԋ¶k%F·P, ¥’Û2ã2yˆ¯ËãcÅc€ô Ég¤Æ$åa”#¹ ,ݰ̐Á-Ԕ0F9Z˜ÑV9ýeUžHp/É:×¾-ì‚(R¢‰Ý‘4µyõÀ.g–í9+%8•ö„ÄEâX:dYIw«?žÊÈ -ǕI3yãð%ŒBÄߊ(iM„~-’òׂiý/‡Z[Y\…ž Cö -äB¾»l[’(.Ó mg" H¼!|ܚϼ#Î÷LõìW¤Š§D´jè¼Â FNéP’™·a½ ÖtByZ9çýÈ'øµ›{D7/t£HóQŒ Äz§EFQ ™P¾:ãHÉk’¢‚¶pQÊQÆ´ä\D#s™ÒˆíéΑÒxŒæL N͋\µ»_ÍÁAõ}3ljNœ—È5¦Ð)`RžA’É2q~ÉB€^Q„ÉÁxÉ9‰Ñ:‚‡¬Jù2.þØȇêZ‰<£ª<•A†˜§ñY7™áP­ÄÝjêÑfü×ÝþŸÒ䜢”A¥ÏRg¢rTcý.môþ¶ÄłøC,S<℀b€ç4yðš<¶ržËfà$"þ€Æ>ˆ¥—êá¶VA¯+8ûFM¤w'‘Ê‚ru [(ŽÐÈ\؉Z›&iíhÊ$Î9Ëv9eu‚K‘ŸÏ9ùL²d—&Ô}e^ÂMi·¡¥*H¾!–hÊ9…0ٙeê‚òßdæÌÐˈÇÖ'½€æzá Ë xçtÂ¥Hƒüz`’XåY‘;H¢dâcۜ¢iå%HK˜Žì4ôÚ%a¤â)©iÞÉg%¢Ã”(,%e¨QÖfH}õðLðb7¤ÓFçmA¹¬°!œ„“å:£ÆñZ£3ʇ ùͨÉöƒ Ý ‡9Þ˜Ò1’RìI'kÜNrÄì¬S‚«„(Æûffs ¨ù–ÌtcV¬mJ/væ’ò­p¡qß´w¸$e7B¶& •Ü1—R ýbnÛ~$G‡',³åp÷)M±fkÓ =\.•ø̮бºÒsÆ*ò0ÅÁŠ›ø9l\„tÖ`¢ð9…>¿HÅ[Öýb¼Ù‹€¼‚qÌ©æ½éÍ2Šüš˜ömCrą ²‚¸Câ•k0ÔÈ<£ + (-=ÙÀ4Ì+²¬¼ ¼jJ$IÆÛÊ3¸¹’ZFF$R“®ªi¶Ü&z04ãÎd¹f-ۿ׀´²H<ÃÆ}àä©!˜rÿѶÁ¦ºPF@f~”ÅlŸrÊþH®{ÌÐ=c¸Ãþb:Â¥«ƒ0E¢©n7°7,Í`À#Cž¿ÝT™f™x¬šœ !ý¬ðJ¯æ9î'þLŖtú±ûÒ5Në÷+&#%3…5ÙWeA„LbK*ª->-Nø¦>n ž§­”GIg9«¡`ãÍ8-4T#Ë­‘tZÒnÊ#U4ñIñ9XF²x×0æ<§Á4xNàew`CB,ùB’ˆg+#Ȃžºp<¬`À, ïù¦Š(…·ú=¥¤\2äÃ€g“ž©ˆ˜äˆHRΙ$Ÿ­  jÆÞÃ)š”ÖÀ”–¤K+@ÏM"(+W2c°;Ã,õ¡`õEysø~4IÇÂ%Ø'D±GÅç}«2Îô6h¬^ÁŒ)I" >dy¼÷ÈA,¯jéNˆ5¥2¼KS|~¦Dj"ƒt–Z”¡Ú¸‚#-I µWÔ ïР¯s‚.:J’•{3Õ¿XƒÀ7T+,€÷СXVÃPaoÁƒ p¬¨Ö‘j:Q\¬¢sn:kÕ5 –î §˜ *™Ÿ¶Ø|ËÙS¶sꌃº¡Âªdƒ¤r±ñÂgDÆO̱H˜õacðù¨rf¦`Ÿ¤ñVŸ¨!o Ey!2g@H,³fàQ†rA…$_ž%žÈ’ÃñNÀi™A@zÇ A"1—~R‘§)U9a0Jò)ëŠ^ðºÑ9ËEÁ^pÝ®BjÊwÚª”g&X°}Æ'ô|ƎÕ$w<Â}‰ â2è]³Hšx¤ÞÅñƒ|”ù¼ ÌSšŒ(‘|ș0Š‚6妉X1,B`溣®²$&Qžmâªã8`¨A‰rÇ`¨8Õîm)Q•B†A˜0†Œðâ é÷wî¢ä;J%UüòjtœÔ ŧS«*1–¯ñùˆ¤ÅøKAºöÕPªq=0 Aß=,*‹ƒS˜p¶›— "åÜ‹KHKÄJ -(™ñ†©• 1jTüï•I´’¤• aFå)1& ¬ÈÃm™h)G¨: ¯%€*?'È@±l6-aâ®` %btàY±Túœ=]¤TÒ/ϘlÎäû&ÀdÉـX?Ƶ§Ä?(òJK—ÊlX`ÆuÑ0›Ùc†jŽôFj€@»´Ô„Öç5 ÆÍëY‚ÌGSê И-IjH!9]3W*ýó:b„Xzà”àAmÁI8”Qï”uò¬‡y)=±¡¸@ |¦£2wô6# k82u8J¥!¹à§½^hTƒDŠ­@2òé(M´YÑCï—:K²[B†3rSVð]MÌó•‚ÝLi˜¸,2OR±™QÞ·[®œj,¹Nd2O9ú 9S‚"› ëƒ%y$” -‚n¥Ö'‘é@%n+)H¦¾Ÿ9ÎNCS¸ÝçpAd€ûÔ|I -(Û#\j>[40š‚dyÁÝu/SœGô :÷/.~^QŽ)m ®{ 4É ’jN@´à <̇àȸTs¬˜G(9¨.ԑ0‹ú -eiTãj<æ428’¨¥/L* `Sò88ó`Œ]ô]Ë\p¹ŠrJ‚”tš`7¿`”Éyíñ6´-}t,§VoÛKVÞ(‡ª‚„BÖ>§[´N#¶ã KÁx~ª 懶ï%`r³ 3çÊÕXöž“cƒ‰f€g\ÏR9Á€†Ì\ڗAÓI  Êé*ß-"/—ðe¿´ ò18¡ðŠˆB,”pB‰–T··€ï¤<\R†<ˆXQó”àÁ*—¾( Yõ•BØj[p.1ԪḉqBY¦b cÁ¶ùBóδÉêäb@‚%°J•öÃâ›øyÍ«ËWF•€¸¬±¯Á À„]}FQwó,‹µ4YS]Röð"P‡ Ÿ³ªÁÀ. ¨Ê‘¦ú.HEgm*G’tPAô֑Û,’Î$IêZ»Lb‡Ö% 3’˜¾†¢¨M°ø`ù%Ô¥W6´‰ãˆ -Ö¦Î6Ë«^šsÿ¼šŠH%ÌPb` ¡†'„C;˜Ì¸˜©Î «J‚,›G]p’J«"ÄøfhÉҜŒJ"ª$„ÒŠ¯À”RKê¯jÁ"iÂj)À„ó„‹^iI©ÚSÊ<ãŽÂó’ü˜ìzJðpZ £Ë™y˲@_­%¦B̙Ò,,gԘ8¡ñ%ÐÒÈMŠÜAå/ö±;×ËkXÉցBñXLÌõσ­‡6Zæ xêŒb»wd,bµ@œñN /l–JuÊ_ý`|¥rF YbÌ57®:ÓH‘PsF€“ÀHŨC4NÀÀŽ#4›0_/#nœFb>•ÁI`©7—ñê(ØMOՇ-Û ¹L y>ã²a§ &®´¢§cJ:A çaâ±È‡#ªð²­Îc›T®¸âßà`´ˆjÞeLœÔWÔ±õ*¥Êg`à☚P - -rŽÔ‚ùFæ †˜P60s&íè{Xw\R0 ó$t“P ¯èˆ€ -†q\:Ñ ÖaÊ¡:ü¼ˆ¢.“ÌÔ&‰j? 5˜oÊSJš&Tc 3 -ƒubH!õ3TæXÂʌFA¡ÔQœ|ìØ4d™Ã¨V 7cª¸f†¯¯jjœEÅᜨ`bm„cFd¦Ü3š;æKrfÎí¡Øèðࡸyû-ç´°=%y€g† ¶Ä -Aàb·¥ñ՚Üg#0‹•§If¥ˆöž—Qð0pa\ԅԭug® Ö:Zëh†§©#Ó=RCØÜB…n§³Äþ/oÕ¦ü1œN÷š(ÈÆ­Y JEDeéKa~ûƒ¤“RAI˜N%>›b…‹ l»Æ’¯.‡ -Õ8$-AiØ1Fåb¼ÜáA¬ºEöLꗌ‚ÓMðð¬¹pA)®@ëQ,Gä¤"*m–§lÅÃ**®i˜üµñ@qexÆÕr°–{Dc*õ拺ŽP-Îiö˜ÀÃuK«\.5ÞçKs¦‚ï -å1õò݊”}š)$ER]«p²`–8kX -v(Êö¥Š›Ð2>ÍYI}x¼¼¦õU õ5~ÁÐ’‹¹Ò:d)· …,¸æ¶S•ÑÉ*.²ŽK‰jy ­Ð¹ŠE®Rª8YŒÝô^ঠ®Ì{‡ñ à¢îÄÔ -…¥Á6vT )'35=7áädã«Tš5÷‘pm,’{Mîñnȉ¯XG¥Ä0+ã„8ZᙄôÙ󌊆zÓ}ñ4é -Ešr Dï -–­)?¹ >âJX¨á$Hᶚ ã›\•„i*J΃ªnB ¬`‘Í€|˵trM@s±ÎLG4oe4`:`(m@žláI„C3=C&}ÇðA*ü >à¨Ú•È˜i¼5ìÜÒ3&.®kü䘨b)v‹1„ŒÏ\2ŕw2¯ýZ äk¡”‰Só¦îF•¼4UTϹMªYè3:*èƒ%‚}cAõ…¯æ5ÙS./h²€@QÌ.Tzÿw,/:OHÐ œZÃzSgM*æ²XDŠLÈN§ØJUb¼dï(V¹R_G»ÏxQãY¡]Å ØGM“Ö f"Þ<ãÄlMÅw  !0%Õ]‘¡e¤ˆ'”Îì˜%¶¥Z7R -ƚ ï{hœÐ:ôUý [œ¬tFƆ—¹5áÔ@8xþŠ‚̹äo }\B²²‹ÕŸ,cpµ|ðu Œ&eÝ ëáU:RÃ(TÏå: &½›,Õ$ù4•‹à0Èå×qD²¬á.ÐÁ‘è_†ë+Ÿ°JVUXoαÈÞ¨‰06û êJ QÐõÂE5¬,úËMˆPZ£,JåÈ…*3ëÁk«T^™¸_7\ã‘T—Z*œD÷ø-¤–lºpQQ %Whðºr®¨äd“ú¼’šôP¶Æ…6,}dmÌÊC)^n¸¦t]̇Òèi=–Óèj¾…²|5Ÿ*x›ûÃJÙ ¬ƒï\d^ÅU7èÒLh«3FÀupérᾪo¡\_ÕgX Q‡Å[x(rF5¿È‰üŠª7Ô¢ð/“g{Ó!âà\MÑ- «¸Äá֕†Å•ŽG\A!r !"՞ÆWTUkßñU”Z pCQ¸A §ˆRðæqaæ,M}¾ ĺrá ghòA¸\å3áêyËå÷|ï– -iÝ<ãqRº]!(¦&áêZ¡–ä¸TÁéÇPMÁ­Gx—Áp˜ÚœÄw -ùÍ']4ptÑU–$ëE¥1ÝF²¦%•ë÷<0š­¸|¨¶ga¾eTÀVB;Ý5ák$dAc/¸¢3¥å®$h‘Rñ*éó£ É­Te¹a¡Çõü¨k2*ªG…ê=œ/¥ŒjÒR7T»BDÅBøʈšƗ"/<úQI }á²÷ÀŒ…+ª|R× -endstream endobj 23 0 obj <>stream -~i¨FŽ…À7¾4cœïÖ\ۋ/\Â{Ýû•ê ‹èÞ¯”•1,Fîü4TL˪6’jâø>‹xox¥vå£ÜO)_“›Aa~¾q6ç» sÖb] ~‡œÇÃÅc×v:TÙ¢û³øwÉS]ßB·!µ’S°“ÐmC~/:빚B¡8w—²å¡¼ ›Ç|±GÀ Ù žˆ¨‚ -©~t+¬áZdI¨Ž´Ô·øPJC@œV2J>꛽€¾q0T*7‚ÌrÞñó}Cá3Èac…Î;µ=’Væ8€fãæ Ã{oò”“m§Cø¢/فâ;½Œ9¼´p!²îŒLùi,ÖWðÆTQÎfÎÅl$ÝêR‡'0Ù$Š~0a\P¼Ð)ÌOLTü0 ŠpºÏit b_±f'ßóÿ -Ž‹„‚Í*øÓ]m( -&Ãp¡ZÄ|àA,gÆ!b†ïÅØOC‹ä/‡pNvñ¦Þu#`‡f R·o|ÕþfIDË ©¾õr‚Ä«#¿fUÝ<ÜxŒqÍ.œÅèèÓxÕ­Ut¾þ¦óëߖ>õø‡üüûÑåñd>½~ћÍÊÉ¡ ç?G/&ƒÑl0z}täáÇåëÁ(þåË/~ºÅßDâ~<ûåÙÓÁТúò‹Gü¹ó­ýö돧?/KüüdП Æ£Þäý†Ÿ¾ë|ýÛÍpd<²œ .æ³rúMçO¶áãɤ·Ø¦=^NʶG?ŒfáGøgöþ¶Ä¿:ùê›Î£ŸGƒ¾…ŸYÜ£×Õ¶o{ùoünp9»^ßzÔ»qmw|ó?ÝÓЎd‹¡½o>¬÷{2¤ßšé·ûÒãÎ_¼.¯†½þõ¬üko4+ÌÎú×°Gç¢ñp—¶é¦B£ûi«­v]^_ÏšÏ µÿS³ì:Ï'ýòñðöº×|ÂGÍÉ3Ýß¼_ ç“ƃš”Óù°Å¼Sûûœn<²éìòIùvЃn5_õ©†«{ÕPĺ¡Ô3hWå³Þ|:ôFÇg4Âú™ÙñI»lqˆ\Þã)ÒbD-NúË{<ê[q}a…ã««i9Û¼}î†!Þ'«xŽ#Ýg&ašsöùäª×/Ïú½aق³Wžº¯9± t»þx8ž|ûîz0Û0†Ê‘ö¾Õˆ]óG¹ÃAMoËþóù†¶Çò•Hš¯FKŠù°7ùþ·Ûñ¨µäò“÷6ÜÖ£=¦³Þ6£ Oî©Òt$ûŸÆû½9‰~¿G‡h5¨=±Û˜6cjm¸¹OAçÅx0š¶2VüéãõæÌïíS¬ï³¶MD¶9·åým‰MF4¨ñm9éÍÆÍUîè‰}‘KòÖN©o'ã›Ûñt£.°Û ¤¹0õ¦×xsL£ùúfÃà+#{1¢ 6®Êˆô>ˆðoT‹©ýáyûs÷&ƒÙõM9ôôaì$©g“Þíu‹‘îˑ<Ì^ô›4àټ͌ìڑ¾…}‹e|Ÿ³üc9y]]÷Yòj½%?‡Iú¨ÙŽ`ŒWã~¹˜ËQ¿¹×Ù=ܔ>üª{Þh|6ÌúN…ŠKš¿ ˼µòн±¢nÒüi<˜ÔÓ½WO›[”ö[;mΜÚéA;Ý¡™:h§íô nîÇ~h§VX~R^ÊÑù†0·-¥å}(›SbÒ»Ì[ËÔþ¾XÆå`Øk‘9xàŠ;ÊOn¯ÇÃñëærï-nÇÓ[ôãkN‰[<°Å[|˜lñûÉørPNãg!0–v¶ŒñÀŒ±c<ˆŒ_d<0Æc<0ÆFŒñYoþÇLû×åäoå ý;ü3*'É=¿lòPžò°é>Ѧ˛Ώ¯9%›î°é6¯'aqž+fzã<Äƒ‹ôl5¤½‰õüËxøûMoZNæ› -©íUÀgnò™|>ìB)‡Büw)tíþ"+jº.›‹Û»&Iî9Ü.ÐpD‡Û>Vq¤IyÙ®nê¾qûqƒëö—îÿå WÃñøÒß)p1ìõß|×q ñm¯?˜½ÿ6é¶9°÷éšôƒÝxíF·gûî),Ñ}Þvp’/vÄ;Úr‡d“]c‘ÓëÞåøÝÉCf”ŸYyp·¢ZÞïTyè¾Öb»ûœª—A5êâs÷5Úæ3z9¸ºšOËö—ç,=x_cý<®'{zº_Cöl;¾tøíÜy£šïÙÞy?.?p_“ž6¿É¡Úoí¬ïÑ#÷5@<äšWþÛ3‰îÉϳ¹Èê‰ã!á«ÏK;È%{+—ÐՇûD+ä8Ü'Úl´{ŸèA@Ûí Ÿ}ùìpÑèÁ]²î’m„–ƒ@¶såî„G¡Åe–{ráh‹Ë,Žîþˆ6”“¨ŒHÝ߈Z÷æ0>\8úŽåÅ£{t&.?œÉ;½êöäLÞNÏ:œË;u.Š{y÷c`‡#¹ñŒìډþAAέ—ó}Îöá.ð‡:Iµ3û¼ZWî,n¯Üù|.„mU°¯wîlç$Ûé±é];û/?>Œ[…nz]óRAût<ˆNâÿ[÷‰!ÇŽ[°j¿G[q_¸Ì3ûôts°ãþ3L}û±ÁÝm.óO¼Ï"óPütwÝÑÃ+ŸsÔ\ ڗú9ŸÊúv/ƒ{~/¹ê÷É<ö¿àÌÌÙþx©x(g{y_8 -¸m`m¾ú ..~Q#[MØ>®Ææ ­û&ý‹n‹Tăü¿+;ïa¿^•“§ƒÉΘ€vmög½‹3¿O†]Ùiî#B*üÒÒr[y螙ÑÓù¨ÿrŸ¹ÐÃ]‡Ý¬“t>¯•øì°wr%ŠÏ%ïBˆêgP•àÕ¤7š^µ¸-gwǶ‰&‹ÏNX|¶‰÷IÞwës—$þƒÙg͔aøäãápW&k×è³å’>Dô~`gv #òb½6ז.Ö[3ÚݸXO?¼‹õLóíͽzýã¿®‡åñ¤Mˆÿî_«×fñ}f×ê‰n 7Sïr0oÁy¨ý}Íûå`ØkQÞsµ´‡ùp£[ÌÕ~•Âûq<¹½ǯ›á;¨jxâ^óÄ‡Ç ?I`ҎìÀ w<â{O£^ÌØEÛےöˆ=4ڞñ‡ýë>”XÜþ–HZH¼û] yàé¾VhÃ3÷å„{¸¡Ð-†¶g'Üèg°¡`Ìý[^–sÏ·ä´Xw{’óY_ó¸w¬¯ùж`}÷2¤ Õ±Gðäº7•Ã³rXö[ؖŸ¼¯Ñ>nîÑÝz´ËOÞó±öd0½öúåM9šýØ»Ýç³í×ê õx:KEåcãáï[¹ž6ìu_ÃææȽ; ›mÏô€Rr¨ÍíËvjn Ù·íÔârÅ»É/Þõ üL.ò¾š”åïÍÍÑWƒMå ‘”Ã}XÒW“ñM‹QaëûUó<·>Ç÷(zncSzùºÍYá›ß×ÀzÃw½÷Íg€YoÒîÌpÜÛZl>¸Ë•\ãûTóó-÷á'FӁ.jgv #±‚«I:¦¹†êH𲍒=r_BÌçXÊõñç/¿•Ãéí ž· sxÀ¡ç“òf¼)ÀnOCÏ£Ëòj0ÚXA¾¢tݖ½Ù“6a²Ñ#÷5ÐCì6«Ì{»-ZLÝþo7<Läöôb·‘Û‡ÈíV‘Û÷Ãq:â;™t„±ÿ&ûÿïìgû÷;ûCó[Ü>À3sZÜñê»&­=äÂÙ {lÏ> ëx«)<ØÇ.¸ûr?˄·Ûb{ÂúûtÕÛóùž~7GÀý:çÀµvÍígoZð7÷È6šÛ|ßl|eDb/F´!Т2"}ºKómˆÄªŒHÝ߈¶“ç÷å(îM³ë›rÖBÎØÇ#y«ÓkæO’÷úÎæ}tm7áwþvf:rpçÜùG¼Sîü–wþÁ¿Z9¸ó?š>ppçÜù»ïÎ?b;¸ó÷ŝò-8ôeò];Y÷àÂß'“ß~‹.|lypá˜RupáߕÄ홳vur*Ý×:|_‡ãw:¼¾žÙG}È}n>ÖÅçîMsh®7 ®®æÓòd<²ÊΨÿ\zðÞd–æŒt>¹²bjËõ[}j?éžð~ =Ø3¾íø>“û)VŃUñ`U¼7ÙàAÞðÐFb;˜¦Åƒiñ^4°ï^OÊrô•fËïìY9x=þîí`<,gßMÊËïƓÞhSìÂÁæxïò›È›Û…{¿næ³ EØ+k•¸¯…š6\9´ßڙå¢GîÙ|õd€Šû)œ;.dûƒÊÒ©?È÷yƒX^öù˜šö—½µ¿Lo˾ &Ÿ(Ofçק'Ç÷¿ÝZ‰¬1tùÉ{nóӋ:ÝÞö»üäÁu°D,QKÔÁu°D,QKÔ.[¢¼ÝÉY¢¼Y - RKÔ¾)ÚKÔ]Y¢î屮oïøçb_;óJÛC0°=ìD÷^sf«ÓÁ¢öà³Ûw½ªÉžTžiQÕäPyf÷G´'•gZG:îÍaü™TÙ¶Žß~ËÃÁìEo°ÉÅq8“wâL>Tƒ;œÉ;½êöäLÞNÏ:œË;u.·>¹öíH>Tky&ïcœEûÉ>T€ûÀÎì@Gb¸Ï´:ÚYÿÚ"-G‡«Î•7îð\¾—Á5/ïwG•7îó`z(E*š_Þ~Ùü–zl{_˰ň޷Ñû=áû -ÇWWÓrÛgR^¶ãö{ª°<ÇÆÚÊLùç ¶ìÚt}2×ÅÞÍÔAÁÜ?Sèä«Æ‹øÝà²MD£o~oGég¨; Ó|:[Èy÷(æµR aüeñØÂñqª¿ß/Q-xÉuÙ*R•ÛÌ7ëd†ÝWÄöÍ|“Ì7û'£çÎ|ÓbDóÍÁ|s0ßìÔF]›®ƒùæ`¾y8æ›ÏÑÆÚóÌÊËÓþ[Ôgp5éõg½áOãA‹¬÷xÓ¹ç—ÝS©€³Ù`ÖbƧØüÕ`Ø&Q¾òÐ} 5é6¯!uћ–O'åÿž—£~ ¹á±{35ëÍožÛþ¶ÍlÆÏÜ×û5ñ~†ÔÜd¹oƞC;Ï_!UJ–í\ɲÊÕd|Ób±õý«ù­V³q Ig|czðUØd¶bØ¡[Óqj°=Äl÷gÛ¢ÙÇ2‰½šO.æCË,€)õPi/3=Û¨:ûeüÞ*ò`snaµ9„ > sz‹É܏€ÁڛpÁ_ÊÉ»Áä¢ÎG¯Ï7„Ø«Á6¼ä3 œ5Ý÷è$Ÿ‹K§yœÚ¾zt`[>ô ®ƒ~zÐOïY?mµÍêAC=h¨ õ ¡î††Ú\Ú=h¨{¬¡¢’ŽÚ¼BÌ~«¨ÍÇyPQ*êAE=¨¨uUÔ¯ÿ ’óïG—¬ª"Ìèü§ñè…Å‚gyø1Ü¿ÿòå?Ý:<Úýxöþæb<´]:./åèª^B!‡á üã?ÊÑÔtή†ügÿº|þÖöùˤóøË/’ίï¾übNÿû×9Pä ÀŸÃ?¢“à}ßþÍ~ú§…½ëèΏ¿ÿ#é\~):¿¾„ßlÒn’$ºèû þž~ùÅȺ©É¤‚¯ð?øšJƒŸÓΉmPtRlXtø7zÛÐ -þœ†—áj_ÃgDŠžâ_ú%zqÔeÛö -bŸÛGoàOÖ‰ÑþÕ¶ücWá¯ýršåîÝö¯{9|€¥Ñ~Äýz”»Aån ü[ôHî ”;ú_À$}ýóVÖeçõ¤3>ë¨op®Ž -˜77sôﱝž£›$¢s$,F);Rw²Bëί7•–RÔ·LMç¸ßçq3œ2Eœ8 ÇÇv1þ Ӗt³h"¡nܪªÎÀNA 3íÈS-úËóÍÞÂÄVÿ„váa?Ç+Ítԃ¨c4Í«fN6Ÿ9‹J&UÚ ²Zœ9QÔ·LåÒÌ­ÆyÜ §Ìª3‡÷õ7_ÿã}l9UÒM Ã¤§Ê®ûG -#Œý`r• -ø!üÿ×Þ2ï.#»¹Ì…êè®ÔJà=‚Ï2…µç„)†Ï…íþ(EÐGû“² Et§8‚¯Îí 6«žÓ_m©åFyd8>~ „/dzP"ã«sàïç¾g€–^sÞX×±ºD͖Эï­ì*“ŠB7ííÏ«P‘˜aOõÊMFßÿv;žÌ^Ñ!ùÕyÒyt<«F½‹aùl>¸ôrÁWçbÕK{tMgìP„PwMG(ú¾ÁBxô²ì ìÙáü*ˆŠ³á _žõ{C;Ög“Áå_Ë÷Õò‚üC5»1Ô gxé N`xқÍo¦(0ŒkƒÄí_”ºF¤:ƒMj—¢.Lü!É,W°¡Q¤uܶNºù -¡B$,U¸ýn^Ïë3’$p—fü7óÛÀ"͌J5¼L¦Úï°ý³Tœ"*“ÆÔð–ԝöG™?à\p¼Ÿþk°RϗÞ}u> ;1áïÚcÚ¬gööà´¦ÊesàÇy|ììhbºî`^‹åx–¤ÊÎqd7ÑPáƒöcÕñØ·MÖô6Ù :‚Gí¹íLÀ i„€Q_×½±ð¸_k¾ïÑ DD ¼‹´;YkݳçA–dEÚÔºç˜õ4STJL‘2ÌÒ5ʺ)þÀ€¨g ‹§5áQ¤”Cm?ø¹á)ÌÃL¤a50*xRº9ԞJaÔùâª;üòâ# …ÐÒXSžƒ0²E5µiÀÿ‘›‹T墛ªؖ*’”8«À)¼Œ?€G ìè]øb?(”c²ö‹Å¡V>•ØW‰$CnÛö]ÇMÞ¥ÍÂk˜ýÞÕ2ýו|¼®Š‹½óè§ñìeÙO.íÔyv¿r¦–XôÉãžùé~u5žÜ¸ß¨Ó–…_Ž/ÊóÇ?ç¶Ïg³÷Ãò<¼}q ZæyéV“ÜÆB„N逹ÍMį—ÿMśti#-l´¥ÝXá¼Ñ­.oùE¦°Ä96²“˜¯ƒ1ÃZbi‹{zÅ>_d#"Ð2GYâڍ\| ¸E¶j;)(¥¬cn!Vî`|*ÑÌ-tÌ-Z¾ë¸É»´^xÍÝq‹=Ý᜼ ;[¦iùDšft@Bv•ÌE®p»êA`IŒ= íî–Æ´+Uæð:@ÞͲT;†žV™?R¢[¤™ q–!„çÔËF•W-væh±ÃpÊԌë(:~_¤ÍQL¹£˜ªÀ¬á»´}ÀøûÅvHYýáßÝOv¨if Âc6 j‹Léã ÐçG¨ýÚdð¥ú¦¨¡w'n9P¿ã1½ VKðÌ@(‡_¥J•bmŠ: ™uó¤@sÇғŽI™ÐGr@8¹®¡=þL ž£UB|ºü.×l½þ¨`DÎ>^¾ø½ŠÔ’ßöèzã§Æ¥™ÊàiY„©]„Ž6÷­k´*d‡sXˆ¼ Ï¼†ì·®‘Z 8'–¿îR@±€=¼ú„m_»eÊiGçmÉo„Fn»ÿ©yû÷ƒÑ›Þüjú®÷ºžÃæ.ìë 5DðBN„³[$’—2Ša±Ùu›)¡aiä–I úWHZià2¹€•–Øݕ¹ƒäȤ»c?OðõfyK’;c³e¹fßg$œ1î»´ß-‡±ïVørå¬>®‡:A©3ôLÈ ¹h¢SÇ~ -‚­}«Î-›€-’`à9@ïˆÄ 4ôªnšË'à‘2öÀ(w¡%P 7ŽËÌö*…0{¤x<îeôÝ7n,:tÀÀ£Ðw€=·,+. |°;±È3…c…‘ ԇ<ñ3C߁ò¾/âûj7‡VJ_¾×†¶)L/=íÖRea96 Áæ®rXIž$žsZÝ0ѶßöÜȍ,v œ¯ÜyïèÑcs\4µp¥Rnjßai’å7ž n¦sGS~2uJY†g‘UÛuk9ˆ]ËJC ¼%÷(eWf™BÉ°¨ßôh ˆ°¹—€‘R'JÅCal=‹:^ëvñË\Uölô’%lÁ/aUk·í/ ×à{¤OæÅzBÇîJ+r¥á»Æ‡ê¦‡äôwšÜKü÷>*!™eZÜÂêtij™N@A€è-¢ŽxÔυ¡8Õ>Ÿ™xxöéB%ü”ý“Û #œô•ßJß/zÚ÷Ûcã²íð˜÷%ð%ô4}eìðo§§}ߪ}wãÙ±ÃÔvMjÓ1V̔cUšÕÌ$ò“«OÛú4ˆÊ±ÚüDLjUÁž;ð·ðAÊö3Æìì4‚Á•Ž øgë`ѳW^§ƒ­“9é%,)- -{T¦ö ­ѓkìÜÚÛ-t½ÝBëÒx胇¦Æ@à„NMŠ.~{Ž‰\w)œ›V:ƒ•†®fJjYÿlfw‘=)í³F5;ߟåýiî4%må™ïµË †k“uqê7Ο¥¢@{£*ÉW<+³ÄÈ°÷á£Íº,@ï3.3±§öøiœ×ðs“€äG?ö¦oÌ!?ŒÞ–“Yy¹¸IO†ƒÛ[»/áOSزÔþ×?ÿsø‹ì(¿åo¸?^ö¦.!éÜöOt~}ælnåÛÞMõ¾óëOù;¯‚#Œ-Âþº‚­üëõšFr Ýÿòh]é:½±O_a‡žôf½oín“ù—_üúÃÿòÁÿù¿ÿ½ò?ÿ~_ýóÿ÷§ù}EÇ¿~ÿ—]XŸëß´¿>ì?ÀìÉ\9Ú_˜}Yh`^?­âª‘¸è<ÿþûûðÙª$ñÕ9rå PœÿúÿyÄßP!:µú9sØïñù2JÇÞ$°Ô͂D‚®„Ø°(‡,´ðLý_ç®gÛ§Às÷ç5B—%“¯Îëd“K"C=´‚áÊ¡YP"h$X,ËBJFbÊWç ¨À[‹*VîÝ^XùêüCĕ¯Î?D`ùêüD–¦¯Z¾:êVóÜ9ýj…s¿­ððø‡ÎãùlÜq[rð{|BËÞµçÓrò¶¼<·2ý¹k5­n;ߏGãQ§…[ñ‹¡LIäæHTN+ûÁjv¥…à§Ábµø·¥A ÔäTåÆIYÒº˜@RŸý›'näÎpd—4þB€/³'Jà©J¡uü¨]PÎ$@Ø#öÁ#ó@Ù0£§ @•aX¡·œ%ˆ{AÄ&øUó7¨ð(›ÑGìÅIÍH™áP´£ 2ÊRž»Y:ôà&î‚U½$uǝ·»½Hó¼Ú{0o!*FÓnnRmæ@´ °@»#dÌDz{D:îdD: ÁÂXâø;‘n‰Fþ¬Îë“.†á…‡¿Û¼Â -¦yõ@?ƒÖUÚÁûUÌ.¡ƒ©ŠhˆvhÃ`ˆŒ™hÀ¯7-u3"…äÑzÌÑw"Þ•‚§‘Ù¿ÂäYEf,¬ š{IÅ«¢k%‹<ˆŒô=–  Œá9/ôÌ@¯ÅETÊÒ¬"-Â_§ïyÔà«Éü!…ï'@$*(–ÃsDÆøú“*y⑘`BË wǔ£>Ƥ£ðƒ<|B˜t‹4Zþ*›ÖÃÂÖòÇtØ|^’ŠIG"WL:ÌøAÝ5bâ1,¢^sc$ÔLze×ú~V¶­LضDÞ¶¶íªÒ^D=É´r#$¹ˆH@²SD:–±"Ò±$F0–Õ1"ÒX ] Ãñ1j¢¿?"u3¢„@2ñF߉l‹ô©ŠwÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(Æ @°„ã"¬4nzqD-ê^D-xÐkô¨µH—ª<Q‹@4®œ -7n’“"jyi*" \"ŒÒ÷ˆX -Ċ@8,ÂJÃöïhE‹h•V ²G}'Z-R¥*ÀE´" ‹Dޏ^,ŠhEÒSD,’°ø)/1Vÿ="ƒ±"3*{¬4nzq¼}÷"jÑø)4a ߉Z‹t9Ý’øqý³‰7âß©Ÿ6éà?ÿèH«Š%+ü´Ü@®¡û·‰Ÿ6Ïô»i½+‰þ÷ßáû‡þø/ÕÿѧÃÿáÿÔ¬¡¹›Õ·úÇmÿsp†Ö;C´ÖI³nî¦ñžËEGoãªqO.9kÀmÜ5ðè²Ãƍx+—M ãÈQä“ˉðäzFoŽ}ºÎŸ³náѱOÖùt,x[¯>ºì×Y·ðìàà–|;ÝÊ»SGõ3PëöY·qüØGë\?ÞÆùƒ.¹ªÐ Ù² Á[9ê(¸žàuÞ¡pÿ}´ÎC„àí|Dø貗hÜÂO„£[ö!x+_Q׽ΉT…6w#ÙÔ9’¼¥+ ­q&-€[¸“,C­q(Á€·p)ÕPo-­ë|MUhsodÍ.û› hÎ6'xnÙçT…6ö:Á–ýNÝÂóTCµµ4®sIU¡ÍR.´ä–à6Ž)ˆ\ZvMU¡MS0 e÷@·pPÕÐl½dR㹪B›û®ìs5Þ+„ná¿Âç–>1BÿAJW-Ibp~8Å*GôkôÃtâªE¯¨vÀ÷Œ>¦h$~€'.`jq`˜LÙüÆ®xéÿ‚A'…O|å;~>Šž:r¨°mQéàòWÎ,wM]çoèkê‰ß9 -¸é¾4Å¿ŽbG‚Š¿pƒøIðÄ÷"ÌSõëׂrⓗ+xñüL½z|öêû{*¤¡˜¨JnqH+/),À¡»…2.Š`ʾH+\_B­I`»©ÛÞX>Ð¥ªY¨R¾ˆŽve„àՒëXÙýcÔÁv~gKƒ¥MPt]¤DŒ®"@`û.AðÁÄU9ÄÄè àãÛ÷(gqT¡Š¤r YÔ×ÜWNªƒ…'±¼ô¾ -W¢]ÍF¦›€2H®Nõ,j·ÐٝÝfYWY^•B¨s£3¨’º:bé§/Àõb|ûómå -ÕÚÊêíoOê†¨Ôv®2§+~ïfMEŸeø|7:Ry7øíHCáyșMò„¿úWøìâEñ#6Â󇧫ÀjLôñ4ôÏË¡\~« ñè!öпô”>Rzzú$TD‚©qÝÐGŁûŒÕÁ€¯r,ÖÁE -+{qCÆ[ÕOßIegÇþ(^«è/ZÑ?MiÔX_$uô÷WµÎÒzú¯Ä}Ü÷"ý?°j4”³Ã åf×¼/c(±ÌgÎpÎâN< -ÿ¥+?eŒX‡e±b{b“è£oqÍ1•>¥‡Eu,¯ˆuåÐö¡Ø´ê™eœ)Ô×u¡·ŸTzyv¶öf؏¨xÀ¥&MñFíBå”Æî`–?h ‹•Ê3eÐ씣Ž÷pí¥ÐG;Õ" m -o e, Wõ1¡ËÁì´va_ˆº ÞD€>¦2¹îp#ê0cYUMaõG¿þxúóO:ßv¾î&ýay®Î¿é`t¥:û€ý±:»ª›äM¦i¦•³£$]• »÷èT.-±\sfå3“ ¤à˺kaƒå&…®ÂéÕ¾$c^$pPÚƉò䆘Ÿ«ìjé–ø)¿FHŸ1ç€P:KS¯¢Ùþˆ/ñ.ÀÀ߁¿YÑ+)–Û^ÍÉòÝ·s%,ŠxØ©Õ%4:¸aڕi‘ÀÒÌSœ¹#¸NÃÅ=Ùß²T¡“2Õ ÓA‰barê¾¢®"€"± -WSF¶~WÜþ¢t¦Ú©“å~n`P÷£…Áíª£…åòhð6,Dã¬ž‰H²£‡QêCBÒ{èܦ'Þ䒲 -Âe[û‰ʝi=i^‘£ð’“z§®e½Æ³g¾S×r•¶S¹ë'¢ÙM•–,ý®øÏFež˜ÀGDáÊ4/­·2¥åClÍò¼t‹™ÃȺ¥¹sák­gÏ>V3‘´Å º ÇÅ9ô5[Ïb Õª2?» q³õÕy4_4K9Ö¥‡ÛL‡ðG¸ ŠÛ+Y˜0¡ ÄId].ýïš*±ð*MÐ*ÚÕÀ+Ç/y,?Ç~ùŒ‹~¯œé -ô÷À,Ø5 œÆcL"#XÖ-^¿‡W6àͤ²@•îؕ/`Á«4N²Õb48¹•J𶢤/ŒÅ~:{-u©Õ×4¸v]¸3¬² Ý4oWeôýÄÕµ@²«UQÀ ¥¸P­Ê”ÁüٞK)¨RqhûØ("Æݶcס¸kœ¢‘¤.|>q:jž¢¼c²Œ‘Îtg’f‰~'X©Ոð›r‘¨+ow \3B #¸_Ânpr]ƒ¥²«Ó/t‚2ý®#VÅN0¥ÉùÜ-Dˆ<ÅÇ}šŒeºÀk*¬ª ›ìKj9ìgagTdxå>gE'ǂ¤7À5mªp>»¶Œ…÷ØW!§Ñ]#„T<)ôµQ«Ç¨‚å׎H,A*`gçÚ_´€²Ù ތaUaÐnàn"wšQ®å0ÊU”µ,ËÙKÐa OaMTn\P{^™`保÷D»P¼†1—TŒÖ»Ša¶„v°ÔqF`I"ÌÌÒìÔÌh(\jggM@ÝÑf—Úi¼¨{ù Û%ÝÞØÀ26A°oÖÑAl܅]Ò|úà†W½‹ÓÒv´<²Ÿj•ûd ÅÞéY]'€Iºw­òªº¤ÿp‚†d¼…¿;2Þ ÄßáA“»ïRûƄ—©Ç濃‰ÞßÈ#ÍJ>ÏݝH€V:—)˜ú¹Kø-î3Pӓñí¬腕i@‹_|OÜ•<áÞ ³ø•z·Jû2-”oáG`üHƒ‡ÉÊ%™û /ëcx!e¾éÑ´À+UU´ï]Ôٚ½·öÆÓEee•ÜDßyUY¼kV(¯^ü\]ו%o¢É®®¿šUª«Kò.\hD{UCÀœi¯kæÊpCfðúGÓ¬vÎ[¼wIOoôÞÚ9÷Þ0¼ÙF ˜W¤o+Ù@Ùéô¿*¼Ÿ,)j– MËMí¶Œ.™§j@ÑCWþUªæUôäÍnøš/ã­Eí¿ÏÍÊzxQþîv•÷sÅë«ò·ÙE9)ýëó§ã7óé*‡ÜKÔ9ò4¨hä ç´ô[5Cc*E.••}¼êHƒµP–-Ÿ¬\K‰|«0ò·SúvD_k¾Ñ—©[‰iôj`йÝï¾ÌÀ¹¬éðßNéÛ}­ùF_¦{¾ܛi…2¼?³SÀ-ˆ æ°çɧ‚ûŸóÎÓÞÛñd0+GëÁè÷ùÕÿUs#姱±A.@*áRQz«7²Á5|‰Ï‹î¢S¸ÛÿÀD‚IZ¦ë°E79ÅGP€Ë1ÉHp²Êdîϼ1éºTp8rÌÆPEé.„Ti᜿ UgèÑÐ{¥ƒ85ۀÆ>˜ 4jf5u&îžF)\fŸ«_wQ:‰iJ¨}1zU5hØ&4<EJN‡ -²-àw~*þñËû¨å¹[*¹‘±3—Ë04[²B0¤@u"“ýk5ñ,PæÅ`8¼§·–Œ&Ƈè'ˤ¸+þ”«¢b£lì¢\ Û »“3ô¬éœÌpß&jš ‘s…¾øÌäPt@¸{MÐæJ<Ä»ø>)ô÷ž¸ê{áÃh.hG;„ydâ|'8#v¡©@4h؃å* ¹Ú´‚ƀ´–9@eNÐǪ„.-œ`ʒD¸Ûza‚ÑÎA ÂÎu -I;3Úm|3dá|÷„(,Êèu°š‘ÒQ38Eú÷²jUlåL$ž¾DêRéHÉ°ï✨¼C9ÙáÙT½±2›MPÒÅg%Ù­8}®†×!¶-¸¤ÏlÃï0ms+Ž‡IéÛð<·Þ·ázn“mÅ÷ÀÍSÃù¼ ïƒlæ¶ÜòZ—øˆ¡K|7[ð@L¨ ޒ”½%Þ²‡—g¹+4*X7F”–€)¨3®Œì Z9րœ™¨…Ñ£§N0E u X@¡Uüh i˜¥>ô;RŠę…)[E½XçéšS£†&SÀg¶.Ð%@£—9Ü"m"hÔý€ ‘#t«Xy¼†NXéS ­âÕµ“V÷¼ZEGÛ ™æhuÏ$ŽUjùÑ -Xôü§ñèÅd0šYGGŽz^ü˗_üt‹¿åî·ùý÷ùÅ?­zl5ALYîOæÓëΏ½Qïu9é<Ÿ\‚Ñ~Ï÷ëIo8¼žôn¯}ßô•¥ô£ÎËùè²sÔQ³î£¥Æßtl¿®ÄjˆµÏ,´~êp {ýkû‰Ÿ±«äùȒúºòÀ_Ç×Ãr:\ͨÝå±Ã*M{³ßK«^—ÔÖÏ\ ^‡ã¯“r0-}ÓézrÛ)ªû#LÜåñB×af¢ÎÃW(ð ÷Üb?í7ÕyüÃùñÄ®ïa‰(Nv[ŸœÙ–éùÓaovî÷bl;õi‡¶bÞaDOã9€°]\]ÿóÿ]ßá-_^Y¤îåö3þÏý?XÎ?jTx¿ê¨ÊÛ ÿ®ç«nÏájä]ß,³îë!{Ô¡ÿÅu|ªI° þ”€âSgÕvÿ†·: ç§òµîˆêWµôþ ÛPÛ#8s{ 6¤±ß$ÄŠÜŠ´ÒÑ"YI‹0µ…ûÍÎâÙ콝°/¿xô×ÑøÝ¿ÁAûõãáûé´wþìì›Î£ŸìÂqõè±=‹ß–ÜèÑÉøævlèÓÁП;¹î F×ā§é‘oó'8èý2˜ìqŒHkœÍzý7­÷¦ƒ~Ãdü¦lƒBâOÃçÿ(`…K†ñìeÙÛ#ñu =5:-l $>zR^u¾ë|ùEçëJßuðå+t½èMfµ£<.çƒY³®GcoEñõ´t2ÏyA}³¼º;ÝÌ{ÔÜ'N:ƒv£²•±tn[ٙ¡é¹OHaž–ß¿-GÏ//[Pþc“ Žî$×lœæ!d?˜L¸›pS«¢£ Þ*áxKn^h!ò¶¶ø»¥Ñz‚K{ÝÅß{/k@±vPö™ï+ûsèŒûQÔ°LÔ^ö[ÞIOg؝¤ž{>¿ºš–³op^V¢øú‡ápŽêÖxÒ-ƒKîtƒ[SˆŒV¤Í擷ådÚ¿”VÐý¶sj {ôýÕUùƾãÑ«ÁlKþõóùljUÂ(BìÉ`z;ì½w_¿ù茞·˜ûÁÑ퇑ëTcv´¿»ëãœnetž¿ÊŠ¶;ÇÞCXgu„­Î©ŽÌU|V nn‡á¬âõ˜C]MCëbLuñ«ò…݃³&Ó;‘ÍFaDBŽùØ.N! ™¨«ÝBZ!©øØ=F“øáè?ý‡£ÿpôo£î}Đ«ƒLp ɘ÷‘±ú£ã%à휌'#Ëëïäèø¾ÿ¦uz‹¸Å'ÅúÉ]¡Œtî¼Î×.?Ÿ®Ù ãåƒ7^~eæ´fIù~ÈՇ=¼Ë{E¬De ª„‰4 šÍ騉jy,þÝaƒº;8ã«_ïàÔü$©”¿öF³²ù™ ¹À&§3óå¦3óóåeŁ—xك”GvŠåP½àÀVr£ãaonGòS9Mz×7åžx-w-aŠ¦’‰»ÔJd2+|>nÈÏ̌„[›‚W~)QS؉˜¨™šš$MqW,íÞ(d’4ƒLÛ®ÌdžJLÀI¹P8D¸ÂÆ„R…éB‰‡J¨4Má^ »¦ŒÉD²Ê@@5dÌ -ø´†BP1ù!(ËS\7]-ñÚoÅh XFa}e)ØF׊d=H -å™R¹À°Â¤È¨%˜²Q³†2ú.ÉòQŒ„÷·=UjÆQ…W|C] Çñ»Ê­8K÷,Õò{ˆæ”k(ýQàG\ì€?žèò`IU^À"Q‰‚¢¨~kºó®ÉP DV%üV/t¯—Ž4‡µÓzíhçpòIˆw ǐ`ú(‡Ü8;ÕÊu“í÷ºù$Ëæ` 8x&ÚèÏÿfäCfÄÁ˜w7Ž \Nµy¡ñBqŒ QZ¦]¸h»# -+vU‘|~i‰H T˜“B:Ù¼(R#)@1· -u -ÄÚaÏÍgÀ!OýkÊÉõd|³Ÿ|r×BÐÖgŠn0·¯x¬ÛÜ®ˆ¼ô\ ÊÛÁhZ?(Öòѳçÿ|i—Ê·…tÞΦq=Šóáæ$üWi‘‘ÿñèuئÞî0*§Îôoüd`GˆÔw]xüIyk÷Àôù¨Šû¥7„zÁ•Ç^–Ã,éWcümqx~ úã˲EˆéËå'הL¤îûöÒ?¨µ‚6LãzúðÏ+'ìÕ§wDóð%}jÕã n#²ZgV&Ã& -cRÁô ú¨7×/~X· MžåÛ-ÂOh_t<È`Cþöõ¸/_\õ.;¼Þ&‘Šœüs4»EZhÚ37ÃÁ B ¸9\äáã«é¬Åö9&p˜È=;Lü¾ô7{®Ù«*•yz82¶92$ú5?ɑ±Ÿ íU1(].ëJ—'Éúâ宐÷>f;ȅ‚ó‡Eôñ‘¿tîA®!s?Y[{4ÿ*ÿdÓÿÙƒÎú×¥å,#ezó?þ£E"ÍZ†ô ö¯ƒÌ+”søþl8~w'úduý/¥²mtʋáè²j»ν -¥I¡¼íõ¿YÁ†[]Žò!&øièzÆ4̧勳Ócê±HI}B‚CZ¸¨ï»íY¦z\^'e竁°3üd2¾íœ]÷.ïŽW7OÓÜbϬúӉã­l¾»O~wL™M—½É›j£·ådV冷½óÇs?0wÏÜÿnyëÈ®ŸË4(ñӉlƒ8§w⪲è¬,ªƒ5I¿]FI7—6}Ñ–vºa¼¸hÞï¯ÿþ¢7–“»ÇÊÑ?¾A -üú;®ú×_¼è×Q R“þøú¹Å–Þñ®g7;c®/ùõõËgǝ—ã¿"IÜû‰¤Fè¼Cš+7V/¸}*³ ’A¹ 'ü׈[‘îV´®F¹$0Rxàä}/´Ïs•bÌj–"Jö†ö`ÄíeZ¸”Z¸?Ûß^'ªí콶Jyia‡ CÍò"à ™I¡±f¦}–MšcH¶ táâ°Ö?ÃÍÏþ¬ŠÎñŸµ dLìÓ©»!MK¯Pp׆vXp³|XŒ%[|цa—³´Ôzög™[Ì*&2³­Nzšg.Ñ8I„[Œ¯¸³U”öìÏERA [Rc–C‚®ºEnRã–—ÂÏ  „^ -û¯Å™Ä8!•† ŒaZ2¡\b…E¯þ˜Úu[¤{*”Âi ›Ðïã?›"àÔF(ß+Ã<2Ÿ£Q(ø./$,#“@F…tTaîá’ãÜOaè´]÷ʅÜçT÷4ƒŽ.c81vZ+ ¤ —ƒ¤Üj*•»%o|¾wFT´tKLÁ«H'0â:™”™N…3²Y\®¸`ât»Ò…rÛF´|¤£¦Gip^ra1f:ìªTAÁ[XÅR~°¿ÊŽÜåL™Ì—3“®Ç…Ó0i˜; ÜÍ·[FL[è°Ý,¯Œ8ºL&¸6DՏq‘i‚Ñ];}YÂëE˜Ü"ƒ¡{v:bêBº«as¸Ì²={¤t½dö"‰–Eà^;›ÀÍî´QÂâ˜2„SÀšª! -§EŠpTÊö§ÝäZ"ã·§±v‡~Fk&…ShÆiI ë9ǝQͲsÓ¢UnaÛábIsW#uPd-VR˜ -ç§PwpqSå¦ÒR ÅK|·-ß+áóaG'€ªv–Àa“œGxá‚3`¢ⵓ‘#:{”kÄÇ<ÐϏ4\¥Ãâ͡ø«S‘4Í7ÌñÂtÌérBZ"æÍ1ëçl-ãÉîo)aRÜDÏ*a -Œ@ՅÈÇWöüÃ5UäFÓP¥n팁ËQ궺À+—s*•Û™Ns®ûO—x`8¸ÙþÜ©\xnEÌRY‰ g/ՖÍãáªìvÀ%»{EXpjù…&f–.Š‘¨b§Ì%!ZôŽÌvWHܨ–:Æ ÄÁG¬ß±v£Ed.€ŽÈÆ:ËóÌìa–º]š Ü·©•'‘‡Iê± M—ø¸$‡i¬QÓVón!”âÿÔ!™<óëB‹Týeps¡-‘ø†•‡ŸOú׃˲lð87 H?¾Fdgcû‚IT¾áJDÏÆÃK[²7uÈVµG0xݵôO­»$`ñ9ߖŽÇ¯ŸMzóél~Ñyñº¥bætàÈÑ1)ciš"‡·šW!gØÅç‚ã@´5ˆÓÃ⓰ª#I#-´cuÊåÁ[ž€lÃXÕ -pø?  ²àm&©QXƪxjۃCõ,‹sÝSÔ«Åo†›t„,bŖŸ£èbðødâ“öLÇÃRóÿ+Rü \2ð2+_h<€M&þdÆËԹń["F•Ëþ¸ƒ´ÌÇ«³Ü±W{,wª[Ñ&ó'\Z9.ÝÁfÔâqiUKäÕÒ*†©²ìì;e&£Ž-~ ¤™;ƒQrÉÿ²GWŠ= ûeøÁ(¯nçüZ,‰F ŽûoP°rm -w„P¸þ¬ Ÿ¥^å¢-~`Y#A= –¶Œ5ÁíÊa¡j‰‚†©¶ÿ†-ø·òâª7¹ˆw _â–åkJ%+ô‹Š˜*–ôe$`ÚS$ÉÈ‚Å*/ d$lH‡”—ŽÚP,È"©ÍUá±dI•*o)Y©LS£L»ž¸i-`z¥Ç"à‚R+:‘Ã"a\*îŠÝ«™ËiQ2ƒôN'žºkÞ)׳Ú‰«7 ÛLZ^`p¡ÉÌ B¤Yê…GJÄ\¢O^„%'ߋã`c+[»;…NÓYÕ¹l9_ðe]¥š¥ä’/C>ޗñµEË6E×£-oLI|«: ú×ûÞpv5üã?í0ÎÇoÝey¯z§¥mQÙOZþ6»('PÓèüéøÍ| -Àã۟o뱀×ârünĀãbW®Êáå9ÐqPµŽ*?§g{³ùÍ›ÒÓOC$ÖË3$ÔÙÜ6ùû­.³7½É /¹ú~0zӛ_Mßõ^»ß_†÷Gòö|uþõÿIJW#?¥pÚbà/Øô}kAãyñø¥Ù³[tŽÀFºñ²¾¿t=p]z1ž`ø³ôiiÕ÷¢“‰æϊÐçÆùajwÜÅØîù'åUo>œEÝýŽþ|Mm¨Dá_<ýɎsíS¿Ý G¶Á‘å“ÁÅ|ƗyV&瓠¹£·Dí¬\o…è’–­múþ™…KI¿þGÓó·½Éô»¨„}Üöm´°ñ‡éŠ†£x~¨åŸ©FãQلJñe`—ÈDMïrán?À‹ÁèÒvX4¤]3–AºMÙ` qó»\N±ž(ÍH1€{íŒ&3}ï ¡=Søöms¶mwcÁÃ8ûVßßìûû¨KôÛi÷ Ù}Ø|¥~Š}s½ìVÖVž^½Ûõ½œ| -W¬?˜¹—VIïæ¹ä¢Ú+Çýnp éª &Þ·Ü ö}”æm 7Žï}£±Ý±±ý¸¼þ´iT¿5Ûª;2ªL¨f“u]^_7:¸éN Uו#»Ϭ¨æÒâŒqù¡‘*]žç“~y Ù»!VØÓn'úqSÎz—VÞºƒÎܙÿçқµ­¹¨õŸj7“Jißö.Iåë¬Ý^…ModzEXo8 %›Ñ溼t=LS¤óØÇø:“ϝÇóÙ¸ó²7•“Áïå"V´âÑ:oFVÅÏg×“ql¿«k;˜Ž‡½YÙ¹€PZʆ¯´.:·½ÛrҙnæÐ;– 4éy£TÇv|L=—QƒÙ¤7šÞöìüößÛ~ .->‡‘NìØ:ÒönÞ¸íëIɋhcã ["Rc”YÝTÄ}ØØ6îÃÆÆ¡"U¹â¦d•=éÞö¦g\¢2•/&崜¼-;`'ï|9˜õ.ÃÁŒŽö¯—Í uFߧCt-؉F„³Nl+ Ñõ0‚Ëé5¯E\—¥]Góhq¨¤òÈóùìÖ.È UmÌ/á [02G?¿ßÆ?rŒþ³áø¢7|YÞ·ÓU¨ñ€‰_–d«ÊY9üKofiv:î÷†@›iÅ»¢µÊròÓJÛø÷W |Á«i²„î&Ý$âXoÿðt>Òlù¸}û+Zfiæ×Ì ûãm‰¦÷gv‹#ŸEk1Y×ð¸~×¶}Ék6,Ú†Ïo{ý°µYÛøi¯_†*"뚃l°Ô:_ٕ_å;KÍ'ƒé¬7êÓ9Ôy¨¶E·Ãâóg³›íÐýép<žDäÜض 9±a•œrÎW‘B”BÔr}3 b¼:L^äbMÛãÊVd”v®˜wôF³AǞq½)óªÔµ;jё´ØÆr°Y´8×ô² -Q´¬®ÌˆC{VÛïÌ{ÀJ;§å[Qª²’úò·øzƹªíI9žXrÆ´_¿¾ÿmdµ²- NŠ5X¤r5¹þ2¶<{<úK¬zh“g«"^YATòü̊E'pöý8¾¬;Ғh=Y)f8•)¦NkV_]ë™= [>ú¢7qUp¦/ž<…ÌJ»©+G%-¾JÛïo.ÊË“ñÕ`Xþµ|¿/ µ§çtYHª4ûÛõ ½„²9;‚¹{1ìJwŽÅl)Ëìю˜š ù¥7L¯íBQ¬š‹[4À3~ nh–dƒ|Syb‚ÇýÑ[ûV+éØS9b¾«ÞÒn­h–Û߬hôڒ’yI)*ä<›_Ø-÷tl;ôøt iÒ92ôÐRPù(\·µ4ÁX™\‰t3.Ø#89°+;lí鋏`ö®H8q*çTV4X“•Ž*ýo¼¶Šåŕ§YÃÅåe·Jf…iHI^åÍ ¢~]–¿•ýñè²åCO“é¦áBY3c«žã!}èD3¢…yþž I– ríRæ6 ÄÑNíæ¦X„žüú÷ËËÁü&’íÿ ³Àÿ;V›]§lTE P}A¦x 2EÐOcîO€mœx¶ñ²Ê6Û>÷ÇÄÙÊC¥ÒìU8MbF‡mœBóèÇáŽ9\¥íóE¶¹™X¢óý‹³Ԃ֛Èåp6¤—k¼™`Õv+(æ5$™Ç¸H3&Fãpu#<6 ¦V©«YüÖ‚AñÑ?ÇÝ[»ê'võ/vl©¼º7nh6}3¸½°}³ÀÛMJ({YB'šöÇÃaà5Jþâdwh3,z&ò{y›PüßÆ?Œ®ÆHÝDñÖxô·òâÑ/ƒËrüèDZe…ÿX?n‰¨«1\KݟΆÝK>…£`Bn <çˆ ƒMº½¼±?GÍûu{Ù½óՇGêÖÃííÄ·[Óhä;@ÚAaº\“s±iìõʵèæ«VE7[‰qpc7UwhO.R!ºÅ†Æ³1:&7QO¢Žä‰éšt}{çf ©x2Ÿô¯;¯&åàÂrZK©Áh€…#ÖÍ U¸ñò û‹ä\ݪBË5ÈƱ’¹Ýb»¥EÍÐ6»Ý\–ÓÁëQlþ•ëxDž÷¬Å‰-Q jÒ°7½Ìnz·Í9^ub–Ç>œto‚ -ºª‰!¡€ó× šòady}Ÿx}&k›O.»V«†ìýª´¶å•=­¹Ô Ú:k›ÝúðÒµ _üº»~1úFµi^‹Í¦`¼al¾Ý0ÒiÿvØ¿†¹FýђŒ¾ØhfÅë؟±b”vʆ½Ûäð × àöõ͛n9›îZv ͦ\¶dãZÆöŽ¿G›¥ÉCvÌ Äuî«c‰ÐÖr<ÞU}ç/Àˆ¾©Q2¾ÝÔ䬁•!6µC–Z¿WÜ{Á¶tћL×Mi†å‘ñ¡Ô õl¼¿ºq|(՟GÐê¦LzÒ uèIƒÆqOêvÖÕhÖ½nàˆ®Ñíäjê¯[5®‘7#ðÊÙp‚àC½ÑˆƒêÕel¶QûèßIJÖ×'c«»^vž>öò±*:ÿëëΞw„Luv$¿•I¢ÿ×7ôÁ+Ʋc8jBW1m×5"Ëvÿæý: =j9ž]oÔН¸Z·g6Ťg¯´¯e£ôóiùdÜGGx½bÿ˜žŒUûØ,d‚¥ðÅà·rø¢œ@¹˜ïßÙ¾žQýh(AçâÖF ¸§NÁ˜ôxâžÂð†¥§ªïrF£Ö/s5x›¼–\˜£ÞR ÍR›ëñ»¿ .—m]Å¢Ýõ¶7âSq³E%*½x°» kŠ%Ž~ñäé9­—5K& š¾šôno7µÐ€ÇAP[ÑlˆÀm]†â`­µÚ>íMg+/ @€ ƒrÚ±‡ÈeÇ®¢QÔr‘鬴¤½.G‹rpÓ9»Å„Ãɨc,'x"žXþžðiǾåèÉø Îoê.¾+G—řEn_0-;ßǨÿÔ±¿ó¯‡gzûÇBæî`¿¤cgaðú›Îiïýx>³\ñõ¤wsÓygŸþ½Û9îv~=AíÝö’Ì1õæÿÉÀ#‡þo{õúÿίKê¥íÐô÷weÿ 6p]™.Ê7öT€Ð±º»Uꖄ}}2¸ÝÄ+ó÷rƒ´‘êOÖ)„ÿ{ï•ÜL¯$ -¾w„öð‘”èM½÷ވ¢è)Ñ;Iôîöí—YÄì`^f!³šYÆ(‡*–£é‡‰è8'¾Ÿb3D"‘ɼý9_ŠQYӀ7Œ$.Z•_oȚ<Ì«Àê)È[=Ì«ãï±)™VU=Ú2glÈÁ¥’·ÀcÀÁtÔŠÝú—5ÕEµÐÂÁâú)3ÚÊn»›Âªuppý疪ë¹> -ä(NŸÛØr€cSã=•/÷;WCczþ…íB)A$~¨œÐ zƳ¢9ñ²`ö€Çÿsw\%•Ž{æ—à ü/,%Nf‘7XÔgë‰Û <á~çj‰-w闍äÊ­B›BfÅÕòÜFels¸eg -Gˍ³]ˉɎ5F1 EHg5‰”÷ìáÆ&2QCì°÷*-Æ78ée)ùíö%W™ý¡`­ð…¼ü¹B à¨=ÿ.~Ymý6&P -ñIÆßjN§„t¡Úÿ¸Um‰åR!Óãn2>ía~¼Oq‡žüD"áj¦7­ðÕqÄ Á£ÈÚ ð‹:/‹^­ÔÆ<b-\'æ–)ÉiqI'{*ryO(íI *uóG´nžæÈ$lœéÒú4E³–Ê@½lü\6“íøw}R!¦§F6‰Ê&ªÊêkT\êaXj­Jvý¤\×ÿõ®:ªŒ©Í@C«3ӄ¿à|÷ÉN…¨PEmÏo–¢üVs:KV)ÖFe,áä/c'ê©BÁïIÏáŒÐSw¬ªÿ²„ÛChܱ]úª-?æ6?ÁåVSÌj¬FCêwl?½z›ùŒWŒ7sъ;,*ñãeêËfœÿévëâ”þK/­Äk<4°›ãaëþ?•œ€&*kŽÌ[Åsr™¯•ãa÷¼žúD§i»Ý°¼ÂUžuB_:ûôõrçô_?éîÙ¬‰Í®|JêçKÔ«»dÓî×vòomh4éQœˆB{õ¾Víë;ÑHÙ[ÒXñ÷‚ýxx•íǃ'ûƒ¶¾]²ÆÜlÐ zeG`ÝӋ~ۗ\Çםà"ùsNýøz$"#}zJ–ñpÌЦAŸRƒå`>é鬠IÚü¯‰ºM·¥ÑÏ.MàÏh™f¦žš1õã†Â‰7—Þ’|·Ž,ñ”¡™MÍ/æh«¨û M§ãüôkÉ,Ê?j’pŒ}Çß×QðwPœ%×o1ƒíhù¾$ÊuýNÀ\7ÔêÇÛ©ac‰TBßæ;òëó9N Wâ8-–UdANÓÅS PÎg˜ûÚ.büM9Æ`‘ÉJÄh³Î“kßdžšC·üOºvÆðÀÛõӅ/¯.êKí–pkötNt}7º}SŠzÍ:¸,_Þ¶·¶…¤Š&W&¯fÐÖ¬L}]%í‡õY¥w„h¼ðÁAA¯4ÄD[p£?,Ñl˜þngJÔû)kfDAsvÀÁf¬Îtl¡µ#áÐìï}€V“1€WMz4à­d‘BŸiŒ|·ænôG“L¹Œ‰¹½=ïß4ÑHÿYÒ G鐏 ¯Iï¤Y |¼uš‰j*ù‘^ÔñC?¸h’încH´çõ2CÒÒJº;‰j6ýצ~ÿ¼ŽÐbó¶Ì¦fÐ0:òù>g;¡¿~ؔÕ²¹”M›f%Š: ­©-Y༷×,±Öø@M)êõã¡ÆY›hϗëÉ ˆ‹Q‚YŒÎQÀªƒTMÁ„ÌLoö¶tŽÂ±4‘ýŽ»„GálðˆÙjIîázñ‰‹/.³ûÄ~ND'8œTÅr.1,’ˆo–}h”5.Jönôœ¦×A˜ Ÿ"ÞËg`ž5ê÷¦Ô÷s•±”íYŽ_Á>è©gfQã`wmô`r:Sjù“9ùBÓægÂ×s¶…ëð‘_·xÀµ¹ŒÍ: ˆ-K`5/¥šD£2³a ¤“åîJl¼èUì½\×·›'ã$œ9wåš}ÎYÓÇ:”M{zNK47‚W¢qSóš.²™´Ç—ôÚª-${ìd¾eEXӎÑޜü;Ï6Éõ¶µK4~:¯FÉÂØg¬»wgVoó}%>?ð³¾>鵔hÑiJ/ y/ï™V'ÏHt€¡Ôo¸²ñe¤åý(=qÿ´Í·é‰ÿž>ñÙøZûÿÖ¶0’nܹÑp/ìŠD8¹2î³áiÄD}ïÓ<ÆÉÎLt“Ää’1Fmîä<… m<û–`€óúÕ þ‘%T8-€üžêÁ§1ó~‚ ô#ôuñÜ€È%€aìD±Q’ã8ó'DÃÁEh¨ŸÁ¦Àýù—B¯PhþÒÌ àGô8¾b¸WÐÚ°kÎÍæ!@ ÐŸ ­eÑ·E–µ×¶wS“cР‘ A|1; <àö 76Ä-,4šÒ|j:UÄA̬«ޟˆp°…™Ù°²!Ý£œàï[ŒK؟Á!–gÇ:·o)4b¯â¤åÑUì;ãƒÁ–ç鳤KL -°ì©z XÑR{Íl^–¡ÅF©Ä¼–Hpb—Di†[Á‚~óuMs¢Ñ*m³qü싅?—‰-8•—åì¨Ò f5fû1ŸýŒZa{h€ž”^ÅÛºæ2õ;Æ3ÓÕAO™˜îâ9H›Q¸Žci˘QæôÒfŠQºæGÁôͦ<;ÐÅ[c õsùì¥K¥CŸRr8O|nÓÕx}pœclC^¡± “%øN¬‡aÛ(»ã^ ž:´¦/`·ö™©µáHz­Nf²’ÉÉ2=7gò˜*×(^aZëûöW±éâ °‹¡aXgw 1@Ç ~fÛ9*Ÿß 800<=Î"‚ÁÍFÑíR n5Šn¶ˆ Ö çGì<Ë{°â,#ÿÚ~ÌÓëÐ|[ÑêX§˜Dš3ŸT4(¾5C©ƒÏ7hÖ â´ÿƒñŒ—ÿ††G)é5 ¦I²ÿ2'koý3RÁ‰bŽô‰ -7÷G½%{ºðç (GÓ?±ÍC†n­ËDµYl¶©p0R¶ EÒ¨×kf÷A.¹ö.¿6§ÜbCWÓ¹ÕÛì³ZºU¦à“õœÛk'€%ä~çÃ-KØFaš¨¯ãðÛå !§Ÿ±ª3ÞÔh3¹ažz­Ü -Ngo¥Ký|k‚`ÐÃ!Ã};˜°½”\U,ÀúùX¸™Ù@‚¡=2H®œ ÷Œe{"8Û¬ ¸TEž…îMfÙo;»Ý|ÙA߬Ëf¶—‘ó-°ñSÌe}u|4~ß´\LÖ>âNSwóNõÒ}KÔÞë-hê3Ú.š#vz·ºL>ˆò޾Νªó£é¾$ ÒÚØàiÆ?j‹ù¬Ùdu4@tµaemÁqõ™ÍMš8]W<<lãíšEü±ÔÁøCìŽÉê+Jޖ.Í#ÓÐR Z“‰R¯²;™-ÿ­f;½ =}$ò¶1<¤¯w²‹ór;Ylc#ÛX¡»Eê÷ôëM/l_@ËRÏ¥ªÂˀÁ­iÀaÎlc™K•Öè• é×¼gMݏs¢Ô%g¬„Ž”ÞgéÙ&`e¸Ð¨M/ 1"Êë(’Úvš¨rDPgV;â ÎGú9Mªü‡#¹¶’n}Ëé"Á÷¦¿ŸÞ¾(gÊR?$Föûa¹È`ïë F Ï efâèýò5$¿¿ë€>ÂËKÀU•};ÌîU_ؕ™gÕÉh,!({¦ÌÔB|'ÜÆ@ HöŸÒhü.]<kêӅÍïWÒÓêØ5óÇ2ñÙ°dso¹¾/¹"gG¤½ÀíI)0Ôq¤ _e3Ô@>Ñ[@V‡ëbÃ÷7ô¯õìP§ï¦€dɵÿ՚.MFNå¡u‹åÛ -î›ßS@Z¼Öpµ‰ÆêÇêç)c1{øy×k?Lâ­×ó™E]˼ÔxÏåìgÒÓ°Û¸ 4Dá+¦a°G.òWþ‹à¯¡Vºž5‘Mwóf±ÉñÞóXBýÝ×7÷ -sHóÞj™}ïÓPU(4˜Vȟ|_†~3Ö]bÒC&êžl?·9› ð½?JØð‰R9t'p¶T~($æíäRï©VŒUøh^¢b*GÍP©Ÿ`¥ãLm¤Ù‚° -·÷((#Pnéu°ƒZòz#ÙC>œ^—=œ‚L¯å@§I/ê£]êWûêüí®&¶ÑÂNdIãUwÓ} ²ppßTƒ™R<”Üãj9=¶°1~´.PBǾþì=½Œ™Þü¬4ðw44€.0è&v?U³€_ .À¸…Ñ7ßÜðÁ°bŒ¢¯KŒK«D¦‘ð>‘>9L/j§%2èÁæѱ–Jô—ÙT|ù™…DÀ±JÞ¢_I˜ÿâ­Faœ §ÏØp€\ÖiãÁö|÷ïCÌEÊC“qšÌhÉ/}ü¦+9WJÿãF¡„sëÊÆõåòñC/Ôe— -IèÙ&s‚¡ƒà‘?}¼µh\0àQoñ’¶Îlñàûß -ÓÜÁ? ¯6»MÑ!!vßÎrrC^` 3¬?óÁˆ!7­ÐÓÉW/éüàtJ['ÙLØôúÖÙ=$7Õ¨çšijZp¢­zÉUˆ4‰ç~ -\ÁΛÆ؃ÄbƒmÅ©?ʽe5¥øQ78§»£]„oà]š`Щ“M-b®ëmÔ÷AŸp¢ªWöµó÷K8=«Ÿt.ú6zGÀKy„§­Þ‰…Ê ³64@¿¡´è¤çá4$.¡Àt™&¿çjM)÷‡ö ™tk<¶Š‡£{¾)í|š90ÄÉÚóF›îLÂc+Õ È …hÐ+hœƒ¬³9MìÒfËÛÌÔ³¨mv“½ _½’ëÐýHì‹+ñÑҗüdkF TË`ÅâúJ4z oË&w·ÿÉÈ4Þ.`ƒÄìéÆ6A8cÙ௑™vžt<¿?0/[wPáóR\•ëÆ×(¶‰ôK¤Ø+òxõ“k_ü™t´Õ Ã>óʏϠm>²Æ•¼‰H®×û‘ÐØgsúfÎóIfB„ ¸¦MƒôRëñLt0’D$>wåsÚZ=Ì-jua—;t¨rd¦ZoX<šc6ãÿÌ Nß!ÿYF6uh±Ñ끕ÿçåëIÕ „xÆ.àü¼aµP;c©,€†›Øa¼­€MYz¨³vYÔmD´uքkéBhu™]6ô!õž Œ¨S&zê8‰¦1ÖL]èLfÌ»ãW Ó:/óVv¸vxÔô®ã¾Î2“ðçNg¥·eE[+E67§Ð<¨ß€YšpÔÑÆÖ1cÓ9¡¡ü¼$ü“ý;) îÕÆy  îˆÐâ2? -¥ñΜv`¿`Ý5ˆs¼2PêxÆo²ñ%`öú¥1Sfc/²1 ©PlÔvM%\IÔ­q°6KóVÀ ™éE;„2Ío³k¡¾è08¤¶ó¤{5›y[Í~Ëò©Ÿ¯™šbÚx¸æ¤K¥°– j ʎõ™x¨ß\õYûjÂi=Läï­ÀY¼Ø'>מ6O.;ñ“©£M—Š.Àýºä^LÄ2=_cxق÷R‘ôÒãÕB3ÊzùþõFæ °•Ì‡l8;¥™’Õ1ØÔ9¤i]äDzK$îÓ¦Q¦I?å«ÏváÜþu`CLN[™àl6mcóGrm#¹N¯³ksNrN@ê•÷Áä’õ/?0=Ā,(ÛÖÚp ÖÊÃ1µ ‡ î°úMcb;YžXQÇ9pnÐш%…ð඀r;¸v߀ˆ«]øOۉFÓ×@h -Vñ¿2˜ü¦ÍóuBJÚààÚ§~ßcÞTD¯¤!ÜH›Ó°µ[J&üÖ„§ÿåC֒– >³@´þ—ŠVrš¨–ò0¨»ìBJ8ycªiÁY1ÿ -Û»¿´#óô³ÀîŠÎAç§ Ä­+òþÈÛ¬~ýѦœý–ž5C»ÌÔkò$+&Ó¯o[¨Y8G6$ó*P*Yàê×^ÆÖõ/“î¶Ë†±ÀïÀºL4Ò'³÷PÇ"ÀŒ6,Lò²P̑Ð$¸Š¤û¿]²ÖX˗„|à ÚHÁpÕR?ñ™-]X§Ú]€pÖ¾uYc)éO|ô¬;4šÓœ|7:'&~¡­êÉL'&y¨{P©Èϐ»›ñ¨ôȃ‹ì‡2qÒ3ãџ5±i>²#cß 7Åwº¨YØiàÃA¨PÍzƒæÌfž¥HÀp´Ü(K¨šøo??ÍÔõU¥DyCK¦b € h±‚½Ô8e¦Ñ¼-jê÷¯fæë5°lÁÀòЫo ÷ÃÏô GùD_ØêA'¼è_•ùœ`µÐ˜© æ±»°ð×°¼~».«>þ_óÊe}þݯ牫+–®Gza{2 -ýAlT@X°È<|ù”k‰%ž5i‰zF>K¬5qKÅf‰ýœ]ð“Ó®]ìƒû =¹bs(V¹U^÷Cû(Ê>uZ"ŸÞÑ6:k¬ÃÜc[10Ðض5ŸÆúó×ÓXMñ¼ÆRÓ|kŒ¯_FµÒÉÙ]å€ÆÍiôî“뵆FâŽUGQ"?*Æà8ý”þÖ>@sì·&ŸbÖàÐӜ-¢X¶Æ»$VŸcQ7pX!§aˆÃÓñ´œÄ±~ø _a=¢]R«fæ™ ÉyN|ºnSßmÄçªÍŽ=ºƒ÷RÃJdKµ$‡® iß<~OLkwHdw†8ÖÜkD_žÿ4Å°B™–«ù[RDÎëmû…5ó½Êò(¬5 q+¢°ù -k~¸ñÌ{`õÁvÀÂé– ï}k×fÌÕç±Û{âXݽ$QÞÔ|bXš“¶ ½øËÝ©!b­®çyI¬%ûao•Àúe!êåÃaEœ&˜nÉ5(g³1(ÖFá· ‰µ^ñ6FbXᾈÓD‹ĉ\¶é³¡9$Šµ5ˆœ$±¶Œóáa…åëéVˆ¶-–”Àš±´ãþcJkÏÚˆa¥i¯îOÛ('%ˆüí%úã‘Eë{ów|{·Šb :C„7×ÓÝÍcÆ¥Ö -1ʔÓâX³MRÛ9× -¬(Ö%Ôñݦ£§;q™›Ç0g\Ö±öœã‹§àñâJ«õ -k5b< 28ܞ3}ä(˜®%¸ëZi¬«€Y€õmñ¥] ¬Îd—,ðÅ'‘yÿÊA¬6+DC´ï¶×­+ô°¦ÎB"g2v -k̘± -ä¢af¡Å“ë5˜*ñ…âÜñ¿!Ê]w\ïÞ7m¤›Ï¬E«Æ™¬þÐXƒ5»`®»HfEa5Ëe„•ÒÓ("ƒô÷³C-P®>Rø°œçÆÜN$ž^ô×l³ê6í© #Ï\ê…#àˆÊ¯ÄÓî‘ W3ÔÓ+ý !Êq—=…ÛóJÞ÷bDù3æF/ˆ©“¥š¶(ñtº#ßWÎ_i¢ÍLd÷¯¤ÿ¹g°m„ÂçžøSçéCc0ßÑS§!jÌóŸ& íiÏÇ£Ô BAè<¯5awñ{š²™?qÍ8kX’»Ó;%Š( Îmý„â) ¸oždŽµh ÿú‡þÀŒ‡cŒ|‹;ΆT¶óuÓ½l·‘îeÂvð‘M%íÓT*é(Ypûnô¶†ÃqQ1Ô:—2£Š$ô )ôÅ BGÅ¿5ŽHç÷Ȑ•‹0kÎê¿‘‰ ì%mæä¯?x²÷¨u"6êLv_Oƒˆ¬žh -íıº»i¬ÚìÌ!À -Ðpˆ‘)$h½ÀKaÉ`ÍÙ|=m¦×ë8¬È6`±ºxXýyh„¬¹5ÂZ#ŽÕ]‡ÙÆb`5’vI¬È6ÀêÕAÛà[«»ûE™¸8b‘7NI¬È6Ä -mƒ‡Ά‡x.Õÿ^ëHc…Š†$…a<(C©éÖ®–V´ÒøÑ'šÝƒòï!aC¿RÒý]V÷žéƒzÊ ÊZ+{ù^$Þ&Î^€InøJqΤÙQr†!.·÷㤵IZÙ¾˜µ¡•@sHÚ=ÏYfÙBŸ˜ï.ú¡ßÁBU½ÇeÄ_ô¼½¡à’¶9í˜Ù7ئ#JCó0‹ÞâyçÒ«h ×üêßèÆL›¦}lÌ/¥ÉLÿ”£ÕAzÎØ £™7úkeGˆRéÞA0À‡) qÒ'?óôdhð_À™1¢ ?,ö‰1Y3Vꚤ$æ@ÄÜá/*þ¡gˆloÑ~h¸òì$Ù>q#Gd ]QZÃᙸôð)³Gà%¥X‹]é{×Ô$C–é%Í!«çè’c{qžÏu÷òüÅ1ÍÐÒüE,HmWõåIt@}%nU½ƒB„陵Q¦_ -ÙwWR¨kÝó0°óà!šV$'’Ã`°ƒæI!“ñ¦äöìZϒ#¢GD=ú‡&ŸXx’/óÝnO\Ž‹oOÊ´™\Œ,•ULŽZ|~¼ÉÙtò“£þ™ØõT(B”̹ Tn%Î'n^zj^âóƌé3iNþeŸ0ÃӏÓ:Õ9H%Lw`å¾’A;!ÕÓKv³‹Ñ AA~èkzݸÙyôâït;s¬ñ6û¦Èßìfœ¢/ÊõÔjU9Sd›¢Œ)xíÈ¥i ý>FR%‡²#ÒAÒð GeStÅZŠä䨴%_ˆë5p q„ÐR дvOIxÊâž[y¿o©Š¾€Wí$â76žÛÜ%¾¢À·#ÃÐ:q—_͎?Î5Ûk¾iôg³Te5íëuؗnò±q†ÏZ±&)ï6jÉRçb ‹Ìé)çU¡%ïKüsñÎ}kFL°;ÅÐû’ð@TéÆÆÙ=XÓðBlJÜlÔLéÍ}§(À9­tuÞ! -a'“D.qøI¨¹@ü“Oá\BhMWäð3Ô:ÔŸRà;ãFyÖØî“v?têwF7ðyå>6x4JÍ (ãނÐX/­ü¾Qá¥Ðäw¡: 7ù¨®œÉ(€")Td¾i8âvÈò”yášÍC€l*†C'Àȟ…šýc•%£›L×fg§ñpx6šÀ2»ûøãETF -%©9Ó;ÕD²/‡ÀŽ“nÀ´ñ˜Ò |T¡ÞéP`EA½è4–nhm€Ây“~/'Ý(éF'Y܃Ðn’n -th»–0®o~†¸N¨æ4E@jĉ<*:¤F’(Ç!iû#ƒ}g‰0¼tå Y4‹\L‰Ž@ÂœâÂ÷rPG³e Qd持ïÔ,†ªŒ®xV d«ÔØ:-NⲧçÝ1aMYâr¾N%¡ÛR›P!&q8)ëîånj6Z9~”´°Q$©øKBœž, G³*((¬Ù-ÈW¤6§‰ÍL‘܏Ú}NnîpÄÄpç,Âóq¬-«°yloÊ(촟¡ýKçApªºêó@“ÕþÅG)Ï-„v§ö¯+©õ<åXk+Ï9Ö ÇO#ªø¢òprŽ´g—m§ ˆ”<åG1aCjm·Ÿ2‡cЈ²»…çcÐx£‘!‘h˜#ù:³~…Ô,.µCRÒ&+¢&ڞ)¶ĝJ°HŒA»yŸK mry÷ƒœäåÍ+¿šü(®¬É´¥Fÿ ÃâFaGÖç-±'5&Œ-ø¾Nå}&fÆ9“®MpL ’1Tù¡%͸®Ü1…§ÆA™&’'$A²ó#ô`ß´Éø>›EÊ®`<©ÍƂ È6¢TËÐ<§œÏ"[Ë÷‚-=T·gh]×ò½àWLV·a©åÕ*瓯å{ÁK)瓯åã+P”óÉ×ò½à¥‹”óÉ×ò½ðKï/瓯壏µÇËùäkùC?£œO¾–žÍmå|üh™<ÖÀ†ð”>é:°ƒŠ1©qƒa)åŠWvòš;–FîN¼ýJócç#âÃMùë2‘¯4ß!u©˜ú¶«2ŸëT6žQ&W(›ò')”¦”å%1ëŠE|ªgxåèz€ðCùÂUjLX~šÌ°”]2cÚ tè[ë÷n;xG×ÃG0üêY>¿„6¸²=UòroL/ì%§¢ÃºÉ{#3&”dñ®’óÞ¼°7Ž©ÖmÞ¡Å÷GÎBï ,‹zÄ{ƒqÚ¦ø°÷Æõ4¾ŠYz¡2Î~¬yRey/,Î{vežÄÚ<»2OÁZ“Š åZ»gþÃ#O!]uê%EªÔ:U¤^hÎgH@󺊠—¨j€'\6Ÿ¡c (WyÈw‹ ¾‰­8QŸ ôð -½UdÞ+J7É ŽE3ïU¥X-=jîÇÌwJž†týØ}è²[Ö×¹0(Ýñ¢>Úpî 2M2ÚpP]à*£ª§Ä²%nf·Ö“®:F€”îÂQcâ"@7îGñc­õ”ýؒ<qŸJÅA›Üt1¤E೤L€^%,Áïn6»q4ü:¨OÉû™ÕÒ°ýÔ"ÙöS‹dÛO*’ý><¡H–ÔڞS$ =§Hz¼HByJ‘,,£S¾èZ˜;(YF6ŠÌU°ªò—øé…ÒpaM_¦­\-þ‰a´Ð ­›ï/’Å~žs¼mÞK•¢uåÊî–„ë ¿Oa?/]ì÷¶r´&RXÇ2XsD¯u -k—E$VÍ·Î۔¢°U¶ØO›-èK ÷­ áGŸ˜¢ÀËLÕ{UÝ\A,õª¶Ѩy¼ Wømãp֜ŠÊùӘM ~n5 -ÎX9Ÿ³r~ïµrû¡ßóó…~Ø»Š‹^¨ž^{I?•¸ƒEº§W\ô.jéŒ.éâ"Å5×ñ3QïàcíõøcºüŸÕ^OlùÔºí> ÚGŠ31ñWZ¹Û -/wP¦·›°­ž -·Ý õ$gø¢Ü O©ÑŠš¾ˆÝwwU¬ª+j ¯Ð~â†}C,ÊîoU¤Âý¤Ò]ù8£ði…}bÖÇ­>…}bV‚¸Ûî¡Â>±ª>IúþÂ>1/"í ~faŸXUÚ7Ï-ìc6¶ö¼Â>iw÷S ûÄÒS0 ý¬Â>ÅLÈçö‰Åy$¢¸öñוªê“ ¬Ü[Ø'Å}vaŸLÅÊ3 ûÔÞÑõ`a–ïÏVõá&î“ -ûÄ'ÊõÔÂ>±1á¡ï'ö‰Uõ 2ºžQØ'¶†ì¾y^aŸ(&XüÄÂ>±ª>±Š• ûî&Úm…}JD{RaŸXUß­DSQØ'VÕ÷"Qéõ@aŸ˜Nú"¬ú~¼°OLö`‡ô³ -ûĂ-”íùÔÂ>>½¢‰{gaŸØZKVî.ìÃW‰‰Ìȝ7wöI؞’¹³°#«c¾H”Ý[Ø'6¥ìæ$)}ëA‘Êž®Ê‡ŒiE½C®PÄ_و¸uõ•¢Ü¨Ïè⧤r<©‹_T¤…Ÿ¨Ê¡ŽTŠ=€1V¥œÒÍòKõÕñd¹RÏ^³ºåû‘>~ÅüåZî)õêÓuÊ–š­jLŒªVØȐÊ{ƒ°‘4™\¯•ƒo2…&Óub“Ðg&a{ -úÿÝY<ǹ™%ólTêë*›ÿ1œ&¿7ÿ£¼JýÿTÖô=ãŠð‡šÿazšLÿ?õ¥RÍÿnuBÞÙüOÜ )ìÿwc½Ôu󿗫 ÏÅúÿݑAŽ ¬=Sã!™”+S<÷¼}é9w’£µ Ö®&*Éçwp —Š5}bŽ·fwŸKPI2Óø*F±mŸtfˆêò8Ô±O!N]’¤ŽOCKöãÅOLÆksòN>žµvSÀzõUחɥă¡ºå}é·¤Z!‹à9©Vèn‚Ç9 Ð\M–•šBÌ'DRž*+Æ*ÝrJ'ŽA@wmÅ+(ÀÎå+íqhҗ$ªi^/¬öý›¯ª}ÿæÊÑ(õhsUý‘Eô>‘$rͬJ°a‡™$5ë[DMkƒ›rÁ) Å]§l·¨ë|å㞪œ…©«|”; cšOmîØ|^sǦ „â^)ÐÚݤÜK˜Q¨Ý#:E>}ô@O¸Æ€t_‡o¾}Éd#ݖ 6ŠH Å#Áb “]ïGðH Å=Îû;úþ‰f¦à­ÿî܏¨'öúVêû§RU´ï£ªK¶þ»±ôG¢ïß­&î}ÿDŽ5~ë¿Gæuå³¹­YŸšrß?ƒX¶Ú÷®¾ª¯oÏ}®/ƒ,´>…›7ÔWû’ZQӒeèÛª}Iímýåŝ)æsuŠ…˜Lé=gÜ H•óK!£ z¬ÚA¡NÏÇ«}Û²wÛÅÑéyKõýU֎ª.‚<ÍFXKuµËȚò'š¨L,ÏÌ^f?ÞXHÕA±*écM¼–J®Zn"íí£9Mµ ý¨ÈIZ÷Û@[©Øž* -©:ÈÄ’í9<ÊÛùW¶§Ä!4Úe2&5F¡û K¶–êVqBn…hÀ×ϸ~ÊÍ°›àùQÜ;ênSvéT>N(¼©L{äV­k¢=­æäąr%£Qj5›”ݧâ}QÙ@°3Tß(U2…úô=­&“ì-#ªën¹mõT¶¢éE(ŸŽGçÖFуÅ@–6à?qej/Âê3´»ÊWvùô¢ÑŸx5rÇùvä°"†æ·¦Ó:ƒñʼ°V/Y™w¼ŒìÒõ€Mعvâ³p­éDº²Õj=¹*Ä?R`ß -ïuI¬z²8œJaIÖÈ4'ÿ{²ŽM—_#wÒýÌ¥*óüùèáuÃÎUP™gÂê_Øîq‘#NI¬D6@¼K`õê^?7΁V€NW¦üQ›=¹¥±æ¬£–$VÃÜèûÁ]’@»Ö²AëñԌjÄ°4T!b¼okð–v`ð£Oôb˜R½ÙFÍ{ƒËfË6¯zu‡A¦SUéù¡¹>8a‰ÎwB ŽbIÆ͕&{9JŸYìɧ";“6ØE"J_駴]HCc,+z)e#Étåã©Ã¢mÝÔKmÂçu¬Œw€ÅËÊß!¤V N œÀ/"iTû¾ÒŠ`°„KyRݒ¸¥Tg–4Àn+“Ê}ÜA¬Š«n̓΂3TL„W[trù}£¾P!]ŽÖÓÔ KúŠž[÷MH:–Îu.߹ܓj„ö K##Ï®ZÏm×z~ÄÆ'Zæ»%Ÿb£6žyN˜¨kÓ=ÁŸ–yÆ%”°‘ÙÆ/R›©+ITë¥]ª’%‰ -Wª«GT_·¦dÕddsÀÔùÓø©(äuphâ<ÈÏZµ°gŸhIO\Z5‹¡¢J¬­`rë:çƋº½d.þgœ9/Tá¿:ÌÊ¿öÕú$%””êÚÅ:; ÒIœª -Ú°€ä,'¯ÒÝPÐæ¿Ž“—G*½& -W1pî5JtJ×ÙI_Å BUç)PW^Ò[ë±5D%EïP][ªØõçj %³†Vþ£b©jŽ8^éA“,¡}aû­ÝífƗ#šb5ÑMD{Öý(šdô.¢ÉTÆ]U1óƒÅw–$ªUñú›;JùÛSºñEäúJùƒ®G|ô“¾±$Qm="sHÚHR0nk4([»¡$QBì]Õ#Šì7”$*5RÙ7•$JôªQ @ÝZ’¨Ê<†WùSº©rI¡Qڒ®6ÅçuW³B\ -ü76+Äͨ«ÚÆç5+Tr?<©Y!w(ˏš -eÚS³BÚ¥zoc@µÍ -Y·Ýo³BÄipXÿ½Í -ñÌûÿÆf…âî8¬¹hÛQ¤WSÃQºÕ -ïvȦÁ=ÚðaUñn‡·fÛI6<¼çV«;JNî·Zq ʁRßðP¾ðå ·Z¡†‡O¸ÕJMÃCuõž7<ä$æôcè»Fe»b†Çc o,(»·á¡-øݯ`îmx(?¹Ùþž74<”ïv(ãë¼­á¡ü”(Uý “aŸÓðP¾)-Óox(¿YU]XukÃCù“O¨§ÝÝð—þtÕíPÔ¾¹§á¡|^–výXÃC¥$Ïhx(ßí=omxxcŸÂ{ò¡»^;ˆïlx(®F£yNÃCùx -Óox([Cåª?«ZMºÛ!n<ÔðP>΃tg4<”Oñ–ôÜÞÚðPª E›{ÊCy‘ìSøxÉÖíð±R’¦¤….ˆ6«KíUÑðP>‡ö…½_€Ý÷5<”¿y„3<lxÈ~‰Vl¿àEKêK ®ªiÏhx(ßíðqUnxø„rl5 ՘¸OhxÈ@·¸¯Žµ[*¶(”6w4<”+ôø>жçã E™Œívø˜Lk«U~ð¸çC å•,û᱆‡ÁÅJƒoõJ6<¼½÷®†‡¢PXQ,_±rCÃÃû3ºDÞ[ªÿBWH>Ü𐷯ºRhžÐ𐩪ïvHË´ÇÊ'QQÊíÊ[÷ ўVx%Þíð_'Ÿh†‡÷۞75<”’‡T·Ãg¥(¦ä»¾®Ö¿»á¡|·CZåx¼á¡|‘®ø!}GÃCùn‡Jzšú"]Ùn‡¸ò¡†‡÷h6w4<”\M⇾å )4jÞ¾-z ôi ƒüÆùKXBÑCÀ}v-ßՎÈdþDæÏ$²¥ ¯ÙÝo™ÈÕ6¢\xåÍbIT×ó¢^qˆFá·E4O? ¢Eœ×Dk¹m[ËHô¬Mџh«Ä`ÐYÃOי¹:bT1֎ÇcÆq<}ïBÇ ¹m4ÇËÐo<|z¨'|žaµ©Áö;ËWóïE¼Õï-5fý[çãÕZ'ß>ê¹¢þgõ¦ÕïFÝzúVpôÕÉ_'63E‰š‹uï~¡eA%p&‘m4ވ×ù |ý±'ôÚ ’×Ó ¸–5¶d׍5Ȥ;,“z!bA¢åjA7 Èå@ŒÂÓñøn³pÓ½š«ÛÔ±„]†8‘M–’Dv1-¹êûæ¤x'°˜VC#Œ2–ˆÿý‹pd‡šªB²FdZ¾!êH8ªs«@ ão#^+ÑqÃyi±Éq§§ Põ¿z)üîÖ؆,Núߪæ5íÏÂO¥¦MRµÀ–µ»Ì¾W֘:0×ñÁO³vö%¹Ó…è+iN‘!€&õ;vpjÃx¨¬9¢Êfœ?øTߓÖå2 ->µÈü'+­ýÜõ؜ Âhw ?¡„4ҟþæfð‹¼‰jhº0,Ô¾É[èo‚FüÓFÿYvÓ0€<8g¦«C€px -Db³+Ÿ¥v»Oä'…Nvhú*‘Vb;bÆY2[ÒÖ·K֘/HkêmаϬø³&9cØñ˃0ZÆãiŸ¤ “ šÀ¢éLÄÌh ¢ïÐÚäâöý™ÃÌûY÷eكïÊJwräªt[\¯Á7Î;Õö•œ ÞÆÌkÔÊʴɞ„¤ªÙX^z"Æuš½EN½)'ü“@ iä4_EÒp§½/’^¹nÖâ¨ÔW.ð´aEO&op†­a§Ð¦W?á\×ß2րi­W\ì±å§ÈȺV}Y¹Üppð ў’À†H:t§°¥:z£M÷{Âןi] é4õêzi»_NvEF®×px„xÉiºÌVÌÔÛ¿8Óùˆ~g§¨”îHÄ Îô´êAŸà!^7ôח¯:ǜÓxHr.áú¶=Œa/Aöì¨Ù–s¸Ê?úíðòI™:?ÌpzN4€†Ñ(4ûcŸ¹-™V'g3Áf3jkRpŸ‡\±Æù3¹¶/͉é¢œ.4uΌ$˜>¤)ÖM¢Çõ4Îg’t½] -sk߁&âÒ;›nJèC_úSzü˾ç¢ßkm‚á4‰jªÑϦ×Úiâ³ñmÈLlñ6ÐÊatƒ?½GÎ{/%€”e*Ó{µuàYӝÅQï[ê’îe睴nvɤúE]>sü -=ëIl—9ö[¥làµ9OLk£r¦<´À±ž,Ãý2w¬CQ`àR=Å =h°”Xk‹H`Xh†¢ÐÜYUŸàS»†ßàO҈KàŸÈüé3#\”µVwÓ2h<02nCòP~ö€&Ö:Rû|þá SJ§_¢–ébÿ¦wó“&­†˜:S2áb2p¶Àï,øwe ”L%JˆCIêHÃ;HÒ¬“¤¯Õ:¹Ön³¤íµðƒ ›wZKJÍʕµvgÚöeA‚._²…Ì|ÇwH¦" Äé灧žI .î;AáÏ{Ëìæy§n² Åªí6ú>qltí~Ù Hë~³ÄœNiYù ´Õ¤¡Eºõ+ù…þÔå­NãrSv%Â.'1Ÿ¸½â%¬H!¸ò#qÄ¿HÿŒ8þ®‹˜œ˜k=ÎBß½¹ßÓ5bö¶Mƒ—\A±:ã `¾­v>ŒŸhshÎ0*â©É»ƒƒÒØtà;ÿ…ꈮï9‹˜f‡n†È„«¤@9OµkŒ¼>ëIî:u§âÀîïNöÜgÍ[à';û}÷ ø°‡µXæl‘íç?…œö±yÓêÛÇ9 ù½ÄZó8§µ¶sZww“ ¾09rœ&Ã(=¹‰ü¨¦¦4§­.­Hwˆí[šhbЅ1¹M -¢cMc~|lEº?'_1DSÏZÝÕüýÂëˆín/Nä¨Û Ð;¨~"흃àtèžN§´Q§o†ÆÐúáÝ7™H ø!-GŒÉüðÈ ¨şYk²:=,:'Û³¢Ø“=—&‡ ®CßµÙ' þçT§åý©×!C‚vB)]XÒÎ<Ñ¿Ìnu8ëh¬‡}Yc­tª”vˆü”ŒÙہF©GàªeM  tZÈtÁ56¿­®±¶úYþŌ\ÇyÝþe=ÂÆö-Ø©àò$Pa Jë„F!éدœÅwÒô iڒæ|ÃÐ;Ó'ì´;ƒöFØ(3jž0F~KÔk*úk.›¨¥¾g ŠäÇhd’ŽYêtÌ8ë‘úSÀKŽO:)¿“Ž(v?á *6ÒÚÜPWë[{X–·†»’qF·-—«é9 ×€Áî°..E8Cè¶Kv-ܕsÞÙX¿µEèe=ŒÁåÖÐ̆3î½÷M=uçkÚwÒèO'4^Ïx ß@Ç r°3¼ÑtEüš$ëÃûd¬pL.ÎCÀEÎðr32™øn³$䐫ǜœ¥[¸’~—?8ëź,[´ùž[²`!?ÎK°ðHŸIVàPmäd¿Œ°)Iðº”ÎIˆpŽv9g²çÊsXCÉÏV…qw žòÝ LùJØ[|F]‰cæl孀~]Žßɦý>$r‰Pi ï:_Ìñk-ç`’±97]ú0Qã̼3)#Â!ô7Ã"çáƒþJ’rÚbå(òêSSâÿÌ÷gÈGÙÀ´Öi²âd>+‚}…Û“Ì•Ë —Þ•/òÇ;Dx›ÑÀsZ5Ðñ„ýåƒàOÿôõ†Á*ÙQ"C÷Jnd‡zgÚ6³ãǚÇՅõŽßê6Șĕ-iYœ™¶±ßèJ˜ .èV2ºbÍr™NNÊå(ÿg&ä ÞÝpŠ a”ngVÚâÿÀ›€(–=»ÈYæz›nlÎQ»VqüæR@ä§Y(QÔ³ö@ÿ”äôÍì…À¿Q™"99¼Â‚ˆ(« ¢ø·µfèD¿žr:ê½Ît\w%ÁäéœÝ ‚€‡ªG«b÷M4²ÇJŠà]¢ą€š ‚ÁmÄ_à•Á…Ý{FÎ} –Ûaá3¨-8ʇfxúUMWák:̼—zÀx,#]÷ÿ„ðþ'„÷?!¼ÿ áýÿ0„%“‡§f: §32²Ê–þYunf×Æ©£˜ =Ü·ïqÅڙ1"”ZvZ¯‡¾tpî[iŒ$©uЁ%OÄÊE(·¬•’ž”¦KuØX˜‰ÎÝódâùÛ@°áJ“Š Û3 휜ßͨÆL1Ѹ}G+\ÑÑâK·}Š`ÂjU’J3PÄÍEÌ$Ð„~·àaµʞw:H—Ûá øþñµò©Ñ*1t=-÷‰§ÏÀ¸™É©:ýº/àòüCÿ8>/ëù±zü]þnÿY_þœAŽD$›ÛÙ.{œÏóÿ}N聯Í|{þüçHÔS…‚ß“žOw³ù?ªq‚gäc¢ž ­µ»¤l%ĈÉô"[åuŸ‘qzAt£ehæÔÌa_˜óͺ/Õ™­kŒù“þÙ¥¬LJ ¤êQ» ;f]z~L^2–J¹-؃(L5r€&ÓNÎ?ãŽÓ2ìÈ'z¥t/ÛªÇgbÇD¬0ƒE!ïG2éÎæ5íwh¬¦xœ20-5í;œá;|ÓØ®4\ó*ò~$5jmž¥4Hj pK¨QÆç³a|&î>‡hĂ=¿¦"̃´^¹g@oƘg£-ÌÁ.{[£ †é ê\ʊ@4膚í@N›@ø¶PÁëþéú“Ûe,ð!Êße‘p03–wz#ý~”²é,û)uÖñQu@hE9¸àÏ&‚k¦ÈññåbU 4t()`°ƒsº[æ4œÏÀïA¢¥㰞5yÿ°¼IÜ¢e¥"#™,Ür€É›¤AŠÁ5’e@2Ï 7ÌéÂ,¢¹v4ç¯i=Ô1ÚÄØÍÎ~Œ3Ù¤Šò ¬€®¾-ø³é ¹Ò!€]T0O@£«ÉÀ œ`½&cT•Hÿ1s#ôú®>HÊäv˜#rõE0ŸÏM8£<˜¹°kgC© -•Ã=›ÕƋ³ói‘úñf«Éµ_çDŽ#% ¥L§‰0ÿPE‚œËåܱãûfJ³Ìy@92nŸÆ$óiÆ©eSú(;ÿ¹¯†ã9·²fS4äkÙ´•ì¨ò@ç@ãÒO>¢˜³@M«ï¥Õ¢¡SÈ䥌ËAi¿: Ìý,dx t4ÖÖ $d»£1½÷Œ´½? €ÍÁkhL¿ë¨Æ¶­}CÁk©B/Z¤K‰=°yF´ñ^Ø;d€ü¤ß ÐëÂÔ7¤—ª*Ã3«‡(g$íz‚¢ê0˜èìîìÈOå4Ä5}´ôHt¦ìVÔhÌÙ¿„ ŽßÎÙN©‚¿Ö ™æ@¦eŠb• À.z/ X%±ÐiHŒœ¥eZŸÞ -)«-쑀¥t˜þi²¢r|¬«n–V͘ ¬1.Á‡ªàñSú3™kᙵ¬B-ÅJ+-K7$Ú»Nôy3‰FÀ£$)&¿sM'Z 6­›»x‡5噃þmÍÈ™ÀyJ¹ -¹“±ÖkfàaSb¨tÌ#G¹„mxFËÔ_dÅh4g#Þ9}\¥Ä¸Í9»;Ÿ`2D";³ ã€Jà±U¸Ô§1Ðuñ²w¼:Í[ò5ÍÀ˜ê¯2€’ ™íäHäw` 1ZŽGººã7ÚÌ ²[±;ó]ëÀ|×=Bw”…³nãq¤ç<þ‚èœZ§?gpJtºÝHÅo›ÇLâ içFaâ ºÇáþÄ“XŠ™(æŒ0t ÕdÈdzÐÕÞâ.Œ(Ÿ‰¦ƒÛÁÑg…¹¾P)”Øm,¸Ú2t0¿ñé`{0‹*r~4x ~œÌ¢‚†£‰!$Ê{c(dNIRی º -uLyƒÔZÔ‚Î×»†4Z›HÊn㶓çzãDP¹âŠÈnOkàl~„µ¡CÑ"ÀM-1 ãÑv{bÚ ~a²âE'¢’š0u–DNÚ\>ia»KÑùzìÕ\ò`¢_…íÐØWaèèꆮÇ8 ¨-ÆÇ8­ì¶s¤9MÆ N<Ìi†ãcœFlMRœ¦FÙbUäš…€Ó>û#+‚ò¸Å@NS #WÖ*ï[q/tÔU BñA ìâԄƒ ¢ÚŠ+TOŽ/7Ü[¨ðÊS“:oä&’·eoÛ#Wƒð–QÌä‘=’}:qŒ:HüÎ»Ïöfƒ1¼=v$L– {HˎCf{Ršµƒ`¤€pÓWŸí!¶˜Ú"vŽš¸èT3 ãN¢›]r"¢s+Äð?óÕ8þg­™ c˜9Çm‚Y¿M3u§c–a'}çÊ©~‘J ¤|ž8㧂.8@~´Éˆê0 m2`ÌÎʖó§±Q–0¬×v:œ€üüÀ@ M¹w»œI~±¸4m¡­`¦(‡6€=+eœ';_GI`~–u°&>gƒyô ?¬ÏUXdÆ…•6Sö €Ûš}jÉ>#±@?€^Úw<ð -„í„-žÁ£®@²QWh€› Ê4 ’¨Ð,p¼“´qû„Öpà`ÇAâÖhs0~¶\¬•¦¼ ¹¯æ Ã¡±퇮Ñp!¸.̑™ߨ¨›Éæ†<ÚÀhã4Åâ!¡4Êý€EÓ®.,`NS>¾9:÷†_Xu ²VŽp Ïùãužë÷üËDýòú›éÍ> /5häì_qÚÕѸX_§›ïëLÇ|,Ë´mt´–‚"©í`6̧šô¡Û&ÇUÅ#`Ü¢íb?¹)™ÐÆ þìQfŠˆNÑê÷ÌÏ{û ã9çÈ9`ƒ‹=þ ½ze¼˜f6=/ë ¾-ŒÍý#Œ9÷± šKoªBºöÁ?ݶ‘â´>‰þ€Ÿœø«•¥~牪ײ£V7•¶øMÙl¦Òbbç‡˜O‚^È¥vÖýÑ£÷>µÞÄ;]‰H¦ÝàM¼Ó•øò·yït%âÙ j¼‰wº©luÞÄ …¤ðf¶3<Ø ¾~_Õçç˽â&çËßmyü_spܐÿ¨ÿàð¿N ¨Âÿÿ<ðËòäå?Œ…énkúW†wZ ‰ã9ý;=ÿî¶ããý ¢ï:•r³þüG¿úgƒ!†à]ð½ X‡pˆÃ—ÿ þ%à?ÿ¤C´p´ ñÏ#µ0b ßGŽ7óÂv6ÿßôõóîø_ìÎøÛÄöü;^ÿŽO¿Û%ú•';jÂ`ÿÿ*‚Oà»ÿüGÿ*ÿ¾úÄ¿Ù xø ‚ÿÎ^þÃûÏhú×iC‚%öðë*õŒ¡ù¯3~ùwÀõÏæñþSËæòSŸËÔg— ~‚opŸ˜ç …¤€ö„Ýïvy\î„Ýë÷x½n -¿púÜ0#»Ëéqƒ…³œ¤Ç@#ry|ÿln¿ŽÈíñRŸËôg§Ûî÷‘$ü½Gºüv/IøÙ/è—%‡‡­{òw9<þ.ÎÃén}Ù(ð=!0V?é÷»=hA°)PcwÁ1yI»¼'àôÁA»H»×G º¡/èA¢·ñÏì/UΠ¾¯×·ÏáŽE!0‹‚­ ³$ž³ýíqÛ=./É~áòD^üq:v'÷ç +Vž/ÎÏñùGÍ4ËIZxY‚D‡ ž¹oãå¼qÿ®¡,YžÆÿkþo¼ÝîÎãó|ý[ç'°gçÿN?»ÿ„ßÀ±?’© -LÅÿŒÈŸÈ -endstream endobj 7 0 obj [6 0 R] endobj 24 0 obj <> endobj xref -0 25 -0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000044463 00000 n -0000000000 00000 f -0000046571 00000 n -0000046388 00000 n -0000168557 00000 n -0000044514 00000 n -0000044880 00000 n -0000055560 00000 n -0000055447 00000 n -0000045262 00000 n -0000045826 00000 n -0000045874 00000 n -0000046455 00000 n -0000046486 00000 n -0000046828 00000 n -0000047096 00000 n -0000055634 00000 n -0000055830 00000 n -0000056898 00000 n -0000062550 00000 n -0000128139 00000 n -0000168580 00000 n -trailer -<]>> -startxref -168773 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png deleted file mode 100644 index bc25641a..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg b/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg deleted file mode 100644 index aa301583..00000000 --- a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png deleted file mode 100644 index a5a40d10..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png deleted file mode 100644 index 955beb71..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png deleted file mode 100644 index e2e6a010..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png deleted file mode 100644 index dcd898c8..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai deleted file mode 100644 index 321e40ee..00000000 --- a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai +++ /dev/null @@ -1,1350 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[6 0 R 26 0 R 45 0 R 64 0 R 83 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_blue-orange - - - - - Adobe Illustrator CS6 (Windows) - 2019-07-16T17:02:54+02:00 - 2019-07-16T18:26+02:00 - 2019-07-16T18:26+02:00 - - - - 256 - 68 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9IeUfNmk+adEh1bTXrHJ 8MsLEc4pB9qNwOhH4jfMvW6KemyGE/7R3tODPHLHiinOYjc7FXYqkWt+cdJ0nWNK0aVvU1LV5RHB boRyVN6yv4L8NB4n6aZmn0M8uOeQfRAbn9DRk1EYSEf4pJ7mG3uxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KpDeee/KNnqJ0+51OKO6U8XWjFVbwaQAopHerZg5O0tPCfBKY4vx15Oyxd j6rJj8SMCY/jkOZ+SfKwYBlNQdwR0IzOdaQ7FXYq7FXYq7FXYq+Pvy5/MDUfJmtrdw8ptPnomoWd dpI6/aWuwdf2T9HQ56n2p2bDV4+E7SH0nu/Y8hpNVLDKxy6h9a6NrGnazpdvqenTCeyuk5xSL4dC COxU7EdjnmOfBPFMwmKkHrMeQTiJR5FGZUzY55987af5P8vyapdqZZWPpWdsNjLMwJVa9gACWPh7 7Zn9m6CWqyiEdh1PcHG1WpGGHEXzn5H1/VNf/NzSNV1OYzXdzeBmPRVHE8UQdlUbAZ3naGmhh0M4 QFREXndNllk1EZS5kvq/PNHq3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXzxqf5f eb7fV5LMafPdlnPC6jQtE4J2YyfZWvfkds4DN2XqI5DHhMvPp831PT9taWWIT44x25E7jyrn8nu3 lzT7jTtBsLC4f1J7aBI5GBqOSrQgHwHQZ2+kxHHijE8wHzfXZ45c85xFCUiUxzIcR2KuxV2KuxV2 KvhPPZnhXoP5SfmfceUNT+qXrNJoF44+sx7kwudvWQe37QHUe4GaLtrsgaqHFH+9jy8/L9TsNBrT hlR+g/i30xqnmPSdO0Q6zNOr2JRZIXjIb1eYqgjp15ds8x1eYaeJOTbh+/uey0WlnqZiGPcy+7ve D/ml5jvfMPkCLUbui1110giHSOIWgKoD3pU1Pjm6/wCB9q5Z55Zy868h6Wr210MNKceOP80We83L dhX5T/8AkxtA/wCYof8AETne9s/4pk/qvG6H++j731X5n8zaT5a0afV9Uk9O2hoAq7u7n7KINqs3 +e2ebaTST1GQY4Dc/i3qs2aOOPFLk+b/ADb+evnXWriRdPuDo+nmojgtiBLxIpV5qc+W/wCzxH68 77RezunxAcY45efL5frt5zP2nlmdjwjy/Wx/T/zO/MGwm9aHzBeu23w3EzXCbf5E3qL+GZ2TsnSz FHHH4Cvupx4a3NE2JH7/AL3uH5V/nXB5muE0bW0S01lh/o80e0NxQbihJ4Sd6dD28M4/tjsA6ceJ j9WPr3j9ju9D2iMh4ZbS+96qzBQWY0UbknoBnNO1fPf5jfn9qk19Np3lKUW1jESj6lxDSzEbExcg QieBpyPXbO57L9m4CInnFyP8PQe/vLz+r7UkTw49h3vOofzI8/w3IuE8w6gZASeL3Ekib/8AFblk /DN7LsrSkV4cPkPv5uuGsyg3xS+bLrv/AJyD86z6BBaxSra6xDMDJqEcULLNDxI4vHIrqrcqGqjf 276yHs1pxlMiLxkfTZ2PvH6XLl2rlMK5S73oH5Eee/NXmmbWl12++uC0W3NuPShi4mQycv7pErXg OuaP2i7OwaYQ8KPDxXe5Pd3l2HZmqyZeLjN1TEvzQ/Nfz/onnvVdL0vVPq9hbNEIYfQtn4hoEc/E 8bMfiY9Tmz7I7G0ubTQnOFyN9Zd583E1uuywymMTsPIdzHPOX5zecNbvVTT9Rn06whCpEtqxgkkY ABpJHj4t8bb8eg8Mz9D2FgwxucRKR7968hbjajtHJM7EgeT6G07Uj5Z8hWt/5mvHeaztEk1C4lPK RpWFSn+U3JuC+OcNlxfmNSY4Y7Sl6R5fjd6GE/DxAzPIbvn/AM4fnp5y1q6lXTbltH02pEMNueMx XpV5h8XL/VoP152+h9ntPhiOMcc/Pl8B+t0Go7TyTPpPDFJNI/Nb8wtLuBPDrl1cbgtFdyNcowHa kxelf8mmZmfsbS5BRxxHuHD9zRj12aJviPx3ZH5g/P8A87XtzBNpFz+i4vQRbm2EUEyeuC3N0aWN 34sKbE7ficDTezengCMg4zexsjb4FycvauUkGJ4dvJ7V+UnmLVte8i2mq6xcfWLyR5xLOVSMcUkZ R8MaoooB4ZyHbemx4NRKEBwxAH3ebuuz8ssmIGW5YB5v/NPW9RvpYdJuHsdNQlYjF8MsgG3Nn+0K 9gtM811/bWXJIjGeGHlzPxfUuzPZ3DigDlHHk8+Q8q/Wk2mfmD5w0+cSpqc1wK1aK6Zp0YeHxkkf 7EjMPD2pqMZsTJ9+/wB7n6jsTSZRRhGPnH0/c908p6+2vaFb6k1u1s8tQ0bVoSpoWQnqp7HO20Oq 8fEJ1VvnPaWi/LZjjvir8b+byLXfzK87WuuajbQajwgguZook9GA0RJCqipjJ6DvnKantfUxyyiJ bCR6R7/c9xo+wdHPDCUobmMSfVLu971jWtSvbbybc6jDJwvI7L1kl4qaSenyrxIK9fbOp1GaUdOZ g+rhv7HidLghPVxxkegzqvK3kukfm15rg1CKXUrw3dknIy26xQIX+E8RyVAR8VN85XB25nEwZy4o 91D9T2+p9m9NLGRjjwz77ka+3uS7WPzG83anO0h1CS0irVILVjCqjfaqkMevc5j5+1tRkN8RiO4b OXpewtLhjXAJHvlv9+yY+U/zR17TL2KPU7l7/TWIWYTEvKgJ+2rn4iR4GuZGh7Zy45ATPFDz5uJ2 l7PYc0CccRDJ0rYHyI5I7zj+bWq3d3Ja6FL9UsIyVFyoHqy0/aqa8F8Kb+Phl2v7cnKRjiPDHv6n 9Tj9l+zWKERLOOKZ6dB+s/Yxix89+b7OcTR6tcyEdUnkaZD/ALGQsM1uPtLUQNicvib+93GbsfS5 BRxxHuFfc9s8i+bU8zaN9aZBFeQt6V3EteIalQy134sM7Ps3XDU4+LlIc3zztjsw6TLwg3E7g/ju fIehqr63p6OAytcwhlO4IMgqCM9w1BrHL+qfufNMX1D3vRvzn/Kl/Ld42t6PEToNy/7yJQT9VkY/ ZNBtGx+ye3Twroewu2fHj4eQ/vB/sh+vv+bse0dD4Z4o/Sfsa8uX15cflE0E8rSRWmtrHbIxqERr V3Kr7cmJzhf+CXjjEwIG8qv/AGT2/wDwO5E5Zg9In74qHmv/AMlTa/8Abdf/AKg1yf8AwMv8p8f9 6x/4Iv8AfQ/qj75pB+U//kxtA/5ih/xE56P2z/imT+q8Bof76PvZn/zkjr9xc+Z7PRFci1sLcTMn YzTE1JHsgWnzOar2W0wjhlk/ika+A/a5va+UmYj0AZH+Qn5c6O2hp5p1O2S7u7p3FikqhkijjYoX Cnbmzqd+w6Zge0famTxPBgeGI511J/Q5HZekjw+JIWTyesa/5c0TX7B7HV7SO7gcEDmByQn9qN/t I3upzmdNqsmCXFjJifxzdtlwxyCpC3yF5o0a68pecLzToZmE2mXIa1uOj0FJIZNujcSpz1HR546n BGZG0xuPsIeRz4ziyGI/hL6D8/ecp5vyWOtwfurnVrW3jPE/Ya5KrMAR7cwM4fs3QgdoeGdxCR+z l+h3+q1BOm4hzkB9rxD8p/Jtv5s84Qafd1+oQRtdXiqaFo4yq8Kjpyd1B9s6/tnXHTYDOP1E0Pe6 TQ6cZclHlzL6wsdJ0uwshY2VpDb2YHH6vGiqhBFDVQKGo61zzTJmnOXFIky73q444xFAUHgv/OQP 5faTpAtPMWkwLaRXcxt723jAWP1WUukiqNlqEblTbO09mu0p5bxTPEYiwfLudF2rpYwqcRV80X/z jB/vR5j/ANS0/XNlXtdyx/53+9Zdi85fD9LBPzr/APJn65/rwf8AUNHm67A/xOHx/wB0XB7R/v5f D7g9w/I/y1p1j+XtncGBGudVDz3bsoJdeZWNTUfZCKNvGucf7Qauc9URe0Nh+n7Xd9m4RHCDW8mJ /wDOTOuXCW+j6JGxWGYyXdwAftFKJGD7DkxzZ+yenBM8h5igP0/ocTtnIajH4pP/AM4//l9petS3 fmHVoFureykFvZ20g5RmbiHd3U7NwVloDtvXsMyvaXtOeIDFA0ZCyetNPZWkjO5y3Ae/X2kaVf2J sL2zhuLKgX6tIitGABQUUigoOlM4nHnnCXFEkS73fyxxkKIsPk381PJsPlLzhcabakmwmRbqyDGr CKQkcST14urLXwGemdj646nAJy+obH3h5TXacYshiOXMPdfyOg9f8qrWCvH1Wu05eHKVxXOJ9po8 WqmO+I+56HsefDijLuP6Xl6LeeXPMSi7tlkudOnBe3lFUbgajr2I3B+nPHQJafN6hvA8i+1Ew1WD 0yqM48xz/He9Ttde/L7z01vDqUAttTR1ZI5SEZyD/drMtOat04mh8BnTw1Ok1tCYqfn919XjMmj1 3ZwJxnixkdOnnw9D5vQ4444o1jjUJGgCoigBQoFAAB0AzfgACg8tKRJs83zP5n/5SXVv+Y24/wCT rZ5xrP76f9aX3vr3Z/8Ai+P+pH7g918xf+S8vP8AtnH/AJNDO31f+KS/qfofN9D/AI/H/hn6XhPl zShq2vWOnMxVLmZUkYdQlatT34g5xGkw+LljDvL6RrtR4GGeT+aH0fbaPpVtp406G0iWx48Tb8AU YUp8QP2iabk56FDTwjDgAHD3Pk+TVZZ5PEMjx9751826XDpXmXUbCAEQQTERKd6I3xKPoBzz/XYR izSgOQL6r2ZqDm08Jy5kb+969+VXlnT7Dy7bamYlfUb1TI07AFlQkhUQ9hx3PjnWdi6OEMInXrl1 eF9o+0J5M8sd+iG1efeUi/O3RrOOGx1WKJY7h5GgndQBzBXkpanUjid8wfaLTxAjkA3ui7L2T1Uy Z4ibiBY8lL8i5H9fWIq/AVganuDIP45H2bO8x7v0s/a+IrGf636Hz5oH/Hd07/mKh/5OLn0Tqf7u X9U/c+JYvrHvfa99ZWl9ZzWd5Cs9rcIY5oXFVZWFCCM8jx5JQkJRNEPaSiJCjyeLeafIi+TfJ93Y wS+tY3WtJc2RJq6xtauvB9uqlTv3GYXtr2j+aw45EVIEA+/1O+9iNL4OpmByMTXziw3zX/5Km1/7 br/9Qa5tf+Bl/lPj/vXD/wCCL/fQ/qj75pB+U/8A5MbQP+Yof8ROej9s/wCKZP6rwGh/vo+9kf8A zkRps1t5++tstIr61ieN+xMdY2H0cRmB7MZRLS8PWMj+tye1oEZb7w9U/ILzDZ6j5Dt9ORx9c0l3 huIv2uLyNJG9PAhqfMHOb9pNNLHqTP8AhnuPlRdp2XlEsQHWL0h3REZ3YKigszMaAAbkknNCBewd k+OvzM12217z3rGqWrc7aaYJBIOjJCiwqw9mEdc9U7J05w6aEJcwPvN/peP1mUZMspDk9q85eWb+ L8grewKH63p9ra3M8XccCHlH+wDN92cjodXE9pmX8MpSA/R83dajCRpAOoAeVfkv5rsfLfneG41C QQ2V7C9lPO32YxIyurMey841qew3zpe3tHLUaYiO8oniA7/wC6rs7OMeWzyOz6wR1dQ6EMjAFWBq CD0IOeaEU9W8N/5yR82afLaWPlm2lWW7jnF3eBCD6YVGREan7TeoTT2987H2W0UxKWYio1Q8+/7n R9r5wQIDndlQ/wCcYP8AejzH/qWn65sl7Xcsf+d/vWPYvOXw/SwT86//ACZ+uf68H/UNHm67A/xO Hx/3RcHtH+/l8PuD6K/Kn/yXWgf8wi/rOcJ2z/jeT+s9Dof7mPueW/8AOTmnzC+0PUQKwvFNbs3g yMrgH5hjT5Z0fsllHDOHWwXWdswNxKZf841eYbNtJ1Ly+8gW8jnN7Ch2LxyIkb8fHg0Yr/rZj+1e mlxxyj6a4fjz+2/sbOx8o4TDrdva85F3T5Y/PnX7LWPP0gs3EsWnW8dk8imqmRHeR6H/ACWkK/MZ 6R7OaaWLSji2MjxfcP0PLdqZRPLt0FPZPyE/8lnp/wDxluf+TzZyntH/AI5L3R+53PZf9wPj97I/ M3lDy95lDQ3igXsAAFxCQJow1SobrVT2DD5Zyes0OHUbS+odRzD0mg7Tz6TeH0HoeR/Hk8Y86+Rd Q8r3ERklW4s7gkW9wo4mq9Vdd+J+nOP7Q7NnpiLNxPIvf9ldsQ1kTQ4Zx5j9T1L8qPMN5q/lxo7x zLcWMno+sxqzx8QyFj3I3GdN2JqpZcNS3MTTxntJooYNRcBUZi68+rxrzP8A8pLq3/Mbcf8AJ1s5 DWf30/60vve/7P8A8Xx/1I/cHuvmL/yXl5/2zj/yaGdvq/8AFJf1P0Pm+h/x+P8Awz9Lx38tv+U3 0r/jI/8AyabOR7I/xmHv/QXvO3v8Tye4feH0Pnfvlj54/Mn/AJTfVf8AjIn/ACaXOA7X/wAZn7/0 B9T7B/xPH7j95e2eSP8AlENH/wCYSL/iIzsuzv8AF4f1Q+e9r/41k/rli353f8o1Zf8AMav/ACak zWe0X9zH+t+gu59kv8Yl/U/SEn/Iz/evV/8AjHD/AMSfMT2b+qfuH6XP9r/px++X6Hz9oH/Hd07/ AJiof+Ti59Fan+7l/VP3PiGL6x7327nkD2zz787f+UVtP+Y6P/kzLmh9ov7gf1x90nqPZP8AxmX/ AAs/7qLx/wA1/wDkqbX/ALbr/wDUGudT/wADL/KfH/eun/4Iv99D+qPvmkH5T/8AkxtA/wCYof8A ETno/bP+KZP6rwGh/vo+99Ifmd+X1r500H6sGWHU7UmTT7luisR8SNTfg9N/DY9s4LsntM6TLfOB +ofjqHo9bpBmhX8Q5PmKaHzj5G1whvrGkanFVRIpKh1rvxYfBIh+kZ6HGWn1mPpOB/HwLzJGTBLr GSK1380fPuu2TWWp6xLLaOKSQxpFArg9n9FI+Q9jlen7I02GXFCAEvifvJZ5dblmKlLZm35Q/k3q Woajb675htntdLtmWW3tJlKyXDqarVG3EQ67/a7bb5qO2+3YQgcWI3M7Ejp+37nN0HZ8pSE5ioj7 f2PouaKKaJ4ZVDxSKUkRhUMrChBHuM4OMiDY5vQkXs+ZPzJ/JPXNCvZr7Q7aTUNDcl1WIGSa3B3K OgqzKvZx260z0Lsrt/HmiI5CI5PPkfx3fJ5rWdnSgbgLj9zCLHX/ADhaIdJsdR1C3Tk0ZsIJp0HL oy+krDfahFM3GTTYJeuUYHzIH3uDHLkHpBl7t0VrfkfzLpGhwa5rMDWi30/pQQT1Fw/wl2kZDuo2 p8W/tlen7Qw5chx4zxcI3I5e5nk004REpbWfi9R/5xgVvW8xtT4QtmK+9Zs5z2uO2P8Azv8Aeu07 F/i+H6WB/nX/AOTP1z/Xg/6ho83XYH+Jw+P+6Lgdo/38vh9wfRX5U/8AkutA/wCYRf1nOE7Z/wAb yf1nodD/AHMfcifPvk2y83eXJ9JuCI5T+9s7ilTFOoPFvluQ3scr7O10tLlExy6jvDPVacZYGJfK WsaF5p8ma4sd2k2nX8DFrW6jLKHC7epDKKch8vkc9KwajDq8dxqUTzH6CHlcmLJhlvsU0uvzZ/Mv U7QabJrM8kctIwkMcUcr1HEL6kSLI3Kv82+Y0OxtHjlxiA+N18iabJa7PIcPEUh1/wAuavoFxBa6 rAba6ngW5EDfbVHLBQ4/Zb4a07d98zdNqseYGUDYBq2jLhljNS2L6Q/JH63/AMqotvqXD63yuvq/ qV4c/VfjypvSueee0/F+anw/Vwivk9T2NweHHjvhveudW83vtQ826P5guLq6muLPWGYmeQkgtX/h WTw/Z8M8hyZc+LKZSJjk6/ju+x9lw4dLnwCMRGWLp+OYP2qWr+YvMfmOeBNQuHvZU+G3iVFXdv5U jVQSflXI59Xm1BHGeI9P7Az02h0+lBOMCA6m/wBJe0/ln5YudB8vcLxeF7dyGeaPugICqh9wBU/P Ox7H0csGGpfVI2+f9v8AaEdTnuH0RFDz7y8S8z/8pLq3/Mbcf8nWzjNZ/fT/AK0vvfQ+z/8AF8f9 SP3B7r5i/wDJeXn/AGzj/wAmhnb6v/FJf1P0Pm+h/wAfj/wz9Lx38tv+U30r/jI//Jps5Hsj/GYe /wDQXvO3v8Tye4feH0Pnfvlj54/Mn/lN9V/4yJ/yaXOA7X/xmfv/AEB9T7B/xPH7j95e2eSP+UQ0 f/mEi/4iM7Ls7/F4f1Q+e9r/AONZP65Yt+d3/KNWX/Mav/JqTNZ7Rf3Mf636C7n2S/xiX9T9ISf8 jP8AevV/+McP/EnzE9m/qn7h+lz/AGv+nH75foenLoWiKwZdPtlZTUEQxggj6M7E6jJ/Ol8y8H4U e4I7KWanPb29wgSeJJUBqFdQwr0rQ5GUBLYi2UJyibiaUX0rS3iEL2cDQhuYjMaFeVKcqUpWmTxH w/o9Pu2RkJn9Xq9+62LRtHhkWWGxt45UNUdIkVgfYgZZLPkIoyPzaxjiOQCMypmoXun2F/Abe+to rqBq8op0WRDUUNVYEdDk8eWUDcSQfLZjKAkKItBWHlTytp83r2Gj2NpN/v2C2hibbcfEig5dk1ma YqU5SHnIlhHBjibEQPgmmYzak3m+78w2Xl28vPL0EV1qluvqRW06u6yKpq6gI0bcuNeO/XbMvQwx TyiOUkQPUdPvadRKcYEw3k8Ls/8AnJbzcl3Gb7TLCW2Vv30UKzRSEeCu0soU/NTnYz9lMBj6ZTB8 6I+4fe6OPbGS9wK+LME/5yW8mmCr6bqKz0P7tUgZK9hzMoP/AAuas+ymovaUK+P6nLHbGOuUvs/W 8m/M78zr7zvfQfuPqemWfL6rbcuTEtSskjbAsQOg6fjnTdk9kx0kTvxTlzP6A6rW605jyqIe0fkD 5UutF8oSX17GYrnV5BOsbChECrSKo6/FVm+RGcn7SayOXPwx3EBXx6u57KwGGOzzk9OznXZuxV2K qF7YWN9Abe9t4rq3avKGZFkQ1BBqrAjoSMnjySgbiSD5MZREhRFoTTvLPlvTJTNpuk2djMesltbx RN0I6oqnucty6vNkFTnKQ8ySxhhhHeMQPgmWY7Y7FVC80+wvY/SvbaK5j/kmRZF8ejA+GV5MUZip AEebbizTxm4SMT5GlKy0XR7Bi1jY29qx6tBEkZP/AAIGRx6fHD6Yxj7gAzy6rLk+ucpe8kozLnHd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVYD5y/JXyd5muXvmSTTtRkPKW5tOKiQ9z JGwKknuRQnuc3eh7e1GnHD9UO49PcXA1HZ2PKb5HyYTJ/wA4voXYx+ZCsZJ4K1lyIHYEida/dm3H tca3xf7L/jrhHsX+n9n7WU+VfyD8maJdJeXZl1e5jIaMXPEQKR39JR8X+zJHtmt1ntJqM0eGNQHl z+f6nKwdl44Gz6j5vS8592TsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/9k= - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:551D098FDAA7E911B425F35AB770E4C7 - uuid:6a8ecdeb-674b-4af8-abe2-024c292e2d29 - - xmp.iid:541D098FDAA7E911B425F35AB770E4C7 - xmp.did:541D098FDAA7E911B425F35AB770E4C7 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:551D098FDAA7E911B425F35AB770E4C7 - 2019-07-16T17:02:54+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 2792.000000 - 736.000000 - Pixels - - - - - CenturyGothic-Bold - Century Gothic - Bold - Open Type - Version 2.35 - False - GOTHICB.TTF - - - - - - Cyan - Magenta - Yellow - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 88 0 R/TrimBox[0.0 0.0 2792.0 736.0]/Type/Page>> endobj 85 0 obj <>stream -H‰|’OKÃ@Åïó)昲™?›ÝìµµBqÁƒxj«`”¶‡~}g×j+ˆòæ…Ùß{ é¯çØ/焳‹9£”˜»2ížáßa–IDr*ƒÝ“î6Ð_ÞnöÐçLȘ×Ðٞ -應°\E}#Çó÷ÍGÛ±¸ÐlÚNƒé®%›Çö!_Ǖ¨¦x—á€âDló“ö¯FpÚLõè"ÃÍÿ•·Èµ£ŽTû¬&(&HÉ䭈âX’Bõ£Ó±Ì/°6ú¯vg´`oJê>stream -8;Z\t9t%q^#_hHc=A1XALg@6UBB8O0VJ0CY1+PLJMH]QAJuV'4g5)6AFB>,p>9qqj -$:KhHFH&hG]UWKc.M+c4rRZe:%^Zns62rH^8*%8i?R7b>7Bn$G.AE[ZS%%PRhHJrT -IGHRm-^l*8%,5@V=\L#Lol1D-IBL'G$IAapr:Y;>NVfG6%Ra!R7%@c/PJ4L[`^ZWp -"]>:Cd8iZ,LIGi`8J6H2S7iETbcsW)$*PS7:je@3Q\\n3:PeW]OmOWj&?XVl)hdlnq1`smp"drMl -endstream endobj 89 0 obj [/Indexed/DeviceRGB 255 90 0 R] endobj 90 0 obj <>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#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 83 0 obj <> endobj 91 0 obj [/View/Design] endobj 92 0 obj <>>> endobj 82 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <>stream -H‰|V xM×þ×>çÞD„äˆ8÷ƹf‰ð )!}TB‰YÍ"ƒˆD"ˆ%†ˆyz%ÄÜ(¥EñÌóX­ž{sbzÞ«(%¹ç­„Ï×÷ZÝûÛß>{¯µ÷ù×>ÿ¿ö¨†4HèÖ×/ ©îž±pžxÕks @€>("y¢rðTfÀ!G'ŽŽï]â\ pf»|rt\jô˧7Û®/ØpLTxäÑZñg^¼_ëž0´ujÂã¹<®?1e©ñ¹·N1q á;B -&žÓµŽOIÔ¯®R4ae\x|T(ö®ã1c’'&L˜¨uÕó»šô­°'&E%>ê<ˆÇÇM éŽ8ïµZג=Òßö ÑÂMÈ¢ªƒ¨,2ÏÍÃoJ°žaP ¼zØàžC)P€u¶•fªìkò©ñÕæ¦Ç»IîE¥Ïÿ6J²NïàXÅ©ªsµê.®·5k¹{xzÕ®ã]קžb4ùÖWÍ 6jܤi³æ~þ-Z¶úKë6mÛ~Ô¾CPÇNÁÿµs—Oº†„vëþiža½z÷éÛ¯ÿ€Ÿ }FÚÌY³ç¤Ï—1?3+;gÁÂÜE‹—,]¶|ÅÊU«×ü틵ëòÖoÈ߸ió–­Û¶Y°ã«»¾Þ½ç›o÷îÛÿ݁ƒ‡þ~øÈÑcÇOœÐ"ÜD1nóhEnÁ†ÝØ#>¡@ìÅ>œ]ñ ¾Å)ÌÂqÌÃKŠUx‚؄ÅŠ…Ô]Ì¡O©õéøNdâÅ1’©·X‰5ºx3ÃՊ&w‚7«ô6·’ŠÞž¤•TØ+z‰ï~†°jOtWQƒí?‹çpû-ß´^ÕüϹü֏x7rû Ó6òÃkþÖô‡Z0ör$OQN°…Z;†‘+¼˜ËKPB.š…íAÌôEäAžÚ,-GËã“zM.‰Réö%ƒ3y¢%ZñìVæ˜A¬]Bæh‘ÐbYý:pšªÀM‘Í>^ä#Gkùp@tÀæõzlbv¶ƒ YCh¯&§jÇ´'Z9œÐ˜wÅjæH36Æ /©…´^ã?¸p$Ñ=ÎÚZκËǞŠÈHböÒ@á-ÆKodƒîQ…[‡ßˆN¬ÁDVL²YËkY¥ùØÌ*=Ϻ»ÎŒ{Á¼³3§ëQ{ -¡PÖK2ˆ1H,›¥iÒ!‡Hm ¿¿£ D7ôc]&ðŽKy§­8Æ|»ÇÊiMm(¸R”Kûèý@÷¨LD‹b“8% ’õººåì/µÆÚCíd>gfÿ«pÌ]ÐCg4ŸPë|2«|6g¢,Î@kùÌ6rNÙÉlÞ˸Ïr¹…g|>‚«Ž«#£7°ݹ¶dm9’`F2„>Š•šÊÊ¡­´‹¬tŸÒkÆÕH„ˆ±\ñ-W’%ɗkˆ´RZ#m“vJeO¹™ ·”êæë;ésô'ôOÊËæÚSí5ƒ–ÎT…;|PkC´FW„1ß"9†Ñ•Yl笩œ›fó¹/ãï•ÏœÚÏ·Ãù®ئ®+|ïû³c;ñ³›ä9˜€íòŸÔ#b‡Ø!àd@ì(¡NÈŒŽ¤«ª)`J[è# ŠZ´Ýؔ•6íØ53bë"­›Ôj•ÐV&­hR;eVj¶nÑ-<ï¼çA5-ïùåÜ{ßýÎùÎ9÷øç}×Ák7µ,ýý*ím¨…ÿ†ãOµÁ U¡¯ÇP¥âP‰&ý+ø$Nâ[”*k9µ‚ -R#ÔqŠPÃõu‡Î«”^OGéô^8íOAÇr‘þ5= –‚8ù»˜aæ»Ì!æC˜̟XÄnb#l{ý{“çr¸w;®3éÞÓÛõbÎ- åkÙõgê]ˆsø#¨?%Ã/C9…Ô:ԀÚ…]†ÿN¼•Ò¢'‹)üèleþ€ÝmݐYP“öá/ASAÏCä•@̏ÁÙ1 -ul¯C]ø°å€êUyŽY8WðÝ«xÝ¥,!'5$›À·ÕY—à„:‰…ÌÌiˆ—ßd8ô“õׯߘ¹Á¥Ð[Ô µ·•ó?ÖÔØP_S]µ¦ru…ÏëYµ²|…»l¹XêJŠ—9EKí…KlùV oÎË5 9zÇ24…‘7(¶ÆâŽÆ-¶µùÔ±ØýMĉS­ê!®© jJ 9ü5M)«)=ÐļàG~ŸWŠù0 -)ÜÓùh@Œ $­ÉšÌ¸µA. \.ø†´‚ãB´>=*ãx_Òhh[† >/JŒ A"­âX·®Åš@µ›’Òç*A*B—ûI¤3 8\®˜ÏKpËq€ q=1{4Ô¢mC¸¢Ó¶vªæ #BÒ;#O¦x4÷˜ÅÁþÞ(¡ûcêÙ Ȇ½³vŸ7…ßØ%9-)Œ¶D¯¢p&‘ %˜º›µ%zèau-í;u(ˇr¶3úðªK}ÆbðRŸ·½+êÔbpRPÍèŠjÀK±}5€TçT3³‰Au&¾K 9âzqTÞ²Šd‚ºžq]( -KW3Ÿ pP·DEivˆ±þ€3Y€ä®g.†$!ôèŠÏ›ä-YO'óÌ ‚)÷aaèÁš&iꪨ]UDbB„;@ UÖ >†¼£Ôà/†Á£;Áq™oR‰`Ë ?—炘þâљþ…®ŒŸCª¨†ËƒƒõE™x’’Ð H¢3š hÀqI«=1BÅՕ™ÅÛVu%±¸òàëqÂù’ÖZۈÞýà6óKòƒ£M/ù?ËCÙuHŸ dØ29u÷ËGî¸<jZ!e¹UZå¸ÜŸÊ$Dåd{»<Œ/š”Êď8ÈÙÉØ(§’ê¬7H~K”vP±¬D9hÚ¿)¶wöDH#LÜ¡A18¸B(1° ø‚»R6—Ì“Ð]—ªG•ñ×Å÷¡æåTÀì×`c‚ò âC„.l€E¢TC¡r#Dà I²L -{/ Nw {…0þÛešFŽMaÏš¦Â9:Ðð\Â(¤O]Å"²{6ñwüsþMü]?çGÍ~þ¾ÎâšJ—Åe)ƒ†ãm^ gæ%S™Ö E3³Ì»L/tN‘*˜BšG–î\âhCa·ÎXtÑ1Šâ‹1_/Æ# Ãue-ëyJÛv¼#=Û> ûÞ÷Ï¢ætsssÚÒh±6®©Ä°kmKQm ª®ZRȖr¶‚%ÕUuµ5nú<æ•D~¸ý÷ÊoñªO÷¿ùöāéiFúÏÌw6¶à ÿšÇëÃáы“G¯\|é¼=Ê6 o ò ÝRIáòºå”Õm+A‚ÁÜÝm3°3ÆOŒ”1…¯þ,¯›3[K¬LádÄaŸ8byÀw¤zÇý;à°tº¯%zAÊè/¦‘Æ`‚f t—. ¯ã\¥x…«WW­Å –ñõuÿË´=¯(ýøärì+ß·íÛ/Ô·}ð¦ò»³/½¿ýÜå/Þ|çÙý?~ƒ‘æ{•/ž%‘W÷T¬ì~®­ûÿ‰é׏7ë'ŸŸ–O«,m€³nŠCН˜Ñ¸”÷û•Žâ$gqc†Ã\Š²K¼)é‚MœÙ°Ùò¸…¢¯QKQ.Ê¡–J¢)7/f6'LÇM”dŠ˜â œ5±¼I0UšhSˆÿQÖ}ãYùY~¶‹}üíqjz~ œXê®­©£Ò¹¶‘á ¡‘áuتÜæÐh84²³½mXÖÄa„tF`ȍž—VRzdºY[·ÑÈ5eGQ‘Å€ÊñãåûË©’r¡œ2óVKŒOQEWK‹œŽXˆ’ӍËbn7¤½y±ÇᧅB+ÆÑfÁއϳ¯o\{¸šá_šOs@]¾Ë¶« ©Ïblƒl¨q‹¥yY©/ˆ‡±µõí¡á©ªu¿{Št(éÞÞÖ=uJÚ³í=õÊmFšèØ8î>ÿÞýg©ò«#G_Sl”ùÄA©óÄëŠSåi+dÓ`{*BU’£žÇæn¤³uëö&촎$ŒØrôL,¦Ž~i5iҐ-}¸Š±Ú -(FK˜úºü‡BŠzñ 6Ÿ:­ÜûÁçÊåkSÜÿÖ¹DbúÓ{F¹wúŒrç{¸ãvfúe%“”‘ ““?&Â鄖Û’[_i]Öø„nBwTGӕ&Kãeú²‘š¢§Œ”ž§°A¯3#ΐÊ\‘ ù†c¬Ž7èR™ɞcjԅ­›­Ÿ3Çx>oYz~™¥Aea¶oÿ™B¦#íi^L›lÖôaOŸ'¿Zc Pnçl…Wøs÷¾öÚ¦­•%ÍÝXù’‘^ìÜâ¼em¶Viƒ·×À/ÎÀý_ö«=(Ê늟ï~]ä±±ò)¢A‚»ø¨2a•‡Pð 1eË.y,,«©!c$†&š¤$©E&5Qƒ8™h-­4ñ´µÆÆÔ±Ó6:còSãXë¤3Õ¯¿s÷[ªØi§f¦írç÷sï=÷ÜsÏ=çÜ%þ˜7{EÂê ΁T­ ¾hBIÚ:¥<þ©´GuvôŔ+Ρ”ØÑB©NoMß+vÇjneþ)yîeêz5¨>§v«úRɪª¹ª£NPŧêgꗪ…ÿVOr˜ ž‘Àkæ繖»ª]­®­.=ߥ¤¹f¹„p%¸ÄG®³®K®k.͵:n4u&׍YœÞ®uûºã•eñëãE|ɔA%뇑›­ª*»ñ§*y¹(‰·ªÚÚÚBWª†¾ë6vNÄ#‰®TÉ)6m.×\¸[™‚lCتSúë*f̞”ïkÓ¹]ýÞaOçÌo<½ööW§÷møP=Ü_;훮tsæÒwš_ÿù'æ-š=yA_už¨"ù‚Š5=¥¿´$m Ó㭇¦[I·^‰Itþ²£¥¼\匽í%ŠñZI–+&Ñþ=†=$¼Ãh—)U;C^­ƒ7.Ót½|Ê/h­CUÀµ‹fc¾²+Ôµt ôyõ}zò9ÀQ€y^?ð XÀ”åå¬côm}ˆœ@¶v^Z¯÷P¿–Aýêzÿ)ÔŽ>¬Û‰þTí&‡³hÖôc¾:ú$=Hb]lû†žJoAÏ<)×FX·@#r‹nêÇÜPöoÖȺùÇôbz؁¹JɧÒjìéÿ$ä^V†¨H$ZýØãð͎.z ãQù¼:³D­ôãvؕdÔÒXPëÆÂWqbÆhgÄ81hYñó¹|n>sôLÒþˆM÷‚÷„}w6ÍU†¬m@°}ضv݉zDEù @6ШQfaîÏëCÖW Ä]~ú>ü¾æ§ùðkìôé´›ûÃà{ï¥'Ô”…¹gŒ]ôÆId—áÿ˔e¤Ó\çAZƒ³làûçؓ±à§èƒºµÏi<ü•ÌÀރ£Ã¾‚œ´:Êùþœ|‡è°r+ûØØàf¿óÝ+ÅVtÇÀO) íÒ$:hš—ûx}Œ—2d,fÐ~›ÊXÄ|µðZߎ—Õ+ˆ†ïËô7iåôô-Ï^­Äúnœ}î¿BïQJ@߶e27å2n»7ˆQŽÄH²~fòÝÊØ=(㨏cÍ͝â­€‰°á)S¡“dÞ vy_[÷l™[ˆ(åXbÿ‰#":â¥9¾¢´>8 -;dl²-65i'l-â\Äy˜Š.j–ô45sËŒÒtëŒí§JÎSÎПŠnëhÔ>Î[ÎI?£Tö¥ŒA›û&Jː÷5Tí¨‡Þbœ§º×€~ºŠ& 8jØ6ø~‘ÖI-â$•Ê£>Çš®þ’[Ë oﺇá8§lÐ~BÒßçè qzðÇA[Å|ZõÕHßÞᯃwù;—‘”kœa›¹öó9õWIDë¾öµÈó°ßšŠzs°mÆ%*ãšo¼AÏÈÏ9Ëãl§ÚI«Ø7°½´EæÀŸajµö Uò¼ú[ØÀ1ë¥J™ËÿŽÅØ ,Çó2j)WŸG-ÚQð'±¶‚rY§Q £æãÀÿžÊízÜb×_9&㡋ù̈™j¾ >'ÛÊw븎³î‚?:(Q»:‰’ù¬ÒW¯â¼¶¿ŒLŠe]Žš¨=Nãôç Üå/ۏQ_qŒÊ7: 'y¤¯sWi±cúœÙÔ­çP¬qc/KùRçoÀ§•².ÌÅ9P‡ðnl×çÐ×íÖj|S#ïJ)êÔZ2Œ…üÞÉ’oOôÅú ö©3Ž–²¯t?Ö´“Ç1qÆëßÅۙšܦ%Æh&%É\:c]å½1^Éuƒßfö±H²úùØóglƒuUÚ¹·íðiŸÚF;¢1<’FcÚàzè¥wµë<¿‡ÎË2‡žŒÖV`°c{#uXLÄ{©èØï¦ò±> ¶1/ åTdŽ)ãιÿtü~ ~‡÷¹Qòx/¸¾ñoKǐâÌ(Åßž¦:3•=ÎFeб -µ·ï÷*ªÕ"#î?¢\Äãx')q„°f=TzÿOÚ®4%­ÖnW”+"S¶Õ¬íA{дÿm#¿{è:åÒÒIP¥Ñ|"µÙyˆTž¥XÚ-)ÿm"¼JÉèEx ü›6o€?fóhú5kÑF¡÷7Åaó -ÍªÍ zH̱yã…6¯ßhóø>›wгâbÅæÖ@­¯&`ö›õ³,Ø cÈ, †Zƒ!_¸!Øb¶6ÕÌ0ú¾#dºMVg® 6mä±v³¤+³sr Ùj4ƒµÿúxTA›©•TK>ª5©¨ zɗQZ€°-eR!z!ðüõa¼AJ˜iÂúàÊqß×Ôd’[®ŽJ¯Älm–kÇX hdÏlÊAóP¾ÙèçC¶ ´Òu° ,åË¡©Ñ&|ýTIET -•´ˆ2aOúÂØ#„]‹¤­õX_­rw¿ÔP‰&Xºõÿw˘wI™ø²'øvÂÒï~H7ËÓ4b,ˆ8ø:·¯FrÜZHƒôOþòãÈ#ª)X>Η€k¢zÀ™j*”_(Æ#Å»ÅúpPÑ+E¯éþšÈfHn*0 ÜVp[%.Nr‹\J܀Š^z9Rb™€G–T၄ãg…[37$}Â}\E'ÁòR(û±êütâÉ_& -p†¹kí.*ôEƗ˞!’¡í |o‚Nã{^r}øžÜ‹ø¾)¹:|Ÿ–Üj¹nƒGςÄú h¬H¡|@üñ² £ãø<“ko.——Ë ÃƳ·›\•B ¨|)ØÍåîª,š4—voÓb/9ô>Ùk´Ø„"¤VJÛ T¡ÁZk)ºw v/­m¿ˆ_Ú/~D°E¨öMÚB|fïZ*Fqîvž™çÿ›çٙÝÙ½#€õA_ÝDcH°þJ¶Ð˜ú8l¸Ë@wÀa  - ¹t#‹d™Ðä0¡ -Fž\'ôü §-å¬<(Î'ŒW#Œ­óX_ò[?RñØ¡µ BD"=”E¤H}߃x•Éï× ¾ü•c|Ï*ï¹°Šò[^—|˳»8I§ñêwv0õ4ÜÆVNU-EìFñÝ!C¡¯G[Á…ˆJ8œ$&DH/¶>tͽîÁxÕê–=0êfkÕzÍXÕê—›as#Ð ÄlZGr8,éšG»øІ~&Ï¢§Õ5—e V›ÍýüºuN¾fxt±*ÿjzô 5<Ä/Y\¾h­“¿[‚Q¾@Õþ`kè;% wˆdzŸÜ#ü(ڝî>þŽé­VCçøs¡“6½¦unŽ¿iaäSòN‘rGfÜMO´IÅù#÷ yó¸³*ž§S#ÚXBržî×30G¦}fz`¢9ªÏè:2EÝgà*Ñ}F‡«"΃ÈƉ×½Îtk÷˜n (árÝÊd«éÞtê@Ç4]½ ¿Wµ -éÔT<•Kþ7fÿ["Ó¸„ ’¬p3Ü»þ]º_ - 7v~&UÀXñTœs`fJröN*Jeþ¬§éÑÜd~J؉‚s6^H:óñ¤RÉϬ Ï9OVÈLj,[™Q Éj^ͧâIÃ-•Çgÿ–ëíû¹ÆË++‹`ã"WivyVÈ%‘kVäš¹JjÉÏ©WÅ^ÉVICÛëÖ¥áfÜY¹h¯‘à‘Òsþ6ÛÐ+ÍE—Ž“p¿á´ÄN+BR€øRºÛ’4·¡7ºÇRݸϫN¬—ñƒ¥\ÆoyW½²Ê¾Ç/~χ„SÜ9V_n©)¦RSŽz ç(ñ¤³Z8Ò G_<¹ ¬¿  -åì -endstream endobj 87 0 obj <> endobj 86 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (logo_blue-orange_clean.ai) -%%CreationDate: 7/16/2019 6:26 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -668 2732 20 -%%HiResBoundingBox: 56 -667.918 2731.9385 19.8062 -%%DocumentProcessColors: Cyan Magenta Yellow -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: -23 -665 2769 71 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: 957.0195 -584.8799 1757.6592 -8.87988 -%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: 1 -%AI9_OpenToView: -2915 1691 0.25 1586 946 26 0 0 51 123 0 0 0 1 1 0 1 1 0 0 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%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.MO -%%EndComments - -endstream endobj 97 0 obj <>stream -%%BoundingBox: 56 -668 2732 20 -%%HiResBoundingBox: 56 -667.918 2731.9385 19.8062 -%AI7_Thumbnail: 128 36 8 -%%BeginData: 6246 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 -%524C45FDFCFFFD04FFA9FD11FFAFA9FD6CFF08A9FD0FFFAF0885FD4CFFCA -%C2BAC3FD1CFF0F30FD0FFF310FA9FD4CFFC2B4BAB4C9FD1BFF080930FD0D -%FF5A0908A9FD4CFFB4BAB4BABBFD1BFF310F0F5BFD0BFF5B0F090F85FD4C -%FFC2B4BAB4C9FD1BFF080F08095AFD09FF8509080F08A9FD4CFFCAC1B4C2 -%CAFD1BFF310F31080FA9FD08FF5B08310F0F85FD2BFFAFFD2FFFCFFD10FF -%080F080F0831A9FD05FFCACA5B09080F08A9FD05FFAF5A310831305BA9FD -%09FFA95B0E0F0E5B7EFF855B5A85AFFFA9855B7FA9A9300F30FD04FFAF5A -%3108313085FFA95B7F5AFD05FFC2BBB4BBBBCAFD04FFC9C3C2C3CAFFFFCA -%C2C3C2FFCAC2BABAB4C2CAFFFFFFC3BBB4BABBC9FD04FF0F08310F0F0837 -%FD05FFBBC261080F080FA9FD04FF85080F090F080F08317FFD07FF5B0F08 -%0F080F080F5B5B080908FFFFFF080F09850E0F085BFFFFFF85080F090F08 -%0F09853009080FA9FFFFFFBABAB4BAB4BAB4C9FFFFFFC2B4BAB4CAFFFFC1 -%B4B4BAC9BBB4BAB4BAB4BBCAFFC1BAB4BAB4BAB4C2FFFFFF080F080F080F -%085BFFFFFFC2B4C95B09080F08A9FFFFFF5B080F080F0809080F08095AFD -%05FF7E09080F0809080F0809080F080FA8FFA90F080F0E09080985FFFF85 -%0809080F0809080F080F080F08A9FFFFBBB4B4BAB4B4B4BAB4CAFFFFC2B4 -%B4BAC9FFFFC2B4BAB4BAB4B4B4BAB4BAB4C1C2FD04B4BAB4BAB4C9FFFF0F -%08310F0F08310985FFCAB4BAC261090F080FA9FFFFA9090F080F315B5B31 -%090F080FA9FFFFFFA90F0831090F315B310F08310F0F0EFFFFFF0E310F0F -%085B37FFFFFF0F0F080F0F5B5B5B090F08310F31A9FFCABAB4BABAC2BBBA -%B4C2FFFFFFC3B4BABACAFFFFC2BAB4BAB4BABBC2BABAB4BAB4BAB4BBC2C2 -%B4BABABABBFFFF080F085B5A09080F0885C2B4B4C95B0F080F08A9FFFF08 -%0F08095AFFFFFFA95B080F0831FFFFFF5B080F083185FFFFFF8531080F08 -%0FA9FFA90F080F085BFD04FF5A0F080F08A9FFFFFFA9080F080F08A9FFCA -%B4BAB4CAFFFFBBBBFD04FFC2B4B4BAC9FFFFC2B4BAB4BAC2FFFFFFBABAB4 -%BAB4BBCAFFFFC9B4BAB4BACAFF310F0F30FF310F080F5BC9B4BAC2610831 -%090F85FF850F080F5BFD06FF5B090F08A9FFFF0E0F090FA9FD05FFA90F08 -%0F0FFFFFFF0F0F0831FD05FF31080F09A9FD05FFA9090F0831A9FFCABAB4 -%BAC1FFFFFFCFFD04FFC3B4BAB4CFFFFFC2BABABAC1FD04FFC9B4BAB4BACA -%FD04FFBBB4BABACFFF080F0837FFFF0809085BC2B4B4C95B09080F08A9FF -%5B080F08A9FD06FF7E0F08095AFFA90F080F30FD07FF3009080FA9FFA80F -%080930FD04FFAF080F0837FD07FF37080F08AFFFFFBBFD04B4C9FD06FFC2 -%B4B4BAC9FFFFC2B4BAB4C9FD04FFC9BAB4B4BBFD05FFBBB4B4BACAFF310F -%0F31FFFFA9080F5BC9B4BAC26108310F0FA9FF310F0831FD08FF0F0F085B -%FFA908310985FD07FF85080F0FFFFFFF0F0F085BFD04FFA90F080F5BFD07 -%FF5B0F0831A9FFFFCFBABAB4BAB4BBC9FD04FFC9B4BAB4CFFFFFC2BABABA -%CAFD05FFBABAB4C2FD05FFC2B4BABACFFF080F085BFFFFFF85085BC2B4B4 -%C95B09080F08A9FF31080F30FD07FFA931080930FF850F08095BFD07FF7F -%090831A9FFA931080930FD04FFA9080F0885FD07FF85080F08AFFFFFFFCA -%BAB4B4BAB4BAC3FFFFFFC2BAB4BAC9FFFFC2B4BAB4CFFD04FFCABAB4B4C2 -%FD05FFC2B4B4BACAFF0F080F31FD04FF5B37C9B4BAC261080F080FA9FF30 -%0F0931FD08FF080F085BFFAF090F085BFD07FF7F080F08FFFFFF080F095B -%FD04FF850F090F5BFD07FF5B0F090FA9FD05FFC2BAB4BAB4BACAFFFFC2B4 -%BAB4CAFFFFC2BAB4BACAFD04FFCFB4BAB4C2FD05FFC3B4BAB4FFFF080F08 -%5BFD04FFA985C2B4B4C95B09080F08A9FF5B080F08A9FD06FF7F0908095A -%FFA831080F08FD07FF0E0F080FA8FFA90F080F30FD04FFAF080F0831FD07 -%FF31080F08A9FD06FFCAC2B4BAB4C2FFFFC2B4B4BAC9FFFFC2B4BAB4CFFD -%04FFCABAB4B4C2FD05FFC2B4B4BACAFF0F080F37FD06FFC9B4BAC261090F -%080FA9FF850F0F0F31FD06FF37083109AFFFFF5B0F080F37FD05FF5B0F0F -%0F0EFFFFFF0E0F095BFD05FF37090F08A9FD05FFA908310F31A9FFFFFFCA -%FD04FFC1B4BABBFFFFC3B4BABACAFFFFC2BAB4BBCAFD04FFCFB4BAB4C2FD -%05FFC9B4BAB4FFFF080F085BFD06FFC2B4B4C95B0F080F08A9FFFF0E0F08 -%0930FFFFFFA95B080F0837FFFFFFA9080F080F308585853009080F080FA9 -%FFA90F080F30FD05FF5A09080F0885FFFFFF85080F080F08A9FFFFC9BAC2 -%FFFFFFBABAB4C2FFFFC2B4B4BAC9FFFFC2B4BAB4CFFD04FFCABAB4BAC2FD -%05FFC2BAB4BACAFF310F0F30FD06FFC9B4BAC2610831090F85FFFFA9080F -%0F0F0E5B31310831090FA9FD04FF5B080F080F090F080F090F080F0FFFFF -%FF0F0F085BFD06FF0E0F0F0F08373731080F090F0831A9FFCABBB4BABAC2 -%BBBAB4BAC2FFFFC3B4BAB4CFFFFFC2BAB4BACAFD05FFBABAB4C2FD05FFC2 -%B4BABACFFF080F0837FD06FFC2B4B4C95B09080F08A9FFFFFF7F080F080F -%080F080F080F7EFD06FF5B0809080F080F0831300F080FA9FFA80F080930 -%FD06FFA90809080F0809080F080F080F08AFFFC3B4BAB4BAB4BAB4B4B4CF -%FFFFC2B4B4BAC9FFFFC2B4BAB4CAFD04FFCABAB4B4BBFD05FFC2B4B4BACA -%FF0F090931FD06FFC9B4B4C25B080F090F85FD04FF850F0F080F090F0831 -%85FD08FF850E0F090F085BA97F080F0FFFFFFF090F085BFD07FFAF310F08 -%0F090F08855B09080FA9FFFFC9B4BAB4BAB4BAB4CAFFFFFFC2B4BAB4CFFF -%FFC1B4B4BACAFD05FFB4BAB4C2FD05FFC2B4BAB4CFFF305B307FFD06FFC9 -%C1BBCA855B305B30A9FD05FFAF5B310E31307FA9FD0BFF84857FA9FFFF30 -%090831FFFFA9857F8584FD09FF5B31083130A9FFA97F857EFD04FFCAC2BB -%BABBC2CAFD04FFC9C9C3C9CAFFFFCAC2C9C3FD05FFCAC9C3C9C9FD05FFCA -%C9C3C9CAFD28FFAFFFAFFD07FFA931090F30FD70FFA831080F085BA9FFA9 -%FF7E31080F087FFD71FF5B09080F09310E310F0F08310931FD73FF300908 -%0F080F080F080F080F85FD74FF5B0F080F080F080F0931A9FD76FFA98530 -%3730315AA9FDFCFFFDFCFFFD55FFFF -%%EndData - -endstream endobj 98 0 obj <>stream -%AI12_CompressedDataxœì½ms%¹‘ú}"ú?ØÉáaW -”®ãFð’Ú±%̈́4ò®½×ÑA±93ôv“m6[ò쟹?æþ±›Ï“‰ªÎ9löËheï4¤éfTá%‘/O&þîß}ó‡/O_ÞýéúËpÒmž}ñw·»¿¾|¸»ÿՆäÍW¯^½{ûpÒ/~ÿËM?t¨uúU~a5ÿËõýۛ»Û_ñw'¿½Àó¿ØýpóöáæòvsqýZ*ýró‹_â·ßÞ<¼º–ß¿ºûþîş^½»þòîþòöûëW¯®/oO.o~éï!íž]>Håô¼Ÿž]?o¦_ Óæ›ß²ÊåíŸ/ß¾½ù—kt2ûÞÞ½»}ysûýöîýj§Í—Ó”7C -Ãfà›ÿýÍï¯ß¨”Næžû“9ä¸éç“ÜM9»»z÷úúöá›û»«ë·oww¯îîßþj³ûQ>í·—ßËo.7ÿõúÕ«»¿´µ/înPKþùîþÇ_ß=üpsõåöîÕ˶Òﮯ_^¿|¬êéWñÅÅÍ«kÓח›~àœ~Õ/¶ïn^½üݻ׺–ážæžôð‚ï÷Ç·òbÒ$þMzzñÕk!ýáúáA>\zãhüþ×Ûö«„Êò‹úFöZz¼ÿçëÛÿþËÒòýݐäé/‡€Q‹2bÓ¼I¥ïo¯_¿y%3Ɓât¥&ÿj(•å³XqŽéDæV~óx’Ó<¿¾}yùö‡çׯù׃ìÉëçÂ1_^c«HcoWêÃw×Ï_Þ #þ%ë`~þ__Þ\ßË¿Ý<ûæòJ†cŸ_½»¿¿¾½úQ~˜žÿéþN6ãŸ.e?÷S~^ê?¿º{ó£µyÿò»ë×7·7·òxžËøß\]¾º½{xþÏo~¸¾}~/SñV>íúåóחWx-V™¤ço„Í˓ïÞ>øËÝÛw2h7w÷Ï~¸¿¾öŸ.¯Þ=\?ýnÓç𜴗W2ÿlíêúåÍ«W—Ò’lGB^èõåÛ«w¯øF9ã—ÿóÝå½<ƒþpùê;íÈo…íÏO¹¤©Síñ´™ÍSßSÿúS|ÀóÓóç;{…çç|üù9–VΛÇÏý¹¯´ÖWÚÅWM¯¼ÎùÃÏÇ¥™¯õ¯õ¯›¾Öwúڟ{ýîÕÃ͛W?>ÿúí+¬‰?–ú£>üÇæá?úSÿUùíw÷²ZÀ|oe©½}~©_–ï¹lž¾Ô®/½‘KÇåõó«2×úøµ¶~]–¦®ý¹­u£µnš.n¼Îµ Ç­vx§ÕïÊ;Ý5ÜYîå͟o@ÐÁx§¾ÓžÞ-Þç?ó£þúƒñc!?ûâÛse…ñ?½øö­ ÿ/ÈhÎo¯îp¶ÿjóbÿ@=xÆþÓó5ŸxXó·ÿí{WúÚ|{ÿîúÛߔƒˆ/òBÞ왎î°ß½áïò‹o^½“_þúþîݛ¯n¿»{öÅ/TÒú/×W"MÉñõróõŸþ‡ü òÒï.¯~øþú_®o®~¸½~¸ÙÊÐ -Ý늴ôæ—ïiXúýõF+ÏòGùû;üý”çÏ®¿Ù£6 Ô¿ÿB…ÿÝ~ù߄·>üË뻗ï^ÉoÏoÿ|ýêîÍõFVïæ.ïß<¥‹o^]Þ^Þoø‹ÒCÛîæ+°™Ë~¸ùóæõ¥t*•~s#gÆ7—2¾OêA˜Ë5>Ä:ËÞ«ÐüêI]]>ü°ÙÊK¾|뭟⨓Y|'rîzÄø!Zÿ)ÍÿáÇ׺{uóöµ7ÞRüßO|SÖÛ¯oõ•ïß½ýaóíÝÝ+où·ïpX¼¹¹}{ýjõÖ"(ésSyåC`óüoÑÅîRDa“o„óêå?Ûï¿»¹>Øّ矴º®8U‡zýÛë¹¹|u°ÇýÇþæ:³5¸@xç&ðh?üåòáê‡Íonþt/Çìõ{v+&û»›Û—ò¢xwópíàc 8ýöúá_„A {›‘.šjógM{œ|ùåãM?m¶·m•_ßCD¸}µû×r’AH¦ë¿E/H›íKÊç]ó¿¾üoÜü݋­HžÿQÈë?ýª M VF+‘ÿ/eÂÿ¥ÅiQ’—Ü͋rڔ­”•³¦œwÒâE)‹Wkÿ M M%j‘1Àß©Ÿ¤$þ›2/Êi¿õ²ó²íϤ”ŸÎ¤Å³þœ´³þ¢-íðñõʟД±)q˜Pž}¡©)y˜¥èO›²Õòì‹ÿûðœ›Õ°˜×±™Ý:ÇR¤Å2Ïc3Û:»í,g)ø³›ó<73-ÿ•uÎˬo}¾õoÌöy;ëò_ýÓœóAf ñ ó‹¿1Øë‰%s¶Ój¦O­,çsŠ¿ÏYÎV³Yº œË:w(:Weæf›3™'™S+ÌÙÎÊ˹• ”²Íð9«9í9[£æ¸n¹g.8BG`â7Îüž3¾uoo9qõœb­°oô5„Æ0…r˜ÃVÊY¸iïÇ0ŽcӘÇy<·ãÙx>^Èp1Ä1N1Å9žÆmÜÅó(ûT^©—%;Nqš¦<ÍÓ鴝vÓÙt!‹BTØ4¦˜¦”Óœ¶i—Î҅,˜>yÌ1O9å9Ÿæm>ËçùBŽÌéæq–†æ<ÏóvÞÍçó…,Ÿþ4œŽ§ñt:ͧóéééVÊîôìôœKjO·q›¶y;˯¶ÛÝö|{!ËLF“ƒvã.îävóît·Ýívg» Yv='c<‹gә¼ÞY>›Ï¶g»³ó³‹óN¦'œçÓy:Ïçó¹tv¾;—Ur~~~¥q!ƒv/äc/äõ/N¥H§òèÅêç´ã´:í¼)gMÙ5e»(§M™K‘g龖ԔiQbSƦ„¦Èj”/-g«\¹k_þ¼ýs¶(;-2dø{۔Ӧ̋’›’š25Eúyô2.JhÊД¾)][t؟}aÐ~@ûgה­–²Uó¹œÅåܕY[ÎÔrvdF¤Å±‘f&–ã¿uíÕsTe¼æ՘ÚH.Æp9n«ÑZŽŒ×r\tLN­Ì,ÙJ²2±D+#K°"뎛ÑÎT=|+”ÓÎʟ-Ë©•™%[‘Í.›?í&+ÑÊȬ(O.g€ðÕfNÏ9[Î[æFæÓ±Úʟe#o]¾.¥jLy¡K%Ó¯´Ä…fz™´Œè•ù*ñRÛ+§•ë‚®M°È(.´È%ô¢yàïyUòªTUÿ5™.ۖq¯„½2(öGZlÿ쩎؝­ìçŸ,ÂZdî¼l½œ)óђ‹†)-¦U™žXªöÛ"-.~v Gý÷~ G -—†´8<±äEZ|ZÍ'ÿ9h+ø¤?Ÿ¯Åæxí}`Uú-Rü™•ÛŠ-¤ØF²éÞÅvbû^vµêée·{LÝ -ë½]dß²—ÛÝ»µ]]¬û{7¹Õa²Ý&QíR¡Ý­nÍxdŸÊ¿ÜRmc«½Yv珦bcimlۃ{s»°ÌíïÎbÃYïÖ¼°òU«P± Ú¯þóÂv÷ʸ°6ߕKËÕÚfyhß>¶›W{•»úÈï>|G?º«ÿöàçoñˆÐÛªWû -–J-û -V‘U:*ìç”HfS0'“IW¯.©$-¤’¡Q±v¢dQÅzö…(YP³TɂšÕQÅR%kG«“*ZÙ­`ŠT­¨Y[*Z™6,YT¶zn” êßgèBÈ¢j©²ukPu‹ -י)\[*\™ -T.°2Y;¦v]P—†â¥ª”¯Lå ê×Hõ«ç¶º  -¶£ -% jX’nQU4-QÑ•1QÇh:§Bv& -T2(ePË ˜¥1R5ƒrȺ:*h¦Ãoµ#Dù^¢”7၀?=¬ÊÙ!ë„T9Ne·Lõ e$oywõ)¬Øsõï–'·2å%á·ãžläœuÁK’Í‚k.x¤ì˜VfAYq»ƒ|îùâ€<ñ4®q”›|æ]íª¨–ÖBÖþYSçÒWÎ\ª½©´µ„EYÚüâªL‹"À’˜6ÆLkYNWe».fÑlËÙ^Ùÿs±_Êjٞäý2,á`)VÄý”éhq{²´˜V%?Zæ÷)VíÃeûÄBŽ/-îžXΞV¤Å}ê¡©|r‘ýî#ÿ8^?º%7u®µæDÑ2ZQ{j±¯&+Åþ:[1무¨ÖÚò§°Šº…Ê´~[të"õK±Úe}Ó<¥eòRlÍÙËlåÔËöÏ:ƒyicâUՏp˜;5|iá§Xð¤#Üèj9ϖö ã¼çž³à1ÆghK;Îcp–÷qiñQ>ò²âôr9×øhNÑìþ£|â‰\aŸ<²«/Å]ýAfۅáV»ÚRé(†,Fك"NÃx+ŒAÆ¹á8Žtg<‹ûø d9tԁ(²Â‰,g ÙâJ†3ùœîdu(H¡t*ã˧•á\ÆfR3\̐?éf~ö]ÍR9ÝÍ[aOgîtîDJ„Ä Çó(/Y:Q„ŸEœ?¥z'ìãÜ\ÑÝ©ìú -ÿpJÃ-=&ªs㞦ƒZ -&䪶Ê@g5ÜՐݝÖYT™®ku^ïȜ°Ñ/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïåO=ý?~Ws8 _MìI¿ä_Ó&w'£ìM -ˆÃPùϾø»O©»}{ Í“(5c·Éý‰èÓñ×ÙÚI?¥yDMÅx(-1ça”¤8د‡>Nó´•á$tq¬Ý}rKú>(µq’jlû Šf.ª;›ÇØ͌´N9F„ýàï¾i,œtÂiš×úL ÚÛMðY4û.&>˜…?kc¢[fí`>‹Ædúâ¼h,vÝܾÝçiðærH'9„Må˜æOÐus‡Ö¬½ü<ŸŸ?º`—µÐÎö¬â7 ó,óïo^¿¾~P¦ýK $ó?:ë¼0†9«ŒææKÆOžµ>[cs£¡&(bzœ ë O5ò¢jËÃí‚æ=Ô&g§<ÈÎÉဧÂÁ¥‡Ö)m[gЄŠ,žµíª§IgØKuyì$§Ž@‹`ý9ŽFm-·±±?Ð8¦ˆb•°6%C'(>Á -4FaÝíù8ö¢A^< w±v\úÉޛ¾uÄWWüNOïÆ?úi=—ü™Oä3ƒñA*ËÂGYL|™òä.H]QF’ÖNÖ`Gé*Xï,¹7YGÙP ×°@F˜ñ¬s·àŽæ15‡%3{f@ï«QøÉؔ'áRܓ^Áê¢Od8¢3ǝb¨‡£!ƒÔñ¸?ßs:7ÀM‡nª%Q½ÇÁ¥çH z¢(IgšFO)Oo©NËìQpº d]ek…bbU¾V »Êؔ² œ©ðLÈِ´E⥴)myûl!s¯¤n“¹± -„“rw‘¼e—-eo¬’Ù`;ŠŽçî(yˆg+yï(yŸC䒹WÉ;4’w2©{K©ûŒR·Â?«¼=6ò6dm—¶E*?£Ä]äí}‰;šÄM™Ûåí-enJÜά òfÐä,HwÚþ¿ÏýßKª’éŒ3³²¹ìΫó®ü«ýÛÐ-ð]ÔþÜ»Ù:8 ¾þÆ¨ T::8^MâÂ8wÐÀã H>Ù՘®ÿU·gýïéÂô~f0ê’'ŽNÕH]aÔÁLû“©'sܪ  ßw -xoÀÓuÿÕ}(Yï9.OΡcnÿ:ôïåñ´÷ Ýz­ñ½wƒ}kºßwî»Gw¬–û?µ¯ÿÝÒ¢ûk(Çxöpÿ„Q”ŸÆ•C£usvñÖß»Ã×Þq=&}〭#[G¹ÎÄÒ=±€Šn@E“D+<´C ªÇ äðÞR,8¥ÊžÉN&Šß°7!aé=ꤸR°`…ë]ïù›ò~@w5›XDˆS7¯AÌÉMÍK se¶Ò™¥Å5˜ùlf>¾>³Ö§å*••]Ì-Œ¹ó5{a¶ý8í`ë«W×ïÌ£«XV¶®ä‰Ge]ÏÁ`vÊåÕõYÖö¹ Ù®ñë:—"+[W{²?Që £<™¼]Ïu¤ê8ç.à>püÀ!gÖ:|a]»Ì†=³÷^€ÃÁ@‡%è~/èAÖá^èà -”8b?ÂÀúÒâ¡Pˆ´rpN+÷çñ€ˆ@4í᠈þ‘]tl|p'mwKÝKí~jv՞!ëd¡4À>2%ÈýÐú…{d¨ÿ]/,,Ò6¢p)Ø)â<ô1-”x©ÝX»>WƒjøÈÓ4÷xtœEtÎfHÝV¡vžj7™NDÒÊÍû|túi Âa¡ IN{¸ï“( øHü _›Gá¥ÍwÄIí«Ý'·d¦ Ü…ÀÁŒaÎ4ÉQœCÍW“ÐŒL:ÄÖÎ|c‡ô9èS›ú@ÓÍ×÷W?ܼ¼¾†ñÆÿ-Í mDíÉ$’1¢äm ‡g‰¯•£±Œu`Ê[[díÉMyPóÙS{È °2¬"¾´ªxÚ,`O}c7N'"8/¦ácøÀÁÿ’Ýcèí_4ÅՁoåô"=·p˜šŒX`Œ[/>/ú–Á¡„(ºÞ“\»©¡¡%Ä·Õ^j8/•u˜Øi¡Ö@]…¬*€õ¸Í Òj@݅Q.E{Q›ÁÜh1[“4΋å \(Ë®lˆÖ]TóeYR}'œK- Ś°-ò‹Ņ¢¢ù`(s3gDk6ŠI{Ñi´,e³9h1¢„]E—–Ü^QŽ’¥©%x‰^êŸä%{9õ²­EZÜ5¥Â–n¡§Ú/Jh -‡ïÙiôeÿO^•ù@a3î•Ý‘röHqç ÃGœíÝ.hQ(†ÏQ7×ðæäÎÛºgûelMæÝÖPmìKفjOXÄèpÏ]4öêϞ-6謱ºe¯ÀÖ&ûE÷ǎÎÌÎà£BgÚROmeŸÓ®†µh]Ž¶JaUÛrMžq-_öÀUýاôcÛ< -ÚS ´z;Z¦yv4ȄjCë̆iAS¿õì^ë33øƒ%·« ‚ùì64ú«iC{Ìg]½Ösc?Û1à6ísÃHº¿ZԔ¥Çz¢*S‘BÅs­úIEU$PÅqˆû¸Ÿñ3ïá}^ìßãÈS —Xž">¯;ûH}”à®ÁÂå,9GÑ9 åd•}ûwLIZ"tÆ#øÀcØÀGK±µôËXè]¢ŸKÜsy.oR5SÂ5K•ªeTs/ªPU{jü²+4sf(¯e¼rUKö£”«Z¿Ré[UÞ°KUþ°¡iO_©ð¦Äþn©Æ/ù¥*¿Tæ³Y¹“„2K®ÒWµ¾(öƒg<éõþ¢QòÏ]—ópká¥óúgö’½Ôc­ÒÑËX‹´šRcúúEiq×KèF«AsR…CV†°[”í^9]•CD ]–ƒ;vNj JÒb§Ÿ&OÌgÊs*œ£f‰ùɳÛüüÖË·^85˜b‡díCR/ôûD“û‰Úµüã0ãü m‹jŽz’jã â'óÚ®;Ìm…Žœùk~;Òû}GL ™h–ÂQ “œ[,D¤rªÎ)Oü6™ÎQ²ï‚Ÿ˜®'eG-CPš{Zޅƒöã"﮺š -|»u3æ(…§ØöÉƒ\¥ð•Ä´Ê]NœEmðkÞRùË`Êe¢™>å´n8MùS—ë’Ï,ÀCk˜Tá8*G-¸Î1î3)+´2FçHïãO^¤ÅG~ûåq®÷QåçÿZ-~`\ԓÿ<Úâ„öì,ia2Ësr“–šÄ–m”­AjW)rSq¸OfÕ"\E%'†—¥SÚ´.\~iœnë”Ÿ‚,%2(r(LãÙt§+¬¦võ×ÄèH†ÃÛQŸü¸Ê»‚;Ñ£ò&á(úggqsðôvæH×Rö|™ÓÂÀŠ[¬ ©m1aïE£YµšS« -õ—µtÛü1,úف²Ÿ³F=ÓÝ£e°|éO+ãSŠá”ß_¦§iñÉuÿ-µØ˜ÉÎöÒ oeù¦ó([¹tÏ,oÚÄ|i3¥miòšhîê-3ÚV֛:×`䂉 æ-¸ÓàJS7šÆ-œ1û™F+ĒõŒ®2O/S ቢÄ%<%µô:¹´§—®ÑϾ07Wqq÷V°¨„ޝZgMlÂi“Û¬º±èÂ5,rœ-]WÅqUVÕeÕ:¬BuVYfËþ@f˵›jí¤:âžzöÅÊAuÌ=µpN=昒8¦9¥žà†Ò °§–ÝSŠÝÓñþrÌ µW˜Ïó³–ÿ3Zü™£üÌQ~æ(?s”Ï×âÏågŽò3Gù™£|¾nöG/?üø_Ò{Ÿ†1÷3éãœe‚’RTg|ß!|ïÀ?øÏé#ÿ³6[|úëÃ&ö'p»…gõ+Bº•ßLý MlÂx2õMº­Gª¬ZHÒp¦ÍН„aN‡ZXW©-¤tŒÐÒ?0Á# À#„àßÎWì³ûh)§ÝéÙ^Ù}Xñ–Ö€küyÌó³ç¥ò˜ù -é æÀøý+¼ò~¼QcÁlo)L F®½ç³½ãsUþf[jS6í<1cµ¯Ù -ñÙYÎÚbƽÎ!ìÆiÁnx#¿qÉ.5ò۝š55ÍRn,5é•>K% SV&•Bì3ÙV72ß]ûÀÜv]çn8ð#P¦ÏצÅFÇnèٜdÚ.<û€˜vý4žÕ¬ApÎh y¡kÀzÿ,_óùÇçÓYçaÆ9|löܜîËrȬÁ6y1.Á¦O‹¦=°è!˜ë -¬kB¯€}´‡Ã_sB»ø.»êÌð×}/˜ü¸TüìEz°°÷ôð Ìe54dŸ÷䘸ä ëßüu áà~ëý`Àºa•÷·Í@¦˹çú­™~cs=ŸfÜ2¥‘eömâ#k>ßÉóøžZÜ£¯k:Ù4¦{ â©„&ƒ,Ít¹m-^ûÜ ¾šHl¸áD˜˜4ÞþDUŸ[u0 e¤;®omó -ê>ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£!8~³J ÀÉ%ç3BŒìɧCŒ¬üM²Úó¸žfò`×!ýGèûÀú¨ð·)OmÞÔ¶Ãyê“wa>¼ ó:«g,ùیÝ>kb[Y{ ¤·BWÖëϜ;¸k1õéò¼ü)Ï,òsîÌå¸Ç¶æ䶗¼Ÿ#w¨I¶õW|¦š14mDê:½Ô¡SýS–\Š -PUyJt)æ³Ä’úá·¨õI¨,ŽôlÁ–N1WvµS‰í,‘C ô¾k?ñ`oÃ#)¯¼ÇÊ -¥ïe$â`+«s–èóEóè ¬äœ[ͼÐ*l{Ï3櫝äMéVÍ4…iFP?ƒ°K˜”+”˝/!åzúr›E½£½,¹½J~Þ[þž -”· ¾ù½µ¾$ùèeë}éúßÌ2ÑË ôróH›O ‰Ë–›B3SxVŠÇo+2W5¾»ukaxß6y¯Šá½ä¾jMï}î(6u<ÎÝfÙL·fŒ?õœXÅ,ŸÍ8_þ4)_yãS[ƽŽ”ápáí6‡Jÿ±…×´Öòá-:Уº+Z‡EqYô{ðþȞ ±Í„!sXdA¬×<%ÿá2"s»yˆPð҆-s«¥ƒ½žó†­cå ¤ûž²sÈg+ -®mˆÿú‚ôOÒâ£*‰´xø7‡/ Ù¿è ½ð€êØûW‡L{™E—ÙEû½]UöԖ·gŸšË0û…5£;kv¢Ãù‰úÕ) Wsàô\4Z½AŽû yñ-9ü$<}È~æüë ҟÔâaÅb<¢Š˜¢Bûõ²ì)9«\Û-R®ªM®J ?/9ÂËɦ9ÆõäQ±HSï `¾¥—,ûãH™p @ą¨a”w–é1¸œy-›#l‡ -&‡åv΀ñ¨œ*)ªµP¥Ä-ó"ª„HÙÐ$BH‚ÿ ïAÊ;¥‚yÍ}oÿúÒ¿ù—ª…}0²ÞIßÔþ·*‘ûüŽ®¥š:S-Šj^)ªi¡âZiTœOŸ½?¥W(ŽÝ_j…ÚúþµoëkÛZ5ÈÕ£½Á¤:%-Φ`mWØV¿„°¹Fph põê‹ì÷·n-{bqg¶ÍÇ\šû9,kK½~bvwÕ2#ێ9’Zªp‘¯#õ;nÿÕéOjñˆÊq¤˜¢Âl˲¯ä,• FA:t…´èNXÙZ˜z­Äy“¦óœ0e…9æÆm¸ÓâbÏ]s©ç@Çg<ÕË~q—öîüìš. £ìM¸®0r8\ñ/ÂR£y˜R>ÁG›4žô1µÁOkGj±fBÌ»~˜xϖ0Ó>jÏ1ÌCO˜7 ç­#±›1Ãn^瓛²»Í>è«rÚ ãIZ¾ÉG7ñ©Ž¼xБ׈܃õ‘öäÄÀ㸇ÖYãuúæ†f$óZ¦=.·Æ–®ÊëM§Ë»b«LÖ?7÷»®oy]‹ÐD:[Þò]`«Z5½s•W¦sy[zÍÂÔi@Üö.‹æšÅý»@ææ‚Äåm £ß"orôFªÑŸ6¶/•S×A€¢3ñòÀnÈ)•Ëò¦Nv×Àp уæߺNÚûáOÛýz²_è—U2ÉÍ%ØcVï8îG<üÉ;ñ08>þŒŽ‡Pø3:þgtü_?Í÷¡EmõOˆÚ:~݁)ŒŸß´<£ž¸Ÿ¾YÖõΪ3»¥¹Ü[Uo®Ê~sÕÔÜ£U/æ-]Όf¿ËõùQÛå{7w,—â± -ŸºêÒaA,íIbnP÷yîÅ×=rÍÆy}4~¯ÊCÓ¡uÝôPÌ#q!øH\`m3¯b×WTì½óñhÀã û8],ïGyöS¹öã›æigÁ“®b8tt/§YÐÐ@é¦y¶õoÜÙ7Âú‚âõ.úäÆ~’¨Â¸¾ùÿþßÿ°ùÃÕ¹¼ÿl›å¯u);Iï#¯¥yöÅ^Úâ’½$-nŸù˜Ëè%QñŽ³sKR<4Hýe$ÁñKÚ+¶MôÀ§DHìšk!AIö#c$¬xÞPOî¹6­Ì8?õ•?{æߏ¾ô‡‰ŠŽ¯™’ø5Úͪºjjºë"cהא­gIéúÜnò}BýUºk3j>jÐ|Z\ʁË=>62e™¢¹Ücäìpš‰'­‰¹P©û\W*µ×@ùŠXD8уٮˆö®Ý²š$菮‰÷%B_¦A7s7=ɟ ´^gMÜÒÇ5k¥Y1vQÁádÿ‹´"ŸO"/rù_±ÅCNµC7Á§%Ǔ÷9ÞÍå`*ëe"k‹ÀzöÅ'Æ`%Âª1X²Ê>: -Ë\![µzÐÞÎäT—²L"s~8ÌOv§ÖÇXުŴÙO¶:~± KŠ¿³šäOÆ[!LôçiþΞ”èo™æÏb·Dæù¤è-ž6Ô.£·d•}tü»@iL†ÔF{ëb•ì'N ôóšøyMü¼&~^®‰eZ°ȘµŸÿëÃþIÍ[Byñ»»Ûoîonnn¿ÿòËVuoóì‹ß½áï‚þî›Ë‡‡ëû[ÑêO_ýøöí%´yû×fžOæi˜á§)l†q<édv6C?ÈâšôOõ¯ü þ~§?ê?þ¨?ÿ'ù÷ÿê_d(6¿ÝüÓï6/Ÿñ©ß£Bé©4¼y ê^›ß,Èå½~Ó6q¸làÿy~zÿpvsõpsw{yÿãæWjy¾½»{%cñ•Ë‹ó—7w÷/¶—Wÿ,£÷âۛW×/~}õðËÍÀÿþãßýïßi+gúÑ_ëZpí¥Cû!rՌ²Z²e‰´Kƒs¹÷rœsæÍ?^j[ˑ }҅©ßÄ|DI°’嵐MœO&‘É6ÂNÐZL¸¢xÜ Yª 3ØÄxÒËÜ\ñ±Od“‡MN&؊q2Sތó‰è¸4y:éƒÔÉìÈ¡<7Ÿt) › ¿Ml>±»!ŸÄn‡ÜÄϧ“C°>–ÆÑg6ÄÐgém’^D(݄A_ -„ œkä3DB¶Ç„Ú‹†³‘iϽ¬Â)ˆÈÚ0#Wt*™Ü8€0„\>nê¤ÕaÜŒÓ ®¨Ú 28ý,+cìOä“ðV#ēџêODÚíý͇)žŸŒš4Éé¦édìó¼é£Ìì4•ç¦“Y¸Ñ}à·x©1Íq#íå·AÇ sÁh`aHþœ|FîËþDøF,ä“Nô½Í(C)ÌRò&Ó$¬€\'Ús2ô&¦Oö1£°ž/.3?Fþ<&¼7f~.3°!ðÁ½0ß Z]4o¤SŒèF·1ž[+óúùAÖÜ$ãÛË·Éó¢®L›i” ŒòÒã 3;ϛI:Ãës²úúaÚ¤ ñ™C)ÜzÆcr† Aöj h#ƒ—„§×Õ5`OHcˆ­Þ„N>i–G™ðyƒ=ÀÅ,‹SΛ9y±“©“‘µ¯˜¬*t'Ýdy<ÊPYx\ÝiШÏÉL‹ÆŸåž&¬F©Ÿ§ˆÍÓE¬òõžãsßé?ÓÙÏ'yì2á¾y½ Ê:C–J.9Ë~‘E†8ÿl+IÞn–‰óJ²—Ʀ þX:ò¥š,ãyBkAVœh€Cí§ê’ÅÛÔjå+¼¡ÕgÕ}>®#c„Èòz½¤ŽºÀ‚,O9ÆGäPNBÝ8ɲ.›;Yo¢œ6ÕFí¹6T֟=W¨Ã‰èÁ2wÞP2Ê*hú3‚=W^Ë«•÷†VßW?ýßÿÿýãœ!_½}ñÛK9†wwo~|q÷ϔ_ßß½{c‡ÈáG~ýæúòáúå éd}Ứ_üróÿpäà‘•§Ž°*‘Nfºm;aj'Ž°©4ÄöÄIz_½8c>¾%cƒ}4ÚZ®T¤‡€ÇWVMÈ!l„ÏMY¸p/ܗ5kYäF±^Î0ë‚Õçd›jCQ›wÂl5ô¹Bí»Ùp°¡ô“Q„3ÊáÞPôÑY¨Â¸ü«3øá¼Ù›=N kO†% ¯d|…é¼^RErKë…aŽ"F–ÖãL’ù±í;'{ªu0”Aؗ7â뫎8©½LlF_¥Nw±wÖ5»º¾‘×*ïìí¬>m½%V‹0áƀïur”Ð{%çZ?YJíŽ)`³Âäó(g¼-ÁAÎZ^a¸#ÈÑØ)ööÀ,àr¸ -»êF$Œƍ%†¾“cIŽ"¼q×vÚ ǁÈSL­>/ÊÏfå Îr@ÊVŸEØÌr^ˆøaÏá°2³09#6<{y™Y„%Ñ]„ ¼B–'œyÊé%TÑ®ôÔÉò „"9Ý0°"‚ õ³ ¨°–.Œå9¡Žƒô.‡$ °ìO´‹„S73ž[Êþ1„MÓIÒw줇×K*>Ç·|p¹Ø°Œa†¸²¼ü|åƒ-šb­$’°‰¦‘B°¾ì±B•Ù–aØx; ƒ%Ûí9¨rÂñ!¬ÙρzH -"ò“±}ÊţΠãJdAþ¨“E´†ù…'Ԍ9ۅ¯fƒægN+E•YDöÜT”×Lqy@R!j(¢}Ì},2YK ŒŸ€eªdw‡€Oè1Wå…e®i9R'H2É'aı$‹³“ãDf ÇfŸša:™«MÍ6,O¤‰6»¬¼„»¹9g¹ úš€gÀ`wÐ0¦!Ðµä8O²ÕÀ£sחý$?“¼¢(ÅA4 yUIᩛ¹ÓX/ÖýcºWl®R‘Š*b¦|ÒC¹÷Âϑ*§R|­ŒSS+2Sß´åëӞt² G%­iKÄÙI¶QÓ©QìQ;¯èà­¿´F?s˜x“ú1Ï9bq²¨Ù"Çc`;Y s\PDÌ˃O“±×rÜ4Ééñ«Ú«QìÑp2«o+ʁ ´YӘS–½:Ù_ÏóOXk3²o8F¢&‡,=¿^Rš±ë‚÷ˆ×Q¢u#`Y‚s)d ªÕ¦¬3ì 9Áú»*‹O©AÖ @ØÞÐ`_åýÁv}y-¯V^¼4´þ¾÷HzŸdà‚ÚÁTÕ´ÀýD¡p{”‹Üi1hõ£Ho¢Â- ZlE›Ý ¥ê‡¬¦bЂ˜+ëm\´ÐÚ<ÂD`-ðRöW,Z=-%ÂC-²SðÄbҒÏ?iÝMZ òB ‹V?Œs±hý†AÆ X´È1ó ‹+ìWfСÒMÓì­R¡±g£Ž#NJ{otaâéݞÕ²ò<-íY ¦,'B±g¹ìPìYØv,íY`Í87hÉ΂AßíYØiPOæ,ِ³R¬YÂòē€Æ,ù1Œxç֖Fºj̒6Bx̖%¼¶0e‰¨žä¤qK̤Y¡²äüðR ;V¯âG5da »,bd1dIÿ'ðS, Y½t͍V Y½¬Þ¸vÑè„s/ Y=4ã4» Gm—åÊ«œ‹zaÇ¡Fɸر¤g9ÂeG;ÖÞVÛ?æÔԏK;–S‹ -‹#c1™‰ª˜`raƹ6L¹Öéa6…­¯4R ãR¥š ÊÛ)VªÒÙ–åoTk•/)í¬?mÉÎEŠ—¶¬J5øf˜£Û¨D`EˆÚ¼4eç"¢ª©ÖiǵBhMK•j¨ÚÙ¨j­)ËßÊk•×övV_÷¿•%댆 1´yçLq•Y¶ú„#Æ]rà^+„^ ÂàT1c6T”Qz›™;8dàû™v„ÌZŠN*+sç…ù&`RŠtW ¢±p›Ê)/ÞON0¿„}5Úh5ü“°õœÍëQóŒÜü`Tl“nÂ{ÊÑ',I5 -2°ŒÚ(ûÂ,ê 8¼Wô!Ä®RK)ƒºo„HZ\qbˆe&°Jæ)úĨÖe:6ðפöq‘¦J±1„²i­8ÀÑ4¥?—ݐ>«Nщh»©Í@ãz…b–óŠõ›Jc{_ùÊH¸,þ¸òúAí!‡/n?Ô °àÅï7ÆÉxæø“³]dH°… -Åôœ¬Jo­(Œ)Cw¬mUJ×°¡J–¡0W…U ýØôZ(WeRùvµ^ùokïKß#}5¼K\K5ìÉ:ÝÅI ¿B7®]¼Ô½O0H¬ÜÔ´YóÑâ€_Ñeç”ÛEæä±,²â©âXÖ§yª²ôT׊Å=pW„–R³Ê*Ó[ß4μ.Út-‡é¸»z€(‹!^¯È8¼‡©:¬ýŒ-^d',Öµ^ñG׶*Å:]:®yÓDàAȦ=¯tZKßuSÏ?ÀÛZéOæ¾G¶‘Wš§“‹æé¶È¢yb™Ð„³Ð<Á^Dg\ó„~&2çìš'l4º-TO7"ÕÓmE§„U<ÁºP=¡Ov‚ -ÛdQ<ËÏ ½³]í„Ù¦.W&é p-´N˜Î҈·óŠ>|EëÜЖ«I#K­³’‹ªH;íE™Ä?èÐ_j´3A¿©ûÂ/½1§,´À†lêbm¬¨”µ×…îY_¯Vô/óÆÖßzÜþI¦ù1âVpø«_¯ÈàHô<ŽÅ©9©F‚ÝÖAìqŠÛçigm*B €±6æëÕ‹‘g˜)Æ¢É©%lnjz-·î›sÕ+ú'xcëoý }ã6ð4¨zØa« ÊȜ:e ”9†@ãú@÷C@^,°û” ·Ž2;ZEV ½f°ó½òVWuÁ ;À?,ÝÓ4萍>Sájö!ˆ£O”t2q½"èÊûöÔUã8s¯s&_¬öQ“>šfØ&„ûÐ茖+ëf„€>D^èáË¥S.“7ú‰è'úíáfw|¨è‡r–$zï*BŒC¯Ns$‹ì/ò(WU”ÉÔc‰jÏÏÀ)•;´5ase…ÀN¸~F‰Á½lù˜Q¡QòâišÕ]G»<,yà ž'ªS®]÷k¡ðvY§&Ù^?ŒnÉý±¯:°)ÀZ"i,ÐïJ.V -,£ÖŸ„ jÁÓT ¶f‚"Žšz¬mS…`]ڃ… \[ôl­=ÍaÛ¼™×ó·÷¶ÖŸù -’C¸@ƒÔ’N>€pú±W$C.óEB<é†â‚ÁúÊŒ½0ÞPu…u -~Á®<¥t¢|Ù7â$VZm!LÂéŽE®Ø ¨6 ±?ŠºÑȐðaá֊i.@ÉY»à -U Ǽ!ӊ N©*˜¬Pz"©Ê•œB‘SÍÏ' Ð‡)›@a˜y!i'×ÀШï;•÷•h§¹³O-çiAVc%Ž+å{ؙ66·Jøߊ€~êlS ‰NMßr§†ªà½rµw4 -ÀÓA4£N‰nhðØ öIšSýIe.©?¡y³4Ú§.,iS›’Qu^šÊFK£YûiP@E°Z¬8Øޔ¯;’ê)̀¾È[¬ûË~ŸÛ`y·‡O¢ÕîõŠ,ÇO¦ÙE䘚=ðò.<>F~e¡ØæO`¬µ¢œe±mÊ~­°#n\ë7M30DÁtWû3Š=è/æýå½±õW6^AY¿ô¿aåó({½"ÏjBü†ž;(â€e9 -ÏsŠ6zE%5eóqјS¬WÔÈI%àÚÜ»0´Ö^ Å-¯W+ú'xcëomÆA¦gŽ8—E$óõ’ŒvRîZ5Ë`Ba9L™('8èˆ_¨õF¤ M[N)Ú£N†¨D×Ai €H1¥OûÙ8GyµR«~Tihï3ëÀæ+"^æTO¡xˆòÉYq‰"¼©y‰’9¬²YC¡?‚ÝÆúB&tm˜¦ÚXC±^íQ'ó¦i n‰Û^rU^Ø^Ï+ú'XcûßڌC€KzP´–è?ŵçdØô ÃCvÓ +£t´HS¥\é%Æij+Α›ÆœRzuaÂÈf© We —wjsZ”—+Õêg•–ö>ô'38ª‡I# vÇy61ïlA»ã˜š"Yî«GÈî(€w¨ -tI9âØô˜hñ6Èû BÑ@>ļC@…,å˜wŒ™z^ èuCt’Þin§±¢Þ)1ê¯ÀÞÁtü†½ãûÈrÜ;Lq×þ8® ŽP¡[Bß¡ U‚hÎSðZÇ£;åÊÇ'CSÑ íM[…R:u…ÊÈù ²Ú–ô5$J¥ÓBqù1Ž¡­çŸUšZçqÕÿ³ààéžïZɊ:)s,1YKsE¦;Å,"†`o*Ƚ6åëҞt²üS6M[ÉÌѵÓԚ­ý弞¿¾·µþΆÛÁxjE„ù"2€Â•%4»'2>‹ €²ÔD™–àºÁ<:2Ҝ†¡†8ÅD#¨õ -ò»ä e‘Ém!S{ŒåNÕk,HL¶ -è%W¿ª"ü‰ Z)Ìþ¨“Eꆜk”@Kx”€SLr²(Z±€ÿ‡d€‰J) ºŒÜŸ#]‚:¡ÂTƒ6šêû– ¸FÔ0W‚àñɼçTt¡”4jL N€H ö`4)ah¾ª1&èM:%€yèû>×0œ5ÈwT$+‹€v?å&N§_bõî[¢ €³Ù#ìäõŠ,*.åv4>¿|nB -Á× Ñýµš4-9ź´'Ü}º´PØІ'8Å-ïV+úû{cëm”†‚žŽmì=Š´€ûìØ ôá4”ØFÈT2,dxcØa¨½Å5pSњƜ²ìÕÉþzޘÂú[›q(Hz,¥4º ½’…¹ëâ |‘O:"Î xß)γò¯K@m¬R¬×«²Ü›­¦6ÖÙçÕ^b<À_Ï+ú'”Æö¾õ=Bóg XBâJ܀#âà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q^eˆs¢„G8"® 'hqOàˆ¸PPqQ°@ÄyDCâJD#â<¤`ˆó˜‚‚‡+A‡+aK4\‰+p8\ ,p4\ -X‚áJlcáJpCáJtÁ çá…óø‡Ây€Á -ç…óƒê~/1K(\ 2p$œG8Îà –H83p$œ8nwp؉„kÈ_sh¿ÜJÀ灵^‰%¨mUJ LkȆ`óÆåV:]¢áüåšzþ¥­½/]žç/Ñp Ù0læ_Pn °ÃyÌ@­fQMCNi‘i Ù lµ-C¹Õ.[0œ¿˜×òW÷†ÖßxLg­îNØù„yû’“a­H* Å¬¯4KOîٙQ̺€c`HmEaa!Lm[N±N«aBɲÉÚS¼1š^[¡¡¾]©W? ´µ÷¥Íù$Í}z‹šbu$0‚×+r¯ÁI°ùˆlu⺠z‹H¡RÜØcš™WÄÙ9…¶1§X¯WÅRhä ÁMcr@l{5Š=ê¯çý¼±õ·¶£ú :+ܕ]Rõ%¦¹H³• sӊã¸{ª±3Àa¡˜&WÒ¨xEF(Æ©i¬R¬Wcú… Å-ïV+úgycëý©$dðÔɒúôŽt©ÔÁð.†Ýk\ ²^I -ÁT€[ÑR[Û®ŸÛ¶œb}º6id8kÕ¨!mŸ›N`OúËy½òþÞÔê3šJCOG½Ić”ˆíd˜µ¢ -ijRD®'$QÆfæ 1Š}³+mÅΌMµ1§X¯þ¨‘eµ1¡ˆv>6½ŠÏ…¾^­èŸà­¿õ³ÂÀ,uøüþõ’šKjˆÉŒ– ’Õ Œk*ń‘±d[ôŠ"œ!TӘS¬S·÷(Y†ŽùñjcC§!Sµ×B¹*﫯W+ÚÔ¶VZGðsFȽ'ðí3ú7sIí¶€vâF UAvËgw©ÏØ Ïê®;#V%WT7,3¨;arhvm1ݲ-„i¤ -éFÖNàŒÑ=!-!Þ- ;2]öXñÜ0ÖÒ©\àÜðŽ}·@sÃÞüD»‘¸ÌP±ÜÈ|*œ-”[úӈ†‚äžLGq ÷Üì$-Ž;­æ -ãN³lê*Š›’6˜ÞÄ S²¡Æ ÄÝ+в¯ nb€`±\‚¸:ËËF_#„9Êæý7ó{6Ï 8ñp-‚»RͨŽ„›)7¸lÄӇ=üv‚{ƧBMòŠÙҝ²¡Jh¡Ô•jëڐ¡²k-z»¾V©æ/n í}ß{@Ÿ†Pet°aÝvrnÏÈ¢#?ä6|ü¹nÃà nTpÛÂàå܌¶Í|@d- ->*2µgí̱ØØÈd[¶üÌШB HØÀ°εÆj‡–ÔU€v·Bfw’ ´4W‘=@ÝY㱡½W,ö`oRÖȇeReíbŒŠí/D¤ãÂXAØ£µ²€`‚ƒ„hãëØk`"0¾Kè5Vj犼Fœ—¼ÆŠc4ñx²±Ã]c€hI*°k¦(Žq…ºæ{f26Ð5 ׬V0×9a¹î™jU\×ÅY ×ûËu;€w˜®âºR %ÍdR ¸:3ÙmL©Ï«!ž ›j;•ÐBŸ+Õ Òµ!CQ×þZ´µ¿•ëk[;{_W¿†¾ã -h]©mVuO#¨!­1Ö"ä2²¦B¬å|žÚfœ°XjD—†5mÝ-ÁÕöN…X_ښÙû¶úفñØ Äùõ‚Z Ð؂¸üÓÑÒa´d™ T5ls}njáàƒèåíÂß\©†ƒ.íPÚ;káÔþJ¥’Iidýiõ«‘~‹ÉPêJ5ð3´oaÓýÄ0­D´@L¯6ªW§6ä„Î\©{® 2ºö×"¨ëk•jþ⥡õ÷ÕO‡ -~úxº ÚYö‹æá,€hǘ_uœƧ¡±^MD¡.6l', ̕jPgoÈÀÐÞ] ™ö—*•Ê—”FV_vÌÁÿÀ\â He%$}{Êe))çxNy\!*ábï§T©Ùº™ÞZrÂÛèԂô† -LÒû[À)ë{r}÷ÒÔþGþ4:Í'eý8ú"ãæùW·nÀÁ_—zu­ï󛻫ÿùúGë!v›ç¿¿¾4XüØtô1Þ³ó7/~(]{¯oî¯ÿ|sýy­WoLó6òþ7×oۗ9Zý7×ß=¼)¸¸¿»}xoíoïÞìUpï‰FõèwþýõÍ÷?<<õC÷—·Ggöü™Þít~ûÒvð²§ÿtóçk\õÄ¿©æ1Zq¾aV"ÏtʪrLKÖ¿7=ÜüCo|*]–*~kѯ^ØädÁß´m¦.›ø«ÞùD¹œ'³£Ž¸H ZNî‡N/ïÊåÝã2yNԘmäŽ=û<¨kAÖxv€ òÍn_#_J‚£µ |äAÕoàžØ|.¦áØ rM¨X;•„z ¯–£BVôèÞ É5`z”ã]T3:{D¦ó{'L•ôît³]ÏÁp! L B¦O(ØøXGê¡’£õ1tJÈ!ÍJCý:½i (€"mÍàízþRÏCÎeý69Õç˜Óbæ̊”̳ôç‰y Dš•okÉãÔëƒaœ•9+9µ c£Á°y4¢e¡rx@ §€õ¢…Ç%U6Çq*³‡”ô©ïy [Ô`w|’‡Pù¢ŽßÊ»‹ÈæµFv¯I3Ì¢Zßé"*L]³Ä‰¦•‚‡JL“ÅŸ3NJš‰“J&g5ÏÖkê&¦öuo“~FßلM½ d†`’bA]p!ÕGGjÂ=îÍ͔>1·1•Ùz)!!Òí1·¦ ªq„Õ›†>$µ¡wŒž×8Ð H úr#V Ù`ÿè&‹£ƒ™ÐÑnWVPŸ)è ‡œ54˜fåFÏ!Qï)·é‚´¶4Àb,”¨?rkfÛ<¤Lþ²À†Î*FVË}V¡NQãšGRbð« 2ÌU4p…ÒÄدÀµ!Jê@|î‰ÄâŸ`íÜù“#²Íð~MíÅ wêÈÌ~0òaí!#ê䱅îò&8b; Ôp;ê~°‡94υ)ŸS´uxåˆÔJ‘ã&ýyt·<¼Þ1cÂx“9ËÛÍ£¥ÀwäHfœË2SF ½…1˜ IO3Ó­X˜XÁԎ'©]àd\" 0õ,C#îmë-yS߄‘qÐ@MŠiJÒ,Û!N³:ÌÓ{:F#MäÔ¡ ü0R:gø\àr‚P];° 뻣y%k-D²ôFf Æ ç©ˆLî9fž9k¢;°Iü<ù˜t–Ô`‰r17e`mzoøªÌύ`F1ÅÔh"STtFBh{š•‡ÛçõÚ_JºBiš{Þâ5¹Bëò/ Ì¡ó<ž bóMÀD2™ŸhBà9Ê7BC ´uidcÌ)½ñPF¥-þ\ízT*Á–º’S6 Ö7•5EÀ8´1â†Ò•Í^:Ô«“‡ Ò|‘å ½Â¸\™¨zÅ!œöoô>Ò= ˆÛ‘€‹c+·O)3“|ʳ ±ÙðÎ=%dÙ -ažk¸”šò·FhºQ×öŒ½:•˜‘|QNjå(˜ç,ӓq"ÏêÞËÒlW,LHè7cH˜ÔÎêd‹§§ßžfç1r§(«e•"q2Æ?¸·Ô s,ãV1He?œ¨SP6æâĜmM€©‘€# ­ÓÍ=fML"FywÝl[0‹“ÛêkëmOHe/â”~œ ¬.“^±-012âÞÆQ5}ÖlãÓTïˆú0Xwê–á—Œ_ìI{VFÊ8F…ñážÞ&«ÁÀ‹RÑåé?0Õ&®?в!x»ä8z(úÄÄe¤’_Ð!à«7y -n±^ùµ='L/ã,ÊvZÂ×Ò{‡ÐN•LøTÂUQôÜ-ÕpÏ÷b´DDH)#ìVX»òؔp–Ìú2DÉC<‚m²„ üǀò8‰©Óˆ„z&œtàÑÍϲâ'>ÕûÑ ù9%m‹ÔÄxaĦ©ò‘f°•A÷júÀp!$¿gqCósÖt‘VôŠˆÛ<"£Ú#@c#¯œÍª–/")¨0<{Í õaá#ªy¢av !Ìz­LîdPñ\ç—! ¾°“mÃFIŸ£¦#rU>‡Y -£ž•öyòZr2ƒ¥t˜!fáu´Î+Ó”‹`ƒçÔzº1!*E5½Í¼m ›Év‚¤œy¦Ò¯âÏñí§¹|Π‡ Ñò'DøžA誼žt!³s´MAÖ8®ˆ`JlpȄ1kN¬]ó9Ú±/É©˜JS]¨dr#C!x[#Þí99û0¸Ô'‚¡O‘| y¼%)dã ½šb¯Ü°ÈUº4kb®!荖" hV鞇j§*?F„Ž§+> àÅÄÿÏúNœÔéç›ëu+ð Ps0xŒÖ¦cÄ9gsˆ˜G=Cz­’½efb¸º".ð4‚ö&û›§ WAbÄ1F¶”K*ÜæÐʒ¼.J n{᎟Àɨ0Ïǒ á¦öÞ´4+mª™¿; Aª½˜ÏQ€òü¹k,W€L4^sfä¾!{”ForZìôuaÄÅû’s̚ˆmÀ«Á§t0E䜐‚Œ^ÆN[Fà ‡¨1ÃàHýçx嚃…€ƒÊ Š´Ø0 䒰T–Üò´S53Ÿ±Ö@ÂÀ$hGN²&C€Ýa!C5ÅOP e‰Sâ©lû ìÔlj$ã-&Þ‚¥ŽX9Ûôg[Ð&^y%SsŠ5 x#Çݶ ªñLq+Pq$••9Ìͦ9ôFRÕç)Êe d4£VfÆQ†AÁ¤8|€Ú¶PCQਯ€@–xNä> 9ÐÔþŒˆLŠfp‚þ¡W5L )6 óÜM†™+]µ+šŒ°™r4”%6OCŠ[aƒ.L¢Ç£…¦ïû™a˙ŠQ<«gÈ4fz®µ»ÙC:â?2©X’0ɊBŠûyT˧±Íê4@âmåüxOjq jú˜¨·;5šf]5€Tdº^G¸1©WÀýë¯Æ -…G–Ç '³²rpOÄ癅 «pœ™:Q3­øÚe‹¢VæÚ :+À’^<Ö3ˆ ·CÍõ1Jf¾‚&|ã  Å\‚Eß3G=ù†±h,e*=f}AÔbÒÄF F,ð•«*òÓDsjЫ—8u#¼-"ic.«©„’峁¹“1Q0I•3LGK€Â„¾X¿HnÊ¡Äñ8a©'¶ì9Ès0¸¨NŒ ™°EªŸ(yªCú骻y¾,Õ!4òh”Y󌌾MØÇ<–„$vqEœéôÈV;%3õótÐO Y%{œôÔWFz?5š–3¤Í»Yƒ)ؖv -Ã+ -ø ‹Ãúiìõ¢¾ôä£ ÒÅtôÖbäØbvÓDMʘ;4§¦Ó¡× ¾äú¨G3³¾/â/é¢âR)¯Ú£ÀôÏ&›$Íî2Làь©óìêŸ!ÖÔ°Á6#³£¦x éc¼‘{74<76V„7ê½(8FF›Ê -¥a êcffØ^5D{]ÌèijÉQ^D¾$ΊÛ×Ul[)58}®4¹ -ØXHú¨ð? Ÿ¤š”Ùo´§úF堎 æKMÂ-CP×EV3ÁˆÜËúÞ÷4CÎþÙc½[7…³~R¯ËU±¹)›ì*‚:¥h!ÄÕÅ ô–‚‡–Pr̝’iUcÅ!ªÏ9©…«d…»9.:ÐP­ÅÈG†BÏćᾃIÃya_°³ %ËmË+3™c ¦?ºî! 2b·ÌÙm›cç˜QG£ öf,‡±g5®W¥6Ý1qB“zÓdöÙb^g“µxܧhö¹~ö# n™’>Õ²„á‰I'š¾±Û³%3Ÿ *è§bÀŽº –N(Áb`†©Ž6]šÖª/p0ó¤€ÕÌwf¾bû9¼9~öÝ1P1‘U£ڙs¹´8ªÌǦºzàƒ€=vŽ–B¤×<°³1ìé8ê®ajYý:$ïÓê:5;a]SižyeçÌà\š„•s¶ÿ ¬a ö½ûN8ÇgÓÛH€UéRID*Lð¦A›dCvÓn˜F¦á„¾ÙW ScrçN?«e6§ CD’lÕ“b²Á¾EâF¥šÆ /I#ŸÇ¸(ü™»Ï¶?®om‹¼áÀI†ïŒÉpw%c¿ýÊ4d%†ä„Æ0Hm§V58ÍFM’0ρ5û÷ÀÛ;#‘6Ð%ÀF‡™W½ÑÀ#œH4•ÞæŽéøvFÝp(|VÔíÈÂ=¡õ“@FÆU4 v¼¤ ÂvžÎù²øýš§òhW#¥4ߤP;ƒdŌR~$ÃvA€Æj¬CˆW¸ìhfЕˆ"ù¤ÜîIÑXƒId Jí™ ÊŽR¤ì€íT ¼¹  žvD‘xll‡Û`TaŽÝÁªQ|Qö~=p͉‰ØàŸèx¡Å|Ü€ßæ L>Ê:BÈÌ\zP 9OÙä%¨7}t“ ¨€|á“Aî­.ÑSFOA -øúY­êõ)L3ü¸Gëšö8™¾Qaš™cœÕçK§R‚º{‡ÑÚÄ Ô­J[0S+L§J{eV -Pj¯0ƒðõ¨Öa·E¨ ЬìÂÉ>iµ4ñ/êšÇ§RéÑ ÎúdŠr¶tQ4ˆAÈαá^ç}W}ÐtªXcsÇ,£zõζ ÉI§¹… GÚÜ@&£¡éR'+E„àLJòµ@LB¯õè˜#…—3Bò‡ïl_hôðô±èË%YÓKâHØÁ 0íi4ñ·}ã̞&›5֌¸'aw0é)çïu—ðVD{Žga -õ¹R -¨½4314¯jjgž²©Ñt˜ª¬>1¨w’K -· 3Õü€ð½^ß]d3óÒ.J&mÁ*ÀŠÜÀ¨… bט W«!Édê¨ØÁÛFóRøwn§Cì<¹È(«†f:ފ=¨•?—u" ä` ©0 j”³Zôì!û?Z­ðäܓó“¸SÍÞ©w+ª]Ètö£‰CAE˜R‡™Šh:žh?C+ô±(´^±@ˆà1-ŠåhбŸmƒêµ¤"ùŠÕ»åÜ1ç:ðJíwDYd®L¸(à“ç6çêgà Z4Çý/ wšè;ë㮩®} raê¬y5N*‚“‘YcÖÇCvÆm°ð̺֘:4Œ¨„ø¤¬ŠÊhŽµ$3`,ÖðšPŒ³^'9âdš'ùå= à{ F6é8²:Ùw‚j¾ÆYý¿ƒ¹1Ó¬Ž=žU½¾&³Õã±ÎgþÄn¤7Hoº`Æ™È ÊiêͶY!`aoïÊr±*nªÝuj{ -ƒ"Ë@ Ä‰Qq‰=‰ôäó1ø®˜ -"i´'M` ÌÍc<Öa^×ô9"˜šM„qÍ6Nà ¢Ç +œªà"ϼ›JýMZÎ8ô\÷þރ³Œ^)ZšL͂DÅEˆÏ±É˜Ic:\¬aRo7E$Ük ¨¦YNXíõúÉzdͤÚTɑ slŠT-­?ó"öÜC#?‡Ž¦Î¹AW0:Ê¯ñDw¢Âò&Ãaå¹ ®”`Œ`´4©¥"£ À!)Y̚üŠ*U +Ó¡;¨~ÁŸåp@îð¸žQµÇâ£1Rlš˜S®W¼÷è&ÊQm§ãÂB9ªi£a´aëc`$#ÙÀ )BBnŒŒ ÊZ'„¬gžÂ¸¡Í’9ü[8xU3ÖÏ3QrElI\´e¨ -½¥F’-Ù;vö¶„{MÏH• ŸF"O}ÜZ];£Lœ‡ÖƄþ}Ù Pv38£¦E†R;bXõ.Z:"c -¬@ë`§nëúAq†îdüP$!y–7nÃN-êö–3áÈQ~ô­Ì«Âp_#;ù×I=JÀRäâí2ÌU±@Ø)‘1°^ñgõÛèq‡hnŽò¬þ3`Y±d‡IÁ”Ld -ÿãK¨àGb˜žÄ¤á>?: ó¨2 ¹M•iéSS³ŒÌr§ÀVxZiŒ,L.¡Î€f⸽lp5pCð¿M.zá9ˆ Õ×Ó!Q¢F QFÉ,‡Øš]lƒÖÖÄÃ?™Yۜ'^2¹ì?»• àÄ:ÕqèGÆt@ ½ž÷ˆ¥D)NcÚÀs§¨4auŠF¦l"/:Ýoúm¼/»9ªÀ¸Ý' ü§(»Þ¯ü"  vô%ÂmÇ2£>‡ -øü1@͖¼é ¦`N9 tùéblLŠÃŠAÁmD»AÈaÚrì£#&¸ßíó²â% ÞP—(Ð@d;  $1bopeƒæəzƒXƒ0+AQ9SPÔÔ«¬kϵ\#]=¯H#61΋çȶØrÅmNÊDÙä>R-H’Á()©‰&Ûe‚ýÅrà”ÔÒ9uz†`‚©œÞ]'5 Mõ?ÎŒ3…)ˆòl'·~o¼&xç¤ê?~¦zà€O’"³»zŸXgÊ~g·¦¬Bx^FûBœÕÐa¢¦92&³`êe†96ˆ±$¼yFE˜‹ÊbÀ\èÁà ^è<‹ÀApsx(r;ŒŠ:Úɝ'«boS½êéò ÄFÿ@ñ+À|UTj°àíÇçǜ(™"×!ÑêÅí602X`qnÜåuù+;SOòŒt·ÀY0Ü;ºh3¨ûs2ô¤§Ã”‹Äˆý¦3ëDé•ÔÔ*‰…ƒû^H8`ÊÕ¢ámM’£÷³ÁÚÄËoÕçG³°|Kfv®?q¨M—ræ²ÐmVwOèPe}ï e‚Êæ!ÊßÑ {bbµ× -7ûŗ÷2÷¿Ü<ÿÃÃýÍí÷›_l·§WWï^ÿþîá•×qfå’ˆ£YTi2x]ȊSè»"k%Ë0Ñ@›2„Þ³Ô5ð"šàF»V R&ëƒHZR: û¡ƒ­ú õÒ'f½ïëýyLN9Dª…b"Ǥx˜Z&šÁÒ±¨Þe~°IC¿vå9Õ99FBÍ«/ϼ%¦W¤ ݁ap­7 Æ°SMÁ]*fÌÞâ«';=XA&؇Æü¤ Òkˆ -(äX®ïiWV÷§T(a@ö3Póà0.óʳ"ÀáÊ$Ú¹h“I;w\wÖKÏgR-ÙÊAèmn‰ÕÁsãësôÇ3«â¨Ï] 0–$$þÌÓؾ.h‚„ÕþŔӰ¢¤bÛóßÅaV1&EeÆ˘ÎDm‚¼Î4€/7ÇPàÄ˃ª‹Ü¢€ë¥ìÞ©üì£Ò‹] ϞÔË8Y»Ë”n3žu;ׁ'Dw& ƒâ×4<>™c¶c.È7«?7ÉɸaÖ ¬cêE3-á*2e:SךÔiÒ‰Ù¿„ˆˆ4Tã\Òÿ¡<B½kkŒ¬ÀÙÇ»1Ê)!@×c;@÷Nv’Ûcà‘cÕ^ˆcB˜‘W\Ád% ÃêA̾.+"€ô¬¬‘s@«›KÍ4O óT+᱗N¤ õ%CjéáÚigàô#ûÑ@M5îíÜÅõ£ - ­óOþÊp.{24CMZ®?ÊÌ -:ÔKӐˆBXÃy@‚ nÙ ”Ïeá9Èp2MÞ_V,uÑèÁ4#™ðiñ!]3Bþ®žèñV -i›* ^ëÚ,@¼¦ó<ê‚ÕîÆ`ݍ -!ó­Få5$À‰9¢b€@ŌCã!b‰Õ0 -%µ%Z` ÊÍäs©X{flŨw§nxõÙÏ"?R®·§Œh–C| M&¸[DïëéÍãÞ7¡4sÅA#e´Zˆ -žH† ®„Y16öœQsTÿÀ@Ÿ„4Oô¶.K¸>f¿Ä˜¸~äñê (†\ª°ðC\d8” !‡=Ò÷<œë€pýM=#óh²£ÿ.©¤W#e¸æ³N@dYtJNÇ ;ö0g•sa«ÃtßnÙ\}IW X°ÿfÚÍweª5„¿cT1¾³ ƒ>¥;‡ rVo»¸oÈê™çg a~`<¥J̟’ý‚Ç<Æ| "•øt¢âg8@á¨'3g<•¶3Ömƒ±†£1¥X}ð W&€bԀ©YSŽTÕs­HÆnTØÄ8ʨ¸Ì~6^ïˆ[x`‡,a¼ ¨ kts¦>q„é`xCV$7¯!©",SG³‚IÁÄÐKÞÓZŒxNå­?Äó¤þîAÁˆYW )üΐվFJöSï1²ÎÍzM6‘ö”spÜ蝈±×ÓÞ¡%F„?œÐBbîwå”ÐüɄÆ`*kÀŸ¬gª·Möz †Ù"²' W( „3ÃØ ‚Ëü´¡Cã 8§ý:Š ÁüŒ”ÇA -b˜lò̍I6Ðk2î¼haÿÀ)ÆiiÆ'¬Ä¬ n^# 9Z¬?Fä9¨~41wCTÄq-½†=•4\%šÑH~” >£e°–<ŦnЀËQ£nX Ǎ·¼çΌ½1µf~øtà8ÂK‘Ó!€ÀÐ.àÛÁÍj ŽZK㢃Éà1ÕîÈ̐£p˜<’8h¨ýX.K ù ñ¼¡Ê‚å¦ÐÇ ³YdžŠz snŽ4TF0û“?ÇöD’@hY*Ñ°&:üÜtg·‡‡bv¤Ù…“YÚæzÎ -.5 '¨™`„°@bÔÃ;”Øމ‘ @:¹E†B æðç2ˆW½AÜHàúîU¤ñçhf@dâha!|ˆô£þLP@°@pz]ÐJT†Q,Ó áeÅçâsÎ0)k¼&Ù7£‰FÃ÷v„ç·Ç`. -81´3ٕJH`؆yª!Ñ£5f»¾· cA3‡ø×é]5³¾n_®x -º†Áê£rL,}“ß&]æ`fš Z¦rbb+ÄU:OÔhs0›s1›×7Œ+¢Š¾éšuin%*ØO³¾e§öÝl™½f…õ@°nCŒ¸ÄeQ„ad:d›ºµÈþh`Ò -§!ÙréÉRââu¬“zQyb¥X²ƒuŸšËÁŽ€N¿æAF2Á¼ézÕßÉÄ8à˜b+5‰À¸ƒ@µô´#£õXtèÅF=BëÔá÷î,,¼ ×ÛèDð#cèëœ4ß?š7]‚›N%Œ -VXsñ‘`Ž¿Î]ÎZmN6,M[ï êÕôçþBŠåÅo€ZXÔ°üÁ%ÔÐìí¡ - ³¡Q³…bþÿì½[¯.IržwO`þú” 4T•••Yy)mÓ°ìM’%Á0tOKƒÝ##üïý½‡ˆÌüÖnñ =€.x3Ó+vU}ǔŒxã ¦1ŽÅf4`¤ÁqR^–.ÝkM¶—ĝîÎ0´Œé¦?ô|r+ì$¥„x§ÃðÔm7[‰ÍÇÿxŽ‡@ƒ=Áž[Wìç=úîr³qH&‡ò"֋§áX$fi}‚ºŒ°+^À'êÝÀ -‚ûñ”5Cü8Nð˜ÜA<¬Ç­ái€Ï÷ì~ìåR–\©Cqåf*‡Çïõs¼_—RVèøXôO€Á›t AsôÔ{ à)\Áä!’QÎÆ}ETŒ>!­øñ¬8Z -íº_,üÍ"»ä×:\&«•–¼FüM8äpŽ31UvXdbk6ÀܸòA¼óâðçË`Lª -ñfJk€¼  ä˜Â‹Ì9áIygÖü‹§F¿Çó>÷«Õã²` Çø¸¤<÷㭆3+ép:8ë2‹ê1¡—ÖÀ”¦âÊ*ÿ30©¼¿ -zXýà 4¢ f-ŽF,Î`pCE¬Ÿn‹Ø[§ÆV1ÍI1Ôò᣶hŒ™„óûÊ>õøƒëÖåF©¢ӕ¬ö³ô-´“Mo–°Œ –9L„Á—x:ž¢Bw~Ç­RT¹;OÐ*Ã⁢{’"gs¹SQ¥|鱺 -B¨gΆ=¤zp%ÞcZe™1&Ìn= ‰%S-þXq܈tޏJàXÕKw©»^’ÛLAŠÜÎæÇÁÕµ0ŠÅeåñ÷¹VL„­¨‰A7' É]^Õ× 0QZËTËP'‚/ˆ †Lú ›*舟ögQq¤àèr޴̪”.¡DcÍÆãw×óK•2¨'‚vTÃM8äAÛqÏÅèáêƒÃC#Tê| -¨{ålýø:Ž­Rà”PÃVZøi3¶Š Q•ù†>õ/Ä#‰ ò¨”z ‡×ud5\&¡P£æ=r8Îåþ£j‡7¤"óìÂd~úâì2¡DˆùÛA™a¡Ñ»Ûôå›;fÿã/r¶ÿ1Gûï†þ|ü$êØTH·ñõBüãÒTEøc•IT\éÇ×P‚3àÇh}Ë#›} Ÿª•}Œuùs=I>ÆÒń>Æ 랍{ 2‘‡ÆãoœmPñ7 -»6ê1w’KÀ°ŽÜqÜ¥voÄcH+!^à1b¹ˆw|C`†ÏwÁCû}Ö+iǨ=¤¡ ¥Z·µÃŽW+1¾èÚ -Mt¢ŽëeÄîF:®bÒ1˜ütIt\‹ßIÇÌô 8Ë@–‚8IŽoÏ´èrPa…Ì9f¾ž“sŒ0F„sŒH*“rÌfNOcªÊóÆ8†€(“@ß…&à˜·7¼1cLº1Sž{o Þv¶1º'‘ãa´1d›ӈFca'æÄJ6Mk‚›ùßÉ5n*™Û©ÆX+\÷dw¸UíI¤1¦éã|s6¿Çä³\í<çÚºû³ØÆ=ø!â£8®{âŒa@ÉÈN3†G¬¬aÆh tu²Œ{UìiCý>ÄȖ³¿<“k$È™dê7Ž1*J»ú?0šôú{ ~/(Æøûì;Ãû°ð[cµ&ÃÙBÅ0~š2¢Á/ÆGšÛÀãÜñ…lôbÉpµ/f‰0>€sF'ƒkžTë #;>(#ጼ™fœð*ÞN#»Ú}ÔóNv1ÿ¦òòÙ``MR–`ãö°ìb´ŸBÆ{Eã²/!b)ՇýÚ(ÈŜÄQe³‘‹e}j†a8 !i ,;4æmèb¾7\L2Óe§v¶²s‹±’@©v`‹º jÉZ%@+³A‹Ê¿“X̵Ó˗ `ñx,óZyÅ0âÛ -\ñð,´bœ²ÂŠ¡À¬b|‡ŽË¤8¤}Ôã.¤âqéS P1ß!|Éâc2…‹¼aŠA‰ÅZ,(Å÷Ñ7(Å·ñ'¤ø¶Z1 ŀ;à‡ƒQ ¶´v¢øvT-Å(yÆ/¡¢‰Nd!2#ÀŸ˜êùëI<1¼ -øù+˜˜®óI8qS~2ÐĈ°#­±¡‰YbÜJ‰!BýuèÔ« >6.1òµ —¹®Zê2ˆlÏN%F ŠpÌ -\„¦ÇÌ$&þîâ]ÏhN ƒHÌÌ -ô•×*ñÆ#¾’=ŒªvÝ-eªݽƒ‡ÁPÅûeÎðÍ®ÁË_ømÐa@¦1Ks»Ò’‘üÍRՕ8Œä?ÈæW‹ªóÏ7ŒbAÌWA~­¼Hý -Ø0úv^*:¬aäÜá$j ãæNf—†b6Ð0¼8›ÁÆÃĉ1Ãøw<Œ2| ðŒa$ìà¸bø®òl„aù‘yœÂßHl_£JÝáÂðÐÈg5[ZB|˜\’,Œü'a…!­„”3¸ÂÕ})6¬0uGMª04ƈrxºØ—òܙ€XBÈHa.p¶& -ƒʏ{ -C5wՒ@a?ï;yÂø›³ÝŠ.CxŸ  …ƒ%Œ}®{' £ç%Þmƒ„‘ĆkáË× #ŒÜ]›/qS éÀí坣éÊnFAÙvPÏ §ØáƒoÂ5Þ¯·—°„›fâÄCPë=ø‡/áÁ® Mvð¡lêŽ6Ñ.ÉÁ¸Eurƒ5˜Rk †zóR/KÕäU.6d0À¿˜7’Œ„Hm<ÄiÚyÁÖ~.E@5YÁÅ:ÂmâEN5PÁÜè*“Œ@·~wwQÉ n"H&&8þÞ(Áa HðPlÀø_ðWé+-ˆàbÇ&6ñÚ!Áù÷ÊcàQá„ã&دÜÌc×d5‡&ÐÀ—Óúz§ò2•P>¸¨%ÑÀEn׳£ñ½Šem6ðwøYÑk >X@|^;尔¹~ØÕ ÌÀô}ïd` %!Æ7øõÞplL.0×ã×-3©Àæµ$£+·”ŽKPÒ¹¥ °ã`àã -,RÙ9™À‡}Fðæzv"0bԈYš¬hÌÆhÂ׆ƄƒedЀAa`¡TÔ! u]; ¸¸‡—QÀ¬ø&Ú@*ü Ïuã@×ݓŒd·¸L Þ -­`8n ž·ZznÑ!”Dpgc‡1À;DŸ‰æ]!¸d‘ÂC…×&ÀP*`p þ/þÀҕÿ{9ÂøßË5îAÿEþŸ -ª¥¨ndCÌþ@€¤Y£¦¿·’áŸ` -ð/F<ÔwÓ÷F$;¯à_:û×42`ãï ü›FƒoLu$÷÷Ý͝~0âÑŸ­Ø_5:égrOê‡Ì¥çú z‰Ñ¹Hðï í…FþÅvòø½Ô8ßîà_šO3Þ%$FÙ#Ù¯þ=Yy—7ð/DÔ_ï‰%Z“ûKËs>oÜ_°Ü„÷šû+l«©iJÐPéQÚ÷—(øëÉýŞyÁý%ʶŸ×÷—f¶ÿ -î/þãémbù­¶7ì¯h¿×5±¿¼ÀçûË:ýO“VP£{ՉýeŒ/I`ù€È£Û°¿ÈT‰5lì/îÕÁ~́ýÕ+5džýe†®´Iý%f‹ þ²}À`¢s¥þâž›mMýÅ)Dþõ—îc§þž%°‚Aý¥J«¸5¶2XÔmòFýå®,ª&ƒ¯Pa9ŸÐ%õ—´\ÐÐ_„Egê/ã‹í~ƒþ2Q§ïÊÔ_†„¢6õw¼þŸ q6ê/0םÌ_ð'ËÙ'òÝÉx¢ñV¦ÊøËÍÚ=y¿8Ð;ìw¸AG²~ôR‰q¿¸N9;îw Aû§ Š ûENBe%+ë±Èê0¦Üên&é—r¿~¬9'å÷±Ë”_fMúxcü¢~ýnçDü26§pc‰>R½¼!~yÕå8'㗏d6‘»ùÜ¿C5™ü"Æ|ƒ¿øàœ•ï ªhï‹#Ð 2ݗTD”W¸ïI5ÀÑî«À¼SjiصNÜé¾ԚÛ8ª©9OKº/ïôîË>‚JA÷¥1X/§hÀ -y£û*ÿS{Ò}•  ˜ou -ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥<ÒM¸/»Sä)UŒÂ|v¦ûò¾°`pÅûÒ -Ãx_fíì¼/ L]lx_Xƒ -ÜTëÞE— ¼/ Ì>¬x_*7ûÝïËî. ‚ï‹Ñ뫝ï+-'H¿r3–„šï{'K6À/¬\sàW’OmÖ5J£IËÆ÷…‘ÞFð}i@ˆ0ø¾4`A¿~1’‹]lÀ¯ú0èK0 ÚÆc Ú¿°²r8¿'٭ו€_0ön„_YŸ‘„_ˆÕ—&üÂ@úþFøe ,Xƒð«²Ô´‹ðËÞ°EÒÀIøU3µ»&á}ˆ8¥á÷$#STÞIø¥Ð{ô3¿g5tو_þÍ÷{EüÒZK~¥/Ê#6_ü¿~%?•î ’„m† -#Iø•öûxvÂ/ý¿»hè“XMèîãu¤»íŒ_˜ÏËD_2~añôeÆ/-‘ß3ûOñËcET‹, †™ÀÛ¿¸P9cøådM"¿ð€X¹!~©Íâ,mM°ÂQ[~q3:7l„_ˆô.6áïØÝ®{~ÏÛK¬ðË"!º‚Aøeï5%ŠMø¥ó®– á÷Œ4|~iéÖÇÈôÙí_–gñ=o„_q%Î; ¿x_¯^ƒ§í„_ZñáG—¿$üÂÀ‰k#ü2ÿ±"‚ÎaÜ|~ehu'üâ÷ÈÛ Â/¿’ãJÀ/&£·ïËLßÝ[ò}™&=τ÷b„z€ˆ_ wÎsÒÂ ƒÏqí|_ƒxmà è¾ÃÉ\á¾ìJ¨02CyHa4ò6ø£ÅFöm= -d:vÃyÍìEgaf6®/!¹Ï„Žì‹ç=ãïë›6c}OÏÁëÃËۍêÛoE©s#“¦ƒé¯Hß´™èû:ÿ5‹‰¾Ï¡þ£ Ï÷ñ<ßçÐÐ8_ü›ºÑ|±—ç¦ù>ÖºÌ÷9ô&o,ßîGòíÉd6/©®õJŽ/ÿð,Ä»‘vØ(¾0⽈/þÆK _Å ù]¾ýprÔßîÖ4AðeX¼œ;À™=œ{ð{ñ ¢„<ø½=?¬ø^`¹š@› - cT[Â{[‘0~e÷Ò&Ê1³Ù؇4H“{ASºÕÛ.¥˜àŽ]íNn/ò«Èˆ Û æ°Kµ—šGÔóڋŒ±ÚŠÙÛ½´Ü½ì}Ë -\{›×IìÅy€z¿ñzy2`š×Û¼j Z/lA­°^V»áå4«—5qP*Õ;²z³{©A½ÑQüȯۜ^Ð=ষèÝø](ì1òn^ˆÑ¸Ð‰^Aè%Q ɶÐ+Êá>/þl¬MŸ÷±²bÃóÂ8Dã%žê~ÄïƒÎ Ü0†Õ ΋º‰ƒW#6/V¯lÜáêéø{%ó¦Í`^ÐrA5)‰ç‚eÃò³v‚Ê‹ešÓZAJWú+•VµPLŒB”ûI*/W+œþW*/‘SlÔ~ÈêSy¹éþ+•“CÅAå…GZÄqdY%VÑxø“Ë.xÅÁäå9ÚJõÑð/StgÁ|Œ[w€Ý 5 )Šúµ3yåa”'™¼0p¸ &/ lv°2yé¦ñäÍä%ˆt0y?9*_҇ùc2y¬CQÄÆ䥕YD3yÂ+=¼ ̱teò2îÙL0yÉÍàáÅäUïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8íšáæ°fÝ¢‡f’Wñ;‹Ú~6‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Å½1€"/)¼6"/UöUÀWá;HE>{y…)c'òRùHíÂ9•ß 4‘’ §È‹¬Nɋ2+²®UÿË~S;Žʪ¦ï‘®7|ZŒãe”ªªtrÂxQiOIoŠiƒÆK;Z­5@4’¥'‰"s¾âZ͍—!Á›ðI×Oa‰`›q¼ fçÎãE´‡Õ“Æñ‘5ˆ ’h„µ#JãO/J¨êDñv$eú™(^ÀöŸkñÂv=#]?«Íê“ÞîïbÃðBe‡üƒ)¼ø}  •&êÁÛݶ'¼ Ôr'‘ÄF6ow°5ø» .æq&·9¶·áwy"¦ÄøÝæ aÐwI…ê;{—Mb zz·1ªÜÝæLã†ÝmæEÑ/” ôÔ]œú¥áºËþÕHڙ¹ËõóIänµÔk#îR0zwÑB¡§àí$z—7Þ.V£øÄ·‹5RmÉß`»PÁ ¼¬]¨³ -Ô.аuçì¢@ÑíÀìÞ¨/MÆ.´8Xqoˆ]» Â.4<ˆÛ(sòfáý]• ¼î­ž£Ë>¯v¶.Jé)S7¤9$d]TÕP²½‚uíÀW÷vsàÀê¢"K⍪ #¾¢ êޞtª‹3¹ çË2ïˆê©‹g7a> ˜ -—ÚçL®—kku±BÂ{<]TÕÁµátÇé„ÅÝ™¦ É2ùz+LF »ÁÒeMѨ‰Ò…Á¾•¤K±ö}'Hw8„]ü?”]& ¶º‚þšÂÑE­`WEõ‹õšÝa˜b@t‡ãÈCY ½&Ë>Ŝ-®èY¥ì ]Z5±´„hÓs$C—¡t¸·D—­Òk ˆ.æ}†ý¢Kâ|+Dw¬EAÆėS]- رQtáêÄË¡Œ—+&šžËˆasiÝdà2nغ |.Ud„bàÏ;r^Lx®Šƒžò‘ô\ZØÃw£çr–™žË Çtcznþ½ÑsNF>蹪gî#é¹Lª±´b¥ç2Ïց=$x‡D«AÏ¥»Œ'´ÑséhA›ô\$X‡ãÃÂʍžË³º®„ç²Ø!€ç²n£ìÏ¥•_»á¹4p´1<—# -'6x.ýCœ{Àsa(øJž ö=—ËÓK€fPa`=ø\rTŸËå*î]àsñ–³f!ð¹Ê|–±ãs ê@/®Àç* žÉÏE’€ÃÍÆÏ%-¥J°£±ØCÄm‚Ÿ«ä‚F³ÉÏ¥èÕ^ÁÏ¥á/Wí±oá{W|.|ºçÆçÈEãs±oӆυ>ƒÍíŸË< cÎ#@?Cᐠ  ¢3鹜 ̋ÐE†/ËЅµ’2J€.øKt ‚ ‹”CPA—8¬]ƒ  ݼ è҅ëFÐ%©*\ÍÙQ¤äçr/–ý¬üÜó¶oü\”sQü\õƒßè¹Ì¦ò‡©dä9W9ꟄƐïoô\Xõc¦çž„]#é¹4 ³Ñsa­xàAÏåf¼¦çòȧðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ'UÔåÚºHêÒSË͊@Н† ›Ö螥ÁM2@7_Ì ¡Ëìì˜]\#]¦×ŠJ¿¦pV,킡ËäÖ5ÁÐe† æ¡Ë×kZ2tY̍”ºüW¬D7ˆ.ñbp¥¢Ëd¡º¯Æ¡!|… D—¨Æ㔢¤ëSQ;ó€èòãrž{í$RéE¢‹?ҋх¡;°4K•ae¦ (º4¸- ^4:P]>ž¢T®)ºÌ3m](ïX1¸StñÀ% Š.‰]dIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±>ƪòEƒüu¼Ñ……1±£Kߔ)Zct ë·²Y ’CØjÅè¦11ºœ®†»ÛêI↱ùà†Ñ…Y¯—1º00|]n"ÙɊѥ™*0ºâ°uƒuE·@éc§èRH©@Pt¡\áø‘]Š[³OŒ.ÃììŒ.º±ðqùðÊWŒ.W>Ç4‹¢›†¡;­Æ¡MItÒå{øÉ7ÿ#¬X£EŽÇBÐUqþ™]8û\­?·i´Ùñ¹M±Œ¤ç6©ÉžûÈ/ØÙ¹/c)WÐG%ÑIÎ}¢]å -Î}ÈE^ö鬺 -j®µ¬;5÷q:ÄÔ\4SíÅý¤ŠS+3säwÍÌEx Ñ΀Ñ ¾6b.Œð˜‹Xàñ$.õ˜­7Z.ôèJK –‹¿•‘,£Îlcå’:ŒN{FåBq×'ÏÎMÊ7R.ó1ð¨ES‚šœÅô.z-pð#[8¹ÐZ¥Áöü’{56\_ ¹ð7ü @.{òWòqD˜{Çã^ÖK$òw„q³&„v8.¬˜±‚{¹yA²q¯Kª¬{ êd ÆE’QõxcgŒ‹[‡…5¦â2Ô6®„â"À5òÊÄEÜ£N".ªn4?KIÓ,Ûx¸0R0e.v¢Ú4\ÅRÆý-Ö -îíƄÂ½c"ZH¸ÐË0zo.$ˆ%>Î ƒ‹°+sm¦àBg0&5²X3o\äéKM.þ‰#ø·ØoáÆ¿…L§¸Í‹6ѯ³õ ßBUV„‡ð[\$ŠQ‚}‹›ÀïÈÑP+Oõ%œ‹]Dø„²d²€éôú$÷¶y°ao›[6õ6j«zÛ Sؘ·ìjqÕDÞf¬‰·—«º7â-”ˆE,LI!иé®Á»E܃% ãI»½ÝZ*`··%˜ëFÄ,u ^¼µ Ýâ—N“oÓ9¯.+Î-|.ø5¹EEX}ƒÜRm…·à à;2âwï×F¸…‘]S ¸!aûàÛ^N¼l|ÛÖÞ#d¼-þDa£Ûâ–ÀY ¸íÕ¬“0´å2æ`CÛ¢Šõp*+¹¬*°-j¬ð)n\[? `ߣŒBAµEÒ´õi[ì Ó#¸H[ü,ôF´-U‹¿ÚV¿@âÙÞ€Þp¶È°¸¤Ì4ö“"܀ÙRÇðÜ;ËöF#²£fÕæNx‘A²Eä чd;XvNmUÈ-9¶]½vŒí­ðzRlOÏ©†Ø>ÒKo [Õ œ‰°}ø6O‚íCRÆÀì Âïͯ}T²`zí#ÍлV²ŸD×v‹uL®-®ÚɵM¼‘×Z›ÜZŠ˜ß±µ gÔI­Õ̒ÌZd\ÏöƬEÌ{,ÈZ¼·lab-õ>×°ö’—¼ÚâÙ;pµ¬…¾ëN«…¤õdÕbíAþ"wè,8Ãx‚9 ¤-²œÅßE!êIœ¥ñ¼8;°(2^«GTíÀsÛp³cv•céa¾­l–u/ç½³fh*J=GYŸ -Iƒ4ûx5¸ƒfÑ´3;bÑ”YV¦¹—ÎÔ"“&ÌW3fqN¬œ Ä,jqnÃi'b1HNj…÷KU˜ÇXù²O$7—}œì ˜l|ò\’N…—}NÝÁDÆöj2܆–_…ÔÁ°"å3&W–jé>Þ°² 0ìTY¢G\ŽLœC?fÕn -™û1 w½;áO¢ìË JÖ (ÛcN l;¢ÒÔËiX‘²Ó(¦l3'‘¦Xvr¡½e)¶áf^L Ü& {tDª+Äv¢,”öª«6P–ò|Ç qk±†‰`3•‰4Óyù`<úpD£KªSô;Kö¶À!Q²È±¡€8H²”-12d‘ØÄê'@²\Xy+ÕVésª?P0uù°6¹ ±#‹e‹br+E¶bÉ~–yÇaP]¹²ÕòÄ !‹.‰:s'#óÙwwæË7w˜þ‰ û#Ȳ[s€uáÅü”f -ˆ!lÊõIMËPÒ°(ºj!˜³\Ñ|œ£'xw"gòÉëS·–(‡£aâ@?ì4®2ØÛñ´Kž:ÏÅ\9:É­²(©ƒ@ ;#ÁrË®›ž®³€ÁmL°æ…dÿVLÄÀŸlʀU›¥R΀àC’)EÅ#†>ƒÝŠS.¶W©ÈO‘HÀj/õ>vÀ²©Rý³À‹í‘°A[ë‹#h3¨ ­¯IŒe&._SÊŗú8AèZ\Eh5e¹à= ÿM9-‹lç~‚Ä`ÁIT+Ž…,\)ñ'ٟ–urê)vé'YHŇÎn]‡›‹qQUº÷ÌL]T°q<»ZBû+ÐM“ö©Šqñ…Žj}ŒGEg :…JüMuGÓǵu¸|àÎst÷.ÇÝU7³Ž.«ó{ o–3ÏÞ"»rF -…•ð$+ÀR=¹3™ ø|¹Pǃ÷o òò¸øn\l ùMŸh ¹h\ÇÑÔæY”<³Åõ`çn7ÃÇÃ:>ŵ I"Rú0z‘–Þµ!ãÍ0 ^XX2›WšŸ`¦OQ‚@ …¥ÉøiÉòy”ð ø³$dÒrêÂ{\»™†¬Hª‡ØóÀ½’Ø·“čq‹\‹÷Bò®¾Þ`šYè9Þ¾@­aÎ^€kqmŽs°í:µó]/n¨Žø Œ´0„$aïiá'b”ô3N=#ÄâÑ'C- 0TøR/5dû ˆì°§6|Ìèããe§ ¬ˆ2ØD3BP'N§ 3í ™†þ&Cžy‹Ž!Ê×Ih²÷S…qì‡*q†“|äâ±°€‹_tvÁ¹Bò|²¼Yœg(¿à«<ý“X0¦Ç8ݐÑ8>k¼&X¶×ÌÂÌN‡½hµD çBhÞ ¶à‰ñ`½H­•»²ª’ffo ±¥š£;ÝË£ÞE”ïZ„bc+ ¶¥Ãò‰]€f37"h9•EõXVDÀû¦"Ë~T©aôW’ønë(3“Y³ãO&Òh ž£Ü –+gnÔzè.3^ì&‚4Äµ§—¡ ‹óLŽØ¼ŸtµáÂDOB¶èÁ1G©ðޒà©Ñu$Õ`ȕ‰Pä¦G¯E 4Â|Šðžñ»_®Çdfq«nTœkྻËÕìg ásºCÇ0H< ÒUlÈRªnµDz(êÁÁ,ì#Ÿ@L€¢(ð–‰ páÁ ²1W­uXË*ùí+`“¹“ѳ¸R#è%rÜL| ¾2®´¥3I¹éãšñÒ뻬ʧ¡…’R±h/»9¬3êjÅ2T$ìÒÜ¢ëo‹Œ'Ì£´Àa!ˆ -ƒ¼]ôWOFè˜ €…•r ƒÐ_ƒ…þñ%Þ^ìÕ¯\ˆŸê×%üÎk©NÀ:ûƒ©Ž-ö»n7pÉ ´•Ì¨lŠ)|COÿò¶Hei‡[¨‰»Äw3cQåuIrí>ü¢^&^ãô(Mß,'îšÓ<ٚ]Gd`-Ì j‚…er܆ªjTõžJ°f$;š%PL„«ç+p›¿ºXQûҗfQ?(Î> ]R5_£Ñ8 -sØð -d“'ån-šÕ  <k¬:bgßː5–hàVqrO-·±æ=‡öäj ÁFØÄþѳá¤ìK},ëa -T©9ØWW±ä²;å;.}Ϗ’Û´pÞ7€‡´YÍÌ WË]uDÄú U²УF°êË=× = µºÞÚ£÷ºqÍI¯/±äû‡/[UïáÐi‡ã%Û¸zÅÚ -ï -ä,+À!í¾5R©çiw¨ôdÒ¯h¾"•ÊÈüèÇKÞ’±Ì“M%©óÀìN4¦ì.ºë<ŽÄËÂñýP‡»R%†úünêރëóÎj‚ÿÉ9¬kñ}k…CºÌË̺uàú¼«†P¦Å sk`[œ«JÊÎ ÑN‘“e÷ñȖ¶«›Ò¶óQ[QísP9J€EBãäWŽôWÁ(x ‘eȐéÌ éÁ±@Þä® ¢‹˜s ˧­x¥ÔIä‰pÕZÁ»†ÇHÍá’Y\1h”-RîÇ2wÃIt{©E»u`/^ÔÓ=0ˆ¦ô%æŒ (æÛôCi…ácêFtaw1J6˜6DÛYˆà±D…²ºË»6™Ô.H%(92åù<‹´\*+÷živ)!㼌‚ 5SЂʍ´Å/~øysC¯Ðèg‘29-ÄxÏ°Þ&t“]ȟÀ×ϕs¾½@ÃÀëð3íRÒ¨i³½i$ò¥°$ x×îIp o]s„×ŽÞ Ê ßU¾°ÔÉêQU7Ü=K½ºñ ˜(€…k<Ñ9 -‚ÂFGÊýGEn'7ÌrEHŒßmuÙݗxT¤iœ>µÇ­m..=X(Âtâ±Á7ZN±D¾NÄÓâ]©bç®5cqñ¼v•™ÒBžjG©éî W‘î2?µSŇ¢‡1ðýx -¿RíÒÝôtœ\¶P@-ÐX ÷ò´& Ô/ƒ·^¦"NÀ£`Q)$†CO ‡ª`WŇPïȘBþkaêåu³S¾‹d©b×hõÇìy ¸€ì}ùM¢ïȸáåx ,xzï…ýW?è*Ñ;µü"ãBt&r@J3aTÉRÊæ/玻Æq¿‹3“sŒÞ8˜"ÀC' ‡`1å€+ÌÜS Vž;rú5g牧¸t„úŵ ß÷³ë‘3W„’h•G`â凸—Úýä ÎBxÈ¥sÜ·XíÍ(.0:¥OC®ì¢OŸ7S7g•AÑý¶ÂÄÑÒÿ kurŒÝJ.å©ô:~ZÌÕCi†7È ñbº²_ˆæy1YÌu+˜4Äñ·ˆM8kù_ Û+—u+ßC¬ˆA¬åõÒ0!S®gFNaUhž î,̉ÒB&J½.íÈç˜{Ry¿íI8áôßh&}Y7;Ò*”S"2÷¶/Tq"…åü¢ëŸ ïhÁ:åâU™ÝT®Öt•Xò,jÈ>a–TˆWÉe·–§ÈÂw–Ù0FÿpD¹é©:hp‚‘š—z‡¨…?Ê'×­ÉÒùÐùâ_¬Ã%3å=]õ‡GÏ&1µ@ˆJâ?È*(¹®a®]Içu>ÍR¦€øUç…éåSW0Ì|ÏÄvÊyð!PPˆ"祕ÃòԐÀÌu ͈¤Ã¢v/h» |ë9”ŒsîÉ&̌8òXWÀB/–? -y¡,¡!+lÎÅo=•PgÔ¾¿rD°wáspÝπ"c](ŠFDD1@Ä_ „gÐë"Ɇ?ŒŠ†£ ‘l àL•É·ð¸´€YK+uîI ¬ r»Âù6ÿ°¼…–ìûP÷¼/äˆu¤o~.j.sz¶â“î¡MD|»E.ƒpXö´fø +Vý  Ú]´ Â5Ž-Ÿj/#ë@Ð_¹0 0<¥CÀÔؽç‘23÷d]I¡«Îx¬4Xœî²æ–6{†ò‚‡‡L"$£ßÎiÀΛõ(%h])nÀ­=Y†ËÇY|§è1±Sïq)þË8É DòE9 W a¥œù6‡Ób°Üóㆹ3;𨢘ÇRXýáôÀT\}´gÉwˆÍ>ð~·G êüœå¸Ãw„x¨Ó*]f1dŽy.¾ø$2tÜB2àŸÔæ Ț‘ã žŒî%\Ø"üûCKDZu'ä3è]4?—¶ÚÇzº6d\»°‘âSl)ËWFxïU9‡3:UÍ¢™,Å;-ŒÐq«lÜOԎ:Jèøm ‰FaÀ3<ö³¸¸0‚ÊIÑc­IV‹¿hq«ËBùñzÀmf?pÍèi=®Û(”5mÈþ3܆]ÐtÆü!”ç -kD‹v†zT?šxNõ8ÂWN(¸Ÿéðz4j8 %AëìâÞ=§Á£ÄoÎÜÑe®åœ}õs—ö - $,ªiƒ%ÅÄ0ëã|$â)¤_:Vþ&1HîZNÞ¥s¡EQ%^ÕêڞB¤î7ÂN¬1äÕS`Ö¿Ñ[õ6؟#!(0² „Y@«éKº'K_Ìųäoƨ=–߬rÁ‘c˜§«÷î03®’:s¦pF°¯ ¢Wøß®ö ’{ìeÝÁ5Âú&£B0?l¶3Tz !BL 1§‡M”îJ)Ì=Yтž×sߑHRúó†F-¶wµVf·kr.9’qbÙ'R†‘ù„ûX4xjC¸….F¤OJ ÚÕi†~³¹ùÍêø[ÄöåDLæžG±Ì€Õ&œ3”umj;"{ؖ%vuªK3jò°%¹ ‚ óEuyŽ= ·ŠS Ÿ¹Þ›‰CêAáˆHÆ9"Ð+õö7hè»eBO¥¥‡ý™œä_0KJˆ¢4j ›©~°N¹Rú0 ƒß\s¡4ÜUç†Ì¥± -¼z¢Þõ¶Ò{ƹûu _Q¶Ç¤0Øç2ßsn70xIƒÂ¢þ4€t&/­†éb⣠À’|¢Eœ(}|s/'æv®{Á³Sá`ZšOüÂ4Wχ·Ëù ûŒ©Àìý,‰jåZ‹¬ÃºyðŸœ1ßý{¬a¦Ç™ºnÞNR,p•ˆê~,D•%£ôȹ >ÁLLÁŒÉ Åê`¹Ö]ÝØàR$‚¦)IƒÖúT›Uz°¬ ÖæEõr4¼% !9ûh᣸øö¥:!³7ôâj·qb¬hg¯˜ñôÊRsŽ°°ö½Iý¹sÏmná ËåŒ^ÞõXçrÝÔ}ÓK×Û ´ýsP +e–ëV‡5ÕA*ž÷—ðUÊ[ÌÈN‹‡”ê>:¹áÔ éfÝ*ê_ˆçºç(& ä~.·RºÌÙ‘Õ‰™?÷¼Œß«aØ9%·—1J”#púá69Ž¡cE½»ŸK·{žÑ¿i5w|ÈH€ÍÃ*Uö;3›t …,ãê=h¸“T÷\z·h`5BõűÃßmB½óGw§ªGtŒT ‚ Xý}òž¤ŸöÇä23Ê©Èv“{ýSš©`hÍ"8?fUÑå0'd„%—ºÄNQ,=ž”ë£@¼ŽÅË°`tŝ(æ Í@á!f¬Š¡-ѐœb%ŠVyöîp¤Ù•–$Ù]Áz äp­äÝ°øáTÿ×<Õ}@7–‚3rW/[è5³v™ÈBˆMî(4àåxq•R–`I& “Î=¹6Õ67mÖrR8Z n•²@ˆœBX…Ù©žþT¡%¾•;”H¾;”Š‡²®\4éhU ïàŒ2X ‹¦Òî %'“’Þ̜Jkõuâ'øŽÖNO$a™yÊ.p ó•Ôƒ@ìõY €JPj^ªKõt¡ÐèŠÔaýD9ÚmbÿƒN0{wz*0³H¼Gÿ>ä8)gê®Ø‚E]/¡-sOéAz´ĺBÝ]‹ó—²Æ -sj̱RQ‘üåiºEzVDúã -{ ¡ŠY;¾ÔGåÞ\œqýÓ\kÌ:M>E5+xjËÒ fÔYÂ,%>,é¥pB”#¢´¡ä+،»¤ù¾¥ª£ð~ÛUý•yø©ÕmÀ³ -pèǬç)Vu׉žÑŸäK¬€ô«f²¨ÚbjUºj÷Za(‚2ù¤‹ÁÜ»ðP¸£c…VTÀ_RSùXÏ*(h.u£rOKš&©óm*váÑÓ]áJCñè»MŸ¢·¢3XÕ²´Q©ît—G„…ÚÅP/õˆ©Ìö²ûã%e~zŸ0RO:ܛ‰ÉžDÀÇ`q–ªªú'weY0Ì\g2SÀßĆLzpzў\çx­ŠîFd™¡9›yþÖ³s/¤h-•r =zyÙµ¯dLH’n~Û3¥pTݼ;Ó‡â&SôE.Ýý3ˆìŽ>ÆþDãd|ØC»®—Ä#Ø$Õ¥°JÿÜMf˜òö« ^Õde4edg0BÔl{ë›T`¨8.ÏېẨ‹&fº÷ÌÚ?Š1QOSؚø´´k–sÀה,ºù7àVIÚouLz÷[g\óc§é½°×7°"ýæGEM#<½®e6-­º -EÝÃÇ¢ýb|²ÚoS;qXZ·o°P×Íj±{™>ÃgϜõPF‰7“!VælÃbǦ©…ùÜÎÁzÖ¼im‰Æ¦Þw_bGRÎTÅGKM‡‹IÌ$ ¬Ðq³Ï>xº¤ú<¹~[ŠœFjíßw=œV=-º¢åV(Þ¥E§+ŸNõ²Î©«»³%øgÌp\72­VL†Ò{Š«‚¤W=§%WLÕ?Ò®’)ìó‘r‰Î¢1*8·C¤åöC&°€»>휻’GF32¬&gMXìúÑËÕbœÛ}¡—˜†ôu¡A=|"#€1Žã4F—”õP¼wÊJi¶2O…ª3Lê¸ Ci˞µ¹âãÒ[?Ü%. 7݄!çO.Ñ9×T|§˜u çë$0¶(Új̗\³+r8\Üi -Á§@nkÙÁñFyFî*Šš`)o#ñüÉÔD9ˆÇ€àLH\î(D3ÇVÔ 0¬×éT‹ßº9x¹ TmæO|0p’G\’=å/·$€¥Ïwþr›VÜ$­¨Š—RW­¬ÖF—¥ÈG^¡T“sÁ©1ÓaÈ¡ú”Ân!óo§®z¸±²H,T~¹"ÊèÃ%:íÙOoªU^TYÈÐ(ƞì(Vâ4~›Ëq²'D^(ªE$‰oÈ9.a£y,ìl‹É–ÑÞÜUÔ|8ÓÂBç-(©O®[Âr<ù«…ÁHFàÝÊbô-„{…ü¯ê»{SªKw—IÕ.y»º‡‘G˜ÓeÑ–í\8ÁíèA†~´ªê*{\”%ìý“œk¯A)À£çv¼#Uéœàᄦ÷¼]Œá)RH%1£V‚Ä\üý˜ÖïýÂ%°X7Ñ»ɱRÏAœK•U å†@kó}Ì Y,(ÎÎesš‡Iㅍ,•ªg÷›Ë4Þug6¼Z>Å}vhý¸´9Aß°T¯2çÊ(;ùÎØ÷çT½è¡Ý$¤ÆßY~Å/#J½.Íz>#êƒ`á`U×Ñe'XÓ-Œñ<MŠdÀ’7àL×x $avõ”îÓE¸§?3Òÿ‡yƒ°,҈|¹“8‹,äŽ7ƒ ­góJIE#IùÑÒ, ÅÐ(qJ¯á÷>/T9*ÉqC"oºßâ/E¥QεU|hH6Pǽ*Ս(åQ¯¨ -C>‹G¿á¦\ÝcÂÃ%:ð%AÄ«=òÅêôÅ.· ƒù֋ûøQQµpIê*Î9–5‘QJø{—>DÀß (C‰Ü&ûÒÓfFŸ“ ]Aw‹Ãų¾BM¥³»Â/á‘Ë|ZíCIÓeñê!Úf±B¡ÔÏ°8åE uŕaܕҲRÄÍ|dbÌǓàZâ+D`mPxº–RR˜ª@»¹Nø÷Vð|´j)–¬@΋…tNÞ¼nYJá—ÛÆe"bϤsSévYbKË c1S½Sxo.¦-mjÆt§¹¹èR Sê ½–ŸVß~ñÁB.Qœƒ]¥£ìJt«Gä -0ÙëCf6¡:§Nۜ¹f-ÕÁ®8I7ÚÉ8×5ÃJNOZ×à;܄o<jçRÍ(5Ìž~¡ØÀéêÆnL5Ï|1ø?סz#¥šQÌ¥ ¬_46Œ¿»n÷ôٔ ò7U²(â‰à›Q(út1©èõ"®©|‰0!ºF/*¼há ×N䮢Äc1%Êè—ÇÐT¨VÏÔ¡´;u Mqâ•w”‹Ró2̛×å@lõׁϫ›ôð0Nˆ<˜² -‡¿Ô Ìà$ÊZÏGIÔJ@ÂB>›2JÓ"bµÕÇÀL·®›%‡è l1Õ•}`Àɱɪ.4LN©Ž{iÒâ¢à;ʚ<Ô‰‡ªº.|QC‰”ªÃ˔;0ˆ^˲¸W–ÉYcÆ%Æpê‹)béFØÌ£(v2c©û•µLÂC"к©1´,oÒéè7`ÍÅz×ØGωjÐÄå܅®´º÷ *‰Ð߄(0NWÎk6@1sݨEìúcüD‹n+Õ«Mn2˜|tZsÏ`b9ð ê4LB>+—i™½^º»FwwVKmR©ÎÝr~VÕhO?ÓèÜË -ÏKà(}¨-ðйò-m(œK³ÊµYÔf×fy«µ˜¯w6­¹»FR˜UÂÖziÎgÒ ö]ïٍŒ*°D 'G‘;ÈW5˜.¨ÚÂÂÏ%kY]±Å ›Ó$ÕµÚüâ[_SȨ2Ç3cW(@pºTfñC§n°+o‘»Vo§’þ+úÚ ƒ•~’ÅRäiµ9^ÆH5r·D©z Ò!²Æ1°Ó¢]ÓR%h·îét¹ o¹gdª#k¹+{[d骴S·,.Õ¾Ô2ÞåG»ñ!ÐzãÕeûp=äaÇ舷žZcûT—ì¾ÅNd‡„zE zc± sâ_b+& `®n®â¯ãt~ñ4~‰SÞ1/´EC¯SôWŒ8Ô?1IFíêºSûT§¥k(ºê9×ÜÒÜqV\¼éËômb•ÛPñ:9¹”É°á0Ò‹¯9­ažfGê+Òuœ¹] Íˆ¯,ª;=ïµêX-ü¸ž‰&D§; ‰éw„fÍ둼N9xh-ÂtÓ~ +꒼P5ì>Qo!*É-ÀŸâlX«q‡ÖJћÕaLëÏ9˜UT—+JÞBnFžŠ=èË2zÜíÂNgÑãÇíÎU‹ÂèqUU¿šØÃr¨X¿MZªKXx¨P]éø̺OK‰?Âr…2S—`t¬2Ì· 2:žJà‘4‰ïu¿ÄÓÉ1¥ÕB €¾AoŸMÑ.¥Ú4oÂ2¡»Ði‚9(1—òÈÕM‘`Q*´.+8ü†¤‹á¤°¥ì Ç©jBڋL:tÎLé“ÆÍÜÇÇ#dáhÜI!È#r£gzBˆK+›ïÍ%Ör‘7ƒ`ñ;.K2×ÊA|QZ4üÎw€…EôX¦O‚–¥§õíÂØ#oË06¤…ßÞjC¼6Æå’ÒEƒØ´O´˜|6ŒÝuَÝÄñN@ò¡Ì@Xt[ölQ«½ÂûJ ³˜ëv ,ö3å&æ†L!ÜJèÜuýûXd‚iæsêƒZ½óä.û€ÏeEÑ(kÞý‰n^0£â‚êFQü…rÆîOÄËxzó†âÝ ·iá¯ös±x×n  ÌX\£"³F|º˜ª8<“zm‡‹Sy&Պ˜êS'«7ÞhŽbÄÚç$ÏÐ2ëë܁w¨Qþ¾ #•Ô†ùeoJEÀPĔw”ú@X†Ä¸R;=֜92žÑx"ïÐÍ8<ƒÎ5ü©6›Hr|cÐ¥#Ê8IáfÖÉwä´Jg83é_=íL»ܵ:yqKîêp…xî)íR¬ñ9 Gç†ÕE“'‹mØ»-iÞÂö覫jà* ÂR$­ˆ';BšxfŠÇnV4w¯Þ†W‘¬¼ÙÚãT;H„Dz:@g‡D$;ö é!ˆávO£PÕ]¢WîIWfŠ½i!M·²À6Žõäí=GäÂëaZÑ(d°˜›¾b )iñ•ž ±lÛá«Åíe¹%}*4àh)ÝìÚܳV®«j†¦ÚÇYÓƲ‡Zu{;÷tóMZ,CeK$—‚G ³Y{~YÁ^5´Ð#ë¾¼M®Ê@PòÝe†’qDªË¬âéJ.%8a<Ý;±›1Ʋ=¶¬†ÿ.QÜv?S®DóáÄ[¡OpÕË¥>e1|ŽE ÆÅÀ„Ä`e'Äm^A #¼c¥.9p2¸ü˜ò'ÄÙ-æ6q“BÒÁ%ùkNٜ€˜û~¬H"Až©zÎö0øÏê’ÓðYÂN-DÓ«;Tº/rQãq©Ù¢¸š>ÿÍÞÍ\ -¥w˜oßê~$Gá‘ã\žÀ}h´åOHÞç>ÔGäØÇå¡/AóÀí¾l¬?¥ªïÍûò͝¼BšÿÐæQ8±Í}c½AÍ8/‰/gßEP6œù5œû š9ðý:ºaæpÉÏÜXæ¨L}.9r@™G«±$™c¹G‘ò2G!–°£æ˜÷ÊNŒ9 |6Œ9÷;U‰Ã€ßYþ¨+ވ¿Øì ˜#ÜÄÀkÌÑZø¹4L~ytJ|yu$ñåÕª¹^>­†—WwTMv9ðdêlèr ¡à%º¼^ÑÌÊñ›jÎ.gÆÓðh%#¨JÛäò;¦ä•\ ¯àÚ¦SÁP•ücœ—åU§$ܑ l9êƙÏj9µåyƒ–³ßýLf9:ë•+ˆåü«í¼rÚƘ¸r£<÷¤•ß–î°ò»œÆ¬r„µÔYѬr,»ÉÒ˼t='©¼™òŸ ò¦’ÌSŽ>F—yò˜{»}£d”c?„ ŸnçúÛX -¶™.Dy÷g²Ê{PqPŽºË><…"÷BôóeÒ³QD§\´éäA¹N8y¯fÇllr´:L½g„åµbqZ’Éc±°ƒÉ±ÌŸg.ùpÉÀ’Q´v(9Å>—yãø|\&C#Ù:܃z'’?ÍNɁÑhömÉ#ïVIî8òñ¨F/i䬴ã”4rv!Vk£‘«IH•c%Šý!Û ‘ÃBÈÌN#?ÃñN9,ìû0r$…}6V^Šü #Ç2œ!Œ€‘cÅÄú¢EŽúÆËHg‘iQÎÇíEÎ~&*_Qä2³¨ÞÀpX1ëæúQöº²Èaî ‰œ^(νUçˆ(uRԂC>2g#©3ŠP(?Ú(ä˜Iùð2 äã }Ý - ‡5*<¢[“&°Àãtx >ŽÆà\}||DÑIè¬G7C@ yü¹cbð8ª—¹œß¸ã`:s±Øñ{„_fìxV—oÔñÛzRSÇA.áÏtäõåX™ãw„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆœ.E ¶9y¬qú™ÂÙXãÈCñõ Ô8äjG»fÂзY4Ž´+}4^„JÎ8ÊAokL'f‘z†”þ5ÊüÑüp|€¡ä>CL<ë]Œg*ºé3£l™E@Œ,€q, õª˜/Žl¦J¢Œ‡kG@ùF/mÖI©aŠ§ºd‹ògÄÖªtx”Èodq=JÓò_–aCpÅápÝ°â„Èœ -’¶Â jqù[ÜF -rcŠcÅD o Åñ{\0(œÍû (Žì _Ÿ°²«rÉüaÈ[µRB€ŒMøp:g€‡è?øß\þLø7þ¤úb›í‹UíÉþæf&Ç(Á€f¢v7ò·Ã þnª©ŸÜï4lØï´õ{8Ô,oÆ"Ï> :Íð°r3ûÓIüž†øÆà}—¬| Üw¼–í{PP?öµõpÁú>õ4Ô{Êgq ‰ÅÄúË¡–Éú>Xƒ|=o¬ïƒHLŠS ûþY?³§MûÉA“ðFû†›ÒÜVC’µ½=ƒ\ñ õ;S$Aúôq%“Â7ÄÀÂõñÆùF¹ÑPï“ w²´0êéÅkÙ0ßð ”B Ì÷A8ˆ-.¶©îl”ï‹ÈQÉø4Ìà~ÖZª BJúñ]LkHÂ÷UTš‘€o fR?­|oˆZn ¼÷Uœº7pê{®pí]Ü*:ÑÞ0D›Õ™ÄÑP³`oˆZh¨/¾!Û°Þð%¥ÿ4†E󏮗5Dî¶çc‡z§5Ê ×`}u0½yŸìµÍ¢òa®>‰Þ—k°è-¸Ä؀ÞWÄƒç •‹Çç °„fÖxÖÿœæ} ÁòNQފò†ŠŽX¼QÂj @tƒÉÄËÝHÞ\Ÿ\‹µk!@±iØHÞÓj’÷=§÷'G|ºê˜\³µr¼Õo©ŸäM…›ÌɛòFY{—7’7Þ·al·wl&L äÍ¿Ó¢†ïŒf‚¼!å,Á1Tì˜ú©¢¢Œ ò&C,ƒ¼) ‰Å oґX¸²¼i&(@Þ|R½MŽ7E6Ìoo -k¢ÜƒihHjp9Éñæ&üd7Ž7Ìl~oŠn:’ã ɐ‘Ǜš}M]æxŸä,÷19ÞxCU1´q¼©Õv G6`f#1ÞMa¾ô‰Ì‚åÀxC.uÂo -ŸIùÙ0Þ0+˜oJåÈ5Æ[Ú9V«­oîɪšÀxŸ ¼ Œ7, Þío\X÷Ey@h—1öÀxS@Å:ñ•âÍþËñY)\€°˜àòÆx#Ìq×sÇx#,wÝâ=°Â:ûD£·"OtEx͒à=¬¦O€7ŽóNïO<]ûÌc9øݸNH;¿PÔ'aœ\2½›äãK•L ïFԕ ÿ€wC‘óx#LÓϨè•ÜïŠh“ üØ×Jj7öâ{»A»¤â ˜ÝŒ8²–9˜Ýì OÜÑÆìæE—C»*†‡÷¸À˜Sª[eÛf\®…ógÎvìNµ(9 çځݰ²Š*xÝ8ŽâÎÂuã×TJ´ÐºOŠ&•¨¹“Pðg×­9ÆIš‰ëe/ÚÒ²³‰& ¸ð7\7̪x \7-¤¯×MC±Pmâºif9Vàºù5áܘ‚™L×ǎëF`[õªëfí† ±nF•·•Y“ÖÍzVú®úõÀuó&©ÔtåuŸH^7;´3Ö¼no¨Naåu³„&QßrºK‚×M ©‰¯›‚ZŠ&‚×ÍþP\°s—*>7`·$¶”šØÍ UeüDzç‘vb7]®h‚Ø--®7¬—­ÕÜí ì†Un‰Ý44‹Ïò7 މ݌ðI>hb·ú±<Òðˆ|„¸Õã–“ØÍU•Ú‘èåË=X¶ ‡ê Ù-ó«—6t1¯Ý0ˆ~¿!»Ù܆ø€@vkÝ`ˆ·ÖÒWô;ِÝêþHX‹‘ÝŒ‡éÙÍeN¶'²›ÚsaiÌì¦>]߈™Ý´ècX™Ý4Wg~ì‚$²›?ÊÊÈ Ù-Éÿ©RZe}Ù--ÿᬉì¦ûÈ0A@»qßnQ? íVXı‹À Á‘ˈns «§¿€v+Tr›t’Ðî3ûјٝ–dv38ÃÄçÆìƥʙ f7}E: ¹àÅäËލٍDåÉEû#¬œTKd7Qw|‘6d·"Ë£Md7Þ8"~Ù}ÞwÐqd7‹Æ¤† !9²›®¿:ˆ¬Èî3U ì¦…©á@v^5,+ -ŒÌüÎ7d72‘)¸Rž¤•G…3æ"{¦oÈnšÙàÌÈnüUk‰ì†…ߎ솙pžDvӢ중ݲ0é¶"»ñ£¤t&²)RŠ·‚؍”¢z®ÀnfDIº`÷p.-YÜY±1»ûùa[ÑÒý1±»Õ(RZÝ°Ž|qö´“Àu·:…ìsIМïIXw‹±)6k]í¨îæNéIê¯îpt±1´aç<´ºIº~Æ´>=hfæt§aãtO«9ÝO‰–aÆoƒ¥†½+¦»ßÃçfæÌ'¤; £{Z…èîє0Ýq0øººI+¿@7¢Üªˆ3ŸM#+žûqÞ<÷2£ s?‡ßþ ÎÝ£Z°¹ÁÀQ»H£¹|á0µ‘¹Éb® -áñ.Òpêr8­ôÓøÊË #)—A冡ºL®+bÊÁížLî~LåÓ¤ÝÝ®É u†‘È;ÖGaV²ÈÈÝãC^xÜ@Ö5ÓnÝjÑC9hÜ`´²äaƒqÓjˆ9ÕØOV£¸_EÖ6w‹õAÜýªw›yI"ß0ÜÔ¦²ÍŸ)ÜÈÃ+`w÷bwgp³IøÁÝ¢:Ü8!–mnžÆÍàoãVs@ü6 ôîWúv¾Í²ÊÚ'{{=ÎDogç o÷Ècg;ˆ ¼Ý­WKîvw«ˆ¤i£¨‚£üFÝ~š«r³ÁÕb"·!G¤Öc%n‹.:&pαÜ~Bì²ñ¶aåp¼mÔu0ƒ¸mPÅU·Ò¶QEÃ@À¶±ôfúͬíü{CmO«IÛ ã4·ZdÛѦ³=?˜m,MÝÑ;ºSÁ_Æff­„"®G¹ÐáRz5SWÌ6¬µf -[³Ímxˆ³¹VañÀl³¥’²å‘Ú¾¯í×Eªò% Û<1Þå€l‚ð{VÏÀéäµd›ö%È6èãݲÍÇÊÚlC¶ù~p È6-Š‘®m6 «P€ýx\`bÈögïéKzVLÈ6# –mmš•}5d[‘ÉÒ'R›G• ¯m†Ä¨n -È6³Ðmà0ùÂlŒmÜ×q›±=—ÉÁØÖ·î†K ¸D?é`lÓÂ+¸3BÚ¹ÝÛgÐm’± ‹Ä ÁØf‰í£M&bW*‘] ¶ñ -‹ˆmx….õ^ÛÓNeÞא•ˆ‘qF•Ó†Ø^ÌFl³É33Ø†E*· ±MbãØ>É??U:«nô sàÙÛx…­1b›C5&6bÏY » ±r=Òӂ±º5qî]’Îîy;_9¥¢Œ×†Î!%èÚx]äɯtm‘8œ^›A$uB÷B ׬+][V*’Œ×æ±î€i«<¸xxÙðڌ‹²CIðµñÜsL¾öx‚ƒ¾¶QOåºLæ<Áȼ6ë‹Na´']m~êÂֆ”‘”`k£kÇ£´ÆŒ>ö( ²6Ë«V´Làe[ö•«õ‘3ºP¸âå,ÕbÒAØ ÚÝ-ƒ©Ý]¼–HmÙ ZˆÚhÄq;€ÚÔ¦ÀõlvîÄV Ðör,Ñ_V`öí”äeßîÁ¼ìFÜæËΆKÁÊnŽ•&*úNâ)ÁŸ PöíՃ“3µºZ1Ùw*“}ǜ”lœÑe<æÌÍcªap$٘žº¡Ùô‰nâíˆl8ý -'8d„Óã€l貨¨^ùب·VÆqÔqGûEÓ±Gs:{¥cÃÈ0SÀ±Gô46v03w4ö° $ÉØÃyˆcÃ?7ÁØL´VÝ1t©äbCÁª‰Å~z´Ã0{æ4¨Ø#ð+©½D-“§ûT„X›‹'º›f>Š}’M|Ž„b3'AŸ{£bì¼RP±‰à:ý:H³Áæ6‹fiå<¢±Ø°(¿XìóŒ*ü ‹­uÓ¨‹Í8]¢Àb‹a´ûÒWþ¢šÇ‹ÍijšÇE'°O®æ ~c.6\68Ü°ØCÅà Åk@hÍÄքíHìá<‰Ø0h ö0zqça³zøj‡=‚i”kF/™Ýh؄b\‚ÃÉ®®Ã^2y+›ë -u1›«ºÞ&›QÕæºÎÉ´fl•úîÀaóì®kÒ°éŸ_ãúʞÊY ›ñC{Ô¶—ݬ8l²¨ôÌ8l^z'¢Þ8ì´l8lìiȃqØøPN6\°ª’‡ ó¥6ª=D” &›^;ՆæSGveà°ºPåŸhØ܂nÃaóä®kÒ°ÏՒIÃf G商M«Ó°iin€ÁbÅãTXq§aÓ%-®K¸´qåRÒ°aQeƆÃæbú2÷DãK‹4Ë: *”m½V - 6—¢ÊèL¶Ä ãš8lž=OÃFlL¥fÿdõêéŽb8ã°i¸bÅaÃlD‰pØÜNwÃ8l\#֊ÃæڈܕÀaãÉKiö4l@ìÅl"6~BA›]3 :÷[s…K˜–ト½XV"ö4›«B‰ -LÄÎwwgb3=>$6Á8›IÍârÄ©ÿ¤™ïJ@±™ÕäÛ$(6“ŒJlPl‰òû˜Pl–†0(PlnõóFŖ⺷IŞ}ɂŠÍØóÜoTlâTÕ³ÂTl¦¢Ø¢!¨ØüC|°v-R>©Ø0ð&›13vºØ¨ØŒ8±½Z`±iÑD',6 E¬Xl>u:ï»£ñµ±Øˆ+¨ÐuÃb'VݑQå?H³”>°ØõÕmXljQ¨¡ -.6œM7ÿ0›¢]6.6Ì\À'›>¬àbÓ¢ö‹+›G¤ (¸Ø Ǩ }ĵº¶içbÓfÚ<¸Ødó±g`p±™ÁPC͕‹=ÍÁÅæÈV€ÁÅæcÿ…‹ ³;ï8‹´^ÁÅæ6Ôpm\lšù̂‹-Ôa?'›ŠÈö†Å¦Î“èÅ†æˆcMr±™*îÔ2¹ØŒ‘“U\lV5w ¯£« âÊÅƑ¤5›+*5 {ZÍýBÿ£èZÎwòÓjà°îà}?}ñ.ŸIÄÆÃ&E+ØÍÃÑÎÃn¿$»944ìǾÆÃ~}L µ‹ü' -û‰p#a?ê­°ì&|qb°×ìì'FÆ`ó}¹KP°¡vQ~d…`“8!ØРq¬ ®t±˜oC`Ã(è¦ ØHAÏä_3™5®7üui‘Ì3ý†á.¹›úìðkbű -û½N¨PËs±–^ÑרנÃäë`Q%ùúŠFáøò/¤{Mõs½&õ¨ª±#¯¯;üN¯¯èäÀk¦¸Žçw}…À%p×(‚`ð:pחñ'íFº¨»¾B¹°k¤ÅØ×{c]£h”IºFzC ¿J¨¸ags]‡Éꁹfðp\“rÝB™ºA®‘:ªc"®!™!]/×Í:Àpݼ(H¾5öc >ðÖ80ãÝúîñ8¸¿£k°­oÏa;Úí#›Á¨47½ï!ýà9o\k,Ԕ¬Ö:†Zw£fv¦5֎ŽßӍâZ²*;@_»ñ-݀ÖådÁkŠ«µ‰³†\PSæJ³Æ7÷we”‚š[|Â(aökeY»€.IÖ58ÁÄ4l3dçX·èúëäź pƒX³KÎ¥¦³°Ûçà‚ a *'Å X¨Ì„g¬oó…6~56ˆý_},èÕwHq7x5¬,Èv5¨6Œÿº¿v&˺ÌïG¡£Wç#u#¸Ǫ̃Zä #­3ˆŸ]0«/˅vdõ•M¬F]Š§V_‘¢Ú€Õ‰| -^5 š„‘’ W}E€ UƒîÇÑ `Õ kßXÕ¨°S¦K’.KÑMª.͟ïª.¡" Nu E`ªá|´þ©.öDR ƒ¸bT—蛺!ª_ž€§I¨®ñ~P}s{çSß'<5 AšÔ¿\^QRòXԛiº¥Gå–NI<45‚Vd"ohêÁ¼ìù‘dêêVh ¦îî`µs©o'K}zÞ*µ%´;”Z¥(¶bR“˜ðþH$õCªÌ;‘ˆ6Î õã…`à¨#6ÿ£¶~+YÔ=ºOE]¢únGQ7{’Dme‚¨™|øÄ¡fd&Ê5ñq{ÒJ5ޏӕ|BÚ8¢)‚¨ƒ—ÛK}4µšêËîU¨Kø ÁŸfa¿ÁۉŸFý_S)*=*¬‡øz&{º¹7è{Úòõ@Oß 9œ“<­%Y-oäii\ú5ÉÓÓÞìäiêS°¤V‹š‹ØqXÔ?1Ðӟ]öo¿,ÀÐÜcMèéê,_’§—à黄NxåN# !6§±Ó`‡¨ã´©Ów”ÅnÐiDèÉsh¥aœ†¡{‹¹@ºCü`à4RÀwo‰ÓèV4U¡Ñ)s-½Á¥!.VˆÈÖçt§1¡¥çŸ+Y:¬ –î¡ -®tèꆕ†àºlU¿ƒžl¨4 ьqñe£çL ¥{è© ×o'V7 4€_Œ5™'Z+Õâ'ï¨¹_ãJ?·ñàIÓPÚÄI3^~Üo4i€ø5&ýÔÀn &Í^ô÷ýƒ Sés£¤!3 5Bďá+;H:qeÁ‘Nf`¤½;Eå[§;—Fe!+ђ! CqÄ~"¤GDx‚ ŠÖ¼èÂãÈmÜøÑcm‰/°îÖ&=Ù¦66x4iÅmf£µ«^ÅèèNj؝ýˆo—ÜèáÕYb£YHy_;5š¼p¶Í34'ÅBß`FK‚ä= eIdôˆÊ  F¯šÀè'2ÅÁ‹~œ$K8t ;-J^v Z4èm¤ºGŸÊ ¡I¡aEb}, hjìûxãD#Åø¦1Ñø›S¦D÷#ŠÍWH4òcQq.Nåa X ¢‘jcöFˆn¯'!ºEÙ] ¢Ó°1¢§Õèf–TŠ±BfÔiCD£Ûú({°B¡W€19*V.îˆhðºnßL&å°p*mò¡±¢Rãeü¸ÄCcõ¦z+˜UËv8ômI²¡AuRÓb£¡))c*¢¡›Õ^I†æ2ÏŬ'dÖYû)·¡wž“ KãäBsñÜú m2âž×PC¡«•¦;Ü®8w~0‘•K$ô»kôå›;_ÿý"¡¿FzþÅã׏þ¯~þýzxîwÃÿûËÿû¯ÔÏ|ÿ»~ý¿ýøÿùîããŸÿŏù×_ÙíúíO¿þóÿæ‡þý²Ãɂð×kûK»ý›ß¾~éßýö7¿ÿ«ø‰_:¯?ÿ›ÿßßþø‡×iýõßþ2{9›×ùÿöÇ¿]Oæ7ÿþÇÿøû_¿îìÿü7¿ûù÷çÖÿæwÿùÓÆQyò_½ÎÿåÇßþ§¿úýß÷BÿâwøÛ_|²úúë_ü«ë×úóo¼; 7 ¿þ³ßýü篷ï÷¯ð»ïlÿ—?þ§×9/ÿò«?ù³ÿÌ{ôoÿòoþËßþUëŸýُøð_çÿð«ãã_üêOŽÿ‡_ýÉÁ¬Øïãã}ý×ÿó²ýá£~üëÿóÿ:>~óÚãßÿůþä»>0ôã~šn{û=M‡ ÙþÚéûíX¯¿~Æÿï¯ÿy<ÌÄhZôXí¢L¡ÃK˜éµ¼|­ñð¯¼ÑÂ! -p\r¬)>Ý0QgK2ϹÚa|${Q€QÞlX3Üè6;FÒþú‰í¨ô¢^£Ûv -aÔ°‡Ÿ¸o|*úµv÷sXìy¾ó¨Ë…}¾ ¯üGÜâŽîiÀÙ½VýðëØ“3Ñð/gèAÍÈk¹}Ý1XÞnîy|üë_ÅÃìKvúCÐtÜ«FW´½Œõ_oF *ty‹½ -̱¾ØëeØÏÁÆ拶Û_óºãŸÚË ð"Š€FqükµûLX»8Èkí|3B\Ïu±#‹WÚÇ~X²9®ýlüáÎ-OûŸÞçÿúû\ŸZŒ³{Æy-óÇ^ÛQ+^å›mvQÇ۟ŠWúÒâñ¢¸å÷ûý…r+Ší4N¯¹Öó]lÛµMûr#æQ—[6Oa¿¿À œ÷ûÆETýý±¥ñíOû|ò¨ë‹óé.ü·ßñlºˆñûÍÅ©·ãÙÏápÎh=ÙŶ]Ø´/wau¹_óö›‹ß€7¾o o¶¼½¼Óøö€§}¾ yÔõ­ùt¾ÙË{«™çû˜V(À_íßiÈAÈlÓã6¦-ö9¦-‡cÚrۘ†Aôa߸C8ò~ØiÜÏaڗž‡].íÓ}ø!ÆOÌ0õ8?Ý"Ì0ÇõvL&•ßËò‹‹q;½Å>¯e9ì¼êå¶[„)±#â¹m ŠVwÛa§q?‡i_Nxv¹´O÷!oѼ{û„>÷2¡Ïc™Ðã6¡/ö9¡/‡úrۄ>÷ºq¾ëa§q?‡i_Nxv¹´O÷á+oÑ~‹æã^Ž3_Œåãvz‹}^ËrØyÕË9l·h>îuã|1ÖÃNã~Ó¾œð<ìriŸîß’ð>û)6o®‰9ýÝÈêÊþÉOÁä‰<Ãîý*ëÅ÷OÒÆ÷QaÝx~èó°Ó¸ŸÃbŸ'<»\Úçûðí—/ûž_ñró{_Nx1nW· óV,Cμi˗¹Ýáå+^6žßûòàÒøö”§}y%ò°ëËóé>|ãÌ~{çg¼œÃüà—³]ŒÛ¥-£Æ¼˘3ïØòin·wùŒ—ç¿<µ4¾=âi_އ<ìúæ|ºsއÞ|ö/«}6ÿ"()6Oc1nnÉbŸ>ÌrØéí,ç°¹FŸÏmÆU>¯šxèëmÕēÐzcz؋qsÇûôݗÃN/ÿú¼`Ú~YçùoÖýӟ³uÿ^ÁÞë{y?|—°.Þ»_²zïï?o úþ·G$/öäL‹ö뭚ÓLQ<ÑvÏ`zÙ~¾Ù0×e’‘™á€^?¶ƒ2pð”í Â8'™ÑûÛÆ»o‡Æísží<èrYŸïÁ·œb°ÁûÝ=ÍÙNCÔî{;ßŶ^Ú4/·at¹aó ö»+Ÿ¦¼m\$ÄÛZ÷<Íó]ȃ®/ͧ{ð­¦V²¼ßÚõGÛ9ð¯ýÅ]lëuMóræA—»5Ï`¿µ'ۄ·· ÚŸX÷§;ÍóEȃ®o̧{ð-£c´xT½Æ׀†rÚ¿ÓX\zqþêoF«¯Ñ1Û«êgöÃ^yîçp%Zü;ýÈÍ®‘ëÆ]êßý°Ó¸ŸÃ´/'<»\Ú§û°Å5nyÌÛ-â„{¿‡sk;÷_\ŒÛé-öy-ËaçU/ç°Ý"xÏ3Þ6vÙÜ~ØiÜÏaڗž‡].íÓ}ø6 ÷|OæÒgšèìoN8ÛS ãû›³nœ/ÃrÔi»?½·/SºBóQÍåÃ4åñæÃ[~xÞ¸ý,ç]^7Îç±uÚîO¯Nžå· â߃°o÷‰×1ê›Ñý~Sãí‡Ýƒœ>‡OAN=Ò· §ßzØiÜÏaڗž‡].íÓ}øÊ`°ß¢ùà—ã̇´üâbÜNo±ÏkY»9}Ÿ‚œzŸÞ‚œõý-Æý¦}9áyØåÒ>݇o2Ð/¾>ß^dŠI[Ï9e¼çÛÙ.ÆíÒû¼Ëa÷¼¹ÏáSÞ|?·-oÞ[&rŠÀñϲÚ}&í¹÷w1nÃóbŸcùrØ9ê/ç°MŸÏí[ ӝ–øiEaó¶J ëèlÄ4Úu|_RÈÓÍh¶×)ö‰w‡ÞÆ÷%źñ\&ÌÃNã~‹}žð<ì¼²O7á›E³åKo·vzþóæa9ÓŸ]ֲ̘÷`Y¤Ì»µxóÛ­]\ÿeã¹FXžXßï´/ïBvyiÞoÂ7Œf۝Þîîtþç9ÌUÂr²‹q»²e¥1oòN™7lqè·»»xÿËÆs™°<´4¾=ái_^‡<ìò޼߄oÍnß{úùyPûö¡3¶VÞFâîçÓ¨À.*ϵ -Œï½}4½sÃù‰ÏNãþë‹}žê<èrQŸïÀ·2ì÷v~¿ËiÌ/}9áŸ]Ý2\Ì[± 6q˖/r¹·Ë·›Îo|yXi|{²Ó¾¼yÐõ…ùt¾qˆa¿±óÓ]Îa~äËÙ.ÆíҖ‘bއeœ‰ûµ|ŒË]>ÛÜp~Þ˓JãÛcöåȃ®o˧;ðÃ?2¸úoþù/úñ7ý=°ú‹­Öƒ ŠkùÐ…Píï®ÑYµ²Ú¿³£Eµß¿ç—ìËq~öy~¥ív²àK8L,;’]´ÔùÛøúE Èe¼qËx¢¨èK¡Õ×ëù|â¿——ú²¢µ=Ê´ù½Ú'ƒöÍg‘ýÁÎ2¶ µ -üÝ×ëfã}>™ú\y2,¢õ¢ªm¨ìÒ%¢úJƳ>…׳à@՜Ná9âÒúVê~0× £zÖõn ¼ß¾uåò¦¯“ê>ƒbÓkàûŽjìܝe#º3x²>§žÆz·¸*ßö‹ƒå +·Ï¿^¹íÝ}€yÞ—x>xB¨u9،æè~> ‰½n¶íÍšŒ±xj tˆØ¿¥e?hþ¸Ùg<Œãµ¸ðï¡|Î/';õ~؆%1¿¢1ôk4¢56MlÛ{ύ½iÅD­c2¬ùµ˜ç†.¯|ЯC´^¯87”Èي¾T6]÷Æq‡ñà=»ÉQyâÔ.Ñ7eoºGQâ&#JX¿zŸu×ÇyžjdoW<ªR›LõÛ \{þŽ§ÕÙ8áÒ«ûz×r:õè=±œÍσ›õŽç8æ­zTòìû퍏V=NœÅƒÐ G¼ȂçâÑzð±q|Oæ«W±¾K¯}tÔ8æ«ÄJG™QÌû}ÚkÚۈ·4cÈ~?ð|À,o÷Ù÷SÚ¯sØ^5ZÀˆT?³+lwñóê+ÞÍjæcÿRm¼çA÷3ðÉÑp6¾MhUt8~c{õgÀàOãux…òþâÆ}±ÔÐö‡gÂ#”Üøéùse9Âzyz‹«(•Àh²èhgáaº6å¹ýhîŠU¤‡ ë?/ÏÇ_ûÅü8;}øÙ\gqv@ÑlïD›۟åãˆW{Ô¼qA3 -{ü¿¤¯žCÞ+@Ÿ0؞󧰿¾,ü59õí6ð嫶Ýú–ø5^¾#’Å\u^Å۞(S]棯Áúݱ-FPÌ¢ùáÍáóö‡TÒ÷¹+†õ’#ø}œsü-¥æ  ¹?õŒÛÆþo?¿Þ¶ýªúšÃì'ãËýýyë!œ‘=ÆjÙÇã|>Èsâëv>¿tïu~àQ—˜9÷ü”ö³ûM¸/=Vu¾õ v÷ã -c?bæ?Z¼ê´—+6î56~î8lÕúù¦»Ò¥ýñÌp¥+S€ƒïÃþ´Ó‡z­·äcuÕûÚhÇéӑç=H|”eûŸÂnς£ß£+zïýXËAã}åÁïž÷ ‡qçéåÆ%GÚgÏ#µUÿÆKùŠS¨ña<˜þ¿zóúÐÿêèËþ”öcNlpPil#æ®,lìq'I_âÙ^Zl\Òk-O%j6êöõܾÏÉÝî{9ôB~ -ûyœ^»Ðµ´ñºü÷£Ô0jXA¸¼§0—pŸXd#cõ´b[/_=…ݍŒ¤—žCW—éÚVúêðýÒ bû«W‚Zl´¿ƒ#Œûïò#{\6;t‡±Ù‘ÄññՋX? -ú«šF‡xA²?µ…K¼ïÃnWö'^ÔvDˆÇøêó7¯ 3_ÐSžxQ0Î%ðƒUé÷i?j_âãÃx´¯y^è °ÙW.x´æ¥°Vj2¦‹>(y¤ñ„o$ã±¾Ûg¿ýöŒrǶ£Ä¶5¿¹rÄ«@¼Ä—_8µõã &Ó¯öµ|˯yæÓgðþŽm×ãþüEô{ÿâ*l`‡ç§°—[*ì'!"Þóª<’¼ŒWë#¾ÓŸ$[Wûf74ÓÕ¶g/y[†mGyüK§—£Ü¿7“ÍӓŒ7.A¿uÙÁt=kÞkØkDDÛl<ã|ml¼ãG]Îa~a ´ÝϻĪòGŒK¯å~øöl|ó{:+”ÛËØâ-ºŸ»|õ1å(J×Gî¡FoYæÏÇÎçœÁ·Ñî€vÆSËBº¯Wÿ±1â<§€Ž>©µeÍ ›¾:jŒÖ‡V£0>sïÁ íÝo倓/ó/ï"f‚Ç+nn׸—‚8½cÛËî8xñâŒ+ž<—WŽ U òJœÿН[6Ñg}ÜSw/§noeÃ¥êÔ'Œ¯Oì\Œy„ãÈôº¶¸4p4«^ ðÅG®VüªÖ¶\Å M„Ü–O MŸh×âV0è-çKâ#ì÷ënõï»Þô¦Ë'¡é·Öü0áäë‹N{£§+÷¹™/c#OOÃk~ÐӞðÂkÉûvëW'å:ÓãKIJځž3_k ½î+ì(š’±ä®Ð4sÔ¸_‹¦y„p20€¶énö3§gL…i¿Ó¹õ¬‹{ú nk-á9ZÂ-ñøzQ„Lý]â%ÌQé:7ŸêÐp‰~¥9K>ž6h‚žÕ7 ¡ãïÃ|ÞÍ/1/OƒÇl”ñP­^Üõ¼6”ëŌ†.¶åÈz_ã‰äböuü˜LÐ2öŽ¡æ)óÅDF5^ˆÈÙ½ã±Ù3ÀÒñ¬-Ýo4"¹ïu-*ã}Ý9Áøe8"ÀÑn9ÀëQ¿ÔybWÎi1f«J„rAT+”¸gÁΗ;<äGN¯+9tÈÓúæ"Á~iOzÄX‡Væv×á:i¤Ü·w/pŽ[£„o€á$¿BXKä†z“[ -Î~~ÆaDãæðko¯xe¯÷êU5Ym{G@£œK“'½mÈϜÏ은ž.xƒ(ãuěWsœÃrÅs=ZŽå¶¯! 0óXÏÈ{pg¤+ȉ6xòsÕY¡/J¼K-ÇúR•ôÛzӞ#5À6æb)ˆy€û‰×ãÊmëùä×3W_}<@íy»îøØ!ýlá-ãû„ m‰û1µyÇìW9b¡{¶i>Ž”&ÞâÓ×1¹‰ç“ÊüN -zE,(Æ´„t(ɃìwŠ ×ͧÍÀüáÆkÍÊ-»[ -ð¤ìØ£Ws",˜G -oÉÁ “Ò÷a?óNz憭¼Ç…НQyxÆÏùEÄ œÏ –h¬:Ùñ0£wêCû÷c<4+°Õ á×az¬*Íg'x{”¸<­BôÄÑyª·œŸV®Ð¼Ä^#ü÷“kìüzyª­JL1z Ž×sɯüqŽÆöԊDdáK b<šý žšq¨'ä4bd+Å.ÉGÞnþ/øQç¾¥ôè.Á¶é)ŽçŒ”;k¾ay„㊡¶…&Пii½†±9àk÷QÏæ˜$ëÛ¶ÜvhÒÂQ#¦îcd|­«A‰ßÙ+~í°7ÇVdqØאŸsËÉå@{¨˜¾Çðùb ³l—+÷‹1BÐØ®œ4‚pãâÂÐl2Vvm†\Ž9ɲ¾S0öi9ÅÛîÔ7,+Ti38Yè'âåô4ÄtHÆ æ4†þm¾´å–_¹µd㝠šž‹†ðþÁäÑ6¿'žŒŒÍ·« ¿HÓO„ -#'€¦£™(hŽ¿j÷§ûK-˜Ç“7ì(±FAn¿â–KùrÑq¬ԃ†¡22BnwKz4žk1xÜÝþíçș躽míGúö©{j‹¨?{ÏÆ#ÓBã þ°ÇEIÒڂdෞ™7Æ÷”«¿çj޸ՖÑ«‚ðAÅbƒ×ås]‰·šïV3Õʽ쟞ËL2Í7h×sEšïșðÀn6ú–£!ιœYÉo2(£ýÿì½Ûr9²(:ÏÑÿÀˆ}¢{]@…ªé˜Kn{¼FnûXîž^{ö„‚¢JÇ©Í‹»Ý?³^ög¬·ù¨ý¸2L È"YEË)s.™De!@"oHD¶B¢ - -”{ 8¨n š»:¥¼.H;/k)X{=È\4ǁ©» ­‘:¥Eå5f -u!Ø\<>$f4Ç\v]¡)\Šú^Âtì>Ë -n̎$tD8´A5jÅPڍ a™$cšú䨧O¶µ՟ø”!©±Yâ ÜôÂÊ¡6ܸ82e°Oo€P9!Q¹,EÌG£P”< †ØyN+%¤IÆzó±†ÍÐÑé‡-4O¡v:qG…,+ Oا4gý^Ü"Ϩƒ¢›äL4¤÷é‡ºS‚mÏ51@å³qs㊏{² ì¦@‹)aa˜g”h-3ÐÚg8e˜‘ƒ ”w6%µ‡%l‰‰@\çBM­àT¾mý*+AHdÀ `ASGFBJE¦¤,YÍ®V!hÆÁ"ì_Drú­bÿ'‰H¸U‚¥1&¡¼€$aÓ =ò ˜55V,Lef¨YƒÅ¸‰Ç £XžóZ àŒ\¼-"ó@É;“}¤Ù‘ú±ÜG=Lƒ–¨V!Ã>Oœäz[(Êí8çÍSm.ˆ3Bsjm¡hFEY´¹Ï{çŸÛCCr.渻½2ObqŠ¨c¹'-¤Îccb‚H$ëŲ‚A±±,ü¾˜'î¶/~CZ ³ÐC¢9ÉD -ƐRþ¿VþøAÁö¶í­”œýR¸R֎?pwË)ÁMJòÝ%M!PRö¬8•˜zâÏ 0ætC3›0„ó £å¼š8e¸ˆ¢`˜y〠÷AÃ|8”á\Qú9æ x 9ÇÇáL†Ïí)œMênò(/Gs2â0`È(Q"•”$]¤¤šJ¥hØ|ÂyÊLFÚžÌ É,ƒ×çòÐ2ÀÃâH• -`ÚW!°ìϺX5=„l…KÅ7pÈ;£ƒ™«¹âg!`åI«u¨×t¼€Þ7 ˗Ya¢ðJZpD–³D÷I ÆõƉ؁J‚WŸ0ž¹¢c*²¹ œ‹gé+X§¸!JÉ¡qT•Ö€*ŽËrb…âLþÜIOhl$‹ïŒIŠ0„è èüÓ Y“Âøc påo¶’“^U乩Óèᆟœ’Jó„Èr¿Ûb*I.LjÏùtNF‹´ ‰;ÐpcV²„·wLê®óې¤œ9©RZ®•Ý"em(“Ü–—ÎC~]o+ߐ¼IjLZž€r,—A¤kÖ ÜBMÆ茖áA¼Mý²êœH/Ë:W¾-%ì‚*ÑA»"ihó<ꁝάÛó©”TL•g \$‰¥Â)+é®qõÛsB'²ÂvåUR#¢hÞ¢ä€Sˆä[šC¡Ÿ …¤ókÁ5ƒñ€S­­.ž†ž Mþ -”B¾»ì[’8.³ m$ޑ1nÅûÞç{–õìg¤ Š»D4kh¿Â¤F>ґJޚí2˜Ó ÓÊùÜùˆüa?wsæቮS²|RFr½³ÂP¨©ïÊâžD& ê Ô5rl¡:B”¹´“tíy0IsGÑIâœ0`¢±n—Ó©N)òó9>“¬Ùe 5ÅX™×p3Zmè© -šoÈ¥Þ°aAA!<ìÌ:uAçߤqžÐ3$ã4ۓ^As½pŽe° |ð :áŽHƒþz “ØäYqvTÉÄç¶93DÑÌ© [,a>rÐÐ[Ct˜3OÉLóAÎøT"L‰ÃRÒ 5:µŽ¾z¸<Ù5ÙtAÐy_P.+¢ >„cre¨qA²V+CçáÂùf´dûŒAmá•Ão Ìhɨ v§“Œ5îrÄÓY§O ˜ïK˜Ý¢æ[²pPyŒ9ekSzµ3—tÞ -'÷Mù€K¡tÀ@êF8­ h%wÌ©„~±´}?’³ÃÖÙr¸û”†Ø+³µÇ =\-•ø“]¡1bu;¤æŒUäaˆƒ7ñ)sظÇYƒ‹ÂŸ)ôçہT&^²è÷íÝ^äœ{àæȯMï–I)®‰Ç¾5aÈÂq¡StH¼q Ž™Z°’€2¥©'#˜‚qåM– B€t®š ’Äð²òÂn®¤–‘‰”Ô¤›Ö4[n=šqgL®ØÊöïÕ ­,2O³sä0Yj¦³ÿèÛ`W](# §F±Ø§‰œq<Òïë³¾†; /¦-\º:KI5!ìþƂµLxD`8ço•ñ@S‹ÇšÉyÀŽŸÞèµÀ<§ÄýÄï©Ø’v?_ºÆYý~Æ2âð¤°"ÿª,ˆ‘IìIE³Å‹¾©Ï[‚çi)åÑ¡³œÍPðñ>ª‘€çVKÚ-i5å‘)šøCñ9xFL¼jsžÓÁ,DNàe·aÁXŠ…$‘ÌNµ zæÒñ°‚‹0¼ç›*¢ÞëôŒå’#<šœ€€p“F̤@D’ñ™IŠÙ -:AÀ8š¢ùˆ&ë`FSÒ+ÀÈM"èT0ÎdÆ`W†^êCÁæKêÝmûQ¤+H—à˜åAŸ­Êø ÷Acõ -LIað)»(ã}DrxVK·C¬)•áC:ؘºàÏÇá‘HElÎC“2 ÐT»×B¤%™¦ö)õÂ4èëœ`ˆŽI‚ŽÊˆ½€ê_¬Aà“ª zè¶P,«¡©0‡w„`cÉ8VTëÈí(.WÑ7·ŽêPK¶h„éÝØá”b¦VؐP•¾cŠ‰¾4cÐYØÕ2 -Ûz/O$" -åî8ô³‹ÓXx8eŽé#èÍ;\žƒ¾·¨Ô  ²ñ¡ŒHÓX¸ó Ô)͝¨ð4vI±Pg 0YÕdÛ£4aÌZK1.šÑr-¹e„Xs• LP`ÄÞÖ¸¯Ô¢á:wE0Ã0:UŒfBØb€G¤,ÙiRk§‚û= „P3H© á þdœOØÙ ’ê†ÃNkÈ0©áÆ9ՖP:崃ŒŽn«„U5L} i©”vÂÅZÊS¡BòDÊÓ Ìæ€ÁÇ1î+P‘¨%pmQ79­8ŠMB®Ÿðμ\˜HÔâ’f ÁÄs©­ØØçÂë¼ ÒUx!ã‘2Ncñ‡Jn(ÃƟZÃ×q¼bƒ›7oԐϓ°0ñz7y‡s'ÆÒúó¾±3Kp#!' € é—, ŒKùñŸgpÙl¨ú{Ä9m|0§¨¹¢çi‡µj‰${U~œ\ÿÞ\r@ïKÇñ)˜'¤˜`ýÆPddèRºUîò¸Ýú!IÓùÈŃܮ ֓ðeˆ_ÒGñ -xOô(=¦ }‡§ ”/Œ#; Iê¯õË2LÓj[ù¹ñ6Vðy ï a8… -‚*…(xoñ\/¨+G$+ò{$Þq@If im€•´Ü”MQè@A…¤r ‚ó&®ÖÏ¦3¤fÈ$r÷‚¾)<§Ö)/cŸ¹›$ä½D+ÊëJø{Èé?8O“Щ†$Î?_’ƒá/bðÀ zFg.ž±º“øôJH™% ¦ìÑúZY»1WëЂ¶ »æd EÎgQ,Xïߦ)KgTFyȒã *£Zõ•Sã}‰‘QRºr ’(–SÂ৏ L{©i‡ÆËË<†‚’†jÅõ1 -:õ«“ØS÷F»x@&,HT8_SŽà.ÇÎ7æú\`üLÇcЍéòhb<Æ• û:59ŸZn¡ûéë AºùQow@Ÿ÷†CÌ„ˆÜ‰‰?¶Ø}ÓÙ3ös*ÃIÝPaU²C2u¹ñŸ,ˆœŸxÆ"aч)ŒÁŸD«Of -ŽIjïð5DÊK#¥s!2{@8XnÍ £4’b!¸—x&KNÇOøè IËŽ×yÌ$sé§4Š4eiNt*y—uE/DÝhŸå¢`/¸nW!wXEe÷\Þ»ë‰U©&X°ƒcÆ'ô¼áÀj’;a¾DIô¡YdM8x¤œƒÞÅöƒ~dü¹ Ì3Œè 4.x“ӁŠ‚M±aX„S€™ëŽºÊ’xxˆÎÙ&®:Ž†”¨×y šŠsáVíޖq"U)D` B áÅÒ¯ïÜeÉ9q”Iªøå7´èøP/ŸÎX­N¨ÄX˜¾ÚŸG MÆ _ -²Ý°¯šŽŠ‘Ôc‹ÔñÝÃ2¡²88„ ŸvóšAdœ»bq Y‰XIÁ% Þ0´2!A†Ÿ“½2‰f’tª44TžÏÁ‚ y¸-Óµ ãÍBôµÐäç2P,›]Kxp‚‰+ØÂBØmxV-•þ̞*2*é—f¦3ù¾ pYòi@¬ãÚÓÁ?(òJS—ÊlX áºhxšÙc†jŽôF—j€@Ÿ»¼T„ÖŸk@‹›ç³†Ô9 ñ´$™!…äãšyšÆ -£^E‚Kœ<˜-8GxdÔe>ëa>GFG¬)¯¤þ¤£†2wô6- kØ2UØJ¥&½à{Õ<Ѩ‰Ô”[läÝQêh±b„Þ—9O²›BšOäflà»"šxÎW -3eaàL䞤b7Òйo7]ù¨±ä:‘I8yÊG¡ŠbJ0dM±00Y’çIB´E° ¢£õIä:H·”R8$L}Óþä8 uáVŸGÀ‘îæK2@ÙáŽæ³G³)É î®{YÊç(ƒ½@þÅÉÃϧtƔ–×=ŠôI5' ÛFð -æS -2®Â§,#R¨.ԑÐAŠú -eYTój<æ,r8’ª¥/t¦ -Àfÿpp–Á˜»è»f\r¹#%uF] -GÒi€Ýø‚S&ç¹ÇËжôÙA0Â±zÛ^²ñFgX¡*H(díÏt§ ­“Èý8ÇR0^ކ*(;iá{ 8½Y†‘såj¬xÏ)0ƒÉD3À ׳Lb@Mn.åË ©$ðÐ åtSß%¢(—ðe¿” ò18¡ðŠˆR,Rá”%©n1.ßIçpÉòd´!bEÍS‚¯\^ø¢0d3ÖW -a¯mÁg‰¡V ÀM´SâÈ60± öÍŠW¦mL^'—Š ,UªPsßÄÏ+ž¥X¾2ªÄe} N&êÓ)u77&¶Òx•p9T¨Æ!i -J́1*ãõgbÕ-ògR¿d”œ®C„gͅ iÊhý&Šåˆá¾ -H&¢ÒfyÆ^<"[Ñùä‚ä8¨+a¢† ƒÛ -h,´oZpATR¦˜Ò!à<˜ê:$Ê -VÙ4è·\K'WT9ë4* x)£ÓCiŠdkHO"´˜šé1hré;GL¨ð/xƒ£jW°Ðxjع©§u\\WûÁÑQÅRìc'>sÉR®¼c¼õk’k¬…"P:>š¯u7ªä¥¨¢zÎ5h2ÅJŸVQA,ì ª‡(|5/¨ÉžqyAm‚”j¸Péý?°¼è9p…È% „ˆT{v_QU­}ÇWTÑÑj€kÊ j8e”B4 3›,óç!ו O8G“OÂå*Ÿ WÏ[.¿ç{·THë†à†é¤ãv… ,04 W× -µ $ç¥ ->~ ÕÜ|„—qL‡©íÁI|§_|ÒeGmQeIò^TÓm$kjPR¹~_À³¨éъˇj{Æ[Fl%ÔláÛ]¾FBD{ÁéXîJ†¯’þ|t!#½•j¢,w , T⸞uÍ  ¢ -yT¨ÞÃù‚Q:Q @šêšjWˆ¨X_Q -endstream endobj 99 0 obj <>stream -óÂøRä…'B_¸à1‰¡/\áhX¹¢Ê'u}ᗆjäX|ãK Ûà|·–àÚ^|AàޓèÞ¯L³XD÷~elŒa1²p秦bZZPµ‘L‘Ä÷§ˆ—ñ†W*W>Êý”ñ5¹ -óó³9ßm˜³ëJð;äL]ÛéPe‹î6ñ=º¾…nÃÑJ>‚„nkŠ{Ñ^ÏÕŠ”ÏîÒiy(oÃî1_ì0(v¨'"ª…†£~t+¬æZdI¨Ž´Ô·xSÊBBœJeؔ|Ö7G}ãà¨ÖTn($™å¼â Ë}Mé3Èic…Ê;µ=š–q@±só†á‚£7yƇm§Cú¢/9€â;½Œ9¼´p)²nÌøi,ÖWðÂL£3›9³‘t«Kž d“(ûAº x¡3˜žè¨øaH(@átžÓèÄ ¿bÍN¾ç-ü+8/ -6§!ž.èjC‘P2¦ Õ"æ r9 §ˆi¾r?5%,R¼Ò99ěùЍ€j´nß8Īý͒ˆ–¤újÔË}¯ŠâBxªê†àáÆc<ÇÙ,áÂY̎>]ÇqÝÚPEçÛï:¿üméó7Ÿçç?Œ.'óéõ«ÞlVNFÕ=ÿqš…áŸÙ‡ÛüV¨ä›ï:~ ú~fqÞVÛ¾ï ç¾ñ¯ƒËÙõú֣ލkl»ã›ÿñžH;’-HûМ¬{BÒoÍIúíþHzüüüñÅÛòjØë_ÏÊ¿öF³òÅ`vÖ¿†•8:É\Ú¦›…F÷Ei«¥v]Þ^Ϛ µÿc3 -vM ç“~ùxx{Ýk>à£æìŒîoÜ/†óIc¢&åt>l1îÔþ¾ˆS)›Î.Ÿ”ï=èVsúªO5œÝ«HëH©Wå³Þ|:ôFÇG4"aýÈìø ]¶ØD.ïqiAQ‹þò·úVRc_DáøêjZÎ6/Ÿ»ˆ÷)*^"¥û,$tsÉ>Ÿ\õúåY¿7,[HöÊS÷5#‡ 6m×Ǔ?ýz=˜m ¡²¥}hE±k~(wHÔô¶ì¿œoXh{¬_‰¤ùl´¬˜{“~»ÊQ "—Ÿ¼7r[S{2Mg½m¨ Oî©Ñt$ûŸÆû½9‹~¿G‡hEԞømtšZ;nîSÑy5Œf§­œüt½9ókûÔoëû¬€mç‘mömyKb“‚5¾-'½Ù¸¹É=±/zÉAßÚ)óíd|s;žn´v[€4W¦ÞµïîQh4ßCßm ¾B‘Ø Š6ø¸*©}Páߥ-(J÷GæíÏ&ܛ f×7ålÐЛ±Ó¤žMz·×-(ݗ-y8˜½ê 6YÀ‡=y›Ùµ-} úÓø>GùE9y[_÷Yój½$¿„Aú¤ÙŽ`ŽWã~›GnïVãô`œŒÓƒqºÓÆiótûƒqºÇÆéÕ¤gñáãÁô`žî½yÚÜ£´ßÖisát°NÖéÔÁ:=X§ëts?öÃ:µÊò“òzTŽÎ7¤¹m©-ï£Bٜ“Þå`Þb[¦ö÷%2.Ã^‹“ƒ©¸£RñÅxr{=Žß6×{bq;±˜Ä¢§¯9'bñ bñaŠÅ&ãËA99(Œ_„ÂXÚÑ>ƃ`<Æ‚ñ 2>|•ñ ‚ñ  Æg½ù¿þsÚ¿.'+ýëßáŸQ9ùDáù}“‡ò”‡E÷™9,:O_sNÝaÑmžOBòæy‰—éي¤½ÉõüËxøûMoZNæ› -©íUÂgiò…%|>ìB)‡Büw©tíþ¢(j:/›«Û»¦Iîš9Ü.А¢Ãퟪ8Ò¤¼lW7uߤý¸Áõû+ ÷ÿò„«áx|éï¸öúï¾ï8Ðø¶×Ì>ü)é¶Ù°÷éš$úÁ.¼vÔíÙº{ -StŸ—ÝGì‡Ã;m¹ÂºÉ®‰ÈéuïrüëÉC”_Xyp7£ZÞïTyè¾æb»ûœª—A5'uñ¹û¢¶ùˆ^®®æÓ²ýå9KÞ­_ÆõdÒN÷sèÁn€méûD›ßÎí7ió5Ûû}p3oÇåîkгæ79”Cû­÷=zä¾ÄM®yå¿=Óèž p?ۙ‹¬ž8òî±ú²t°ƒ^²·z ] y¸O´ÂŽÃ}¢Í¨ÝûûD -Úþ+hýìóèg‡‹Fᒝ—l£´²+w÷ " --.³Ü“ G[\fy¸pt÷)ÚPN¢BQzµv ïÍf|¸pôlˇ G÷hO>\~ؓwzÖíɞ¼uؗwj_þ÷òîa‡-¹ñˆìڎþQIέ§ó}Žöá.ð‡:HŸ´3û<[Wî,·¿Wî|9¶È*Ø×;w¶ ’í‡öØô®ý×Æ­B7=‹®y© }ÚD'ñÿ­ûĐƴãÇ¢†ÚïÑRÜ)óÌ>=ݜì¸ÿB¾½h°Fw[Ê<äï‹8ˆy(~º‡«îèá•Ï9jníKýœÏå}»â^ÞËYõûû_pæ#Æl¢T<•³½‚¼/Â607ß|?ˆ¬‘­lgcó­û¦ý‹n‹£ˆýWVÞÃÞ~¹*'O“qíÚèÏz-F~Ÿ»²ÓK¡‡;»¦“t¾¬™øì0wr&Š/M$ïBŠÚgP•àͤ7š^µ¸-gWǶMŸðøl¥ïæç.iü·Ïš!ÃôÉÇÃá® Ö®ñgË)}ÈèýÈÎì@GäÅzm®-;\¬·†ÚݸXO=¼‹õtsŠöæ^½¿þë¿®‡åñ¤MŠÿî_«×fò}a×ê‰n‹0Sïr0o!y¨ý}ûå`ØkQÞs­´‡œùp³[ŒÕ~•Â{1žÜ^‡ã·Í·ð452q¯eâӄŸ%1iÇ);HÂÏøޓô臗3vÑö¶¤=ÍIÛ3ù°ÿi݇r‹Äío9€¤…Æ»ßåš'žîk5€62s_v¸‡› -݂´=ÛáF=ƒ %céßò²œ{¾%§Å¼Û›”œ‡(úšOÀ½}ÍIÛBôÝ I«ãˆàÉuo4*‡gå°ì·r°-?y_Ô>nÑݚÚå'ïy[{2˜Þ{ýò¦Í^ôn÷yo{ÀµzB=žÎÒGQùؘü}+×ÓF¼îËfØܹw›asÒöÌx %‡Ú о,§æΐ}[N-.W¼›óÅ»>€_ÈEÞW“²ü½¹;új°)¡|!“r¸Súj2¾iA¶¾/ªšÏàÙ¸…ò9¾GÕsƒŽ»ÒË·mö -ßü¾ë í}hNœÝf½I»=Ã=pos±9q—-*9¸Æ÷ETóý-"ûð#’єЅÇî‹äá`TöšßÞï û/Æ-Ž”DO܉“Íôòr0¼o3–üÄ}Ñ8ZØïÏoæ›sÛ*$FÏÜ«‘Ô nÚôüŸª#§VÍQ~È\Úy´ÿp3—Z¶gþœCæRƒq:d.}¶Ì¥ÃM&˄îkîR©¹/{ÜÃÍ]jAڞíq#w©¹ -¼_¹KmæÝÞä.=DÑ÷ps—ZvÈ]:ä.r—¹KÛç.‰/.w©xݗÍðáæ.µ mÏ쀒»Ôf€öe9r—ö;w©Åî™Ðø!´}LÅj3Àí…Î}ðVE(wmxÚä†ç³Ï'-b³w£óI;³yˆ\uÒÑÍ-Tǂ×mŒÔè‘ûRb¾ÄR®ŸŸ¿üV§·ƒrxÞ2Í᧞Oʛñ¦»=M=Œ.Ë«ÁhcùŠÑu[öfOÚ¤ÉFÜ¡‡Üm6™÷,w[´ºýIÞn¸+>˜Ìíé-än2·™Û­2·ïGâtÄ÷2émÿM:öÿßÛÏöï÷ö‡æ·¸}Ddæþ¬¸-òÕwM[{ȅ³/6:÷Ø;n¾ïx«!<øÇïQ„.¸ûz?˄·[b{"úûtÕÛËù™~7[ÀýçÀµvÍýgïZȍw÷(6šû|ßm ¾B‘Ø Š6$ZT(R÷h»4§hC&V…¢ôþ(ÚNŸß—­¸7Ì®oÊY =c·ä­v¯}ܚ?˹ׇ´7ïc@h»?„ó?²3;БC8ÿÎoLñN…ó[žè<„óáü՚È!œÿÉìC8ÿÎßýpþ¡Û!œ¿/á|Ôo! /“ïÛ麇þ>¹üöÃYtácËCÿ㌪Cÿ®â n͜µ«“Syè¾æá‡r8ÿژÐáàíõÌ68êÃÙçæ´.>wo–Cs»apu5Ÿ–'ã‘5vF-äç҃÷¦³4¤óɕUS[ÎßêSû!H÷dƒ÷sèÁîñméûBî§8x^ŃWñÞtƒyÃCíàZ<¸®Å{±À¾;)ËÑ÷V›-¿·{åàíøû÷ƒñ°œ}?)/¿Oz£M¹ Ÿã½ëo"oîîý>¸™Ï6a¯ÌUzà¾&j֜¸rh¿µsËEÜ³ûêÉ ÷SØ8w ]Èö¥S¿‘ïó±²ìËq5ü/{ë™Þ–}«L>Ó9™ŸŸž?üvk5²6ÎÐå'ïÜæ»uº½ïwùɃ'êà‰:x¢ž¨ƒ'êà‰:x¢ž¨]öDy¿“óDy·:¤ž¨}3´ž¨»òDÝßVyßÑñ/Å¿v捶‡à`{ØÝx͙m¼NÚƒ?ݾëUMö¤òL‹ª&‡Ê3»OўTžié¸7›ñRufÛ:~û±-³W½Á¦ÇaOމ=ùP î°'ïô¬Û“=y;;ë°/ïÔ¾ÜzçÚ·-ùP®åž¼yíûPî#;³yˆà¾Ðêhgýk‹´®:;TÞ¸Ã}ù^ˆk^ÞïŽ*oÜçÆôPŠT4¿¼ý²ù-õØö¾¦a Š>´ èÞH}…ã««i9ƒå3)/ÛIû=5X^"Å_°µòCþ%˜-»6\Ÿ-t±w#u00÷ÏÀ*ù¦ñ$þupÙ&£Ñ7¿·­ô ´„n>œ-ô¼{TóZ‘ÔB¿G]<öp|šêï÷#KÒ²äºl•©Êíî›u:Ãîbûæ¾Éî›ýÓÑóç¾iAÑÁ}spßÜ7û0ä_‚S`׆ëà¾9¸oŽûæKôq€õ<³úò´¿Áõe\MzýYoøãxÐâT„{¼éØóËî©TÀÙl0k1âSlþf0lsP¾òÐ}‘št›×ºèM˧“òÏËQ¿…Þ¿ðؽ9Œšçuæ7/í ßf4ãgî‹Äþ'ÍA¼’š»,÷ÍÙӂ´CñüZÅ¡dÙΕ,k±¡\MÆ7-[ß]Íoµš[h:ãû£éÁWa{EØZ¨a‡lMé<Ô`{ˆ5ØîÏ-¶E²Oå{3Ÿ\̇VX<Wê¡,Ò^žôlcêì—ó{«Ÿs ¯Í!eð¹Ó[ æ~$ ¶ hoÒ.'¿&åp>z{¾¡ Ä^¥ ¶‘%_XÊଡ’xˆèì~D'ùRB:ÍóÔö5¢Ëò¡'uìӃ}zÏöi«ev°PêÁB=X¨ u7,ÔæÚîÁBÝc õuølÔæböÛDmNçÁD=˜¨õ`¢LÔ=4Q¿yü\$ç?Œ.ÙTE˜ÐùãÑ+‹/Î<òðc¸5þåë¯~¼ux”ûñìÃÍÅxh»t\^ÊÑU9¼„BÃAù¯ÿ,GGPÓa8»þëÿô¯Ë—ïmŸ¿N:¿þ*éüòë×_Íéÿ6Ž<øKøGtüï/àÛ¿ÛOÿ´°_;ªó¢ó÷$Ë¯Eç—×ð›íQÖM’D£¢sc¿ÁßÓ¯¿:⦛i#Sø -ÿƒ¯™Ôø9ëœØE'ÆE‡£g°M­àÏix~¡æð5|F¤øà)þ¥_¢G]¶m¯€K|n½?¦+­ þU¶ücWᯣ‰~9 -͏r÷nû×½>ÀR«?â~=ÊQG¹#„‹É=ƒrǟã ¤oÁ̺켝ô`Ägô;«£Æ͍ý{l‡ç(b“DtŽ„Å(e'L!UÇJu~¹©´”¢¾e¦;Çý¦8›á”âÄQ8>¶“ñ'¶¤k¢IˆŒºq³ª:G8ÍÄ´#ϵè/S4z [ýڅ‡ý{¬4ÒQ¢ŽÑ0¯9Ù|ä,*™Ty§Ëéâȉ¢¾e&—Fn5Îãf8¥©ŽÜ·ßu~ùÐûØJª¤›*‡AÏR;Sì)´ÐöƒÎÓLÀáÿ¿ô–eHÙÍe.ҎêJ• -\£GðYf0÷ü0Äð¹°ÝÊúhJíhÝ)Rð͹ÝÁfÕ}ú›óo-L®Ó"|ÇǏ!ðõxJd|sòýÜ÷ ÐÒknÂë:VG@Ôl ÝúÞÊnª3Q¨¦½ýi*R3ìN“¾‚²@“Ñ¿ÝŽ'³7´I~sžtÇÃj£QïbX>›.½^ð͹XFõÚn]ÓÙ;!T]Ý)ýß`"Üá¬T•Yiª?(]CšªLʅ'j(’ž ééI<ô÷nç¤Z¹ÊÔªU¦V®²iO‘öѸÐß»œƒjãS«Ö˜Ú¸ÆêèKü”~šI?ï’ð÷§Ÿ¨ —ªþ d U¢2Z O,#-ґ’8 -üŸ»ybÕJ«V’Xµ’êIюgßtü`ø?w9åÄÊ%$V-!±r Ց‚¢ìÿ -¯aÐ_$‡DݝL1§Ԍ‹Wª–©¡'–ÆÅý°D N1íf“vs+¥?w:ÅHQ ¤Ô¬–RÔ&R´#Åëº~0üŸ;œbŸzLbEäöLº…”BäØ10^D!…XÎÛéôÁ› [ð j¢ ËÐâÎvv2ÞÙÿ•¾=8½¼Ë¬—N°SÀ<ò†Ú*75¶ -1«†Àl0>öaªŠ²qShIÙA¥º¦­Î»Ë~ÂÕx—4¡Uxe±4–;dÒ£5ŸÐ?é}˜ô“ñíåø×Q­AïÝüήßÚÙ_t‹T -;FèA¿YÐQÖUø!†å]¡3£:y7ÓÚ@˜À7ʨNÐÏK®ú€ê ´û -´Ó{€d6F}] clôÆÂ7â~¼ù¾ÿE@D4ˆ˜@xyw²Ö»g÷“˜"kêÝsBˆzš‡!.%ºÈfé™n†?0 êÃâa @x9åPÛ~lxó0Y˜ Œ -ž”n •çRAu¾8«À¿<ùD¤Z¢5ã1”-ò¨©OþÒ\di.ºYšØJ‹$#É*pˆƒ,ã?z¾Ø)儬ýbq¤+ŸJì«D’G¡´mû®ã&ïRzá5,~ïjšþÛJ9ÞW%ÄÞyôãxöºì'—v輸_9RK"úäñóg~¸ß\'7î7ê´á—ã‹òüñóâÜöùlöaXž‡·/.A+¿Ê?ï¿+G‹ÊþBBH¾*W>­¢+²Ää9ËL¢s˜^yžIS*[­KÁ ØM´ÎÐ6…¯ÚÊ‘Z£·è¦‰ÀÜ“¤Ö”Yøl…¦•Yfè4€„ì¦2„Âí¬…%I ífhW·h0f]™‡×ò®1™r=)¬1”Šn‘—@â-Cϩ׍*¯:ZìÌÑb‡a—©¡ë(&¿/òæ(æÜQÌUÖð]Ú>`þŠýb;”Zûá?ÜO–ÔÌhȆðXALƒÙ"3úxBúïLpāÚï¡}@_ªoŠ:zwâ¦õ;¦é}ð’X† ©V}•i–:%&Qº Ó’¦›'º;–žtBJ‡–HÉMáຆvûÓ5€xŒVAñéò»\°Yôú£ -€ ØûDxùâ÷*RË~Û[àëÿ•FÊÀÓ²C»lî[W«´ %Æ°yAŸyÙo]-•°O,ÓÜ¥€b{xõ û¾v˕#²ŽÊ;ʲ_ GFn»ÿ¹eûƒÑ»Þüjúkïm½„ÿ Â]ØÖAoˆà‰œç·H$OePÃd³óÖ¤BÁÔÈ­@1ô¯(Tª@ÊäfZbWW^ä’£î -Ìý<Á×;˜•-IîœÍd0s;OKØcÜwi¿[ cߝâ#ÈSçõq=$Ði ʜ£‡`B”¢‰Êœø)4(¶ö­*·bvôHZ€†ç½cƒÐћv³D>Rm7Œq)¢$ªáÚIy‚Ù^eÐÆc·Ç½Œ¾ûíÆÑ¢B< $ -}Gì¾eEq¼Hàƒ]‰EnR¤(hyæM߁ó¾/âûj‡J-”¾¦ø^K l2^zÚÍ¥ÊÄrb@‚Ï=ÍaJ$y’xÉimÃDÙ~Û}#×>³Øp¼r½£Gk@ŒÍIÑÌÂÓ4ã¦ö–'&‡¼ÁðtuÊOùÉÌ©TË -0<‹¢ÚÎ[+Aì\Nä@Á[rRv¥1)ÊH†Eý¦Gk@„ͽœ”*IӘ†ÁÒ³¨ã¹n'¿ÌÓʚ^²„-Ä%¬iíÖ±ýô|ôï1^ýÑ`'t쪴*W¾+\qhnzHN¯ñp… ëÁ½Äï£b¬ÐâÖ¦Ë2+t -Do!uÄã ~.â Tû¼Ñ1yöé"Mø)û'·F8é+¿•¾_ô´ï·Çè²íp›÷TàKèiúÊØ àßNOû¾UûîèÙ±ÍÔvM*ÝÑV4©†mUê·U£ùÙ·Õ§ƒáMý1ˆÊ¶Ú|“ÄÀˆSÁî;ð·ðIÊö3æìì4‚Á‡ÔN øgë`ѳWÞ¦ƒ¥“9:é%L)% -»Ufv#­ѓküÜÊû-T½ßB‚èR¸é›¦UÆS€Àé Cüv „î2Ø7­v+]5·ÀT*Yÿ¬±«Èî”öÙ³š]ìÏÊþ,w–’²ú̊÷ÚÎå…ǵ6Ý$…<õHç7™(ÐߨEšä+ž•€Ybæ øûðÑf]`÷i—™ØÝ{ü4>×ðS“„äG/zÓw îç£÷ådV^..ғáàöÖ®‹Eø“Á–,µÿåÏðïþÁƒEv ”âo¸>^÷¦î@Ò¹íŸèüòÌùÜÊ÷¼›êCç—òwžG˜[„ÿül»–ò/×kÈ5tÿË£y¥:ôÆ>}ƒzқõþdW›Ì¿þê—ç_ýá£ÿóÿ{åþ/ü¾úçÿþïÏóûŠŽ~?üþ‡]˜Ÿëß´¾>î? ìÎR%Ú_X|Yh^?®’ª‘¸è<ÿþû‡ÈÙª&ñÍ9Jå Pœÿòÿz…ÄßP!:µö9KØïñù2J'Þ$ˆÔ͊D‚¡„8°¨‡,´ðBýßæ®gÛ»ÀK÷ç-B—5“oÎët“k"C=´‚áÊ¡YVP"h¤X,ËJJFjÊ7ç ¨­U«÷n¯¬|sþ1êÊ7磰|sþ*Kӎ×*-ߜ?u3ÈEî\„~µÂÂg¿­òðøyçñ|6î¸%9ø½ 1¡åèÚˋi9y_^ž[þܵšV—ïÇ£ñ¨SÈÂÍøÅT¦$ -s$© •ý`- ;ÓÂHðSà±ZüÛÒ!fr–æó‹¤,4YÝ LàPŸý›'näÎqd§4þB€¯³'© -ÀS”B©øQ;¡œK€°GìƒG恲+`DO€©Á´(Bo?8O÷‚ ˆMð«æ=Ž¨ð(ÓÍè#ö⤎gdÌp*ڑe™ -ÏÝ,zˆÀ wÁšÞuǝ·«½Èò¼Ú{po#*µð¬îZτÀ¬dXÄɆ¤2jæ÷ f$÷5æ$“Äϲ=úÀœ\âyØì3W‹9ý¤ïŠœV™_¶#¹ZXS°!DXá¤ýX¤&šÀb0w!à!Ìˌ˜wºØ£gŽp/*’ˆú[‘DDVDL:I¢$Ñ"×NÉ¿›WÔM†´ZY$r±C€ÌÑE…“VùÃÓ'Á+›VØ §@ešG ¼!NFÀÀÉ -H 艡'¹»#™&‚ªîø;qq‰[ÛL‹l‰1 ÉÔ‹Žyfwv¡²ª”Tv·L¤©ð0µ$%iÄ´›)8:ʨc10ÀÿbÈ˜‰üúˆyÜ͈yL Áµsü˜·Ä%ǼÜÊ ,1/†!…y$U‘¹E+²¼Â<ãrbÞY½Mšxͺ¹Î”˜cñ.ÀïbPȘ‰ôöˆuÜɈuL Á­qüX·Ä#¿W uYÐ@!ÂæﯰŠi^ÝP ΠT•wðþ4—ÐÁ,xˆwxÀDÆL<à×Nj–º1iá™Z9úNÌ[âRˆÔ 2ûWèÜTtÆÂ*¢¹×$P½*ºV³ÈƒÊHßc‘`±ÂžóJ_ÀìôúX]D£,3mþ:{Ï£†Xñ›¾Ÿ‘ªH XS ÏsàëOj¸ä™GjNÌ<‚1‰¤C1¼¢3²˜y¤¶ñs¤Ø1fÄÌcXļæH$ÔÌzÌ<ß͘yD -?Ç Ì€™·È¥]0fÁ˜DR›˜ ¤\ÅÜ#-,æéjü Wæ³ÿóŽ@ëÈÑGh™ôî˜sÔǘuD?ÈäêÀ¬[äтòWY´––ߦÃâóšTÌ:R¹b֑bÆ’êƨ 3a÷"˜£‘P3èý•UëûYY¶ž˜°l‰¼l ,Û>Uµ½ˆ{’yå($½ˆX@ºSÄ:Ö±"Ö±&F0ÖÕ1"ÖX`] Cú5q€ß±ŽºqŽ(! ŒD¼ÑwbÛ"ªê]Ä5q¤õ¤4E\#Ý*bé_"ýŒ°Ò÷ˆc - ‹@Ha%ºéÅ·¨{·ˆ1Ñkô¸µÈ—ª>q‹@DWÎ…£›ô¤ˆ[^›Š˜E -H!#¤ô=bƒ³"’EX‰lÿވWÔ¹ˆWyõb’=Òè;ñj‘+U.⁈,Ryx=zµ(âiO³HÃ⧼ÆXý÷ˆY -̊@Ωì±ÝôâxúîEÜ" -ø)"š°†ïÄ­E¾œnNIü´ñÙÄ;ñï4N›tðŸt¤5ŒqZn ×ÐýÛ$N›õÑaZJ¢ÿýwøþ±?þ¡ú?útøÏá?üŸš9ô‡»™}«Üö?‡`h}0ÔÅAkƒ4 àæa¹\ Ô8ð6¡÷äR°fÜ&\.lÅ[…lêxˆGn‹¢˜\NŒ§Ð3FsìÓuñœp‹ˆŽ}².¦cÁÛFuðÑå¸Î¸Ed‰[Ší t«èN׎@mØgÜ&ðc­ ý x›à>¸þ©B[€²å‚· -Õqp=Ãë¢C à6ñ!ûh]„ÁÛňðÑå(ѸEœ©[Ž!x«XQ×2½.ˆT…6#ÙÔ’¼e( ­ &-€[„“¬@­ (Á[„”j¸·–×u±¦*´y´ NÍ.Ǜ hÎ6'xn9æT…6Ž:IËq'€nyªáÚZׅ¤ªÐæA)HZ -Kp›Àd.-‡¦ªÐ¦Á) h9<Ð-T5<[¯™ÔD®ªÐæ±+û\Mô -¡[įð¹¥VÚ8†…$-E±Ú>ŽUõ [ár€+‚¶ qEÚvädŠ”íVa®H§ŽœMUhóPWP³#ŸS¤e‹6á®®­çqM,‚¶‰„Eêt•Ç[EÃ"¹Êã­"bA®òx«¨X ךéÐUo0‹ôç*“·š-¹Êámg‘â\åðVÁ³ž5Sš$Å6qµHa®rx«ØZ¤W™¼U|-ҔdÅ61¶¾5Ғ+LÞ"üiÈo‚‹Ôà -‡· ÃÕ¸Âà-BqËüj¤W˜»E”.¨ÄÞn© Šo…¯[Dë‚.\aê»e>5҃+LÝ"˜Ç:p…§[ô‚¦[áiû ^P~+,Ý"°·Ì¥FŠo…¥[Äü‚Ò[áéq¿ ÚVxºEì/h»¦nÿ[æÓZ¦®®UøyAäΎnu"ú¯“òr0{כÌÊú2#‹ç,>aÅ,vájø§®Z’, -wÕÖBÀ/îÆ/ühw]W[Á}µßì.LßýløÄý)]µ$‰Éøá«ѯÑCӉ«n½¢Úß3úD˜"J<'.ajq`šL§ùµñÒÿ‡NÿžøÊ=>w<ü|=uäPaÛ¢ÒÁå¯|²Ü5u¿¡¯™g~ç(à¦øÒ ÿ:Ž *þ â'=Âߋ0NÕ¯;\Ê]ˆÏ^®àÕË3qôæñٛ‚b>`J¤¢p“CZ})Ū[¤Ú¥@,µ/R)Î/‘®I»™[ÞX>ÐU³Ð4õEt”+#¯–\ÇÊ®KPÛù•-5–6AÕl‘ -1ºŠTå»ÁWå_£_d€ÏoKÜ£PœÅq…*’zÈi€˜¨¯¹¯œT Oby#è}  ®D¹šÌ7e\êYÔn¡³;»ÌL7µ²*…$PçF¨’¹:bÙç/Àõj|ûÓmå -ÕÚÊêíoOê†¤™/ì$\eNWüލZ}–áóQÜè(Í»Fà·#…çáÌl’'üÕç¸Âg—/Š±îŸø8<XVc¢§¡þ[åºð[G¹‡þ¥§ô‘šÐ£ÐӘè“P r”ˆë†>ú+Üg,¨ü4Ç2a¼QÄ3$ÁÝEúÏÄ5‘¦Ñgÿ0> xsºÖ¿Üu*ô„岃£–époŽÞ ÓêGßîçi<ð‰ç,b…¯Tè1á„;tz—Á‚“óh‰Ï `—)¬]¼V¯jkÄâEkñ.^ »¯T›/…9xSenÌôh,¢Š†.â>1Ÿ†šgC4F'·¨C'wqí«L/^͋ÔñRWÆ´b¼ã®¾µ)–/äX‹û¸9n©/Á¢q¸‰VÚ/µh ‡‰}fö₌—ª¾“ÊʎüQ< Vñ_´â–ÕX_$uü÷Wµ6Y=ÿWâ>nŽ{‘ÿY5ʋÙÎá‚r£Žsޗ1”Xæ3g8ŸâN< -ÿ¥+?eŒX…i±byb“è£oq1•>¥‡Eu,ψuåÐö¡ØtÚ-ŒœÔ×u©·ŸUz}v¶öfØOhxÀ¥:ËðFí"Í黃Yù €/V+7©F·SŽ6ÜÃ]ô—:@ìL‰,´)¼'”±€^ÕÇ]fß ”KûB,Ѕ\ˆð&ôñ(“ë7¢3–Eªúk -«?úåÅéOϟtþÔù¶?˜ô‡åyzþ]³+íÐÙìÕÑM»I.Ðeš•:?JÒMsa×>É¥$–k6V?Ó Ú@*¹¬ºvÖXnR(pà¦8¼Ê—d̋6JÛ8I=»¡¦Åç*»Z¾e~J Ä¯ҟ˜s@(m²Ì›h¶?"ÇK¼ pðwà¯1½’a¹íEjN– tK܎•°(b²3kK( qì+³"©™g8rGp†Ë{²¿™,Å e¦À¦=‚ÅBçÔ}„I!]EEbSœM†|ý®&¸ý%M¡3ÕN,÷sƒ€º+ nH;JXÉ—‘ ¼¨º(tþÙ%Ð'¶¿ìfæns7[ælWES»“y \yÁv’¬¾HR^d‡í/÷˜H°\.às֎ûpʯT Y&Ñ!ºƒX½›Ñ#~+ šº{zÑYS Îp¤ÎJX…NË¥w'Ô£„ˆ¦OÐÖH®ô|äÑàmXˆélž‰H³£‡QëCFÒ{hߦ'Þ咱-Âe[û‰'åܞ,¯èQxÉI½ÍSײÞâY³ÆÞ©k¹ÊÚ©Üõñì¦ÊKÖ~W|ŒG£2NÌà#âpe˜—怛'ñD©û@Sk†Ö,™U~úðì‰=ž Éý»²§´hpÅÕhóP|¬®e–7Ðã çâè¯À¹¨Áïµ¾ª:Yªjúù7Š¹Ý –êäóÿ>ƒÂ -u ­Ê[¥U}µ ¼+Óƒ—…ÆBá¹sËBÂYêJp%\lRíõU¡T¹¯I!ÁyŒÕ‰ ` JÄJ¬~Rdv'°çWƒK VœU׌Hâk? «çÁ_„ˆ,ÛÐu•ôڗI!g÷Vxª€Øªµó¬‚ã. ±ÝµÓUCIæÂu ªjx2‰põ “f®5fCR‘D€eŒÇ´À¥!é@u'~ŠÊéŸúâ‡þØäKŸ™Òr€!·fyܺÅÈafÝÒعôµÖ£g«?ÌHÚb]Òãâúš­G±†kˆ M™ŸÜ€¸Ñúæ<¯¥ëÒCŠ­Q!ý.èâö©,t80‘jȓ0].ýïÍRбð*EÐ*ÚÕÀ+'/™–Ÿâ¸¼á℟'*§»ã=0 -v¤ÎâÑ:‘Ìt‹¯ßÃ+ðfRY ÉwìJ…°àÕF -ÙZ1 -‚ÜišàmEIQ‹ âtv#ÓJªÜ?#3k¯)íºtg˜eÃ4ogeôýÄÕ³@²«Ò¢€Êp¢Z“ÉÀøٞK)¨R$q(ûX¨"Úݶc硸jœ¡™¤.|>q6jž¡¾c'²† Œ™Îtg²f‰'X©͈ð[ê2Qᬼ]1ṕŽà~ »À)t žÊ®Ê2¼Ð Êô»ŽX;Á#M.æn!Bä>îÉX1¡ -¼¦ÂšÚ°ÈN°¤F‘ÃzvD…Á+'ð9«:9$½ó®iK ³±sKk8ââ=öU(iTW !SúŽÖ¨µc҂é׎H,A*`eçÊ_´€ºÙ ތaMa°nàn"wšU®åЩ«(kE–ó—`ÀžÂš¨.\»¤ ÷¼2ÁÌ;ï‰v©:'x c.©­Ãh å`™“Œ ’D™¥Ñ;©ÑP¸ÔΎš€º£Í.µSxQ÷ò¶K¶½¶;€lÊ@²¯é(È ÖîÂ.©?rÛÞÅii;ZÙOµÆ}²…aï쬮SÀ$] -«6õ¦†¤ÿp‚Žd¼…¿;2Þ ÄßáA»ïRùƄ—™Ç濃‹ÞßÈ#õJ>ÏݝH€Vº)¸ú¹Kø-î3Ðғñå¼…•Y@‹_|OÜ•<áÞ ½ø•z·ÊúÒ-Œoá)ОÒa²z‰q?b!âe{ /¤Ì7=šx¥Ê¢‰Ö⽋6[³÷ÖÞxº¯¬Ì’›è;O£Ê$‹g`Í åًŸ«óº2åu4ØÕùW3KUuJÞExŸÖ00gÞ«š1‡2Üp2xý£™©óï]²Ó½·vÌ}4 o¶¨ææÇ[EÀj6Pv:;ÀÏ -'KŠšiBÃrS»,£KæéPôЕUZó*zòf 7|͗ñր¢‡ö?æfu=¼¨ÿ‚ w»Êû¹âõMùÛ좜”ƒþõùÓñ»ùtU@î5Úy– 44rȄsVFƒ­™¡ð(E.S«'þòxՖ -k‘Z9´¼³¸–å$Vaäo§ô툾Ö|£/S7³èÕ  s»,~ýÚ@pYÑ澝ҷ#úZó¾L÷| -¸7Ó*exf§€[<Þ'Ÿ? îÎ;O{ïǓÁ¬u®£ßçWÿú¯š)? Îd.`·z'\×øsÂ]ô  wû¸Hð–îºlÑÍDNùÑrL )N֘Ìý‚÷1&]w¶†ÏaCª¢tB¦YႿ`Uôh5ؽÒAœ™­ÁG£L05³–ºÊwO£îdŸ«_wÑ:‰yF¨}1FUXØ:4<C*œœ¶€Üù]høÇ/çn©äFڎ\.i.¶(d…à:ȀëÄ&û×Zâ&pÆEc:¼ç·S–ŒƧ¨KgB»+þRWEE'*GÝØe¹¶?À;¯v'9žÐ³6¤ 2Ã}›hiF0HGÎSŒÅCÑáî5AŸñïâû”b¼÷ÄåÀPß ŸF›â„v¼C°G&.v‚#b'ŠÐ0)˜“{0]®¶0•Â£A[3Pô±*¡;N°Ô²D¸Ûza€ÑÏAŽuI;7úm|3 ²p±{B&eô:˜ÍÈé¨l„„~㽬*­Ë'u.ÏL_"ó ¹t”Ê°î₨¼BS -²Ã³™„{ce7› ¦‹ç ¸8UD3u&ä4h¼S1“àßߊK¦†“>™]"J[[[uHa`žA‰»ñãûºð×9È.SQ¯—ÌEz¸NS¼;;CÒéd¥sû›óZYÎÇ-¥8>k䀷”h®3[É4w¼} ©ó%–kp\rI²Á‘¸¶²Ín¯[I7ûÜVòÍê5ÎAÛË8|nIÊYhœ³šìV’Î>W#ëÛÒŽÏl#ïðØæV¥o#óÜ|ßFê¹E¶•Üƒ0Oäð6²N3·•~p®uIþº$!v³… Ä•!Z’q´Ä{öðò¬"w…FÛƈÒ20sƕñ#áB¥N4à N#jaôè©SLÑC]P¨4~´„<4™O=ŎԀ¢qdaȖAQ/é<]³kÔð$cø“­ | Ðèe."·È›u? ¨FìݪV¯áSVúTëxví¤×=ƒ¨VÑQvAf9zݍDZ¥’ŸÜ¡€5AϏ^M£™EqtäáhçÅ¿|ýՏ·ø[î~{5œÛ_^üӚÇÖÄ#˝ãÉ|zÝyÑõޖ“ÎËÉ%8í7üØq¿žô†ÃÁÛIïözÐ÷MßXN?꼞.;G´ójÖ}´Ôø»Žíñ·õX ±ö™…ÖOŽa¯mÒñ3v–¼YV_WøëøzXNgƒ«µ»/i+Æ(z9„ýèòê -üŸÿïúoùòÊ$u/·ŸñîÿÁsþI;†÷§´òöFäßõxÕ­9œ¼êà›Ö -=˜Gú/pìQÇ5 ¾#ÁŸˆO|NrV-÷ïx©9?–¿R뎨~M—¾Âa*»·¶`AjûMB¡È­J+/’•¼øC[¸ßì(žÍ>Øûú«Gá7Øh¿}<ü0öϝ}×yô£@Ø®=¶{ñû’=:ß܎í}:Z’ñ¹“ëÞ`ÔqMØEšù6„þÑσéÀnLj´ÉÙ¬×× -Éqo:èW0LÆïÊ6($þ4|9ñÖXù°lÏ^—ý±Ý/ñW×Ðs£ÓÂJJá£'åUçûÎ×_u¾p¡fð}_Þ±úAçÑ«ÞdVKåÉxt9̚¸Ðފãëyèg^ò„únyvwþ.ºÆGÔÜ' A:~š±tn[ù™¡é¹OÈaVš–?¼/G///[pþS³ ¶î$W˜lœå!d?h#ÜM¸™5ÑÑop¼%7/”y[_üÝòh=·¥ÝÈîŽcˆo‹µÑP¬%Ê>óÃoeq?"Š‘‰ÖË>HË;éÉ⻝ÔKϗWWÓröŽËJß>çhn'Ýò7¨±äv7¸5…ØhUŠÑl>y_N¦ýëAyaÝ?uN-c~¸º*ßÙwÍîöI&ø'—ù«¼h»³í=„yöP)lµOuÒ<÷ª³ÁÍí0ìU<s¨«©i>BŽ©*>bV¾²kpÖ¤sÅÆÎAf³N1#!ÇóØ.O!$™¨«ÝBZ%©øÔ=F—øaë?lý‡­ÿ°õocî}”«ƒNpÐ éx -îobõ[ÇkÀÛ9OFVÖßÉÖñCÿ]9êô.&q9ŠwŠõƒ#º"Õ҅ó:ßBºü|ºf1œ—Þyù1œ9¸Ó>Z$åû¡WÖð.¯aT±’Ô$h&R'è6§`&*¨å±øw‡ên㌯~½ƒ]óopH¥ìüµ7š•Í÷L8 ¬sÚ3_oÚ3¿\YVdÙA–=H}d§¤QÕ Òh¥4:ö斒ËñhÒ»¾)÷$j¹ b h¦2q—Z #MáÏã†ó™FK¸µ)Då—j -;ðjfºæ¦¸+‘voÒIfà¤mW™g`‹¤À³P8D¸ÂƘŒJ )²5Œ•QY–Á½vNimDî§Rjd@AÕä4|ZÃ!¨˜üdò çMWI¼6Ä»Fñ 40<£0¿L¾Ñ5 ‚"Y’C¹IÓ\`ZaR*D`擄ìB”Z¯áŒºK¶|'áý-Ï4Ó)æQë¯ø†ºNâwS7ã,ßM¦ Ê{Èæ”k8ýI'à'V\,ÁŸNuy°Hgi^À$I“Š¢ú¥éö;¸&S@ -PYS(á·zêd{=u¤>̝ÖsG©<‡OBŽ¸›8šƒÌg9äÚù©Vγßóæ³L›ƒ'à™hc?ÿ»5'#μ» Làtª=ç!^(Ž9!©’Y.ÚîˆÂê£Ý´H¾¼c‰È -4˜“B:ݼ(2-)A1·uÌÚáÈÍ !Oýk åäz2¾ÙO9¹k)hëOŠnp·¯x¬Ûܮȼô\ ÊÛÁhZ?*×òѳ—ÿ|m§ÊŸ: Çy;›èzŸw„›“ðGœ¥EBNþÇ£·a™z¿? À¨œ:׿&𓁥¹ï»ðø“òÖ®éËQþöso2õ‚+½.‡=˜ÒoÆøÛ"y~ úã˲EŠéëå'הL¤®ûöÚ?QHÜZÁæq=øçöêÓ;byø‹’>·éqŽ - ·Y«Ó…6øA'"ŜTp=ƒ=êÝõ‹ÖMC›|»Iøý‹N¹l8¿}}'áËWW½Ë'¯·IB¤"'ÿÍn‘ŠÖÌÍppƒ(nWyøøj:k±|›ÉGl&rÏ6¿.ý͞kÖjšÉ<;lÛl㚟eËØÏíM1(].ëJ—'Éúâ宐÷>žv ç“èÓM"é܃œCú~NmíÑø§ùgþ/ÞtÖ¿.­d.ӛÿë?ËQ¤Òì¡gèàAßàÿ:Á¼A9‡ïφã_ïЬ®£ÿ•¦f›òb8º¬úÄ.†soÂ@©@2(o{ýïVˆáV—£|Œ ~Úºžñ óiùêìô˜z,22Ÿáp,ÜÔ¿Ýö¬P=.¯Æ“²ó³µÀwÈRØ™<콝ö¯¡XÝ!ÿ÷ ‡²~2ßvή{—w'ˆ«‹§éÙb/¬úӉ“­ì¾»O~wB™]—½É»j£÷ådV•†·½Ëǃp?w/ÜÿneëÈΟË4(ñӉ|ƒ8¦wª%YtVÕÁš¤?Œ.£Š¤›K›¾ê K»¯.š÷ûÛ¿¿êM§åäÆ®±rôï¿ü¬«þðõW¯úu\‚£IÿúOú¹Å’ÙñkÏ.vÆ\_òëÛ×ώ;¯Ç3~E’ ¸÷È´Py‡,Wnþ¬^pûLš ’Á¸ 'ÿú¯·ÔÂîV´®:u‡4¥ðÀɇ^hŸçi†9«&+D•ì í့—YáŽÔÂýÙþö:Qmÿ¢÷Öå=~Dd…%H5ya0ÉC)VÃ4ʟ²ÉrLÉtÜF¸‰2LR-ºÄç%9ÄÈã5-5B-þÒÉ#5¿> ´ø@Ù_77Ú²‰oXyøå¤=¸,ˏsӀ€TðãkDv6¶/˜4@å®Dôl<¼t¹%QqS‡luR{„“×]KÿÔºKŸómi{üöÙ¤7ŸÎæWà‘Wo[fnC‰m“R;eJxkye†|.9T;Qó$=L> ³:Ò4²B9Q—ºsðV& ØÐÖ´Â þOJ#¨,d›ÛE¦Sƒ–¶¦îÚv£ÆT=+â\÷RêÕâ×àbÁD¢ØÊsT]´™cŸ´{:n–Šÿ_Ñ -à_’A–YýBáöbªÐñ‡Äh¯_Pç?n‰M.ûoÒ -s¤W™Ü‰W»-i·«[ÕÆø.«l—ncÓéâviMK”ÕÒ†™S²ìè;cÆPÇ?Rãö`Ô\L_vëÊ°‡t?ƒtêÍíœÿO“%Q¨aÀv`ÿ V®táî‚)Î?«È›Ì›\ԣŬk$hgÁԖ±%¸]9,4-QR0Ôöß°ÿV^\õ&ñ -ôS܊|E‡@ÉĊý¢¢f)kú2R0í.’ò€à‚AµÊ놔 éòÔqJª&ÒÚ,©)nK–UYê=%+i­kŒi×7¬ ¯ôX\ðƒJjÅ&rX$ЕÆ]±kÕ¸3-©4p¼Ó©§îšw:ëYí‰ÄÙkÂ2“VhœhÒ8AˆÌd^y¤c£‘šKüɋ0åá{uüoìekw§Ðé`:«ú"—=ç듾®«T³t¸äëpïëøÚ¢eŸ¢ëі7&‰$¾UPýÁõ¾7œ] ÿõ,çã÷î²¼7½‹ÓÒ¶(ì§-›]”¨itþtün>à«ñíO·õX jq9þuĀãrW®Êáå9ðqP·Ž*¿¤g{³ùÍ›ÒÓOCdÖë3dÔÙÜ6ùû­.³w½É /¹úa0zכ_Mí½u¿¿zy&ŽÞ<>{ó|[}™<ôxUW¿[ºÆгk ëýäy2îÏí(Ïlÿ{x$Àc _nƒTÑu¢ÃÏÊÙü¶sÚ½[*:–ÉóÛp7¤‹Ëòò´¼šýÜΣ›#݉åýãIÙsÁPÿã£Ç“Iïʞ˜ÂnÜîFüx…ž»òõ|XN^N–¼…·øüÝéùæüÛÿ‰%¯F~8á´Å¤_ðçûւhyõøµIc×þøgC7^—Ã7ã×®®K¯ÆÓô–þÑ#+SŒhþœ½pá›çS»Ò.Æv­?)¯zóá,êê÷ôç[jƒÌ$ÎþòâôGKã -ÞÚ§~»Žlƒ#+7&ƒ‹ùŒ/ñ¬ ÊgAsGo‰ÚY}Þ*Ï%MšÓô3ü3 —‘~ûÿŒ¦çï{“é÷Qéú¸íûhBãÓ GñøPË?>$VÆ£² —†c+¸.±‰šÞåÄݞÀ‹ÁèÒvX4!ÒÎ+Ý¢l@hÜü.'ÅÇ3E¬gJ3V à>àF+£ÉHßûDh/þô¾¹X€¶»1áÎ¾µóÇ7; þ>éýÓ´{P…ì:l>S?Ǻ9ƒ ^v«?k)O¯~݁ù½’| -W«?˜±—™ÑÝÂ^³_I÷¯ƒK8¦Ú`à}˝ßÖ21ÝBäÉûЈ´;¶¶&Kg ú­Ù"Ý‚²Üt $¥l"뺼½n´pӝ Ö•”]ŒgVÉÙî h\~hgô ”gãù¤_C*öÉÌb+&5?W8ëMޖ3«i€ÛjúüI£ ±üÐNLÿo_ýøLª§ãÉMoÕâ­Ð~5–k[W©Ž›?$B²QjÌ&½Ñô¶g1ö›maÕvcrü§øŸ&ãù'ãáx҈ڸùNкyD£Y9öú ÝCqó=¡p4~Ñn«ì •W˜ÞßpCãÙ¿7KìÏkzWw¶èÒøv6¸üŽ…Avªc֚߉~ܔ³ÞeoÖ»ƒÎݙÿqéÃuVdÔúµ"&eì¶wy¹(nðNš*lz;ž-ÂzÃ-lC"çòvÐõ0E'¸ÆÃIèÛãçÇóÙ¸óº7µRcðû’PÂè$Ðy7÷ߍç³ÎÛÉ8ŽKÖµLÇÃÞ¬ì\À!ªòSi]tn{·å¤3Ü̇¡&N˜.Фçƒn~$³eÔ VCl¿—Ó¡¥’ùJli{7oÜöí¤äI´±qÁ™Ö©^ÝTÄ}ØØ6îÃÆÆ¡"Kó”›R´ù¤7zߛžv‰ÊP¾š”Órò¾ì@ü¿óÃå`Ö» 3Òö¾]ñÖ³Ÿ1eÂ4"œuâ8p85¼(§×<qFt^—vͣɑ&•G^Îg·vBnx¨; æüBð<úùÍø6þ‘=Zφã‹Þðuy;N+“•xvöôo“áà¶ófÜ¡`qíŽÑ؎_²l0T7ç³rø—ÞÌrötÜï ƒÓJzEëç Ó=Riÿþ\ÐðjR¡ºI7‰äÚ»Çϟ·CSjÑþJÃ!MfüÌze¼-1ñà™]ˆçÈçgьMÖ5<®_µm_ǫ́¶áËÛ^?ÌX¥×6~j•ßPCm]sð“,µÎWvåçAù«åæ“ÁtÖõ遪\bNÿbâÅâóg³'/4àûÓáx<‰Ø¹±mvbÃ*;å -œob·0œÙªoLŒg‡Î‹\¬i{\Y°,¨²ÎK˜Þh6è؝°7åÕـ»vE-úRÛX97‹&çš^6á%ºÙª33’ã^`Âòûÿæ=¸Óò=$hWEIýa)H¯«Úž”ÃáÉxÎÓI¯ž¼¸4~øm4˜te[@í'k° *Håjvýel%ûxô—Ø «tnVM,dD<³‚B!äù™UžÐ|a7®š/‰æ“Õu†ƒQٙb„iÍì«k=³ûå"b+G_õ&®àôՓ§PWÂ.êʆJ“¯Òö‡›‹òòÕd ž©¿–Öâ¤v.«R•f»ô¯—P6G0v¯†½Qéö±X,cÄÔÉϽÑ`zm'zŒbÕXܒ:y·„ÇúnЂ*OLP)8zoßjõ!»wGÂwÕ[ú°÷Ç¿þÍ*Po-+Y–Í£Âγù…]rOǶC¯AN–&#M­aÏÄy[ËÌÎS‘mÆkÖbe…­Ý}ñ¬€3vœÊ>eŠ#`²:T¥ÿçV@±<¹òÌ4œ\^ëá¤)tCNò,oÎȐ/ù|tYþvVöǣ˖=L¦›^„e͈­zŽIú؁fD ãœT•á~»Of Ÿœ­Ôt HþòæÅi‡œ"gãSÛ ’žKûvÝ#gv§EAz;ûc9mðÌó›ÞÛòEïöM%ð¶²ù›'ƒXue‡’ Ѓ6™)j3~/œõ†ÍŸ±JûlÐï ›ð -KXT" bÝp<õ‡óK°¦ÇXV»}Ö{êÔªAó°ƒe—F`DÂt2Ò½Z=¥jGbÓS”U,ŠV¥ô²¤Õc”‹Üôevˆ*öz‹W%ÔÃvüÈé±vCf¶{LÇΩ ¬X5Ûf „7²2iöŒëä -ÒÖ?ô¿’„'dÞòÁUsrãƒbÛ®¦Û>¸<€+ù_;‹ŸÌoíà9 —×v°ûoaƒð2¨óˋW«fĂ ã~ôfkÙýV/éâVŒ.Ç¿Ö‹ _øúT¢Ÿ«úþ·ÇƒáeG®žÖ’µ¸o…64é:±:³ÈÖÅ'ܛܥ ÞKjŒ‘Bo~O-ÅQ£â¹]ì­6x—æZ`×Ré®mŽ÷N­QDÎIÎêøöï/ÊËÁü&òœþ£2-…ì<~¾Ö•[uÉ@`|1Á¼ÿ±Õ…Ñ]zâÍ­×Usk±íKo^Ÿ­4Æ+ÍÞ+<6±s?úÙY†Ç‹–a¥íËEss3³Dç‡Wg-¸­7±ËálÈ/×x3êíVpÌ5jÈ2q‘g"ûŒÆÁ†ï FhnÃù¬ZgxÍä¼~‚ڏþ9¾èÞÚY?±³±cKíàÕ½ápC³é»Áí…%4 -ÀÕ¶›”pYJ ]œlhÚ‡ADՄP ¨N²è™ŠüÁˆpüßÇÏGWãNä÷ßÄñpöèoåÅ£Ÿ—åøы±ÝÍþ±ž ·DÔÕMl©ûÓÙ°{éß!ÌÈ ,‚çüQصÉC·—7öçá¨y¿n/›£w'=Â#uóáövâÛ­é4ò ¯j¡»|“ËbÓ8g:W¢›¯jXIj-ºf%Æl“Ý¡µøÉâìÏÆ´ëè\oD=‰:’'ºr’ëÛ»TUŠ'óIÿºófR.¬¤µœŒXntݲQE/¿°¿ÈÎÕ­*¼\ƒl;ç× [l·4)°F¾7ˆ›Ër:x;Š} rì¸ðùµkqbKt7i؛^ f7½Ûæ¯:0Ë´'ݛàº_Õ¤?AÙYH•XG4åÍÈÊú>Éz#k›O.»ã \ÄЫ†—k[^Ùݚ äb$¹¶Ù­?œ¼vbà‹ßv×OF߈μEëÅfSz1¶ ßo tÚ¿ö?¬c®Q´äÛ\l4³Rœ-²‚Ê÷«xۀ¾á:nßÞ¼ë–#ˆ…¯×ÐlÊÅn7Îelïä{´Xšßî -¹ÂóeVÐ×@*ÄeG1q4‚ -/$@¬0^ÿGNCÇZnO¿Š:%®Ší¥3ƒ§˜¨àì¼ö¢l”×ýù8MoÇ(€P\±O0¿ÄU{Ü,äå,…ï‹ÿš®Þ§X™g Ld%eûÊ1UÇ`á*:S6“úU“êW(xôâW|X”Ñèj`ÔÏÔ@£q[oå`˜†ÀëÊÄ.Ã6Ë ç‹6¿Ûç“KKXPh•Ý 7왩loÁÊyØñ¢°µÔyÞÓÙCM2.)lÚ8 w;¥–$l‰ìãINŒ“j˚ U´¥n½ZÈÚ☶ÙáñԞŽ`Ø%k&XLÏàˆ™<{f0 -xÌñ4¨Þ̧›çÑt±~®ïÐEV‡Í3x9=<㠑ÜÆŸ{z»Dë뀵<þ=ÝL@uÐ9pœ>gð®mÏà=ûö™êç¸ûïÿ Þ·Øà@ž·ê¿~.ÿ³=ŸÏœ†ëõó¿Á¯ÿ§ã9éx.lÒH·£†¢[ÍÖÿý¿ásªø0ªùÿ?«Ób>eF tüŸÿžŽ—¨5”óf4]‚3†í‹Õë# ~|Xì”X$oý>dYŽˆ(‘/qS™ÖÓ9¼‰LVqà #‰3^åæ Y…ˆiút¢‚¼NÄ4mk|Ĩ@hfHUõh˜*"×/8^ -¦c!Ûxß®¬"/*£^d'.½2£­l7Û1¼ kÿÞPwÆH²nQŒÓ§:¶{`– ØÔpGå*,¦jpLÏ9’(ÐC‚Ä•ÃDE%–õ!_ÌÐø¿·‡eRI`~ ŽÉÿ`žtˆ°¼:£>SB\‹à1÷WKl¹K‹ ï®Øú °)¤t\,ÏuXÆ6‡Gv¦p´Ü8‘«81Ú²ª*&¿ñ¬&‰åՃ=ÜØðpÊ­ˆö>¥¥ÃèG½,& ½]¿ä*cjt>³‚吡´ŽÚÓb¶`eùëˆ@ý)ÄG«¹\ÜQkôãQµQ$–KKLŒÛÑð¤‡éá6~Äzò°„‹™^µÂÇ3¯"i7À/Dâ¹TpmÌÞ!fîÂeaŸçt²§"MŽ‚ÉU!‚R7„ëæqŠƆÀÔ.-OS8k\Þø ‹ˆe ^6~ÏëÑf¸XU°)Á醡Mb€²é?²òå5†r嫒\?(ÃöÞTûœ1±H(Cujšð¼“ï6Þ©àSŠ¨íé5ÌR”ÞÃ@kNg©Ã*Åꨌ&œ\0Zp¢ž*ÞôνõĪ†Ok¤ýj ;¶¢ÛPµ'ã‡Üú74ßhŠYÍdL-†Ž£Þ×Ìg|ºP¼™‹V<±PùËX‰Îc6ãª^HGGÇô_zn#ôñpßa‰Gl»cüXr9˜x¸¬90­Š§ä<_+Ç#ži=µxŽÓ‡q~«<é€þtö%äïåNé¿ï¤§g·%ÖÛò1Q¨Ÿ~­QŸîœM{ôíäßÊØ`Ò3¢8íMïÎü­ÚçW¢‘r´¤¡âíBßñÈ2ûkkÚörΚr“ƒð•ý랞}·ýÉU|Õ Í’¿§Ô¯¿Gò0òcHÉò>‰ÛTG`ÐÇTÞ߂O†}º0)h’öÀŸ>Q·ë6Ô :ÃÉ€ þ™¬ãÌØ[3¥~=ƒp$ñâ6X“o¶kC®‘îõݼ€)E}\–O_ÛWÛ@TE“K³ÏNhkR&Èo]%íF Yµw€`|ðEõ‚š0ÄH[ð /Öh6BŠ´3%ª}ʖù¡zsu]@Áfl®tlþJwÔ~„'o}´šìˆAÕ¤—Z%‹ì¾¹!¦×ØjêAϼšdz€Ð xLÌãëùþƉFúϚž9KûÌphÔ'}£f-øþÒi&ª©ä{zV_ìãûïЀIzº…ОoÒË Hk+éé$ªÙô_{ZüùœáÙúežMÍ,$ÀaôÇïÿ˜l9€ú~]JT˖R6mž”(ì0¸¦¶$ÓÎQ³ÆZÃ=5¥¨/0Œ‡'m¢Q</''@.† f1: ÓUì j -¦¹dz“—¹ë'KÙ¯¸ÑAä'’M±Ø¬Ém°/\/>rñÅeƒ"ŸØïñŒðgƒ£ªXÎ%EÑMĺ ÿdM³’#AD=—YߏP#ácÄwþN³&ÃΜúõ},3Ö²#ËÑ+ØÝ-b6õÌj쮵LNgNÍ3GxÜüHø{®¶pÞó«¯sm.c·‚bË\NK)&ѨL¬€ÙDƒéd¹»/jŠµËuý3°y2.•óT.Éçôž5¿¯ÂÙ´·ç²Fs?ðš}nj`^ãY6“öú“>{µ…xƒÌ·ljÚù³³$ÿN“urµimßŽôQ²²ì2¶í›+k°û?³_#øÙ·!鳖iÖiNόyïö—b‰™V'Ïpt¡ôÝpgãó×ä÷?é‘緝h¾Œüv†ÄGãsø[Ù#ˆ»qçÃ5؉HriÚ-²‘iÂX}ïÃ2ÄÑÎŒu“Äèœ1½îÛÜÉ#x ÚtòÏÁ§õ‹k¸pœþ=Öy“äyõ™¨ÿSôÛ`â'ɧ ÉO ðƒ²!Iö΃DýÜðpoQcÈÓÀ“uü0¨%Ã7ª­‰US¿¿4ÔÅe3F”L»,ø3I%r’ ŠÝ× õ‰zaŽ}€OCæü_@0èGèqñÔ‘sЇ©Å~D}%‡qæ+Ãõ‹ÀP?ƒ/ÌÁwúù—BM(0i¦ø=ŽÏ¯·H7’Ï(þÖԇð×fšp8XW“$†›.ӊêr9I_Œ9594Mø՜¬Ó¿íé+ †é·,Ò,:Âê—Á~ñTP¿,.?xG¨s³¯Ê ̚C ‚_ìß º£aŸ3¹Ëàí¹a‘A¡¥þšcT FP'~Õª^,iOSf?DšԎŽó „S£Rþœ½sMÐÚ°kÎÍæ.@]¡¯ ®eÁ·…–´Wö7ŒK“cÀ ‘ A|2; ¼àö 76D-lo4¦ùØt«ˆ‚˜YW_y_à`) 3³ay(ºG9.Àß·•°?ƒC,OunßR`Ěâ¨åáU와ðÁ`ËÓô³¤sŒ °ä©z HábkŒf6/KÐb£T"^ ‹HÄ8¶Ë° Â4C­`A¿ø²¦%Ñh•6Ù¸qÚúÅ̅ŸKÁÄœÊórö§Ò e5Ç/1…ŒXa×0@NJ/ãm]sžZôñÌx¹7Pg&&»xOïÒj.ãXÛ2j”%=·›c”¬ù^0q‡)OÏ#tñ–ÑLýž?zéRiŸÄ§”L›t5^ïF@[“`¬He ½«AÄþ“Ýr ¨·N­ù(À­]flk8“>›ËŽ©¬dr4OO-™<&Ê5Šç ‡†–ú¾Ulº¸Äôb¨XWÙíL¬ÐAÇ~fß:+_ 80;P¼=N#‚ÁÕJÑõ ®UŠ®Öˆ Ô çG)ì<Í»¿ä4£ÀÊqÈÓëÐ|YÒâX§˜D’3UtW|m†¯Ð´Diÿ€Bƒ”xFËAÅ£”ôó(Y‹Z’µ—ïÁ‰bŽô‹  -WõG}%Gºðç -0Gã?±ÉC‚n­ÊDµYd¶©p0Rº …Ò¨Ïga÷A.¹òÍ?:'ÜbCVÓ¹åËì³ZšUÆà“í”ÛiGÁ 5ìyã÷[–Ѝ"F5Q_Å­à·ó=CŽ?bUW¼© ÒjrÃ2øZzŒ®ÞR—úý҄À †¾`ŽRrY±íç}æaf‚úH?¹t½j¸w,Ù¡ÉzEÀ¥*ò4t_2É|9ØíæÏö¿-ºlfsþq½×Š¸lzç'ðËÅdí=þî2w×oôPÏݗDí­Þ‚ª>ó¢ýç¦)bk üËóè(ï«Ü±:=ȃ`Ä ßš!ËlüpømB#d¨ÒŽ!a"þŠeŠ˜S¬óê.™OzÎI‚´5Þ:|öÁpÉξhxöŽE¼ÍØâm1Ÿµ˜m°®6P¬l“ 8®>²ÙYó §ëŽGFýM¼]³B¿ÖúˆÁ?D0¡äíéâÁò# š €Ak2Qª)»“y½å¿Ôlc—/a DÞ6†‡ôåNvsöOn'‹mcl$p-t;K-Ž _zfÿ²XfŸBýñLª*¬ X¿5 8̙mì&s©Ò -5 ‘Í[ÖÜ}?%J]rÂrè×ÒÛ$=Ym š´é™1F¤Sy…RûVuP†êÌj¿zCÓÔFUþݙ\9>HÐo}ÃÉ"¡·fà;3è¿|RƔ¹&¾OöMìöËRàÁ>ý @F°Ï yfäì-ø’ âߟÈt@áå9 ªÊ®Îæ ×Ôqg¦™~u4Kòž™93¶_ )XÜ° ä¾[Äš†ta½øLz[G¢fyŸ'>Ölî%÷íO.ÉÉI/p{R uÀ¼:ӅϲJ ¨àՑºØ𠃾žè Ýô  ,¹ -èmé¢ÉlâDZ¶˜¿,á¾YƒÚðL_ÿÅÅ&ª«njÕâ›áç\¯Ý ُ·ô§ º –y®ñÊُ¤·á°s/(0jˆÂg.B÷Á¹È^\ù›ÍB c­d=["›îæ-b“ãµóZÃßÛÏ/® sHóZµ,þ·q¸*è(<훗Ȟz›‡Û¶G6é%uoö;·>YŒ°ÝÅlø„D‰º#8[*¿”Lóur©·T+Æ -|4-Q>•ƒæˆÔû°Òñ=&6ÒdA8†Û;ä”·ô:8ÀF-ù|¯Ù}>’^•½œ€L¯e_§IÏê?ÛÔB«÷úöT›ha+²¤NŠðªÛñ.X™9I¸oª¡L)Nîp±œ[Ä?؃gÈ¡ã ÿ÷ä-= þ83½éÉ @iðï`lY ßMl«½@Y€1 £'_ÜðÁ°bŒŒ¢¯>·•—‰L#á~ yržÕŽ%ŠeЃͣc-•øžgSñùG^ÿJAç2!hE7IXþâ­Fa˜¤OØp_Öiã¡ötìÌDÊ“q™-hÉ-½ÿ -¦+9WJþãF{‰äV•µ5êÏåãû^¸Ë.âГuæ]5@#†xkÖ8cG}ÅsÚñ1±ÇCoKLr>mv“¢]Bì¾Ý'\åä†<Ç -g\9§ýÝ´@Oc$_=§óýã1me3³þ¥ (²»O®«Qï%ÑÔ´àD[ö’Ë0iÏ󸆝7Ð‰Ùۊ…ã÷Oî%«)źþ)=Û"tçèÜ Nljs_n£o?´ !(zeõ¿áò.Ó¹èËÈAe·zG¶ßpÖT˜´¡ú¹E'=ô¡"q¶ -¦Ûb2¼‡pHJ¹?´oȤhã±e<ÝéðMÉHGàÓĉõAm=_´éÉ$¼öR ² R5Aãìg] Hib‡”6[ÞdÆÞ mw˜EðeLøë•,X‡î{b›˜]° ¾@@¸ìÄ*bªXݟ‰FàQµe娀ámÖ@œÀvnl„+–­Òú!2ãîÁ›Žçw{¦±m e=EP¹n|…ÜšHä°¾{œV÷‰œ^åìwråë‘¦A;Z}Ðãᷜ!ëøÙg‘;WÜVQɛ‰äjµûêùüsù=׋QfDDŒ¸Mwé£^$VÃ)ô•è ‰H|l˧´­ºŸ0Ôò̎œ;oCf¬õ}CJ«¯4‡l&ð‘0þ}þ£ŒÔéðlm0ÿÏÇ‘RAðïŒCŒhhý†4Â팵j´öíbçÓ.Zû±¤ ³YÐíxd•5SÍ -èÂÞê2ìå}ê-ü¡˜è±äx%šÒ«©fîBõZ՝ ](B‹»L«ì`åô†é[Åýy&ÈOÐAoϚŠöVŠl®áiÈ°³þ0ã £û5-^ÆÆÓ ÖyNF»9vH öÛ« ó@ÜáÙyz2â­%íÄ~ÁZjåøöd°$ñz6ŸÇWˆ΍‰2ûrŒµ„ - £¶ )‘J¢n‹ƒµ™[6͌ÏÚA"`wh!AQÑ' 2p>m¦IÏr2ñµšß­€?–ʧ~?'Z¨…i㑚»Ÿ.•"Z֟-üY8;4dâáï&Gý5+”\¶ý0ýÞó]âcåmóXò°?š;Út©èþNÔuɝwe‚ Þ{þÆà¼íR¯é¹×§ØÎ_ È¢{K¨I–}6’ÓDÉò*–M1ŠæiGZçx7X_ã~m9€‘|§üõÉ6’ÛéûvN`B“ɸr -ïɕlä:½Î¬Í)ÉÙÿ¨&oýÑ9ûó}þ…‘!F¤<Ù7¶†çb͉Ó­áím°ôM$Íh~dY¯Ë¾kNE,„×o ȵý3Àa÷°¸Ú™ÿ¶h4ý „>HƒÁeü¯ &¿nó̜Ó?mpfíˆc‚ˆ¼í0C*ÂWÒi¤- ç8b떒‰€­WÄ°Ȅ¸8(À>³@´è—2Vrœ¨–òП;ïBd¸xcªiÁY1ý ÛÛ¿´3óD³àv‘éwù°{W¤ý¯Yýü£™M9û%ÙyÖ| -o3cŸÙ›¬˜Í ÿ¦P³ -lؔFP²@%kT­ïeìÝÀ<éi»í ,ú¶y¢‘>Z|ûÒ0ö -4hо"$ ۋå5< --_Óߋ®‘­{b!õœAk©>ܵÔo|bOV©¶@ \µ/]ÖTJï=ۖ›¿@ÀÙĪ©Þ̨‘ñrl’ºå‰üYºcJ/ˆÌ/(¦ˆãýŒ=-3üù³%61Í{öÇô킛â+]ÔÌl€tçƒ~¸PÍøBæÌfš¥eG@p4ß(s(ü™„/ÊÈÏF?øBºoUÑPÞàÀš©Xƒ`Zm`/5Ž™q4zkvú`3ó©ÎÛ0°<4è;ú‰Æïø‡ø¿¢OlN¡ ^ô\Eé=G˜%4drB®’„ jJL¶£)ʓjmóáh -o5ØR …W‹á}`A‘JYrbѝ‹Íru<9ÆØÝæ¦ÿïÿþ?þßÿS>X’þÙq|˜ö‚äÊÂfù\^OxV%~{ÝðL+çÕi±[M‚‹—ØfõVî}>D¥‚‡éFš‹­d›Âš,¥éá"A¼jL×;ì),³]Nåˆþî¿NÕ vٝ‡û%ºô¿´ët0Æ co`„2ö7÷æý0/Ž"ù•à]ç2£ÎÒ -*j/¬‡EÅEŸ¸±„E(" O™BpÙL˜ìKHºè)I’Óùb1Á¼|úŠ_ʼnG¢Z£Þ¿5Ö9 §µb·Æ~OnøÉå‰ÔBnöEý„^„ݱÆ) $ÖÜ2¯ûxB3ʾuY_?|¿“ý礱 &]Fc/ûû¦æ×Ø~ÿz›9ž×Xkš/IÿiÒØ*œÃ]j¬ÑœÆà9ºõ54O¬ú%ò?Åg€RL¦‡ä9c­”ÛéRASgÞ¦¡ÍÌá謗šn>ZóoZâP=æŽ5<®VÄ Î?!“å%¢ùá Bç ˜È±ˆTŸNςP»_D¶‘¬‰ÎU›ÝÁÛD_ª‹Ê‡Øt‰œn[–„j,–=) 7_cWB5#¨O([ZmÛýâ=Á/=ۋ¥ é£4Ôw£Q@Pž†?·BPÁ®eøP¡¶|øn>8À<¨¡·9™;E¡öí7I¨~ç¬nä BJÃG4æÃ1d=ŠC}÷÷2¾€z4F»¤T/’ÌÆä4'>]ùÛ ¯ÅçªÍ½º½ï\ƒJdKµ$® i_¼oLjw@d·†8ԜþÕPžþ6Å Bž–«ZRHÎìÇ/5óµÌò0¬5q°åj~°öî-;@õïát˅·oj×nÌÕïu8zâP=½$Q^×übP˜£¶ =ÊÝqB­®¦yI¨%Ç~g“€úi%êåýAE”&˜nÉÝ/g³1(ÔFaQ„Z¯ø?bPá¾€ÓD‹èő\¶ë“%, -µÕ=JBm™¦ƒ‚ -õ—Ó­m{,)5cmLJ”(Ԟ­ÑƒJÒ>ݟ¶QNJ ùËG|¬âPߚ‹eèåÍ& -µßï TtÞ\Nw;™æRP+ÄO¦œ‡šm’ÚΩV@Eþ3È¡ov=ݑÛ,Ø<Ö %㦠µ§Ÿ=…gwŠ€PmP«¯¦}?ӉÃí91¼Óµ†¶] u´ ¾Ì>µ3Օì’>£ø 2oŸ9ÕÎA…`èƒöͮ߸Ãïjê$Dr&óç  ÆL›€/'Vš=¹õ¡T‰Ï§Ö×ÀÛ' ,×i­q…6#‰·gƒÆ=YïÄßzÌ;*jË;•jpQYH¼í¾™H5C½½z¯D9îv¡·p{^ðû^Œ(Ä<¨ÈÛQž”|RoSDEÓÞrHóô2Du\øúù€¨§–'‰·Ÿ6¢ÞÒi¤Þ: ˜F¼b’jà%šš½CümDCÎ?ýö’eå‰VSóÊ"M¸ã<ŸE¢5·Ç¨Ÿ_¾-m}0!õöhû2)Á[ iŸïDOçÿ–úùñÝéY$Þ~ù‰ï¿™Mêm‚é7Ãn©qbà%Þ¤ÃRòJ¼šÈà«"´‘ŽLúY‰Ÿêd©¦-J¼oÉ·¥k!´‰™ìþ• â?÷ö7päÔë:¾kŒæâzë2FMyþÛÔ=ùx”j d„®ÓJñÿ°·)»å×ÑL“†5¹=¾Q¬ˆÒà<¶Ȟ’€ú¦IæX‹óú?ôS1ò%î<SÙFÌßM÷²ÝFº—‰8À3"›J:Æ©TÒY²âúÝÏË -ÇMÄ@ëÜFJ*®ӃªÐ'ǝ•ÀÆH8_;g¸G>¯œEXuVç\¼ŽÌ`/i3Ç@-ôÎã½­Ëøún§Î¨ñå4˜êý…ªÐVª§Û‘†ªÍNœ¨ ©BPÔ ô ¡Ô¨9{/§M é,T7j uƒ05·âaXk¡zêzäØb­‘tHBEºTŸê_âP=ÝOJÅÅó¼vIBEº$T¨L8¨p6<ÀSi¨·ZG*4$1 -ç@ÐHM·v±´º†>Ñä’o‡˜ Ý4¬ªKÏWY];ó;Õò J[+ûøV$Þ&΁JnüLqÆ$ÙQ|†A.·÷㤭IÚØ?ŸÌÚÐÂÀ9DíŽg,³n`˜í.únØÂBQ½Çy„_ô¾¼ ?pIۜtÌìlS‚¥¡z˜E­xÖ¹ô2Ì5ßÁWà ýgØÁ¤iÚÆÆì`Ðø3Mf¾9Z¤çŒ :šy¡ÿØ*[ -A”H/°‚9:Lñpˆ£>éü¦_ Aƒeƈ‚ü°Ø&c²elÔ¥$f@ÄÌâÏ*þÐ3Dº·è ß5Ü ùFHv’ìŸ\ÉYC CW”ÖppF*.=|JíXI)ÒbWúÖ5DŠ5É°õJ|ISDØ&èŠ3tɑ½8Íçº;yú∋&hiú"f¤¶«ûò¨G²À¾µªÞAaB õÌÚ(ã‹Ï…Û .ÔµíxØùƒî!˜+V$'’Ãú`ÍãBf¢MÉíÙµ$GD°zô‡FŸ˜{¢/óÕnOœ‹oOJµ™\Œ,•ULŽZ|~¼ÉÙuò“£þLßÊ!ŠæÜû -·ç7/5/qšïgˆéqٖŸšÍå’ (ì Üâäž+‚<ÒÀj¥ÀÍ@úà†³™žšNš‚X‚¦4ÑÞFGÉÞ$»Âiþ$wpäÚ«˜µØîãk`DYhr*È,èàlB`ÅƲ'“m ³®ïs²„&L;V$Vþ¡‡OY°/ ̐Ïy]ْ&4&JñÀÆf•1K9>%¦Y­‰IgÜ -ÓHã/‹g±,ËÀAþГçB¼c Ì«s”:©D¥I¾(É­pNÀb©íÉ?©T/ò$GõƼ -¡ -9H1Ç,ÄWP£„¯×‘I~LHaÃr%{Á¢ø°X1OJÖãI'wzr+¨â0(]êe¥ ’F€/£‚¬wÅ"ž64Ó1ý›¶Äº¢ÖæêÞøŒòÀpÖyÑÛ̸ï<i -ß5Ӝ…L½Ç!MÀÝ®Fm cl6§è^ Ýº’¾$?JΜØL³Nþxçyþá/'늟ÙyèžÉËó4\ú À”–ÚGmÏ\*߅ e͐rÉ#hàPmo™$‡¸b©¢Z 7FñŒ?P 9À`\w£E’ ‘P-ÐC{ñ3ë=ÊbÊ#òm2jÂÄEÁaqvp0¢¿àÌz<ó_²ù>n4×p©òWÈ"¥PqX¼1tjY Ôêbïà -¨ƒà¯ žÈÏðd5ŠÍÎæjÄ+IBÊõl¹ƒ€O¼1SúDZ’ÙÌðøë¤NuR ÕhD¹¯½$EÐFHõø’ÝìbøB½ ;ô%¾®Üì<|ñwºƒ9Öx›}]äov 5NÑåև´ZUÆY£Ãº(£ -^r©CZB¾‘”EAÉ` lÈE‡tˆ4ÞiQYݱV£"99*,AÉâÖ÷Ä=†š ˜Ööî) OYÜr+o×ã-UñÌgðªD¼óâÆ{¹D¶SØvdZ'n’à‹Ù±ÐûI f»c͍ÿl”ª¬¤}¹»ÒU66ŽÙðI+Ö$å͆B)Yê\,¡s‘9=å,¢*¤ä]‰.Þ¸obÍWó=äNô®$<Uš±qrÕ4üƒ›75SzñÜÈ -pJ+]œ€7°€ÁÉÇÄ‘K~b.DÿäS8—FÒ9üŒ´Îˆ9uÁ§xfZ+ÏÛ}Òæ‡NýFï>¯Üû÷F©9eÌ[°7ÖJ+¿oTXiAoò»P‡†›‡¼×ŒWÎlô"á)TîÈrÕpÄ=ì¨#ëCæ…K6wudW1:Fþ,D½9î8VY¤1±Ù|©vvw»'0fzhf7?p`<¯‘JO¡$6'—OcåèñbÜ ¨6^³€»g!â9VċNónî†ÖœWÉ÷rÜ t%ÂÝè ‹k}P ·«¸›„ Úôë[Á.*¤)M±#5ìD¾*:¬†“(Ç)©û#…}k}ehéÂ&²hV9Ÿ큄œœà·rPG³e RdƌgjCUDW -¼+H:²UJlÇqÙÓófŸ0èM™ãr¶N%¦ÛRP!Æq8.ëîä•nb6Z9~À”4³QìHRð—ìEpz²ÝUAõªÝòŽ|ŎÔÆ4±‘)’ûõv›‘›;q±œÅ9«ð|jË*tݛR -;íGHÿ_Òqœ¨®ú|½ÉJÿb‡£”åöv£ô¯+©õ>äXj+9Ö@G÷ŸFTòEåîà$4iË/ÚN¹#Rò|”?Ř ©µ_>ÊŽ!Šîž!ӕJ†D a -ŒäóÄÚB³¸ÐI~2I«¬›h{ -w¦” è7 -Á">ÔÛÕû\r`h“Ë›ä8/i>ùÕä{qeU&° -5ò§˜W -;²6oéˆ=©1adÁ·u*ï315Εìtí‚cJŒ¡Ê-©ÆuåŽ)<4ò4‘è8! -’_¡ûªMÆ·ÙÌRåIm4ìÊ+·6W¹`o -´|…1ŕìj ×ÈÂ@Gœ »È0§¶7‰m?:ŠEúb`pÊPŒ¿Dc’¶& 7³6‹¾=~áõ6ف(UÓë€òö¢Õßܪ5¤u“s&ÔÇûÙFô=ƒrù˜Ç¤óYesùž°¤¥»Òùð­Ë\¾'üŠ‰{Òùäsùž¸ÔÅûÒù0¨"¹|x ò]é|ò¹|Oxêâ=é|ò¹||êŽt>ù\¾'ù\¾'~êâíé|ò¹|ô±v:Ÿ|."èG¤óÉçòѳ¹.-“€ÇÚXž’À'¶W1&5b0,¥XñÊV^r§ÃÒB/À́·Ÿi¾`ìºÇ@ün¼*~]ÆSø™æ¤n@“ßv‘æsÊÆSÊäòeCþD=…2½)EyIÌð"cEEŸê^ºî@ü@>q•Ÿ&3,%C—̘vúÚü½+ØNÞÑu·Á ¿z’/¡!&™{|< -Íïnó˜Ü—N09ñpÅ´»kãKÄì0íîjKóå”Ò•j”RڝúøiÖ p#br“–‚Zm¢˜š¯èȵˆÈÂü¤ˆ©Ž\gEcŠê¼×¡v U^ Ñ¤× •Ï¨¼ÊÐ͖.91Ï¢"ahãÛ¡lã[Tr1AÈÈ9rÒGž§*-pR’1®É)쟯Jx‘É)ä dbù70¢ ³qIçÈM%“p„b¶Rä}N.ò¾úÁZ¤Öð‰Î)TŠ¼WŸS(”þ„gä_‘S(°z*Qd!ݛB†ÚQštKÚõ4•¯1¸¦7ißÇ-HSÈÿ¹iî{zãۋ© /yATT -–BúŽ*17/4‹$-qÛ^]êž ßè­’>ˆö9©È«çy1}P,æV…>xŠ)$Ÿpr5×î“F}®ïƒ×AôHˆÜã"PqÙå–B‹RʞÄ*áÂmþ±"£¨I¦ý‰î[PĈjC„¤U])aï⼓gà”<‚)]F©ò0¹Sú ÌÔý>ÎObXÂ2½ø¦AƒÃô*‡rõtZÖEpÒÍrÚ_Arïs{žåŠ¨R½oÅBœ0Jû+\g ’É`ã{\èž*é@9G7¦'ö’SÑa]e½‘ -²x UÉYožØÇÔ ë:ëPâۍ_OBë L‹ºÇzƒQÚºx·õÆ­™ôbšÙ¨Ô*Š×[o¤íëâÝÖ09I&dD}>œJë͓Ü=P(î^ë L†scFÈ[㒊*¬7ô¾QÌ”¶Þ¨Êb%ˆ «„d/œAú‰ÉôRHU%H—$c.ž®É ÕRRs¸Œèrǚ~ɬ*®=+qQº’Ī&gVK¥Èž&N¨%•ÁJil0‚oë¼1ÅO™ãRº§BŠŸšŒVÙL%bÊØéԄ`’2› -Zj' ÂÃ4 -²à™4EàcÊ®‹›3óÚ“œ÷èÌ<ù°ë‡eæ)RÚc2ó(ëàErÞõÉgæ] {Of.CcÉyÎÌ»T -ÕF^•™'jÅ¡ÈÌ££$óD”™GGÞ “ó™'±6ÎÌSÐÖ¤üB¹Öö‰ÿðÈSˆ_Wz º"UJ*B/Ao®Gp€óº -§—¨h€\6!c ^.âop£Žø*¶âpDm6¨£»¯@½Ð›QEä½"w“¼àX4ò^Uˆ5Ò£á~Ì|¥äqHǪ؏ݻ.»em3£Ò/êC¡{áRÁÓ$C¡{Õ ®2¢zJ,Zâjrk=èªcԑÒ]8jT\ÔѕûQüXk=d?¶$GÜf£RðG½®ºÒ*°ÙB&À /–೫Õn ?êCò~fµ8l?4I¶ýÐ$Ùöƒ’d¿öH’%µöÇ$ɂŽ“$ ;º?Iöò$Y˜F§|ѵ0vP2 l™«`UÅ/ñÃy ¯¸ÜƒÃÝf0šÙ`yywÇ -‰%åñŽ55±BüiªÕî±µ‘T𐔇mO:/ïIÊ»]÷¼*)OÚxÿФ<:ÈB!]ó't3l_þlQ©ÁŽ’<Šn1¾ .ûŠs¡|ûý[=Nd‘…'ß|%´½¨ éjÃ3ØITî»E²é -¯PVöL ¹›‡!cw¢3ðI*W9ëZ0&Á}æ|²ÀîåÃ]9i>‰î È+(ÿ¡Gåãë FÁÌb=`h,¥0©±¥?Ú[«_‡åÖK#ჟÞaӔÆ^x gg駧×í4cŸâ—У2ÂpË-/íîÝIà˜æ%Àú-^œ–Ÿvgé?–’É~ó—\Ú]ß. •È&}U ¨>ÊÍz’NöëË¥Ýi¼ÒPs¹C—…ê©S(Ñ|˔•«Å?0¨‚záUóíI2ÙÏûk‰·-;©T´®\Úݜ@}â×)üÎK'û½,­‘Ô¡ ÔâKÂÜÆyQ' Uó¥ó5¥0l“MöÓf ÁÒÂ}kGðÑ'&)ðµf»w£öžäLÌ@ü™V®¶Â‹”©í&,«§ÂlwEe=É>)×ÂS*´¢f†Ob·Áݜ«ªÆŠZÄ+”Ÿ¸bß³²çKªp;©tU>N)|XbŸ˜öq­ÍFEbŸ˜– n¶»+±O,«OR†¾=±O̊Hˆ™Ø'–Õ‡öÍcûÄȇõ­=.±OÚÜýÐÄ>±ðŒC?*±O1ò1‰}b~ /î=‰}üu¥²úd+·&öIxqØ'“±òÈÄ>µwtݙ؇Åû³Y}¸Šû Ä>±Ã‰²@=4±OlL¸ëûA‰}bY}‚ˆ®G$ö‰­!»o—Ø'Öã,~`bŸXVŸXÆʝ‰}7#íºÄ>%¤=(±O,«ïZ¤©HìËê{’Èôº#±OL&}f}ߟØ'Æ{°CúQ‰}bÎJ÷|hb¿ƒ¢Š{cbŸØZK;VnNìÃW‰ñÌȝ77&öI螒¹1±C+c>I'”ÝšØ'6¥'ìæ$)yëN‘Š/҇LiE¹C.QÄ_鈸u{ö•"߈¨â§$r<¨Š_T¤„Ÿ¨È¡UŠ5€1R¥ŒÒÅòSõÕÑ$©RÍ^‹ºåû•>~ÅüåJî)ÕêÓeÈ–š­jLŒª–ÙÈ Êw³‘T™ÜúàÒÉW™ŠB•é2°Ih3“Ð=õÿnLžãÌ̒q6*åu•ÅÿJ“_‚»‹ÿQV¥ú*súqEø]Åÿ09M¦þŸúT)‰â×!o,þ'n„Öÿ»2_ê²øßÓŅçbõÿnˆ ÇVƞÉñ ʕIž{\ŽÇ®ô˜;ÉÑڄjwg•äã;¸€KŜ>±Çk£»áÂß]%¨$i|£X¶O:2DuzªØ§@§.H bǯŽ %ëñü'fÓ¥: “y'O[»Êa­úªóËäBâÁP=ò¶ôkB­Fð˜P+t7Áý”p®&ÊJM"æ<)¨ž(+F*;ºæ ”ƒÝ´/zz.ß\i÷&}I¢šâõÂlß¿©é"Û÷oªìRŸ€ö7UUYDî "½YT16ì0“Äf}ƒ°©bmpeSÎ9¤¸Ëíu¯¼ßS•±0urcbLó¡Å›+îؤPÜÊZÛ«„{ 5 -Õ¢»GÆàz‘½¦£\c@ut[…o¾~;’‰Fº.,l‘Š{œÅ@&»Üà™H -Å-Æûêþ‰F¦à¥ÿn܏XW¬õ­T÷O¥¨~oÝ?FT—,ýweêDÝ¿kUÜëþ‰küÒ÷ÌëÂfs]±>aoÊuÿbÙlߛêþ©¾¾=÷µ¿;¿ ’únÞPŸíKjEUK– ¯Ëö%µ×՗7¦@œOUä}(&b2©÷œFpkGªŒ_ -]¨£û²}Q/Ôéy¶o[ön»8:=¯É¾¿ˆÚQUE'Ùs©.£v`YSþD5ƒ‰ÅـÙËìÇ+©:ÈW%}¬‰çRÉeˍ¤­}4¥©VðAo¿*b…Ú½Äö½-UlO‰T¤â?H÷äõü ÝS␠-™2“Š£Ðü†%›Ku­Ä8¢·B0àñ#®Ÿƒ‰rì&x¾÷†¼Û”C:”c -O‚;ïe2Óî¹Uëi+†9:r®\Io”ZÉ&åð«8GŸTì ÔJ•ôF¡:}+† Æ${ˈê¼[nG½•(@zÊÇÃÁu‚¹QtÂ`1؅©† ø'®±ŽE˜b˜By†w9¨g—Ï @ý‰—#w8’/*"h~i:­+Ï̋h ’™y‡óC:‚‰¸æÂJ|V®4HÕA6[­'—…øG -ôA"âì­. Õ@c)¨É9æxKÖ±éòs䎺ߩTf^ Ýë×ì\™yf,ð‰­‡!ùÕ% •È‰7 ¨>þcíê‹A`àteÒµÙ£GjÎöӒ„jœšü¿˜¡K˜萃Z6JB=›QT†JDŒÛ¼¥øè½æTo²VÓ®^oxÌF¢©O·ïg:UÅ.½¿4õÑ'LÑùJÄQ,È´¾°ÀdÏé3‹=ùTDgÒ -»ˆGé3ý² i¨ŒeN/¥h$™ª|"sHêHR}\WhPÌ·vEJ¢Û»ÈGSدHIT>j¤¢®JI”@éE>¢@€º6%Q•z(t¯ò§tUæ’B>¢´&]mŠÏë¦b…8ø‹âjÔEnããŠ*™T¬;”ùÇÅ -…<í*VH›To- ¨¶X!k¶ûg‹"JƒÃúg‹â‘÷ÿ`±BqóÖT´ì(’«©á(Ýj…W;dÃàî-xȐªxµÃk£í$ Þr«Õ %'÷ˆ[­¸‚‡wÅ@©/x(Ÿøô€[­PÁÃÜj¥¦à¡º|Ï» r3zˆôM£²Õ1Å㾂‡W&”ÝZðPHüj‡0·<”ŸÜ“l}Ï+ -ÊW;”±u^WðP~J”¨þ€‚‡ŠÁ°)x(_Œæi÷<”ßƬ¨.Lº¶à¡üÉ'”Ón.xÈ º¨v(ªßÜRðP>. »¾¯à¡ŠT’G<”¯vȞ7÷<¼²Ná­ù½«^ˆo,x(®FƒyLÁCy ÍÓî/x(›CŪ?*[MºÚ!®ÜUðPÞσdG<”ñ–´Ü^[ðP* wEܙrzS`#<. r1•+xx¸§à!Kn¢Õ/l6·<”ïåI²Náý)XµÃûRIš’ºÀÛ¬.´WEÁCùÚ'ö~v?ÞVðPþæNñ¸³à!›ø%š±ý„'-©Oº,x¨‚§=¢à¡|µÃûEuºàáÒ±Õ à!Ӌ¸Æ}q¬][ðP±D¡ ³¹¡à¡\¢ÇמÖ=ï/x(JdlµÃûxZ[­ðƒû=ï*x(/ü`Ñ÷<ä.–|­uP²àáõ¹¸7<í…eÅò+W<¼=¢K¤àá­©úOt†äÝyûñ¢Ú!晬:ñj‡4O»¿à¡|%Ü> à¡¼vÏ ía‰WâÕ¯°uò‘&,xx»îyUÁC)~HU;|TˆbJ¾Úá“àjý› ÊW;¤EŽû Ê'éŠÒ7<”¯v¨$§©Oҕ­vˆ!ï*xx‹dsCÁCÉÕD ¾ë[®7…‚‡ªâ:ï/x(V “ªð¸˜ž.e7ðLú¬ ‰‹0ÖÌH6Ĭr --Âà™ ¿—÷ç'QR©$Uí&/°@ï)Žðü´Ö Ž”ŸÀæa µ›RЕ 8i0MяEÜyŠd ]w£Ú4j³ºòÖÆûð yù²4Ðj¤1öó¿Çë_ÂŽîƒÖHø£km,–["“ùs™?{ˆÈ–jнJd·‹2‘«íD¹ð6 Êëٜ¨®¦¿D½âÂ¢E4¿3¢EœVD«ÿz&Úö–‰èٚfâ{¤­ý~gF >Ü'âÇÝ1?Síp8dœ‡ã×6|8“›s8¦£Ño€rÂÇ f›í‹I¾š Îâ­ïÞ\c1¼tÞõð*ùò^Ï ¿Ë­6è|3éV㗂'h¨Žþ:鈅IJԜm;ÏÛZ”ÀhÙFã…ÐO'àñûV”ÐkƒR^G˜àZÖؓ]V “®°J -ð…‘–«…<#ç=ñ雇7»•›îÅ\=æŽ5â6Ɖl²”$²³q‘ÈUßÖG]ß7‚É´`tŸ±¾Þ> gv y¢2$kD¦å ú‡„³:µ „0þ6â•2ü1­9+-69î4âd*ÿ× 1GÞ<»Ó؂iÀi˜÷[ÕèӁ,ü”ÑXkÚ$• l]yÊl»²Æ²×¹÷š´³gÈÉ]VÈDõ¤%E†˜Ôbè$áÔñpYs@ ”͸*ð©¾#móy|jí‘úO8—Zú¹[\ŸÂäp¢¯CšèOS øEÞL4÷Vjßä­ô“É¿Úé¯eÝà§Ìx¹NoH¬·åc¢ÔnùQ¡“˜?K¤Øü0ã,Y¬iÛË9kÊ -¤-õ2`Øw6ü]“œ°/ø‹ù+0ZÆåi—¤“ ™Á¢éÌÄÄd -¡ghmrq+Û¾Ofú¡Ó>kç^ ({ð¬ì¤d'g®J@ó±Õ­½xÁpÞ¨²¯ä¨ÿ2d†X³¢RŽ§v$DUÍÎҒ°”jԊûR.ø•@iä8_E_é~ǽO’^¹nÖê¬Ô—nð¶aCo]f_h‚!­á Àf}€p­ê/[Ð܏‡‰–g{lú)R².E_–/7œ\iè’À†H:uLjµ>ø¢MÏ[Âÿ=1Ѳ@ÒeîÕ5ôÒv?]ìŠü¸õ‘È¢%—ù½8ì²ç@Ŷ\ƒþÑoçºósç—Nυ†ÀP#ú OþØwk¦ÕÉÃٌ°Ùü´5)¸ÏÃîXãô‘\9æ–ÄûxVN— -š:§FLÒk&1àrg3Iº_΅)õۉ&â6¸šŠŸ^úSz¸`Û¹év­uB0&QM5¾³é•vœøh|3#{¼ ä„rÝàOï‘ÓÎG1 ežÊÔ^míy@uFgqÔ÷’:§{Ùi'­›œ3©ï¢.Ÿ9|FÞÕ(¶Í¾[¥lPߜ&ƵŸr¦Ü·À±ž,Ãý2w¬CV`äB½Å5=h°[j‹ˆaXi -†¬àÜI&Uá['»†_à«ð/iBŽ%ðçu¾ú-¥­Õ=4‡ ™ö ‡ŒÛQ‚<äŸ= ‰µÔ>Ÿ¾û#”PØ駨f:ëÇ¿èÆüa|Ò¤Íø CgJfœMOVø̊?+[!g*QLrRgºÙ€“f'Õ—«äJ»É’v}ác6of´–”˜•+k®´ýӊ+\¾ -$ ?™ùŠoOE<°Ó=ÅN½£\Ü7‚‚Ÿ÷•ÙÍóFÝdA³UûdôuäÈèÒü²î“¶Ý:f¹\^Òºôi5ªI÷öÚ­_ð/ôU38£Ý;QìŒÌ†IZքêKÙ+4ÂbvaF>%a¾Ö3bò²I¯c~Íd(FJ”v»R‘‡Ó’Ð3X»‚:@’Íëϋ°óè}Ä¡À™*wn蹊˜Ø†ži^»kF€<6y7t@ÆÓ}ç:€â Á»Í -ûp>¹>êT´Q¦˜(Øþ ÜiF—yôC¹ËDæúsJQfúÙpoAÏҖZ+`,#/»Ù&˜˜E•[‡˜;ÿ=„W¢{Ϛ¥î1za6Å>WX 䤐Ґ” ¯?؋;àýA-WU+¸Ñƒ[R´Í֙¡dèC²ûɈÏTYö/Š xr`D¤ƒ'M¢Ò©ig '´j<ÇO’W‘˜ _è¸áàê*ýH!!îfx…‡—ˆæ‡ÁƒÇÉáAP(žºñŒBBúXçՋg‘pþ¬²Hè0|<ØTàÁ¯™L4†±* ¨0%ÒqH€³¡–E1²x¤·QÒ\b‘ÿvhÿšòÄÀ(…ð #hZöW—4\gÇøZ‘":®€B¤k^PKiò} _èíIŸ79«ä8T §‰àläû@&º;&‚jÁ0H»mELøŠÈ‘6b6 u ûÀVïC-6M6!딜H,´Ü0}XûËDÆQƒMJŽGßD>]±w#møí̔ˆD]BÔH²«Ï¿Tˆ¢4®é”FI³wR8!÷ !æNJÃ1q+¥áÈPLj…¤Ên|Ä:% ïã‚Z±}«ˆM J»wEÌL ¤‰!C®yn,ÖÁűf–ÚûjWÄÌ­GWiêIˬ‚‹u€ÚñU½i"ܒ -6…4U‘bbjAËÐf‡´Æ˜þªÑ}¸Ž}þ ,ò•;¤eaáÈóÆAPænUG“ä pÚ¼‘uZÄÈóšsɂh““¡oÙìW²K°¯ß§P‘ûêևR%ÖY<ý›BA6o㛛á͊==`ïACj^c«šmH3…^ÚvHÙkqåх©/¶ß¿ -4½á! :ªkl­ï,ÿNƚ𗸎”^°Æ`/£ö”ß(='d!f¨®œ.wÔ|Ó´͙…‘dˆúhKmˆ°ƒAL“”pû°F}æb  䲉Zê•@G¯ùÃ!ú:JǬõF:fšôÈd0éG¢º”ÉIG»p;ik®¬më!mmZ{¸ð2ÂÙ퐌º ´ü\ÍÀ¡€ZÆ9Æ÷ àËBáYà’]k†õFQVœ•Ó˚¬­Bû'k\ Í7Æf6’ñl靹k¨K8õiÿIc8#P»=ñ$ZWÏujt¬Îàl¢§{aÒ$Yõt¯’±Á1¹9ç¸cÖ:oÄyši+|‹Y÷ò}`ÈÊcIN҈,Üɀ;šôb]–,Ú8 -Æ0G`Âi æ2É -ªíæ¯l4¼)¥sväúÙæ\ɞ;ÏA '?ZdÃF/³zÌwÏ0Ú+a'J¦j -üéd©}́}²u²î¤ÁèCE*"áMç‰9Ý*²{!ãªÁýr>f‰YÅR¥l²`ÂßëA‘3îÁ†²'¹Œ±rô©)ñGîÿ3棬OZë2ëwq·Aã˂Nn—E„Þ(2ï |`0Qw"“¯ÑÁ#eËsÙ4ÐÜ‚UåCàkàZx#H‡¥îËÈ ÄtŠÅã)ÄèޔßÓºkñ@ØtÖÿ‹»~\ý×ÔùfóÄ܆Ê<‰=«lM>×`œ}ş}í=и§ž±1·Ð-71ô#mØ?[ÖHA‰…äh¯‡) a?ØÐw¢Ý~‡›×á6üä+'nC;Ÿc׺'d^ƒ³¡,læpÀeš7ÓdÞïóÓQ3EŽÊ˜;±h.Nï_Ð%ûE;üyYqŒ‚ -ðwm}UȅEõ}ݽ`&BÐäÄY ˆ‰é£‹,í0~ÝÈ[ó¥^íåt¹~Ú³(áŒzL”~Cí¸ÖÌ·»ðaó^0¾ëâšï1!ƒ#´1ö3geƒÌ¬ÐªXǀe"?`O­àÁ¡³ÑöGo—¶ ;O&…šÕ;ŒÓGlš¶±1Ög€¢4F¿Úm H‚ŸÐZr0¿Ì:6'p±ñwÍøÖüfÎ"ŒüŽ´¯,újÅ^ õ©WÎ!Mq~´o°›1æEXÂBû2f\FÃ\Y˺ÕÞ0ó5¤´\ß1fßÙ±Žr»Ÿ9 >42CW[ÞWöQÞ»XSs&œïq ;ÄŠ÷ϲ6ˆ' vz¦—ÐP€d hÎù^uŽl(~|m’èG”SÕùþéf=uà\ÒEtÈ¡ 81tËb~„‡tϞv#öÌúÃbð#‰HeÂRYt‰y¸èz£në’a±<9"nœ6҅ɫFpÞS³i¸0‡œy5Ð1μ¡‡ý€9i²U‘ÀFSð¨é¤i~Ô!ó(˜Á§O’&ÚQ߅¢» .°d£¡›ù4ñ >èõ]~ .íHÐ_;Œ‡jùI0Ÿú$;œwj€7¾=G®¾Æ= =u•ý =›åڇFÓ¾y–úõe«ÉU@ÀDÊs:ÚÅÃü¡ü±[Áïpî—1M2§>Aæȸ |’̧ çӇÿéÏs1突µ˜£aË®…¶ÎìOå%Hù ƒ£Ÿ(æ¬ÐÑùí£P‡Ð!æÄð¯—ä_F:æ 0"O³µÞ·4";K*,…áÑÆ{‡s¡}7°‘GÆóå ¬ƒôŽóz(]š½!+ $ž(%.°^6ð‹ÜÕyŠ@„‰ôŽ':岘ÞwJä—ÆÆ÷˜2/ GïÝ Ã(—Xêe„žQ]²Ñ›$äÁ%À]ü­|êg™˜ð¸[™`|[%gJɽü -ù€ÐÝ"o¦nŠ¦i 2¤lÔcŠqS„éï”.oÏBgÇÞy>ö™MÍÂ%‰ü¯èÓ¿üA·÷ýq~œWÓCõ°˜/6Ïà,B¡3Q Éæf²Í¦ÓÆô¿Néíø¼žnNÏ¡gg¢ž*Þôt¼LŸm4ƒò³œÃN+Mán) y“éY0·Ìë>^‡éэ -U/ã®±‡9”í úö¢± &Ÿ›+[טòGüÚ¥ÜÔ/Σôě,ºôô’a>p6útÀ©±™ãq¤ZÂHŸ78Ã7ø"¦±'܍­ÒÉ«ˆô‘ ó¡ÖæQ‘>’a>HÃSéÃ1ô+¤Nd€ìVJjÀ½Òáy‚yQå8xŸæW¹W ܃Û çê}:Ük@„²€½öe¥vÝ÷ñ#¹tº›ÕJ œÈ€‚4ÿ)©;â˜Njàú£õÕFjàD6h某8‘“/5p"œÍ?&5p"¾o.5p"#-5ÈÇî2šXHڜ†NËw’<:[«Ÿ²Ýјßz&š‰žCïÁæc54æÅ*ª±oj_±Ŋ¨Ð‹öÚ¥ØØ< 䯱<±·ÆþI·îíŒÂå1q -«"‘ÀÀXœ ëšÎ:éƒÝè2Æ5ßhéëL9lÈXêú>G -ÎEçä ‘…-dEº9ài™¢Xî§;Öz+ H…­ÐG Ÿ¥yÚ7½\‰€Á±!͒'l}?#Ô1V¦„Pr!=TÎN€ -z#sMS€kh )7÷@¤½9èÐ}œ -ÊU Š“bü;×t¡Å`¹¹«v¨Ðr.朶ìÄÌd›)e!äNjDZúL߈¨Ô„^ʔlÇCeƁÒE¨ÌÉtdûx¿ •±äž|b̈́ôl-ŒlNjê±W°¨S°ëæEõøtš—¤>-”tbÙNŽDv&z’f€â)“Ð"ÚÌ ‰’[‘;ó¬µgžuÎEucåBáñÔ:Dƒöùhp÷¾ŠPÄΨP•W—D¼’­é F²Ã9MnsӚÅâT?î2dG"^ݏNᡏ#¹>h$ôp$€áð¯> .ófBvnˆ×a}ybH`1r~;‹*WH^OH¸#n)z?©ˆ×¡„[‰ø­éqi¾+ pm :§’(/ú µVµƒxBõŒDú™l÷M$å°s[‹¦z"(ÁçŠ*‘íi ž,÷6Ô¹­‚¤©ETÐíJFÞ¸ܟ+’ÕÙ>v)Bt"*± ™$êà¨Íå“V¶žcù<¸÷XÓ\ro¦›ÂhlÓÏ[úçâN®û( ˆ-¦û(­ìqpHSšlý8q7¥M÷Q±1KQšê>ÊV›"•à Y(­ïwܳ"(r[¬HijûȕµÊûV>zJ‚ª¡ø úqlÂA@ƒ¿Š¢§âޗò+ìB÷­xå±I7rÉÛ³×푋AøÊ(Ñéž=’}¸qˆ:IüÎ{NŽfëcÔ¹ïHÍ­V.¾]n2ƒØ‘Ò¤%Äãëýö»ÈblupØÄY§Âф÷áK‰nvÉAˆ°Îq¬ÿæ«qük­™ ¨^’Š$Å욱'³:éó0WN}ƒ:Î}á3v*ʑ ÞªÂ ŠBît„ªð‚ÂÙð¡¬ÍU˜VÃ:'…¹5¬g²„{&yʶSf—š³ïžh¥}ó%³±¾O§êu?à5„“<ý‹xNÀ?ÓÎ_ˆ8@âÙ }ÀÐ Û£¯Ãõ´°™Lÿ‹~P?mÿa¸žð·‰Íi1\-†ÇÅfN;•¥0ÀŽ€B%Äà·"øôžýû™$ž+ϟßÄóä ¼ü€/Á¿“§ùžMæçN.EbWÁGÀãöº=τÃðú|ªSáò{¼‚ÃíòzÀ9‚.Òë >w†Oÿr{ýÏvOÀÿ Ô<×G}.ӟ]GÀO’ð;jGºIØt㙊N.æƒÃbþ{Œ·«óz#±Ú4FÀ¬6h²Žx¼Aب±»á˜|¤Ã šÀ ¸üpÐnÒáóA80ô€$jf©rõõpµº~7, -év³‹‚­ ³$Þ ³ }÷z^·d¸ýÏ ¿£n\® ÃÅ}½bÅÊÓÙið><ýª™f9I³ À5ÐV³ÃÓõå}8Ÿ6ÃÅ -rùqø?¦ÏÃÍf{ž¦;ðêy~˜Áš>·ÿ†OàØTJáÿ1¶—_ -endstream endobj 6 0 obj <> endobj 26 0 obj <> endobj 45 0 obj <> endobj 64 0 obj <> endobj 72 0 obj [/View/Design] endobj 73 0 obj <>>> endobj 53 0 obj [/View/Design] endobj 54 0 obj <>>> endobj 34 0 obj [/View/Design] endobj 35 0 obj <>>> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 84 0 obj [83 0 R] endobj 100 0 obj <> endobj xref -0 101 -0000000004 65535 f -0000000016 00000 n -0000000201 00000 n -0000045144 00000 n -0000000005 00000 f -0000000007 00000 f -0000170608 00000 n -0000000009 00000 f -0000045195 00000 n -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000014 00000 f -0000000017 00000 f -0000171227 00000 n -0000171258 00000 n -0000000018 00000 f -0000000019 00000 f -0000000020 00000 f -0000000021 00000 f -0000000022 00000 f -0000000023 00000 f -0000000024 00000 f -0000000025 00000 f -0000000027 00000 f -0000170675 00000 n -0000000028 00000 f -0000000029 00000 f -0000000030 00000 f -0000000031 00000 f -0000000032 00000 f -0000000033 00000 f -0000000036 00000 f -0000171111 00000 n -0000171142 00000 n -0000000037 00000 f -0000000038 00000 f -0000000039 00000 f -0000000040 00000 f -0000000041 00000 f -0000000042 00000 f -0000000043 00000 f -0000000044 00000 f -0000000046 00000 f -0000170743 00000 n -0000000047 00000 f -0000000048 00000 f -0000000049 00000 f -0000000050 00000 f -0000000051 00000 f -0000000052 00000 f -0000000055 00000 f -0000170995 00000 n -0000171026 00000 n -0000000056 00000 f -0000000057 00000 f -0000000058 00000 f -0000000059 00000 f -0000000060 00000 f -0000000061 00000 f -0000000062 00000 f -0000000000 00000 f -0000000000 00000 f -0000170811 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000170879 00000 n -0000170910 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 -0000047239 00000 n -0000047055 00000 n -0000171343 00000 n -0000045567 00000 n -0000055928 00000 n -0000055815 00000 n -0000045927 00000 n -0000046493 00000 n -0000046541 00000 n -0000047123 00000 n -0000047154 00000 n -0000047455 00000 n -0000047723 00000 n -0000056002 00000 n -0000056198 00000 n -0000057266 00000 n -0000063713 00000 n -0000129302 00000 n -0000171368 00000 n -trailer -<<025EC4A9513F8B4B84067E8D2E8B1981>]>> -startxref -171562 -%%EOF diff --git a/net.mograsim.plugin.core.nl_de/.classpath b/net.mograsim.plugin.core.nl_de/.classpath deleted file mode 100644 index bc3587db..00000000 --- a/net.mograsim.plugin.core.nl_de/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/net.mograsim.plugin.core.nl_de/.gitignore b/net.mograsim.plugin.core.nl_de/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.plugin.core.nl_de/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.plugin.core.nl_de/.project b/net.mograsim.plugin.core.nl_de/.project deleted file mode 100644 index 8863fad2..00000000 --- a/net.mograsim.plugin.core.nl_de/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - net.mograsim.plugin.core.nl_de - - - net.mograsim.plugin.core - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index cd95f141..00000000 --- a/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,7 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 diff --git a/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF b/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF deleted file mode 100644 index 4a3f56fa..00000000 --- a/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: German translation -Bundle-SymbolicName: net.mograsim.plugin.core.nl_de;singleton:=true -Bundle-Version: 0.1.0.qualifier -Bundle-Vendor: Mograsim Team -Fragment-Host: net.mograsim.plugin.core;bundle-version="0.1.0" -Automatic-Module-Name: net.mograsim.plugin.core.nl_de -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Bundle-Localization: OSGI-INF/l10n/bundle diff --git a/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties b/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties deleted file mode 100644 index 5f8222d7..00000000 --- a/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties +++ /dev/null @@ -1,34 +0,0 @@ -#Properties file for net.mograsim.plugin.core -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim Basis -content-type.name = Assembler -category.name = Mograsim -view.name = Beispiel AsmOpsEdit -e4view.name = Simulation und Visualisierung -extension.name = Mograsim Project Builder -extension.name.0 = Mograsim Project Nature -category.name.0 = Mograsim Project Nature commands -command.name = Mograsim Project Nature hinzufügen/entfernen -command.label = Sample builder deaktivieren -command.label.0 = Sample builder aktivieren -extension.name.1 = XML Problem -decorator.label = Resource Decorator -themeElementCategory.label = Mograsim -colorDefinition.label = Simulation Hintergrundfarbe -colorDefinition.description = The Background of the Simulation Visualisation -colorDefinition.label.0 = Simulation Vordergrundfarbe -colorDefinition.label.1 = Assembler Kommentarfarbe -colorDefinition.label.2 = Assembler Beschriftungsfarbe -colorDefinition.label.3 = Assembler Operationsfarbe -colorDefinition.label.4 = Assembler Zahlenfarbe -colorDefinition.label.5 = Simulation Farbe 1 -colorDefinition.label.6 = Simulation Farbe U -colorDefinition.label.7 = Simulation Farbe X -colorDefinition.label.8 = Simulation Farbe Z -colorDefinition.label.9 = Simulation Farbe 0 -colorDefinition.label.10 = Simulation Textfarbe -fontDefinition.label = Assembler Operation Textstil -view.name.0 = Simulation View -view.name.1 = Speicher -view.name.2 = Instruktionseditor -themeElementCategory.label.0 = Simulation \ No newline at end of file diff --git a/net.mograsim.plugin.core.nl_de/build.properties b/net.mograsim.plugin.core.nl_de/build.properties deleted file mode 100644 index 34520a00..00000000 --- a/net.mograsim.plugin.core.nl_de/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -bin.includes = META-INF/,\ - .,\ - OSGI-INF/ diff --git a/net.mograsim.plugin.core/.classpath b/net.mograsim.plugin.core/.classpath deleted file mode 100644 index 4a00becd..00000000 --- a/net.mograsim.plugin.core/.classpath +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.core/.gitignore b/net.mograsim.plugin.core/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.plugin.core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.plugin.core/.project b/net.mograsim.plugin.core/.project deleted file mode 100644 index 29dcdb4f..00000000 --- a/net.mograsim.plugin.core/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - net.mograsim.plugin.core - - - net.mograsim.logic.model - net.mograsim.logic.model.am2900 - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 3c8fadd6..00000000 --- a/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=false -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true -sp_cleanup.correct_indentation=true -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=true -sp_cleanup.never_use_blocks=true -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=true -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=true -sp_cleanup.remove_redundant_semicolons=true -sp_cleanup.remove_redundant_type_arguments=true -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=true -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=true -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=true -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.plugin.core/META-INF/MANIFEST.MF b/net.mograsim.plugin.core/META-INF/MANIFEST.MF deleted file mode 100644 index 6dfa9547..00000000 --- a/net.mograsim.plugin.core/META-INF/MANIFEST.MF +++ /dev/null @@ -1,36 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %Bundle-Name -Bundle-SymbolicName: net.mograsim.plugin.core;singleton:=true -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.plugin;uses:="org.eclipse.ui.themes,org.eclipse.swt.widgets", - net.mograsim.plugin.asm, - net.mograsim.plugin.asm.editor, - net.mograsim.plugin.asm.editor.rules, - net.mograsim.plugin.nature, - net.mograsim.plugin.tables, - net.mograsim.plugin.tables.memory, - net.mograsim.plugin.tables.mi, - net.mograsim.plugin.util, - net.mograsim.plugin.views -Require-Bundle: org.eclipse.core.runtime, - org.eclipse.ui, - org.eclipse.jface.text, - org.eclipse.ui.editors, - org.eclipse.ui.genericeditor, - org.eclipse.core.filebuffers, - org.eclipse.core.resources, - org.eclipse.e4.ui.di, - org.eclipse.e4.ui.model.workbench, - org.eclipse.ui.themes;bundle-version="1.2.400", - net.mograsim.logic.model;bundle-version="0.1.0";visibility:=reexport, - net.mograsim.logic.model.am2900;bundle-version="0.1.0";visibility:=reexport, - javax.annotation;bundle-version="1.0.0", - net.mograsim.preferences;bundle-version="0.1.0", - net.mograsim.machine, - net.mograsim.plugin.core -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Automatic-Module-Name: net.mograsim.plugin.core -Bundle-Vendor: %Bundle-Vendor.0 -Bundle-Activator: net.mograsim.plugin.MograsimActivator -Bundle-ActivationPolicy: lazy diff --git a/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties b/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties deleted file mode 100644 index 856144a6..00000000 --- a/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties +++ /dev/null @@ -1,35 +0,0 @@ -#Properties file for net.mograsim.plugin.core -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim core -content-type.name = Assembler -category.name = Mograsim -view.name = Sample AsmOpsEdit -e4view.name = Simulation und Visualisierung -extension.name = Mograsim Project Builder -extension.name.0 = Mograsim Project Nature -category.name.0 = Mograsim Project Nature commands -command.name = Add/RemoveMograsim Project Nature -command.label = Disable Sample builder -command.label.0 = Enable Sample builder -extension.name.1 = XML Problem -decorator.label = Resource Decorator -themeElementCategory.label = Mograsim -colorDefinition.label = Simulation Background -colorDefinition.description = The Background of the Simulation Visualisation -colorDefinition.label.0 = Simulation Foreground Color -colorDefinition.label.1 = Assembler Comment Color -colorDefinition.label.2 = Assembler Label Color -colorDefinition.label.3 = Assembler Operation Color -colorDefinition.label.4 = Assembler Number Color -colorDefinition.label.5 = Simulation Color 1 -colorDefinition.label.6 = Simulation Color U -colorDefinition.label.7 = Simulation Color X -colorDefinition.label.8 = Simulation Color Z -colorDefinition.label.9 = Simulation Color 0 -colorDefinition.label.10 = Simulation text color -fontDefinition.label = Assembler Operation Style -view.name.0 = Simulation View -view.name.1 = Memory -view.name.1 = Instruction Editor -themeElementCategory.label.0 = Simulation -Bundle-Vendor.0 = Mograsim Team \ No newline at end of file diff --git a/net.mograsim.plugin.core/build.properties b/net.mograsim.plugin.core/build.properties deleted file mode 100644 index 7a5784ee..00000000 --- a/net.mograsim.plugin.core/build.properties +++ /dev/null @@ -1,9 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = plugin.xml,\ - META-INF/,\ - .,\ - OSGI-INF/l10n/bundle.properties,\ - OSGI-INF/,\ - icons/ - \ No newline at end of file diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png deleted file mode 100644 index 51707352..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png deleted file mode 100644 index a0584969..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png deleted file mode 100644 index 3589af36..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png deleted file mode 100644 index 0eef2dd2..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png deleted file mode 100644 index 5fecefe8..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png deleted file mode 100644 index a0dc941a..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png deleted file mode 100644 index 5b287ad0..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png deleted file mode 100644 index 4d5f38ff..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png deleted file mode 100644 index 2b6b2e83..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png deleted file mode 100644 index cbb88e68..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png deleted file mode 100644 index ff9c9bfe..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png deleted file mode 100644 index bc2386bb..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png deleted file mode 100644 index 8ae04cda..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png deleted file mode 100644 index d7cc656b..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png deleted file mode 100644 index dedba0c0..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png deleted file mode 100644 index 771b0091..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png deleted file mode 100644 index 2018a5a4..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png deleted file mode 100644 index 9b294e7c..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png deleted file mode 100644 index 63e2e040..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png deleted file mode 100644 index 934402bd..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png deleted file mode 100644 index 2582dd58..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png deleted file mode 100644 index 06daaaf3..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png deleted file mode 100644 index 250e61fc..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png deleted file mode 100644 index 849cc254..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png deleted file mode 100644 index b99adf87..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png deleted file mode 100644 index be406743..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png deleted file mode 100644 index f5793ed7..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png deleted file mode 100644 index c2d6dc32..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png deleted file mode 100644 index 6860ac7b..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png deleted file mode 100644 index 5c0f9493..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png deleted file mode 100644 index 9723b914..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png deleted file mode 100644 index abd8fe4e..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png deleted file mode 100644 index 8972d910..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png deleted file mode 100644 index 881c9948..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png deleted file mode 100644 index 1c3c070d..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png deleted file mode 100644 index 54295a26..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png deleted file mode 100644 index 1bcc361f..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png deleted file mode 100644 index c842fdfd..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png deleted file mode 100644 index 25f277e1..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png deleted file mode 100644 index edf5f726..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png deleted file mode 100644 index 92cae0b7..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png deleted file mode 100644 index 6a9510f4..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png deleted file mode 100644 index 1818767c..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/plugin.xml b/net.mograsim.plugin.core/plugin.xml deleted file mode 100644 index dccf76c8..00000000 --- a/net.mograsim.plugin.core/plugin.xml +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %colorDefinition.description - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java deleted file mode 100644 index 8ff21f49..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.mograsim.plugin; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; - -public class AsmOps -{ - public static Set ops = new HashSet<>(); - public static Set>> listeners = new HashSet<>(); - - static - { - ops.add("add"); - ops.add("mul"); - ops.add("mov"); - ops.add("inc"); - } - - public static void setWords(Collection s) - { - if (ops.size() == s.size() && ops.containsAll(s)) - return; - ops.clear(); - ops.addAll(s); - update(); - } - - public static void addListener(Consumer> con) - { - listeners.add(con); - con.accept(ops); - } - - public static void removeListener(Consumer> con) - { - listeners.remove(con); - } - - public static void update() - { - listeners.forEach(c -> c.accept(ops)); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java deleted file mode 100644 index cc96edbb..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.mograsim.plugin; - -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -import net.mograsim.logic.model.am2900.machine.Am2900Machine; -import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; -import net.mograsim.machine.Machine; -import net.mograsim.machine.MachineRegistry; - -public class MachineContext -{ - private Machine machine; - private Set observers; - private static MachineContext instance; - - private MachineContext() - { - observers = new HashSet<>(); - } - - public static MachineContext getInstance() - { - if (instance == null) - { - instance = new MachineContext(); - // TODO don't hardcode the Am2900 - instance.setMachine(new Am2900Machine((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"))); - } - return instance; - } - - public Machine getMachine() - { - return machine; - } - - public void setMachine(Machine machine) - { - this.machine = machine; - notifyObservers(machine); - } - - public void registerObserver(ContextObserver ob) - { - observers.add(ob); - ob.setMachine(Optional.ofNullable(machine)); - } - - public void deregisterObserver(ContextObserver ob) - { - observers.remove(ob); - } - - private void notifyObservers(Machine machine) - { - observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine))); - } - - @FunctionalInterface - public static interface ContextObserver - { - void setMachine(Optional machine); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java deleted file mode 100644 index c17f5304..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.plugin; - -import org.eclipse.ui.plugin.AbstractUIPlugin; - -import net.mograsim.machine.MachineRegistry; - -public final class MograsimActivator extends AbstractUIPlugin -{ - - public MograsimActivator() - { - MachineRegistry.reload(); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java deleted file mode 100644 index 5fcc1688..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.mograsim.plugin; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.themes.ITheme; -import org.eclipse.ui.themes.IThemePreview; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.model.LogicExecuter; -import net.mograsim.logic.model.LogicUICanvas; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.atomic.ModelNotGate; -import net.mograsim.logic.model.model.components.atomic.ModelOrGate; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.preferences.Preferences; - -public class SimulationPreview implements IThemePreview -{ - private LogicUICanvas ui; - private LogicExecuter exec; - private Preferences oldPreferences; - private Preferences currentThemePreferences; - - @Override - @SuppressWarnings("unused") - public void createControl(Composite parent, ITheme currentTheme) - { - oldPreferences = Preferences.current(); - - currentThemePreferences = new ThemePreferences(currentTheme); - // TODO this will change the global preferences; so if another LogicUICanvas redraws, it will use the "new" colors too. - Preferences.setPreferences(currentThemePreferences); - - LogicModelModifiable model = new LogicModelModifiable(); - CoreModelParameters params = new CoreModelParameters(); - params.gateProcessTime = 50; - params.wireTravelTime = 10; - - ModelManualSwitch rIn = new ModelManualSwitch(model, 1); - rIn.moveTo(10, 10); - ModelManualSwitch sIn = new ModelManualSwitch(model, 1); - sIn.moveTo(10, 70); - - ModelOrGate or1 = new ModelOrGate(model, 1); - or1.moveTo(70, 12.5); - new ModelWire(model, rIn.getOutputPin(), or1.getPin("A")); - - ModelOrGate or2 = new ModelOrGate(model, 1); - or2.moveTo(70, 62.5); - new ModelWire(model, sIn.getOutputPin(), or2.getPin("B")); - - ModelNotGate not1 = new ModelNotGate(model, 1); - not1.moveTo(110, 17.5); - new ModelWire(model, or1.getPin("Y"), not1.getPin("A")); - - ModelNotGate not2 = new ModelNotGate(model, 1); - not2.moveTo(110, 67.5); - new ModelWire(model, or2.getPin("Y"), not2.getPin("A")); - - ModelWireCrossPoint p1 = new ModelWireCrossPoint(model, 1); - p1.moveCenterTo(140, 22.5); - new ModelWire(model, not1.getPin("Y"), p1); - new ModelWire(model, p1, or2.getPin("A"), new Point(140, 35), new Point(50, 60), new Point(50, 67.5)); - - ModelWireCrossPoint p2 = new ModelWireCrossPoint(model, 1); - p2.moveCenterTo(140, 72.5); - new ModelWire(model, not2.getPin("Y"), p2); - new ModelWire(model, p2, or1.getPin("B"), new Point(140, 60), new Point(50, 35), new Point(50, 27.5)); - - ModelWireCrossPoint o1 = new ModelWireCrossPoint(model, 1); - o1.moveCenterTo(150, 22.5); - new ModelWire(model, p1, o1); - - ModelWireCrossPoint o2 = new ModelWireCrossPoint(model, 1); - o2.moveCenterTo(150, 72.5); - new ModelWire(model, p2, o2); - - Timeline t = LogicCoreAdapter.convert(model, params); - exec = new LogicExecuter(t); - - rIn.clicked(0, 0); - - ui = new LogicUICanvas(parent, SWT.NONE, model); - - ui.zoom(3.5, 10, 10); - exec.startLiveExecution(); - - currentTheme.addPropertyChangeListener(e -> ui.redraw()); - } - - @Override - public void dispose() - { - exec.stopLiveExecution(); - if (Preferences.current() == currentThemePreferences) - Preferences.setPreferences(oldPreferences); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java deleted file mode 100644 index 42da25d1..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.mograsim.plugin; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.resource.ColorRegistry; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.ui.statushandlers.StatusManager; -import org.eclipse.ui.themes.ITheme; - -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.DefaultPreferences; -import net.mograsim.preferences.Preferences; - -// TODO proper getInt/getDouble implementation, maybe via own preferences page? -public class ThemePreferences extends Preferences -{ - private final ITheme theme; - - public ThemePreferences(ITheme theme) - { - this.theme = theme; - } - - @Override - public boolean getBoolean(String name) - { - return new DefaultPreferences().getBoolean(name); - } - - @Override - public int getInt(String name) - { - return new DefaultPreferences().getInt(name); - } - - @Override - public double getDouble(String name) - { - return new DefaultPreferences().getDouble(name); - } - - @Override - public ColorDefinition getColorDefinition(String name) - { - RGB rgb = getColorRegistry().getRGB(name); - if (rgb == null) - { - StatusManager.getManager().handle(new Status(IStatus.ERROR, "net.mograsim.plugin.core", "No color for name " + name)); - return null; - } - return new ColorDefinition(rgb.red, rgb.green, rgb.blue); - } - - @Override - public Color getColor(String name) - { - return getColorRegistry().get(name); - } - - private ColorRegistry getColorRegistry() - { - return theme.getColorRegistry(); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java deleted file mode 100644 index 580c3249..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.mograsim.plugin.asm; - -import static java.lang.String.format; - -import java.math.BigInteger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class AsmNumberUtil -{ - - private AsmNumberUtil() - { - - } - - private static final String sgnPat = "([-+]?)"; - private static final String binPat = "((?:[01]+_)*[01]+)"; - private static final String octPat = "((?:[0-7]+_)*[0-7]+)"; - private static final String decPat = "((?:[0-9]+_)*[0-9]+)"; - private static final String hexPat = "((?:[0-9a-f]+_)*[0-9a-f]+)"; - - private static final String preferredBinPat = "%1$s0b%2$s"; - private static final String preferredOctPat = "%s%sq"; - private static final String preferredDecPat = "%s%s"; - private static final String preferredHexPat = "%1$s0x%2$s"; - - static final Pattern numberBin = Pattern.compile(format(preferredBinPat + "|%1$s%2$sb", sgnPat, binPat), Pattern.CASE_INSENSITIVE); - static final Pattern numberOct = Pattern.compile(format(preferredOctPat, sgnPat, octPat), Pattern.CASE_INSENSITIVE); - static final Pattern numberDec = Pattern.compile(format(preferredDecPat, sgnPat, decPat)); - static final Pattern numberHex = Pattern.compile(format(preferredHexPat + "|%1$s%2$sh", sgnPat, hexPat), Pattern.CASE_INSENSITIVE); - static final Pattern numberFloat = Pattern.compile(format("%1$s%2$s(?:\\.%2$s)?(?:e%1$s%2$s)?", sgnPat, decPat), - Pattern.CASE_INSENSITIVE); - - public static boolean isPrefix(CharSequence cs, Pattern p) - { - Matcher m = p.matcher(cs); - return m.matches() || m.hitEnd(); - } - - public static boolean isBinary(CharSequence cs) - { - return numberBin.matcher(cs).matches(); - } - - public static boolean isOctal(CharSequence cs) - { - return numberOct.matcher(cs).matches(); - } - - public static boolean isDecimal(CharSequence cs) - { - return numberDec.matcher(cs).matches(); - } - - public static boolean isHexadecimal(CharSequence cs) - { - return numberHex.matcher(cs).matches(); - } - - public static boolean isFloatingPoint(CharSequence cs) - { - return numberFloat.matcher(cs).matches(); - } - - public static boolean isNumber(CharSequence cs) - { - return getType(cs) != NumberType.NONE; - } - - public static boolean quickCheckForNumber(CharSequence cs) - { - if (cs.length() == 0 || !isStart(cs.charAt(0))) - return false; - return cs.length() == 1 || isPart(cs.charAt(1)); - } - - public static boolean isStart(int c) - { - return isDigit(c) || c == '+' || c == '-'; - } - - public static boolean isDigit(int c) - { - return ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'); - } - - public static boolean isPart(int c) - { - return isDigit(c) || isMarker(Character.toLowerCase(c)); - } - - public static boolean isMarker(int lowerCase) - { - switch (lowerCase) - { - case '.': - case '_': - case '+': - case '-': - case 'e': - case 'x': - case 'b': - case 'q': - case 'h': - return true; - default: - return false; - } - } - - public static NumberType getType(CharSequence cs) - { - if (!quickCheckForNumber(cs)) - return NumberType.NONE; - if (isDecimal(cs)) - return NumberType.DECIMAL; - if (isHexadecimal(cs)) - return NumberType.HEXADECIMAL; - if (isBinary(cs)) - return NumberType.BINARY; - if (isOctal(cs)) - return NumberType.OCTAL; - if (isFloatingPoint(cs)) - return NumberType.FLOATINGPOINT; - return NumberType.NONE; - } - - /** - * Checks if the {@link CharSequence} is a prefix of a valid number, and returns the NumberType it is a prefix of. If a String is a - * prefix of multiple different {@link NumberType}s, the one with the smallest radix is returned. If no valid {@link NumberType} is - * found, {@link NumberType#NONE} is returned. - * - * @param cs The potential prefix - * @return The type the {@link CharSequence} is a prefix of - */ - public static NumberType prefixOfType(CharSequence cs) - { - if (isPrefix(cs, numberBin)) - return NumberType.BINARY; - if (isPrefix(cs, numberOct)) - return NumberType.OCTAL; - if (isPrefix(cs, numberDec)) - return NumberType.DECIMAL; - if (isPrefix(cs, numberHex)) - return NumberType.HEXADECIMAL; - if (isPrefix(cs, numberFloat)) - return NumberType.FLOATINGPOINT; - return NumberType.NONE; - } - - private static CharSequence extractSignAndDigits(NumberType type, CharSequence cs) - { - return type.numberPattern.matcher(cs).replaceAll("$1$2").replaceAll("_", ""); - } - - /** - * Computes the {@link BigInteger} value of a {@link CharSequence}, by determining the {@link NumberType} and parsing the number with - * the determined radix. - * - * @throws NumberFormatException if the {@link CharSequence} does not match any of the expected number patterns - */ - public static BigInteger valueOf(CharSequence cs) - { - NumberType type = getType(cs); - if (NumberType.NONE.equals(type)) - throw new NumberFormatException(); - return new BigInteger(extractSignAndDigits(type, cs).toString(), type.radix); - } - - /** - * Formats a {@link BigInteger} in accordance with the pattern associated with the supplied {@link NumberType} - */ - public static String toString(BigInteger number, NumberType type) - { - String pattern; - switch (type) - { - case BINARY: - pattern = preferredBinPat; - break; - case OCTAL: - pattern = preferredOctPat; - break; - default: - case DECIMAL: - pattern = preferredDecPat; - break; - case HEXADECIMAL: - pattern = preferredHexPat; - } - if (number.signum() < 0) - return String.format(pattern, "-", number.abs().toString(type.radix)); - return String.format(pattern, "", number.toString(type.radix)); - } - - public enum NumberType - { - NONE(-1, null), BINARY(2, AsmNumberUtil.numberBin), OCTAL(8, AsmNumberUtil.numberOct), DECIMAL(10, AsmNumberUtil.numberDec), - HEXADECIMAL(16, AsmNumberUtil.numberHex), FLOATINGPOINT(10, AsmNumberUtil.numberFloat); - - public final int radix; - final Pattern numberPattern; - - NumberType(int radix, Pattern numberPattern) - { - this.radix = radix; - this.numberPattern = numberPattern; - } - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java deleted file mode 100644 index cc0d0ffa..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java +++ /dev/null @@ -1,212 +0,0 @@ -package net.mograsim.plugin.asm; - -import java.util.Arrays; -import java.util.stream.Collectors; - -import javax.inject.Inject; - -import org.eclipse.e4.ui.di.Persist; -import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.IToolBarManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchActionConstants; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.part.ViewPart; - -import net.mograsim.plugin.AsmOps; - -/** - * This sample class demonstrates how to plug-in a new workbench view. The view shows data obtained from the model. The sample creates a - * dummy model on the fly, but a real implementation would connect to the model available either in this or another plug-in (e.g. the - * workspace). The view is connected to the model using a content provider. - *

- * The view uses a label provider to define how model objects should be presented in the view. Each view can present the same model objects - * using different labels and icons, if needed. Alternatively, a single label provider can be shared between views in order to ensure that - * objects of the same type are presented in the same way everywhere. - *

- */ - -public class AsmOpsEdit extends ViewPart -{ - - @Inject - private MPart part; - - /** - * The ID of the view as specified by the extension. - */ - public static final String ID = "plugintest.views.AsmOpsEdit"; - - @Inject - IWorkbench workbench; - - private Text txtInput; - private TableViewer viewer; - - private IAction saveAction; - - class ViewLabelProvider extends LabelProvider implements ITableLabelProvider - { - @Override - public String getColumnText(Object obj, int index) - { - return getText(obj); - } - - @Override - public Image getColumnImage(Object obj, int index) - { - return getImage(obj); - } - - @Override - public Image getImage(Object obj) - { - return workbench.getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT); - } - } - - @Override - public void createPartControl(Composite parent) - { - parent.setLayout(new GridLayout(1, false)); - - txtInput = new Text(parent, SWT.BORDER); - txtInput.setMessage("Enter new Asm OP"); - txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - txtInput.addKeyListener(new KeyListener() - { - - @Override - public void keyReleased(KeyEvent e) - { - // TODO Auto-generated method stub - - } - - @Override - public void keyPressed(KeyEvent e) - { - if (e.keyCode == SWT.CR || e.keyCode == SWT.LF) - { - String in = txtInput.getText().toLowerCase(); - if (in.startsWith("-")) - viewer.remove(in.substring(1).trim()); - else - viewer.add(in.trim()); - txtInput.setText(""); - part.setDirty(true); - save(); - } - } - }); - - viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); - - viewer.setContentProvider(ArrayContentProvider.getInstance()); - viewer.setInput(createInitialDataModel()); - viewer.setLabelProvider(new ViewLabelProvider()); - viewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); - - // Create the help context id for the viewer's control - workbench.getHelpSystem().setHelp(viewer.getControl(), "PluginTest.viewer"); - getSite().setSelectionProvider(viewer); - makeActions(); - contributeToActionBars(); - hookContextMenu(); - } - - private Object createInitialDataModel() - { - return AsmOps.ops; - } - - @Override - public void setFocus() - { - txtInput.setFocus(); - } - - @Persist - public void save() - { - AsmOps.setWords(Arrays.stream(viewer.getTable().getItems()).map(i -> (String) i.getData()).collect(Collectors.toList())); - viewer.refresh(); - } - - private void makeActions() - { - saveAction = new Action() - { - public void run() - { - save(); - part.setDirty(false); - } - }; - saveAction.setText("Save"); - saveAction.setToolTipText("Save Changes To ISA"); - saveAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); - } - - private void contributeToActionBars() - { - IActionBars bars = getViewSite().getActionBars(); - fillLocalPullDown(bars.getMenuManager()); - fillLocalToolBar(bars.getToolBarManager()); - } - - private void fillLocalPullDown(IMenuManager manager) - { - manager.add(saveAction); - } - - private void fillContextMenu(IMenuManager manager) - { - manager.add(saveAction); - // Other plug-ins can contribute there actions here - manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - } - - private void fillLocalToolBar(IToolBarManager manager) - { - manager.add(saveAction); - } - - private void hookContextMenu() - { - MenuManager menuMgr = new MenuManager("#PopupMenu"); - menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() - { - public void menuAboutToShow(IMenuManager manager) - { - AsmOpsEdit.this.fillContextMenu(manager); - } - }); - Menu menu = menuMgr.createContextMenu(viewer.getControl()); - viewer.getControl().setMenu(menu); - getSite().registerContextMenu(menuMgr, viewer); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java deleted file mode 100644 index 7198a27a..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.DocumentCommand; -import org.eclipse.jface.text.IAutoEditStrategy; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; - -public class AsmAutoEditStrategy implements IAutoEditStrategy -{ - - @Override - public void customizeDocumentCommand(IDocument document, DocumentCommand command) - { - if (!">".equals(command.text)) - { // NON-NLS-1 - return; - } - try - { - IRegion region = document.getLineInformationOfOffset(command.offset); - String line = document.get(region.getOffset(), command.offset - region.getOffset()); - int index = line.lastIndexOf('<'); - if (index != -1 && (index != line.length() - 1) && line.charAt(index + 1) != '/') - { - String tag = line.substring(index + 1); - command.caretOffset = command.offset + 1; - command.text += "= natureTag.length() -// && text.substring(offset - natureTag.length(), offset).equals(natureTag)) { -// IProjectNatureDescriptor[] natureDescriptors = workspace.getNatureDescriptors(); -// ICompletionProposal[] proposals = new ICompletionProposal[natureDescriptors.length]; -// for (int i = 0; i < natureDescriptors.length; i++) { -// IProjectNatureDescriptor descriptor = natureDescriptors[i]; -// proposals[i] = new CompletionProposal(descriptor.getNatureId(), offset, 0, -// descriptor.getNatureId().length()); -// } -// return proposals; -// } -// if (text.length() >= projectReferenceTag.length() -// && text.substring(offset - projectReferenceTag.length(), offset).equals(projectReferenceTag)) { -// IProject[] projects = workspace.getRoot().getProjects(); -// ICompletionProposal[] proposals = new ICompletionProposal[projects.length]; -// for (int i = 0; i < projects.length; i++) { -// proposals[i] = new CompletionProposal(projects[i].getName(), offset, 0, projects[i].getName().length()); -// } -// return proposals; -// } -// return new ICompletionProposal[0]; -// text. - return AsmOps.ops.stream().map(o -> new AsmOperationProposal(o, "", offset)).toArray(ICompletionProposal[]::new); - } - - @Override - public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) - { - return null; - } - - @Override - public char[] getCompletionProposalAutoActivationCharacters() - { - return new char[] { '\n', '\r' }; // NON-NLS-1 - } - - @Override - public char[] getContextInformationAutoActivationCharacters() - { - return null; - } - - @Override - public String getErrorMessage() - { - return null; - } - - @Override - public IContextInformationValidator getContextInformationValidator() - { - return null; - } - - private class AsmOperationProposal implements ICompletionProposal, ICompletionProposalExtension4 - { - - private String asmOp; - private String desc; - private int offset; - - public AsmOperationProposal(String asmOp, String desc, int offset) - { - this.asmOp = asmOp; - this.desc = desc; - this.offset = offset; - } - - @Override - public boolean isAutoInsertable() - { - return true; - } - - @Override - public void apply(IDocument document) - { - try - { - document.replace(offset, 0, asmOp); - } - catch (BadLocationException e) - { - // ignore - } - } - - @Override - public Point getSelection(IDocument document) - { - return new Point(offset + asmOp.length(), 0); - } - - @Override - public String getAdditionalProposalInfo() - { - return desc; - } - - @Override - public String getDisplayString() - { - return asmOp; - } - - @Override - public Image getImage() - { - return null; // TODO image? - } - - @Override - public IContextInformation getContextInformation() - { - return new IContextInformation() - { - - @Override - public String getInformationDisplayString() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public Image getImage() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getContextDisplayString() - { - // TODO Auto-generated method stub - return null; - } - }; - } - - } - -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java deleted file mode 100644 index 91946bc7..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java +++ /dev/null @@ -1,77 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import java.io.StringReader; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.jface.text.DocumentEvent; -import org.eclipse.jface.text.IDocumentListener; -import org.xml.sax.InputSource; -import org.xml.sax.SAXParseException; - -public class AsmDocumentValidator implements IDocumentListener -{ - - private final IFile file; - private IMarker marker; - - AsmDocumentValidator(IFile file) - { - this.file = file; - } - - @Override - public void documentChanged(DocumentEvent event) - { - if (this.marker != null) - { - try - { - this.marker.delete(); - } - catch (CoreException e) - { - e.printStackTrace(); - } - this.marker = null; - } - try (StringReader reader = new StringReader(event.getDocument().get());) - { - DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - documentBuilder.parse(new InputSource(reader)); - } - catch (Exception ex) - { - try - { - this.marker = file.createMarker(IMarker.PROBLEM); - this.marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); - this.marker.setAttribute(IMarker.MESSAGE, ex.getMessage()); - if (ex instanceof SAXParseException) - { - SAXParseException saxParseException = (SAXParseException) ex; - int lineNumber = saxParseException.getLineNumber(); - int offset = event.getDocument().getLineInformation(lineNumber - 1).getOffset() + saxParseException.getColumnNumber() - - 1; - this.marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); - this.marker.setAttribute(IMarker.CHAR_START, offset); - this.marker.setAttribute(IMarker.CHAR_END, offset + 1); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - } - } - - @Override - public void documentAboutToBeChanged(DocumentEvent event) - { - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java deleted file mode 100644 index 50ab95cd..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import org.eclipse.core.resources.IProjectNatureDescriptor; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.ITextHover; -import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.Region; - -public class AsmHoverProvider implements ITextHover -{ - - @Override - public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) - { - // TODO this is logic for .project file to show nature description on hover. - // Replace with your language logic! - String contents = textViewer.getDocument().get(); - int offset = hoverRegion.getOffset(); - int endIndex = contents.indexOf("", offset); - if (endIndex == -1) - return ""; - int startIndex = contents.substring(0, offset).lastIndexOf(""); - if (startIndex == -1) - return ""; - String selection = contents.substring(startIndex + "".length(), endIndex); - - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - IProjectNatureDescriptor[] natureDescriptors = workspace.getNatureDescriptors(); - for (int i = 0; i < natureDescriptors.length; i++) - { - if (natureDescriptors[i].getNatureId().equals(selection)) - return natureDescriptors[i].getLabel(); - } - return ""; - } - - @Override - public IRegion getHoverRegion(ITextViewer textViewer, int offset) - { - return new Region(offset, 0); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java deleted file mode 100644 index 655160e0..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import org.eclipse.jface.resource.ColorRegistry; -import org.eclipse.jface.resource.FontRegistry; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.TextAttribute; -import org.eclipse.jface.text.presentation.PresentationReconciler; -import org.eclipse.jface.text.rules.DefaultDamagerRepairer; -import org.eclipse.jface.text.rules.EndOfLineRule; -import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.RuleBasedScanner; -import org.eclipse.jface.text.rules.Token; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.themes.ITheme; - -import net.mograsim.plugin.asm.editor.rules.AsmLabelRule; -import net.mograsim.plugin.asm.editor.rules.AsmNumberRule; -import net.mograsim.plugin.asm.editor.rules.InstructionRule; - -public class AsmPresentationReconciler extends PresentationReconciler -{ - - private final Token comment = new Token(null); -// private final Token std = new Token(null); - private final Token op = new Token(null); - private final Token label = new Token(null); - private final Token number = new Token(null); - - private IRule[] rules; - - public AsmPresentationReconciler() - { - RuleBasedScanner scanner = new RuleBasedScanner(); - rules = new IRule[4]; - rules[0] = new EndOfLineRule(";", comment); - rules[1] = new AsmLabelRule(label); - rules[2] = new InstructionRule(Token.UNDEFINED, op, true); - rules[3] = new AsmNumberRule(number); - - scanner.setRules(rules); - DefaultDamagerRepairer dr = new DefaultDamagerRepairer(scanner); - this.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); - this.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); - - ITheme current = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(); - updateStyle(current); - current.getColorRegistry().addListener(e -> updateStyle(current)); - current.getFontRegistry().addListener(e -> updateStyle(current)); - } - - void updateStyle(ITheme current) - { - ColorRegistry cr = current.getColorRegistry(); - FontRegistry fr = current.getFontRegistry(); - comment.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_comment_color"))); - op.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_operation_color"), null, 0, - fr.get("net.mograsim.plugin.asm_operation_font"))); - label.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_label_color"))); - number.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_number_color"))); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java deleted file mode 100644 index efee8a31..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import java.lang.ref.WeakReference; - -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.reconciler.Reconciler; -import org.eclipse.jface.text.source.projection.ProjectionViewer; - -import net.mograsim.plugin.AsmOps; - -public class AsmReconciler extends Reconciler -{ - - private AsmReconcilerStrategy fStrategy; - - public AsmReconciler() - { - fStrategy = new AsmReconcilerStrategy(); - this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE); - } - - @Override - public void install(ITextViewer textViewer) - { - super.install(textViewer); - ProjectionViewer pViewer = (ProjectionViewer) textViewer; - fStrategy.setProjectionViewer(pViewer); - WeakReference tv = new WeakReference<>(textViewer); - AsmOps.addListener(ops -> - { - System.out.println("refresh"); - if (tv.get() != null) - tv.get().invalidateTextPresentation(); - }); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java deleted file mode 100644 index a3253a43..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java +++ /dev/null @@ -1,173 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.reconciler.DirtyRegion; -import org.eclipse.jface.text.reconciler.IReconcilingStrategy; -import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension; -import org.eclipse.jface.text.source.Annotation; -import org.eclipse.jface.text.source.projection.ProjectionAnnotation; -import org.eclipse.jface.text.source.projection.ProjectionViewer; - -public class AsmReconcilerStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension -{ - private IDocument document; - private String oldDocument; - private ProjectionViewer projectionViewer; - private List oldAnnotations = new ArrayList<>(); - private List oldPositions = new ArrayList<>(); - - @Override - public void setDocument(IDocument document) - { - this.document = document; - } - - public void setProjectionViewer(ProjectionViewer projectionViewer) - { - this.projectionViewer = projectionViewer; - } - - @Override - public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) - { - initialReconcile(); - } - - @Override - public void reconcile(IRegion partition) - { - initialReconcile(); - } - - @Override - public void initialReconcile() - { - if (document.get().equals(oldDocument)) - return; - oldDocument = document.get(); - - List positions = getNewPositionsOfAnnotations(); - - List positionsToRemove = new ArrayList<>(); - List annotationToRemove = new ArrayList<>(); - - for (Position position : oldPositions) - { - if (!positions.contains(position)) - { - projectionViewer.getProjectionAnnotationModel().removeAnnotation(oldAnnotations.get(oldPositions.indexOf(position))); - positionsToRemove.add(position); - annotationToRemove.add(oldAnnotations.get(oldPositions.indexOf(position))); - } else - { - positions.remove(position); - } - } - oldPositions.removeAll(positionsToRemove); - oldAnnotations.removeAll(annotationToRemove); - - for (Position position : positions) - { - Annotation annotation = new ProjectionAnnotation(); - projectionViewer.getProjectionAnnotationModel().addAnnotation(annotation, position); - oldPositions.add(position); - oldAnnotations.add(annotation); - } - } - - private static enum SearchingFor - { - START_OF_TAG, START_OF_WORD, END_OF_WORD, END_OF_LINE - } - - private List getNewPositionsOfAnnotations() - { - List positions = new ArrayList<>(); - Map startOfAnnotation = new HashMap<>(); - SearchingFor searchingFor = SearchingFor.START_OF_TAG; - - int characters = document.getLength(); - int currentCharIndex = 0; - - int wordStartIndex = 0; - int sectionStartIndex = 0; - String word = ""; - - try - { - while (currentCharIndex < characters) - { - char currentChar = document.getChar(currentCharIndex); - switch (searchingFor) - { - case START_OF_TAG: - if (currentChar == '<') - { - char nextChar = document.getChar(currentCharIndex + 1); - if (nextChar != '?') - { - sectionStartIndex = currentCharIndex; - searchingFor = SearchingFor.START_OF_WORD; - } - } - break; - case START_OF_WORD: - if (Character.isLetter(currentChar)) - { - wordStartIndex = currentCharIndex; - searchingFor = SearchingFor.END_OF_WORD; - } - break; - case END_OF_WORD: - if (!Character.isLetter(currentChar)) - { - word = document.get(wordStartIndex, currentCharIndex - wordStartIndex); - if (startOfAnnotation.containsKey(word)) - { - searchingFor = SearchingFor.END_OF_LINE; - } else - { - startOfAnnotation.put(word, sectionStartIndex); - searchingFor = SearchingFor.START_OF_TAG; - } - } - break; - case END_OF_LINE: - if (currentChar == '\n') - { - int start = startOfAnnotation.get(word); - if (document.getLineOfOffset(start) != document.getLineOfOffset(currentCharIndex)) - { - positions.add(new Position(start, currentCharIndex + 1 - start)); - } - startOfAnnotation.remove(word); - searchingFor = SearchingFor.START_OF_TAG; - } - break; - } - currentCharIndex++; - } - } - catch (BadLocationException e) - { - // skip the remainder of file due to error - } - return positions; - } - - @Override - public void setProgressMonitor(IProgressMonitor monitor) - { - // no progress monitor used - } - -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java deleted file mode 100644 index 8b0b5736..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import org.eclipse.core.filebuffers.IDocumentSetupParticipant; -import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; -import org.eclipse.core.filebuffers.LocationKind; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IPath; -import org.eclipse.jface.text.IDocument; - -public class ValidatorDocumentSetupParticipant implements IDocumentSetupParticipant, IDocumentSetupParticipantExtension -{ - - @Override - public void setup(IDocument document) - { - } - - @Override - public void setup(IDocument document, IPath location, LocationKind locationKind) - { - if (locationKind == LocationKind.IFILE) - { - IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(location); - document.addDocumentListener(new AsmDocumentValidator(file)); - } - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java deleted file mode 100644 index b55e0b3c..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.mograsim.plugin.asm.editor.rules; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.text.rules.ICharacterScanner; -import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.Token; - -public class AsmLabelRule implements IRule -{ - - /** The token to be returned when this rule is successful */ - protected IToken fToken; - - /** - * Creates a rule which will return the specified token when a numerical sequence is detected. - * - * @param token the token to be returned - */ - public AsmLabelRule(IToken token) - { - Assert.isNotNull(token); - fToken = token; - } - - @Override - public IToken evaluate(ICharacterScanner scanner) - { - int c = scanner.read(); - int i = 1; - if (Character.isJavaIdentifierStart(c)) - { - do - { - c = scanner.read(); - i++; - } while (Character.isJavaIdentifierPart(c)); - if (c == ':') - return fToken; - return abort(scanner, i); - } - scanner.unread(); - return Token.UNDEFINED; - } - - private static IToken abort(ICharacterScanner scanner, int i) - { - for (int j = 0; j < i; j++) - scanner.unread(); - return Token.UNDEFINED; - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java deleted file mode 100644 index 728030dc..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.mograsim.plugin.asm.editor.rules; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.text.rules.ICharacterScanner; -import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.Token; - -import net.mograsim.plugin.asm.AsmNumberUtil; - -public class AsmNumberRule implements IRule -{ - - /** The token to be returned when this rule is successful */ - protected IToken fToken; - - /** - * Creates a rule which will return the specified token when a numerical sequence is detected. - * - * @param token the token to be returned - */ - public AsmNumberRule(IToken token) - { - Assert.isNotNull(token); - fToken = token; - } - - @Override - public IToken evaluate(ICharacterScanner scanner) - { - int i = 1; - int c = scanner.read(); - if (!AsmNumberUtil.isStart(c)) - return abort(scanner, i); - StringBuilder sb = new StringBuilder(); - sb.appendCodePoint(c); - while (true) - { - c = scanner.read(); - i++; - if (AsmNumberUtil.isPart(c)) - sb.appendCodePoint(c); - else - break; - } - if (!AsmNumberUtil.isNumber(sb)) - return abort(scanner, i); - scanner.unread(); - return fToken; - } - - private static IToken abort(ICharacterScanner scanner, int i) - { - for (int j = 0; j < i; j++) - scanner.unread(); - return Token.UNDEFINED; - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java deleted file mode 100644 index df0f80b4..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.mograsim.plugin.asm.editor.rules; - -import java.util.Objects; -import java.util.Set; - -import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.IWordDetector; -import org.eclipse.jface.text.rules.WordRule; - -import net.mograsim.plugin.AsmOps; - -public class InstructionRule extends WordRule -{ - private final IToken instToken; - - public InstructionRule(IToken defaultToken, IToken instToken) - { - this(defaultToken, instToken, false); - } - - public InstructionRule(IToken defaultToken, IToken instToken, boolean ignoreCase) - { - super(new InstructionDetector(), Objects.requireNonNull(defaultToken), ignoreCase); - this.instToken = Objects.requireNonNull(instToken); - AsmOps.addListener(this::update); - } - - void update(Set words) - { - fWords.clear(); - words.forEach(s -> fWords.put(s, instToken)); - } - - static class InstructionDetector implements IWordDetector - { - @Override - public boolean isWordStart(char c) - { - return Character.isJavaIdentifierStart(c); - } - - @Override - public boolean isWordPart(char c) - { - return Character.isJavaIdentifierPart(c); - } - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java deleted file mode 100644 index 581b4a6f..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java +++ /dev/null @@ -1,82 +0,0 @@ -package net.mograsim.plugin.nature; - -import java.util.Iterator; -import org.eclipse.core.commands.*; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.ui.handlers.HandlerUtil; - -public class AddRemoveMograsimNatureHandler extends AbstractHandler -{ - - public Object execute(ExecutionEvent event) throws ExecutionException - { - ISelection selection = HandlerUtil.getCurrentSelection(event); - // - if (selection instanceof IStructuredSelection) - { - for (Iterator it = ((IStructuredSelection) selection).iterator(); it.hasNext();) - { - Object element = it.next(); - IProject project = null; - if (element instanceof IProject) - { - project = (IProject) element; - } else if (element instanceof IAdaptable) - { - project = ((IAdaptable) element).getAdapter(IProject.class); - } - if (project != null) - { - try - { - toggleNature(project); - } - catch (CoreException e) - { - // TODO log something - throw new ExecutionException("Failed to toggle nature", e); - } - } - } - } - - return null; - } - - /** - * Toggles sample nature on a project - * - * @param project to have sample nature added or removed - */ - private void toggleNature(IProject project) throws CoreException - { - IProjectDescription description = project.getDescription(); - String[] natures = description.getNatureIds(); - - for (int i = 0; i < natures.length; ++i) - { - if (MograsimNature.NATURE_ID.equals(natures[i])) - { - // Remove the nature - String[] newNatures = new String[natures.length - 1]; - System.arraycopy(natures, 0, newNatures, 0, i); - System.arraycopy(natures, i + 1, newNatures, i, natures.length - i - 1); - description.setNatureIds(newNatures); - project.setDescription(description, null); - return; - } - } - - // Add the nature - String[] newNatures = new String[natures.length + 1]; - System.arraycopy(natures, 0, newNatures, 0, natures.length); - newNatures[natures.length] = MograsimNature.NATURE_ID; - description.setNatureIds(newNatures); - project.setDescription(description, null); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java deleted file mode 100644 index 9fc0ea41..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java +++ /dev/null @@ -1,195 +0,0 @@ -package net.mograsim.plugin.nature; - -import java.util.Map; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceDelta; -import org.eclipse.core.resources.IResourceDeltaVisitor; -import org.eclipse.core.resources.IResourceVisitor; -import org.eclipse.core.resources.IncrementalProjectBuilder; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; -import org.xml.sax.helpers.DefaultHandler; - -public class MograsimBuilder extends IncrementalProjectBuilder -{ - - class SampleDeltaVisitor implements IResourceDeltaVisitor - { - @Override - public boolean visit(IResourceDelta delta) throws CoreException - { - IResource resource = delta.getResource(); - switch (delta.getKind()) - { - case IResourceDelta.ADDED: - // handle added resource - checkXML(resource); - break; - case IResourceDelta.REMOVED: - // handle removed resource - break; - case IResourceDelta.CHANGED: - // handle changed resource - checkXML(resource); - break; - } - // return true to continue visiting children. - return true; - } - } - - class SampleResourceVisitor implements IResourceVisitor - { - public boolean visit(IResource resource) - { - checkXML(resource); - // return true to continue visiting children. - return true; - } - } - - class XMLErrorHandler extends DefaultHandler - { - - private IFile file; - - public XMLErrorHandler(IFile file) - { - this.file = file; - } - - private void addMarker(SAXParseException e, int severity) - { - MograsimBuilder.this.addMarker(file, e.getMessage(), e.getLineNumber(), severity); - } - - public void error(SAXParseException exception) throws SAXException - { - addMarker(exception, IMarker.SEVERITY_ERROR); - } - - public void fatalError(SAXParseException exception) throws SAXException - { - addMarker(exception, IMarker.SEVERITY_ERROR); - } - - public void warning(SAXParseException exception) throws SAXException - { - addMarker(exception, IMarker.SEVERITY_WARNING); - } - } - - public static final String BUILDER_ID = "PluginTest.mograsimBuilder"; - - private static final String MARKER_TYPE = "PluginTest.xmlProblem"; - - private SAXParserFactory parserFactory; - - private void addMarker(IFile file, String message, int lineNumber, int severity) - { - try - { - IMarker marker = file.createMarker(MARKER_TYPE); - marker.setAttribute(IMarker.MESSAGE, message); - marker.setAttribute(IMarker.SEVERITY, severity); - if (lineNumber == -1) - { - lineNumber = 1; - } - marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); - } - catch (CoreException e) - { - } - } - - @Override - protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException - { - if (kind == FULL_BUILD) - { - fullBuild(monitor); - } else - { - IResourceDelta delta = getDelta(getProject()); - if (delta == null) - { - fullBuild(monitor); - } else - { - incrementalBuild(delta, monitor); - } - } - return null; - } - - protected void clean(IProgressMonitor monitor) throws CoreException - { - // delete markers set and files created - getProject().deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE); - } - - void checkXML(IResource resource) - { - if (resource instanceof IFile && resource.getName().endsWith(".xml")) - { - IFile file = (IFile) resource; - deleteMarkers(file); - XMLErrorHandler reporter = new XMLErrorHandler(file); - try - { - getParser().parse(file.getContents(), reporter); - } - catch (Exception e1) - { - } - } - } - - private void deleteMarkers(IFile file) - { - try - { - file.deleteMarkers(MARKER_TYPE, false, IResource.DEPTH_ZERO); - } - catch (CoreException ce) - { - } - } - - protected void fullBuild(final IProgressMonitor monitor) throws CoreException - { - try - { - getProject().accept(new SampleResourceVisitor()); - } - catch (CoreException e) - { - } - } - - private SAXParser getParser() throws ParserConfigurationException, SAXException - { - if (parserFactory == null) - { - parserFactory = SAXParserFactory.newInstance(); - } - return parserFactory.newSAXParser(); - } - - protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException - { - // the visitor does the work. - delta.accept(new SampleDeltaVisitor()); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java deleted file mode 100644 index 5422731e..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.mograsim.plugin.nature; - -import org.eclipse.core.resources.ICommand; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.resources.IProjectNature; -import org.eclipse.core.runtime.CoreException; - -public class MograsimNature implements IProjectNature -{ - - /** - * ID of this project nature - */ - public static final String NATURE_ID = "net.mograsim"; - - private IProject project; - - @Override - public void configure() throws CoreException - { - IProjectDescription desc = project.getDescription(); - ICommand[] commands = desc.getBuildSpec(); - - for (int i = 0; i < commands.length; ++i) - { - if (commands[i].getBuilderName().equals(MograsimBuilder.BUILDER_ID)) - { - return; - } - } - - ICommand[] newCommands = new ICommand[commands.length + 1]; - System.arraycopy(commands, 0, newCommands, 0, commands.length); - ICommand command = desc.newCommand(); - command.setBuilderName(MograsimBuilder.BUILDER_ID); - newCommands[newCommands.length - 1] = command; - desc.setBuildSpec(newCommands); - project.setDescription(desc, null); - } - - @Override - public void deconfigure() throws CoreException - { - IProjectDescription description = getProject().getDescription(); - ICommand[] commands = description.getBuildSpec(); - for (int i = 0; i < commands.length; ++i) - { - if (commands[i].getBuilderName().equals(MograsimBuilder.BUILDER_ID)) - { - ICommand[] newCommands = new ICommand[commands.length - 1]; - System.arraycopy(commands, 0, newCommands, 0, i); - System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1); - description.setBuildSpec(newCommands); - project.setDescription(description, null); - return; - } - } - } - - @Override - public IProject getProject() - { - return project; - } - - @Override - public void setProject(IProject project) - { - this.project = project; - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java deleted file mode 100644 index c94e440a..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.mograsim.plugin.tables; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.ColumnLabelProvider; - -import net.mograsim.plugin.asm.AsmNumberUtil; -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; - -public class AddressLabelProvider extends ColumnLabelProvider -{ - @Override - public String getText(Object element) - { - @SuppressWarnings("rawtypes") - TableRow row = (TableRow) element; - return AsmNumberUtil.toString(BigInteger.valueOf(row.address), NumberType.HEXADECIMAL); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java deleted file mode 100644 index dde6b015..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.mograsim.plugin.tables; - -import java.util.HashSet; -import java.util.Set; - -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; - -public class DisplaySettings -{ - private NumberType dataNumberType; - private final Set observers; - - public DisplaySettings() - { - this(NumberType.HEXADECIMAL); - } - - public DisplaySettings(NumberType dataNumberType) - { - this.dataNumberType = dataNumberType; - observers = new HashSet<>(); - } - - public NumberType getDataNumberType() - { - return dataNumberType; - } - - public void setDataNumberType(NumberType dataNumberType) - { - this.dataNumberType = dataNumberType; - notifyObservers(); - } - - void notifyObservers() - { - observers.forEach(r -> r.run()); - } - - public void addObserver(Runnable ob) - { - observers.add(ob); - } - - public void removeObserver(Runnable ob) - { - observers.remove(ob); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java deleted file mode 100644 index 1b371e28..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.mograsim.plugin.tables; - -import org.eclipse.jface.viewers.IContentProvider; -import org.eclipse.jface.viewers.ILazyContentProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Table; - -public class LazyTableViewer extends TableViewer -{ - public static Color highlightColor = Display.getDefault().getSystemColor(SWT.COLOR_YELLOW); - - public LazyTableViewer(Composite parent, int style) - { - super(parent, style | SWT.VIRTUAL); - } - - public LazyTableViewer(Composite parent) - { - super(parent); - } - - public LazyTableViewer(Table table) - { - super(table); - } - - public void highlightRow(int index, boolean highlight) - { - Table table = getTable(); - if (index < 0 || index >= table.getItemCount()) - return; - table.getItem(index).setBackground(highlight ? highlightColor : table.getBackground()); - System.out.println("Infinite loop!!!"); - ((ILazyContentProvider) getContentProvider()).updateElement(index); - } - - @Override - public void setContentProvider(IContentProvider provider) - { - if (!(provider instanceof ILazyContentProvider)) - throw new IllegalArgumentException("Content provider must be an ILazyContentProvider"); - super.setContentProvider(provider); - } - - @Override - public void refresh() - { - Table t = getTable(); - ILazyContentProvider provider = (ILazyContentProvider) getContentProvider(); - doClearAll(); - int startIndex = t.getTopIndex(); - int numRows = t.getBounds().height / t.getItemHeight(); - int endIndex = Integer.min(startIndex + numRows + 5, doGetItemCount()); - - for (int i = startIndex; i < endIndex; i++) - { - provider.updateElement(i); - } - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java deleted file mode 100644 index a1d81072..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.mograsim.plugin.tables; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.CellEditor; -import org.eclipse.jface.viewers.EditingSupport; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.TextCellEditor; - -import net.mograsim.plugin.asm.AsmNumberUtil; - -public abstract class NumberCellEditingSupport extends EditingSupport -{ - private final TableViewer viewer; - private final CellEditor editor; - private final DisplaySettings displaySettings; - - public NumberCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings) - { - super(viewer); - this.viewer = viewer; - this.displaySettings = displaySettings; - editor = new TextCellEditor(viewer.getTable()); - editor.setValidator(new NumberCellEditorValidator()); - } - - @Override - final protected boolean canEdit(Object element) - { - return true; - } - - @Override - final protected CellEditor getCellEditor(Object element) - { - return editor; - } - - @Override - final protected Object getValue(Object element) - { - return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType()); - } - - @Override - final protected void setValue(Object element, Object userInput) - { - try - { - setAsBigInteger(element, AsmNumberUtil.valueOf((String) userInput)); - } - catch (@SuppressWarnings("unused") NumberFormatException e) - { - setAsBigInteger(element, BigInteger.valueOf(0)); - } - viewer.update(element, null); - } - - protected abstract void setAsBigInteger(Object element, BigInteger value); - - protected abstract BigInteger getAsBigInteger(Object element); -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java deleted file mode 100644 index e0b445dd..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.plugin.tables; - -import org.eclipse.jface.viewers.ICellEditorValidator; - -import net.mograsim.plugin.asm.AsmNumberUtil; - -public class NumberCellEditorValidator implements ICellEditorValidator -{ - - @Override - public String isValid(Object value) - { - return AsmNumberUtil.NumberType.NONE.equals(AsmNumberUtil.getType((String) value)) ? (String) value + "is not a valid number" - : null; - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java deleted file mode 100644 index 6ee2c2b4..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.plugin.tables; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.ColumnLabelProvider; - -import net.mograsim.plugin.asm.AsmNumberUtil; - -public abstract class NumberColumnLabelProvider extends ColumnLabelProvider -{ - private DisplaySettings displaySettings; - - public NumberColumnLabelProvider(DisplaySettings displaySettings) - { - this.displaySettings = displaySettings; - } - - @Override - public String getText(Object element) - { - return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType()); - } - - public abstract BigInteger getAsBigInteger(Object element); -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java deleted file mode 100644 index b72df0e9..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.mograsim.plugin.tables; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; - -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; - -public class RadixSelector -{ - private final Composite parent; - private final DisplaySettings target; - private Label label; - private Combo combo; - - public RadixSelector(Composite parent, DisplaySettings target) - { - this.parent = parent; - this.target = target; - setupRadixSelector(); - } - - private void setupRadixSelector() - { - label = new Label(parent, SWT.NONE); - label.setText("Radix: "); - combo = new Combo(parent, SWT.READ_ONLY); - - String entries[] = new String[] { "Binary", "Octal", "Decimal", "Hexadecimal" }; - NumberType corTypes[] = new NumberType[] { NumberType.BINARY, NumberType.OCTAL, NumberType.DECIMAL, NumberType.HEXADECIMAL }; - combo.setItems(entries); - combo.select(3); - combo.addSelectionListener(new SelectionListener() - { - @Override - public void widgetSelected(SelectionEvent e) - { - int index = combo.getSelectionIndex(); - if (index == -1) - target.setDataNumberType(NumberType.HEXADECIMAL); - else - { - target.setDataNumberType(corTypes[index]); - } - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) - { - widgetSelected(e); - } - }); - } - - public Label getLabel() - { - return label; - } - - public Combo getCombo() - { - return combo; - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java deleted file mode 100644 index 46b7c5c3..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.mograsim.plugin.tables; - -public class TableRow -{ - public final T data; - public final long address; - - public TableRow(long address, T data) - { - this.data = data; - this.address = address; - } - - public T getData() - { - return data; - } - - public long getAddress() - { - return address; - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java deleted file mode 100644 index 46eefcd9..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.TableViewer; - -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.NumberCellEditingSupport; - -public class MemoryCellEditingSupport extends NumberCellEditingSupport -{ - public MemoryCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings) - { - super(viewer, displaySettings); - } - - @Override - protected void setAsBigInteger(Object element, BigInteger value) - { - MemoryTableRow row = (MemoryTableRow) element; - row.getMemory().setCellAsBigInteger(row.address, value); - } - - @Override - protected BigInteger getAsBigInteger(Object element) - { - MemoryTableRow row = (MemoryTableRow) element; - return row.getMemory().getCellAsBigInteger(row.address); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java deleted file mode 100644 index aaecc754..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java +++ /dev/null @@ -1,79 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import org.eclipse.jface.viewers.ILazyContentProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.widgets.Display; - -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.MemoryObserver; - -public class MemoryTableContentProvider implements ILazyContentProvider, MemoryObserver -{ - private long lower; - private TableViewer viewer; - private final static int limit = 10_000; - private int amount = 0; - private MainMemory memory; - - public void setLowerBound(long lower) - { - if (memory != null) - this.lower = Long.min(memory.getDefinition().getMaximalAddress(), Long.max(memory.getDefinition().getMinimalAddress(), lower)); - else - this.lower = lower; - updateItemCount(); - } - - public void updateItemCount() - { - if (memory != null) - { - long size = memory.getDefinition().getMaximalAddress() - lower; - viewer.setItemCount(size > amount ? amount : (int) size); - } else - viewer.setItemCount(0); - } - - public long getLowerBound() - { - return lower; - } - - public void setAmount(int amount) - { - this.amount = Integer.min(amount, limit); - updateItemCount(); - } - - public int getAmount() - { - return amount; - } - - @Override - public void updateElement(int index) - { - long address = lower + index; - if (address <= memory.getDefinition().getMaximalAddress()) - viewer.replace(new MemoryTableRow(address, memory), index); - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) - { - this.viewer = (TableViewer) viewer; - this.memory = (MainMemory) newInput; - if (oldInput != null) - ((MainMemory) oldInput).deregisterObserver(this); - if (memory != null) - memory.registerObserver(this); - setLowerBound(0L); - } - - @Override - public void update(long address) - { - Display.getDefault().asyncExec(() -> updateElement((int) (address - lower))); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java deleted file mode 100644 index 81ee6e65..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import net.mograsim.machine.MainMemory; -import net.mograsim.plugin.tables.TableRow; - -public class MemoryTableRow extends TableRow -{ - public MemoryTableRow(long address, MainMemory memory) - { - super(address, memory); - } - - public MainMemory getMemory() - { - return getData(); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java deleted file mode 100644 index 09368807..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java +++ /dev/null @@ -1,175 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import java.math.BigInteger; -import java.util.Optional; - -import org.eclipse.jface.viewers.TableViewerColumn; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.VerifyListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.part.ViewPart; - -import net.mograsim.machine.Machine; -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.MainMemoryDefinition; -import net.mograsim.machine.standard.memory.WordAddressableMemory; -import net.mograsim.plugin.MachineContext; -import net.mograsim.plugin.MachineContext.ContextObserver; -import net.mograsim.plugin.asm.AsmNumberUtil; -import net.mograsim.plugin.tables.AddressLabelProvider; -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.LazyTableViewer; -import net.mograsim.plugin.tables.NumberColumnLabelProvider; -import net.mograsim.plugin.tables.RadixSelector; - -public class MemoryView extends ViewPart implements ContextObserver -{ - private LazyTableViewer viewer; - private MemoryTableContentProvider provider; - private DisplaySettings displaySettings; - - @Override - public void createPartControl(Composite parent) - { - provider = new MemoryTableContentProvider(); - displaySettings = new DisplaySettings(); - - GridLayout layout = new GridLayout(6, false); - parent.setLayout(layout); - - createHeader(parent); - createViewer(parent); - - displaySettings.addObserver(() -> viewer.refresh()); - - setupContextBinding(); - } - - @SuppressWarnings("unused") - private void createHeader(Composite parent) - { - Label fromLabel = new Label(parent, SWT.NONE); - fromLabel.setText("Address: "); - Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH); - fromText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); - VerifyListener vl = new NumberVerifyListener(); - fromText.addVerifyListener(vl); - fromText.setText("0"); - fromText.addModifyListener(e -> - { - try - { - provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue()); - viewer.refresh(); - } - catch (NumberFormatException ex) - { - // Nothing to do here - } - }); - - Label amountLabel = new Label(parent, SWT.NONE); - amountLabel.setText("Number of cells: "); - Text amountText = new Text(parent, SWT.BORDER | SWT.SEARCH); - amountText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); - amountText.addVerifyListener(vl); - amountText.setText("0"); - amountText.addModifyListener(e -> - { - try - { - provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue()); - viewer.refresh(); - } - catch (NumberFormatException ex) - { - // Nothing to do here - } - }); - new RadixSelector(parent, displaySettings); - } - - private void createViewer(Composite parent) - { - viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); - createColumns(); - Table table = viewer.getTable(); - table.setHeaderVisible(true); - table.setLinesVisible(true); - viewer.setUseHashlookup(true); - viewer.setContentProvider(provider); - bindMainMemory(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE))); - getSite().setSelectionProvider(viewer); - - GridData gd = new GridData(); - gd.verticalAlignment = GridData.FILL; - gd.horizontalSpan = 6; - gd.grabExcessHorizontalSpace = true; - gd.grabExcessVerticalSpace = true; - gd.horizontalAlignment = GridData.FILL; - viewer.getControl().setLayoutData(gd); - } - - private void createColumns() - { - String[] titles = { "Address", "Data" }; - int[] bounds = { 100, 100 }; - - TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]); - col.setLabelProvider(new AddressLabelProvider()); - - col = createTableViewerColumn(titles[1], bounds[1]); - col.setLabelProvider(new NumberColumnLabelProvider(displaySettings) - { - @Override - public BigInteger getAsBigInteger(Object element) - { - MemoryTableRow row = (MemoryTableRow) element; - return row.getMemory().getCellAsBigInteger(row.address); - } - - }); - col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings)); - } - - private TableViewerColumn createTableViewerColumn(String title, int bound) - { - TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); - TableColumn column = viewerColumn.getColumn(); - column.setText(title); - column.setWidth(bound); - column.setResizable(true); - column.setMoveable(false); - return viewerColumn; - } - - @Override - public void setFocus() - { - viewer.getControl().setFocus(); - } - - private void bindMainMemory(MainMemory m) - { - viewer.setInput(m); - } - - private void setupContextBinding() - { - MachineContext.getInstance().registerObserver(this); - setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); - } - - @Override - public void setMachine(Optional machine) - { - if (machine.isPresent()) - bindMainMemory(machine.get().getMainMemory()); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java deleted file mode 100644 index 54d71762..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import org.eclipse.swt.events.VerifyEvent; -import org.eclipse.swt.events.VerifyListener; -import org.eclipse.swt.widgets.Text; - -import net.mograsim.plugin.asm.AsmNumberUtil; -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; - -public class NumberVerifyListener implements VerifyListener -{ - - @Override - public void verifyText(VerifyEvent e) - { - String text = computeModifiedText(e); - e.doit = !NumberType.NONE.equals(AsmNumberUtil.prefixOfType(text)); - } - - private static String computeModifiedText(VerifyEvent e) - { - String modifiedText = ((Text) e.getSource()).getText(); - modifiedText = modifiedText.substring(0, e.start).concat(e.text).concat(modifiedText.substring(e.end)); - return modifiedText; - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java deleted file mode 100644 index c3318b58..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.CellEditor; -import org.eclipse.jface.viewers.CheckboxCellEditor; -import org.eclipse.jface.viewers.EditingSupport; -import org.eclipse.jface.viewers.TableViewer; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.parameters.BooleanClassification; - -public class BooleanEditingSupport extends EditingSupport -{ - private final CheckboxCellEditor editor; - private final BooleanClassification boolClass; - private final TableViewer viewer; - private final int index; - - public BooleanEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index) - { - super(viewer); - this.viewer = viewer; - this.boolClass = (BooleanClassification) definition.getParameterClassification(index); - editor = new CheckboxCellEditor(viewer.getTable()); - this.index = index; - } - - @Override - protected boolean canEdit(Object element) - { - return true; - } - - @Override - protected CellEditor getCellEditor(Object element) - { - return editor; - } - - @Override - protected Object getValue(Object element) - { - return ((InstructionTableRow) element).data.getParameter(index).getValue().getMSBit(0).equals(Bit.ONE); - } - - @Override - protected void setValue(Object element, Object value) - { - ((InstructionTableRow) element).data.setParameter(index, boolClass.get((Boolean) value)); - viewer.update(element, null); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java deleted file mode 100644 index b8021b74..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.ILazyContentProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; - -import net.mograsim.machine.mi.MicroInstructionMemory; - -public class InstructionTableContentProvider implements ILazyContentProvider -{ - private TableViewer viewer; - private MicroInstructionMemory memory; - private long minAddr = 0; - - @Override - public void updateElement(int index) - { - long address = memory.getDefinition().getMinimalAddress() + index; - viewer.replace(new InstructionTableRow(address, memory.getCell(address)), index); - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) - { - this.viewer = (TableViewer) viewer; - this.memory = (MicroInstructionMemory) newInput; - if (this.memory != null) - { - this.viewer.setItemCount((int) memory.size()); - this.minAddr = memory.getDefinition().getMinimalAddress(); - } - } - - public void update(long address) - { - updateElement((int) (address - minAddr)); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java deleted file mode 100644 index 677d1668..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import net.mograsim.machine.mi.MicroInstruction; -import net.mograsim.plugin.tables.TableRow; - -public class InstructionTableRow extends TableRow -{ - public InstructionTableRow(long address, MicroInstruction data) - { - super(address, data); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java deleted file mode 100644 index 3af070f3..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java +++ /dev/null @@ -1,249 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import java.io.File; -import java.io.IOException; -import java.util.Optional; - -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.EditingSupport; -import org.eclipse.jface.viewers.TableViewerColumn; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.ui.part.ViewPart; - -import net.mograsim.machine.Machine; -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.MicroInstructionMemory; -import net.mograsim.machine.mi.MicroInstructionMemoryParseException; -import net.mograsim.machine.mi.MicroInstructionMemoryParser; -import net.mograsim.machine.mi.parameters.ParameterClassification; -import net.mograsim.plugin.MachineContext; -import net.mograsim.plugin.MachineContext.ContextObserver; -import net.mograsim.plugin.tables.AddressLabelProvider; -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.LazyTableViewer; -import net.mograsim.plugin.tables.RadixSelector; -import net.mograsim.plugin.util.DropDownMenu; -import net.mograsim.plugin.util.DropDownMenu.DropDownEntry; - -public class InstructionView extends ViewPart implements ContextObserver -{ - private String saveLoc = null; - private LazyTableViewer viewer; - private TableViewerColumn[] columns = new TableViewerColumn[0]; - private MicroInstructionDefinition miDef; - private MicroInstructionMemory memory; - private DisplaySettings displaySettings; - private InstructionTableContentProvider provider; - private int highlighted = 0; - - @SuppressWarnings("unused") - @Override - public void createPartControl(Composite parent) - { - provider = new InstructionTableContentProvider(); - GridLayout layout = new GridLayout(3, false); - setupMenuButtons(parent); - - displaySettings = new DisplaySettings(); - new RadixSelector(parent, displaySettings); - - parent.setLayout(layout); - viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); - - Table table = viewer.getTable(); - table.setHeaderVisible(true); - table.setLinesVisible(true); - viewer.setUseHashlookup(true); - viewer.setContentProvider(provider); - getSite().setSelectionProvider(viewer); - - GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); - viewerData.horizontalSpan = 3; - viewer.getTable().setLayoutData(viewerData); - - displaySettings.addObserver(() -> viewer.refresh()); - MachineContext.getInstance().registerObserver(this); - setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); - } - - public void highlight(int index) - { - viewer.highlightRow(highlighted, false); - viewer.highlightRow(index, true); - viewer.getTable().setTopIndex(index); - } - - @SuppressWarnings("unused") - private void setupMenuButtons(Composite parent) - { - DropDownEntry open = new DropDownEntry("Open", (e) -> - { - FileDialog d = new FileDialog(parent.getShell(), SWT.NONE); - d.open(); - String filename = d.getFileName(); - if (!filename.equals("")) - open(d.getFilterPath() + File.separator + filename); - }); - - DropDownEntry save = new DropDownEntry("Save", (e) -> - { - if (saveLoc == null) - openSaveAsDialog(parent); - save(saveLoc); - }); - DropDownEntry saveAs = new DropDownEntry("SaveAs", (e) -> - { - openSaveAsDialog(parent); - save(saveLoc); - }); - new DropDownMenu(parent, "File", open, save, saveAs); - } - - private void openSaveAsDialog(Composite parent) - { - FileDialog d = new FileDialog(parent.getShell(), SWT.SAVE); - d.open(); - String filename = d.getFileName(); - if (!filename.equals("")) - saveLoc = d.getFilterPath() + File.separator + filename; - } - - public void bindMicroInstructionMemory(MicroInstructionMemory memory) - { - deleteColumns(); - this.memory = memory; - viewer.setInput(memory); - this.miDef = memory.getDefinition().getMicroInstructionDefinition(); - createColumns(); - } - - private void deleteColumns() - { - for (TableViewerColumn col : columns) - col.getColumn().dispose(); - } - - private void createColumns() - { - int size = miDef.size(); - columns = new TableViewerColumn[size + 1]; - - TableViewerColumn col = createTableViewerColumn("Address", 200); - columns[0] = col; - col.setLabelProvider(new AddressLabelProvider()); - - int bit = 0; - ParameterClassification[] classes = miDef.getParameterClassifications(); - - for (int i = 0; i < size; i++) - { - int startBit = bit; - int endBit = (bit = bit + classes[i].getExpectedBits()) - 1; - String name = startBit == endBit ? Integer.toString(startBit) : startBit + "..." + endBit; - int bounds = 20 + 20 * classes[i].getExpectedBits(); - - col = createTableViewerColumn(name, bounds); - columns[i + 1] = col; - createEditingAndLabel(col, miDef, i); - } - } - - private void createEditingAndLabel(TableViewerColumn col, MicroInstructionDefinition miDef, int index) - { - ParameterClassification parameterClassification = miDef.getParameterClassifications()[index]; - EditingSupport support; - ColumnLabelProvider provider; - switch (parameterClassification.getExpectedType()) - { - case BOOLEAN_IMMEDIATE: - support = new BooleanEditingSupport(viewer, miDef, index); - provider = new ParameterLabelProvider(index); - break; - case INTEGER_IMMEDIATE: - support = new IntegerEditingSupport(viewer, miDef, index, displaySettings, this.provider); - provider = new IntegerColumnLabelProvider(displaySettings, index); - break; - case MNEMONIC: - support = new MnemonicEditingSupport(viewer, miDef, index, this.provider); - provider = new ParameterLabelProvider(index); - break; - default: - throw new IllegalStateException( - "Unable to create EditingSupport for unknown ParameterType " + parameterClassification.getExpectedType()); - } - col.setEditingSupport(support); - col.setLabelProvider(provider); - col.getColumn().setToolTipText(miDef.getParameterDescription(index).orElse("")); - } - - private TableViewerColumn createTableViewerColumn(String title, int bound) - { - TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); - TableColumn column = viewerColumn.getColumn(); - column.setText(title); - column.setWidth(bound); - column.setResizable(true); - column.setMoveable(false); - return viewerColumn; - } - - private void open(String file) - { - if (miDef == null) - { - System.err.println("Failed to parse MicroprogrammingMemory from File. No MicroInstructionDefinition assigned."); - return; - } - try - { - MicroInstructionMemoryParser.parseMemory(memory, file); - viewer.refresh(); - saveLoc = file; - } - catch (IOException | MicroInstructionMemoryParseException e) - { - e.printStackTrace(); - } - } - - private void save(String file) - { - if (memory == null) - { - System.err.println("Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned."); - } - if (saveLoc != null) - { - try - { - MicroInstructionMemoryParser.write(memory, file); - } - catch (IOException e) - { - e.printStackTrace(); - } - } - } - - @Override - public void setFocus() - { - viewer.getControl().setFocus(); - } - - @Override - public void setMachine(Optional machine) - { - if (machine.isPresent()) - { - Machine actualMachine = machine.get(); - bindMicroInstructionMemory(actualMachine.getMicroInstructionMemory()); - } - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java deleted file mode 100644 index ce61581f..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import java.math.BigInteger; - -import net.mograsim.machine.mi.parameters.IntegerImmediate; -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.NumberColumnLabelProvider; - -public class IntegerColumnLabelProvider extends NumberColumnLabelProvider -{ - private int index; - - public IntegerColumnLabelProvider(DisplaySettings displaySettings, int index) - { - super(displaySettings); - this.index = index; - } - - @Override - public BigInteger getAsBigInteger(Object element) - { - return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java deleted file mode 100644 index d3b48ce4..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.TableViewer; - -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.parameters.IntegerClassification; -import net.mograsim.machine.mi.parameters.IntegerImmediate; -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.NumberCellEditingSupport; - -public class IntegerEditingSupport extends NumberCellEditingSupport -{ - private IntegerClassification classification; - private int index; - private InstructionTableContentProvider provider; - - public IntegerEditingSupport(TableViewer viewer, MicroInstructionDefinition miDef, int index, DisplaySettings displaySettings, - InstructionTableContentProvider provider) - { - super(viewer, displaySettings); - classification = (IntegerClassification) miDef.getParameterClassifications()[index]; - this.index = index; - this.provider = provider; - } - - @Override - protected void setAsBigInteger(Object element, BigInteger value) - { - InstructionTableRow row = ((InstructionTableRow) element); - row.data.setParameter(index, new IntegerImmediate(value, classification.getExpectedBits())); - provider.update(row.address); -// viewer.update(element, null); Does not do anything for some reason - } - - @Override - protected BigInteger getAsBigInteger(Object element) - { - return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java deleted file mode 100644 index 98181c46..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.ICellEditorValidator; - -import net.mograsim.machine.mi.parameters.MnemonicFamily; - -public class MnemonicCellEditorValidator implements ICellEditorValidator -{ - private MnemonicFamily family; - - public MnemonicCellEditorValidator(MnemonicFamily family) - { - this.family = family; - } - - @Override - public String isValid(Object value) - { - int index = (Integer) value; - return index >= 0 && index < family.size() ? null - : String.format("MnemonicFamily has %s elements, index %s is out of bounds", family.size(), value.toString()); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java deleted file mode 100644 index 765e4343..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.CellEditor; -import org.eclipse.jface.viewers.ComboBoxCellEditor; -import org.eclipse.jface.viewers.EditingSupport; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; - -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.parameters.Mnemonic; -import net.mograsim.machine.mi.parameters.MnemonicFamily; - -public class MnemonicEditingSupport extends EditingSupport -{ - private final ComboBoxCellEditor editor; - private final MnemonicFamily family; - private final int index; - private InstructionTableContentProvider provider; - - public MnemonicEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index, - InstructionTableContentProvider provider) - { - super(viewer); - family = (MnemonicFamily) definition.getParameterClassifications()[index]; - editor = new ComboBoxCellEditor(viewer.getTable(), family.getStringValues(), SWT.READ_ONLY); - this.index = index; - editor.setValidator(new MnemonicCellEditorValidator(family)); - this.provider = provider; - } - - @Override - protected boolean canEdit(Object element) - { - return true; - } - - @Override - protected CellEditor getCellEditor(Object element) - { - return editor; - } - - @Override - protected Object getValue(Object element) - { - return ((Mnemonic) ((InstructionTableRow) element).data.getParameter(index)).ordinal(); - } - - @Override - protected void setValue(Object element, Object value) - { - InstructionTableRow row = ((InstructionTableRow) element); - row.data.setParameter(index, family.get((Integer) value)); - provider.update(row.address); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java deleted file mode 100644 index 5e06370a..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.ColumnLabelProvider; - -public class ParameterLabelProvider extends ColumnLabelProvider -{ - private final int index; - - public ParameterLabelProvider(int index) - { - super(); - this.index = index; - } - - @Override - public String getText(Object element) - { - return ((InstructionTableRow) element).data.getParameter(index).toString(); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java deleted file mode 100644 index ffa18575..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java +++ /dev/null @@ -1,86 +0,0 @@ -package net.mograsim.plugin.util; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; - -public class DropDownMenu -{ - private Button button; - - public DropDownMenu(Composite parent, String label, DropDownEntry... entries) - { - button = new Button(parent, SWT.PUSH); - button.setText(label); - setupDrowpDownMenu(entries); - } - - private void setupDrowpDownMenu(DropDownEntry[] entries) - { - Menu menu = new Menu(button); - for (DropDownEntry entry : entries) - { - MenuItem item = new MenuItem(menu, SWT.PUSH); - item.addSelectionListener(new SelectionListener() - { - @Override - public void widgetSelected(SelectionEvent e) - { - entry.listener.widgetSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) - { - widgetSelected(e); - } - }); - item.setText(entry.title); - } - - button.addListener(SWT.Selection, new Listener() - { - @Override - public void handleEvent(Event event) - { - Rectangle rect = button.getBounds(); - Point pt = new Point(rect.x, rect.y + rect.height); - pt = button.getParent().toDisplay(pt); - menu.setLocation(pt.x, pt.y); - menu.setVisible(true); - } - }); - } - - public Button getButton() - { - return button; - } - - public static class DropDownEntry - { - public final String title; - public final EntrySelectedListener listener; - - public DropDownEntry(String title, EntrySelectedListener listener) - { - super(); - this.title = title; - this.listener = listener; - } - } - - @FunctionalInterface - public static interface EntrySelectedListener - { - public void widgetSelected(SelectionEvent e); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java deleted file mode 100644 index 212f777c..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.mograsim.plugin.views; - -import javax.inject.Inject; - -import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.part.ViewPart; - -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; -import net.mograsim.logic.model.LogicExecuter; -import net.mograsim.logic.model.LogicUICanvas; -import net.mograsim.machine.Machine; -import net.mograsim.plugin.MachineContext; -import net.mograsim.plugin.ThemePreferences; -import net.mograsim.preferences.Preferences; - -public class LogicUIPart extends ViewPart -{ - @Inject - private MPart part; - - private LogicExecuter exec; - private LogicUICanvas ui; - - @Override - public void dispose() - { - if (exec != null) - exec.stopLiveExecution(); - } - - @Override - public void createPartControl(Composite parent) - { - // set preferences - Preferences.setPreferences(new ThemePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme())); - - Machine m = MachineContext.getInstance().getMachine(); - - // initialize UI - ui = new LogicUICanvas(parent, SWT.NONE, m.getModel()); - ui.addTransformListener((x, y, z) -> part.setDirty(z < 1)); - ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui); - userInput.buttonDrag = 3; - userInput.buttonZoom = 2; - userInput.enableUserInput(); - - // initialize executer - exec = new LogicExecuter(m.getTimeline()); - - // run it - exec.startLiveExecution(); - } - - @Override - public void setFocus() - { - ui.setFocus(); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.docs/.classpath b/net.mograsim.plugin.docs/.classpath deleted file mode 100644 index bc3587db..00000000 --- a/net.mograsim.plugin.docs/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/net.mograsim.plugin.docs/.gitignore b/net.mograsim.plugin.docs/.gitignore deleted file mode 100644 index 04b0082b..00000000 --- a/net.mograsim.plugin.docs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -/html/* -!/html/.gitkeep \ No newline at end of file diff --git a/net.mograsim.plugin.docs/.project b/net.mograsim.plugin.docs/.project deleted file mode 100644 index bb1ec996..00000000 --- a/net.mograsim.plugin.docs/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.plugin.docs - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index cd95f141..00000000 --- a/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,7 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 diff --git a/net.mograsim.plugin.docs/META-INF/MANIFEST.MF b/net.mograsim.plugin.docs/META-INF/MANIFEST.MF deleted file mode 100644 index b895844a..00000000 --- a/net.mograsim.plugin.docs/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Mograsim docs -Bundle-SymbolicName: net.mograsim.plugin.docs;singleton:=true -Bundle-Version: 0.1.0.qualifier -Bundle-Vendor: Mograsim Team -Automatic-Module-Name: net.mograsim.plugin.docs -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: net.mograsim.plugin.core;bundle-version="0.1.0", - org.eclipse.help diff --git a/net.mograsim.plugin.docs/build.properties b/net.mograsim.plugin.docs/build.properties deleted file mode 100644 index 0b7cb312..00000000 --- a/net.mograsim.plugin.docs/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -bin.includes = plugin.xml,\ - META-INF/,\ - .,\ - html/,\ - *.xml diff --git a/net.mograsim.plugin.docs/html/.gitkeep b/net.mograsim.plugin.docs/html/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/net.mograsim.plugin.docs/plugin.xml b/net.mograsim.plugin.docs/plugin.xml deleted file mode 100644 index 29023f1d..00000000 --- a/net.mograsim.plugin.docs/plugin.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/toc.xml b/net.mograsim.plugin.docs/toc.xml deleted file mode 100644 index 4a82ec9d..00000000 --- a/net.mograsim.plugin.docs/toc.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/tocconcepts.xml b/net.mograsim.plugin.docs/tocconcepts.xml deleted file mode 100644 index d01f925e..00000000 --- a/net.mograsim.plugin.docs/tocconcepts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/tocgettingstarted.xml b/net.mograsim.plugin.docs/tocgettingstarted.xml deleted file mode 100644 index 38f27e0b..00000000 --- a/net.mograsim.plugin.docs/tocgettingstarted.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/tocreference.xml b/net.mograsim.plugin.docs/tocreference.xml deleted file mode 100644 index 660cdecc..00000000 --- a/net.mograsim.plugin.docs/tocreference.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/tocsamples.xml b/net.mograsim.plugin.docs/tocsamples.xml deleted file mode 100644 index ddfa61e7..00000000 --- a/net.mograsim.plugin.docs/tocsamples.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/toctasks.xml b/net.mograsim.plugin.docs/toctasks.xml deleted file mode 100644 index c96b94bb..00000000 --- a/net.mograsim.plugin.docs/toctasks.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.feature/.project b/net.mograsim.plugin.feature/.project deleted file mode 100644 index dae1e84d..00000000 --- a/net.mograsim.plugin.feature/.project +++ /dev/null @@ -1,21 +0,0 @@ - - - net.mograsim.plugin.feature - - - net.mograsim.logic.model.am2900 - net.mograsim.plugin.branding - net.mograsim.plugin.core - net.mograsim.plugin.docs - - - - org.eclipse.pde.FeatureBuilder - - - - - - org.eclipse.pde.FeatureNature - - diff --git a/net.mograsim.plugin.feature/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.feature/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.feature/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.feature/build.properties b/net.mograsim.plugin.feature/build.properties deleted file mode 100644 index 64f93a9f..00000000 --- a/net.mograsim.plugin.feature/build.properties +++ /dev/null @@ -1 +0,0 @@ -bin.includes = feature.xml diff --git a/net.mograsim.plugin.feature/category.xml b/net.mograsim.plugin.feature/category.xml deleted file mode 100644 index b8eeab92..00000000 --- a/net.mograsim.plugin.feature/category.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - Mograsim - Modular Graphical Simulator - - - diff --git a/net.mograsim.plugin.feature/feature.xml b/net.mograsim.plugin.feature/feature.xml deleted file mode 100644 index 7e121014..00000000 --- a/net.mograsim.plugin.feature/feature.xml +++ /dev/null @@ -1,770 +0,0 @@ - - - - - Mograsim - Modular Graphical Simulator - -For teaching microprogramming, ISAs and circuit logic at the Technical University of Munich (TUM). -By Christian Femers, Daniel Kirschten and Fabian Stemmler - - - - Copyright (c) 2019 Christian Femers, Daniel Kirschten and Fabian Stemmler - -This program and the accompanying materials are made -available under the terms of the Eclipse Public License 2.0 -which is available at https://www.eclipse.org/legal/epl-2.0/ - -This Source Code may also be made available under the following Secondary -Licenses when the conditions for such availability set forth in the Eclipse -Public License, v. 2.0 are satisfied: GNU General Public License, version 2 -with the GNU Classpath Exception which is -available at https://www.gnu.org/software/classpath/license.html. - -SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - - - - This program and the accompanying materials are made available under the -terms of the Eclipse Public License 2.0 which is available at -http://www.eclipse.org/legal/epl-2.0, or GNU General Public License, -version 2 with the GNU Classpath Exception which is available at -https://www.gnu.org/software/classpath/license.html. - -Eclipse Public License - v 2.0 - - THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE - PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION - OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - - a) in the case of the initial Contributor, the initial content - Distributed under this Agreement, and - - b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - where such changes and/or additions to the Program originate from - and are Distributed by that particular Contributor. A Contribution - "originates" from a Contributor if it was added to the Program by - such Contributor itself or anyone acting on such Contributor's behalf. - Contributions do not include changes or additions to the Program that - are not Modified Works. - -"Contributor" means any person or entity that Distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which -are necessarily infringed by the use or sale of its Contribution alone -or when combined with the Program. - -"Program" means the Contributions Distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement -or any Secondary License (as applicable), including Contributors. - -"Derivative Works" shall mean any work, whether in Source Code or other -form, that is based on (or derived from) the Program and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. - -"Modified Works" shall mean any work in Source Code or other form that -results from an addition to, deletion from, or modification of the -contents of the Program, including, for purposes of clarity any new file -in Source Code form that contains any contents of the Program. Modified -Works shall not include works that contain only declarations, -interfaces, types, classes, structures, or files of the Program solely -in each case in order to link to, bind by name, or subclass the Program -or Modified Works thereof. - -"Distribute" means the acts of a) distributing or b) making available -in any manner that enables the transfer of a copy. - -"Source Code" means the form of a Program preferred for making -modifications, including but not limited to software source code, -documentation source, and configuration files. - -"Secondary License" means either the GNU General Public License, -Version 2.0, or any later versions of that license, including any -exceptions or additional permissions as identified by the initial -Contributor. - -2. GRANT OF RIGHTS - - a) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free copyright - license to reproduce, prepare Derivative Works of, publicly display, - publicly perform, Distribute and sublicense the Contribution of such - Contributor, if any, and such Derivative Works. - - b) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free patent - license under Licensed Patents to make, use, sell, offer to sell, - import and otherwise transfer the Contribution of such Contributor, - if any, in Source Code or other form. This patent license shall - apply to the combination of the Contribution and the Program if, at - the time the Contribution is added by the Contributor, such addition - of the Contribution causes such combination to be covered by the - Licensed Patents. The patent license shall not apply to any other - combinations which include the Contribution. No hardware per se is - licensed hereunder. - - c) Recipient understands that although each Contributor grants the - licenses to its Contributions set forth herein, no assurances are - provided by any Contributor that the Program does not infringe the - patent or other intellectual property rights of any other entity. - Each Contributor disclaims any liability to Recipient for claims - brought by any other entity based on infringement of intellectual - property rights or otherwise. As a condition to exercising the - rights and licenses granted hereunder, each Recipient hereby - assumes sole responsibility to secure any other intellectual - property rights needed, if any. For example, if a third party - patent license is required to allow Recipient to Distribute the - Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - - d) Each Contributor represents that to its knowledge it has - sufficient copyright rights in its Contribution, if any, to grant - the copyright license set forth in this Agreement. - - e) Notwithstanding the terms of any Secondary License, no - Contributor makes additional grants to any Recipient (other than - those set forth in this Agreement) as a result of such Recipient's - receipt of the Program under the terms of a Secondary License - (if permitted under the terms of Section 3). - -3. REQUIREMENTS - -3.1 If a Contributor Distributes the Program in any form, then: - - a) the Program must also be made available as Source Code, in - accordance with section 3.2, and the Contributor must accompany - the Program with a statement that the Source Code for the Program - is available under this Agreement, and informs Recipients how to - obtain it in a reasonable manner on or through a medium customarily - used for software exchange; and - - b) the Contributor may Distribute the Program under a license - different than this Agreement, provided that such license: - i) effectively disclaims on behalf of all other Contributors all - warranties and conditions, express and implied, including - warranties or conditions of title and non-infringement, and - implied warranties or conditions of merchantability and fitness - for a particular purpose; - - ii) effectively excludes on behalf of all other Contributors all - liability for damages, including direct, indirect, special, - incidental and consequential damages, such as lost profits; - - iii) does not attempt to limit or alter the recipients' rights - in the Source Code under section 3.2; and - - iv) requires any subsequent distribution of the Program by any - party to be under a license that satisfies the requirements - of this section 3. - -3.2 When the Program is Distributed as Source Code: - - a) it must be made available under this Agreement, or if the - Program (i) is combined with other material in a separate file or - files made available under a Secondary License, and (ii) the initial - Contributor attached to the Source Code the notice described in - Exhibit A of this Agreement, then the Program may be made available - under the terms of such Secondary Licenses, and - - b) a copy of this Agreement must be included with each copy of - the Program. - -3.3 Contributors may not remove or alter any copyright, patent, -trademark, attribution notices, disclaimers of warranty, or limitations -of liability ("notices") contained within the Program from any copy of -the Program which they Distribute, provided that Contributors may add -their own appropriate notices. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities -with respect to end users, business partners and the like. While this -license is intended to facilitate the commercial use of the Program, -the Contributor who includes the Program in a commercial product -offering should do so in a manner which does not create potential -liability for other Contributors. Therefore, if a Contributor includes -the Program in a commercial product offering, such Contributor -("Commercial Contributor") hereby agrees to defend and indemnify every -other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits -and other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such -Commercial Contributor in connection with its distribution of the Program -in a commercial product offering. The obligations in this section do not -apply to any claims or Losses relating to any actual or alleged -intellectual property infringement. In order to qualify, an Indemnified -Contributor must: a) promptly notify the Commercial Contributor in -writing of such claim, and b) allow the Commercial Contributor to control, -and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may -participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial -product offering, Product X. That Contributor is then a Commercial -Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Contributor's responsibility -alone. Under this section, the Commercial Contributor would have to -defend claims against the other Contributors related to those performance -claims and warranties, and if a court requires any other Contributor to -pay any damages as a result, the Commercial Contributor must pay -those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" -BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF -TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR -PURPOSE. Each Recipient is solely responsible for determining the -appropriateness of using and distributing the Program and assumes all -risks associated with its exercise of rights under this Agreement, -including but not limited to the risks and costs of program errors, -compliance with applicable laws, damage to or loss of data, programs -or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS -SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further -action by the parties hereto, such provision shall be reformed to the -minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Program itself (excluding combinations of the Program with other software -or hardware) infringes such Recipient's patent(s), then such Recipient's -rights granted under Section 2(b) shall terminate as of the date such -litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of -time after becoming aware of such noncompliance. If all Recipient's -rights under this Agreement terminate, Recipient agrees to cease use -and distribution of the Program as soon as reasonably practicable. -However, Recipient's obligations under this Agreement and any licenses -granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, -but in order to avoid inconsistency the Agreement is copyrighted and -may only be modified in the following manner. The Agreement Steward -reserves the right to publish new versions (including revisions) of -this Agreement from time to time. No one other than the Agreement -Steward has the right to modify this Agreement. The Eclipse Foundation -is the initial Agreement Steward. The Eclipse Foundation may assign the -responsibility to serve as the Agreement Steward to a suitable separate -entity. Each new version of the Agreement will be given a distinguishing -version number. The Program (including Contributions) may always be -Distributed subject to the version of the Agreement under which it was -received. In addition, after a new version of the Agreement is published, -Contributor may elect to Distribute the Program (including its -Contributions) under the new version. - -Except as expressly stated in Sections 2(a) and 2(b) above, Recipient -receives no rights or licenses to the intellectual property of any -Contributor under this Agreement, whether expressly, by implication, -estoppel or otherwise. All rights in the Program not expressly granted -under this Agreement are reserved. Nothing in this Agreement is intended -to be enforceable by any entity that is not a Contributor or Recipient. -No third-party beneficiary rights are created under this Agreement. - -Exhibit A - Form of Secondary Licenses Notice - -"This Source Code may also be made available under the following -Secondary Licenses when the conditions for such availability set forth -in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), -version(s), and exceptions or additional permissions here}." - - Simply including a copy of this Agreement, including this Exhibit A - is not sufficient to license the Source Code under Secondary Licenses. - - If it is not possible or desirable to put the notice in a particular - file, then You may include the notice in a location (such as a LICENSE - file in a relevant directory) where a recipient would be likely to - look for such a notice. - - You may add additional accurate notices of copyright ownership. - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. - -"CLASSPATH" EXCEPTION TO THE GPL - -Certain source files distributed by Oracle America and/or its affiliates are -subject to the following clarification and special exception to the GPL, but -only where Oracle has expressly included in the particular source file's header -the words "Oracle designates this particular file as subject to the "Classpath" -exception as provided by Oracle in the LICENSE file that accompanied this code." - - Linking this library statically or dynamically with other modules is making - a combined work based on this library. Thus, the terms and conditions of - the GNU General Public License cover the whole combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent modules, - and to copy and distribute the resulting executable under terms of your - choice, provided that you also meet, for each linked independent module, - the terms and conditions of the license of that module. An independent - module is a module which is not derived from or based on this library. If - you modify this library, you may extend this exception to your version of - the library, but you are not obligated to do so. If you do not wish to do - so, delete this exception statement from your version. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.plugin.updatesite/.gitignore b/net.mograsim.plugin.updatesite/.gitignore deleted file mode 100644 index 8536068f..00000000 --- a/net.mograsim.plugin.updatesite/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/artifacts.jar -/content.jar -/features/ -/plugins/ diff --git a/net.mograsim.plugin.updatesite/.project b/net.mograsim.plugin.updatesite/.project deleted file mode 100644 index 4a4f372d..00000000 --- a/net.mograsim.plugin.updatesite/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - net.mograsim.plugin.updatesite - - - - - - org.eclipse.pde.UpdateSiteBuilder - - - - - - org.eclipse.pde.UpdateSiteNature - - diff --git a/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.updatesite/site.xml b/net.mograsim.plugin.updatesite/site.xml deleted file mode 100644 index a876812a..00000000 --- a/net.mograsim.plugin.updatesite/site.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Provides updates for the modular graphical simulator (Mograsim) - - - - - - - Mograsim - Modular Graphical Simulator - - - diff --git a/net.mograsim.preferences/.classpath b/net.mograsim.preferences/.classpath deleted file mode 100644 index e801ebfb..00000000 --- a/net.mograsim.preferences/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/net.mograsim.preferences/.gitignore b/net.mograsim.preferences/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.preferences/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.preferences/.project b/net.mograsim.preferences/.project deleted file mode 100644 index 0f30cb05..00000000 --- a/net.mograsim.preferences/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.preferences - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs b/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 2aece3be..00000000 --- a/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,458 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.preferences/META-INF/MANIFEST.MF b/net.mograsim.preferences/META-INF/MANIFEST.MF deleted file mode 100644 index 315ec1ab..00000000 --- a/net.mograsim.preferences/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Mograsim Preferences -Bundle-SymbolicName: net.mograsim.preferences -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.preferences -Bundle-Vendor: Mograsim Team -Automatic-Module-Name: net.mograsim.preferences -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.eclipse.swt;bundle-version="3.0.0" diff --git a/net.mograsim.preferences/build.properties b/net.mograsim.preferences/build.properties deleted file mode 100644 index b107977f..00000000 --- a/net.mograsim.preferences/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - . diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java b/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java deleted file mode 100644 index 621de5f6..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.mograsim.preferences; - -/** - * A way to define a color with the possibility to use colors built into the system (called "system colors" in SWT). - *

- * A {@link ColorDefinition} is defined either by a {@link BuiltInColor} constant, in which case r==g==b==-1, or by red / green - * / blue components, in which case builtInColor==null - * - * @author Daniel Kirschten - */ -public class ColorDefinition -{ - /** - * The built-in color constant defining this color. - */ - public final ColorDefinition.BuiltInColor builtInColor; - /** - * The red color component defining this color. - */ - public final int r; - /** - * The green color component defining this color. - */ - public final int g; - /** - * The blue color component defining this color. - */ - public final int b; - - public ColorDefinition(ColorDefinition.BuiltInColor col) - { - if (col == null) - throw new IllegalArgumentException("Illegal built-in color: " + col); - this.builtInColor = col; - this.r = -1; - this.g = -1; - this.b = -1; - } - - public ColorDefinition(int r, int g, int b) - { - if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) - throw new IllegalArgumentException("Illegal color components: r=" + r + "; g=" + g + "; b=" + b); - this.builtInColor = null; - this.r = r; - this.g = g; - this.b = b; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + b; - result = prime * result + ((builtInColor == null) ? 0 : builtInColor.hashCode()); - result = prime * result + g; - result = prime * result + r; - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ColorDefinition other = (ColorDefinition) obj; - if (b != other.b) - return false; - if (builtInColor != other.builtInColor) - return false; - if (g != other.g) - return false; - if (r != other.r) - return false; - return true; - } - - public static enum BuiltInColor - { - COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_DARK_RED, COLOR_GREEN, COLOR_DARK_GREEN, COLOR_YELLOW, COLOR_DARK_YELLOW, COLOR_BLUE, - COLOR_DARK_BLUE, COLOR_MAGENTA, COLOR_DARK_MAGENTA, COLOR_CYAN, COLOR_DARK_CYAN, COLOR_GRAY, COLOR_DARK_GRAY; - } - -} \ No newline at end of file diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java b/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java deleted file mode 100644 index f6f5d8dc..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.preferences; - -import org.eclipse.swt.graphics.Color; - -public abstract class ColorManager -{ - private static ColorManager currentManager; - - public static void setColorManager(ColorManager manager) - { - if (manager == null) - throw new NullPointerException(); - currentManager = manager; - } - - public static ColorManager current() - { - if (currentManager == null) - currentManager = new SimpleColorManager(); - return currentManager; - } - - public abstract Color toColor(ColorDefinition col); - - public void clearCache() - { - // this method is intended to be overridden - } -} \ No newline at end of file diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java b/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java deleted file mode 100644 index 2f5c7c2a..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.mograsim.preferences; - -import net.mograsim.preferences.ColorDefinition.BuiltInColor; - -public class DefaultPreferences extends Preferences -{ - @Override - public boolean getBoolean(String name) - { - switch (name) - { - case "net.mograsim.logic.model.improvetext": - return true; - default: - throw new IllegalArgumentException("Unknown boolean preference name: " + name); - } - } - - @Override - public int getInt(String name) - { - switch (name) - { - default: - throw new IllegalArgumentException("Unknown int preference name: " + name); - } - } - - @Override - public double getDouble(String name) - { - switch (name) - { - case "net.mograsim.logic.model.linewidth.default": - return 0.5; - case "net.mograsim.logic.model.linewidth.wire.singlebit": - return 0.5; - case "net.mograsim.logic.model.linewidth.wire.multibit": - return 0.85; - default: - throw new IllegalArgumentException("Unknown double preference name: " + name); - } - } - - @Override - public ColorDefinition getColorDefinition(String name) - { - switch (name) - { - case "net.mograsim.logic.model.color.bit.one": - return new ColorDefinition(BuiltInColor.COLOR_GREEN); - case "net.mograsim.logic.model.color.bit.u": - return new ColorDefinition(BuiltInColor.COLOR_CYAN); - case "net.mograsim.logic.model.color.bit.x": - return new ColorDefinition(BuiltInColor.COLOR_RED); - case "net.mograsim.logic.model.color.bit.z": - return new ColorDefinition(BuiltInColor.COLOR_YELLOW); - case "net.mograsim.logic.model.color.bit.zero": - return new ColorDefinition(BuiltInColor.COLOR_GRAY); - case "net.mograsim.logic.model.color.background": - return new ColorDefinition(BuiltInColor.COLOR_WHITE); - case "net.mograsim.logic.model.color.foreground": - return new ColorDefinition(BuiltInColor.COLOR_BLACK); - case "net.mograsim.logic.model.color.text": - return new ColorDefinition(BuiltInColor.COLOR_BLACK); - default: - throw new IllegalArgumentException("Unknown color preference name: " + name); - } - } -} \ No newline at end of file diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java b/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java deleted file mode 100644 index f2498564..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.mograsim.preferences; - -import java.util.Objects; - -import org.eclipse.swt.graphics.Color; - -public abstract class Preferences -{ - private static Preferences currentPreferences; - - public static void setPreferences(Preferences preferences) - { - currentPreferences = Objects.requireNonNull(preferences); - } - - public static Preferences current() - { - if (currentPreferences == null) - currentPreferences = new DefaultPreferences(); - return currentPreferences; - } - - public abstract boolean getBoolean(String name); - - public abstract int getInt(String name); - - public abstract double getDouble(String name); - - public abstract ColorDefinition getColorDefinition(String name); - - public Color getColor(String name) - { - return ColorManager.current().toColor(getColorDefinition(name)); - } -} diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java b/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java deleted file mode 100644 index 60b53110..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java +++ /dev/null @@ -1,95 +0,0 @@ -package net.mograsim.preferences; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Device; -import org.eclipse.swt.widgets.Display; - -import net.mograsim.preferences.ColorDefinition.BuiltInColor; - -public class SimpleColorManager extends ColorManager -{ - private static final Map systemColors = new HashMap<>(); - - private final Device device; - private final Map cachedColors; - - public SimpleColorManager() - { - this.device = Display.getCurrent(); - this.cachedColors = new HashMap<>(systemColors); - } - - @Override - public Color toColor(ColorDefinition col) - { - if (col == null) - return null; - Color cachedColor = cachedColors.get(col); - if (cachedColor != null) - return cachedColor; - if (col.builtInColor != null) - { - Color systemColor = device.getSystemColor(toSWTColorConstant(col.builtInColor)); - systemColors.put(col, systemColor); - cachedColors.put(col, systemColor); - return systemColor; - } - Color nonSystemColor = new Color(device, col.r, col.g, col.b); - cachedColors.put(col, nonSystemColor); - return nonSystemColor; - } - - @Override - public void clearCache() - { - cachedColors.entrySet().stream().filter(e -> !systemColors.containsKey(e.getKey())).map(Entry::getValue).forEach(Color::dispose); - cachedColors.clear(); - cachedColors.putAll(systemColors); - } - - public static int toSWTColorConstant(BuiltInColor col) - { - switch (col) - { - case COLOR_BLACK: - return SWT.COLOR_BLACK; - case COLOR_BLUE: - return SWT.COLOR_BLUE; - case COLOR_CYAN: - return SWT.COLOR_CYAN; - case COLOR_DARK_BLUE: - return SWT.COLOR_DARK_BLUE; - case COLOR_DARK_CYAN: - return SWT.COLOR_DARK_CYAN; - case COLOR_DARK_GRAY: - return SWT.COLOR_DARK_GRAY; - case COLOR_DARK_GREEN: - return SWT.COLOR_DARK_GREEN; - case COLOR_DARK_MAGENTA: - return SWT.COLOR_DARK_MAGENTA; - case COLOR_DARK_RED: - return SWT.COLOR_DARK_RED; - case COLOR_DARK_YELLOW: - return SWT.COLOR_DARK_YELLOW; - case COLOR_GRAY: - return SWT.COLOR_GRAY; - case COLOR_GREEN: - return SWT.COLOR_GREEN; - case COLOR_MAGENTA: - return SWT.COLOR_MAGENTA; - case COLOR_RED: - return SWT.COLOR_RED; - case COLOR_WHITE: - return SWT.COLOR_WHITE; - case COLOR_YELLOW: - return SWT.COLOR_YELLOW; - default: - throw new IllegalArgumentException("Unknown enum constant: " + col); - } - } -} diff --git a/net.mograsim.product/.project b/net.mograsim.product/.project deleted file mode 100644 index d95f9637..00000000 --- a/net.mograsim.product/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - net.mograsim.product - - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.product/.settings/org.eclipse.core.resources.prefs b/net.mograsim.product/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.product/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.product/NOTE b/net.mograsim.product/NOTE deleted file mode 100644 index c63784b3..00000000 --- a/net.mograsim.product/NOTE +++ /dev/null @@ -1,2 +0,0 @@ -Not really necessary, but you could still build it as an Eclipse RCP product (by using an appropriate target platform). -This would then be comparable to the pre-configured packages offered at eclipse.org. \ No newline at end of file diff --git a/net.mograsim.product/build.properties b/net.mograsim.product/build.properties deleted file mode 100644 index f63dee38..00000000 --- a/net.mograsim.product/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = . diff --git a/net.mograsim.product/net.mograsim.product b/net.mograsim.product/net.mograsim.product deleted file mode 100644 index 3bafb1f8..00000000 --- a/net.mograsim.product/net.mograsim.product +++ /dev/null @@ -1,705 +0,0 @@ - - - - - - - - - - - -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts - - - - - - - - - - - - - - - org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 - org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 - org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 - - - - https://www.eclipse.org/legal/epl-2.0/ - - This program and the accompanying materials are made available under the -terms of the Eclipse Public License 2.0 which is available at -http://www.eclipse.org/legal/epl-2.0, or GNU General Public License, -version 2 with the GNU Classpath Exception which is available at -https://www.gnu.org/software/classpath/license.html. - -Eclipse Public License - v 2.0 - - THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE - PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION - OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - - a) in the case of the initial Contributor, the initial content - Distributed under this Agreement, and - - b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - where such changes and/or additions to the Program originate from - and are Distributed by that particular Contributor. A Contribution - "originates" from a Contributor if it was added to the Program by - such Contributor itself or anyone acting on such Contributor's behalf. - Contributions do not include changes or additions to the Program that - are not Modified Works. - -"Contributor" means any person or entity that Distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which -are necessarily infringed by the use or sale of its Contribution alone -or when combined with the Program. - -"Program" means the Contributions Distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement -or any Secondary License (as applicable), including Contributors. - -"Derivative Works" shall mean any work, whether in Source Code or other -form, that is based on (or derived from) the Program and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. - -"Modified Works" shall mean any work in Source Code or other form that -results from an addition to, deletion from, or modification of the -contents of the Program, including, for purposes of clarity any new file -in Source Code form that contains any contents of the Program. Modified -Works shall not include works that contain only declarations, -interfaces, types, classes, structures, or files of the Program solely -in each case in order to link to, bind by name, or subclass the Program -or Modified Works thereof. - -"Distribute" means the acts of a) distributing or b) making available -in any manner that enables the transfer of a copy. - -"Source Code" means the form of a Program preferred for making -modifications, including but not limited to software source code, -documentation source, and configuration files. - -"Secondary License" means either the GNU General Public License, -Version 2.0, or any later versions of that license, including any -exceptions or additional permissions as identified by the initial -Contributor. - -2. GRANT OF RIGHTS - - a) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free copyright - license to reproduce, prepare Derivative Works of, publicly display, - publicly perform, Distribute and sublicense the Contribution of such - Contributor, if any, and such Derivative Works. - - b) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free patent - license under Licensed Patents to make, use, sell, offer to sell, - import and otherwise transfer the Contribution of such Contributor, - if any, in Source Code or other form. This patent license shall - apply to the combination of the Contribution and the Program if, at - the time the Contribution is added by the Contributor, such addition - of the Contribution causes such combination to be covered by the - Licensed Patents. The patent license shall not apply to any other - combinations which include the Contribution. No hardware per se is - licensed hereunder. - - c) Recipient understands that although each Contributor grants the - licenses to its Contributions set forth herein, no assurances are - provided by any Contributor that the Program does not infringe the - patent or other intellectual property rights of any other entity. - Each Contributor disclaims any liability to Recipient for claims - brought by any other entity based on infringement of intellectual - property rights or otherwise. As a condition to exercising the - rights and licenses granted hereunder, each Recipient hereby - assumes sole responsibility to secure any other intellectual - property rights needed, if any. For example, if a third party - patent license is required to allow Recipient to Distribute the - Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - - d) Each Contributor represents that to its knowledge it has - sufficient copyright rights in its Contribution, if any, to grant - the copyright license set forth in this Agreement. - - e) Notwithstanding the terms of any Secondary License, no - Contributor makes additional grants to any Recipient (other than - those set forth in this Agreement) as a result of such Recipient's - receipt of the Program under the terms of a Secondary License - (if permitted under the terms of Section 3). - -3. REQUIREMENTS - -3.1 If a Contributor Distributes the Program in any form, then: - - a) the Program must also be made available as Source Code, in - accordance with section 3.2, and the Contributor must accompany - the Program with a statement that the Source Code for the Program - is available under this Agreement, and informs Recipients how to - obtain it in a reasonable manner on or through a medium customarily - used for software exchange; and - - b) the Contributor may Distribute the Program under a license - different than this Agreement, provided that such license: - i) effectively disclaims on behalf of all other Contributors all - warranties and conditions, express and implied, including - warranties or conditions of title and non-infringement, and - implied warranties or conditions of merchantability and fitness - for a particular purpose; - - ii) effectively excludes on behalf of all other Contributors all - liability for damages, including direct, indirect, special, - incidental and consequential damages, such as lost profits; - - iii) does not attempt to limit or alter the recipients' rights - in the Source Code under section 3.2; and - - iv) requires any subsequent distribution of the Program by any - party to be under a license that satisfies the requirements - of this section 3. - -3.2 When the Program is Distributed as Source Code: - - a) it must be made available under this Agreement, or if the - Program (i) is combined with other material in a separate file or - files made available under a Secondary License, and (ii) the initial - Contributor attached to the Source Code the notice described in - Exhibit A of this Agreement, then the Program may be made available - under the terms of such Secondary Licenses, and - - b) a copy of this Agreement must be included with each copy of - the Program. - -3.3 Contributors may not remove or alter any copyright, patent, -trademark, attribution notices, disclaimers of warranty, or limitations -of liability ("notices") contained within the Program from any copy of -the Program which they Distribute, provided that Contributors may add -their own appropriate notices. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities -with respect to end users, business partners and the like. While this -license is intended to facilitate the commercial use of the Program, -the Contributor who includes the Program in a commercial product -offering should do so in a manner which does not create potential -liability for other Contributors. Therefore, if a Contributor includes -the Program in a commercial product offering, such Contributor -("Commercial Contributor") hereby agrees to defend and indemnify every -other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits -and other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such -Commercial Contributor in connection with its distribution of the Program -in a commercial product offering. The obligations in this section do not -apply to any claims or Losses relating to any actual or alleged -intellectual property infringement. In order to qualify, an Indemnified -Contributor must: a) promptly notify the Commercial Contributor in -writing of such claim, and b) allow the Commercial Contributor to control, -and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may -participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial -product offering, Product X. That Contributor is then a Commercial -Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Contributor's responsibility -alone. Under this section, the Commercial Contributor would have to -defend claims against the other Contributors related to those performance -claims and warranties, and if a court requires any other Contributor to -pay any damages as a result, the Commercial Contributor must pay -those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" -BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF -TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR -PURPOSE. Each Recipient is solely responsible for determining the -appropriateness of using and distributing the Program and assumes all -risks associated with its exercise of rights under this Agreement, -including but not limited to the risks and costs of program errors, -compliance with applicable laws, damage to or loss of data, programs -or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS -SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further -action by the parties hereto, such provision shall be reformed to the -minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Program itself (excluding combinations of the Program with other software -or hardware) infringes such Recipient's patent(s), then such Recipient's -rights granted under Section 2(b) shall terminate as of the date such -litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of -time after becoming aware of such noncompliance. If all Recipient's -rights under this Agreement terminate, Recipient agrees to cease use -and distribution of the Program as soon as reasonably practicable. -However, Recipient's obligations under this Agreement and any licenses -granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, -but in order to avoid inconsistency the Agreement is copyrighted and -may only be modified in the following manner. The Agreement Steward -reserves the right to publish new versions (including revisions) of -this Agreement from time to time. No one other than the Agreement -Steward has the right to modify this Agreement. The Eclipse Foundation -is the initial Agreement Steward. The Eclipse Foundation may assign the -responsibility to serve as the Agreement Steward to a suitable separate -entity. Each new version of the Agreement will be given a distinguishing -version number. The Program (including Contributions) may always be -Distributed subject to the version of the Agreement under which it was -received. In addition, after a new version of the Agreement is published, -Contributor may elect to Distribute the Program (including its -Contributions) under the new version. - -Except as expressly stated in Sections 2(a) and 2(b) above, Recipient -receives no rights or licenses to the intellectual property of any -Contributor under this Agreement, whether expressly, by implication, -estoppel or otherwise. All rights in the Program not expressly granted -under this Agreement are reserved. Nothing in this Agreement is intended -to be enforceable by any entity that is not a Contributor or Recipient. -No third-party beneficiary rights are created under this Agreement. - -Exhibit A - Form of Secondary Licenses Notice - -"This Source Code may also be made available under the following -Secondary Licenses when the conditions for such availability set forth -in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), -version(s), and exceptions or additional permissions here}." - - Simply including a copy of this Agreement, including this Exhibit A - is not sufficient to license the Source Code under Secondary Licenses. - - If it is not possible or desirable to put the notice in a particular - file, then You may include the notice in a location (such as a LICENSE - file in a relevant directory) where a recipient would be likely to - look for such a notice. - - You may add additional accurate notices of copyright ownership. - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. - -"CLASSPATH" EXCEPTION TO THE GPL - -Certain source files distributed by Oracle America and/or its affiliates are -subject to the following clarification and special exception to the GPL, but -only where Oracle has expressly included in the particular source file's header -the words "Oracle designates this particular file as subject to the "Classpath" -exception as provided by Oracle in the LICENSE file that accompanied this code." - - Linking this library statically or dynamically with other modules is making - a combined work based on this library. Thus, the terms and conditions of - the GNU General Public License cover the whole combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent modules, - and to copy and distribute the resulting executable under terms of your - choice, provided that you also meet, for each linked independent module, - the terms and conditions of the license of that module. An independent - module is a module which is not derived from or based on this library. If - you modify this library, you may extend this exception to your version of - the library, but you are not obligated to do so. If you do not wish to do - so, delete this exception statement from your version. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/net.mograsim.logic.core/.classpath b/plugins/net.mograsim.logic.core/.classpath new file mode 100644 index 00000000..4a00becd --- /dev/null +++ b/plugins/net.mograsim.logic.core/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.logic.core/.project b/plugins/net.mograsim.logic.core/.project new file mode 100644 index 00000000..2f347c0a --- /dev/null +++ b/plugins/net.mograsim.logic.core/.project @@ -0,0 +1,29 @@ + + + net.mograsim.logic.core + + + net.mograsim.preferences + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..e5f98893 --- /dev/null +++ b/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,468 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..94658822 --- /dev/null +++ b/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=false +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=true +sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.correct_indentation=true +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=true +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=true +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=true +sp_cleanup.remove_redundant_semicolons=true +sp_cleanup.remove_redundant_type_arguments=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=true +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=true +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=true +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.logic.core/META-INF/MANIFEST.MF b/plugins/net.mograsim.logic.core/META-INF/MANIFEST.MF new file mode 100644 index 00000000..2aff2ab9 --- /dev/null +++ b/plugins/net.mograsim.logic.core/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: net.mograsim.logic.core +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.logic.core, + net.mograsim.logic.core.components, + net.mograsim.logic.core.components.gates, + net.mograsim.logic.core.timeline, + net.mograsim.logic.core.types, + net.mograsim.logic.core.wires +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Automatic-Module-Name: net.mograsim.logic.core +Bundle-Vendor: Mograsim Team +Require-Bundle: net.mograsim.preferences;bundle-version="0.1.0" diff --git a/plugins/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties b/plugins/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties new file mode 100644 index 00000000..8ea411e4 --- /dev/null +++ b/plugins/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,3 @@ +#Properties file for net.mograsim.logic.core +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim logic core \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/build.properties b/plugins/net.mograsim.logic.core/build.properties new file mode 100644 index 00000000..d6642e65 --- /dev/null +++ b/plugins/net.mograsim.logic.core/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/ diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java new file mode 100644 index 00000000..3a51c27c --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java @@ -0,0 +1,11 @@ +package net.mograsim.logic.core; + +public interface LogicObservable +{ + public void registerObserver(LogicObserver ob); + + public void deregisterObserver(LogicObserver ob); + + public void notifyObservers(); + +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java new file mode 100644 index 00000000..259fe4d7 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java @@ -0,0 +1,7 @@ +package net.mograsim.logic.core; + +@FunctionalInterface +public interface LogicObserver +{ + public void update(LogicObservable initiator); +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java new file mode 100644 index 00000000..c82f2b37 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java @@ -0,0 +1,43 @@ +package net.mograsim.logic.core.components; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; + +/** + * A basic component that recomputes all outputs (with a delay), when it is updated. + * + * @author Fabian Stemmler + */ +public abstract class BasicCoreComponent extends CoreComponent implements LogicObserver +{ + private int processTime; + + /** + * + * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed. + * + * @author Fabian Stemmler + */ + public BasicCoreComponent(Timeline timeline, int processTime) + { + super(timeline); + this.processTime = processTime > 0 ? processTime : 1; + } + + @Override + public final void update(LogicObservable initiator) + { + update(); + } + + public void update() + { + TimelineEventHandler delayedUpdates = compute(); + if (delayedUpdates != null) + timeline.addEvent(delayedUpdates, processTime); + } + + protected abstract TimelineEventHandler compute(); +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java new file mode 100644 index 00000000..345bc0ab --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java @@ -0,0 +1,81 @@ +package net.mograsim.logic.core.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreBitDisplay extends BasicCoreComponent implements LogicObservable +{ + private Collection observers; + private final ReadEnd in; + private BitVector displayedValue; + + public CoreBitDisplay(Timeline timeline, ReadEnd in) + { + super(timeline, 1); + observers = new ArrayList<>(); + this.in = in; + in.registerObserver(this); + compute(); + } + + @Override + protected TimelineEventHandler compute() + { + BitVector newValues = in.getValues(); + return e -> + { + displayedValue = newValues; + notifyObservers(); + }; + } + + public BitVector getDisplayedValue() + { + return displayedValue; + } + + public boolean isDisplaying(Bit... values) + { + return displayedValue.equals(BitVector.of(values)); + } + + @Override + public List getAllInputs() + { + return List.of(in); + } + + @Override + public List getAllOutputs() + { + return List.of(); + } + + @Override + public void registerObserver(LogicObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(LogicObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers() + { + observers.forEach(ob -> ob.update(this)); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java new file mode 100644 index 00000000..0cccdfdd --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java @@ -0,0 +1,91 @@ +package net.mograsim.logic.core.components; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEvent; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreClock extends CoreComponent implements TimelineEventHandler, LogicObservable +{ + private Collection observers; + private boolean toggle = false; + private ReadWriteEnd out; + private int delta; + + /** + * + * @param out {@link CoreWire} the clock's impulses are fed into + * @param delta ticks between rising and falling edge + */ + public CoreClock(Timeline timeline, ReadWriteEnd out, int delta) + { + super(timeline); + this.delta = delta; + this.out = out; + this.observers = new HashSet<>(); + addToTimeline(); + } + + @Override + public void handle(TimelineEvent e) + { + addToTimeline(); + out.feedSignals(toggle ? Bit.ONE : Bit.ZERO); + toggle = !toggle; + notifyObservers(); + } + + public ReadWriteEnd getOut() + { + return out; + } + + public boolean isOn() + { + return !toggle; + } + + private void addToTimeline() + { + timeline.addEvent(this, delta); + } + + @Override + public List getAllInputs() + { + return List.of(); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } + + @Override + public void registerObserver(LogicObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(LogicObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers() + { + observers.forEach(ob -> ob.update(this)); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java new file mode 100644 index 00000000..734f48de --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java @@ -0,0 +1,28 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public abstract class CoreComponent +{ + protected Timeline timeline; + + public CoreComponent(Timeline timeline) + { + this.timeline = timeline; + } + + /** + * Returns immutable list of all inputs to the {@link CoreComponent} (including e.g. the select bits to a MUX). Intended for + * visualization in the UI. + */ + public abstract List getAllInputs(); + + /** + * Returns immutable list of all outputs to the {@link CoreComponent}. Intended for visualization in the UI. + */ + public abstract List getAllOutputs(); +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java new file mode 100644 index 00000000..8f4fe428 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java @@ -0,0 +1,92 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +/** + * Models a multiplexer. Takes an arbitrary amount of input {@link CoreWire}s, one of which, as determined by select, is put through to the + * output. + * + * @author Fabian Stemmler + * + */ +public class CoreDemux extends BasicCoreComponent +{ + private final ReadEnd select, in; + private final ReadWriteEnd[] outputs; + private final int outputSize; + private int selected = -1; + + /** + * Output {@link CoreWire}s and in must be of uniform width + * + * @param in Must be of uniform width with all outputs. + * @param select Indexes the output array to which the input is mapped. Must have enough bits to index all outputs. + * @param outputs One of these outputs receives the input signal, depending on the select bits + */ + public CoreDemux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs) + { + super(timeline, processTime); + outputSize = in.width(); + + this.in = in; + this.outputs = outputs; + for (int i = 0; i < this.outputs.length; i++) + { + if (outputs[i].width() != outputSize) + throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform width!"); + this.outputs[i] = outputs[i]; + } + + this.select = select; + select.registerObserver(this); + + int maxInputs = 1 << select.width(); + if (this.outputs.length > maxInputs) + throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by " + + select.width() + " select bits (" + maxInputs + ")."); + in.registerObserver(this); + } + + @Override + public TimelineEventHandler compute() + { + int selectValue = select.getValues().isBinary() ? (int) select.getValues().getUnsignedValueLong() : -1; + if (selectValue >= outputs.length) + selectValue = -1; + + boolean hasOldSelection = selected != selectValue && selected != -1; + int oldSelection = selected; + boolean hasNewSelection = selectValue != -1; + int newSelection = selectValue; + BitVector inputValues = in.getValues(); + + selected = selectValue; + + return e -> + { + if (hasOldSelection) + outputs[oldSelection].clearSignals(); + if (hasNewSelection) + outputs[newSelection].feedSignals(inputValues); + }; + } + + @Override + public List getAllInputs() + { + return List.of(in, select); + } + + @Override + public List getAllOutputs() + { + return List.of(outputs); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java new file mode 100644 index 00000000..b7e5d3a6 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java @@ -0,0 +1,109 @@ +package net.mograsim.logic.core.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +/** + * This class models a simple on/off (ONE/ZERO) switch for user interaction. + * + * @author Christian Femers + * + */ +public class CoreManualSwitch extends CoreComponent implements LogicObservable +{ + private Collection observers; + private ReadWriteEnd output; + private BitVector inputValues; + + public CoreManualSwitch(Timeline timeline, ReadWriteEnd output) + { + super(timeline); + observers = new ArrayList<>(); + this.output = output; + this.inputValues = output.getInputValues(); + } + + public void switchFullOn() + { + setState(BitVector.of(Bit.ONE, output.width())); + } + + public void switchFullOff() + { + setState(BitVector.of(Bit.ZERO, output.width())); + } + + public void toggle() + { + if (isFullOn()) + switchFullOff(); + else + switchFullOn(); + } + + public void setState(Bit bit) + { + setState(BitVector.of(bit)); + } + + public void setState(BitVector bits) + { + if (bits.length() != output.width()) + throw new IllegalArgumentException("Incorrect bit vector length"); + if (bits.equals(inputValues)) + return; + inputValues = bits; + output.feedSignals(bits); + notifyObservers(); + } + + public boolean isFullOn() + { + return BitVector.of(Bit.ONE, output.width()).equals(output.getInputValues()); + } + + public BitVector getValues() + { + return inputValues; + } + + @Override + public List getAllInputs() + { + return List.of(); + } + + @Override + public List getAllOutputs() + { + return List.of(output); + } + + @Override + public void registerObserver(LogicObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(LogicObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers() + { + observers.forEach(ob -> ob.update(this)); + } + +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java new file mode 100644 index 00000000..5b4220a5 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java @@ -0,0 +1,96 @@ +package net.mograsim.logic.core.components; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +/** + * Models a multiplexer. Takes an arbitrary amount of input {@link CoreWire}s, one of which, as determined by select, is put through to the + * output. + * + * @author Fabian Stemmler + * + */ +public class CoreMux extends BasicCoreComponent +{ + private ReadEnd select; + private ReadWriteEnd out; + private ReadEnd[] inputs; + private final int outputSize; + + /** + * Input {@link CoreWire}s and out must be of uniform width + * + * @param out Must be of uniform width with all inputs. + * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs. + * @param inputs One of these inputs is mapped to the output, depending on the select bits + */ + public CoreMux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs) + { + super(timeline, processTime); + outputSize = out.width(); + + this.inputs = inputs.clone(); + for (int i = 0; i < this.inputs.length; i++) + { + if (inputs[i].width() != outputSize) + throw new IllegalArgumentException("All MUX wire arrays must be of uniform width!"); + inputs[i].registerObserver(this); + } + + this.select = select; + select.registerObserver(this); + + int maxInputs = 1 << select.width(); + if (this.inputs.length > maxInputs) + throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by " + + select.width() + " select bits (" + maxInputs + ")."); + + this.out = out; + } + + public ReadEnd getOut() + { + return out; + } + + public ReadEnd getSelect() + { + return select; + } + + @Override + public TimelineEventHandler compute() + { + int selectValue; + if (!select.getValues().isBinary() || (selectValue = (int) select.getValues().getUnsignedValueLong()) >= inputs.length) + { + return e -> out.clearSignals(); + } + + BitVector activeValues = inputs[selectValue].getValues(); + return e -> out.feedSignals(activeValues); + } + + @Override + public List getAllInputs() + { + ArrayList wires = new ArrayList<>(Arrays.asList(inputs)); + wires.add(select); + return Collections.unmodifiableList(wires); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java new file mode 100644 index 00000000..4b7a339f --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java @@ -0,0 +1,55 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreTriStateBuffer extends BasicCoreComponent +{ + ReadEnd in, enable; + ReadWriteEnd out; + + public CoreTriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable) + { + super(timeline, processTime); + if (in.width() != out.width()) + throw new IllegalArgumentException( + "Tri-state output must have the same amount of bits as the input. Input: " + in.width() + " Output: " + out.width()); + if (enable.width() != 1) + throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.width() + "."); + this.in = in; + in.registerObserver(this); + this.enable = enable; + enable.registerObserver(this); + this.out = out; + } + + @Override + protected TimelineEventHandler compute() + { + if (enable.getValue() == Bit.ONE) + { + BitVector inValues = in.getValues(); + return e -> out.feedSignals(inValues); + } + return e -> out.clearSignals(); + } + + @Override + public List getAllInputs() + { + return List.of(in, enable); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } + +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java new file mode 100644 index 00000000..6e6b0f15 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java @@ -0,0 +1,85 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreUnidirectionalMerger extends CoreComponent implements LogicObserver +{ + private ReadWriteEnd out; + private ReadEnd[] inputs; + private int[] beginningIndex; + + /** + * + * @param union The output of merging n {@link CoreWire}s into one. Must have width = a1.width() + a2.width() + ... + an.width(). + * @param inputs The inputs to be merged into the union + */ + public CoreUnidirectionalMerger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs) + { + super(timeline); + this.inputs = inputs; + this.out = union; + this.beginningIndex = new int[inputs.length]; + + int width = 0; + for (int i = 0; i < inputs.length; i++) + { + beginningIndex[i] = width; + width += inputs[i].width(); + inputs[i].registerObserver(this); + } + + if (width != union.width()) + throw new IllegalArgumentException( + "The output of merging n WireArrays into one must have width = a1.width() + a2.width() + ... + an.width()."); + } + + public ReadEnd getInput(int index) + { + return inputs[index]; + } + + public ReadEnd getUnion() + { + return out; + } + + @Override + public void update(LogicObservable initiator) + { + int index = find(initiator); + int beginning = beginningIndex[index]; + out.feedSignals(beginning, inputs[index].getValues()); + } + + private int find(LogicObservable r) + { + for (int i = 0; i < inputs.length; i++) + if (inputs[i] == r) + return i; + return -1; + } + + public ReadEnd[] getInputs() + { + return inputs.clone(); + } + + @Override + public List getAllInputs() + { + return List.of(inputs); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java new file mode 100644 index 00000000..d77e1541 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java @@ -0,0 +1,60 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreUnidirectionalSplitter extends CoreComponent implements LogicObserver +{ + private ReadEnd input; + private ReadWriteEnd[] outputs; + + public CoreUnidirectionalSplitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs) + { + super(timeline); + this.input = input; + this.outputs = outputs; + input.registerObserver(this); + int width = 0; + for (ReadEnd out : outputs) + width += out.width(); + + if (input.width() != width) + throw new IllegalArgumentException( + "The input of splitting one into n WireArrays must have width = a1.width() + a2.width() + ... + an.width()."); + } + + protected void compute() + { + BitVector inputBits = input.getValues(); + int startIndex = 0; + for (int i = 0; i < outputs.length; i++) + { + outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].width())); + startIndex += outputs[i].width(); + } + } + + @Override + public void update(LogicObservable initiator) + { + compute(); + } + + @Override + public List getAllInputs() + { + return List.of(input); + } + + @Override + public List getAllOutputs() + { + return List.of(outputs); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java new file mode 100644 index 00000000..d71e08e1 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreAndGate extends MultiInputCoreGate +{ + public CoreAndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::and, out, in); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java new file mode 100644 index 00000000..e847d0ec --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreNandGate extends MultiInputCoreGate +{ + public CoreNandGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::and, true, out, in); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java new file mode 100644 index 00000000..12336274 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreNorGate extends MultiInputCoreGate +{ + public CoreNorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::or, true, out, in); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java new file mode 100644 index 00000000..b7808be9 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java @@ -0,0 +1,53 @@ +package net.mograsim.logic.core.components.gates; + +import java.util.List; + +import net.mograsim.logic.core.components.BasicCoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreNotGate extends BasicCoreComponent +{ + private ReadEnd in; + private ReadWriteEnd out; + + public CoreNotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out) + { + super(timeline, processTime); + this.in = in; + in.registerObserver(this); + this.out = out; + } + + @Override + protected TimelineEventHandler compute() + { + BitVector values = in.getValues().not(); + return e -> out.feedSignals(values); + } + + public ReadEnd getIn() + { + return in; + } + + public ReadEnd getOut() + { + return out; + } + + @Override + public List getAllInputs() + { + return List.of(in); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java new file mode 100644 index 00000000..97d75c80 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreOrGate extends MultiInputCoreGate +{ + public CoreOrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::or, out, in); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java new file mode 100644 index 00000000..8bc98934 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java @@ -0,0 +1,20 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +/** + * Outputs 1 when the number of 1 inputs is odd. + * + * @author Fabian Stemmler + */ +public class CoreXorGate extends MultiInputCoreGate +{ + public CoreXorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::xor, out, in); + } + +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java new file mode 100644 index 00000000..010ae74f --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java @@ -0,0 +1,64 @@ +package net.mograsim.logic.core.components.gates; + +import java.util.List; + +import net.mograsim.logic.core.components.BasicCoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.types.MutationOperation; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public abstract class MultiInputCoreGate extends BasicCoreComponent +{ + protected ReadEnd[] in; + protected ReadWriteEnd out; + protected final int width; + protected MutationOperation op; + protected boolean invert = false; + + protected MultiInputCoreGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime); + this.op = op; + width = out.width(); + this.in = in.clone(); + if (in.length < 1) + throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length)); + for (ReadEnd w : in) + { + if (w.width() != width) + throw new IllegalArgumentException("All wires connected to the gate must be of uniform length."); + w.registerObserver(this); + } + this.out = out; + } + + protected MultiInputCoreGate(Timeline timeline, int processTime, MutationOperation op, boolean invert, ReadWriteEnd out, ReadEnd... in) + { + this(timeline, processTime, op, out, in); + this.invert = invert; + } + + @Override + public List getAllInputs() + { + return List.of(in); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } + + @Override + public TimelineEventHandler compute() + { + BitVectorMutator mutator = BitVectorMutator.empty(); + for (ReadEnd w : in) + op.apply(mutator, w.getValues()); + return e -> out.feedSignals(invert ? mutator.toBitVector().not() : mutator.toBitVector()); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java new file mode 100644 index 00000000..9dbc31d4 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java @@ -0,0 +1,256 @@ +package net.mograsim.logic.core.timeline; + +import java.util.ArrayList; +import java.util.List; +import java.util.PriorityQueue; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; +import java.util.function.LongSupplier; + +/** + * Orders Events by the time they are due to be executed. Can execute Events individually. + * + * @author Fabian Stemmler + * + */ +public class Timeline +{ + private PriorityQueue events; + private LongSupplier time; + private long lastTimeUpdated = 0; + private long eventCounter = 0; + + private final List> eventAddedListener; + + public final LongSupplier stepByStepExec = () -> lastTimeUpdated; + public final LongSupplier realTimeExec = () -> System.currentTimeMillis(); + + /** + * Constructs a Timeline object. Per default the time function is set to step by step execution. + * + * @param initCapacity The initial capacity of the event queue. + */ + public Timeline(int initCapacity) + { + events = new PriorityQueue<>(initCapacity); + eventAddedListener = new ArrayList<>(); + time = stepByStepExec; + } + + /** + * @param timestamp exclusive + * @return true if the first event in queue is later than the given timestamp + */ + public BooleanSupplier laterThan(long timestamp) + { + return () -> timeCmp(events.peek().getTiming(), timestamp) > 0; + } + + /** + * @return true if there is at least one event enqueued. false otherwise + */ + public boolean hasNext() + { + return !events.isEmpty(); + } + + /** + * Executes all events at the next timestamp, at which there are any + */ + public void executeNext() + { + InnerEvent first = events.peek(); + if (first != null) + executeUntil(laterThan(first.getTiming()), -1); + } + + /** + * Executes all events enqueued in the {@link Timeline}. Use very carefully! Events may generate new events, causing an infinite loop. + */ + public void executeAll() + { + while (hasNext()) + executeNext(); + } + + /** + * Executes all events until a given condition is met. The simulation process can be constrained by a real world timestamp. + * + * @param condition the condition until which the events are be processed + * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout. + * @return State of the event execution + * @formatter:off + * NOTHING_DONE if the {@link Timeline} was already empty + * EXEC_OUT_OF_TIME if the given maximum time was reached + * EXEC_UNTIL_CONDITION if the condition was met + * EXEC_UNTIL_EMPTY if events were executed until the {@link Timeline} was empty + * @formatter:on + */ + public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis) + { + if (events.isEmpty()) + { + lastTimeUpdated = getSimulationTime(); + return ExecutionResult.NOTHING_DONE; + } + int checkStop = 0; + while (hasNext() && !condition.getAsBoolean()) + { + InnerEvent event; + synchronized (events) + { + event = events.remove(); + } + lastTimeUpdated = event.getTiming(); + event.run(); + // Don't check after every run + checkStop = (checkStop + 1) % 10; + if (checkStop == 0 && System.currentTimeMillis() >= stopMillis) + return ExecutionResult.EXEC_OUT_OF_TIME; + } + lastTimeUpdated = getSimulationTime(); + return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION; + } + + /** + * Sets the function, which defines the current simulation time at any time. + * + * @param time The return value of calling this function is the current simulation time. + */ + public void setTimeFunction(LongSupplier time) + { + this.time = time; + } + + /** + * Calculates the current simulation time. + * + * @return The simulation time as defined by the time function. + */ + public long getSimulationTime() + { + return time.getAsLong(); + } + + /** + * Retrieves the timestamp of the next event. + * + * @return The timestamp of the next enqueued event, if the {@link Timeline} is not empty, -1 otherwise. + */ + public long nextEventTime() + { + if (!hasNext()) + return -1; + return events.peek().getTiming(); + } + + /** + * Clears the {@link Timeline} of enqueued events. + */ + public void reset() + { + synchronized (events) + { + events.clear(); + } + lastTimeUpdated = 0; + } + + /** + * Adds a listener, that is called when a {@link TimelineEvent} is added. + */ + public void addEventAddedListener(Consumer listener) + { + eventAddedListener.add(listener); + } + + /** + * Removes the listener, if possible. It will no longer be called when a {@link TimelineEvent} is added. + */ + public void removeEventAddedListener(Consumer listener) + { + eventAddedListener.remove(listener); + } + + /** + * Adds an Event to the {@link Timeline} + * + * @param function The {@link TimelineEventHandler} that will be executed, when the {@link InnerEvent} occurs on the timeline. + * @param relativeTiming The amount of MI ticks in which the {@link InnerEvent} is called, starting from the current time. + */ + public void addEvent(TimelineEventHandler function, int relativeTiming) + { + long timing = getSimulationTime() + relativeTiming; + TimelineEvent event = new TimelineEvent(timing); + synchronized (events) + { + events.add(new InnerEvent(function, event, eventCounter++)); + } + eventAddedListener.forEach(l -> l.accept(event)); + } + + private class InnerEvent implements Runnable, Comparable + { + private final TimelineEventHandler function; + private final TimelineEvent event; + private final long id; + + /** + * Creates an {@link InnerEvent} + * + * @param function {@link TimelineEventHandler} to be executed when the {@link InnerEvent} occurs + * @param timing Point in the MI simulation {@link Timeline}, at which the {@link InnerEvent} is executed; + */ + InnerEvent(TimelineEventHandler function, TimelineEvent event, long id) + { + this.function = function; + this.event = event; + this.id = id; + } + + public long getTiming() + { + return event.getTiming(); + } + + @Override + public void run() + { + function.handle(event); + } + + @Override + public String toString() + { + return event.toString(); + } + + @Override + public int compareTo(InnerEvent o) + { + int c1; + return (c1 = timeCmp(getTiming(), o.getTiming())) == 0 ? timeCmp(id, o.id) : c1; + } + } + + public static int timeCmp(long a, long b) + { + return Long.signum(a - b); + } + + @Override + public String toString() + { + String eventsString; + synchronized (events) + { + eventsString = events.toString(); + } + return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, eventsString); + } + + public enum ExecutionResult + { + NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java new file mode 100644 index 00000000..c46e6ad6 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java @@ -0,0 +1,30 @@ +package net.mograsim.logic.core.timeline; + +/** + * A class that stores all relevant information about an event in the {@link Timeline}. Currently, there is not much relevant information to + * store. + * + * @author Fabian Stemmler + * + */ +public class TimelineEvent +{ + private final long timing; + + TimelineEvent(long timing) + { + super(); + this.timing = timing; + } + + public long getTiming() + { + return timing; + } + + @Override + public String toString() + { + return "timestamp: " + timing; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java new file mode 100644 index 00000000..badbabcb --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java @@ -0,0 +1,7 @@ +package net.mograsim.logic.core.timeline; + +@FunctionalInterface +public interface TimelineEventHandler +{ + public void handle(TimelineEvent e); +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java new file mode 100644 index 00000000..752fbb80 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java @@ -0,0 +1,181 @@ +package net.mograsim.logic.core.types; + +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; + +/** + * stdlogic according to IEEE 1164 + */ +public enum Bit implements StrictLogicType +{ + U("U"), X("X"), ZERO("0"), ONE("1"), Z("Z"); + + private final String symbol; + + private Bit(String symbol) + { + this.symbol = symbol; + } + + /** + * Returns if the Bit is binary, this is only true for ZERO and ONE. + * + * @return true if and only if this == ONE || this == ZERO + */ + public boolean isBinary() + { + return this == ONE || this == ZERO; + } + + @Override + public Bit and(Bit other) + { + return fromTable(AND_TABLE, this, other); + } + + public static void and(Bit[] dst, Bit[] src) + { + for (int i = 0; i < dst.length; i++) + dst[i] = dst[i].and(src[i]); + } + + @Override + public Bit or(Bit other) + { + return fromTable(OR_TABLE, this, other); + } + + public static void or(Bit[] dst, Bit[] src) + { + for (int i = 0; i < dst.length; i++) + dst[i] = dst[i].or(src[i]); + } + + @Override + public Bit xor(Bit other) + { + return fromTable(XOR_TABLE, this, other); + } + + public static void xor(Bit[] dst, Bit[] src) + { + for (int i = 0; i < dst.length; i++) + dst[i] = dst[i].xor(src[i]); + } + + @Override + public Bit not() + { + switch (this) + { + case U: + return U; + case ONE: + return ZERO; + case ZERO: + return ONE; + default: + return X; + } + } + + public Bit[] makeArray(int length) + { + Bit[] bits = new Bit[length]; + Arrays.fill(bits, this); + return bits; + } + + public BitVector toVector() + { + return BitVector.of(this, 1); + } + + public BitVector toVector(int length) + { + return BitVector.of(this, length); + } + + @Override + public Bit join(Bit other) + { + return fromTable(JOIN_TABLE, this, other); + } + + public static void join(Bit[] dst, Bit[] src) + { + for (int i = 0; i < dst.length; i++) + dst[i] = dst[i].join(src[i]); + } + + @Override + public String toString() + { + return getSymbol(); + } + + public String getSymbol() + { + return symbol; + } + + public static Bit lastBitOf(int value) + { + return values()[2 + (value & 1)]; + } + + public static Bit of(boolean binaryValue) + { + return binaryValue ? ONE : ZERO; + } + + public static Bit parse(String s) + { + Bit bit = SYMBOL_MAP.get(s); + Objects.requireNonNull(bit, "No Bit found for symbol " + s); + return bit; + } + + public static Bit parse(String s, int symbolPosition) + { + return parse(s.substring(symbolPosition, symbolPosition + 1)); + } + + private static Bit fromTable(Bit[][] table, Bit a, Bit b) + { + return table[a.ordinal()][b.ordinal()]; + } + + static final Map SYMBOL_MAP = Map.of(U.symbol, U, X.symbol, X, ZERO.symbol, ZERO, ONE.symbol, ONE, Z.symbol, Z); + + // @formatter:off + private static final Bit[][] JOIN_TABLE = + { { U, U, U, U, U }, + { U, X, X, X, X }, + { U, X, ZERO, X, ZERO }, + { U, X, X, ONE, ONE }, + { U, X, ZERO, ONE, Z } }; + + private static final Bit[][] AND_TABLE = + { { U, U, ZERO, U, U }, + { U, X, ZERO, X, X }, + { ZERO, ZERO, ZERO, ZERO, ZERO }, + { U, X, ZERO, ONE, X }, + { U, X, ZERO, X, X } }; + + private static final Bit[][] OR_TABLE = + { { U, U, U, ONE, U }, + { U, X, X, ONE, X }, + { U, X, ZERO, ONE, X }, + { ONE, ONE, ONE, ONE, ONE }, + { U, X, X, ONE, X } }; + + private static final Bit[][] XOR_TABLE = + { { U, U, U, U, U }, + { U, X, X, X, X }, + { U, X, ZERO, ONE, X }, + { U, X, ONE, ZERO, X }, + { U, X, X, X, X } }; + // @formatter:on +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java new file mode 100644 index 00000000..13466949 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java @@ -0,0 +1,530 @@ +package net.mograsim.logic.core.types; + +import static java.lang.String.format; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.RandomAccess; +import java.util.function.BinaryOperator; +import java.util.function.UnaryOperator; + +/** + * Immutable class representing a {@link Bit}Vector + * + * @author Christian Femers + * + */ +public final class BitVector implements StrictLogicType, Iterable, RandomAccess +{ + public static final BitVector SINGLE_U = new BitVector(Bit.U); + public static final BitVector SINGLE_X = new BitVector(Bit.X); + public static final BitVector SINGLE_0 = new BitVector(Bit.ZERO); + public static final BitVector SINGLE_1 = new BitVector(Bit.ONE); + public static final BitVector SINGLE_Z = new BitVector(Bit.Z); + + private static final BitVector[] SINGLE_BIT_MAPPING = { SINGLE_U, SINGLE_X, SINGLE_0, SINGLE_1, SINGLE_Z }; + + private final Bit[] bits; + + private BitVector(Bit single) + { + Objects.requireNonNull(single); + bits = new Bit[] { single }; + } + + private BitVector(Bit[] bits) + { + this.bits = Objects.requireNonNull(bits); // do this first to "catch" bits==null before the foreach loop + for (Bit bit : bits) + if (bit == null) + throw new NullPointerException(); + } + + public static BitVector of(Bit... bits) + { + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].ordinal()]; + return new BitVector(bits.clone()); + } + + public static BitVector of(Bit bit, int length) + { + if (length == 1) + return SINGLE_BIT_MAPPING[bit.ordinal()]; + return new BitVector(bit.makeArray(length)); + } + + public static BitVector from(long value, int bits) + { + return from(BigInteger.valueOf(value), bits); + } + + public static BitVector from(BigInteger value, int bits) + { + Bit[] values = new Bit[bits]; + for (int i = 0; i < bits; i++) + values[bits - i - 1] = Bit.of(value.testBit(i)); + return new BitVector(values); + } + + public BitVectorMutator mutator() + { + return BitVectorMutator.of(this); + } + + /** + * Returns the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) + */ + public Bit getMSBit(int bitIndex) + { + return bits[bitIndex]; + } + + /** + * Returns the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) + */ + public Bit getLSBit(int bitIndex) + { + return bits[bits.length - bitIndex - 1]; + } + + public Bit[] getBits() + { + return bits.clone(); + } + + /** + * Checks if all bits are {@link Bit#isBinary() binary}. + * + * @see Bit#isBinary() + */ + public boolean isBinary() + { + for (int i = 0; i < bits.length; i++) + { + if (!bits[i].isBinary()) + return false; + } + return true; + } + + @Override + public BitVector join(BitVector t) + { + checkCompatibility(t); + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].join(t.bits[0]).ordinal()]; + return new BitVector(binOp(bits.clone(), t.bits, Bit::join)); + } + + @Override + public BitVector and(BitVector t) + { + checkCompatibility(t); + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].and(t.bits[0]).ordinal()]; + return new BitVector(binOp(bits.clone(), t.bits, Bit::and)); + } + + @Override + public BitVector or(BitVector t) + { + checkCompatibility(t); + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].or(t.bits[0]).ordinal()]; + return new BitVector(binOp(bits.clone(), t.bits, Bit::or)); + } + + @Override + public BitVector xor(BitVector t) + { + checkCompatibility(t); + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].xor(t.bits[0]).ordinal()]; + return new BitVector(binOp(bits.clone(), t.bits, Bit::xor)); + } + + @Override + public BitVector not() + { + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].not().ordinal()]; + return new BitVector(unOp(bits.clone(), Bit::not)); + } + + public int length() + { + return bits.length; + } + + public BitVector concat(BitVector other) + { + Bit[] newBits = Arrays.copyOf(bits, length() + other.length()); + System.arraycopy(other.bits, 0, newBits, length(), other.length()); + return new BitVector(newBits); + } + + public BitVector subVector(int start) + { + return new BitVector(Arrays.copyOfRange(bits, start, length())); + } + + public BitVector subVector(int start, int end) + { + return new BitVector(Arrays.copyOfRange(bits, start, end)); + } + + private void checkCompatibility(BitVector bv) + { + if (length() != bv.length()) + throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", length(), bv.length())); + } + + static Bit[] binOp(Bit[] dest, Bit[] second, BinaryOperator op) + { + if (dest == null) + return second.clone(); + for (int i = 0; i < dest.length; i++) + { + dest[i] = op.apply(dest[i], second[i]); + } + return dest; + } + + static Bit[] unOp(Bit[] dest, UnaryOperator op) + { + if (dest == null) + return null; + for (int i = 0; i < dest.length; i++) + { + dest[i] = op.apply(dest[i]); + } + return dest; + } + + /** + * Class for comfortable and efficient manipulation of {@link BitVector}s, similar to {@link StringBuilder} + * + * @author Christian Femers + */ + public static final class BitVectorMutator implements LogicType + { + private Bit[] bits; + + private BitVectorMutator(Bit[] bits) + { + this.bits = bits; + } + + static BitVectorMutator of(BitVector bv) + { + return new BitVectorMutator(bv.getBits()); + } + + /** + * Returns a new mutator of the specified length, with all bits set to null. Use with care! + */ + public static BitVectorMutator ofLength(int length) + { + return new BitVectorMutator(new Bit[length]); + } + + /** + * Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed. + *

+ * An empty BitVectorMutator must not be converted to BitVector or used to manipulate single bits until at least one two + * operand logic operation is performed. + */ + public static BitVectorMutator empty() + { + return new BitVectorMutator(null); + } + + /** + * @see #empty() + */ + public boolean isEmpty() + { + return bits == null; + } + + /** + * Produces the resulting, immutable {@link BitVector}
+ * + * @throws IllegalStateException if the mutator is (still) empty + */ + public BitVector toBitVector() + { + if (bits == null) + throw new IllegalStateException("cannot create a BitVector from an empty mutator"); + return new BitVector(bits); + } + + @Override + public BitVectorMutator join(BitVector t) + { + checkCompatibility(t); + bits = binOp(bits, t.bits, Bit::join); + return this; + } + + @Override + public BitVectorMutator and(BitVector t) + { + checkCompatibility(t); + bits = binOp(bits, t.bits, Bit::and); + return this; + } + + @Override + public BitVectorMutator or(BitVector t) + { + checkCompatibility(t); + bits = binOp(bits, t.bits, Bit::or); + return this; + } + + @Override + public BitVectorMutator xor(BitVector t) + { + checkCompatibility(t); + bits = binOp(bits, t.bits, Bit::xor); + return this; + } + + @Override + public BitVectorMutator not() + { + unOp(bits, Bit::not); + return this; + } + + /** + * Set the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) + */ + public void setMSBit(int bitIndex, Bit bit) + { + if (bits == null) + throw new IllegalStateException("cannot set a bit of an empty mutator"); + bits[bitIndex] = bit; + } + + /** + * Set the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) + */ + public void setLSBit(int bitIndex, Bit bit) + { + if (bits == null) + throw new IllegalStateException("cannot set a bit of an empty mutator"); + bits[bits.length - bitIndex - 1] = bit; + } + + /** + * Returns the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) + */ + public Bit getMSBit(int bitIndex) + { + if (bits == null) + throw new IllegalStateException("cannot get a bit of an empty mutator"); + return bits[bitIndex]; + } + + /** + * Returns the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) + */ + public Bit getLSBit(int bitIndex) + { + if (bits == null) + throw new IllegalStateException("cannot get a bit of an empty mutator"); + return bits[bits.length - bitIndex - 1]; + } + + public int length() + { + if (bits == null) + throw new IllegalStateException("cannot obtain a length of an empty mutator"); + return bits.length; + } + + private void checkCompatibility(BitVector bv) + { + if (bits != null && bits.length != bv.length()) + throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", bits.length, bv.length())); + } + } + + /** + * @see Arrays#hashCode(Object[]) + */ + @Override + public int hashCode() + { + return Arrays.hashCode(bits); + } + + /** + * Does test for equality of values/content + * + * @see Object#equals(Object) + */ + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof BitVector)) + return false; + BitVector other = (BitVector) obj; + return Arrays.equals(bits, other.bits); + } + + /** + * Does test for equality of values/content, shifting the other BitVector by offset to the right.
+ * Therefore offset + other.length() <= this.wdith() needs to be true. + * + * @throws ArrayIndexOutOfBoundsException if offset + other.length() > this.length() + * + * @see Object#equals(Object) + */ + public boolean equalsWithOffset(BitVector other, int offset) + { + if (other == null) + return false; + return Arrays.equals(bits, offset, offset + other.length(), other.bits, 0, other.length()); + } + + /** + * All {@link Bit}s symbols concatenated together (MSB first) + * + * @see #parse(String) + */ + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(bits.length); + for (Bit bit : bits) + sb.append(bit); + return sb.toString(); + } + + /** + * Returns the value of the BitVector as BigInteger. + * + * @throws NumberFormatException if the BitVector is not {@link #isBinary() binary}. + */ + public BigInteger getUnsignedValue() + { + if (!isBinary()) + throw new NumberFormatException(this + " is not binary"); + byte[] bytes = new byte[(bits.length / 8 + (bits.length % 8 == 0 ? 0 : 1)) + 1]; + for (int i = bits.length - 1; i >= 0; i--) + { + if (Bit.ONE == bits[bits.length - i - 1]) + { + try + { + bytes[bytes.length - (i / 8) - 1] |= 1 << (i % 8); + } + catch (IndexOutOfBoundsException e) + { + e.printStackTrace(); + } + } + } + return new BigInteger(bytes); + } + + public long getUnsignedValueLong() + { + return getUnsignedValue().longValue(); + } + + /** + * Returns the value of the BitVector as BigInteger interpreted as a two's complement number. + * + * @throws NumberFormatException if the BitVector is not {@link #isBinary() binary}. + * + * @author Daniel Kirschten + */ + public BigInteger getSignedValue() + { + BigInteger unsignedValue = getUnsignedValue(); + if (bits[bits.length - 1] == Bit.ZERO) + return unsignedValue; + return unsignedValue.subtract(BitVector.of(Bit.ONE, bits.length).getUnsignedValue()).subtract(BigInteger.ONE);// TODO speed this up! + } + + public long getSignedValueLong() + { + return getSignedValue().longValue(); + } + + /** + * Parses a String containing solely {@link Bit} symbols (MSB first) + * + * @see #toString() + */ + public static BitVector parse(String s) + { + Bit[] values = new Bit[s.length()]; + for (int i = 0; i < s.length(); i++) + { + values[i] = Bit.parse(s, i); + } + return new BitVector(values); + } + + /** + * Changes a single Bit using the given operation. This can be used to set, clear or flip bits. + * + * @param msbIndex index of the MSB to be changed + * @param singleBitOperation the operation to perform on that Bit + * @return the resulting, new BitVektor + */ + public BitVector withBitChanged(int msbIndex, UnaryOperator singleBitOperation) + { + Bit[] newBits = bits.clone(); + newBits[msbIndex] = singleBitOperation.apply(newBits[msbIndex]); + return new BitVector(newBits); + } + + /** + * Iterate over the {@link Bit}s of the BitVector from MSB to LSB (left to right). + */ + @Override + public Iterator iterator() + { + return new Iterator<>() + { + private int pos = 0; + + @Override + public Bit next() + { + if (!hasNext()) + throw new NoSuchElementException(); + return getMSBit(pos++); + } + + @Override + public boolean hasNext() + { + return pos != length(); + } + }; + } + + public BitVector reverse() + { + int length = length(); + Bit[] other = new Bit[length]; + for (int i = 0, j = length - 1; i < length; i++, j--) + { + other[i] = bits[j]; + } + return new BitVector(other); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java new file mode 100644 index 00000000..5f645a2e --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java @@ -0,0 +1,54 @@ +package net.mograsim.logic.core.types; + +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorDefinition.BuiltInColor; +import net.mograsim.preferences.Preferences; + +public class BitVectorFormatter +{ + public static String formatValueAsString(ReadEnd end) + { + return formatAsString(end == null ? null : end.getValues()); + } + + public static String formatAsString(BitVector bitVector) + { + if (bitVector == null) + return "null"; + return bitVector.toString(); + } + + // TODO doesn't this belong to logic.model? + public static ColorDefinition formatAsColor(ReadEnd end) + { + return formatAsColor(end == null ? null : end.getValues()); + } + + public static ColorDefinition formatAsColor(BitVector bitVector) + { + // TODO maybe find a color assignment for multiple-bit bit vectors? + if (bitVector == null || bitVector.length() != 1) + return new ColorDefinition(BuiltInColor.COLOR_BLACK); + switch (bitVector.getLSBit(0)) + { + case ONE: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.one"); + case U: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.u"); + case X: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.x"); + case Z: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.z"); + case ZERO: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.zero"); + default: + throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getLSBit(0)); + } + } + + private BitVectorFormatter() + { + throw new UnsupportedOperationException("No BitVectorFormatter instances"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java new file mode 100644 index 00000000..39ae6816 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java @@ -0,0 +1,130 @@ +package net.mograsim.logic.core.types; + +/** + * Interface for types that support the basic logic operations + * + * @author Christian Femers + * + * @param the logic type itself, to make the operations closed in T + * @param the operand type, may be the same as T, see {@link StrictLogicType} + */ +public interface LogicType, S> +{ + /** + * Determines the result when two signals meet each other directly, also called resolution (IEEE 1164) + * + * For example: + * + *

+	 * 0 joined 0 == 0
+	 * 1 joined 0 == X
+	 * 0 joined 1 == X
+	 * 1 joined 1 == 1
+	 * 
+ * + * @param t the second logic signal + * @return the resulting value + * @author Christian Femers + */ + T join(S t); + + /** + * Classical logic AND + * + * For example: + * + *
+	 * 0 AND 0 == 0
+	 * 1 AND 0 == 0
+	 * 0 AND 1 == 0
+	 * 1 AND 1 == 1
+	 * 
+ * + * @param t the second logic signal + * @return the resulting value + * @author Christian Femers + */ + T and(S t); + + /** + * Classical logic OR + * + * For example: + * + *
+	 * 0 OR 0 == 0
+	 * 1 OR 0 == 1
+	 * 0 OR 1 == 1
+	 * 1 OR 1 == 1
+	 * 
+ * + * @param t the second logic signal + * @return the resulting value + * @author Christian Femers + */ + T or(S t); + + /** + * Classical logic XOR (exclusive OR) + * + * For example: + * + *
+	 * 0 XOR 0 == 0
+	 * 1 XOR 0 == 1
+	 * 0 XOR 1 == 1
+	 * 1 XOR 1 == 0
+	 * 
+ * + * @param t the second logic signal + * @return the resulting value + * @author Christian Femers + */ + T xor(S t); + + /** + * Classical logic NOT (logical negation) + * + * For example: + * + *
+	 * NOT 0 == 1
+	 * NOT 1 == 0
+	 * 
+ * + * @return the resulting value + * @author Christian Femers + */ + T not(); + + /** + * {@link #and(Object) AND} and then {@link #not() NOT} + * + * @author Christian Femers + */ + default T nand(S t) + { + return and(t).not(); + } + + /** + * {@link #or(Object) OR} and then {@link #not() NOT} + * + * @author Christian Femers + */ + default T nor(S t) + { + return or(t).not(); + } + + /** + * {@link #xor(Object) XOR} and then {@link #not() NOT}
+ * Used to determine equality (alias parity, consistency) + * + * @author Christian Femers + */ + default T xnor(S t) + { + return xor(t).not(); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java new file mode 100644 index 00000000..1fdae21c --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java @@ -0,0 +1,11 @@ +package net.mograsim.logic.core.types; + +import java.util.function.BiFunction; + +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; + +@FunctionalInterface +public interface MutationOperation extends BiFunction +{ + // no changes necessary, only for convenience and readability +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java new file mode 100644 index 00000000..c830b586 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.types; + +/** + * Interface for types that support the basic logic operations only among themselves, making it mathematically closed + * + * @author Christian Femers + * @see LogicType + * + * @param the logic type itself to make the operations closed + */ +public interface StrictLogicType> extends LogicType +{ + // this is just a matter of type parameters +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java new file mode 100644 index 00000000..13f54a01 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java @@ -0,0 +1,662 @@ +package net.mograsim.logic.core.wires; + +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.Z; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; + +/** + * Represents an array of wires that can store n bits of information. + * + * @author Fabian Stemmler + * + */ +public class CoreWire +{ + public final String name; + private BitVector cachedValues; + public final int travelTime; + private List attached = new ArrayList<>(); + public final int width; + List inputs = new ArrayList<>(); + Timeline timeline; + private Bit[] bitsWithoutFusions; + FusedBit[] fusedBits; + + public CoreWire(Timeline timeline, int width, int travelTime) + { + this(timeline, width, travelTime, null); + } + + public CoreWire(Timeline timeline, int width, int travelTime, String name) + { + if (width < 1) + throw new IllegalArgumentException( + String.format("Tried to create an array of wires with width %d, but a width of less than 1 makes no sense.", width)); + this.name = name; + this.timeline = timeline; + this.width = width; + this.travelTime = travelTime; + initValues(); + } + + private void initValues() + { + cachedValues = U.toVector(width); + bitsWithoutFusions = cachedValues.getBits(); + } + + private void setNewValues(BitVector newValues) + { + cachedValues = newValues; + notifyObservers(); + } + + private void invalidateCachedValuesForAllFusedWires() + { + invalidateCachedValues(); + if (fusedBits != null) + for (FusedBit fusion : fusedBits) + if (fusion != null) + fusion.invalidateCachedValuesForAllParticipatingWires(); + } + + private void invalidateCachedValues() + { + cachedValues = null; + notifyObservers(); + } + + void recalculateValuesWithoutFusions() + { + Bit[] bits = new Bit[width]; + if (inputs.isEmpty()) + Arrays.fill(bits, U); + else + { + System.arraycopy(inputs.get(0).getInputValues().getBits(), 0, bits, 0, width); + for (int i = 1; i < inputs.size(); i++) + Bit.join(bits, inputs.get(i).getInputValues().getBits()); + } + bitsWithoutFusions = bits; + if (fusedBits == null) + setNewValues(BitVector.of(bits)); + else + invalidateCachedValuesForAllFusedWires(); + } + + private void recalculatedCachedValues() + { + Bit[] bits; + if (fusedBits == null) + bits = bitsWithoutFusions; + else + { + bits = new Bit[width]; + for (int i = 0; i < width; i++) + { + FusedBit fusion = fusedBits[i]; + if (fusion == null) + bits[i] = bitsWithoutFusions[i]; + else + bits[i] = fusion.getValue(); + } + } + cachedValues = BitVector.of(bits); + } + + /** + * Forces a Wire to take on specific values. If the new values differ from the old ones, the observers of the Wire will be notified. + * WARNING! Use this with care! The preferred way of writing the values is ReadWriteEnd.feedSignals(BitVector) + * + * @param values The values the Wire will have immediately after this method is called + */ + public void forceValues(BitVector values) + { + bitsWithoutFusions = values.getBits(); + invalidateCachedValuesForAllFusedWires(); + notifyObservers(); + } + + /** + * Returns the least significant bit (LSB) + */ + public Bit getValue() + { + return getValue(0); + } + + /** + * Returns the least significant bit (LSB) of the given index + */ + public Bit getValue(int index) + { + return getValues().getLSBit(index); + } + + public BitVector getValues(int start, int end) + { + return getValues().subVector(start, end); + } + + public BitVector getValues() + { + if (cachedValues == null) + recalculatedCachedValues(); + return cachedValues; + } + + /** + * Adds an {@link LogicObserver}, who will be notified when the value of the {@link CoreWire} is updated. + * + * @param ob The {@link LogicObserver} to be notified of changes. + * @return true if the given {@link LogicObserver} was not already registered, false otherwise + * + * @author Fabian Stemmler + */ + boolean attachEnd(ReadEnd end) + { + return attached.add(end); + } + + void detachEnd(ReadEnd end) + { + attached.remove(end); + } + + private void notifyObservers() + { + attached.forEach(ReadEnd::update); + } + + /** + * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link CoreWire}. This {@link ReadWriteEnd} can be written + * to. + */ + public ReadWriteEnd createReadWriteEnd() + { + return new ReadWriteEnd(); + } + + /** + * Create a {@link ReadEnd} object, which is tied to this {@link CoreWire}. This {@link ReadEnd} cannot be written to. + */ + public ReadEnd createReadOnlyEnd() + { + return new ReadEnd(); + } + + void registerInput(ReadWriteEnd toRegister) + { + inputs.add(toRegister); + recalculateValuesWithoutFusions(); + } + + /** + * A {@link ReadEnd} feeds a constant signal into the {@link CoreWire} it is tied to. The combination of all inputs determines the + * {@link CoreWire}s final value. X dominates all other inputs Z does not affect the final value, unless there are no other inputs than + * Z 0 and 1 turn into X when they are mixed + * + * @author Fabian Stemmler + */ + public class ReadEnd implements LogicObservable + { + private List observers = new ArrayList<>(); + + ReadEnd() + { + super(); + CoreWire.this.attachEnd(this); + } + + public void update() + { + notifyObservers(); + } + + /** + * Included for convenient use on {@link CoreWire}s of width 1. + * + * @return The value of bit 0. + * + * @author Fabian Stemmler + */ + public Bit getValue() + { + return CoreWire.this.getValue(); + } + + /** + * @param index Index of the requested bit. + * @return The value of the indexed bit. + * + * @author Fabian Stemmler + */ + public Bit getValue(int index) + { + return CoreWire.this.getValue(index); + } + + public BitVector getValues() + { + return CoreWire.this.getValues(); + } + + /** + * @param start Start of the wanted segment. (inclusive) + * @param end End of the wanted segment. (exclusive) + * @return The values of the segment of {@link Bit}s indexed. + * + * @author Fabian Stemmler + */ + public BitVector getValues(int start, int end) + { + return CoreWire.this.getValues(start, end); + } + + @Override + public String toString() + { + return CoreWire.this.toString(); + } + + public void close() + { + inputs.remove(this); + detachEnd(this); + recalculateValuesWithoutFusions(); + } + + public int width() + { + return width; + } + + public CoreWire getWire() + { + return CoreWire.this; + } + + @Override + public void registerObserver(LogicObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(LogicObserver ob) + { + observers.remove(ob); + } + +// void registerCloseObserver(LogicObserver ob) +// { +// closeObserver.add(ob); +// } +// +// void deregisterCloseObserver(LogicObserver ob) +// { +// closeObserver.remove(ob); +// } + + @Override + public void notifyObservers() + { + observers.forEach(ob -> ob.update(this)); + } + } + + public class ReadWriteEnd extends ReadEnd + { + private boolean open; + private boolean isWriting; + private BitVector inputValues; + + ReadWriteEnd() + { + super(); + open = true; + isWriting = true; + initValues(); + registerInput(this); + } + + private void initValues() + { + inputValues = U.toVector(width); + } + + /** + * Sets the wires values. This takes up time, as specified by the {@link CoreWire}s travel time. + * + * @param newValues The new values the wires should take on. + * + * @author Fabian Stemmler + */ + public void feedSignals(Bit... newValues) + { + feedSignals(BitVector.of(newValues)); + } + + // TODO what if this is called multiple times at the same simulation time? (happens in component unit tests) + public void feedSignals(BitVector newValues) + { + if (newValues.length() != width) + throw new IllegalArgumentException( + String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), width)); + if (!open) + throw new IllegalStateException("Attempted to write to closed WireArrayEnd."); + timeline.addEvent(e -> setValues(newValues), travelTime); + } + + /** + * Sets values of a subarray of wires. This takes up time, as specified by the {@link CoreWire}s travel time. + * + * @param bitVector The new values the wires should take on. + * @param startingBit The first index of the subarray of wires. + * + * @author Fabian Stemmler + */ + public void feedSignals(int startingBit, BitVector bitVector) + { + if (!open) + throw new IllegalStateException("Attempted to write to closed WireArrayEnd."); + timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime); + } + + /** + * Sets the values that are being fed into the {@link CoreWire}. The preferred way of setting {@link ReadWriteEnd} values is via + * feedValues(...) with a delay. + */ + void setValues(int startingBit, BitVector newValues) + { + // index check covered in equals + if (!inputValues.equalsWithOffset(newValues, startingBit)) + { + Bit[] vals = inputValues.getBits(); + System.arraycopy(newValues.getBits(), 0, vals, startingBit, newValues.length()); + inputValues = BitVector.of(vals); + CoreWire.this.recalculateValuesWithoutFusions(); + } + } + + /** + * Sets the values that are being fed into the {@link CoreWire}. The preferred way of setting {@link ReadWriteEnd} values is via + * feedValues(...) with a delay. + */ + void setValues(BitVector newValues) + { + if (inputValues.equals(newValues)) + return; + inputValues = newValues; + CoreWire.this.recalculateValuesWithoutFusions(); + } + + /** + * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link CoreWire}.Returns the least + * significant bit (LSB) + */ + public Bit getInputValue() + { + return getInputValue(0); + } + + /** + * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link CoreWire} at the indexed {@link Bit}. + * Returns the least significant bit (LSB) + * + */ + public Bit getInputValue(int index) + { + return inputValues.getLSBit(index); + } + + /** + * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link CoreWire}. + */ + public BitVector getInputValues() + { + return inputValues; + } + + public BitVector getInputValues(int start, int end) + { + return inputValues.subVector(start, end); + } + + /** + * {@link ReadEnd} now feeds Z into the associated {@link CoreWire}. + */ + public void clearSignals() + { + feedSignals(Z.toVector(width)); + } + + public BitVector wireValuesExcludingMe() + { + BitVectorMutator mutator = BitVectorMutator.empty(); + boolean modified = false; + for (ReadWriteEnd wireEnd : inputs) + { + if (wireEnd == this) + continue; + modified = true; + mutator.join(wireEnd.inputValues); + } + if (!modified) + mutator.join(BitVector.of(Bit.Z, width)); + return mutator.toBitVector(); + } + + @Override + public String toString() + { + return inputValues.toString(); + } + + @Override + public void close() + { + super.close(); + open = false; + } + + void setWriting(boolean isWriting) + { + if (this.isWriting != isWriting) + { + this.isWriting = isWriting; + if (isWriting) + inputs.add(this); + else + inputs.remove(this); + CoreWire.this.recalculateValuesWithoutFusions(); + } + } + + boolean isWriting() + { + return isWriting; + } + } + + @Override + public String toString() + { + String name = this.name == null ? String.format("0x%08x", hashCode()) : this.name; + return String.format("wire %s value: %s inputs: %s", name, getValues(), inputs); + } + + public static ReadEnd[] extractEnds(CoreWire[] w) + { + ReadEnd[] inputs = new ReadEnd[w.length]; + for (int i = 0; i < w.length; i++) + inputs[i] = w[i].createReadWriteEnd(); + return inputs; + } + + /** + * + * Fuses two wires together. If the bits change in one Wire, the other is changed accordingly immediately. Warning: The bits are + * permanently fused together. + * + * @param a The {@link CoreWire} to be fused with b + * @param b The {@link CoreWire} to be fused with a + */ + public static void fuse(CoreWire a, CoreWire b) + { + fuse(a, b, 0, 0, a.width); + } + + /** + * Fuses the selected bits of two wires together. If the bits change in one Wire, the other is changed accordingly immediately. Warning: + * The bits are permanently fused together. + * + * @param a The {@link CoreWire} to be (partially) fused with b + * @param b The {@link CoreWire} to be (partially) fused with a + * @param fromA The first bit of {@link CoreWire} a to be fused + * @param fromB The first bit of {@link CoreWire} b to be fused + * @param width The amount of bits to fuse + */ + public static void fuse(CoreWire a, CoreWire b, int fromA, int fromB, int width) + { + // iterate in this direction to be fail-fast (rely on the checks in fuse(Wire, Wire, int, int) + for (int i = width - 1; i >= 0; i--) + fuse(a, b, fromA + i, fromB + i); + } + + /** + * Fuses one bit of two wires together. If this bit changes in one Wire, the other is changed accordingly immediately. Warning: The bits + * are permanently fused together. + * + * @param a The {@link CoreWire} to be (partially) fused with b + * @param b The {@link CoreWire} to be (partially) fused with a + * @param bitA The bit of {@link CoreWire} a to be fused + * @param bitB The bit of {@link CoreWire} b to be fused + */ + public static void fuse(CoreWire a, CoreWire b, int bitA, int bitB) + { + if (bitA >= a.width) + throw new IllegalArgumentException("No bit " + bitA + " in " + a + " (width " + a.width + ")"); + if (bitB >= b.width) + throw new IllegalArgumentException("No bit " + bitB + " in " + b + " (width " + b.width + ")"); + if (a.fusedBits == null) + a.fusedBits = new FusedBit[a.width]; + if (b.fusedBits == null) + b.fusedBits = new FusedBit[b.width]; + FusedBit oldFusionA = a.fusedBits[bitA]; + FusedBit oldFusionB = b.fusedBits[bitB]; + if (oldFusionA == null) + if (oldFusionB == null) + { + FusedBit fusion = new FusedBit(); + fusion.addParticipatingWireBit(a, bitA); + fusion.addParticipatingWireBit(b, bitB); + } else + oldFusionB.addParticipatingWireBit(a, bitA); + else if (oldFusionB == null) + oldFusionA.addParticipatingWireBit(b, bitB); + else + oldFusionA.mergeOtherIntoThis(oldFusionB); + } + + private static class FusedBit + { + private final Set participatingWireBits; + + public FusedBit() + { + this.participatingWireBits = new HashSet<>(); + } + + public void addParticipatingWireBit(CoreWire w, int bit) + { + addParticipatingWireBit(new WireBit(w, bit)); + } + + private void addParticipatingWireBit(WireBit wb) + { + wb.wire.fusedBits[wb.bit] = this; + participatingWireBits.add(wb); + wb.wire.invalidateCachedValuesForAllFusedWires(); + } + + public void mergeOtherIntoThis(FusedBit other) + { + for (WireBit wb : other.participatingWireBits) + addParticipatingWireBit(wb); + } + + public void invalidateCachedValuesForAllParticipatingWires() + { + for (WireBit wb : participatingWireBits) + wb.wire.invalidateCachedValues(); + } + + public Bit getValue() + { + Bit result = null; + for (WireBit wb : participatingWireBits) + if (!wb.wire.inputs.isEmpty()) + { + Bit bit = wb.wire.bitsWithoutFusions[wb.bit]; + result = result == null ? bit : result.join(bit); + } + return result == null ? U : result; + } + } + + private static class WireBit + { + public final CoreWire wire; + public final int bit; + + public WireBit(CoreWire wire, int bit) + { + this.wire = wire; + this.bit = bit; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + bit; + result = prime * result + ((wire == null) ? 0 : wire.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + WireBit other = (WireBit) obj; + if (bit != other.bit) + return false; + if (wire == null) + { + if (other.wire != null) + return false; + } else if (!wire.equals(other.wire)) + return false; + return true; + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/.classpath b/plugins/net.mograsim.logic.model.am2900/.classpath new file mode 100644 index 00000000..34786681 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/net.mograsim.logic.model.am2900/.project b/plugins/net.mograsim.logic.model.am2900/.project new file mode 100644 index 00000000..494b451f --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.project @@ -0,0 +1,30 @@ + + + net.mograsim.logic.model.am2900 + + + net.mograsim.logic.model + SWTZoomableCanvas + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.logic.model.am2900/Am2904Testbench.json b/plugins/net.mograsim.logic.model.am2900/Am2904Testbench.json new file mode 100644 index 00000000..c7bec19f --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/Am2904Testbench.json @@ -0,0 +1,2341 @@ +{ + "width": 0.0, + "height": 0.0, + "interfacePins": [], + "innerScale": 1.0, + "submodel": { + "components": [ + { + "id": "Am2904", + "name": "Am2904#0", + "pos": { + "x": 220.0, + "y": 175.0 + } + }, + { + "id": "BitDisplay", + "name": "BitDisplay#0", + "pos": { + "x": 391.0, + "y": 150.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#1", + "pos": { + "x": 391.0, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#2", + "pos": { + "x": 391.0, + "y": 180.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#3", + "pos": { + "x": 391.0, + "y": 195.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#4", + "pos": { + "x": 365.0, + "y": 240.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#5", + "pos": { + "x": 365.0, + "y": 275.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#6", + "pos": { + "x": 365.0, + "y": 370.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#7", + "pos": { + "x": 365.0, + "y": 385.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#8", + "pos": { + "x": 365.0, + "y": 330.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#9", + "pos": { + "x": 365.0, + "y": 315.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#0", + "pos": { + "x": 255.0, + "y": 152.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#1", + "pos": { + "x": 170.0, + "y": 82.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#10", + "pos": { + "x": 160.0, + "y": 247.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#11", + "pos": { + "x": 160.0, + "y": 217.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#12", + "pos": { + "x": 160.0, + "y": 202.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#13", + "pos": { + "x": 60.0, + "y": 132.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#14", + "pos": { + "x": 165.0, + "y": 287.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#15", + "pos": { + "x": 140.0, + "y": 317.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#16", + "pos": { + "x": 140.0, + "y": 332.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#17", + "pos": { + "x": 140.0, + "y": 387.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#18", + "pos": { + "x": 140.0, + "y": 372.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#19", + "pos": { + "x": 140.0, + "y": 357.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#2", + "pos": { + "x": 170.0, + "y": 112.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#20", + "pos": { + "x": 140.0, + "y": 302.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#21", + "pos": { + "x": 55.0, + "y": 142.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#22", + "pos": { + "x": 60.0, + "y": 152.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#23", + "pos": { + "x": 60.0, + "y": 172.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#24", + "pos": { + "x": 55.0, + "y": 162.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#25", + "pos": { + "x": 55.0, + "y": 182.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#26", + "pos": { + "x": 60.0, + "y": 192.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#27", + "pos": { + "x": 60.0, + "y": 232.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#28", + "pos": { + "x": 55.0, + "y": 202.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#29", + "pos": { + "x": 55.0, + "y": 222.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#3", + "pos": { + "x": 55.0, + "y": 122.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#30", + "pos": { + "x": 60.0, + "y": 212.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#31", + "pos": { + "x": 55.0, + "y": 242.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#32", + "pos": { + "x": 300.0, + "y": 107.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#33", + "pos": { + "x": 300.0, + "y": 137.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#34", + "pos": { + "x": 300.0, + "y": 92.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#35", + "pos": { + "x": 300.0, + "y": 122.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#36", + "pos": { + "x": 300.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#37", + "pos": { + "x": 165.0, + "y": 270.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#38", + "pos": { + "x": 385.0, + "y": 220.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#4", + "pos": { + "x": 170.0, + "y": 127.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#5", + "pos": { + "x": 170.0, + "y": 142.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#6", + "pos": { + "x": 170.0, + "y": 157.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#7", + "pos": { + "x": 155.0, + "y": 172.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#8", + "pos": { + "x": 155.0, + "y": 187.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#9", + "pos": { + "x": 160.0, + "y": 232.5 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Merger#0", + "pos": { + "x": 85.0, + "y": 130.0 + }, + "params": { + "logicWidth": 13, + "orientation": "LEFT" + } + }, + { + "id": "TextComponent", + "name": "TextComponent#0", + "pos": { + "x": 140.0, + "y": 110.0 + }, + "params": "IZ" + }, + { + "id": "TextComponent", + "name": "TextComponent#1", + "pos": { + "x": 140.0, + "y": 125.0 + }, + "params": "IC" + }, + { + "id": "TextComponent", + "name": "TextComponent#10", + "pos": { + "x": 35.0, + "y": 240.0 + }, + "params": "I0" + }, + { + "id": "TextComponent", + "name": "TextComponent#11", + "pos": { + "x": 35.0, + "y": 120.0 + }, + "params": "I12" + }, + { + "id": "TextComponent", + "name": "TextComponent#12", + "pos": { + "x": 35.0, + "y": 220.0 + }, + "params": "I2" + }, + { + "id": "TextComponent", + "name": "TextComponent#13", + "pos": { + "x": 40.0, + "y": 190.0 + }, + "params": "I5" + }, + { + "id": "TextComponent", + "name": "TextComponent#14", + "pos": { + "x": 40.0, + "y": 230.0 + }, + "params": "I1" + }, + { + "id": "TextComponent", + "name": "TextComponent#15", + "pos": { + "x": 40.0, + "y": 210.0 + }, + "params": "I3" + }, + { + "id": "TextComponent", + "name": "TextComponent#16", + "pos": { + "x": 35.0, + "y": 200.0 + }, + "params": "I4" + }, + { + "id": "TextComponent", + "name": "TextComponent#17", + "pos": { + "x": 35.0, + "y": 180.0 + }, + "params": "I6" + }, + { + "id": "TextComponent", + "name": "TextComponent#18", + "pos": { + "x": 40.0, + "y": 170.0 + }, + "params": "I7" + }, + { + "id": "TextComponent", + "name": "TextComponent#19", + "pos": { + "x": 35.0, + "y": 160.0 + }, + "params": "I8" + }, + { + "id": "TextComponent", + "name": "TextComponent#2", + "pos": { + "x": 140.0, + "y": 140.0 + }, + "params": "IN" + }, + { + "id": "TextComponent", + "name": "TextComponent#20", + "pos": { + "x": 40.0, + "y": 150.0 + }, + "params": "I9" + }, + { + "id": "TextComponent", + "name": "TextComponent#21", + "pos": { + "x": 35.0, + "y": 140.0 + }, + "params": "I10" + }, + { + "id": "TextComponent", + "name": "TextComponent#22", + "pos": { + "x": 40.0, + "y": 130.0 + }, + "params": "I11" + }, + { + "id": "TextComponent", + "name": "TextComponent#23", + "pos": { + "x": 145.0, + "y": 285.0 + }, + "params": "CX" + }, + { + "id": "TextComponent", + "name": "TextComponent#24", + "pos": { + "x": 150.0, + "y": 80.0 + }, + "params": "C" + }, + { + "id": "TextComponent", + "name": "TextComponent#25", + "pos": { + "x": 225.0, + "y": 150.0 + }, + "params": "_OEY" + }, + { + "id": "TextComponent", + "name": "TextComponent#26", + "pos": { + "x": 416.0, + "y": 150.0 + }, + "params": "YZ" + }, + { + "id": "TextComponent", + "name": "TextComponent#27", + "pos": { + "x": 416.0, + "y": 165.0 + }, + "params": "YC" + }, + { + "id": "TextComponent", + "name": "TextComponent#28", + "pos": { + "x": 416.0, + "y": 180.0 + }, + "params": "YN" + }, + { + "id": "TextComponent", + "name": "TextComponent#29", + "pos": { + "x": 416.0, + "y": 195.0 + }, + "params": "YOVR" + }, + { + "id": "TextComponent", + "name": "TextComponent#3", + "pos": { + "x": 140.0, + "y": 155.0 + }, + "params": "IOVR" + }, + { + "id": "TextComponent", + "name": "TextComponent#30", + "pos": { + "x": 390.0, + "y": 240.0 + }, + "params": "CT" + }, + { + "id": "TextComponent", + "name": "TextComponent#31", + "pos": { + "x": 390.0, + "y": 275.0 + }, + "params": "C0" + }, + { + "id": "TextComponent", + "name": "TextComponent#32", + "pos": { + "x": 390.0, + "y": 315.0 + }, + "params": "SIOn" + }, + { + "id": "TextComponent", + "name": "TextComponent#33", + "pos": { + "x": 390.0, + "y": 330.0 + }, + "params": "QIOn" + }, + { + "id": "TextComponent", + "name": "TextComponent#34", + "pos": { + "x": 390.0, + "y": 370.0 + }, + "params": "SIO0" + }, + { + "id": "TextComponent", + "name": "TextComponent#35", + "pos": { + "x": 390.0, + "y": 385.0 + }, + "params": "QIO0" + }, + { + "id": "TextComponent", + "name": "TextComponent#36", + "pos": { + "x": 30.0, + "y": 300.0 + }, + "params": "enable S/QIOn input" + }, + { + "id": "TextComponent", + "name": "TextComponent#37", + "pos": { + "x": 30.0, + "y": 355.0 + }, + "params": "enable S/QIO0 input" + }, + { + "id": "TextComponent", + "name": "TextComponent#38", + "pos": { + "x": 110.0, + "y": 385.0 + }, + "params": "QIO0" + }, + { + "id": "TextComponent", + "name": "TextComponent#39", + "pos": { + "x": 110.0, + "y": 370.0 + }, + "params": "SIO0" + }, + { + "id": "TextComponent", + "name": "TextComponent#4", + "pos": { + "x": 115.0, + "y": 170.0 + }, + "params": "_CEM" + }, + { + "id": "TextComponent", + "name": "TextComponent#40", + "pos": { + "x": 110.0, + "y": 315.0 + }, + "params": "SIOn" + }, + { + "id": "TextComponent", + "name": "TextComponent#41", + "pos": { + "x": 110.0, + "y": 330.0 + }, + "params": "QIOn" + }, + { + "id": "TextComponent", + "name": "TextComponent#42", + "pos": { + "x": 270.0, + "y": 135.0 + }, + "params": "YOVR" + }, + { + "id": "TextComponent", + "name": "TextComponent#43", + "pos": { + "x": 270.0, + "y": 120.0 + }, + "params": "YN" + }, + { + "id": "TextComponent", + "name": "TextComponent#44", + "pos": { + "x": 270.0, + "y": 90.0 + }, + "params": "YZ" + }, + { + "id": "TextComponent", + "name": "TextComponent#45", + "pos": { + "x": 270.0, + "y": 105.0 + }, + "params": "YC" + }, + { + "id": "TextComponent", + "name": "TextComponent#46", + "pos": { + "x": 220.0, + "y": 75.0 + }, + "params": "enable Y input" + }, + { + "id": "TextComponent", + "name": "TextComponent#47", + "pos": { + "x": 145.0, + "y": 270.0 + }, + "params": "_SE" + }, + { + "id": "TextComponent", + "name": "TextComponent#48", + "pos": { + "x": 350.0, + "y": 220.0 + }, + "params": "_OECT" + }, + { + "id": "TextComponent", + "name": "TextComponent#5", + "pos": { + "x": 115.0, + "y": 185.0 + }, + "params": "_CEmu" + }, + { + "id": "TextComponent", + "name": "TextComponent#6", + "pos": { + "x": 125.0, + "y": 200.0 + }, + "params": "_EZ" + }, + { + "id": "TextComponent", + "name": "TextComponent#7", + "pos": { + "x": 125.0, + "y": 215.0 + }, + "params": "_EC" + }, + { + "id": "TextComponent", + "name": "TextComponent#8", + "pos": { + "x": 125.0, + "y": 230.0 + }, + "params": "_EN" + }, + { + "id": "TextComponent", + "name": "TextComponent#9", + "pos": { + "x": 125.0, + "y": 245.0 + }, + "params": "_EOVR" + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 175.0, + "y": 315.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#1", + "pos": { + "x": 175.0, + "y": 330.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#2", + "pos": { + "x": 175.0, + "y": 385.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#3", + "pos": { + "x": 175.0, + "y": 370.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#4", + "pos": { + "x": 335.0, + "y": 105.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#5", + "pos": { + "x": 335.0, + "y": 90.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#6", + "pos": { + "x": 335.0, + "y": 120.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#7", + "pos": { + "x": 335.0, + "y": 135.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 184.0, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 184.0, + "y": 309.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 369.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 374.0, + "y": 189.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 379.0, + "y": 199.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 209.0, + "y": 324.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 214.0, + "y": 339.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 354.0, + "y": 379.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 359.0, + "y": 389.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 344.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 359.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 359.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 364.0, + "y": 159.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "ManualSwitch#0", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OEY" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 280.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "C" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 215.0, + "y": 90.0 + }, + { + "x": 215.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "ManualSwitch#10", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 205.0, + "y": 220.0 + }, + { + "x": 205.0, + "y": 255.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#9", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EN" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 200.0, + "y": 240.0 + }, + { + "x": 200.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "I" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 105.0, + "y": 190.0 + }, + { + "x": 105.0, + "y": 265.0 + }, + { + "x": 210.0, + "y": 265.0 + }, + { + "x": 210.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "Cx" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 200.0, + "y": 295.0 + }, + { + "x": 200.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "YOVR" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YN" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 375.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#1", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "YZ" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 365.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "CT" + }, + "pin2": { + "compName": "BitDisplay#4", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 345.0, + "y": 235.0 + }, + { + "x": 345.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "C0" + }, + "pin2": { + "compName": "BitDisplay#5", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#2", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IZ" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 210.0, + "y": 120.0 + }, + { + "x": 210.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "SIOn" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 210.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "QIOn" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 215.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#1", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#15", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#16", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "IN" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "IN" + }, + "pin2": { + "compName": "ManualSwitch#17", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#18", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "IN" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "EN" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IC" + }, + "pin2": { + "compName": "ManualSwitch#4", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 205.0, + "y": 190.0 + }, + { + "x": 205.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "EN" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 200.0, + "y": 365.0 + }, + { + "x": 200.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#20", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "EN" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 200.0, + "y": 310.0 + }, + { + "x": 200.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#9", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 210.0, + "y": 375.0 + }, + { + "x": 345.0, + "y": 375.0 + }, + { + "x": 345.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "BitDisplay#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 350.0, + "y": 340.0 + }, + { + "x": 350.0, + "y": 380.0 + }, + { + "x": 215.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 210.0, + "y": 380.0 + }, + { + "x": 210.0, + "y": 385.0 + }, + { + "x": 355.0, + "y": 385.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "OUT" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 210.0, + "y": 390.0 + }, + { + "x": 210.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#7", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 360.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "BitDisplay#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#5", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IN" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 200.0, + "y": 150.0 + }, + { + "x": 200.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "SIO0" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 355.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "QIO0" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 360.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#3", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O12" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O11" + }, + "pin2": { + "compName": "ManualSwitch#13", + "pinName": "" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#21", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O10" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O9" + }, + "pin2": { + "compName": "ManualSwitch#22", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#24", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O8" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O7" + }, + "pin2": { + "compName": "ManualSwitch#23", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#25", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O6" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O5" + }, + "pin2": { + "compName": "ManualSwitch#26", + "pinName": "" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IOVR" + }, + "pin2": { + "compName": "ManualSwitch#6", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 195.0, + "y": 200.0 + }, + { + "x": 195.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#28", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O4" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O3" + }, + "pin2": { + "compName": "ManualSwitch#30", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#29", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O2" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O1" + }, + "pin2": { + "compName": "ManualSwitch#27", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#31", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O0" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#7", + "pinName": "IN" + }, + "pin2": { + "compName": "ManualSwitch#33", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#35", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#6", + "pinName": "IN" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#4", + "pinName": "IN" + }, + "pin2": { + "compName": "ManualSwitch#32", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#34", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "IN" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "EN" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_CEM" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 190.0, + "y": 180.0 + }, + { + "x": 190.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "ManualSwitch#36", + "pinName": "" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 360.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#4", + "pinName": "EN" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#6", + "pinName": "EN" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#7", + "pinName": "EN" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 360.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#0", + "pinName": "" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "OUT" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 365.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "YC" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 370.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#4", + "pinName": "OUT" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 370.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_CEmu" + }, + "pin2": { + "compName": "ManualSwitch#8", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 185.0, + "y": 205.0 + }, + { + "x": 185.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#6", + "pinName": "OUT" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 375.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#2", + "pinName": "" + }, + "name": "unnamedWire#71", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#3", + "pinName": "" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 380.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#7", + "pinName": "OUT" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 380.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_SE" + }, + "pin2": { + "compName": "ManualSwitch#37", + "pinName": "" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 215.0, + "y": 260.0 + }, + { + "x": 215.0, + "y": 280.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#38", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OECT" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 410.0, + "y": 230.0 + }, + { + "x": 410.0, + "y": 215.0 + }, + { + "x": 345.0, + "y": 215.0 + }, + { + "x": 345.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EZ" + }, + "pin2": { + "compName": "ManualSwitch#12", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EC" + }, + "pin2": { + "compName": "ManualSwitch#11", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 195.0, + "y": 215.0 + }, + { + "x": 195.0, + "y": 225.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "default", + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF b/plugins/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF new file mode 100644 index 00000000..08b14e04 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF @@ -0,0 +1,20 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: net.mograsim.logic.model.am2900;singleton:=true +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.logic.model.am2900, + net.mograsim.logic.model.am2900.components, + net.mograsim.logic.model.am2900.components.am2901, + net.mograsim.logic.model.am2900.components.am2904, + net.mograsim.logic.model.am2900.components.am2910, + net.mograsim.logic.model.am2900.machine, + net.mograsim.logic.model.examples +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.eclipse.osgi, + net.mograsim.machine;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.logic.core +Automatic-Module-Name: net.mograsim.logic.model.am2900 +Bundle-Vendor: Mograsim Team +Bundle-Activator: net.mograsim.logic.model.am2900.Am2900Loader +Bundle-ActivationPolicy: lazy diff --git a/plugins/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties b/plugins/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties new file mode 100644 index 00000000..3fe36700 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,3 @@ +#Properties file for net.mograsim.logic.model.am2900 +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim Am2900 logic \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/build.properties b/plugins/net.mograsim.logic.model.am2900/build.properties new file mode 100644 index 00000000..1eb041da --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/build.properties @@ -0,0 +1,6 @@ +source.. = src/,\ + components/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/,\ + plugin.xml diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json new file mode 100644 index 00000000..b97159cb --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json @@ -0,0 +1,6913 @@ +{ + "width": 504.0, + "height": 342.0, + "interfacePins": [], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "ManualSwitch", + "name": "@bz_pc_cpol", + "pos": { + "x": 120.0, + "y": 435.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "@c", + "pos": { + "x": 120.0, + "y": 350.0 + }, + "params": 1 + }, + { + "id": "dlatch80", + "name": "@dlatch80#1", + "pos": { + "x": 295.0, + "y": 675.0 + } + }, + { + "id": "ManualSwitch", + "name": "@ireg_cpol", + "pos": { + "x": 120.0, + "y": 410.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "@mireg_cpol", + "pos": { + "x": 120.0, + "y": 385.0 + }, + "params": 1 + }, + { + "id": "Am2900MainMemory", + "name": "Am2900MainMemory#0", + "pos": { + "x": 35.0, + "y": 30.0 + } + }, + { + "id": "Am2900MicroInstructionMemory", + "name": "Am2900MicroInstructionMemory#0", + "pos": { + "x": 65.0, + "y": 565.0 + } + }, + { + "id": "Am2901", + "name": "Am2901#0", + "pos": { + "x": 725.0, + "y": 400.0 + } + }, + { + "id": "Am2901", + "name": "Am2901#1", + "pos": { + "x": 850.0, + "y": 400.0 + } + }, + { + "id": "Am2901", + "name": "Am2901#2", + "pos": { + "x": 975.0, + "y": 400.0 + } + }, + { + "id": "Am2901", + "name": "Am2901#3", + "pos": { + "x": 1110.0, + "y": 400.0 + } + }, + { + "id": "Am2904", + "name": "Am2904#0", + "pos": { + "x": 550.0, + "y": 405.0 + } + }, + { + "id": "Am2910", + "name": "Am2910#0", + "pos": { + "x": 405.0, + "y": 510.0 + } + }, + { + "id": "BitDisplay", + "name": "BitDisplay#1", + "pos": { + "x": 255.0, + "y": 30.0 + }, + "params": 16 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#2", + "pos": { + "x": 255.0, + "y": 45.0 + }, + "params": 16 + }, + { + "id": "FixedOutput", + "name": "FixedOutput#0", + "pos": { + "x": 540.0, + "y": 270.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#1", + "pos": { + "x": 635.0, + "y": 380.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#2", + "pos": { + "x": 365.0, + "y": 505.0 + }, + "params": { + "bits": [ + "ONE" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#3", + "pos": { + "x": 455.0, + "y": 560.0 + }, + "params": { + "bits": [ + "ONE" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#4", + "pos": { + "x": 420.0, + "y": 570.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#5", + "pos": { + "x": 475.0, + "y": 505.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#6", + "pos": { + "x": 535.0, + "y": 370.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#7", + "pos": { + "x": 260.0, + "y": 370.0 + }, + "params": { + "bits": [ + null + ] + } + }, + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 395.0, + "y": 195.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 335.0, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 395.0, + "y": 220.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 935.0, + "y": 685.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 935.0, + "y": 710.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 190.0, + "y": 100.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 240.0, + "y": 525.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 555.0, + "y": 115.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 620.0, + "y": 160.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#11", + "pos": { + "x": 575.0, + "y": 115.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#12", + "pos": { + "x": 575.0, + "y": 195.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#13", + "pos": { + "x": 575.0, + "y": 235.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#14", + "pos": { + "x": 675.0, + "y": 150.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#15", + "pos": { + "x": 675.0, + "y": 245.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#16", + "pos": { + "x": 345.0, + "y": 830.0 + }, + "params": { + "logicWidth": 80, + "orientation": "UP_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#17", + "pos": { + "x": 405.0, + "y": 815.0 + }, + "params": { + "logicWidth": 12, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#18", + "pos": { + "x": 525.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#19", + "pos": { + "x": 660.0, + "y": 755.0 + }, + "params": { + "logicWidth": 13, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 620.0, + "y": 255.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#20", + "pos": { + "x": 575.0, + "y": 815.0 + }, + "params": { + "logicWidth": 6, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#21", + "pos": { + "x": 695.0, + "y": 815.0 + }, + "params": { + "logicWidth": 2, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#22", + "pos": { + "x": 655.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#23", + "pos": { + "x": 730.0, + "y": 770.0 + }, + "params": { + "logicWidth": 6, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#24", + "pos": { + "x": 690.0, + "y": 770.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#25", + "pos": { + "x": 660.0, + "y": 770.0 + }, + "params": { + "logicWidth": 2, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#26", + "pos": { + "x": 925.0, + "y": 815.0 + }, + "params": { + "logicWidth": 16, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#27", + "pos": { + "x": 895.0, + "y": 815.0 + }, + "params": { + "logicWidth": 3, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#28", + "pos": { + "x": 865.0, + "y": 815.0 + }, + "params": { + "logicWidth": 3, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#29", + "pos": { + "x": 835.0, + "y": 815.0 + }, + "params": { + "logicWidth": 3, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 205.0, + "y": 390.0 + }, + "params": { + "logicWidth": 8, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#30", + "pos": { + "x": 795.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#31", + "pos": { + "x": 745.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#32", + "pos": { + "x": 895.0, + "y": 800.0 + }, + "params": { + "logicWidth": 3, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#33", + "pos": { + "x": 835.0, + "y": 800.0 + }, + "params": { + "logicWidth": 3, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#34", + "pos": { + "x": 865.0, + "y": 800.0 + }, + "params": { + "logicWidth": 3, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#35", + "pos": { + "x": 835.0, + "y": 780.0 + }, + "params": { + "logicWidth": 9, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#36", + "pos": { + "x": 895.0, + "y": 330.0 + }, + "params": { + "logicWidth": 16, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#37", + "pos": { + "x": 895.0, + "y": 580.0 + }, + "params": { + "logicWidth": 16, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#38", + "pos": { + "x": 895.0, + "y": 565.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#39", + "pos": { + "x": 935.0, + "y": 565.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 205.0, + "y": 405.0 + }, + "params": { + "logicWidth": 12, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#40", + "pos": { + "x": 975.0, + "y": 565.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#41", + "pos": { + "x": 1015.0, + "y": 565.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#42", + "pos": { + "x": 895.0, + "y": 345.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#43", + "pos": { + "x": 935.0, + "y": 345.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#44", + "pos": { + "x": 975.0, + "y": 345.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#45", + "pos": { + "x": 1015.0, + "y": 345.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#46", + "pos": { + "x": 310.0, + "y": 235.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#47", + "pos": { + "x": 620.0, + "y": 200.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#48", + "pos": { + "x": 365.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#49", + "pos": { + "x": 620.0, + "y": 295.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "TextComponent", + "name": "TextComponent#0", + "pos": { + "x": 305.0, + "y": 30.0 + }, + "params": "D bus" + }, + { + "id": "TextComponent", + "name": "TextComponent#1", + "pos": { + "x": 305.0, + "y": 60.0 + }, + "params": "A bus" + }, + { + "id": "TextComponent", + "name": "TextComponent#13", + "pos": { + "x": 60.0, + "y": 385.0 + }, + "params": "mireg cpol" + }, + { + "id": "TextComponent", + "name": "TextComponent#14", + "pos": { + "x": 60.0, + "y": 415.0 + }, + "params": "ireg cpol" + }, + { + "id": "TextComponent", + "name": "TextComponent#15", + "pos": { + "x": 60.0, + "y": 435.0 + }, + "params": "bz/pc cpol" + }, + { + "id": "TextComponent", + "name": "TextComponent#3", + "pos": { + "x": 515.0, + "y": 110.0 + }, + "params": "asdf" + }, + { + "id": "TextComponent", + "name": "TextComponent#4", + "pos": { + "x": 60.0, + "y": 350.0 + }, + "params": "c" + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 990.0, + "y": 590.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#1", + "pos": { + "x": 990.0, + "y": 615.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#2", + "pos": { + "x": 425.0, + "y": 120.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#3", + "pos": { + "x": 425.0, + "y": 145.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#5", + "pos": { + "x": 205.0, + "y": 70.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 604.0, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 714.0, + "y": 394.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 819.0, + "y": 384.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 824.0, + "y": 389.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 329.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 474.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 419.0, + "y": 129.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 894.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 844.0, + "y": 794.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 984.0, + "y": 599.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 249.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 244.0, + "y": 59.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 839.0, + "y": 394.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 444.0, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 389.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 449.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 454.0, + "y": 59.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 389.0, + "y": 224.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 929.0, + "y": 714.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 819.0, + "y": 529.0 + }, + "params": 9 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 944.0, + "y": 529.0 + }, + "params": 9 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 1069.0, + "y": 529.0 + }, + "params": 9 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 244.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 964.0, + "y": 394.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 564.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 569.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#32", + "pos": { + "x": 929.0, + "y": 699.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#33", + "pos": { + "x": 284.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#34", + "pos": { + "x": 294.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#35", + "pos": { + "x": 304.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#36", + "pos": { + "x": 339.0, + "y": 229.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#37", + "pos": { + "x": 824.0, + "y": 699.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#38", + "pos": { + "x": 234.0, + "y": 529.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#39", + "pos": { + "x": 234.0, + "y": 539.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 569.0, + "y": 234.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 559.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 1074.0, + "y": 389.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 1069.0, + "y": 384.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 944.0, + "y": 384.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 949.0, + "y": 389.0 + }, + "params": 4 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 860.0, + "y": 590.0 + } + }, + { + "id": "and", + "name": "and#1", + "pos": { + "x": 860.0, + "y": 610.0 + } + }, + { + "id": "and", + "name": "and#2", + "pos": { + "x": 905.0, + "y": 595.0 + } + }, + { + "id": "dff16", + "name": "dff16#0", + "pos": { + "x": 370.0, + "y": 105.0 + } + }, + { + "id": "dff16_invwe", + "name": "dff16_invwe#0", + "pos": { + "x": 490.0, + "y": 165.0 + } + }, + { + "id": "dlatch80", + "name": "dlatch80#0", + "pos": { + "x": 240.0, + "y": 675.0 + } + }, + { + "id": "inc", + "name": "inc#0", + "pos": { + "x": 315.0, + "y": 135.0 + }, + "params": 16 + }, + { + "id": "mux1_12", + "name": "mux1_12#0", + "pos": { + "x": 365.0, + "y": 420.0 + } + }, + { + "id": "mux1_16", + "name": "mux1_16#0", + "pos": { + "x": 255.0, + "y": 110.0 + } + }, + { + "id": "mux1_16", + "name": "mux1_16#1", + "pos": { + "x": 910.0, + "y": 215.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 635.0, + "y": 145.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#1", + "pos": { + "x": 635.0, + "y": 240.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 145.0, + "y": 380.0 + } + }, + { + "id": "xor", + "name": "xor#1", + "pos": { + "x": 145.0, + "y": 405.0 + } + }, + { + "id": "xor", + "name": "xor#2", + "pos": { + "x": 145.0, + "y": 430.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Am2904#0", + "pinName": "CT" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "_CC" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 675.0, + "y": 460.0 + }, + { + "x": 675.0, + "y": 355.0 + }, + { + "x": 470.0, + "y": 355.0 + }, + { + "x": 470.0, + "y": 505.0 + }, + { + "x": 400.0, + "y": 505.0 + }, + { + "x": 400.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Qn+3" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "Qn" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 835.0, + "y": 515.0 + }, + { + "x": 835.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "QIOn" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "Qn+3" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 540.0, + "y": 530.0 + }, + { + "x": 540.0, + "y": 660.0 + }, + { + "x": 1215.0, + "y": 660.0 + }, + { + "x": 1215.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "@mireg_cpol", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "Am2900MicroInstructionMemory#0", + "pinName": "D" + }, + "pin2": { + "compName": "dlatch80#0", + "pinName": "D" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 205.0, + "y": 615.0 + }, + { + "x": 205.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16_invwe#0", + "pinName": "C" + }, + "name": "unnamedWire#102", + "path": [ + { + "x": 255.0, + "y": 310.0 + }, + { + "x": 480.0, + "y": 310.0 + }, + { + "x": 480.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 390.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "O2" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 320.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "EN" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 450.0, + "y": 205.0 + }, + { + "x": 450.0, + "y": 140.0 + }, + { + "x": 435.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 390.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IN" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "F3" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 525.0, + "y": 425.0 + }, + { + "x": 525.0, + "y": 645.0 + }, + { + "x": 1105.0, + "y": 645.0 + }, + { + "x": 1105.0, + "y": 455.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "EN" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 435.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#111", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 930.0, + "y": 725.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 760.0, + "y": 165.0 + }, + { + "x": 760.0, + "y": 385.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "I" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 755.0, + "y": 390.0 + }, + { + "x": 755.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#117", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O37" + }, + "name": "unnamedWire#119", + "path": [ + { + "x": 830.0, + "y": 715.0 + }, + { + "x": 830.0, + "y": 810.0 + }, + { + "x": 715.0, + "y": 810.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "F\u003d0" + }, + "pin2": { + "compName": "and#1", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 720.0, + "y": 445.0 + }, + { + "x": 720.0, + "y": 535.0 + }, + { + "x": 840.0, + "y": 535.0 + }, + { + "x": 840.0, + "y": 625.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "name": "unnamedWire#120", + "path": [ + { + "x": 1015.0, + "y": 720.0 + }, + { + "x": 1015.0, + "y": 610.0 + }, + { + "x": 1000.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#121", + "path": [ + { + "x": 340.0, + "y": 700.0 + }, + { + "x": 340.0, + "y": 285.0 + }, + { + "x": 180.0, + "y": 285.0 + }, + { + "x": 180.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#122", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#123", + "path": [ + { + "x": 930.0, + "y": 690.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#1", + "pinName": "EN" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "name": "unnamedWire#124", + "path": [ + { + "x": 1000.0, + "y": 695.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "Am2900MainMemory#0", + "pinName": "A" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "Am2900MainMemory#0", + "pinName": "D" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "IN" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "S" + }, + "name": "unnamedWire#127", + "path": [ + { + "x": 310.0, + "y": 225.0 + }, + { + "x": 240.0, + "y": 225.0 + }, + { + "x": 240.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "D" + }, + "name": "unnamedWire#128", + "path": [ + { + "x": 335.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "A" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "Y" + }, + "name": "unnamedWire#129", + "path": [ + { + "x": 335.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#1", + "pinName": "F\u003d0" + }, + "pin2": { + "compName": "and#1", + "pinName": "A" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 845.0, + "y": 445.0 + }, + { + "x": 845.0, + "y": 615.0 + } + ] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "CI" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "name": "unnamedWire#130", + "path": [ + { + "x": 360.0, + "y": 145.0 + }, + { + "x": 360.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#131", + "path": [ + { + "x": 330.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#132", + "path": [] + }, + { + "pin1": { + "compName": "FixedOutput#7", + "pinName": "out" + }, + "pin2": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "name": "unnamedWire#133", + "path": [ + { + "x": 285.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "IN" + }, + "name": "unnamedWire#134", + "path": [ + { + "x": 420.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#5", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#135", + "path": [ + { + "x": 230.0, + "y": 80.0 + }, + { + "x": 230.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910#0", + "pinName": "_MAP" + }, + "pin2": { + "compName": "mux1_12#0", + "pinName": "S" + }, + "name": "unnamedWire#136", + "path": [ + { + "x": 420.0, + "y": 560.0 + }, + { + "x": 360.0, + "y": 560.0 + }, + { + "x": 360.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "Q" + }, + "name": "unnamedWire#137", + "path": [] + }, + { + "pin1": { + "compName": "@dlatch80#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "I" + }, + "name": "unnamedWire#138", + "path": [ + { + "x": 330.0, + "y": 760.0 + }, + { + "x": 330.0, + "y": 845.0 + }, + { + "x": 740.0, + "y": 845.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O22" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "_CCEN" + }, + "name": "unnamedWire#139", + "path": [ + { + "x": 565.0, + "y": 735.0 + }, + { + "x": 395.0, + "y": 735.0 + }, + { + "x": 395.0, + "y": 525.0 + } + ] + }, + { + "pin1": { + "compName": "and#1", + "pinName": "Y" + }, + "pin2": { + "compName": "and#2", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 900.0, + "y": 615.0 + }, + { + "x": 900.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O21" + }, + "name": "unnamedWire#140", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O20" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O2" + }, + "name": "unnamedWire#141", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O19" + }, + "name": "unnamedWire#142", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O18" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O0" + }, + "name": "unnamedWire#143", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "I" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "I" + }, + "name": "unnamedWire#144", + "path": [ + { + "x": 540.0, + "y": 730.0 + }, + { + "x": 400.0, + "y": 730.0 + }, + { + "x": 400.0, + "y": 535.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O17" + }, + "name": "unnamedWire#145", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O16" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O10" + }, + "name": "unnamedWire#146", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O15" + }, + "name": "unnamedWire#147", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O14" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O8" + }, + "name": "unnamedWire#148", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O13" + }, + "name": "unnamedWire#149", + "path": [] + }, + { + "pin1": { + "compName": "and#2", + "pinName": "A" + }, + "pin2": { + "compName": "and#0", + "pinName": "Y" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 900.0, + "y": 600.0 + }, + { + "x": 900.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O12" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O6" + }, + "name": "unnamedWire#150", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O11" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O10" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O4" + }, + "name": "unnamedWire#152", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O9" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O2" + }, + "name": "unnamedWire#154", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O7" + }, + "name": "unnamedWire#155", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O0" + }, + "name": "unnamedWire#156", + "path": [] + }, + { + "pin1": { + "compName": "mux1_12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "D" + }, + "name": "unnamedWire#157", + "path": [ + { + "x": 435.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_12#0", + "pinName": "I1" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "I" + }, + "name": "unnamedWire#158", + "path": [ + { + "x": 350.0, + "y": 480.0 + }, + { + "x": 350.0, + "y": 760.0 + }, + { + "x": 460.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "@dlatch80#1", + "pinName": "D" + }, + "pin2": { + "compName": "dlatch80#0", + "pinName": "Q" + }, + "name": "unnamedWire#159", + "path": [] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "B" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "F\u003d0" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 850.0, + "y": 605.0 + }, + { + "x": 850.0, + "y": 535.0 + }, + { + "x": 970.0, + "y": 535.0 + }, + { + "x": 970.0, + "y": 445.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#160", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#48", + "pinName": "O3" + }, + "name": "unnamedWire#161", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#48", + "pinName": "I" + }, + "name": "unnamedWire#162", + "path": [ + { + "x": 325.0, + "y": 640.0 + }, + { + "x": 380.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2900MicroInstructionMemory#0", + "pinName": "A" + }, + "name": "unnamedWire#163", + "path": [ + { + "x": 440.0, + "y": 565.0 + }, + { + "x": 205.0, + "y": 565.0 + }, + { + "x": 205.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O29" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_CEM" + }, + "name": "unnamedWire#164", + "path": [ + { + "x": 635.0, + "y": 780.0 + }, + { + "x": 505.0, + "y": 780.0 + }, + { + "x": 505.0, + "y": 400.0 + }, + { + "x": 555.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O30" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_CEmu" + }, + "name": "unnamedWire#165", + "path": [ + { + "x": 645.0, + "y": 775.0 + }, + { + "x": 500.0, + "y": 775.0 + }, + { + "x": 500.0, + "y": 395.0 + }, + { + "x": 595.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O23" + }, + "name": "unnamedWire#166", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O25" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O24" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O26" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O3" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "F\u003d0" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 1095.0, + "y": 445.0 + }, + { + "x": 1095.0, + "y": 540.0 + }, + { + "x": 855.0, + "y": 540.0 + }, + { + "x": 855.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O27" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O28" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O5" + }, + "name": "unnamedWire#171", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#22", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O31" + }, + "name": "unnamedWire#172", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O32" + }, + "pin2": { + "compName": "Splitter#22", + "pinName": "O1" + }, + "name": "unnamedWire#173", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#22", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O33" + }, + "name": "unnamedWire#174", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O34" + }, + "pin2": { + "compName": "Splitter#22", + "pinName": "O3" + }, + "name": "unnamedWire#175", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O35" + }, + "name": "unnamedWire#176", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O36" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O1" + }, + "name": "unnamedWire#177", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "I" + }, + "name": "unnamedWire#178", + "path": [ + { + "x": 755.0, + "y": 785.0 + }, + { + "x": 600.0, + "y": 785.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#22", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#24", + "pinName": "I" + }, + "name": "unnamedWire#179", + "path": [ + { + "x": 670.0, + "y": 790.0 + }, + { + "x": 705.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "and#2", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IZ" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 945.0, + "y": 600.0 + }, + { + "x": 945.0, + "y": 635.0 + }, + { + "x": 515.0, + "y": 635.0 + }, + { + "x": 515.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#25", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "I" + }, + "name": "unnamedWire#180", + "path": [ + { + "x": 665.0, + "y": 800.0 + }, + { + "x": 700.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O0" + }, + "name": "unnamedWire#181", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O1" + }, + "name": "unnamedWire#182", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#23", + "pinName": "O2" + }, + "name": "unnamedWire#183", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O3" + }, + "name": "unnamedWire#184", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#23", + "pinName": "O4" + }, + "name": "unnamedWire#185", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O5" + }, + "name": "unnamedWire#186", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#24", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O6" + }, + "name": "unnamedWire#187", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#24", + "pinName": "O1" + }, + "name": "unnamedWire#188", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#24", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O8" + }, + "name": "unnamedWire#189", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "OVR" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IOVR" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 1100.0, + "y": 450.0 + }, + { + "x": 1100.0, + "y": 650.0 + }, + { + "x": 530.0, + "y": 650.0 + }, + { + "x": 530.0, + "y": 430.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#24", + "pinName": "O3" + }, + "name": "unnamedWire#190", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#25", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O11" + }, + "name": "unnamedWire#191", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O12" + }, + "pin2": { + "compName": "Splitter#25", + "pinName": "O1" + }, + "name": "unnamedWire#192", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O73" + }, + "name": "unnamedWire#193", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O72" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O14" + }, + "name": "unnamedWire#194", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O71" + }, + "name": "unnamedWire#195", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O70" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O12" + }, + "name": "unnamedWire#196", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O69" + }, + "name": "unnamedWire#197", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O68" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O10" + }, + "name": "unnamedWire#198", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O67" + }, + "name": "unnamedWire#199", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "RAMn+3" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "RAMn" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 830.0, + "y": 510.0 + }, + { + "x": 830.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IC" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 1220.0, + "y": 520.0 + }, + { + "x": 1220.0, + "y": 640.0 + }, + { + "x": 520.0, + "y": 640.0 + }, + { + "x": 520.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O66" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O8" + }, + "name": "unnamedWire#200", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O65" + }, + "name": "unnamedWire#201", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O64" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O6" + }, + "name": "unnamedWire#202", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O63" + }, + "name": "unnamedWire#203", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O62" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O4" + }, + "name": "unnamedWire#204", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O61" + }, + "name": "unnamedWire#205", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O60" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O2" + }, + "name": "unnamedWire#206", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O59" + }, + "name": "unnamedWire#207", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O58" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O0" + }, + "name": "unnamedWire#208", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#27", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O57" + }, + "name": "unnamedWire#209", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "Cn" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 840.0, + "y": 520.0 + }, + { + "x": 840.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O56" + }, + "pin2": { + "compName": "Splitter#27", + "pinName": "O1" + }, + "name": "unnamedWire#210", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#27", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O55" + }, + "name": "unnamedWire#211", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O54" + }, + "pin2": { + "compName": "Splitter#28", + "pinName": "O2" + }, + "name": "unnamedWire#212", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#28", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O53" + }, + "name": "unnamedWire#213", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O52" + }, + "pin2": { + "compName": "Splitter#28", + "pinName": "O0" + }, + "name": "unnamedWire#214", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#29", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O51" + }, + "name": "unnamedWire#215", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O50" + }, + "pin2": { + "compName": "Splitter#29", + "pinName": "O1" + }, + "name": "unnamedWire#216", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#29", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O49" + }, + "name": "unnamedWire#217", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#30", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O48" + }, + "name": "unnamedWire#218", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#30", + "pinName": "O2" + }, + "name": "unnamedWire#219", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#1", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "Cn" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 965.0, + "y": 520.0 + }, + { + "x": 965.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#30", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O46" + }, + "name": "unnamedWire#220", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#30", + "pinName": "O0" + }, + "name": "unnamedWire#221", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#31", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O40" + }, + "name": "unnamedWire#222", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#31", + "pinName": "O1" + }, + "name": "unnamedWire#223", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#31", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O42" + }, + "name": "unnamedWire#224", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#31", + "pinName": "O3" + }, + "name": "unnamedWire#225", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O10" + }, + "name": "unnamedWire#226", + "path": [ + { + "x": 680.0, + "y": 795.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#33", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#29", + "pinName": "I" + }, + "name": "unnamedWire#227", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#34", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#28", + "pinName": "I" + }, + "name": "unnamedWire#228", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#32", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#27", + "pinName": "I" + }, + "name": "unnamedWire#229", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#2", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "Cn" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 1090.0, + "y": 520.0 + }, + { + "x": 1090.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#32", + "pinName": "O0" + }, + "name": "unnamedWire#230", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#32", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#35", + "pinName": "O1" + }, + "name": "unnamedWire#231", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#32", + "pinName": "O2" + }, + "name": "unnamedWire#232", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#34", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#35", + "pinName": "O3" + }, + "name": "unnamedWire#233", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#34", + "pinName": "O1" + }, + "name": "unnamedWire#234", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#34", + "pinName": "O2" + }, + "name": "unnamedWire#235", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#33", + "pinName": "O0" + }, + "name": "unnamedWire#236", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#33", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#237", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#33", + "pinName": "O2" + }, + "name": "unnamedWire#238", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#35", + "pinName": "O7" + }, + "name": "unnamedWire#239", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "I" + }, + "name": "unnamedWire#240", + "path": [ + { + "x": 720.0, + "y": 730.0 + }, + { + "x": 545.0, + "y": 730.0 + }, + { + "x": 545.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "Am2900MainMemory#0", + "pinName": "RW" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O0" + }, + "name": "unnamedWire#241", + "path": [ + { + "x": 175.0, + "y": 100.0 + }, + { + "x": 175.0, + "y": 290.0 + }, + { + "x": 345.0, + "y": 290.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "I" + }, + "name": "unnamedWire#242", + "path": [ + { + "x": 590.0, + "y": 150.0 + }, + { + "x": 590.0, + "y": 335.0 + }, + { + "x": 240.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#42", + "pinName": "O3" + }, + "name": "unnamedWire#243", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#42", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O14" + }, + "name": "unnamedWire#244", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#42", + "pinName": "O1" + }, + "name": "unnamedWire#245", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#42", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O12" + }, + "name": "unnamedWire#246", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#43", + "pinName": "O3" + }, + "name": "unnamedWire#247", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#43", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O10" + }, + "name": "unnamedWire#248", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#43", + "pinName": "O1" + }, + "name": "unnamedWire#249", + "path": [] + }, + { + "pin1": { + "compName": "@c", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#43", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O8" + }, + "name": "unnamedWire#250", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#44", + "pinName": "O3" + }, + "name": "unnamedWire#251", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#44", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O6" + }, + "name": "unnamedWire#252", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#44", + "pinName": "O1" + }, + "name": "unnamedWire#253", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#44", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O4" + }, + "name": "unnamedWire#254", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#45", + "pinName": "O3" + }, + "name": "unnamedWire#255", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#45", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O2" + }, + "name": "unnamedWire#256", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#45", + "pinName": "O1" + }, + "name": "unnamedWire#257", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#45", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O0" + }, + "name": "unnamedWire#258", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#38", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O15" + }, + "name": "unnamedWire#259", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "C" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 1090.0, + "y": 395.0 + }, + { + "x": 1090.0, + "y": 495.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O14" + }, + "pin2": { + "compName": "Splitter#38", + "pinName": "O2" + }, + "name": "unnamedWire#260", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#38", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O13" + }, + "name": "unnamedWire#261", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O12" + }, + "pin2": { + "compName": "Splitter#38", + "pinName": "O0" + }, + "name": "unnamedWire#262", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#39", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O11" + }, + "name": "unnamedWire#263", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O10" + }, + "pin2": { + "compName": "Splitter#39", + "pinName": "O2" + }, + "name": "unnamedWire#264", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#39", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O9" + }, + "name": "unnamedWire#265", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#39", + "pinName": "O0" + }, + "name": "unnamedWire#266", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#40", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O7" + }, + "name": "unnamedWire#267", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#40", + "pinName": "O2" + }, + "name": "unnamedWire#268", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#40", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O5" + }, + "name": "unnamedWire#269", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#2", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 965.0, + "y": 495.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#40", + "pinName": "O0" + }, + "name": "unnamedWire#270", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#41", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O3" + }, + "name": "unnamedWire#271", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#41", + "pinName": "O2" + }, + "name": "unnamedWire#272", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#41", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O1" + }, + "name": "unnamedWire#273", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#41", + "pinName": "O0" + }, + "name": "unnamedWire#274", + "path": [] + }, + { + "pin1": { + "compName": "mux1_16#1", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "I" + }, + "name": "unnamedWire#275", + "path": [ + { + "x": 970.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_16#1", + "pinName": "S" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O74" + }, + "name": "unnamedWire#276", + "path": [ + { + "x": 905.0, + "y": 220.0 + }, + { + "x": 905.0, + "y": 210.0 + }, + { + "x": 1230.0, + "y": 210.0 + }, + { + "x": 1230.0, + "y": 760.0 + }, + { + "x": 1085.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "I" + }, + "pin2": { + "compName": "mux1_16#1", + "pinName": "I0" + }, + "name": "unnamedWire#277", + "path": [ + { + "x": 1000.0, + "y": 740.0 + }, + { + "x": 1235.0, + "y": 740.0 + }, + { + "x": 1235.0, + "y": 205.0 + }, + { + "x": 900.0, + "y": 205.0 + }, + { + "x": 900.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#278", + "path": [ + { + "x": 970.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "name": "unnamedWire#279", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#1", + "pinName": "IN" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#280", + "path": [ + { + "x": 985.0, + "y": 625.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "IN" + }, + "name": "unnamedWire#281", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I1" + }, + "name": "unnamedWire#282", + "path": [ + { + "x": 420.0, + "y": 95.0 + }, + { + "x": 245.0, + "y": 95.0 + }, + { + "x": 245.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#283", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "name": "unnamedWire#284", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#285", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "name": "unnamedWire#286", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#287", + "path": [ + { + "x": 450.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "OUT" + }, + "name": "unnamedWire#288", + "path": [ + { + "x": 455.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "dff16_invwe#0", + "pinName": "D" + }, + "name": "unnamedWire#289", + "path": [ + { + "x": 475.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#1", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 840.0, + "y": 495.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#290", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O1" + }, + "pin2": { + "compName": "dff16_invwe#0", + "pinName": "_WE" + }, + "name": "unnamedWire#291", + "path": [ + { + "x": 355.0, + "y": 285.0 + }, + { + "x": 485.0, + "y": 285.0 + }, + { + "x": 485.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "name": "unnamedWire#292", + "path": [ + { + "x": 315.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "name": "unnamedWire#293", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "name": "unnamedWire#294", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "name": "unnamedWire#295", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#48", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O4" + }, + "name": "unnamedWire#296", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#48", + "pinName": "O1" + }, + "name": "unnamedWire#297", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#48", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O2" + }, + "name": "unnamedWire#298", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O11" + }, + "name": "unnamedWire#299", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#1", + "pinName": "Qn+3" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "Qn" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 960.0, + "y": 515.0 + }, + { + "x": 960.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O10" + }, + "name": "unnamedWire#300", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O9" + }, + "name": "unnamedWire#301", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#47", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#302", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "pin2": { + "compName": "Splitter#47", + "pinName": "O2" + }, + "name": "unnamedWire#303", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#47", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#304", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "pin2": { + "compName": "Splitter#47", + "pinName": "O0" + }, + "name": "unnamedWire#305", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#49", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_1" + }, + "name": "unnamedWire#306", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_2" + }, + "pin2": { + "compName": "Splitter#49", + "pinName": "O2" + }, + "name": "unnamedWire#307", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#49", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_3" + }, + "name": "unnamedWire#308", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_4" + }, + "pin2": { + "compName": "Splitter#49", + "pinName": "O0" + }, + "name": "unnamedWire#309", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "C" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 715.0, + "y": 495.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#47", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#30", + "pinName": "I" + }, + "name": "unnamedWire#310", + "path": [ + { + "x": 600.0, + "y": 215.0 + }, + { + "x": 600.0, + "y": 335.0 + }, + { + "x": 690.0, + "y": 335.0 + }, + { + "x": 690.0, + "y": 675.0 + }, + { + "x": 810.0, + "y": 675.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#31", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#49", + "pinName": "I" + }, + "name": "unnamedWire#311", + "path": [ + { + "x": 760.0, + "y": 785.0 + }, + { + "x": 800.0, + "y": 785.0 + }, + { + "x": 800.0, + "y": 685.0 + }, + { + "x": 700.0, + "y": 685.0 + }, + { + "x": 700.0, + "y": 345.0 + }, + { + "x": 610.0, + "y": 345.0 + }, + { + "x": 610.0, + "y": 310.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O44" + }, + "name": "unnamedWire#312", + "path": [ + { + "x": 605.0, + "y": 150.0 + }, + { + "x": 605.0, + "y": 340.0 + }, + { + "x": 695.0, + "y": 340.0 + }, + { + "x": 695.0, + "y": 680.0 + }, + { + "x": 805.0, + "y": 680.0 + }, + { + "x": 805.0, + "y": 800.0 + }, + { + "x": 785.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "S0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O39" + }, + "name": "unnamedWire#313", + "path": [ + { + "x": 615.0, + "y": 245.0 + }, + { + "x": 615.0, + "y": 350.0 + }, + { + "x": 705.0, + "y": 350.0 + }, + { + "x": 705.0, + "y": 690.0 + }, + { + "x": 795.0, + "y": 690.0 + }, + { + "x": 795.0, + "y": 790.0 + }, + { + "x": 735.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#35", + "pinName": "I" + }, + "name": "unnamedWire#314", + "path": [ + { + "x": 820.0, + "y": 735.0 + }, + { + "x": 875.0, + "y": 735.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#315", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "name": "unnamedWire#316", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "I" + }, + "name": "unnamedWire#317", + "path": [ + { + "x": 820.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "I" + }, + "name": "unnamedWire#318", + "path": [ + { + "x": 945.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "I" + }, + "name": "unnamedWire#319", + "path": [ + { + "x": 1070.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 715.0, + "y": 365.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "I" + }, + "name": "unnamedWire#320", + "path": [ + { + "x": 1205.0, + "y": 530.0 + }, + { + "x": 1205.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#38", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "Y" + }, + "name": "unnamedWire#321", + "path": [ + { + "x": 910.0, + "y": 545.0 + }, + { + "x": 1185.0, + "y": 545.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#39", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "Y" + }, + "name": "unnamedWire#322", + "path": [ + { + "x": 950.0, + "y": 550.0 + }, + { + "x": 1050.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#40", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "Y" + }, + "name": "unnamedWire#323", + "path": [ + { + "x": 990.0, + "y": 555.0 + }, + { + "x": 925.0, + "y": 555.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#41", + "pinName": "I" + }, + "name": "unnamedWire#324", + "path": [ + { + "x": 800.0, + "y": 560.0 + }, + { + "x": 1030.0, + "y": 560.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#45", + "pinName": "I" + }, + "name": "unnamedWire#325", + "path": [ + { + "x": 785.0, + "y": 375.0 + }, + { + "x": 1030.0, + "y": 375.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#44", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "D" + }, + "name": "unnamedWire#326", + "path": [ + { + "x": 990.0, + "y": 370.0 + }, + { + "x": 910.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#43", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "D" + }, + "name": "unnamedWire#327", + "path": [ + { + "x": 950.0, + "y": 365.0 + }, + { + "x": 1035.0, + "y": 365.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#42", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "D" + }, + "name": "unnamedWire#328", + "path": [ + { + "x": 910.0, + "y": 360.0 + }, + { + "x": 1170.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#329", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Cn" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "C0" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 675.0, + "y": 505.0 + }, + { + "x": 675.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I0" + }, + "name": "unnamedWire#330", + "path": [ + { + "x": 250.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O8" + }, + "name": "unnamedWire#331", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#1", + "pinName": "" + }, + "name": "unnamedWire#332", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#2", + "pinName": "" + }, + "name": "unnamedWire#333", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#334", + "path": [ + { + "x": 340.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#335", + "path": [ + { + "x": 185.0, + "y": 230.0 + }, + { + "x": 185.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "name": "unnamedWire#336", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O7" + }, + "name": "unnamedWire#337", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#338", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#339", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "C" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 445.0, + "y": 365.0981951658187 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O6" + }, + "name": "unnamedWire#340", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O5" + }, + "name": "unnamedWire#341", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O4" + }, + "name": "unnamedWire#342", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "mux1_12#0", + "pinName": "I0" + }, + "name": "unnamedWire#343", + "path": [ + { + "x": 260.0, + "y": 440.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#5", + "pinName": "EN" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "name": "unnamedWire#344", + "path": [ + { + "x": 215.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O38" + }, + "pin2": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "name": "unnamedWire#345", + "path": [ + { + "x": 725.0, + "y": 805.0 + }, + { + "x": 825.0, + "y": 805.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "name": "unnamedWire#346", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "name": "unnamedWire#347", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "dlatch80#0", + "pinName": "E" + }, + "name": "unnamedWire#348", + "path": [ + { + "x": 235.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#349", + "path": [] + }, + { + "pin1": { + "compName": "FixedOutput#1", + "pinName": "out" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OECT" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 660.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#350", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "@dlatch80#1", + "pinName": "E" + }, + "name": "unnamedWire#351", + "path": [ + { + "x": 290.0, + "y": 535.0 + }, + { + "x": 290.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "FixedOutput#2", + "pinName": "out" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "_RLD" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "Am2910#0", + "pinName": "CI" + }, + "pin2": { + "compName": "FixedOutput#3", + "pinName": "out" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 480.0, + "y": 540.0 + }, + { + "x": 480.0, + "y": 570.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910#0", + "pinName": "_OE" + }, + "pin2": { + "compName": "FixedOutput#4", + "pinName": "out" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 445.0, + "y": 580.0 + } + ] + }, + { + "pin1": { + "compName": "FixedOutput#5", + "pinName": "out" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_SE" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#2", + "pinName": "RAMn" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "RAMn+3" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 955.0, + "y": 410.0 + }, + { + "x": 955.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "FixedOutput#6", + "pinName": "out" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 560.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EZ" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EOVR" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 575.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EC" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EN" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "dff16_invwe#0", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O7" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O5" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "RAMn" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "RAMn+3" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 1080.0, + "y": 410.0 + }, + { + "x": 1080.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O3" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O2" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O0" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "FixedOutput#0", + "pinName": "out" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 570.0, + "y": 280.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O3" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 570.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O3" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O1" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#2", + "pinName": "Qn+3" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "Qn" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 1085.0, + "y": 515.0 + }, + { + "x": 1085.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O1" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_1" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_2" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_3" + }, + "name": "unnamedWire#69", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Qn" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "QIO0" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 685.0, + "y": 420.0 + }, + { + "x": 685.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_4" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 610.0, + "y": 250.0 + }, + { + "x": 610.0, + "y": 270.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 610.0, + "y": 210.0 + }, + { + "x": 610.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O3" + }, + "name": "unnamedWire#73", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O1" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O3" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y2" + }, + "name": "unnamedWire#78", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O1" + }, + "name": "unnamedWire#79", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "SIO0" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "RAMn" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 680.0, + "y": 525.0 + }, + { + "x": 680.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y4" + }, + "name": "unnamedWire#80", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "A" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 820.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "B" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 825.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "A" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 945.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "B" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 950.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "A" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 1070.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "B" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 1075.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "A" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 1205.0, + "y": 385.0 + }, + { + "x": 1205.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 1210.0, + "y": 435.0 + }, + { + "x": 1210.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "SIOn" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "RAMn+3" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 535.0, + "y": 525.0 + }, + { + "x": 535.0, + "y": 655.0 + }, + { + "x": 1210.0, + "y": 655.0 + }, + { + "x": 1210.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "OUT" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 1245.0, + "y": 60.0 + }, + { + "x": 1245.0, + "y": 625.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#1", + "pinName": "I1" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 895.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 1240.0, + "y": 45.0 + }, + { + "x": 1240.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "xor#2", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "C" + }, + "name": "unnamedWire#94", + "path": [ + { + "x": 245.0, + "y": 270.0 + }, + { + "x": 365.0, + "y": 270.0 + }, + { + "x": 365.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "@bz_pc_cpol", + "pinName": "" + }, + "pin2": { + "compName": "xor#2", + "pinName": "B" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "@c", + "pinName": "" + }, + "pin2": { + "compName": "xor#2", + "pinName": "A" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "B" + }, + "pin2": { + "compName": "@ireg_cpol", + "pinName": "" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "A" + }, + "pin2": { + "compName": "@c", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "A" + }, + "pin2": { + "compName": "@c", + "pinName": "" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2900", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json new file mode 100644 index 00000000..7a0b4b2c --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json @@ -0,0 +1,253 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "_Q", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "_R", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "_S", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 7.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 40.0, + "y": 12.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 34.0, + "y": 16.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 64.0, + "y": 36.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_Q" + }, + "name": "_q", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "q", + "path": [ + { + "x": 35.0, + "y": 17.5 + }, + { + "x": 35.0, + "y": 7.5 + }, + { + "x": 65.0, + "y": 7.5 + }, + { + "x": 65.0, + "y": 12.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_S" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_R" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 35.0, + "y": 37.5 + }, + { + "x": 35.0, + "y": 27.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 65.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 65.0, + "y": 42.5 + }, + { + "x": 5.0, + "y": 42.5 + }, + { + "x": 5.0, + "y": 22.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "_rsLatch", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "wireForcing", + "params": { + "wiresToForce": [ + "q" + ], + "wiresToForceInverted": [ + "_q" + ] + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json new file mode 100644 index 00000000..270afa21 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json @@ -0,0 +1,4003 @@ +{ + "width": 90.0, + "height": 125.0, + "interfacePins": [ + { + "location": { + "x": 90.0, + "y": 15.0 + }, + "name": "A", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 90.0, + "y": 35.0 + }, + "name": "B", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 105.0 + }, + "name": "Cn", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 90.0, + "y": 120.0 + }, + "name": "Cn+4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 0.0 + }, + "name": "D", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "F3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "F\u003d0", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 90.0, + "y": 80.0 + }, + "name": "I", + "logicWidth": 9, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "OVR", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "Qn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 90.0, + "y": 115.0 + }, + "name": "Qn+3", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "RAMn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 90.0, + "y": 110.0 + }, + "name": "RAMn+3", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 75.0, + "y": 125.0 + }, + "name": "Y", + "logicWidth": 4, + "usage": "INPUT" + } + ], + "innerScale": 0.1, + "submodel": { + "components": [ + { + "id": "Am2901ALUInclSourceDecodeInclFunctionDecode", + "name": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pos": { + "x": 510.0, + "y": 620.0 + } + }, + { + "id": "Am2901DestDecode", + "name": "Am2901DestDecode#0", + "pos": { + "x": 380.0, + "y": 160.0 + } + }, + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 465.0, + "y": 190.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 420.0, + "y": 440.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 855.0, + "y": 760.0 + }, + "params": { + "logicWidth": 9, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 735.0, + "y": 1235.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 670.0, + "y": 135.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 670.0, + "y": 335.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#5", + "pos": { + "x": 475.0, + "y": 615.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 355.0, + "y": 920.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#1", + "pos": { + "x": 370.0, + "y": 850.0 + }, + "params": { + "logicWidth": 1, + "orientation": "DOWN" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#2", + "pos": { + "x": 400.0, + "y": 950.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#3", + "pos": { + "x": 400.0, + "y": 725.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 14.0, + "y": 714.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 459.0, + "y": 194.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 239.0, + "y": 929.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 244.0, + "y": 939.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 249.0, + "y": 949.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 254.0, + "y": 959.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 319.0, + "y": 929.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 334.0, + "y": 959.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 134.0, + "y": 1039.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 139.0, + "y": 1049.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 379.0, + "y": 529.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 394.0, + "y": 544.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 254.0, + "y": 749.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 434.0, + "y": 734.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 354.0, + "y": 504.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 359.0, + "y": 509.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 364.0, + "y": 514.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 369.0, + "y": 519.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 354.0, + "y": 449.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 359.0, + "y": 459.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 364.0, + "y": 469.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 369.0, + "y": 479.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 104.0, + "y": 769.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 134.0, + "y": 729.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 109.0, + "y": 779.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 114.0, + "y": 789.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#32", + "pos": { + "x": 109.0, + "y": 809.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#33", + "pos": { + "x": 114.0, + "y": 819.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#34", + "pos": { + "x": 119.0, + "y": 829.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#35", + "pos": { + "x": 104.0, + "y": 799.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#36", + "pos": { + "x": 109.0, + "y": 839.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#37", + "pos": { + "x": 114.0, + "y": 849.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#38", + "pos": { + "x": 119.0, + "y": 859.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#39", + "pos": { + "x": 414.0, + "y": 449.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 129.0, + "y": 739.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#40", + "pos": { + "x": 99.0, + "y": 964.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#41", + "pos": { + "x": 99.0, + "y": 764.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#42", + "pos": { + "x": 124.0, + "y": 889.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#43", + "pos": { + "x": 364.0, + "y": 889.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#44", + "pos": { + "x": 134.0, + "y": 894.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#45", + "pos": { + "x": 409.0, + "y": 894.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#46", + "pos": { + "x": 424.0, + "y": 1079.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 124.0, + "y": 749.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 349.0, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 344.0, + "y": 374.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 339.0, + "y": 384.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 334.0, + "y": 394.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 495.0, + "y": 180.0 + } + }, + { + "id": "dff4", + "name": "dff4#0", + "pos": { + "x": 200.0, + "y": 925.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#0", + "pos": { + "x": 720.0, + "y": 170.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#1", + "pos": { + "x": 260.0, + "y": 690.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 500.0, + "y": 350.0 + } + }, + { + "id": "or4", + "name": "or4#0", + "pos": { + "x": 375.0, + "y": 445.0 + } + }, + { + "id": "ram4", + "name": "ram4#0", + "pos": { + "x": 655.0, + "y": 170.0 + } + }, + { + "id": "sel3_4", + "name": "sel3_4#0", + "pos": { + "x": 145.0, + "y": 725.0 + } + }, + { + "id": "sel3_4", + "name": "sel3_4#1", + "pos": { + "x": 150.0, + "y": 925.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "Am2901DestDecode#0", + "pinName": "I6" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 845.0, + "y": 780.0 + }, + { + "x": 845.0, + "y": 305.0 + }, + { + "x": 375.0, + "y": 305.0 + }, + { + "x": 375.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I5" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 805.0, + "y": 790.0 + }, + { + "x": 805.0, + "y": 615.0 + }, + { + "x": 585.0, + "y": 615.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 15.0, + "y": 90.0 + }, + { + "x": 460.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "F3" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#100", + "path": [ + { + "x": 625.0, + "y": 645.0 + }, + { + "x": 625.0, + "y": 540.0 + }, + { + "x": 390.0, + "y": 540.0 + }, + { + "x": 390.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 395.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#102", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#104", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "name": "unnamedWire#105", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "or4#0", + "pinName": "A1" + }, + "name": "unnamedWire#106", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "or4#0", + "pinName": "A2" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "or4#0", + "pinName": "A3" + }, + "name": "unnamedWire#108", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "or4#0", + "pinName": "A4" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 355.0, + "y": 405.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 360.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 365.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 370.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 105.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#115", + "path": [ + { + "x": 110.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 115.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "name": "unnamedWire#117", + "path": [ + { + "x": 100.0, + "y": 960.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#119", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 460.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#120", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "name": "unnamedWire#121", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "name": "unnamedWire#122", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "name": "unnamedWire#123", + "path": [ + { + "x": 120.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "name": "unnamedWire#124", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#127", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#128", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "name": "unnamedWire#129", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 230.0, + "y": 715.0 + }, + { + "x": 230.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "name": "unnamedWire#130", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "name": "unnamedWire#131", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C1" + }, + "name": "unnamedWire#132", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C2" + }, + "name": "unnamedWire#133", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C3" + }, + "name": "unnamedWire#134", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "IN" + }, + "name": "unnamedWire#135", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "B1" + }, + "name": "unnamedWire#136", + "path": [ + { + "x": 105.0, + "y": 1000.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "B2" + }, + "name": "unnamedWire#137", + "path": [ + { + "x": 110.0, + "y": 1010.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "B3" + }, + "name": "unnamedWire#138", + "path": [ + { + "x": 115.0, + "y": 1020.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "B4" + }, + "name": "unnamedWire#139", + "path": [ + { + "x": 120.0, + "y": 1030.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "C" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 715.0, + "y": 750.0 + }, + { + "x": 715.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "D1" + }, + "name": "unnamedWire#140", + "path": [ + { + "x": 195.0, + "y": 730.0 + }, + { + "x": 195.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "D2" + }, + "name": "unnamedWire#141", + "path": [ + { + "x": 200.0, + "y": 740.0 + }, + { + "x": 200.0, + "y": 275.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "D3" + }, + "name": "unnamedWire#142", + "path": [ + { + "x": 205.0, + "y": 750.0 + }, + { + "x": 205.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "D4" + }, + "name": "unnamedWire#143", + "path": [ + { + "x": 210.0, + "y": 760.0 + }, + { + "x": 210.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "RAMWE" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#144", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#145" + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "WE" + }, + "name": "unnamedWire#146", + "path": [ + { + "x": 630.0, + "y": 185.0 + }, + { + "x": 630.0, + "y": 255.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "QWE" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "WE" + }, + "name": "unnamedWire#147", + "path": [ + { + "x": 450.0, + "y": 215.0 + }, + { + "x": 450.0, + "y": 245.0 + }, + { + "x": 190.0, + "y": 245.0 + }, + { + "x": 190.0, + "y": 980.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "YF" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#148", + "path": [ + { + "x": 435.0, + "y": 195.0 + }, + { + "x": 435.0, + "y": 355.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O0" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "D1" + }, + "name": "unnamedWire#149", + "path": [ + { + "x": 505.0, + "y": 630.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "Am2901DestDecode#0", + "pinName": "I8" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 835.0, + "y": 760.0 + }, + { + "x": 835.0, + "y": 315.0 + }, + { + "x": 365.0, + "y": 315.0 + }, + { + "x": 365.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#152", + "path": [ + { + "x": 555.0, + "y": 375.0 + }, + { + "x": 555.0, + "y": 520.0 + }, + { + "x": 740.0, + "y": 520.0 + }, + { + "x": 740.0, + "y": 1230.0 + }, + { + "x": 745.0, + "y": 1230.0 + } + ] + }, + { + "pin1": { + "compName": "or4#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#154", + "path": [ + { + "x": 415.0, + "y": 445.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#155", + "path": [ + { + "x": 415.0, + "y": 455.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F\u003d0" + }, + "name": "unnamedWire#156", + "path": [ + { + "x": 445.0, + "y": 450.0 + }, + { + "x": 445.0, + "y": 490.0 + }, + { + "x": 310.0, + "y": 490.0 + }, + { + "x": 310.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "name": "unnamedWire#157", + "path": [ + { + "x": 765.0, + "y": 1220.0 + }, + { + "x": 750.0, + "y": 1220.0 + }, + { + "x": 750.0, + "y": 510.0 + }, + { + "x": 565.0, + "y": 510.0 + }, + { + "x": 565.0, + "y": 355.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "name": "unnamedWire#158", + "path": [ + { + "x": 100.0, + "y": 1115.0 + }, + { + "x": 380.0, + "y": 1115.0 + }, + { + "x": 380.0, + "y": 930.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "IN" + }, + "name": "unnamedWire#159", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "C" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 255.0, + "y": 735.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#160", + "path": [ + { + "x": 100.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "OUT" + }, + "name": "unnamedWire#161", + "path": [ + { + "x": 100.0, + "y": 885.0 + }, + { + "x": 380.0, + "y": 885.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F3" + }, + "name": "unnamedWire#162", + "path": [ + { + "x": 5.0, + "y": 545.0 + }, + { + "x": 5.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "name": "unnamedWire#163", + "path": [ + { + "x": 550.0, + "y": 385.0 + }, + { + "x": 550.0, + "y": 525.0 + }, + { + "x": 735.0, + "y": 525.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#42", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#164", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#43", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "EN" + }, + "name": "unnamedWire#165", + "path": [ + { + "x": 395.0, + "y": 890.0 + }, + { + "x": 395.0, + "y": 860.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#43", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "name": "unnamedWire#166", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#43", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#42", + "pinName": "" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#44", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#44", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#45", + "pinName": "" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "C" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 255.0, + "y": 900.0 + }, + { + "x": 195.0, + "y": 900.0 + }, + { + "x": 195.0, + "y": 970.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "EN" + }, + "pin2": { + "compName": "WireCrossPoint#45", + "pinName": "" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "IN" + }, + "name": "unnamedWire#171", + "path": [ + { + "x": 395.0, + "y": 735.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "C4" + }, + "pin2": { + "compName": "WireCrossPoint#46", + "pinName": "" + }, + "name": "unnamedWire#172", + "path": [ + { + "x": 145.0, + "y": 1070.0 + }, + { + "x": 145.0, + "y": 1080.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#46", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "OUT" + }, + "name": "unnamedWire#173", + "path": [ + { + "x": 425.0, + "y": 960.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#46", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Qn+3" + }, + "name": "unnamedWire#174", + "path": [ + { + "x": 425.0, + "y": 1150.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "B0" + }, + "name": "unnamedWire#178", + "path": [ + { + "x": 635.0, + "y": 365.0 + }, + { + "x": 635.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "name": "unnamedWire#179", + "path": [] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "LSH" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 420.0, + "y": 205.0 + }, + { + "x": 420.0, + "y": 240.0 + }, + { + "x": 135.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "NSH" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 425.0, + "y": 165.0 + }, + { + "x": 425.0, + "y": 235.0 + }, + { + "x": 130.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I4" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 800.0, + "y": 800.0 + }, + { + "x": 800.0, + "y": 610.0 + }, + { + "x": 575.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "RSH" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 430.0, + "y": 175.0 + }, + { + "x": 430.0, + "y": 230.0 + }, + { + "x": 125.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "SA" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "SB" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "SC" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#44", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "SA" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 135.0, + "y": 930.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "SB" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 130.0, + "y": 940.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "SC" + }, + "pin2": { + "compName": "WireCrossPoint#42", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 125.0, + "y": 950.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "B3" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 650.0, + "y": 245.0 + }, + { + "x": 650.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "B2" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 645.0, + "y": 235.0 + }, + { + "x": 645.0, + "y": 345.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I3" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 795.0, + "y": 810.0 + }, + { + "x": 795.0, + "y": 605.0 + }, + { + "x": 565.0, + "y": 605.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "B1" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 640.0, + "y": 355.0 + }, + { + "x": 640.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 490.0, + "y": 480.0 + }, + { + "x": 600.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "D4" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O3" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 475.0, + "y": 645.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O2" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "D3" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 485.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "D2" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O1" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 495.0, + "y": 635.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QA1" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D1" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QA2" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D2" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QA3" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D3" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QA4" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D4" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QB1" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D1" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 695.0, + "y": 215.0 + }, + { + "x": 695.0, + "y": 575.0 + }, + { + "x": 250.0, + "y": 575.0 + }, + { + "x": 250.0, + "y": 695.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I2" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 790.0, + "y": 820.0 + }, + { + "x": 790.0, + "y": 600.0 + }, + { + "x": 555.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QB2" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D2" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 700.0, + "y": 225.0 + }, + { + "x": 700.0, + "y": 570.0 + }, + { + "x": 245.0, + "y": 570.0 + }, + { + "x": 245.0, + "y": 705.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QB3" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D3" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 705.0, + "y": 235.0 + }, + { + "x": 705.0, + "y": 565.0 + }, + { + "x": 240.0, + "y": 565.0 + }, + { + "x": 240.0, + "y": 715.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QB4" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D4" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 710.0, + "y": 245.0 + }, + { + "x": 710.0, + "y": 560.0 + }, + { + "x": 235.0, + "y": 560.0 + }, + { + "x": 235.0, + "y": 725.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cn" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Cn" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 55.0, + "y": 1050.0 + }, + { + "x": 55.0, + "y": 600.0 + }, + { + "x": 520.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "A0" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 650.0, + "y": 175.0 + }, + { + "x": 650.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "A1" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 645.0, + "y": 155.0 + }, + { + "x": 645.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "A2" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 640.0, + "y": 145.0 + }, + { + "x": 640.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "A3" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 635.0, + "y": 135.0 + }, + { + "x": 635.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 765.0, + "y": 175.0 + }, + { + "x": 765.0, + "y": 80.0 + }, + { + "x": 350.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 770.0, + "y": 185.0 + }, + { + "x": 770.0, + "y": 75.0 + }, + { + "x": 345.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I1" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 785.0, + "y": 830.0 + }, + { + "x": 785.0, + "y": 595.0 + }, + { + "x": 545.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [ + { + "x": 775.0, + "y": 195.0 + }, + { + "x": 775.0, + "y": 70.0 + }, + { + "x": 340.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [ + { + "x": 780.0, + "y": 205.0 + }, + { + "x": 780.0, + "y": 65.0 + }, + { + "x": 335.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "A1" + }, + "name": "unnamedWire#56", + "path": [ + { + "x": 350.0, + "y": 655.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "A2" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 345.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "A3" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 340.0, + "y": 665.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "A4" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 335.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I0" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 780.0, + "y": 840.0 + }, + { + "x": 780.0, + "y": 590.0 + }, + { + "x": 535.0, + "y": 590.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q1" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "B1" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 300.0, + "y": 695.0 + }, + { + "x": 300.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q2" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "B2" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 305.0, + "y": 705.0 + }, + { + "x": 305.0, + "y": 685.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q3" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "B3" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 310.0, + "y": 715.0 + }, + { + "x": 310.0, + "y": 690.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q4" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "B4" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 315.0, + "y": 725.0 + }, + { + "x": 315.0, + "y": 695.0 + } + ] + }, + { + "pin1": { + "compName": "dff4#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "dff4#0", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "dff4#0", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "dff4#0", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "name": "unnamedWire#69", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Qn" + }, + "pin2": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 80.0, + "y": 200.0 + }, + { + "x": 80.0, + "y": 965.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 245.0, + "y": 1095.0 + }, + { + "x": 130.0, + "y": 1095.0 + }, + { + "x": 130.0, + "y": 1050.0 + }, + { + "x": 135.0, + "y": 1050.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 250.0, + "y": 1100.0 + }, + { + "x": 135.0, + "y": 1100.0 + }, + { + "x": 135.0, + "y": 1055.0 + }, + { + "x": 140.0, + "y": 1055.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "C1" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "C2" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "C3" + }, + "name": "unnamedWire#76", + "path": [ + { + "x": 255.0, + "y": 1105.0 + }, + { + "x": 140.0, + "y": 1105.0 + }, + { + "x": 140.0, + "y": 1060.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "Am2901DestDecode#0", + "pinName": "I7" + }, + "name": "unnamedWire#77", + "path": [ + { + "x": 840.0, + "y": 770.0 + }, + { + "x": 840.0, + "y": 310.0 + }, + { + "x": 370.0, + "y": 310.0 + }, + { + "x": 370.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "RAMn" + }, + "pin2": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 75.0, + "y": 100.0 + }, + { + "x": 75.0, + "y": 765.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "A2" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 240.0, + "y": 1090.0 + }, + { + "x": 125.0, + "y": 1090.0 + }, + { + "x": 125.0, + "y": 1045.0 + }, + { + "x": 130.0, + "y": 1045.0 + }, + { + "x": 130.0, + "y": 970.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 755.0, + "y": 1225.0 + }, + { + "x": 745.0, + "y": 1225.0 + }, + { + "x": 745.0, + "y": 515.0 + }, + { + "x": 560.0, + "y": 515.0 + }, + { + "x": 560.0, + "y": 365.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Q1" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 320.0, + "y": 705.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Q2" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 325.0, + "y": 940.0 + }, + { + "x": 325.0, + "y": 710.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Q3" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 330.0, + "y": 950.0 + }, + { + "x": 330.0, + "y": 715.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Q4" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 335.0, + "y": 720.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "A3" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 135.0, + "y": 980.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "A4" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 140.0, + "y": 990.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "D1" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "D2" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "D3" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "D4" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 15.0, + "y": 950.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cn+4" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 615.0, + "y": 665.0 + }, + { + "x": 615.0, + "y": 1200.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "OVR" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "OVR" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 610.0, + "y": 675.0 + }, + { + "x": 610.0, + "y": 1125.0 + }, + { + "x": 95.0, + "y": 1125.0 + }, + { + "x": 95.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "F1" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 635.0, + "y": 625.0 + }, + { + "x": 635.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "F4" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 620.0, + "y": 655.0 + }, + { + "x": 620.0, + "y": 545.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#45", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "EN" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C4" + }, + "name": "unnamedWire#96", + "path": [ + { + "x": 435.0, + "y": 795.0 + }, + { + "x": 195.0, + "y": 795.0 + }, + { + "x": 195.0, + "y": 880.0 + }, + { + "x": 140.0, + "y": 880.0 + }, + { + "x": 140.0, + "y": 870.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RAMn+3" + }, + "name": "unnamedWire#97", + "path": [ + { + "x": 455.0, + "y": 735.0 + }, + { + "x": 455.0, + "y": 1100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [ + { + "x": 380.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "F2" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#99", + "path": [ + { + "x": 630.0, + "y": 635.0 + }, + { + "x": 630.0, + "y": 535.0 + }, + { + "x": 385.0, + "y": 535.0 + }, + { + "x": 385.0, + "y": 510.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "qreg": { + "id": "delegating", + "params": { + "delegateTarget": "dff4#0" + } + }, + "regs": { + "id": "delegating", + "params": { + "delegateTarget": "ram4#0" + } + } + }, + "atomicHighLevelStates": {} + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json new file mode 100644 index 00000000..90f0ad95 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json @@ -0,0 +1,725 @@ +{ + "width": 35.0, + "height": 60.0, + "interfacePins": [ + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "CinE", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "FN", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "I5", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "L", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "RN", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "SBE", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "SN", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 15.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 15.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 55.0, + "y": 45.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 55.0, + "y": 70.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 100.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 39.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 4.0, + "y": 44.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 9.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 9.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 9.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 9.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 49.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 49.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 39.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 100.0, + "y": 135.0 + } + }, + { + "id": "nand3", + "name": "nand3#0", + "pos": { + "x": 55.0, + "y": 10.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I5" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SN" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 10.0, + "y": 105.0 + }, + { + "x": 135.0, + "y": 105.0 + }, + { + "x": 135.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I3" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 50.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RN" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 50.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 50.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "CinE" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 40.0, + "y": 5.0 + }, + { + "x": 115.0, + "y": 5.0 + }, + { + "x": 115.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "C" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 40.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "nand3#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#27" + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#28" + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#29" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "L" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SBE" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 45.0, + "y": 45.0 + }, + { + "x": 45.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "FN" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 5.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "A" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 40.0 + }, + { + "x": 45.0, + "y": 40.0 + }, + { + "x": 45.0, + "y": 15.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901ALUFuncDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json new file mode 100644 index 00000000..9652a6d6 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json @@ -0,0 +1,1541 @@ +{ + "width": 35.0, + "height": 120.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "Cn", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "Cn+4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "F1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "F2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "F3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "F4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "I5", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "OVR", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "R1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "R2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "R3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "R4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "S2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 105.0 + }, + "name": "S3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 115.0 + }, + "name": "S4", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "Am2901ALUFuncDecode", + "name": "Am2901ALUFuncDecode#0", + "pos": { + "x": 20.0, + "y": 2.5 + } + }, + { + "id": "Am2901ALUOneBit", + "name": "Am2901ALUOneBit#0", + "pos": { + "x": 45.0, + "y": 80.0 + } + }, + { + "id": "Am2901ALUOneBit", + "name": "Am2901ALUOneBit#1", + "pos": { + "x": 45.0, + "y": 180.0 + } + }, + { + "id": "Am2901ALUOneBit", + "name": "Am2901ALUOneBit#2", + "pos": { + "x": 45.0, + "y": 280.0 + } + }, + { + "id": "Am2901ALUOneBit", + "name": "Am2901ALUOneBit#3", + "pos": { + "x": 45.0, + "y": 380.0 + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 24.0, + "y": 94.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 194.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 31.5, + "y": 244.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 31.5, + "y": 344.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 34.0, + "y": 154.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 34.0, + "y": 254.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 34.0, + "y": 354.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 36.5, + "y": 164.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 36.5, + "y": 264.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 36.5, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 84.0, + "y": 374.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 84.0, + "y": 384.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 24.0, + "y": 294.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 26.5, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 26.5, + "y": 204.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 26.5, + "y": 304.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 29.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 29.0, + "y": 224.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 29.0, + "y": 324.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 31.5, + "y": 144.0 + }, + "params": 1 + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 95.0, + "y": 400.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I5" + }, + "pin2": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "I5" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 5.0, + "y": 20.0 + }, + { + "x": 5.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I4" + }, + "pin2": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "I4" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 10.0, + "y": 60.0 + }, + { + "x": 10.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "CinE" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 70.0, + "y": 7.5 + }, + { + "x": 70.0, + "y": 77.5 + }, + { + "x": 27.5, + "y": 77.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "CinE" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "CinE" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "CinE" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "CinE" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 27.5, + "y": 405.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "RN" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 57.5, + "y": 57.5 + }, + { + "x": 57.5, + "y": 65.0 + }, + { + "x": 30.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I3" + }, + "pin2": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "I3" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 15.0, + "y": 100.0 + }, + { + "x": 15.0, + "y": 27.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "RN" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "RN" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "RN" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "RN" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 30.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "SN" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 65.0, + "y": 27.5 + }, + { + "x": 65.0, + "y": 72.5 + }, + { + "x": 32.5, + "y": 72.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "SN" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "SN" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "SN" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "SBE" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 62.5, + "y": 37.5 + }, + { + "x": 62.5, + "y": 70.0 + }, + { + "x": 25.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "SN" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 32.5, + "y": 445.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "FN" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 60.0, + "y": 47.5 + }, + { + "x": 60.0, + "y": 67.5 + }, + { + "x": 35.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "FN" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "FN" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "FN" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "FN" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 35.0, + "y": 455.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "L" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 67.5, + "y": 17.5 + }, + { + "x": 67.5, + "y": 75.0 + }, + { + "x": 37.5, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "L" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "L" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "L" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "L" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 37.5, + "y": 465.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R1" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "R" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 10.0, + "y": 180.0 + }, + { + "x": 10.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R2" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "R" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 10.0, + "y": 220.0 + }, + { + "x": 10.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R3" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "R" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 10.0, + "y": 260.0 + }, + { + "x": 10.0, + "y": 315.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R4" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "R" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 20.0, + "y": 300.0 + }, + { + "x": 20.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "S" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 15.0, + "y": 340.0 + }, + { + "x": 15.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S2" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "S" + }, + "name": "unnamedWire#50", + "path": [ + { + "x": 5.0, + "y": 380.0 + }, + { + "x": 5.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S3" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "S" + }, + "name": "unnamedWire#51", + "path": [ + { + "x": 10.0, + "y": 420.0 + }, + { + "x": 10.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S4" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "S" + }, + "name": "unnamedWire#52", + "path": [ + { + "x": 10.0, + "y": 460.0 + }, + { + "x": 10.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cn" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "Cin" + }, + "name": "unnamedWire#53", + "path": [ + { + "x": 5.0, + "y": 140.0 + }, + { + "x": 5.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#0", + "pinName": "Cout" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "Cin" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 85.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 175.0 + }, + { + "x": 40.0, + "y": 175.0 + }, + { + "x": 40.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#1", + "pinName": "Cout" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "Cin" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 85.0, + "y": 185.0 + }, + { + "x": 85.0, + "y": 275.0 + }, + { + "x": 40.0, + "y": 275.0 + }, + { + "x": 40.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#2", + "pinName": "Cout" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [ + { + "x": 85.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "Cin" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 40.0, + "y": 375.0 + }, + { + "x": 40.0, + "y": 385.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#3", + "pinName": "Cout" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#0", + "pinName": "F" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F1" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 90.0, + "y": 95.0 + }, + { + "x": 90.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "CoutE" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#1", + "pinName": "F" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F2" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 95.0, + "y": 195.0 + }, + { + "x": 95.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#2", + "pinName": "F" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F3" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 100.0, + "y": 295.0 + }, + { + "x": 100.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#3", + "pinName": "F" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F4" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 105.0, + "y": 395.0 + }, + { + "x": 105.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "A" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 90.0, + "y": 375.0 + }, + { + "x": 90.0, + "y": 405.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 85.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cn+4" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 130.0, + "y": 385.0 + }, + { + "x": 130.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "OVR" + }, + "name": "unnamedWire#66" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "CoutE" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "CoutE" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "CoutE" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 25.0, + "y": 395.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901ALUInclDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json new file mode 100644 index 00000000..38b9bd59 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json @@ -0,0 +1,1346 @@ +{ + "width": 95.0, + "height": 110.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 70.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 0.0 + }, + "name": "Cn", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 95.0, + "y": 45.0 + }, + "name": "Cn+4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 95.0, + "y": 5.0 + }, + "name": "F1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 95.0, + "y": 15.0 + }, + "name": "F2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 95.0, + "y": 25.0 + }, + "name": "F3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 95.0, + "y": 35.0 + }, + "name": "F4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 25.0, + "y": 0.0 + }, + "name": "I0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 0.0 + }, + "name": "I1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 0.0 + }, + "name": "I2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 55.0, + "y": 0.0 + }, + "name": "I3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 65.0, + "y": 0.0 + }, + "name": "I4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 75.0, + "y": 0.0 + }, + "name": "I5", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 95.0, + "y": 55.0 + }, + "name": "OVR", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "Q1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 90.0 + }, + "name": "Q2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "Q3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 100.0 + }, + "name": "Q4", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "Am2901ALUInclDecode", + "name": "Am2901ALUInclDecode#0", + "pos": { + "x": 315.0, + "y": 15.0 + } + }, + { + "id": "Am2901SourceDecode", + "name": "Am2901SourceDecode#0", + "pos": { + "x": 155.0, + "y": 160.0 + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 209.0, + "y": 224.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 214.0, + "y": 234.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 219.0, + "y": 244.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 224.0, + "y": 254.0 + }, + "params": 1 + }, + { + "id": "sel2_4", + "name": "sel2_4#0", + "pos": { + "x": 235.0, + "y": 85.0 + } + }, + { + "id": "sel3_4", + "name": "sel3_4#0", + "pos": { + "x": 235.0, + "y": 190.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I5" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "I5" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 300.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cn" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "Cn" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 40.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 10.0, + "y": 100.0 + }, + { + "x": 10.0, + "y": 85.0 + }, + { + "x": 170.0, + "y": 85.0 + }, + { + "x": 170.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 55.0, + "y": 140.0 + }, + { + "x": 55.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 50.0, + "y": 160.0 + }, + { + "x": 50.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 45.0, + "y": 180.0 + }, + { + "x": 45.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 40.0, + "y": 200.0 + }, + { + "x": 40.0, + "y": 255.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 210.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 215.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 220.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 225.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "I3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I3" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 220.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 25.0, + "y": 240.0 + }, + { + "x": 25.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 20.0, + "y": 260.0 + }, + { + "x": 20.0, + "y": 275.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 20.0, + "y": 280.0 + }, + { + "x": 20.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B4" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 20.0, + "y": 300.0 + }, + { + "x": 20.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q1" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C1" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 20.0, + "y": 340.0 + }, + { + "x": 20.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q2" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C2" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 25.0, + "y": 360.0 + }, + { + "x": 25.0, + "y": 315.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q3" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C3" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 30.0, + "y": 380.0 + }, + { + "x": 30.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I2" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "I2" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 180.0, + "y": 5.0 + }, + { + "x": 150.0, + "y": 5.0 + }, + { + "x": 150.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q4" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C4" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 35.0, + "y": 400.0 + }, + { + "x": 35.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "SC" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "SQ" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 200.0, + "y": 215.0 + }, + { + "x": 200.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901SourceDecode#0", + "pinName": "RD" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "SA" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 195.0, + "y": 205.0 + }, + { + "x": 195.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901SourceDecode#0", + "pinName": "SB" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "SB" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 205.0, + "y": 185.0 + }, + { + "x": 205.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "SA" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "SA" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "R1" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 275.0, + "y": 90.0 + }, + { + "x": 275.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "R2" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 280.0, + "y": 100.0 + }, + { + "x": 280.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "R3" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 285.0, + "y": 110.0 + }, + { + "x": 285.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "R4" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 290.0, + "y": 120.0 + }, + { + "x": 290.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "I1" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 140.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "S1" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 295.0, + "y": 195.0 + }, + { + "x": 295.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "S2" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 300.0, + "y": 205.0 + }, + { + "x": 300.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "S3" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 305.0, + "y": 215.0 + }, + { + "x": 305.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "S4" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 310.0, + "y": 225.0 + }, + { + "x": 310.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "F1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F1" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "F2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F2" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 375.0, + "y": 30.0 + }, + { + "x": 375.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "F3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F3" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 370.0, + "y": 40.0 + }, + { + "x": 370.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "F4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F4" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 365.0, + "y": 50.0 + }, + { + "x": 365.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cn+4" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 360.0, + "y": 60.0 + }, + { + "x": 360.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "OVR" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "OVR" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 355.0, + "y": 70.0 + }, + { + "x": 355.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "I0" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 100.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I4" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "I4" + }, + "name": "unnamedWire#50", + "path": [ + { + "x": 260.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901SourceDecode#0", + "pinName": "RA" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "SB" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 205.0, + "y": 175.0 + }, + { + "x": 205.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 10.0, + "y": 40.0 + }, + { + "x": 10.0, + "y": 55.0 + }, + { + "x": 185.0, + "y": 55.0 + }, + { + "x": 185.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 10.0, + "y": 60.0 + }, + { + "x": 10.0, + "y": 65.0 + }, + { + "x": 180.0, + "y": 65.0 + }, + { + "x": 180.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 80.0 + }, + { + "x": 10.0, + "y": 75.0 + }, + { + "x": 175.0, + "y": 75.0 + }, + { + "x": 175.0, + "y": 130.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901ALUInclSourceDecodeInclFunctionDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json new file mode 100644 index 00000000..31cf8af2 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json @@ -0,0 +1,557 @@ +{ + "width": 35.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "Cin", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "CinE", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Cout", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "CoutE", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "F", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "FN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "L", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "R", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "RN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "S", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "SN", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 60.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 49.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 54.0, + "y": 69.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 10.0, + "y": 20.0 + } + }, + { + "id": "and", + "name": "and#1", + "pos": { + "x": 135.0, + "y": 20.0 + } + }, + { + "id": "fulladder", + "name": "fulladder#0", + "pos": { + "x": 60.0, + "y": 20.0 + } + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 90.0, + "y": 70.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 10.0, + "y": 190.0 + } + }, + { + "id": "xor", + "name": "xor#1", + "pos": { + "x": 10.0, + "y": 290.0 + } + }, + { + "id": "xor", + "name": "xor#2", + "pos": { + "x": 135.0, + "y": 70.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cin" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "CoutE" + }, + "pin2": { + "compName": "and#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 75.0 + }, + { + "x": 5.0, + "y": 10.0 + }, + { + "x": 130.0, + "y": 10.0 + }, + { + "x": 130.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 50.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "fulladder#0", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 50.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 55.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "fulladder#0", + "pinName": "C" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 55.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "fulladder#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 100.0, + "y": 25.0 + }, + { + "x": 100.0, + "y": 65.0 + }, + { + "x": 85.0, + "y": 65.0 + }, + { + "x": 85.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "fulladder#0", + "pinName": "Z" + }, + "pin2": { + "compName": "and#1", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 82.5, + "y": 65.0 + }, + { + "x": 82.5, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "xor#2", + "pinName": "A" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "CinE" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 7.5, + "y": 125.0 + }, + { + "x": 7.5, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "and#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cout" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "xor#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R" + }, + "pin2": { + "compName": "xor#0", + "pinName": "A" + }, + "name": "unnamedWire#3" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "RN" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#4" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S" + }, + "pin2": { + "compName": "xor#1", + "pinName": "A" + }, + "name": "unnamedWire#5" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SN" + }, + "pin2": { + "compName": "xor#1", + "pinName": "B" + }, + "name": "unnamedWire#6" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "FN" + }, + "pin2": { + "compName": "xor#2", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 130.0, + "y": 375.0 + }, + { + "x": 130.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "L" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 87.5, + "y": 425.0 + }, + { + "x": 87.5, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "fulladder#0", + "pinName": "A" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901ALUOneBit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json new file mode 100644 index 00000000..27cd4f01 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json @@ -0,0 +1,1095 @@ +{ + "width": 35.0, + "height": 60.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I6", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I7", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "I8", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "LSH", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "NSH", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "QWE", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "RAMWE", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "RSH", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "YF", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 15.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 15.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 80.0, + "y": 145.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 110.0, + "y": 105.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#12", + "pos": { + "x": 115.0, + "y": 210.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 15.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 15.0, + "y": 150.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 50.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 50.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 50.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 50.0, + "y": 130.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 80.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 80.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 39.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 74.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 74.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 74.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 74.0, + "y": 159.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 109.0, + "y": 214.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 4.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 9.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 9.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 9.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 4.0, + "y": 154.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 39.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 44.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 44.0, + "y": 54.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I8" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 5.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I6" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 5.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 5.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 5.0, + "y": 5.0 + }, + { + "x": 40.0, + "y": 5.0 + }, + { + "x": 40.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 40.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 40.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "NSH" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 45.0, + "y": 5.0 + }, + { + "x": 135.0, + "y": 5.0 + }, + { + "x": 135.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 45.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 10.0, + "y": 115.0 + }, + { + "x": 45.0, + "y": 115.0 + }, + { + "x": 45.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 40.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 40.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 75.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 75.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RAMWE" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 125.0, + "y": 60.0 + }, + { + "x": 125.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "A" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 75.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "LSH" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 125.0, + "y": 140.0 + }, + { + "x": 125.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 75.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "B" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RSH" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 130.0, + "y": 20.0 + }, + { + "x": 130.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#41" + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "B" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 75.0, + "y": 170.0 + }, + { + "x": 105.0, + "y": 170.0 + }, + { + "x": 105.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 110.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#12", + "pinName": "A" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#12", + "pinName": "B" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 110.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "YF" + }, + "name": "unnamedWire#46" + }, + { + "pin1": { + "compName": "NandGate#12", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QWE" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I7" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 10.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901DestDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json new file mode 100644 index 00000000..25a64839 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json @@ -0,0 +1,1138 @@ +{ + "width": 35.0, + "height": 50.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "I2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "RA", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "RD", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "SA", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "SB", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "SQ", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 10.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 70.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 70.0, + "y": 130.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#12", + "pos": { + "x": 70.0, + "y": 170.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#13", + "pos": { + "x": 100.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#14", + "pos": { + "x": 100.0, + "y": 170.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 10.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 40.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 40.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 40.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 40.0, + "y": 130.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 40.0, + "y": 170.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 70.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 70.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 6.5, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 36.5, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 64.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 64.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 64.0, + "y": 139.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 94.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 94.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 4.0, + "y": 144.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 6.5, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 6.5, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 6.5, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 31.5, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 34.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 34.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 34.0, + "y": 134.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I2" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 5.0 + }, + { + "x": 35.0, + "y": 5.0 + }, + { + "x": 35.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 7.5, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 7.5, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 7.5, + "y": 112.5 + }, + { + "x": 32.5, + "y": 112.5 + }, + { + "x": 32.5, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 32.5, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 32.5, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 35.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 35.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 37.5, + "y": 35.0 + }, + { + "x": 65.0, + "y": 35.0 + }, + { + "x": 65.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 37.5, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#29" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 7.5, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "A" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 65.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 65.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 65.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "B" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 65.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 65.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "B" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 65.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#12", + "pinName": "A" + }, + "name": "unnamedWire#39" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 7.5, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#13", + "pinName": "A" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 95.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#13", + "pinName": "B" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 95.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RA" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SB" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SA" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#12", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#14", + "pinName": "A" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 95.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#14", + "pinName": "B" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 95.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#13", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SQ" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#14", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RD" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#12", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 5.0, + "y": 195.0 + }, + { + "x": 65.0, + "y": 195.0 + }, + { + "x": 65.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 7.5, + "y": 55.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901SourceDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json new file mode 100644 index 00000000..424c5471 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json @@ -0,0 +1,5222 @@ +{ + "width": 120.0, + "height": 155.0, + "interfacePins": [ + { + "location": { + "x": 55.0, + "y": 0.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 120.0, + "y": 85.0 + }, + "name": "C0", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 120.0, + "y": 55.0 + }, + "name": "CT", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "Cx", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "I", + "logicWidth": 13, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "IC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "IN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "IOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "IZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 120.0, + "y": 125.0 + }, + "name": "QIO0", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 125.0 + }, + "name": "QIOn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 120.0 + }, + "name": "SIO0", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 120.0 + }, + "name": "SIOn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 10.0 + }, + "name": "YC", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 15.0 + }, + "name": "YN", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 20.0 + }, + "name": "YOVR", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 5.0 + }, + "name": "YZ", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 5.0, + "y": 0.0 + }, + "name": "_CEM", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 0.0 + }, + "name": "_CEmu", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 15.0, + "y": 0.0 + }, + "name": "_EC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 20.0, + "y": 0.0 + }, + "name": "_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 25.0, + "y": 0.0 + }, + "name": "_EOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 0.0 + }, + "name": "_EZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 110.0, + "y": 0.0 + }, + "name": "_OECT", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 90.0, + "y": 0.0 + }, + "name": "_OEY", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 110.0 + }, + "name": "_SE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Am2904MSR", + "name": "Am2904MSR#0", + "pos": { + "x": 205.0, + "y": 90.0 + } + }, + { + "id": "Am2904RegCTInstrDecode", + "name": "Am2904RegCTInstrDecode#0", + "pos": { + "x": 180.0, + "y": 190.0 + } + }, + { + "id": "Am2904ShiftInstrDecode", + "name": "Am2904ShiftInstrDecode#0", + "pos": { + "x": 100.0, + "y": 495.0 + } + }, + { + "id": "Am2904TestLogic", + "name": "Am2904TestLogic#0", + "pos": { + "x": 260.0, + "y": 330.0 + } + }, + { + "id": "Am2904muSR", + "name": "Am2904muSR#0", + "pos": { + "x": 350.0, + "y": 95.0 + } + }, + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 230.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 140.0, + "y": 5.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 455.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 555.0, + "y": 235.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 325.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 325.0, + "y": 75.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 325.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 325.0, + "y": 35.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 185.0, + "y": 70.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 185.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 185.0, + "y": 30.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 185.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 165.0 + }, + "params": { + "logicWidth": 13, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 575.0, + "y": 40.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#10", + "pos": { + "x": 445.0, + "y": 300.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#11", + "pos": { + "x": 455.0, + "y": 635.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#12", + "pos": { + "x": 455.0, + "y": 710.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#13", + "pos": { + "x": 135.0, + "y": 645.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#14", + "pos": { + "x": 310.0, + "y": 645.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#15", + "pos": { + "x": 430.0, + "y": 535.0 + }, + "params": { + "logicWidth": 2, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#16", + "pos": { + "x": 20.0, + "y": 235.0 + }, + "params": { + "logicWidth": 6, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#17", + "pos": { + "x": 20.0, + "y": 185.0 + }, + "params": { + "logicWidth": 5, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#18", + "pos": { + "x": 15.0, + "y": 65.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#19", + "pos": { + "x": 520.0, + "y": 90.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 440.0, + "y": 90.0 + }, + "params": { + "logicWidth": 2, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#20", + "pos": { + "x": 20.0, + "y": 165.0 + }, + "params": { + "logicWidth": 2, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 465.0, + "y": 100.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 425.0, + "y": 150.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#5", + "pos": { + "x": 425.0, + "y": 190.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#6", + "pos": { + "x": 320.0, + "y": 310.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#7", + "pos": { + "x": 445.0, + "y": 340.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#8", + "pos": { + "x": 445.0, + "y": 380.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#9", + "pos": { + "x": 255.0, + "y": 430.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 540.0, + "y": 70.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#1", + "pos": { + "x": 400.0, + "y": 635.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#2", + "pos": { + "x": 240.0, + "y": 635.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#3", + "pos": { + "x": 550.0, + "y": 625.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#4", + "pos": { + "x": 550.0, + "y": 650.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#5", + "pos": { + "x": 575.0, + "y": 265.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 274.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 189.0, + "y": 139.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 179.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 179.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 179.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 449.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 534.0, + "y": 104.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 334.0, + "y": 174.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 384.0, + "y": 164.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 349.0, + "y": 439.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 434.0, + "y": 674.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 264.0, + "y": 619.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 329.0, + "y": 124.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 289.0, + "y": 609.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 294.0, + "y": 614.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 359.0, + "y": 514.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 359.0, + "y": 594.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 149.0, + "y": 664.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 149.0, + "y": 674.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 299.0, + "y": 584.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 464.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 459.0, + "y": 349.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 559.0, + "y": 619.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 404.0, + "y": 114.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 249.0, + "y": 629.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 549.0, + "y": 239.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#32", + "pos": { + "x": 404.0, + "y": 169.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#33", + "pos": { + "x": 389.0, + "y": 204.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#34", + "pos": { + "x": 439.0, + "y": 684.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#35", + "pos": { + "x": 429.0, + "y": 664.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#36", + "pos": { + "x": 429.0, + "y": 619.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#37", + "pos": { + "x": 434.0, + "y": 644.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#38", + "pos": { + "x": 579.0, + "y": 609.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#39", + "pos": { + "x": 429.0, + "y": 609.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 224.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#40", + "pos": { + "x": 584.0, + "y": 624.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#41", + "pos": { + "x": 434.0, + "y": 614.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 569.0, + "y": 54.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 134.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 319.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 319.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 319.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 495.0, + "y": 60.0 + } + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 495.0, + "y": 280.0 + } + }, + { + "id": "mux1", + "name": "mux1#1", + "pos": { + "x": 275.0, + "y": 475.0 + } + }, + { + "id": "mux1", + "name": "mux1#2", + "pos": { + "x": 355.0, + "y": 445.0 + } + }, + { + "id": "mux1", + "name": "mux1#3", + "pos": { + "x": 395.0, + "y": 425.0 + } + }, + { + "id": "mux1", + "name": "mux1#4", + "pos": { + "x": 490.0, + "y": 530.0 + } + }, + { + "id": "mux1", + "name": "mux1#5", + "pos": { + "x": 445.0, + "y": 540.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 480.0, + "y": 85.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#1", + "pos": { + "x": 440.0, + "y": 135.0 + } + }, + { + "id": "mux2", + "name": "mux2#0", + "pos": { + "x": 470.0, + "y": 625.0 + } + }, + { + "id": "mux2", + "name": "mux2#1", + "pos": { + "x": 470.0, + "y": 700.0 + } + }, + { + "id": "mux2", + "name": "mux2#2", + "pos": { + "x": 325.0, + "y": 635.0 + } + }, + { + "id": "mux3", + "name": "mux3#0", + "pos": { + "x": 335.0, + "y": 300.0 + } + }, + { + "id": "mux3", + "name": "mux3#1", + "pos": { + "x": 155.0, + "y": 635.0 + } + }, + { + "id": "not4", + "name": "not4#0", + "pos": { + "x": 130.0, + "y": 40.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 535.0, + "y": 270.0 + } + }, + { + "id": "xor", + "name": "xor#1", + "pos": { + "x": 475.0, + "y": 320.0 + } + }, + { + "id": "xor", + "name": "xor#2", + "pos": { + "x": 315.0, + "y": 465.0 + } + }, + { + "id": "xor", + "name": "xor#3", + "pos": { + "x": 115.0, + "y": 740.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_MUX" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "MUX" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 325.0, + "y": 200.0 + }, + { + "x": 325.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O0" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#101", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_1" + }, + "name": "unnamedWire#102", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_2" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_3" + }, + "name": "unnamedWire#104", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_4" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "name": "unnamedWire#105", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 330.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_4" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_3" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O1" + }, + "name": "unnamedWire#108", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_2" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_1" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O3" + }, + "name": "unnamedWire#110", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 435.0, + "y": 355.0 + }, + { + "x": 435.0, + "y": 245.0 + }, + { + "x": 390.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 535.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2904TestLogic#0", + "pinName": "I" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 535.0, + "y": 260.0 + }, + { + "x": 385.0, + "y": 260.0 + }, + { + "x": 385.0, + "y": 290.0 + }, + { + "x": 255.0, + "y": 290.0 + }, + { + "x": 255.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y111" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I111" + }, + "name": "unnamedWire#114", + "path": [] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "I110" + }, + "pin2": { + "compName": "Am2904TestLogic#0", + "pinName": "Y110" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y101" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I101" + }, + "name": "unnamedWire#116", + "path": [] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "I100" + }, + "pin2": { + "compName": "Am2904TestLogic#0", + "pinName": "Y100" + }, + "name": "unnamedWire#117", + "path": [] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y011" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I011" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y010" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I010" + }, + "name": "unnamedWire#119", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O2" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "I001" + }, + "pin2": { + "compName": "Am2904TestLogic#0", + "pinName": "Y001" + }, + "name": "unnamedWire#120", + "path": [] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y000" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I000" + }, + "name": "unnamedWire#121", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "EN" + }, + "name": "unnamedWire#122", + "path": [ + { + "x": 585.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#123", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "CT_MUX" + }, + "name": "unnamedWire#124", + "path": [ + { + "x": 210.0, + "y": 320.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O0" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "S0" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "S1" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O1" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O2" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "S2" + }, + "name": "unnamedWire#127", + "path": [] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "CT_EXP" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#128", + "path": [ + { + "x": 230.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#129", + "path": [ + { + "x": 420.0, + "y": 310.0 + }, + { + "x": 420.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "A" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "CT_INV" + }, + "name": "unnamedWire#130", + "path": [ + { + "x": 415.0, + "y": 275.0 + }, + { + "x": 415.0, + "y": 280.0 + }, + { + "x": 220.0, + "y": 280.0 + } + ] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#131", + "path": [ + { + "x": 515.0, + "y": 325.0 + }, + { + "x": 515.0, + "y": 315.0 + }, + { + "x": 490.0, + "y": 315.0 + }, + { + "x": 490.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "I" + }, + "name": "unnamedWire#132", + "path": [ + { + "x": 335.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#133", + "path": [ + { + "x": 390.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O2" + }, + "pin2": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "name": "unnamedWire#134", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#135", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "name": "unnamedWire#136", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "I" + }, + "name": "unnamedWire#137", + "path": [ + { + "x": 385.0, + "y": 250.0 + }, + { + "x": 430.0, + "y": 250.0 + }, + { + "x": 430.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "OEN" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#138", + "path": [ + { + "x": 240.0, + "y": 185.0 + }, + { + "x": 410.0, + "y": 185.0 + }, + { + "x": 410.0, + "y": 80.0 + }, + { + "x": 485.0, + "y": 80.0 + }, + { + "x": 485.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O0" + }, + "name": "unnamedWire#139", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O4" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#140", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "I12-11" + }, + "name": "unnamedWire#141", + "path": [ + { + "x": 105.0, + "y": 170.0 + }, + { + "x": 105.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "C0_MUX" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "I" + }, + "name": "unnamedWire#142", + "path": [ + { + "x": 250.0, + "y": 445.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#1", + "pinName": "I1" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#143", + "path": [ + { + "x": 270.0, + "y": 500.0 + }, + { + "x": 270.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "mu" + }, + "name": "unnamedWire#144", + "path": [ + { + "x": 185.0, + "y": 170.0 + }, + { + "x": 185.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#1", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O2" + }, + "name": "unnamedWire#145", + "path": [ + { + "x": 265.0, + "y": 490.0 + }, + { + "x": 265.0, + "y": 510.0 + }, + { + "x": 480.0, + "y": 510.0 + }, + { + "x": 480.0, + "y": 350.0 + }, + { + "x": 470.0, + "y": 350.0 + }, + { + "x": 470.0, + "y": 310.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1#1", + "pinName": "S0" + }, + "name": "unnamedWire#146", + "path": [ + { + "x": 270.0, + "y": 450.0 + }, + { + "x": 270.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#1", + "pinName": "Y" + }, + "pin2": { + "compName": "xor#2", + "pinName": "B" + }, + "name": "unnamedWire#147", + "path": [] + }, + { + "pin1": { + "compName": "xor#2", + "pinName": "A" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O0" + }, + "name": "unnamedWire#148", + "path": [ + { + "x": 290.0, + "y": 470.0 + }, + { + "x": 290.0, + "y": 460.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O2" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#149", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "I5-0" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 105.0, + "y": 260.0 + }, + { + "x": 105.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "S0" + }, + "name": "unnamedWire#150", + "path": [ + { + "x": 350.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "xor#2", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "I1" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "mux1#2", + "pinName": "I0" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cx" + }, + "name": "unnamedWire#152", + "path": [ + { + "x": 300.0, + "y": 460.0 + }, + { + "x": 300.0, + "y": 465.0 + }, + { + "x": 240.0, + "y": 465.0 + }, + { + "x": 240.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#2", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#3", + "pinName": "I1" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "mux1#3", + "pinName": "I0" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#154", + "path": [] + }, + { + "pin1": { + "compName": "mux1#3", + "pinName": "S0" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O3" + }, + "name": "unnamedWire#155", + "path": [] + }, + { + "pin1": { + "compName": "mux1#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C0" + }, + "name": "unnamedWire#156", + "path": [ + { + "x": 560.0, + "y": 430.0 + }, + { + "x": 560.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#4", + "pinName": "I1" + }, + "pin2": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "name": "unnamedWire#157", + "path": [ + { + "x": 485.0, + "y": 555.0 + }, + { + "x": 485.0, + "y": 620.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SIOn" + }, + "name": "unnamedWire#158", + "path": [ + { + "x": 55.0, + "y": 620.0 + }, + { + "x": 55.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SIO0" + }, + "name": "unnamedWire#159", + "path": [ + { + "x": 580.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "I" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 75.0, + "y": 520.0 + }, + { + "x": 75.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#5", + "pinName": "I1" + }, + "pin2": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "name": "unnamedWire#160", + "path": [ + { + "x": 435.0, + "y": 565.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QIOn" + }, + "name": "unnamedWire#161", + "path": [ + { + "x": 435.0, + "y": 625.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "name": "unnamedWire#162", + "path": [ + { + "x": 580.0, + "y": 635.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "name": "unnamedWire#163", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#164", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "IN" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "Y" + }, + "name": "unnamedWire#165", + "path": [] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "SIO0_MUX" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "I" + }, + "name": "unnamedWire#166", + "path": [ + { + "x": 165.0, + "y": 500.0 + }, + { + "x": 165.0, + "y": 575.0 + }, + { + "x": 450.0, + "y": 575.0 + }, + { + "x": 450.0, + "y": 645.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O0" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I00" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O2" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "S1" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "S0" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O1" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IOVR" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O0" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 10.0, + "y": 125.0 + }, + { + "x": 10.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I10" + }, + "name": "unnamedWire#171", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O2" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#172", + "path": [ + { + "x": 485.0, + "y": 390.0 + }, + { + "x": 485.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#173", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O1" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "S0" + }, + "name": "unnamedWire#174", + "path": [] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "S1" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O2" + }, + "name": "unnamedWire#175", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O0" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I00" + }, + "name": "unnamedWire#176", + "path": [] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#4", + "pinName": "IN" + }, + "name": "unnamedWire#177", + "path": [ + { + "x": 545.0, + "y": 710.0 + }, + { + "x": 545.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "QIO0_MUX" + }, + "name": "unnamedWire#178", + "path": [ + { + "x": 445.0, + "y": 720.0 + }, + { + "x": 445.0, + "y": 580.0 + }, + { + "x": 175.0, + "y": 580.0 + }, + { + "x": 175.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "name": "unnamedWire#179", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IN" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O1" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 5.0, + "y": 100.0 + }, + { + "x": 5.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I10" + }, + "name": "unnamedWire#180", + "path": [ + { + "x": 435.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I01" + }, + "name": "unnamedWire#181", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I11" + }, + "name": "unnamedWire#182", + "path": [ + { + "x": 440.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#183", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "S0" + }, + "name": "unnamedWire#184", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#185", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "I000" + }, + "name": "unnamedWire#186", + "path": [] + }, + { + "pin1": { + "compName": "mux3#1", + "pinName": "I001" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#187", + "path": [ + { + "x": 150.0, + "y": 685.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "SIOn_MUX" + }, + "name": "unnamedWire#188", + "path": [ + { + "x": 130.0, + "y": 655.0 + }, + { + "x": 130.0, + "y": 580.0 + }, + { + "x": 170.0, + "y": 580.0 + }, + { + "x": 170.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O2" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "S2" + }, + "name": "unnamedWire#189", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "IC" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O1" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "S1" + }, + "name": "unnamedWire#190", + "path": [] + }, + { + "pin1": { + "compName": "mux3#1", + "pinName": "I010" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#191", + "path": [ + { + "x": 105.0, + "y": 695.0 + }, + { + "x": 105.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "I011" + }, + "name": "unnamedWire#192", + "path": [ + { + "x": 110.0, + "y": 615.0 + }, + { + "x": 110.0, + "y": 705.0 + } + ] + }, + { + "pin1": { + "compName": "mux3#1", + "pinName": "I100" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#193", + "path": [ + { + "x": 115.0, + "y": 715.0 + }, + { + "x": 115.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "xor#3", + "pinName": "Y" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "I111" + }, + "name": "unnamedWire#194", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#195", + "path": [ + { + "x": 465.0, + "y": 495.0 + }, + { + "x": 345.0, + "y": 495.0 + }, + { + "x": 345.0, + "y": 585.0 + } + ] + }, + { + "pin1": { + "compName": "mux3#1", + "pinName": "I110" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O1" + }, + "name": "unnamedWire#196", + "path": [ + { + "x": 125.0, + "y": 735.0 + }, + { + "x": 125.0, + "y": 605.0 + }, + { + "x": 350.0, + "y": 605.0 + }, + { + "x": 350.0, + "y": 500.0 + }, + { + "x": 470.0, + "y": 500.0 + }, + { + "x": 470.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#2", + "pinName": "I01" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#197", + "path": [ + { + "x": 290.0, + "y": 675.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#2", + "pinName": "I10" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#198", + "path": [ + { + "x": 295.0, + "y": 685.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "I101" + }, + "name": "unnamedWire#199", + "path": [ + { + "x": 120.0, + "y": 585.0 + }, + { + "x": 120.0, + "y": 725.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_OVRRET" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "OVRRET" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 345.0, + "y": 210.0 + }, + { + "x": 345.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IZ" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O3" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 5.0, + "y": 50.0 + }, + { + "x": 5.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "xor#1", + "pinName": "B" + }, + "name": "unnamedWire#200", + "path": [ + { + "x": 465.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "mux2#2", + "pinName": "I11" + }, + "name": "unnamedWire#201", + "path": [ + { + "x": 300.0, + "y": 695.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "OEn" + }, + "name": "unnamedWire#202", + "path": [ + { + "x": 250.0, + "y": 540.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "OE0" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#203", + "path": [ + { + "x": 390.0, + "y": 550.0 + }, + { + "x": 390.0, + "y": 585.0 + }, + { + "x": 560.0, + "y": 585.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "xor#1", + "pinName": "A" + }, + "name": "unnamedWire#204", + "path": [ + { + "x": 460.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "xor#3", + "pinName": "A" + }, + "name": "unnamedWire#205", + "path": [ + { + "x": 460.0, + "y": 490.0 + }, + { + "x": 340.0, + "y": 490.0 + }, + { + "x": 340.0, + "y": 600.0 + }, + { + "x": 100.0, + "y": 600.0 + }, + { + "x": 100.0, + "y": 745.0 + } + ] + }, + { + "pin1": { + "compName": "xor#3", + "pinName": "B" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O0" + }, + "name": "unnamedWire#206", + "path": [ + { + "x": 95.0, + "y": 755.0 + }, + { + "x": 95.0, + "y": 590.0 + }, + { + "x": 355.0, + "y": 590.0 + }, + { + "x": 355.0, + "y": 505.0 + }, + { + "x": 475.0, + "y": 505.0 + }, + { + "x": 475.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#2", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "IN" + }, + "name": "unnamedWire#207", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O2" + }, + "pin2": { + "compName": "mux2#2", + "pinName": "S1" + }, + "name": "unnamedWire#208", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O1" + }, + "pin2": { + "compName": "mux2#2", + "pinName": "S0" + }, + "name": "unnamedWire#209", + "path": [] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_CINV" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "CINV" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 340.0, + "y": 220.0 + }, + { + "x": 340.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "QIOn_MUX" + }, + "name": "unnamedWire#210", + "path": [ + { + "x": 305.0, + "y": 655.0 + }, + { + "x": 305.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O0" + }, + "pin2": { + "compName": "mux2#2", + "pinName": "I00" + }, + "name": "unnamedWire#211", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "IN" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "Y" + }, + "name": "unnamedWire#212", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_SE" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "_SE" + }, + "name": "unnamedWire#213", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "EN" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#214", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#4", + "pinName": "EN" + }, + "name": "unnamedWire#215", + "path": [ + { + "x": 575.0, + "y": 620.0 + }, + { + "x": 575.0, + "y": 645.0 + }, + { + "x": 560.0, + "y": 645.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "M" + }, + "name": "unnamedWire#216", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "I" + }, + "name": "unnamedWire#217", + "path": [ + { + "x": 405.0, + "y": 240.0 + }, + { + "x": 440.0, + "y": 240.0 + }, + { + "x": 440.0, + "y": 315.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "EN" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#218", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "EN" + }, + "name": "unnamedWire#219", + "path": [ + { + "x": 410.0, + "y": 630.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 105.0, + "y": 80.0 + }, + { + "x": 105.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "name": "unnamedWire#220", + "path": [ + { + "x": 440.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#5", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#4", + "pinName": "I0" + }, + "name": "unnamedWire#221", + "path": [] + }, + { + "pin1": { + "compName": "mux1#4", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "COVD_V" + }, + "name": "unnamedWire#222", + "path": [ + { + "x": 530.0, + "y": 535.0 + }, + { + "x": 530.0, + "y": 525.0 + }, + { + "x": 230.0, + "y": 525.0 + }, + { + "x": 230.0, + "y": 310.0 + }, + { + "x": 295.0, + "y": 310.0 + }, + { + "x": 295.0, + "y": 85.0 + }, + { + "x": 275.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "OUT" + }, + "name": "unnamedWire#223", + "path": [ + { + "x": 265.0, + "y": 645.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#4", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "name": "unnamedWire#224", + "path": [ + { + "x": 585.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "MC_MUX" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "I" + }, + "name": "unnamedWire#226", + "path": [ + { + "x": 410.0, + "y": 560.0 + }, + { + "x": 410.0, + "y": 540.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1#5", + "pinName": "S0" + }, + "name": "unnamedWire#227", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1#4", + "pinName": "S0" + }, + "name": "unnamedWire#228", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I11" + }, + "name": "unnamedWire#229", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "I" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I01" + }, + "name": "unnamedWire#230", + "path": [ + { + "x": 430.0, + "y": 740.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "name": "unnamedWire#231", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "OUT" + }, + "name": "unnamedWire#232", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#233", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#234", + "path": [ + { + "x": 550.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_OECT" + }, + "name": "unnamedWire#235", + "path": [ + { + "x": 550.0, + "y": 215.0 + }, + { + "x": 565.0, + "y": 215.0 + }, + { + "x": 565.0, + "y": 25.0 + }, + { + "x": 550.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#5", + "pinName": "OUT" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "CT" + }, + "name": "unnamedWire#236", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#5", + "pinName": "IN" + }, + "pin2": { + "compName": "xor#0", + "pinName": "Y" + }, + "name": "unnamedWire#237", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "mux1#5", + "pinName": "I0" + }, + "name": "unnamedWire#238", + "path": [ + { + "x": 430.0, + "y": 555.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#239", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 190.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QIO0" + }, + "name": "unnamedWire#240", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "name": "unnamedWire#242", + "path": [ + { + "x": 585.0, + "y": 615.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904MSR#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 300.0, + "y": 110.0 + }, + { + "x": 300.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "I" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "Am2904muSR#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 405.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "I" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "C" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 255.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "C" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 300.0, + "y": 60.0 + }, + { + "x": 300.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "MSR_MUX" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "MUX" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 200.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "MC_EN" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "COVD_EN" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 225.0, + "y": 570.0 + }, + { + "x": 225.0, + "y": 305.0 + }, + { + "x": 290.0, + "y": 305.0 + }, + { + "x": 290.0, + "y": 80.0 + }, + { + "x": 265.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 225.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_CEmu" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O0" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 320.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "_EOVR" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 390.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "_EN" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 380.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904muSR#0", + "pinName": "_EC" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 370.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "_EZ" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 360.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "B" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_WEZ" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 305.0, + "y": 30.0 + }, + { + "x": 305.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_WEC" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 310.0, + "y": 240.0 + }, + { + "x": 310.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "YZ" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 595.0, + "y": 40.0 + }, + { + "x": 595.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YC" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "YN" + }, + "name": "unnamedWire#51", + "path": [ + { + "x": 595.0, + "y": 60.0 + }, + { + "x": 595.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YOVR" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#52", + "path": [ + { + "x": 590.0, + "y": 100.0 + }, + { + "x": 590.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "Y" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 570.0, + "y": 50.0 + }, + { + "x": 415.0, + "y": 50.0 + }, + { + "x": 415.0, + "y": 180.0 + }, + { + "x": 195.0, + "y": 180.0 + }, + { + "x": 195.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 135.0, + "y": 10.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_CEM" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 25.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "B" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_WEN" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 315.0, + "y": 70.0 + }, + { + "x": 315.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_WEOVR" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 320.0, + "y": 260.0 + }, + { + "x": 320.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O2" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 180.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "_EOVR" + }, + "name": "unnamedWire#66", + "path": [ + { + "x": 245.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904MSR#0", + "pinName": "_EN" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 235.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "_EC" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 225.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "_EZ" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 215.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 170.0, + "y": 45.0 + }, + { + "x": 170.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "B" + }, + "pin2": { + "compName": "not4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 175.0, + "y": 45.0 + }, + { + "x": 175.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#73", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 175.0, + "y": 75.0 + }, + { + "x": 175.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "A1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EZ" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 50.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EC" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A2" + }, + "name": "unnamedWire#76", + "path": [ + { + "x": 75.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "A3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EN" + }, + "name": "unnamedWire#77", + "path": [ + { + "x": 100.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A4" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 125.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 570.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O4" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#80", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 450.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_OEY" + }, + "name": "unnamedWire#82", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#83", + "path": [] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 550.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#85", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y2" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y4" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O1" + }, + "name": "unnamedWire#90", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#91", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O3" + }, + "name": "unnamedWire#92", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "I" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "Y_MUX" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#94", + "path": [ + { + "x": 190.0, + "y": 275.0 + }, + { + "x": 360.0, + "y": 275.0 + }, + { + "x": 360.0, + "y": 225.0 + }, + { + "x": 420.0, + "y": 225.0 + }, + { + "x": 420.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "S0" + }, + "name": "unnamedWire#95", + "path": [ + { + "x": 455.0, + "y": 100.0 + }, + { + "x": 455.0, + "y": 130.0 + }, + { + "x": 435.0, + "y": 130.0 + }, + { + "x": 435.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2904", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "msr": { + "id": "delegating", + "params": { + "delegateTarget": "Am2904MSR#0" + } + }, + "musr": { + "id": "delegating", + "params": { + "delegateTarget": "Am2904muSR#0" + } + } + }, + "atomicHighLevelStates": {} + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json new file mode 100644 index 00000000..927d41f8 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json @@ -0,0 +1,1936 @@ +{ + "width": 80.0, + "height": 75.0, + "interfacePins": [ + { + "location": { + "x": 50.0, + "y": 0.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 60.0, + "y": 0.0 + }, + "name": "COVD_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 70.0, + "y": 0.0 + }, + "name": "COVD_V", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "I", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 70.0 + }, + "name": "MUX", + "logicWidth": 3, + "usage": "INPUT" + }, + { + "location": { + "x": 80.0, + "y": 20.0 + }, + "name": "Q", + "logicWidth": 4, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 30.0 + }, + "name": "Y", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 20.0, + "y": 0.0 + }, + "name": "_EC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 30.0, + "y": 0.0 + }, + "name": "_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 40.0, + "y": 0.0 + }, + "name": "_EOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 0.0 + }, + "name": "_EZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "mu", + "logicWidth": 4, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 170.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 35.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 135.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 45.0, + "y": 340.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 5.0, + "y": 235.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 385.0, + "y": 85.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 19.0, + "y": 224.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 364.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 74.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 74.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 34.0, + "y": 234.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 124.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 74.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 164.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 269.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 369.0, + "y": 94.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 374.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 379.0, + "y": 114.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 29.0, + "y": 284.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 39.0, + "y": 304.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 19.0, + "y": 194.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 79.0, + "y": 254.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 39.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 195.0, + "y": 50.0 + } + }, + { + "id": "dff4_finewe", + "name": "dff4_finewe#0", + "pos": { + "x": 325.0, + "y": 80.0 + } + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 280.0, + "y": 175.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 45.0, + "y": 80.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#1", + "pos": { + "x": 85.0, + "y": 220.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#2", + "pos": { + "x": 90.0, + "y": 30.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#3", + "pos": { + "x": 130.0, + "y": 170.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#4", + "pos": { + "x": 175.0, + "y": 120.0 + } + }, + { + "id": "not4", + "name": "not4#0", + "pos": { + "x": 45.0, + "y": 270.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 40.0, + "y": 190.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "C" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 250.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE4" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 200.0, + "y": 30.0 + }, + { + "x": 305.0, + "y": 30.0 + }, + { + "x": 305.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "mu" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 35.0, + "y": 95.0 + }, + { + "x": 35.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 30.0, + "y": 45.0 + }, + { + "x": 30.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 25.0, + "y": 55.0 + }, + { + "x": 25.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 20.0, + "y": 65.0 + }, + { + "x": 20.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EN" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE3" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 150.0, + "y": 25.0 + }, + { + "x": 310.0, + "y": 25.0 + }, + { + "x": 310.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "MUX" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "I" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 30.0, + "y": 245.0 + }, + { + "x": 30.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 60.0, + "y": 360.0 + }, + { + "x": 60.0, + "y": 335.0 + }, + { + "x": 20.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "Q4" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EC" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 100.0, + "y": 20.0 + }, + { + "x": 190.0, + "y": 20.0 + }, + { + "x": 190.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_1" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_2" + }, + "pin2": { + "compName": "not4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_3" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_4" + }, + "pin2": { + "compName": "not4#0", + "pinName": "Y4" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A1" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 365.0, + "y": 315.0 + }, + { + "x": 25.0, + "y": 315.0 + }, + { + "x": 25.0, + "y": 275.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 370.0, + "y": 320.0 + }, + { + "x": 30.0, + "y": 320.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A3" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 375.0, + "y": 325.0 + }, + { + "x": 35.0, + "y": 325.0 + }, + { + "x": 35.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 380.0, + "y": 330.0 + }, + { + "x": 40.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_4" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 30.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EZ" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE1" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 50.0, + "y": 15.0 + }, + { + "x": 320.0, + "y": 15.0 + }, + { + "x": 320.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_2" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 40.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_3" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 20.0, + "y": 175.0 + }, + { + "x": 40.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "S0" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "I1_1" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 40.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "I1_3" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "I0_4" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "I0_3" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "I0_2" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "I0_1" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 75.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_1" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "I0_1" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 35.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "I0_2" + }, + "pin2": { + "compName": "xor#0", + "pinName": "Y" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "I0_3" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 80.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "I0_4" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 25.0, + "y": 265.0 + }, + { + "x": 25.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "I1_1" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y2" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "I1_3" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y4" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 125.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "S0" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "S0" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 85.0, + "y": 175.0 + }, + { + "x": 85.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "Y4" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "D4" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 235.0, + "y": 155.0 + }, + { + "x": 235.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "D3" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "Y3" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 240.0, + "y": 155.0 + }, + { + "x": 240.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE2" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 235.0, + "y": 55.0 + }, + { + "x": 235.0, + "y": 20.0 + }, + { + "x": 315.0, + "y": 20.0 + }, + { + "x": 315.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "D1" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "Y1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 250.0, + "y": 135.0 + }, + { + "x": 250.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "Y4" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "I1_3" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "Y2" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "I1_1" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "I0_4" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "Y4" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 140.0, + "y": 165.0 + }, + { + "x": 140.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "I0_3" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 145.0, + "y": 55.0 + }, + { + "x": 145.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "I0_2" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "Y2" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 150.0, + "y": 145.0 + }, + { + "x": 150.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "I0_1" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 155.0, + "y": 35.0 + }, + { + "x": 155.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "S0" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 170.0, + "y": 340.0 + }, + { + "x": 170.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#83", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "COVD_EN" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 300.0, + "y": 10.0 + }, + { + "x": 270.0, + "y": 10.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 165.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "COVD_V" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 350.0, + "y": 70.0 + }, + { + "x": 265.0, + "y": 70.0 + }, + { + "x": 265.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "Y2" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 245.0, + "y": 135.0 + }, + { + "x": 245.0, + "y": 145.0 + }, + { + "x": 275.0, + "y": 145.0 + }, + { + "x": 275.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "D2" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 320.0, + "y": 180.0 + }, + { + "x": 320.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 165.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 270.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#93", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "MSR", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "dff4_finewe#0", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json new file mode 100644 index 00000000..2c007e54 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json @@ -0,0 +1,774 @@ +{ + "width": 60.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "I", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 60.0, + "y": 10.0 + }, + "name": "Y000", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 20.0 + }, + "name": "Y001", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 30.0 + }, + "name": "Y010", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 40.0 + }, + "name": "Y011", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 50.0 + }, + "name": "Y100", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 60.0 + }, + "name": "Y101", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 70.0 + }, + "name": "Y110", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 80.0 + }, + "name": "Y111", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 85.0, + "y": 20.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 45.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 120.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 45.0, + "y": 105.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 80.0, + "y": 115.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 80.0, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 110.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 29.0, + "y": 129.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 34.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 39.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 79.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 79.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 19.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 24.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 39.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 74.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 74.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 24.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 40.0, + "y": 20.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "A" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 110.0, + "y": 20.0 + }, + { + "x": 110.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 20.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 40.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 115.0, + "y": 60.0 + }, + { + "x": 115.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y001" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 80.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y000" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 25.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y011" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 35.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y010" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y100" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 70.0, + "y": 115.0 + }, + { + "x": 70.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y101" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y110" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 30.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 75.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 40.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 25.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y111" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 30.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 20.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 35.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Test\nlogic", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json new file mode 100644 index 00000000..2949d8da --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json @@ -0,0 +1,1128 @@ +{ + "width": 50.0, + "height": 65.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "CINV", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "I", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 30.0 + }, + "name": "M", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "MUX", + "logicWidth": 2, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "OVRRET", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 50.0, + "y": 10.0 + }, + "name": "Q", + "logicWidth": 4, + "usage": "OUTPUT" + }, + { + "location": { + "x": 20.0, + "y": 0.0 + }, + "name": "_EC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 30.0, + "y": 0.0 + }, + "name": "_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 40.0, + "y": 0.0 + }, + "name": "_EOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 0.0 + }, + "name": "_EZ", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 155.0, + "y": 135.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 125.0, + "y": 150.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 125.0, + "y": 130.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 135.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 185.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 5.0, + "y": 95.0 + }, + "params": { + "logicWidth": 2, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 230.0, + "y": 30.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 19.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 59.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 59.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 224.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 114.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 59.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "dff4_finewe", + "name": "dff4_finewe#0", + "pos": { + "x": 185.0, + "y": 25.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 25.0, + "y": 125.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#1", + "pos": { + "x": 65.0, + "y": 75.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 130.0, + "y": 105.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "Q2" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 20.0, + "y": 210.0 + }, + { + "x": 20.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 20.0, + "y": 165.0 + }, + { + "x": 20.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 20.0, + "y": 155.0 + }, + { + "x": 20.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 20.0, + "y": 145.0 + }, + { + "x": 20.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "MUX" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 20.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_4" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_2" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "Q3" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_1" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_1" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 60.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_2" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_3" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_4" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 20.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "S0" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 20.0, + "y": 95.0 + }, + { + "x": 20.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "B" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 150.0, + "y": 150.0 + }, + { + "x": 150.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "OVRRET" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 115.0, + "y": 300.0 + }, + { + "x": 115.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 225.0, + "y": 175.0 + }, + { + "x": 120.0, + "y": 175.0 + }, + { + "x": 120.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "xor#0", + "pinName": "A" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 125.0, + "y": 90.0 + }, + { + "x": 125.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "CINV" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 105.0, + "y": 250.0 + }, + { + "x": 105.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "_WE1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EZ" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 180.0, + "y": 40.0 + }, + { + "x": 180.0, + "y": 5.0 + }, + { + "x": 50.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "C" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 55.0, + "y": 50.0 + }, + { + "x": 55.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE4" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 200.0, + "y": 20.0 + }, + { + "x": 165.0, + "y": 20.0 + }, + { + "x": 165.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "_WE3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EN" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 170.0, + "y": 60.0 + }, + { + "x": 170.0, + "y": 15.0 + }, + { + "x": 150.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 245.0, + "y": 45.0 + }, + { + "x": 245.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EC" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE2" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 100.0, + "y": 10.0 + }, + { + "x": 175.0, + "y": 10.0 + }, + { + "x": 175.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "D1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y1" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "D2" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 170.0, + "y": 110.0 + }, + { + "x": 170.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "D3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y3" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y4" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 115.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "D4" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 180.0, + "y": 145.0 + }, + { + "x": 180.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 115.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 20.0, + "y": 135.0 + }, + { + "x": 20.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "M" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 20.0, + "y": 185.0 + }, + { + "x": 20.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 190.0 + }, + { + "x": 20.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 20.0, + "y": 205.0 + }, + { + "x": 20.0, + "y": 200.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "µSR", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "dff4_finewe#0", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json new file mode 100644 index 00000000..9a6e0ba7 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json @@ -0,0 +1,1159 @@ +{ + "width": 60.0, + "height": 45.0, + "interfacePins": [ + { + "location": { + "x": 40.0, + "y": 0.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 60.0, + "y": 30.0 + }, + "name": "CI", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 30.0, + "y": 0.0 + }, + "name": "D", + "logicWidth": 12, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "Y", + "logicWidth": 12, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "_CC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "_CCEN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 60.0, + "y": 5.0 + }, + "name": "_FULL", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 15.0, + "y": 45.0 + }, + "name": "_MAP", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 40.0, + "y": 45.0 + }, + "name": "_OE", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 45.0 + }, + "name": "_PL", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "_RLD", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 20.0, + "y": 45.0 + }, + "name": "_VECT", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Am2910InstrPLA", + "name": "Am2910InstrPLA#0", + "pos": { + "x": 70.0, + "y": 90.0 + } + }, + { + "id": "Am2910RegCntr", + "name": "Am2910RegCntr#0", + "pos": { + "x": 130.0, + "y": 15.0 + } + }, + { + "id": "Am2910SP", + "name": "Am2910SP#0", + "pos": { + "x": 240.0, + "y": 10.0 + } + }, + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 40.0, + "y": 45.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 10.0, + "y": 60.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 205.0, + "y": 195.0 + }, + "params": 1 + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 165.0, + "y": 180.0 + }, + "params": { + "logicWidth": 12, + "orientation": "DOWN" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 259.0, + "y": 99.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 224.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 174.0, + "y": 174.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 164.0, + "y": 59.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 149.0, + "y": 9.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 4.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 234.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 199.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 234.0, + "y": 69.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 199.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "dff12", + "name": "dff12#0", + "pos": { + "x": 240.0, + "y": 105.0 + } + }, + { + "id": "inc", + "name": "inc#0", + "pos": { + "x": 240.0, + "y": 140.0 + }, + "params": 12 + }, + { + "id": "nor12", + "name": "nor12#0", + "pos": { + "x": 175.0, + "y": 50.0 + } + }, + { + "id": "ram5_12", + "name": "ram5_12#0", + "pos": { + "x": 240.0, + "y": 55.0 + } + }, + { + "id": "sel4_12", + "name": "sel4_12#0", + "pos": { + "x": 135.0, + "y": 110.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "YD" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "SA" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "YR" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "SB" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "nor12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2910InstrPLA#0", + "pinName": "R\u003d0" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 215.0, + "y": 60.0 + }, + { + "x": 215.0, + "y": 75.0 + }, + { + "x": 85.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "RWE" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "WE" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 105.0, + "y": 95.0 + }, + { + "x": 105.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "RDEC" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "DEC" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 110.0, + "y": 105.0 + }, + { + "x": 110.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "STKI0" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 225.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "STKI1" + }, + "pin2": { + "compName": "Am2910SP#0", + "pinName": "STKI1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 230.0, + "y": 165.0 + }, + { + "x": 230.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2910SP#0", + "pinName": "STKI0" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 225.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "ram5_12#0", + "pinName": "WE" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "sel4_12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "inc#0", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 260.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "ram5_12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "C" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 185.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "YF" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "SC" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "D" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 205.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "B" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "nor12#0", + "pinName": "D" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "D" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "A" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 125.0, + "y": 10.0 + }, + { + "x": 125.0, + "y": 65.0 + }, + { + "x": 145.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_RLD" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "_RLD" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 50.0, + "y": 25.0 + }, + { + "x": 50.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2910InstrPLA#0", + "pinName": "PASS" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 65.0, + "y": 55.0 + }, + { + "x": 65.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_CC" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "YmuPC" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "SD" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_CCEN" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 5.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 35.0, + "y": 70.0 + }, + { + "x": 35.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910SP#0", + "pinName": "_FULL" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_FULL" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff12#0", + "pinName": "C" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 235.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "Am2910SP#0", + "pinName": "C" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "C" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff12#0", + "pinName": "D" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "CI" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "CI" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "_PL" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_PL" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 75.0, + "y": 180.0 + }, + { + "x": 50.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "_MAP" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_MAP" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 85.0, + "y": 185.0 + }, + { + "x": 75.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "_VECT" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_VECT" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 95.0, + "y": 190.0 + }, + { + "x": 100.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Am2910InstrPLA#0", + "pinName": "I" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 35.0, + "y": 125.0 + }, + { + "x": 35.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "dff12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "ram5_12#0", + "pinName": "C" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_OE" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 200.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 230.0, + "y": 190.0 + }, + { + "x": 230.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "ram5_12#0", + "pinName": "D" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Am2910SP#0", + "pinName": "A" + }, + "pin2": { + "compName": "ram5_12#0", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Am2910SP#0", + "pinName": "B" + }, + "pin2": { + "compName": "ram5_12#0", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Am2910RegCntr#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 150.0, + "y": 60.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2910", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "mupc": { + "id": "delegating", + "params": { + "delegateTarget": "dff12#0" + } + }, + "r": { + "id": "delegating", + "params": { + "delegateTarget": "Am2910RegCntr#0" + } + }, + "sp": { + "id": "delegating", + "params": { + "delegateTarget": "Am2910SP#0" + } + }, + "stack": { + "id": "delegating", + "params": { + "delegateTarget": "ram5_12#0" + } + } + }, + "atomicHighLevelStates": {} + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json new file mode 100644 index 00000000..459bca8d --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json @@ -0,0 +1,158 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 20.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 50.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 44.0, + "y": 24.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#1" + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 45.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 45.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#5" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "and", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json new file mode 100644 index 00000000..b8c98863 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json @@ -0,0 +1,355 @@ +{ + "width": 35.0, + "height": 50.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 24.0, + "y": 46.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 71.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 24.0, + "y": 96.5 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 30.0, + "y": 7.5 + } + }, + { + "id": "and", + "name": "and#1", + "pos": { + "x": 30.0, + "y": 32.5 + } + }, + { + "id": "and", + "name": "and#2", + "pos": { + "x": 30.0, + "y": 57.5 + } + }, + { + "id": "and", + "name": "and#3", + "pos": { + "x": 30.0, + "y": 82.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "and#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 25.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "and#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "and#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "and#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "and#2", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "and#3", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 25.0, + "y": 112.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and#3", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "and#2", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and#1", + "pinName": "B" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "and41", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json new file mode 100644 index 00000000..a2b45122 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json @@ -0,0 +1,520 @@ +{ + "width": 35.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "C2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "C3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "C4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "and41", + "name": "and41#0", + "pos": { + "x": 15.0, + "y": 137.5 + } + }, + { + "id": "or_4", + "name": "or_4#0", + "pos": { + "x": 35.0, + "y": 37.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A1" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 10.0, + "y": 112.5 + }, + { + "x": 10.0, + "y": 142.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A2" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 137.5 + }, + { + "x": 5.0, + "y": 152.5 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 65.0, + "y": 152.5 + }, + { + "x": 65.0, + "y": 125.0 + }, + { + "x": 25.0, + "y": 125.0 + }, + { + "x": 25.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 60.0, + "y": 162.5 + }, + { + "x": 60.0, + "y": 130.0 + }, + { + "x": 20.0, + "y": 130.0 + }, + { + "x": 20.0, + "y": 102.5 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 55.0, + "y": 172.5 + }, + { + "x": 55.0, + "y": 135.0 + }, + { + "x": 15.0, + "y": 135.0 + }, + { + "x": 15.0, + "y": 112.5 + } + ] + }, + { + "pin1": { + "compName": "or_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 75.0, + "y": 42.5 + }, + { + "x": 75.0, + "y": 12.5 + } + ] + }, + { + "pin1": { + "compName": "or_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 80.0, + "y": 52.5 + }, + { + "x": 80.0, + "y": 37.5 + } + ] + }, + { + "pin1": { + "compName": "or_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "or_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 80.0, + "y": 72.5 + }, + { + "x": 80.0, + "y": 87.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A3" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A4" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 5.0, + "y": 187.5 + }, + { + "x": 5.0, + "y": 172.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "and41#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 10.0, + "y": 212.5 + }, + { + "x": 10.0, + "y": 182.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C1" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 10.0, + "y": 12.5 + }, + { + "x": 10.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C2" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 5.0, + "y": 37.5 + }, + { + "x": 5.0, + "y": 52.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C3" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C4" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 5.0, + "y": 87.5 + }, + { + "x": 5.0, + "y": 72.5 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 70.0, + "y": 142.5 + }, + { + "x": 70.0, + "y": 120.0 + }, + { + "x": 30.0, + "y": 120.0 + }, + { + "x": 30.0, + "y": 82.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "andor414", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json new file mode 100644 index 00000000..d8d7c36a --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json @@ -0,0 +1,544 @@ +{ + "width": 35.0, + "height": 40.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y00", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y01", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y10", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y11", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 10.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 6.5, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 6.5, + "y": 16.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 36.5, + "y": 61.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 4.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 4.0, + "y": 41.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 31.5, + "y": 66.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 31.5, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 34.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 40.0, + "y": 2.5 + } + }, + { + "id": "and", + "name": "and#1", + "pos": { + "x": 40.0, + "y": 27.5 + } + }, + { + "id": "and", + "name": "and#2", + "pos": { + "x": 40.0, + "y": 52.5 + } + }, + { + "id": "and", + "name": "and#3", + "pos": { + "x": 40.0, + "y": 77.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 32.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 35.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and#1", + "pinName": "A" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 37.5, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "and#1", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 35.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "and#2", + "pinName": "A" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 32.5, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "and#2", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and#3", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 37.5, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "and#3", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 32.5, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 7.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y00" + }, + "name": "unnamedWire#20" + }, + { + "pin1": { + "compName": "and#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y01" + }, + "name": "unnamedWire#21" + }, + { + "pin1": { + "compName": "and#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y10" + }, + "name": "unnamedWire#22" + }, + { + "pin1": { + "compName": "and#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y11" + }, + "name": "unnamedWire#23" + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 5.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 7.5, + "y": 62.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 5.0, + "y": 67.5 + }, + { + "x": 32.5, + "y": 67.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "demux2", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json new file mode 100644 index 00000000..2c771c07 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json @@ -0,0 +1,372 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "_Q", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 120.0, + "y": 20.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 9.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 19.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 94.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 104.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "_rsLatch", + "name": "_rsLatch#0", + "pos": { + "x": 40.0, + "y": 70.0 + } + }, + { + "id": "_rsLatch", + "name": "_rsLatch#1", + "pos": { + "x": 120.0, + "y": 45.0 + } + }, + { + "id": "nand3", + "name": "nand3#0", + "pos": { + "x": 40.0, + "y": 30.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#0", + "pinName": "_R" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 10.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "nand3#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#1", + "pinName": "_R" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 105.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "_rsLatch#1", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#13" + }, + { + "pin1": { + "compName": "_rsLatch#1", + "pinName": "_Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_Q" + }, + "name": "unnamedWire#14" + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "B" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 10.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 145.0, + "y": 30.0 + }, + { + "x": 145.0, + "y": 10.0 + }, + { + "x": 20.0, + "y": 10.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#0", + "pinName": "_S" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 20.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "C" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_rsLatch#0", + "pinName": "_Q" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 95.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "A" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 30.0, + "y": 65.0 + }, + { + "x": 30.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#1", + "pinName": "_S" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 95.0, + "y": 50.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "dff", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "_rsLatch#1", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json new file mode 100644 index 00000000..188770f4 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json @@ -0,0 +1,1313 @@ +{ + "width": 55.0, + "height": 45.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "D", + "logicWidth": 12, + "usage": "INPUT" + }, + { + "location": { + "x": 55.0, + "y": 20.0 + }, + "name": "Q", + "logicWidth": 12, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 70.0, + "y": 45.0 + }, + "params": { + "logicWidth": 12, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 255.0, + "y": 45.0 + }, + "params": { + "logicWidth": 12, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 124.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 124.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 179.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 124.0, + "y": 114.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 124.0, + "y": 144.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 124.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 269.0, + "y": 99.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 179.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 179.0, + "y": 164.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 179.0, + "y": 44.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 179.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#0", + "pos": { + "x": 185.0, + "y": 30.0 + } + }, + { + "id": "dff", + "name": "dff#1", + "pos": { + "x": 185.0, + "y": 60.0 + } + }, + { + "id": "dff", + "name": "dff#10", + "pos": { + "x": 185.0, + "y": 120.0 + } + }, + { + "id": "dff", + "name": "dff#11", + "pos": { + "x": 130.0, + "y": 100.0 + } + }, + { + "id": "dff", + "name": "dff#2", + "pos": { + "x": 130.0, + "y": 10.0 + } + }, + { + "id": "dff", + "name": "dff#3", + "pos": { + "x": 130.0, + "y": 40.0 + } + }, + { + "id": "dff", + "name": "dff#4", + "pos": { + "x": 130.0, + "y": 70.0 + } + }, + { + "id": "dff", + "name": "dff#5", + "pos": { + "x": 185.0, + "y": 150.0 + } + }, + { + "id": "dff", + "name": "dff#6", + "pos": { + "x": 185.0, + "y": 180.0 + } + }, + { + "id": "dff", + "name": "dff#7", + "pos": { + "x": 130.0, + "y": 160.0 + } + }, + { + "id": "dff", + "name": "dff#8", + "pos": { + "x": 130.0, + "y": 130.0 + } + }, + { + "id": "dff", + "name": "dff#9", + "pos": { + "x": 185.0, + "y": 90.0 + } + }, + { + "id": "mux1_12", + "name": "mux1_12#0", + "pos": { + "x": 15.0, + "y": 70.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 125.0, + "y": 5.0 + }, + { + "x": 180.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "dff#11", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#10", + "pinName": "D" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 115.0, + "y": 115.0 + }, + { + "x": 115.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "dff#8", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 110.0, + "y": 135.0 + }, + { + "x": 110.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "dff#5", + "pinName": "D" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 105.0, + "y": 135.0 + }, + { + "x": 105.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "dff#7", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 100.0, + "y": 165.0 + }, + { + "x": 100.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "dff#6", + "pinName": "D" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 95.0, + "y": 155.0 + }, + { + "x": 95.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "mux1_12#0", + "pinName": "S" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 5.0, + "y": 100.0 + }, + { + "x": 5.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "mux1_12#0", + "pinName": "I1" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 5.0, + "y": 175.0 + }, + { + "x": 5.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#2", + "pinName": "C" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "dff#3", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff#4", + "pinName": "C" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#11", + "pinName": "C" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff#8", + "pinName": "C" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "mux1_12#0", + "pinName": "I0" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 90.0 + }, + { + "x": 10.0, + "y": 205.0 + }, + { + "x": 270.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff#7", + "pinName": "C" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 125.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "dff#6", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 180.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dff#5", + "pinName": "C" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "dff#10", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dff#9", + "pinName": "C" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "C" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "dff#2", + "pinName": "D" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 85.0, + "y": 45.0 + }, + { + "x": 85.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff#0", + "pinName": "C" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "dff#0", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 90.0, + "y": 35.0 + }, + { + "x": 90.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O11" + }, + "pin2": { + "compName": "dff#2", + "pinName": "Q" + }, + "name": "unnamedWire#53", + "path": [ + { + "x": 250.0, + "y": 45.0 + }, + { + "x": 250.0, + "y": 25.0 + }, + { + "x": 170.0, + "y": 25.0 + }, + { + "x": 170.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "dff#0", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O10" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 240.0, + "y": 35.0 + }, + { + "x": 240.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O9" + }, + "pin2": { + "compName": "dff#3", + "pinName": "Q" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 235.0, + "y": 65.0 + }, + { + "x": 235.0, + "y": 55.0 + }, + { + "x": 170.0, + "y": 55.0 + }, + { + "x": 170.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "dff#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O8" + }, + "name": "unnamedWire#56", + "path": [ + { + "x": 230.0, + "y": 65.0 + }, + { + "x": 230.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "dff#4", + "pinName": "Q" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 170.0, + "y": 85.0 + }, + { + "x": 170.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "dff#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "dff#11", + "pinName": "Q" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 225.0, + "y": 105.0 + }, + { + "x": 225.0, + "y": 115.0 + }, + { + "x": 170.0, + "y": 115.0 + }, + { + "x": 170.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dff#3", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 95.0, + "y": 45.0 + }, + { + "x": 95.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#10", + "pinName": "Q" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 230.0, + "y": 115.0 + }, + { + "x": 230.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "dff#8", + "pinName": "Q" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 235.0, + "y": 125.0 + }, + { + "x": 235.0, + "y": 145.0 + }, + { + "x": 170.0, + "y": 145.0 + }, + { + "x": 170.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "dff#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 240.0, + "y": 155.0 + }, + { + "x": 240.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "dff#7", + "pinName": "Q" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 245.0, + "y": 145.0 + }, + { + "x": 245.0, + "y": 175.0 + }, + { + "x": 170.0, + "y": 175.0 + }, + { + "x": 170.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "dff#6", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 250.0, + "y": 185.0 + }, + { + "x": 250.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "dff#1", + "pinName": "D" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 100.0, + "y": 75.0 + }, + { + "x": 100.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "dff#4", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 105.0, + "y": 75.0 + }, + { + "x": 105.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "dff#9", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n12 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q12", + "q11", + "q10", + "q9", + "q8", + "q7", + "q6", + "q5", + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#6", + "subStateID": "q" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff#3", + "subStateID": "q" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff#0", + "subStateID": "q" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff#2", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#7", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#5", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#8", + "subStateID": "q" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff#10", + "subStateID": "q" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff#11", + "subStateID": "q" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff#9", + "subStateID": "q" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff#4", + "subStateID": "q" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff#1", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json new file mode 100644 index 00000000..6efc9033 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json @@ -0,0 +1,1601 @@ +{ + "width": 45.0, + "height": 55.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 25.0 + }, + "name": "Q", + "logicWidth": 16, + "usage": "TRISTATE" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 50.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 210.0, + "y": 50.0 + }, + "params": { + "logicWidth": 16, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 64.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 64.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 114.0, + "y": 139.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 114.0, + "y": 229.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 114.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 114.0, + "y": 169.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 114.0, + "y": 199.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 64.0, + "y": 89.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 64.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 64.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 64.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 64.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 114.0, + "y": 79.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 114.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#0", + "pos": { + "x": 70.0, + "y": 15.0 + } + }, + { + "id": "dff", + "name": "dff#1", + "pos": { + "x": 120.0, + "y": 35.0 + } + }, + { + "id": "dff", + "name": "dff#10", + "pos": { + "x": 120.0, + "y": 245.0 + } + }, + { + "id": "dff", + "name": "dff#11", + "pos": { + "x": 70.0, + "y": 225.0 + } + }, + { + "id": "dff", + "name": "dff#12", + "pos": { + "x": 70.0, + "y": 195.0 + } + }, + { + "id": "dff", + "name": "dff#13", + "pos": { + "x": 120.0, + "y": 155.0 + } + }, + { + "id": "dff", + "name": "dff#14", + "pos": { + "x": 120.0, + "y": 185.0 + } + }, + { + "id": "dff", + "name": "dff#15", + "pos": { + "x": 70.0, + "y": 165.0 + } + }, + { + "id": "dff", + "name": "dff#2", + "pos": { + "x": 120.0, + "y": 65.0 + } + }, + { + "id": "dff", + "name": "dff#3", + "pos": { + "x": 70.0, + "y": 45.0 + } + }, + { + "id": "dff", + "name": "dff#4", + "pos": { + "x": 120.0, + "y": 95.0 + } + }, + { + "id": "dff", + "name": "dff#5", + "pos": { + "x": 120.0, + "y": 125.0 + } + }, + { + "id": "dff", + "name": "dff#6", + "pos": { + "x": 70.0, + "y": 75.0 + } + }, + { + "id": "dff", + "name": "dff#7", + "pos": { + "x": 70.0, + "y": 105.0 + } + }, + { + "id": "dff", + "name": "dff#8", + "pos": { + "x": 70.0, + "y": 135.0 + } + }, + { + "id": "dff", + "name": "dff#9", + "pos": { + "x": 120.0, + "y": 215.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "dff#0", + "pinName": "D" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 20.0, + "y": 50.0 + }, + { + "x": 20.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "dff#1", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 25.0, + "y": 40.0 + }, + { + "x": 25.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "dff#15", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 45.0, + "y": 170.0 + }, + { + "x": 45.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#14", + "pinName": "D" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 40.0, + "y": 160.0 + }, + { + "x": 40.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "dff#12", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 35.0, + "y": 200.0 + }, + { + "x": 35.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "dff#9", + "pinName": "D" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 30.0, + "y": 180.0 + }, + { + "x": 30.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "dff#11", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 25.0, + "y": 230.0 + }, + { + "x": 25.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "dff#10", + "pinName": "D" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 20.0, + "y": 200.0 + }, + { + "x": 20.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#0", + "pinName": "C" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "C" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "dff#3", + "pinName": "D" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 30.0, + "y": 70.0 + }, + { + "x": 30.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#6", + "pinName": "C" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "dff#7", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff#8", + "pinName": "C" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff#15", + "pinName": "C" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dff#12", + "pinName": "C" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "dff#2", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 35.0, + "y": 70.0 + }, + { + "x": 35.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dff#11", + "pinName": "C" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 65.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "dff#10", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 115.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "dff#9", + "pinName": "C" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "dff#14", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "dff#13", + "pinName": "C" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "dff#5", + "pinName": "C" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "dff#6", + "pinName": "D" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 40.0, + "y": 90.0 + }, + { + "x": 40.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "dff#4", + "pinName": "C" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff#2", + "pinName": "C" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "C" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 65.0, + "y": 10.0 + }, + { + "x": 115.0, + "y": 10.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 10.0, + "y": 30.0 + }, + { + "x": 10.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O15" + }, + "pin2": { + "compName": "dff#0", + "pinName": "Q" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 200.0, + "y": 50.0 + }, + { + "x": 200.0, + "y": 30.0 + }, + { + "x": 110.0, + "y": 30.0 + }, + { + "x": 110.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "dff#4", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "dff#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O14" + }, + "name": "unnamedWire#50", + "path": [ + { + "x": 195.0, + "y": 40.0 + }, + { + "x": 195.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O13" + }, + "pin2": { + "compName": "dff#3", + "pinName": "Q" + }, + "name": "unnamedWire#51", + "path": [ + { + "x": 190.0, + "y": 70.0 + }, + { + "x": 190.0, + "y": 60.0 + }, + { + "x": 110.0, + "y": 60.0 + }, + { + "x": 110.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O12" + }, + "pin2": { + "compName": "dff#2", + "pinName": "Q" + }, + "name": "unnamedWire#52", + "path": [ + { + "x": 185.0, + "y": 80.0 + }, + { + "x": 185.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O11" + }, + "pin2": { + "compName": "dff#6", + "pinName": "Q" + }, + "name": "unnamedWire#53", + "path": [ + { + "x": 110.0, + "y": 90.0 + }, + { + "x": 110.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "dff#4", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O10" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O9" + }, + "pin2": { + "compName": "dff#7", + "pinName": "Q" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 160.0, + "y": 110.0 + }, + { + "x": 160.0, + "y": 120.0 + }, + { + "x": 110.0, + "y": 120.0 + }, + { + "x": 110.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "dff#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O8" + }, + "name": "unnamedWire#56", + "path": [ + { + "x": 165.0, + "y": 130.0 + }, + { + "x": 165.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "dff#8", + "pinName": "Q" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 170.0, + "y": 130.0 + }, + { + "x": 170.0, + "y": 150.0 + }, + { + "x": 110.0, + "y": 150.0 + }, + { + "x": 110.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "dff#13", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 175.0, + "y": 160.0 + }, + { + "x": 175.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "dff#15", + "pinName": "Q" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 180.0, + "y": 150.0 + }, + { + "x": 180.0, + "y": 180.0 + }, + { + "x": 110.0, + "y": 180.0 + }, + { + "x": 110.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "dff#7", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#14", + "pinName": "Q" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 185.0, + "y": 160.0 + }, + { + "x": 185.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "dff#12", + "pinName": "Q" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 190.0, + "y": 170.0 + }, + { + "x": 190.0, + "y": 210.0 + }, + { + "x": 110.0, + "y": 210.0 + }, + { + "x": 110.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "dff#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 195.0, + "y": 220.0 + }, + { + "x": 195.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "dff#11", + "pinName": "Q" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 200.0, + "y": 190.0 + }, + { + "x": 200.0, + "y": 240.0 + }, + { + "x": 110.0, + "y": 240.0 + }, + { + "x": 110.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "dff#10", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 205.0, + "y": 250.0 + }, + { + "x": 205.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "dff#5", + "pinName": "D" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 60.0, + "y": 120.0 + }, + { + "x": 60.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "dff#8", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 55.0, + "y": 140.0 + }, + { + "x": 55.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "dff#13", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 50.0, + "y": 140.0 + }, + { + "x": 50.0, + "y": 160.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n16 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q16", + "q15", + "q14", + "q13", + "q12", + "q11", + "q10", + "q9", + "q8", + "q7", + "q6", + "q5", + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#10", + "subStateID": "q" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff#7", + "subStateID": "q" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff#4", + "subStateID": "q" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff#6", + "subStateID": "q" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dff#2", + "subStateID": "q" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dff#3", + "subStateID": "q" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dff#1", + "subStateID": "q" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dff#0", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#11", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#9", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#12", + "subStateID": "q" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff#14", + "subStateID": "q" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff#15", + "subStateID": "q" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff#13", + "subStateID": "q" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff#8", + "subStateID": "q" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff#5", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json new file mode 100644 index 00000000..0d24ad3f --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json @@ -0,0 +1,325 @@ +{ + "width": 45.0, + "height": 55.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 25.0 + }, + "name": "Q", + "logicWidth": 16, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "_WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 164.0, + "y": 99.0 + }, + "params": 16 + }, + { + "id": "dff16", + "name": "dff16#0", + "pos": { + "x": 110.0, + "y": 75.0 + } + }, + { + "id": "mux1_16", + "name": "mux1_16#0", + "pos": { + "x": 30.0, + "y": 75.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "mux1_16#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "D" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 95.0, + "y": 125.0 + }, + { + "x": 95.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "dff16#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "C" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 95.0, + "y": 20.0 + }, + { + "x": 95.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_WE" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "S" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I1" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 165.0, + "y": 205.0 + }, + { + "x": 10.0, + "y": 205.0 + }, + { + "x": 10.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I0" + }, + "name": "unnamedWire#68", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n16 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q" + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q1" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q10" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q11" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q12" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q13" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q14" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q15" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q16" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q2" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q3" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q4" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q5" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q6" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q7" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q8" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q9" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json new file mode 100644 index 00000000..09127e66 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json @@ -0,0 +1,334 @@ +{ + "width": 45.0, + "height": 55.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 25.0 + }, + "name": "Q", + "logicWidth": 16, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 164.0, + "y": 99.0 + }, + "params": 16 + }, + { + "id": "dff16", + "name": "dff16#0", + "pos": { + "x": 110.0, + "y": 75.0 + } + }, + { + "id": "mux1_16", + "name": "mux1_16#0", + "pos": { + "x": 30.0, + "y": 75.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "mux1_16#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "D" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 95.0, + "y": 125.0 + }, + { + "x": 95.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "dff16#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "C" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 95.0, + "y": 20.0 + }, + { + "x": 95.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "S" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I0" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 165.0, + "y": 205.0 + }, + { + "x": 20.0, + "y": 205.0 + }, + { + "x": 20.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I1" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 10.0, + "y": 100.0 + }, + { + "x": 10.0, + "y": 165.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n16 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q" + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q1" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q10" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q11" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q12" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q13" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q14" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q15" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q16" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q2" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q3" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q4" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q5" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q6" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q7" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q8" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q9" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json new file mode 100644 index 00000000..cd203617 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json @@ -0,0 +1,742 @@ +{ + "width": 35.0, + "height": 60.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Q3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Q4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 104.0, + "y": 184.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 104.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 104.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 169.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 164.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 159.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 154.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#0", + "pos": { + "x": 115.0, + "y": 20.0 + } + }, + { + "id": "dff", + "name": "dff#1", + "pos": { + "x": 115.0, + "y": 70.0 + } + }, + { + "id": "dff", + "name": "dff#2", + "pos": { + "x": 115.0, + "y": 120.0 + } + }, + { + "id": "dff", + "name": "dff#3", + "pos": { + "x": 115.0, + "y": 170.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 55.0, + "y": 60.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#0", + "pinName": "C" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 105.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "dff#0", + "pinName": "D" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 100.0, + "y": 65.0 + }, + { + "x": 100.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 25.0, + "y": 25.0 + }, + { + "x": 25.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 20.0, + "y": 75.0 + }, + { + "x": 20.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 25.0, + "y": 125.0 + }, + { + "x": 25.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "dff#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q1" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "Q" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 25.0, + "y": 175.0 + }, + { + "x": 25.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "dff#2", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q3" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "dff#1", + "pinName": "D" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q4" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "Q" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "dff#2", + "pinName": "D" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 100.0, + "y": 85.0 + }, + { + "x": 100.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "dff#3", + "pinName": "D" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 95.0, + "y": 95.0 + }, + { + "x": 95.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 170.0, + "y": 205.0 + }, + { + "x": 50.0, + "y": 205.0 + }, + { + "x": 50.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 165.0, + "y": 210.0 + }, + { + "x": 45.0, + "y": 210.0 + }, + { + "x": 45.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 160.0, + "y": 215.0 + }, + { + "x": 40.0, + "y": 215.0 + }, + { + "x": 40.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 155.0, + "y": 220.0 + }, + { + "x": 35.0, + "y": 220.0 + }, + { + "x": 35.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "C" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "C" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#2", + "pinName": "C" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 225.0 + }, + { + "x": 20.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 275.0 + }, + { + "x": 10.0, + "y": 65.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n4 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#0", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#1", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#2", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#3", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json new file mode 100644 index 00000000..005cabe4 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json @@ -0,0 +1,742 @@ +{ + "width": 35.0, + "height": 60.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Q3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Q4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "_WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 104.0, + "y": 184.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 104.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 104.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 169.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 164.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 159.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 154.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#0", + "pos": { + "x": 115.0, + "y": 20.0 + } + }, + { + "id": "dff", + "name": "dff#1", + "pos": { + "x": 115.0, + "y": 70.0 + } + }, + { + "id": "dff", + "name": "dff#2", + "pos": { + "x": 115.0, + "y": 120.0 + } + }, + { + "id": "dff", + "name": "dff#3", + "pos": { + "x": 115.0, + "y": 170.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 55.0, + "y": 60.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#0", + "pinName": "C" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 105.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "dff#0", + "pinName": "D" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 100.0, + "y": 65.0 + }, + { + "x": 100.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 25.0, + "y": 25.0 + }, + { + "x": 25.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 20.0, + "y": 75.0 + }, + { + "x": 20.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 20.0, + "y": 125.0 + }, + { + "x": 20.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "dff#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q1" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "Q" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 25.0, + "y": 175.0 + }, + { + "x": 25.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dff#2", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q3" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "dff#1", + "pinName": "D" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q4" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "Q" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "dff#2", + "pinName": "D" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 100.0, + "y": 85.0 + }, + { + "x": 100.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "dff#3", + "pinName": "D" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 95.0, + "y": 95.0 + }, + { + "x": 95.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 170.0, + "y": 205.0 + }, + { + "x": 50.0, + "y": 205.0 + }, + { + "x": 50.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 165.0, + "y": 210.0 + }, + { + "x": 45.0, + "y": 210.0 + }, + { + "x": 45.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 160.0, + "y": 215.0 + }, + { + "x": 40.0, + "y": 215.0 + }, + { + "x": 40.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 155.0, + "y": 220.0 + }, + { + "x": 35.0, + "y": 220.0 + }, + { + "x": 35.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "C" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "C" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#2", + "pinName": "C" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 225.0 + }, + { + "x": 20.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_WE" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 275.0 + }, + { + "x": 10.0, + "y": 65.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n4 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#0", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#1", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#2", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#3", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json new file mode 100644 index 00000000..8c2a5b3b --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json @@ -0,0 +1,859 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D", + "logicWidth": 8, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q", + "logicWidth": 8, + "usage": "TRISTATE" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 160.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 39.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 89.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 39.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 39.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 89.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 89.0, + "y": 44.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#10", + "pos": { + "x": 95.0, + "y": 60.0 + } + }, + { + "id": "dff", + "name": "dff#11", + "pos": { + "x": 45.0, + "y": 40.0 + } + }, + { + "id": "dff", + "name": "dff#4", + "pos": { + "x": 45.0, + "y": 10.0 + } + }, + { + "id": "dff", + "name": "dff#5", + "pos": { + "x": 95.0, + "y": 90.0 + } + }, + { + "id": "dff", + "name": "dff#6", + "pos": { + "x": 95.0, + "y": 120.0 + } + }, + { + "id": "dff", + "name": "dff#7", + "pos": { + "x": 45.0, + "y": 100.0 + } + }, + { + "id": "dff", + "name": "dff#8", + "pos": { + "x": 45.0, + "y": 70.0 + } + }, + { + "id": "dff", + "name": "dff#9", + "pos": { + "x": 95.0, + "y": 30.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 40.0, + "y": 5.0 + }, + { + "x": 90.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "dff#11", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 30.0, + "y": 45.0 + }, + { + "x": 30.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#10", + "pinName": "D" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 25.0, + "y": 70.0 + }, + { + "x": 25.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "dff#8", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 25.0, + "y": 75.0 + }, + { + "x": 25.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "dff#5", + "pinName": "D" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 25.0, + "y": 90.0 + }, + { + "x": 25.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "dff#7", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 25.0, + "y": 105.0 + }, + { + "x": 25.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "dff#6", + "pinName": "D" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 20.0, + "y": 110.0 + }, + { + "x": 20.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#11", + "pinName": "C" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff#8", + "pinName": "C" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff#7", + "pinName": "C" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 40.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "dff#6", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 90.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dff#5", + "pinName": "C" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "dff#10", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dff#9", + "pinName": "C" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#4", + "pinName": "C" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "dff#4", + "pinName": "Q" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 155.0, + "y": 40.0 + }, + { + "x": 155.0, + "y": 25.0 + }, + { + "x": 85.0, + "y": 25.0 + }, + { + "x": 85.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "dff#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 150.0, + "y": 35.0 + }, + { + "x": 150.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "dff#11", + "pinName": "Q" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 145.0, + "y": 60.0 + }, + { + "x": 145.0, + "y": 55.0 + }, + { + "x": 85.0, + "y": 55.0 + }, + { + "x": 85.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#10", + "pinName": "Q" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 140.0, + "y": 70.0 + }, + { + "x": 140.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "dff#8", + "pinName": "Q" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 140.0, + "y": 80.0 + }, + { + "x": 140.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "dff#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 140.0, + "y": 95.0 + }, + { + "x": 140.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "dff#7", + "pinName": "Q" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 140.0, + "y": 100.0 + }, + { + "x": 140.0, + "y": 115.0 + }, + { + "x": 85.0, + "y": 115.0 + }, + { + "x": 85.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dff#6", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 150.0, + "y": 125.0 + }, + { + "x": 150.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "dff#4", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 15.0 + }, + { + "x": 20.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "dff#9", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 25.0, + "y": 50.0 + }, + { + "x": 25.0, + "y": 35.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n8 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q8", + "q7", + "q6", + "q5", + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#6", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#7", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#5", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#8", + "subStateID": "q" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff#10", + "subStateID": "q" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff#11", + "subStateID": "q" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff#9", + "subStateID": "q" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff#4", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json new file mode 100644 index 00000000..e1f37bc6 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json @@ -0,0 +1,3563 @@ +{ + "width": 25.0, + "height": 165.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "D", + "logicWidth": 80, + "usage": "INPUT" + }, + { + "location": { + "x": 25.0, + "y": 85.0 + }, + "name": "Q", + "logicWidth": 80, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 15.0, + "y": 30.0 + }, + "params": { + "logicWidth": 80, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 90.0, + "y": 750.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#10", + "pos": { + "x": 30.0, + "y": 670.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#11", + "pos": { + "x": 30.0, + "y": 750.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#12", + "pos": { + "x": 90.0, + "y": 510.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#13", + "pos": { + "x": 90.0, + "y": 590.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#14", + "pos": { + "x": 90.0, + "y": 110.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#15", + "pos": { + "x": 90.0, + "y": 430.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#16", + "pos": { + "x": 90.0, + "y": 190.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#17", + "pos": { + "x": 90.0, + "y": 350.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#18", + "pos": { + "x": 90.0, + "y": 270.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#19", + "pos": { + "x": 90.0, + "y": 670.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 30.0, + "y": 30.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#20", + "pos": { + "x": 90.0, + "y": 30.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#21", + "pos": { + "x": 105.0, + "y": 30.0 + }, + "params": { + "logicWidth": 80, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 30.0, + "y": 110.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 30.0, + "y": 190.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#5", + "pos": { + "x": 30.0, + "y": 270.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#6", + "pos": { + "x": 30.0, + "y": 350.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#7", + "pos": { + "x": 30.0, + "y": 430.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#8", + "pos": { + "x": 30.0, + "y": 510.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#9", + "pos": { + "x": 30.0, + "y": 590.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 44.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 44.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 44.0, + "y": 214.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 44.0, + "y": 294.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 44.0, + "y": 454.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 44.0, + "y": 374.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 44.0, + "y": 614.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 44.0, + "y": 534.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 44.0, + "y": 694.0 + }, + "params": 1 + }, + { + "id": "dff8", + "name": "dff8#0", + "pos": { + "x": 50.0, + "y": 770.0 + } + }, + { + "id": "dff8", + "name": "dff8#1", + "pos": { + "x": 50.0, + "y": 690.0 + } + }, + { + "id": "dff8", + "name": "dff8#2", + "pos": { + "x": 50.0, + "y": 610.0 + } + }, + { + "id": "dff8", + "name": "dff8#3", + "pos": { + "x": 50.0, + "y": 530.0 + } + }, + { + "id": "dff8", + "name": "dff8#4", + "pos": { + "x": 50.0, + "y": 450.0 + } + }, + { + "id": "dff8", + "name": "dff8#5", + "pos": { + "x": 50.0, + "y": 370.0 + } + }, + { + "id": "dff8", + "name": "dff8#6", + "pos": { + "x": 50.0, + "y": 290.0 + } + }, + { + "id": "dff8", + "name": "dff8#7", + "pos": { + "x": 50.0, + "y": 210.0 + } + }, + { + "id": "dff8", + "name": "dff8#8", + "pos": { + "x": 50.0, + "y": 130.0 + } + }, + { + "id": "dff8", + "name": "dff8#9", + "pos": { + "x": 50.0, + "y": 50.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O79" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O78" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O69" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O59" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O3" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O58" + }, + "name": "unnamedWire#101", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O57" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O1" + }, + "name": "unnamedWire#102", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O56" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O55" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O7" + }, + "name": "unnamedWire#104", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O54" + }, + "name": "unnamedWire#105", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O53" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O5" + }, + "name": "unnamedWire#106", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O52" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O51" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O3" + }, + "name": "unnamedWire#108", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O50" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O68" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O49" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O1" + }, + "name": "unnamedWire#110", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O48" + }, + "name": "unnamedWire#111", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O7" + }, + "name": "unnamedWire#112", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O46" + }, + "name": "unnamedWire#113", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O5" + }, + "name": "unnamedWire#114", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O44" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O3" + }, + "name": "unnamedWire#116", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O42" + }, + "name": "unnamedWire#117", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O1" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O40" + }, + "name": "unnamedWire#119", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O67" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O39" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O7" + }, + "name": "unnamedWire#120", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O38" + }, + "name": "unnamedWire#121", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O37" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O5" + }, + "name": "unnamedWire#122", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O36" + }, + "name": "unnamedWire#123", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O35" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O3" + }, + "name": "unnamedWire#124", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O34" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O33" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O1" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O32" + }, + "name": "unnamedWire#127", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O31" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O7" + }, + "name": "unnamedWire#128", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O30" + }, + "name": "unnamedWire#129", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O66" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O29" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O5" + }, + "name": "unnamedWire#130", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O28" + }, + "name": "unnamedWire#131", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O27" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O3" + }, + "name": "unnamedWire#132", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O26" + }, + "name": "unnamedWire#133", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O25" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O1" + }, + "name": "unnamedWire#134", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O24" + }, + "name": "unnamedWire#135", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O23" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O7" + }, + "name": "unnamedWire#136", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O22" + }, + "name": "unnamedWire#137", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O21" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O5" + }, + "name": "unnamedWire#138", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O20" + }, + "name": "unnamedWire#139", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O65" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O19" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O3" + }, + "name": "unnamedWire#140", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O18" + }, + "name": "unnamedWire#141", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O17" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O1" + }, + "name": "unnamedWire#142", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O16" + }, + "name": "unnamedWire#143", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O7" + }, + "name": "unnamedWire#144", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O14" + }, + "name": "unnamedWire#145", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O5" + }, + "name": "unnamedWire#146", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O12" + }, + "name": "unnamedWire#147", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O3" + }, + "name": "unnamedWire#148", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O10" + }, + "name": "unnamedWire#149", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O64" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O1" + }, + "name": "unnamedWire#150", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O8" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "name": "unnamedWire#152", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O6" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "name": "unnamedWire#154", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O4" + }, + "name": "unnamedWire#155", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "name": "unnamedWire#156", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O2" + }, + "name": "unnamedWire#157", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "name": "unnamedWire#158", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O0" + }, + "name": "unnamedWire#159", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O63" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O7" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#9", + "pinName": "D" + }, + "name": "unnamedWire#160", + "path": [] + }, + { + "pin1": { + "compName": "dff8#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "I" + }, + "name": "unnamedWire#161", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#8", + "pinName": "D" + }, + "name": "unnamedWire#162", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#7", + "pinName": "D" + }, + "name": "unnamedWire#163", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#6", + "pinName": "D" + }, + "name": "unnamedWire#164", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#5", + "pinName": "D" + }, + "name": "unnamedWire#165", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#4", + "pinName": "D" + }, + "name": "unnamedWire#166", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#3", + "pinName": "D" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#2", + "pinName": "D" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#1", + "pinName": "D" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O62" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#0", + "pinName": "D" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#0", + "pinName": "Q" + }, + "name": "unnamedWire#171", + "path": [] + }, + { + "pin1": { + "compName": "dff8#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "I" + }, + "name": "unnamedWire#172", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#2", + "pinName": "Q" + }, + "name": "unnamedWire#173", + "path": [] + }, + { + "pin1": { + "compName": "dff8#3", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "I" + }, + "name": "unnamedWire#174", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#4", + "pinName": "Q" + }, + "name": "unnamedWire#175", + "path": [] + }, + { + "pin1": { + "compName": "dff8#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "I" + }, + "name": "unnamedWire#176", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#6", + "pinName": "Q" + }, + "name": "unnamedWire#177", + "path": [] + }, + { + "pin1": { + "compName": "dff8#7", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "I" + }, + "name": "unnamedWire#178", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#8", + "pinName": "Q" + }, + "name": "unnamedWire#179", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O61" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O5" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#180", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "I" + }, + "name": "unnamedWire#181", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#182", + "path": [ + { + "x": 45.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff8#9", + "pinName": "C" + }, + "name": "unnamedWire#183", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff8#8", + "pinName": "C" + }, + "name": "unnamedWire#184", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#185", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#186", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff8#7", + "pinName": "C" + }, + "name": "unnamedWire#187", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#188", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff8#6", + "pinName": "C" + }, + "name": "unnamedWire#189", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O60" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#190", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dff8#5", + "pinName": "C" + }, + "name": "unnamedWire#191", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#192", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff8#4", + "pinName": "C" + }, + "name": "unnamedWire#193", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#194", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dff8#3", + "pinName": "C" + }, + "name": "unnamedWire#195", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#196", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff8#2", + "pinName": "C" + }, + "name": "unnamedWire#197", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#198", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff8#1", + "pinName": "C" + }, + "name": "unnamedWire#199", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O77" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O59" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff8#0", + "pinName": "C" + }, + "name": "unnamedWire#200", + "path": [ + { + "x": 45.0, + "y": 775.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O58" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O57" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O56" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O55" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O7" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O54" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O53" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O5" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O52" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O51" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O3" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O50" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O76" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O49" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O1" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O48" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O7" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O46" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O5" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O44" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O3" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O42" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O1" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O40" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O75" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O39" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O7" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O38" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O37" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O5" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O36" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O35" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O3" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O34" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O33" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O1" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O32" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O31" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O7" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O30" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O74" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O29" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O5" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O28" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O27" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O3" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O26" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O25" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O1" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O24" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O23" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O7" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O22" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O21" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O5" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O20" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O73" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O19" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O3" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O18" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O17" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O1" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O16" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O7" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O5" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O3" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "name": "unnamedWire#69", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O72" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O1" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "name": "unnamedWire#71", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O7" + }, + "name": "unnamedWire#72", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "name": "unnamedWire#73", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O5" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O3" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O1" + }, + "name": "unnamedWire#78", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "name": "unnamedWire#79", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O71" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O79" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O7" + }, + "name": "unnamedWire#80", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O78" + }, + "name": "unnamedWire#81", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O77" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O5" + }, + "name": "unnamedWire#82", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O76" + }, + "name": "unnamedWire#83", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O75" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O3" + }, + "name": "unnamedWire#84", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O74" + }, + "name": "unnamedWire#85", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O73" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O1" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O72" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O71" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O7" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O70" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O70" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O69" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O5" + }, + "name": "unnamedWire#90", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O68" + }, + "name": "unnamedWire#91", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O67" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O3" + }, + "name": "unnamedWire#92", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O66" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O65" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O1" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O64" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O63" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O7" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O62" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O61" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O5" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O60" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n80 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q80-73", + "q72-65", + "q64-57", + "q56-49", + "q48-41", + "q40-33", + "q32-25", + "q24-17", + "q16-9", + "q8-1" + ], + "vectorPartLengthes": [ + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q1" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q2" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q3" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q4" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q5" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q6" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q7" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q8" + } + }, + "q16-9": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q" + } + }, + "q17": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q1" + } + }, + "q18": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q2" + } + }, + "q19": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q3" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q2" + } + }, + "q20": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q4" + } + }, + "q21": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q5" + } + }, + "q22": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q6" + } + }, + "q23": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q7" + } + }, + "q24": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q8" + } + }, + "q24-17": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q" + } + }, + "q25": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q1" + } + }, + "q26": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q2" + } + }, + "q27": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q3" + } + }, + "q28": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q4" + } + }, + "q29": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q5" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q3" + } + }, + "q30": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q6" + } + }, + "q31": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q7" + } + }, + "q32": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q8" + } + }, + "q32-25": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q" + } + }, + "q33": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q1" + } + }, + "q34": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q2" + } + }, + "q35": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q3" + } + }, + "q36": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q4" + } + }, + "q37": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q5" + } + }, + "q38": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q6" + } + }, + "q39": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q7" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q4" + } + }, + "q40": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q8" + } + }, + "q40-33": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q" + } + }, + "q41": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q1" + } + }, + "q42": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q2" + } + }, + "q43": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q3" + } + }, + "q44": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q4" + } + }, + "q45": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q5" + } + }, + "q46": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q6" + } + }, + "q47": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q7" + } + }, + "q48": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q8" + } + }, + "q48-41": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q" + } + }, + "q49": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q1" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q5" + } + }, + "q50": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q2" + } + }, + "q51": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q3" + } + }, + "q52": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q4" + } + }, + "q53": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q5" + } + }, + "q54": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q6" + } + }, + "q55": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q7" + } + }, + "q56": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q8" + } + }, + "q56-49": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q" + } + }, + "q57": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q1" + } + }, + "q58": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q2" + } + }, + "q59": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q3" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q6" + } + }, + "q60": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q4" + } + }, + "q61": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q5" + } + }, + "q62": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q6" + } + }, + "q63": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q7" + } + }, + "q64": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q8" + } + }, + "q64-57": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q" + } + }, + "q65": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q1" + } + }, + "q66": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q2" + } + }, + "q67": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q3" + } + }, + "q68": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q4" + } + }, + "q69": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q5" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q7" + } + }, + "q70": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q6" + } + }, + "q71": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q7" + } + }, + "q72": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q8" + } + }, + "q72-65": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q" + } + }, + "q73": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q1" + } + }, + "q74": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q2" + } + }, + "q75": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q3" + } + }, + "q76": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q4" + } + }, + "q77": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q5" + } + }, + "q78": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q6" + } + }, + "q79": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q7" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q8" + } + }, + "q8-1": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q" + } + }, + "q80": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q8" + } + }, + "q80-73": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q1" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json new file mode 100644 index 00000000..3884fc0b --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json @@ -0,0 +1,267 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "E", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "_Q", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 15.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 34.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "_rsLatch", + "name": "_rsLatch#0", + "pos": { + "x": 45.0, + "y": 7.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "E" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 5.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 35.0, + "y": 25.0 + }, + { + "x": 10.0, + "y": 25.0 + }, + { + "x": 10.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#0", + "pinName": "_S" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_rsLatch#0", + "pinName": "_R" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 40.0, + "y": 37.5 + }, + { + "x": 40.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "_rsLatch#0", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "_rsLatch#0", + "pinName": "_Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_Q" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "dlatch", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "_rsLatch#0", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json new file mode 100644 index 00000000..87f53700 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json @@ -0,0 +1,405 @@ +{ + "width": 35.0, + "height": 50.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Q3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Q4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 14.0, + "y": 46.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 14.0, + "y": 71.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 14.0, + "y": 96.5 + }, + "params": 1 + }, + { + "id": "dlatch", + "name": "dlatch#0", + "pos": { + "x": 30.0, + "y": 7.5 + } + }, + { + "id": "dlatch", + "name": "dlatch#1", + "pos": { + "x": 30.0, + "y": 32.5 + } + }, + { + "id": "dlatch", + "name": "dlatch#2", + "pos": { + "x": 30.0, + "y": 57.5 + } + }, + { + "id": "dlatch", + "name": "dlatch#3", + "pos": { + "x": 30.0, + "y": 82.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 15.0, + "y": 112.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#3", + "pinName": "E" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "dlatch#3", + "pinName": "D" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#0", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q1" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#1", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q2" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#2", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q3" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#3", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q4" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#2", + "pinName": "E" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#1", + "pinName": "E" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#0", + "pinName": "E" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 15.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "dlatch#0", + "pinName": "D" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "dlatch#1", + "pinName": "D" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "dlatch#2", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "dlatch4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#0", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#1", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#2", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#3", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json new file mode 100644 index 00000000..c871a951 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json @@ -0,0 +1,859 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D", + "logicWidth": 8, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "E", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q", + "logicWidth": 8, + "usage": "TRISTATE" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 160.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 39.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 89.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 39.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 39.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 89.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 89.0, + "y": 44.0 + }, + "params": 1 + }, + { + "id": "dlatch", + "name": "dlatch#10", + "pos": { + "x": 95.0, + "y": 60.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#11", + "pos": { + "x": 45.0, + "y": 40.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#4", + "pos": { + "x": 45.0, + "y": 10.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#5", + "pos": { + "x": 95.0, + "y": 90.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#6", + "pos": { + "x": 95.0, + "y": 120.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#7", + "pos": { + "x": 45.0, + "y": 100.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#8", + "pos": { + "x": 45.0, + "y": 70.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#9", + "pos": { + "x": 95.0, + "y": 30.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 40.0, + "y": 5.0 + }, + { + "x": 90.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "E" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#11", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 30.0, + "y": 45.0 + }, + { + "x": 30.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "dlatch#10", + "pinName": "D" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 25.0, + "y": 70.0 + }, + { + "x": 25.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#8", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 25.0, + "y": 75.0 + }, + { + "x": 25.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "dlatch#5", + "pinName": "D" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 25.0, + "y": 90.0 + }, + { + "x": 25.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#7", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 25.0, + "y": 105.0 + }, + { + "x": 25.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "dlatch#6", + "pinName": "D" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 20.0, + "y": 110.0 + }, + { + "x": 20.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#11", + "pinName": "E" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#8", + "pinName": "E" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#7", + "pinName": "E" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 40.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#6", + "pinName": "E" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 90.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#5", + "pinName": "E" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#10", + "pinName": "E" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#9", + "pinName": "E" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#4", + "pinName": "E" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "dlatch#4", + "pinName": "Q" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 155.0, + "y": 40.0 + }, + { + "x": 155.0, + "y": 25.0 + }, + { + "x": 85.0, + "y": 25.0 + }, + { + "x": 85.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 150.0, + "y": 35.0 + }, + { + "x": 150.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "dlatch#11", + "pinName": "Q" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 145.0, + "y": 60.0 + }, + { + "x": 145.0, + "y": 55.0 + }, + { + "x": 85.0, + "y": 55.0 + }, + { + "x": 85.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "dlatch#10", + "pinName": "Q" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 140.0, + "y": 70.0 + }, + { + "x": 140.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "dlatch#8", + "pinName": "Q" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 140.0, + "y": 80.0 + }, + { + "x": 140.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 140.0, + "y": 95.0 + }, + { + "x": 140.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "dlatch#7", + "pinName": "Q" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 140.0, + "y": 100.0 + }, + { + "x": 140.0, + "y": 115.0 + }, + { + "x": 85.0, + "y": 115.0 + }, + { + "x": 85.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#6", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 150.0, + "y": 125.0 + }, + { + "x": 150.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#4", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 15.0 + }, + { + "x": 20.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "dlatch#9", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 25.0, + "y": 50.0 + }, + { + "x": 25.0, + "y": 35.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D latch\n8 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q8", + "q7", + "q6", + "q5", + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#6", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#7", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#5", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#8", + "subStateID": "q" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#10", + "subStateID": "q" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#11", + "subStateID": "q" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#9", + "subStateID": "q" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#4", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json new file mode 100644 index 00000000..d46c7843 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json @@ -0,0 +1,3563 @@ +{ + "width": 25.0, + "height": 165.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "D", + "logicWidth": 80, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "E", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 25.0, + "y": 85.0 + }, + "name": "Q", + "logicWidth": 80, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 15.0, + "y": 30.0 + }, + "params": { + "logicWidth": 80, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 90.0, + "y": 750.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#10", + "pos": { + "x": 30.0, + "y": 670.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#11", + "pos": { + "x": 30.0, + "y": 750.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#12", + "pos": { + "x": 90.0, + "y": 510.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#13", + "pos": { + "x": 90.0, + "y": 590.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#14", + "pos": { + "x": 90.0, + "y": 110.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#15", + "pos": { + "x": 90.0, + "y": 430.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#16", + "pos": { + "x": 90.0, + "y": 190.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#17", + "pos": { + "x": 90.0, + "y": 350.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#18", + "pos": { + "x": 90.0, + "y": 270.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#19", + "pos": { + "x": 90.0, + "y": 670.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 30.0, + "y": 30.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#20", + "pos": { + "x": 90.0, + "y": 30.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#21", + "pos": { + "x": 105.0, + "y": 30.0 + }, + "params": { + "logicWidth": 80, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 30.0, + "y": 110.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 30.0, + "y": 190.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#5", + "pos": { + "x": 30.0, + "y": 270.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#6", + "pos": { + "x": 30.0, + "y": 350.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#7", + "pos": { + "x": 30.0, + "y": 430.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#8", + "pos": { + "x": 30.0, + "y": 510.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#9", + "pos": { + "x": 30.0, + "y": 590.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 44.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 44.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 44.0, + "y": 214.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 44.0, + "y": 294.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 44.0, + "y": 454.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 44.0, + "y": 374.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 44.0, + "y": 614.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 44.0, + "y": 534.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 44.0, + "y": 694.0 + }, + "params": 1 + }, + { + "id": "dlatch8", + "name": "dlatch8#0", + "pos": { + "x": 50.0, + "y": 770.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#1", + "pos": { + "x": 50.0, + "y": 690.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#2", + "pos": { + "x": 50.0, + "y": 610.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#3", + "pos": { + "x": 50.0, + "y": 530.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#4", + "pos": { + "x": 50.0, + "y": 450.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#5", + "pos": { + "x": 50.0, + "y": 370.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#6", + "pos": { + "x": 50.0, + "y": 290.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#7", + "pos": { + "x": 50.0, + "y": 210.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#8", + "pos": { + "x": 50.0, + "y": 130.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#9", + "pos": { + "x": 50.0, + "y": 50.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O79" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O78" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O69" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O59" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O3" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O58" + }, + "name": "unnamedWire#101", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O57" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O1" + }, + "name": "unnamedWire#102", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O56" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O55" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O7" + }, + "name": "unnamedWire#104", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O54" + }, + "name": "unnamedWire#105", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O53" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O5" + }, + "name": "unnamedWire#106", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O52" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O51" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O3" + }, + "name": "unnamedWire#108", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O50" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O68" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O49" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O1" + }, + "name": "unnamedWire#110", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O48" + }, + "name": "unnamedWire#111", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O7" + }, + "name": "unnamedWire#112", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O46" + }, + "name": "unnamedWire#113", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O5" + }, + "name": "unnamedWire#114", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O44" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O3" + }, + "name": "unnamedWire#116", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O42" + }, + "name": "unnamedWire#117", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O1" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O40" + }, + "name": "unnamedWire#119", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O67" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O39" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O7" + }, + "name": "unnamedWire#120", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O38" + }, + "name": "unnamedWire#121", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O37" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O5" + }, + "name": "unnamedWire#122", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O36" + }, + "name": "unnamedWire#123", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O35" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O3" + }, + "name": "unnamedWire#124", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O34" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O33" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O1" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O32" + }, + "name": "unnamedWire#127", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O31" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O7" + }, + "name": "unnamedWire#128", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O30" + }, + "name": "unnamedWire#129", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O66" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O29" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O5" + }, + "name": "unnamedWire#130", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O28" + }, + "name": "unnamedWire#131", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O27" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O3" + }, + "name": "unnamedWire#132", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O26" + }, + "name": "unnamedWire#133", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O25" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O1" + }, + "name": "unnamedWire#134", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O24" + }, + "name": "unnamedWire#135", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O23" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O7" + }, + "name": "unnamedWire#136", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O22" + }, + "name": "unnamedWire#137", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O21" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O5" + }, + "name": "unnamedWire#138", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O20" + }, + "name": "unnamedWire#139", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O65" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O19" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O3" + }, + "name": "unnamedWire#140", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O18" + }, + "name": "unnamedWire#141", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O17" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O1" + }, + "name": "unnamedWire#142", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O16" + }, + "name": "unnamedWire#143", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O7" + }, + "name": "unnamedWire#144", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O14" + }, + "name": "unnamedWire#145", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O5" + }, + "name": "unnamedWire#146", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O12" + }, + "name": "unnamedWire#147", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O3" + }, + "name": "unnamedWire#148", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O10" + }, + "name": "unnamedWire#149", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O64" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O1" + }, + "name": "unnamedWire#150", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O8" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "name": "unnamedWire#152", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O6" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "name": "unnamedWire#154", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O4" + }, + "name": "unnamedWire#155", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "name": "unnamedWire#156", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O2" + }, + "name": "unnamedWire#157", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "name": "unnamedWire#158", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O0" + }, + "name": "unnamedWire#159", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O63" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O7" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#9", + "pinName": "D" + }, + "name": "unnamedWire#160", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "I" + }, + "name": "unnamedWire#161", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#8", + "pinName": "D" + }, + "name": "unnamedWire#162", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#7", + "pinName": "D" + }, + "name": "unnamedWire#163", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#6", + "pinName": "D" + }, + "name": "unnamedWire#164", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#5", + "pinName": "D" + }, + "name": "unnamedWire#165", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#4", + "pinName": "D" + }, + "name": "unnamedWire#166", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#3", + "pinName": "D" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#2", + "pinName": "D" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#1", + "pinName": "D" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O62" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#0", + "pinName": "D" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#0", + "pinName": "Q" + }, + "name": "unnamedWire#171", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "I" + }, + "name": "unnamedWire#172", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#2", + "pinName": "Q" + }, + "name": "unnamedWire#173", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#3", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "I" + }, + "name": "unnamedWire#174", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#4", + "pinName": "Q" + }, + "name": "unnamedWire#175", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "I" + }, + "name": "unnamedWire#176", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#6", + "pinName": "Q" + }, + "name": "unnamedWire#177", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#7", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "I" + }, + "name": "unnamedWire#178", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#8", + "pinName": "Q" + }, + "name": "unnamedWire#179", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O61" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O5" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#180", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "I" + }, + "name": "unnamedWire#181", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "E" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#182", + "path": [ + { + "x": 45.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#9", + "pinName": "E" + }, + "name": "unnamedWire#183", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#8", + "pinName": "E" + }, + "name": "unnamedWire#184", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#185", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#186", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#7", + "pinName": "E" + }, + "name": "unnamedWire#187", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#188", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#6", + "pinName": "E" + }, + "name": "unnamedWire#189", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O60" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#190", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#5", + "pinName": "E" + }, + "name": "unnamedWire#191", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#192", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#4", + "pinName": "E" + }, + "name": "unnamedWire#193", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#194", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#3", + "pinName": "E" + }, + "name": "unnamedWire#195", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#196", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#2", + "pinName": "E" + }, + "name": "unnamedWire#197", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#198", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#1", + "pinName": "E" + }, + "name": "unnamedWire#199", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O77" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O59" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#0", + "pinName": "E" + }, + "name": "unnamedWire#200", + "path": [ + { + "x": 45.0, + "y": 775.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O58" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O57" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O56" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O55" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O7" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O54" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O53" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O5" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O52" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O51" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O3" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O50" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O76" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O49" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O1" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O48" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O7" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O46" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O5" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O44" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O3" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O42" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O1" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O40" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O75" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O39" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O7" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O38" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O37" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O5" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O36" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O35" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O3" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O34" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O33" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O1" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O32" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O31" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O7" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O30" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O74" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O29" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O5" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O28" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O27" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O3" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O26" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O25" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O1" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O24" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O23" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O7" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O22" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O21" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O5" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O20" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O73" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O19" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O3" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O18" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O17" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O1" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O16" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O7" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O5" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O3" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "name": "unnamedWire#69", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O72" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O1" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "name": "unnamedWire#71", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O7" + }, + "name": "unnamedWire#72", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "name": "unnamedWire#73", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O5" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O3" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O1" + }, + "name": "unnamedWire#78", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "name": "unnamedWire#79", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O71" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O79" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O7" + }, + "name": "unnamedWire#80", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O78" + }, + "name": "unnamedWire#81", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O77" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O5" + }, + "name": "unnamedWire#82", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O76" + }, + "name": "unnamedWire#83", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O75" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O3" + }, + "name": "unnamedWire#84", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O74" + }, + "name": "unnamedWire#85", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O73" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O1" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O72" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O71" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O7" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O70" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O70" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O69" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O5" + }, + "name": "unnamedWire#90", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O68" + }, + "name": "unnamedWire#91", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O67" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O3" + }, + "name": "unnamedWire#92", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O66" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O65" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O1" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O64" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O63" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O7" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O62" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O61" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O5" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O60" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D latch\n80 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q80-73", + "q72-65", + "q64-57", + "q56-49", + "q48-41", + "q40-33", + "q32-25", + "q24-17", + "q16-9", + "q8-1" + ], + "vectorPartLengthes": [ + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q1" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q2" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q3" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q4" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q5" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q6" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q7" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q8" + } + }, + "q16-9": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q" + } + }, + "q17": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q1" + } + }, + "q18": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q2" + } + }, + "q19": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q3" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q2" + } + }, + "q20": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q4" + } + }, + "q21": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q5" + } + }, + "q22": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q6" + } + }, + "q23": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q7" + } + }, + "q24": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q8" + } + }, + "q24-17": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q" + } + }, + "q25": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q1" + } + }, + "q26": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q2" + } + }, + "q27": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q3" + } + }, + "q28": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q4" + } + }, + "q29": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q5" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q3" + } + }, + "q30": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q6" + } + }, + "q31": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q7" + } + }, + "q32": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q8" + } + }, + "q32-25": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q" + } + }, + "q33": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q1" + } + }, + "q34": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q2" + } + }, + "q35": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q3" + } + }, + "q36": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q4" + } + }, + "q37": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q5" + } + }, + "q38": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q6" + } + }, + "q39": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q7" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q4" + } + }, + "q40": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q8" + } + }, + "q40-33": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q" + } + }, + "q41": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q1" + } + }, + "q42": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q2" + } + }, + "q43": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q3" + } + }, + "q44": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q4" + } + }, + "q45": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q5" + } + }, + "q46": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q6" + } + }, + "q47": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q7" + } + }, + "q48": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q8" + } + }, + "q48-41": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q" + } + }, + "q49": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q1" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q5" + } + }, + "q50": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q2" + } + }, + "q51": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q3" + } + }, + "q52": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q4" + } + }, + "q53": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q5" + } + }, + "q54": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q6" + } + }, + "q55": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q7" + } + }, + "q56": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q8" + } + }, + "q56-49": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q" + } + }, + "q57": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q1" + } + }, + "q58": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q2" + } + }, + "q59": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q3" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q6" + } + }, + "q60": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q4" + } + }, + "q61": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q5" + } + }, + "q62": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q6" + } + }, + "q63": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q7" + } + }, + "q64": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q8" + } + }, + "q64-57": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q" + } + }, + "q65": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q1" + } + }, + "q66": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q2" + } + }, + "q67": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q3" + } + }, + "q68": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q4" + } + }, + "q69": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q5" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q7" + } + }, + "q70": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q6" + } + }, + "q71": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q7" + } + }, + "q72": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q8" + } + }, + "q72-65": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q" + } + }, + "q73": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q1" + } + }, + "q74": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q2" + } + }, + "q75": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q3" + } + }, + "q76": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q4" + } + }, + "q77": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q5" + } + }, + "q78": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q6" + } + }, + "q79": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q7" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q8" + } + }, + "q8-1": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q" + } + }, + "q80": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q8" + } + }, + "q80-73": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q1" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json new file mode 100644 index 00000000..4ba4b195 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json @@ -0,0 +1,204 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Z", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 57.5, + "y": 40.0 + }, + "params": 1 + }, + { + "id": "halfadder", + "name": "halfadder#0", + "pos": { + "x": 5.0, + "y": 40.0 + } + }, + { + "id": "halfadder", + "name": "halfadder#1", + "pos": { + "x": 45.0, + "y": 7.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "halfadder#1", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "halfadder#0", + "pinName": "A" + }, + "name": "unnamedWire#1" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "halfadder#0", + "pinName": "B" + }, + "name": "unnamedWire#2" + }, + { + "pin1": { + "compName": "halfadder#0", + "pinName": "Y" + }, + "pin2": { + "compName": "halfadder#1", + "pinName": "B" + }, + "name": "unnamedWire#3" + }, + { + "pin1": { + "compName": "halfadder#0", + "pinName": "_Z" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "halfadder#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "halfadder#1", + "pinName": "_Z" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 82.5, + "y": 22.5 + }, + { + "x": 82.5, + "y": 35.0 + }, + { + "x": 52.5, + "y": 35.0 + }, + { + "x": 52.5, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Z" + }, + "name": "unnamedWire#7" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "fulladder", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json new file mode 100644 index 00000000..d56f83e0 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json @@ -0,0 +1,337 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "_Z", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 40.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 40.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 65.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 34.0, + "y": 24.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 62.5, + "y": 12.5 + }, + { + "x": 62.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 62.5, + "y": 37.5 + }, + { + "x": 62.5, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 5.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 5.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_Z" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 80.0, + "y": 25.0 + }, + { + "x": 80.0, + "y": 37.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 35.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 35.0, + "y": 32.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "halfadder", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json new file mode 100644 index 00000000..3997209b --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json @@ -0,0 +1,248 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 7.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 35.0, + "y": 22.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 35.0, + "y": 47.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 60.0, + "y": 30.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 21.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#10" + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#4" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 5.0, + "y": 52.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#8" + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "mux1", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json new file mode 100644 index 00000000..9f1da98e --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json @@ -0,0 +1,1845 @@ +{ + "width": 50.0, + "height": 80.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "I0", + "logicWidth": 12, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "I1", + "logicWidth": 12, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 50.0, + "y": 30.0 + }, + "name": "Y", + "logicWidth": 12, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 55.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 45.0 + }, + "params": { + "logicWidth": 12, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 245.0 + }, + "params": { + "logicWidth": 12, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 235.0, + "y": 95.0 + }, + "params": { + "logicWidth": 12, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 139.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 144.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 89.0, + "y": 4.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 84.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 49.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 49.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 84.0, + "y": 269.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 89.0, + "y": 279.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 84.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 89.0, + "y": 219.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 89.0, + "y": 159.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 84.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 144.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 84.0, + "y": 89.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 89.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 84.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 89.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 139.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 139.0, + "y": 169.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 144.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 144.0, + "y": 239.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 139.0, + "y": 229.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 144.0, + "y": 299.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 139.0, + "y": 289.0 + }, + "params": 1 + }, + { + "id": "sel1", + "name": "sel1#0", + "pos": { + "x": 150.0, + "y": 45.0 + } + }, + { + "id": "sel1", + "name": "sel1#1", + "pos": { + "x": 95.0, + "y": 85.0 + } + }, + { + "id": "sel1", + "name": "sel1#10", + "pos": { + "x": 95.0, + "y": 265.0 + } + }, + { + "id": "sel1", + "name": "sel1#11", + "pos": { + "x": 150.0, + "y": 345.0 + } + }, + { + "id": "sel1", + "name": "sel1#2", + "pos": { + "x": 150.0, + "y": 105.0 + } + }, + { + "id": "sel1", + "name": "sel1#3", + "pos": { + "x": 95.0, + "y": 25.0 + } + }, + { + "id": "sel1", + "name": "sel1#4", + "pos": { + "x": 95.0, + "y": 325.0 + } + }, + { + "id": "sel1", + "name": "sel1#5", + "pos": { + "x": 150.0, + "y": 165.0 + } + }, + { + "id": "sel1", + "name": "sel1#6", + "pos": { + "x": 95.0, + "y": 145.0 + } + }, + { + "id": "sel1", + "name": "sel1#7", + "pos": { + "x": 95.0, + "y": 205.0 + } + }, + { + "id": "sel1", + "name": "sel1#8", + "pos": { + "x": 150.0, + "y": 285.0 + } + }, + { + "id": "sel1", + "name": "sel1#9", + "pos": { + "x": 150.0, + "y": 225.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S1" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "sel1#3", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O11" + }, + "name": "unnamedWire#103", + "path": [ + { + "x": 210.0, + "y": 30.0 + }, + { + "x": 210.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O10" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 205.0, + "y": 50.0 + }, + { + "x": 205.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "Y" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 200.0, + "y": 115.0 + }, + { + "x": 200.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#2", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O8" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 195.0, + "y": 110.0 + }, + { + "x": 195.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "Y" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 195.0, + "y": 135.0 + }, + { + "x": 195.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 200.0, + "y": 170.0 + }, + { + "x": 200.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "Y" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 205.0, + "y": 155.0 + }, + { + "x": 205.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 210.0, + "y": 230.0 + }, + { + "x": 210.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "Y" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 215.0, + "y": 175.0 + }, + { + "x": 215.0, + "y": 270.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#8", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 220.0, + "y": 290.0 + }, + { + "x": 220.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "Y" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 225.0, + "y": 195.0 + }, + { + "x": 225.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#11", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 230.0, + "y": 350.0 + }, + { + "x": 230.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 50.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#10", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "S2" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S1" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 140.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#8", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "S1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 140.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "S1" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "S1" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "sel1#2", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "sel1#2", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "S1" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 145.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "S1" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S2" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 145.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S1" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 85.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S2" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 90.0, + "y": 340.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "S2" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "S1" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "I1" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 75.0, + "y": 45.0 + }, + { + "x": 75.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I1" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 70.0, + "y": 55.0 + }, + { + "x": 70.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I1" + }, + "name": "unnamedWire#66", + "path": [ + { + "x": 65.0, + "y": 65.0 + }, + { + "x": 65.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "I1" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 60.0, + "y": 75.0 + }, + { + "x": 60.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I1" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 55.0, + "y": 85.0 + }, + { + "x": 55.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I1" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 50.0, + "y": 95.0 + }, + { + "x": 50.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#1", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I1" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 45.0, + "y": 105.0 + }, + { + "x": 45.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I1" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 40.0, + "y": 115.0 + }, + { + "x": 40.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I1" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 35.0, + "y": 125.0 + }, + { + "x": 35.0, + "y": 290.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 30.0, + "y": 135.0 + }, + { + "x": 30.0, + "y": 310.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I1" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 25.0, + "y": 145.0 + }, + { + "x": 25.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I1" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 20.0, + "y": 155.0 + }, + { + "x": 20.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "S1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O11" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "I2" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 75.0, + "y": 245.0 + }, + { + "x": 75.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O10" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I2" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 70.0, + "y": 255.0 + }, + { + "x": 70.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I2" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 65.0, + "y": 265.0 + }, + { + "x": 65.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O8" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "I2" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 60.0, + "y": 275.0 + }, + { + "x": 60.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I2" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 55.0, + "y": 285.0 + }, + { + "x": 55.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I2" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 50.0, + "y": 295.0 + }, + { + "x": 50.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I2" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 45.0, + "y": 305.0 + }, + { + "x": 45.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I2" + }, + "name": "unnamedWire#89", + "path": [ + { + "x": 40.0, + "y": 315.0 + }, + { + "x": 40.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I2" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 35.0, + "y": 325.0 + }, + { + "x": 35.0, + "y": 300.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I2" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 30.0, + "y": 335.0 + }, + { + "x": 30.0, + "y": 320.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I2" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 45.0, + "y": 345.0 + }, + { + "x": 45.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I2" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 40.0, + "y": 355.0 + }, + { + "x": 40.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "MUX\n12 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 23.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json new file mode 100644 index 00000000..e29bbbf0 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json @@ -0,0 +1,2384 @@ +{ + "width": 55.0, + "height": 110.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I0", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 90.0 + }, + "name": "I1", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 55.0, + "y": 50.0 + }, + "name": "Y", + "logicWidth": 16, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 70.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 50.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 375.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 260.0, + "y": 175.0 + }, + "params": { + "logicWidth": 16, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 164.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 169.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 169.0, + "y": 359.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 164.0, + "y": 349.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 169.0, + "y": 419.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 164.0, + "y": 409.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 109.0, + "y": 4.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 104.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 64.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 64.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 104.0, + "y": 389.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 109.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 164.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 104.0, + "y": 329.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 109.0, + "y": 339.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 109.0, + "y": 279.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 104.0, + "y": 269.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 104.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 109.0, + "y": 219.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 104.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 109.0, + "y": 159.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 109.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 104.0, + "y": 89.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 169.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 104.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 109.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 164.0, + "y": 169.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 169.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 169.0, + "y": 239.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 164.0, + "y": 229.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 164.0, + "y": 289.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 169.0, + "y": 299.0 + }, + "params": 1 + }, + { + "id": "sel1", + "name": "sel1#0", + "pos": { + "x": 115.0, + "y": 25.0 + } + }, + { + "id": "sel1", + "name": "sel1#1", + "pos": { + "x": 175.0, + "y": 45.0 + } + }, + { + "id": "sel1", + "name": "sel1#10", + "pos": { + "x": 115.0, + "y": 265.0 + } + }, + { + "id": "sel1", + "name": "sel1#11", + "pos": { + "x": 115.0, + "y": 325.0 + } + }, + { + "id": "sel1", + "name": "sel1#12", + "pos": { + "x": 175.0, + "y": 405.0 + } + }, + { + "id": "sel1", + "name": "sel1#13", + "pos": { + "x": 175.0, + "y": 345.0 + } + }, + { + "id": "sel1", + "name": "sel1#14", + "pos": { + "x": 115.0, + "y": 385.0 + } + }, + { + "id": "sel1", + "name": "sel1#15", + "pos": { + "x": 175.0, + "y": 465.0 + } + }, + { + "id": "sel1", + "name": "sel1#2", + "pos": { + "x": 115.0, + "y": 85.0 + } + }, + { + "id": "sel1", + "name": "sel1#3", + "pos": { + "x": 175.0, + "y": 105.0 + } + }, + { + "id": "sel1", + "name": "sel1#4", + "pos": { + "x": 175.0, + "y": 165.0 + } + }, + { + "id": "sel1", + "name": "sel1#5", + "pos": { + "x": 115.0, + "y": 205.0 + } + }, + { + "id": "sel1", + "name": "sel1#6", + "pos": { + "x": 175.0, + "y": 225.0 + } + }, + { + "id": "sel1", + "name": "sel1#7", + "pos": { + "x": 115.0, + "y": 145.0 + } + }, + { + "id": "sel1", + "name": "sel1#8", + "pos": { + "x": 115.0, + "y": 445.0 + } + }, + { + "id": "sel1", + "name": "sel1#9", + "pos": { + "x": 175.0, + "y": 285.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "S1" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "S2" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S1" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O14" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "Y" + }, + "name": "unnamedWire#100", + "path": [ + { + "x": 250.0, + "y": 185.0 + }, + { + "x": 250.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#2", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O13" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 245.0, + "y": 90.0 + }, + { + "x": 245.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O12" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "Y" + }, + "name": "unnamedWire#102", + "path": [ + { + "x": 240.0, + "y": 205.0 + }, + { + "x": 240.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#7", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O11" + }, + "name": "unnamedWire#103", + "path": [ + { + "x": 235.0, + "y": 150.0 + }, + { + "x": 235.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#4", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O10" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 230.0, + "y": 170.0 + }, + { + "x": 230.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "Y" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 225.0, + "y": 235.0 + }, + { + "x": 225.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O8" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 220.0, + "y": 230.0 + }, + { + "x": 220.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "Y" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 220.0, + "y": 255.0 + }, + { + "x": 220.0, + "y": 270.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 225.0, + "y": 290.0 + }, + { + "x": 225.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "Y" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 230.0, + "y": 275.0 + }, + { + "x": 230.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel1#13", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 235.0, + "y": 350.0 + }, + { + "x": 235.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#14", + "pinName": "Y" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 240.0, + "y": 295.0 + }, + { + "x": 240.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#12", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 245.0, + "y": 410.0 + }, + { + "x": 245.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "Y" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 250.0, + "y": 315.0 + }, + { + "x": 250.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#15", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 255.0, + "y": 470.0 + }, + { + "x": 255.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 65.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#14", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "sel1#14", + "pinName": "S2" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "sel1#15", + "pinName": "S1" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 165.0, + "y": 470.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "sel1#12", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "sel1#12", + "pinName": "S1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "S1" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "sel1#13", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "sel1#13", + "pinName": "S1" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "S1" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "sel1#4", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S1" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "sel1#3", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "S1" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "S2" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "sel1#1", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "S1" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S1" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "sel1#15", + "pinName": "S2" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 170.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "S1" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 105.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "S2" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 110.0, + "y": 460.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S2" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 165.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 170.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "S1" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I1" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I1" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 90.0, + "y": 60.0 + }, + { + "x": 90.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "I1" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 85.0, + "y": 70.0 + }, + { + "x": 85.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "I1" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 80.0, + "y": 80.0 + }, + { + "x": 80.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I1" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 75.0, + "y": 90.0 + }, + { + "x": 75.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I1" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 70.0, + "y": 100.0 + }, + { + "x": 70.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I1" + }, + "name": "unnamedWire#66", + "path": [ + { + "x": 65.0, + "y": 110.0 + }, + { + "x": 65.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I1" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 60.0, + "y": 120.0 + }, + { + "x": 60.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I1" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 55.0, + "y": 130.0 + }, + { + "x": 55.0, + "y": 290.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I1" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 50.0, + "y": 140.0 + }, + { + "x": 50.0, + "y": 310.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I1" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 45.0, + "y": 150.0 + }, + { + "x": 45.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#13", + "pinName": "I1" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 40.0, + "y": 160.0 + }, + { + "x": 40.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#14", + "pinName": "I1" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 35.0, + "y": 170.0 + }, + { + "x": 35.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#12", + "pinName": "I1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 30.0, + "y": 180.0 + }, + { + "x": 30.0, + "y": 430.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I1" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 25.0, + "y": 190.0 + }, + { + "x": 25.0, + "y": 470.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#15", + "pinName": "I1" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 20.0, + "y": 200.0 + }, + { + "x": 20.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O15" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I2" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 95.0, + "y": 375.0 + }, + { + "x": 95.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O14" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I2" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 90.0, + "y": 385.0 + }, + { + "x": 90.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "S1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O13" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "I2" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 85.0, + "y": 395.0 + }, + { + "x": 85.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O12" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "I2" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 80.0, + "y": 405.0 + }, + { + "x": 80.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O11" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I2" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 75.0, + "y": 415.0 + }, + { + "x": 75.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O10" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I2" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 70.0, + "y": 425.0 + }, + { + "x": 70.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I2" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 65.0, + "y": 435.0 + }, + { + "x": 65.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O8" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I2" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 60.0, + "y": 445.0 + }, + { + "x": 60.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I2" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 55.0, + "y": 455.0 + }, + { + "x": 55.0, + "y": 300.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I2" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 50.0, + "y": 465.0 + }, + { + "x": 50.0, + "y": 320.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I2" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 45.0, + "y": 475.0 + }, + { + "x": 45.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#13", + "pinName": "I2" + }, + "name": "unnamedWire#89", + "path": [ + { + "x": 40.0, + "y": 485.0 + }, + { + "x": 40.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#10", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#14", + "pinName": "I2" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 35.0, + "y": 495.0 + }, + { + "x": 35.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#12", + "pinName": "I2" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 30.0, + "y": 505.0 + }, + { + "x": 30.0, + "y": 440.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I2" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 25.0, + "y": 515.0 + }, + { + "x": 25.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#15", + "pinName": "I2" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 20.0, + "y": 525.0 + }, + { + "x": 20.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O15" + }, + "name": "unnamedWire#99", + "path": [ + { + "x": 255.0, + "y": 30.0 + }, + { + "x": 255.0, + "y": 175.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "MUX\n16 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 23.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json new file mode 100644 index 00000000..b5b16b89 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json @@ -0,0 +1,503 @@ +{ + "width": 35.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I0_1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I0_2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "I0_3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "I0_4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "I1_1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "I1_2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "I1_3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "I1_4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 24.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 46.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 24.0, + "y": 81.5 + }, + "params": 1 + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 30.0, + "y": 7.5 + } + }, + { + "id": "mux1", + "name": "mux1#1", + "pos": { + "x": 30.0, + "y": 42.5 + } + }, + { + "id": "mux1", + "name": "mux1#2", + "pos": { + "x": 30.0, + "y": 77.5 + } + }, + { + "id": "mux1", + "name": "mux1#3", + "pos": { + "x": 30.0, + "y": 112.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "S0" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0_3" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "I0" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 5.0, + "y": 87.5 + }, + { + "x": 5.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1_3" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "I1" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 20.0, + "y": 187.5 + }, + { + "x": 20.0, + "y": 102.5 + } + ] + }, + { + "pin1": { + "compName": "mux1#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#14" + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "mux1#3", + "pinName": "S0" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 25.0, + "y": 117.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0_4" + }, + "pin2": { + "compName": "mux1#3", + "pinName": "I0" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 5.0, + "y": 112.5 + }, + { + "x": 5.0, + "y": 127.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1#3", + "pinName": "I1" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 25.0, + "y": 212.5 + }, + { + "x": 25.0, + "y": 137.5 + } + ] + }, + { + "pin1": { + "compName": "mux1#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#18" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0_1" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 37.5 + }, + { + "x": 5.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1_1" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 137.5 + }, + { + "x": 10.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "mux1#1", + "pinName": "S0" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0_2" + }, + "pin2": { + "compName": "mux1#1", + "pinName": "I0" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 5.0, + "y": 62.5 + }, + { + "x": 5.0, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1#1", + "pinName": "I1" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 15.0, + "y": 162.5 + }, + { + "x": 15.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "mux1#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "mux1_4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json new file mode 100644 index 00000000..4a34c7c8 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json @@ -0,0 +1,1297 @@ +{ + "width": 40.0, + "height": 55.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I0", + "logicWidth": 8, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "I1", + "logicWidth": 8, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 40.0, + "y": 25.0 + }, + "name": "Y", + "logicWidth": 8, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 15.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 165.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 185.0, + "y": 90.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 69.0, + "y": 4.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 64.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 9.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 9.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 64.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 69.0, + "y": 159.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 64.0, + "y": 89.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 69.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 69.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 64.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 114.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 119.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 119.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 114.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 119.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 114.0, + "y": 169.0 + }, + "params": 1 + }, + { + "id": "sel1", + "name": "sel1#10", + "pos": { + "x": 75.0, + "y": 145.0 + } + }, + { + "id": "sel1", + "name": "sel1#11", + "pos": { + "x": 125.0, + "y": 225.0 + } + }, + { + "id": "sel1", + "name": "sel1#4", + "pos": { + "x": 75.0, + "y": 205.0 + } + }, + { + "id": "sel1", + "name": "sel1#5", + "pos": { + "x": 125.0, + "y": 45.0 + } + }, + { + "id": "sel1", + "name": "sel1#6", + "pos": { + "x": 75.0, + "y": 25.0 + } + }, + { + "id": "sel1", + "name": "sel1#7", + "pos": { + "x": 75.0, + "y": 85.0 + } + }, + { + "id": "sel1", + "name": "sel1#8", + "pos": { + "x": 125.0, + "y": 165.0 + } + }, + { + "id": "sel1", + "name": "sel1#9", + "pos": { + "x": 125.0, + "y": 105.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S1" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "Y" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 180.0, + "y": 90.0 + }, + { + "x": 180.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 175.0, + "y": 50.0 + }, + { + "x": 175.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "Y" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 170.0, + "y": 110.0 + }, + { + "x": 170.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 165.0, + "y": 110.0 + }, + { + "x": 165.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "Y" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 165.0, + "y": 130.0 + }, + { + "x": 165.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#8", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 170.0, + "y": 170.0 + }, + { + "x": 170.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "Y" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 175.0, + "y": 150.0 + }, + { + "x": 175.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#11", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 180.0, + "y": 230.0 + }, + { + "x": 180.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 10.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#10", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "S2" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S1" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 115.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#8", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "S1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "S1" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "S1" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 120.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 115.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S2" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 120.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S1" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 65.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S2" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 70.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I1" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 55.0, + "y": 40.0 + }, + { + "x": 55.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I1" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 50.0, + "y": 50.0 + }, + { + "x": 50.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I1" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 45.0, + "y": 60.0 + }, + { + "x": 45.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I1" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 40.0, + "y": 70.0 + }, + { + "x": 40.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I1" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 35.0, + "y": 80.0 + }, + { + "x": 35.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 30.0, + "y": 90.0 + }, + { + "x": 30.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I1" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 25.0, + "y": 100.0 + }, + { + "x": 25.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I1" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 20.0, + "y": 110.0 + }, + { + "x": 20.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "S1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I2" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 55.0, + "y": 165.0 + }, + { + "x": 55.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I2" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 50.0, + "y": 175.0 + }, + { + "x": 50.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I2" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 45.0, + "y": 185.0 + }, + { + "x": 45.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I2" + }, + "name": "unnamedWire#89", + "path": [ + { + "x": 40.0, + "y": 195.0 + }, + { + "x": 40.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I2" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 35.0, + "y": 205.0 + }, + { + "x": 35.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I2" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 30.0, + "y": 215.0 + }, + { + "x": 30.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I2" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 45.0, + "y": 225.0 + }, + { + "x": 45.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I2" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 40.0, + "y": 235.0 + }, + { + "x": 40.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "MUX\n8 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 23.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json new file mode 100644 index 00000000..91d1220e --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json @@ -0,0 +1,434 @@ +{ + "width": 70.0, + "height": 70.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 30.0 + }, + "name": "I00", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "I01", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "I10", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "I11", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 70.0, + "y": 10.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 30.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 24.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 54.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 115.0, + "y": 20.0 + } + }, + { + "id": "sel1", + "name": "sel1#0", + "pos": { + "x": 60.0, + "y": 35.0 + } + }, + { + "id": "sel1", + "name": "sel1#1", + "pos": { + "x": 60.0, + "y": 100.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "S2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 55.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "S2" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 25.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "S1" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 55.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 25.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I00" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I1" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 35.0, + "y": 75.0 + }, + { + "x": 35.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I01" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I2" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 40.0, + "y": 100.0 + }, + { + "x": 40.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I10" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I1" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I11" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I2" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 20.0, + "y": 150.0 + }, + { + "x": 20.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 105.0, + "y": 40.0 + }, + { + "x": 105.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#1", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 105.0, + "y": 105.0 + }, + { + "x": 105.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 15.0, + "y": 25.0 + }, + { + "x": 15.0, + "y": 10.0 + }, + { + "x": 85.0, + "y": 10.0 + }, + { + "x": 85.0, + "y": 25.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "mux2", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json new file mode 100644 index 00000000..ac5aa8ae --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json @@ -0,0 +1,483 @@ +{ + "width": 80.0, + "height": 120.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "I000", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "I001", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "I010", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 70.0 + }, + "name": "I011", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 80.0 + }, + "name": "I100", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 90.0 + }, + "name": "I101", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 100.0 + }, + "name": "I110", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 110.0 + }, + "name": "I111", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 30.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "S2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 80.0, + "y": 10.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 19.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 94.0 + }, + "params": 1 + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 125.0, + "y": 20.0 + } + }, + { + "id": "mux2", + "name": "mux2#0", + "pos": { + "x": 35.0, + "y": 185.0 + } + }, + { + "id": "mux2", + "name": "mux2#1", + "pos": { + "x": 35.0, + "y": 85.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 20.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 25.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "I11" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I011" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 15.0, + "y": 145.0 + }, + { + "x": 15.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "I00" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I100" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 10.0, + "y": 215.0 + }, + { + "x": 10.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I101" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I01" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "I10" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I110" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 10.0, + "y": 235.0 + }, + { + "x": 10.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I111" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I11" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 15.0, + "y": 275.0 + }, + { + "x": 15.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 115.0, + "y": 195.0 + }, + { + "x": 115.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 110.0, + "y": 95.0 + }, + { + "x": 110.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "S0" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "S2" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "S1" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 25.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 20.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I000" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I00" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 10.0, + "y": 100.0 + }, + { + "x": 10.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "I01" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I001" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I010" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I10" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 150.0 + }, + { + "x": 10.0, + "y": 135.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "mux3", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json new file mode 100644 index 00000000..ced22619 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json @@ -0,0 +1,219 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 35.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 62.5, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 31.5, + "y": 24.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#1" + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 32.5, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 32.5, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 57.5, + "y": 25.0 + }, + { + "x": 57.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 60.0, + "y": 62.5 + }, + { + "x": 60.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#7", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "nand3", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json new file mode 100644 index 00000000..4b4e51f1 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json @@ -0,0 +1,401 @@ +{ + "width": 35.0, + "height": 40.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 30.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 30.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 30.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 30.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 14.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 14.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 14.0, + "y": 61.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 14.0, + "y": 86.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 15.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 15.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 15.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 15.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 15.0, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 15.0, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 15.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 15.0, + "y": 42.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "not4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json new file mode 100644 index 00000000..33e50e58 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json @@ -0,0 +1,558 @@ +{ + "width": 35.0, + "height": 40.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 20.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 20.0, + "y": 65.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 20.0, + "y": 115.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 20.0, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 50.0, + "y": 40.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 50.0, + "y": 140.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 110.0, + "y": 40.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 110.0, + "y": 140.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 140.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 14.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 14.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 14.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 14.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 104.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 104.0, + "y": 149.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 15.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 15.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#12" + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#13" + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#14" + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#15" + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 105.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 105.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 105.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 105.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#22" + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#23" + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#24" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 15.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 15.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 15.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 15.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 15.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 15.0, + "y": 80.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "or4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json new file mode 100644 index 00000000..46801b2f --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json @@ -0,0 +1,897 @@ +{ + "width": 35.0, + "height": 80.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 15.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 15.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 65.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 65.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 15.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 15.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 15.0, + "y": 102.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 15.0, + "y": 127.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 15.0, + "y": 152.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 15.0, + "y": 177.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 65.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 65.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 6.5, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 6.5, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 6.5, + "y": 61.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 6.5, + "y": 86.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 6.5, + "y": 111.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 6.5, + "y": 136.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 6.5, + "y": 161.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 6.5, + "y": 186.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 7.5, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 7.5, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 7.5, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 7.5, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 7.5, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 7.5, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 7.5, + "y": 107.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 7.5, + "y": 117.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 7.5, + "y": 132.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 7.5, + "y": 142.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 7.5, + "y": 157.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 7.5, + "y": 167.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 7.5, + "y": 182.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 7.5, + "y": 192.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 40.0, + "y": 12.5 + }, + { + "x": 40.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 45.0, + "y": 112.5 + }, + { + "x": 45.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 40.0, + "y": 37.5 + }, + { + "x": 40.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 50.0, + "y": 137.5 + }, + { + "x": 50.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 40.0, + "y": 62.5 + }, + { + "x": 40.0, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "B" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 55.0, + "y": 162.5 + }, + { + "x": 55.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 40.0, + "y": 87.5 + }, + { + "x": 40.0, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "B" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 60.0, + "y": 187.5 + }, + { + "x": 60.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B4" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 7.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 7.5, + "y": 17.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "or_4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json new file mode 100644 index 00000000..37322570 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json @@ -0,0 +1,3029 @@ +{ + "width": 35.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "B0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "QA1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "QA2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "QA3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "QA4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "QB1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "QB2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 65.0 + }, + "name": "QB3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 75.0 + }, + "name": "QB4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.1, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 109.0, + "y": 154.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 104.0, + "y": 164.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 44.0, + "y": 499.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 49.0, + "y": 509.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 34.0, + "y": 629.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 39.0, + "y": 639.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 44.0, + "y": 649.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 49.0, + "y": 659.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 129.0, + "y": 329.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 124.0, + "y": 339.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 119.0, + "y": 349.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 114.0, + "y": 359.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 99.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 129.0, + "y": 479.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 124.0, + "y": 489.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 119.0, + "y": 499.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 114.0, + "y": 509.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 129.0, + "y": 629.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 124.0, + "y": 639.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 119.0, + "y": 649.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 114.0, + "y": 659.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 129.0, + "y": 779.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 124.0, + "y": 789.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 94.0, + "y": 184.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 119.0, + "y": 799.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 114.0, + "y": 809.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 34.0, + "y": 549.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 39.0, + "y": 649.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 44.0, + "y": 749.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 49.0, + "y": 809.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 34.0, + "y": 479.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 39.0, + "y": 489.0 + }, + "params": 1 + }, + { + "id": "and41", + "name": "and41#0", + "pos": { + "x": 130.0, + "y": 150.0 + } + }, + { + "id": "and41", + "name": "and41#1", + "pos": { + "x": 235.0, + "y": 375.0 + } + }, + { + "id": "and41", + "name": "and41#2", + "pos": { + "x": 135.0, + "y": 325.0 + } + }, + { + "id": "andor414", + "name": "andor414#0", + "pos": { + "x": 235.0, + "y": 485.0 + } + }, + { + "id": "andor414", + "name": "andor414#1", + "pos": { + "x": 235.0, + "y": 635.0 + } + }, + { + "id": "andor414", + "name": "andor414#2", + "pos": { + "x": 235.0, + "y": 785.0 + } + }, + { + "id": "andor414", + "name": "andor414#3", + "pos": { + "x": 135.0, + "y": 435.0 + } + }, + { + "id": "andor414", + "name": "andor414#4", + "pos": { + "x": 135.0, + "y": 585.0 + } + }, + { + "id": "andor414", + "name": "andor414#5", + "pos": { + "x": 135.0, + "y": 735.0 + } + }, + { + "id": "demux2", + "name": "demux2#0", + "pos": { + "x": 55.0, + "y": 45.0 + } + }, + { + "id": "demux2", + "name": "demux2#1", + "pos": { + "x": 55.0, + "y": 150.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#0", + "pos": { + "x": 55.0, + "y": 325.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#1", + "pos": { + "x": 55.0, + "y": 475.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#2", + "pos": { + "x": 55.0, + "y": 625.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#3", + "pos": { + "x": 55.0, + "y": 775.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A0" + }, + "pin2": { + "compName": "demux2#0", + "pinName": "S0" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "demux2#0", + "pinName": "S1" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 10.0, + "y": 150.0 + }, + { + "x": 10.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A3" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A4" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C1" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 290.0, + "y": 380.0 + }, + { + "x": 290.0, + "y": 445.0 + }, + { + "x": 230.0, + "y": 445.0 + }, + { + "x": 230.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C2" + }, + "name": "unnamedWire#102", + "path": [ + { + "x": 285.0, + "y": 390.0 + }, + { + "x": 285.0, + "y": 440.0 + }, + { + "x": 225.0, + "y": 440.0 + }, + { + "x": 225.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C3" + }, + "name": "unnamedWire#103", + "path": [ + { + "x": 280.0, + "y": 400.0 + }, + { + "x": 280.0, + "y": 435.0 + }, + { + "x": 220.0, + "y": 435.0 + }, + { + "x": 220.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C4" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 275.0, + "y": 410.0 + }, + { + "x": 275.0, + "y": 430.0 + }, + { + "x": 215.0, + "y": 430.0 + }, + { + "x": 215.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C1" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 290.0, + "y": 490.0 + }, + { + "x": 290.0, + "y": 595.0 + }, + { + "x": 230.0, + "y": 595.0 + }, + { + "x": 230.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C2" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 285.0, + "y": 500.0 + }, + { + "x": 285.0, + "y": 590.0 + }, + { + "x": 225.0, + "y": 590.0 + }, + { + "x": 225.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C3" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 280.0, + "y": 510.0 + }, + { + "x": 280.0, + "y": 585.0 + }, + { + "x": 220.0, + "y": 585.0 + }, + { + "x": 220.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C4" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 275.0, + "y": 520.0 + }, + { + "x": 275.0, + "y": 580.0 + }, + { + "x": 215.0, + "y": 580.0 + }, + { + "x": 215.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C1" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 290.0, + "y": 640.0 + }, + { + "x": 290.0, + "y": 745.0 + }, + { + "x": 230.0, + "y": 745.0 + }, + { + "x": 230.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A4" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C2" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 285.0, + "y": 650.0 + }, + { + "x": 285.0, + "y": 740.0 + }, + { + "x": 225.0, + "y": 740.0 + }, + { + "x": 225.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C3" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 280.0, + "y": 660.0 + }, + { + "x": 280.0, + "y": 735.0 + }, + { + "x": 220.0, + "y": 735.0 + }, + { + "x": 220.0, + "y": 810.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C4" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 275.0, + "y": 670.0 + }, + { + "x": 275.0, + "y": 730.0 + }, + { + "x": 215.0, + "y": 730.0 + }, + { + "x": 215.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA1" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 300.0, + "y": 790.0 + }, + { + "x": 300.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA2" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 305.0, + "y": 800.0 + }, + { + "x": 305.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA3" + }, + "name": "unnamedWire#115", + "path": [ + { + "x": 310.0, + "y": 810.0 + }, + { + "x": 310.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA4" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 315.0, + "y": 820.0 + }, + { + "x": 315.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C1" + }, + "name": "unnamedWire#117", + "path": [ + { + "x": 190.0, + "y": 330.0 + }, + { + "x": 190.0, + "y": 430.0 + }, + { + "x": 130.0, + "y": 430.0 + }, + { + "x": 130.0, + "y": 440.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C2" + }, + "name": "unnamedWire#118", + "path": [ + { + "x": 185.0, + "y": 340.0 + }, + { + "x": 185.0, + "y": 425.0 + }, + { + "x": 125.0, + "y": 425.0 + }, + { + "x": 125.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C3" + }, + "name": "unnamedWire#119", + "path": [ + { + "x": 180.0, + "y": 350.0 + }, + { + "x": 180.0, + "y": 420.0 + }, + { + "x": 120.0, + "y": 420.0 + }, + { + "x": 120.0, + "y": 460.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "and41#0", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 5.0, + "y": 450.0 + }, + { + "x": 5.0, + "y": 300.0 + }, + { + "x": 125.0, + "y": 300.0 + }, + { + "x": 125.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C4" + }, + "name": "unnamedWire#120", + "path": [ + { + "x": 175.0, + "y": 360.0 + }, + { + "x": 175.0, + "y": 415.0 + }, + { + "x": 115.0, + "y": 415.0 + }, + { + "x": 115.0, + "y": 470.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C1" + }, + "name": "unnamedWire#121", + "path": [ + { + "x": 190.0, + "y": 440.0 + }, + { + "x": 190.0, + "y": 580.0 + }, + { + "x": 130.0, + "y": 580.0 + }, + { + "x": 130.0, + "y": 590.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C2" + }, + "name": "unnamedWire#122", + "path": [ + { + "x": 185.0, + "y": 450.0 + }, + { + "x": 185.0, + "y": 575.0 + }, + { + "x": 125.0, + "y": 575.0 + }, + { + "x": 125.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C3" + }, + "name": "unnamedWire#123", + "path": [ + { + "x": 180.0, + "y": 460.0 + }, + { + "x": 180.0, + "y": 570.0 + }, + { + "x": 120.0, + "y": 570.0 + }, + { + "x": 120.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C4" + }, + "name": "unnamedWire#124", + "path": [ + { + "x": 175.0, + "y": 470.0 + }, + { + "x": 175.0, + "y": 565.0 + }, + { + "x": 115.0, + "y": 565.0 + }, + { + "x": 115.0, + "y": 620.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C1" + }, + "name": "unnamedWire#125", + "path": [ + { + "x": 190.0, + "y": 590.0 + }, + { + "x": 190.0, + "y": 730.0 + }, + { + "x": 130.0, + "y": 730.0 + }, + { + "x": 130.0, + "y": 740.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C2" + }, + "name": "unnamedWire#126", + "path": [ + { + "x": 185.0, + "y": 600.0 + }, + { + "x": 185.0, + "y": 725.0 + }, + { + "x": 125.0, + "y": 725.0 + }, + { + "x": 125.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C3" + }, + "name": "unnamedWire#127", + "path": [ + { + "x": 180.0, + "y": 610.0 + }, + { + "x": 180.0, + "y": 720.0 + }, + { + "x": 120.0, + "y": 720.0 + }, + { + "x": 120.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C4" + }, + "name": "unnamedWire#128", + "path": [ + { + "x": 175.0, + "y": 620.0 + }, + { + "x": 175.0, + "y": 715.0 + }, + { + "x": 115.0, + "y": 715.0 + }, + { + "x": 115.0, + "y": 770.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB1" + }, + "name": "unnamedWire#129", + "path": [ + { + "x": 190.0, + "y": 740.0 + }, + { + "x": 190.0, + "y": 880.0 + }, + { + "x": 325.0, + "y": 880.0 + }, + { + "x": 325.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "C" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 185.0, + "y": 155.0 + }, + { + "x": 185.0, + "y": 250.0 + }, + { + "x": 30.0, + "y": 250.0 + }, + { + "x": 30.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB2" + }, + "name": "unnamedWire#130", + "path": [ + { + "x": 185.0, + "y": 750.0 + }, + { + "x": 185.0, + "y": 885.0 + }, + { + "x": 330.0, + "y": 885.0 + }, + { + "x": 330.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB3" + }, + "name": "unnamedWire#131", + "path": [ + { + "x": 180.0, + "y": 760.0 + }, + { + "x": 180.0, + "y": 890.0 + }, + { + "x": 335.0, + "y": 890.0 + }, + { + "x": 335.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB4" + }, + "name": "unnamedWire#132", + "path": [ + { + "x": 175.0, + "y": 770.0 + }, + { + "x": 175.0, + "y": 895.0 + }, + { + "x": 340.0, + "y": 895.0 + }, + { + "x": 340.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "C" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 180.0, + "y": 165.0 + }, + { + "x": 180.0, + "y": 245.0 + }, + { + "x": 25.0, + "y": 245.0 + }, + { + "x": 25.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "C" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 175.0, + "y": 175.0 + }, + { + "x": 175.0, + "y": 240.0 + }, + { + "x": 20.0, + "y": 240.0 + }, + { + "x": 20.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "C" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 170.0, + "y": 185.0 + }, + { + "x": 170.0, + "y": 235.0 + }, + { + "x": 15.0, + "y": 235.0 + }, + { + "x": 15.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B0" + }, + "pin2": { + "compName": "demux2#1", + "pinName": "S0" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 250.0 + }, + { + "x": 5.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 50.0, + "y": 850.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D1" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 35.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D2" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 40.0, + "y": 340.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D3" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 45.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D4" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 50.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D1" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D2" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D3" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D4" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "demux2#1", + "pinName": "S1" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 350.0 + }, + { + "x": 10.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "D1" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "D2" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "D3" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "D4" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y00" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "D1" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 35.0, + "y": 780.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "D2" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 40.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "D3" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 45.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "D4" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y01" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#2", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#2", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#2", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#2", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#3", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#3", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#3", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y10" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#3", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y00" + }, + "pin2": { + "compName": "and41#1", + "pinName": "B" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 210.0, + "y": 50.0 + }, + { + "x": 210.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y01" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "B" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 205.0, + "y": 60.0 + }, + { + "x": 205.0, + "y": 570.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y10" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "B" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 200.0, + "y": 70.0 + }, + { + "x": 200.0, + "y": 720.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y11" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "B" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 195.0, + "y": 80.0 + }, + { + "x": 195.0, + "y": 870.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "B" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 110.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "B" + }, + "name": "unnamedWire#66", + "path": [ + { + "x": 105.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "B" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 100.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "B" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 95.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A1" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 130.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y11" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A2" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 125.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A3" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 120.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A4" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 115.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 130.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A2" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 125.0, + "y": 540.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A3" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 120.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A4" + }, + "name": "unnamedWire#76", + "path": [ + { + "x": 115.0, + "y": 560.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A1" + }, + "name": "unnamedWire#77", + "path": [ + { + "x": 130.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A2" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 125.0, + "y": 690.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A3" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 120.0, + "y": 700.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A4" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 115.0, + "y": 710.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A1" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 130.0, + "y": 830.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A2" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 125.0, + "y": 840.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A3" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 120.0, + "y": 850.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A4" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 115.0, + "y": 860.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A1" + }, + "name": "unnamedWire#85", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A2" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A3" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A4" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A1" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A2" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A2" + }, + "name": "unnamedWire#90", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A3" + }, + "name": "unnamedWire#91", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A4" + }, + "name": "unnamedWire#92", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A1" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A2" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A3" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A4" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A1" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A2" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A3" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "ram2", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "c00": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch4#0" + } + }, + "c01": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch4#1" + } + }, + "c10": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch4#2" + } + }, + "c11": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch4#3" + } + } + }, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "c11.q", + "c10.q", + "c01.q", + "c00.q" + ], + "vectorPartLengthes": [ + 4, + 4, + 4, + 4 + ] + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json new file mode 100644 index 00000000..de91b6be --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json @@ -0,0 +1,3525 @@ +{ + "width": 35.0, + "height": 130.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "B0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 105.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 115.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 125.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "QA1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "QA2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "QA3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "QA4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "QB1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "QB2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 65.0 + }, + "name": "QB3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 75.0 + }, + "name": "QB4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.1, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 229.0, + "y": 154.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 224.0, + "y": 164.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 69.0, + "y": 704.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 74.0, + "y": 714.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 59.0, + "y": 834.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 64.0, + "y": 844.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 69.0, + "y": 854.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 74.0, + "y": 864.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 39.0, + "y": 484.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 44.0, + "y": 494.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 49.0, + "y": 504.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 54.0, + "y": 514.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 219.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 39.0, + "y": 634.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 44.0, + "y": 644.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 49.0, + "y": 654.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 54.0, + "y": 664.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 39.0, + "y": 334.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 44.0, + "y": 349.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 49.0, + "y": 649.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 54.0, + "y": 749.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 214.0, + "y": 184.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 59.0, + "y": 534.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 64.0, + "y": 544.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 69.0, + "y": 554.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 74.0, + "y": 564.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 59.0, + "y": 684.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 64.0, + "y": 694.0 + }, + "params": 1 + }, + { + "id": "and41", + "name": "and41#0", + "pos": { + "x": 235.0, + "y": 150.0 + } + }, + { + "id": "and41", + "name": "and41#1", + "pos": { + "x": 250.0, + "y": 375.0 + } + }, + { + "id": "and41", + "name": "and41#2", + "pos": { + "x": 155.0, + "y": 325.0 + } + }, + { + "id": "andor414", + "name": "andor414#0", + "pos": { + "x": 250.0, + "y": 485.0 + } + }, + { + "id": "andor414", + "name": "andor414#1", + "pos": { + "x": 250.0, + "y": 635.0 + } + }, + { + "id": "andor414", + "name": "andor414#2", + "pos": { + "x": 250.0, + "y": 785.0 + } + }, + { + "id": "andor414", + "name": "andor414#3", + "pos": { + "x": 155.0, + "y": 435.0 + } + }, + { + "id": "andor414", + "name": "andor414#4", + "pos": { + "x": 155.0, + "y": 585.0 + } + }, + { + "id": "andor414", + "name": "andor414#5", + "pos": { + "x": 155.0, + "y": 735.0 + } + }, + { + "id": "demux2", + "name": "demux2#0", + "pos": { + "x": 55.0, + "y": 45.0 + } + }, + { + "id": "demux2", + "name": "demux2#1", + "pos": { + "x": 55.0, + "y": 150.0 + } + }, + { + "id": "ram2", + "name": "ram2#0", + "pos": { + "x": 80.0, + "y": 330.0 + } + }, + { + "id": "ram2", + "name": "ram2#1", + "pos": { + "x": 80.0, + "y": 480.0 + } + }, + { + "id": "ram2", + "name": "ram2#2", + "pos": { + "x": 80.0, + "y": 630.0 + } + }, + { + "id": "ram2", + "name": "ram2#3", + "pos": { + "x": 80.0, + "y": 780.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A0" + }, + "pin2": { + "compName": "demux2#0", + "pinName": "S0" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "demux2#0", + "pinName": "S1" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 10.0, + "y": 150.0 + }, + { + "x": 10.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A3" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QA4" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A4" + }, + "name": "unnamedWire#100", + "path": [ + { + "x": 140.0, + "y": 365.0 + }, + { + "x": 140.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QA1" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A1" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 140.0, + "y": 485.0 + }, + { + "x": 140.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QA2" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A2" + }, + "name": "unnamedWire#102", + "path": [ + { + "x": 140.0, + "y": 495.0 + }, + { + "x": 140.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QA3" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A3" + }, + "name": "unnamedWire#103", + "path": [ + { + "x": 140.0, + "y": 505.0 + }, + { + "x": 140.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QA4" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A4" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 140.0, + "y": 515.0 + }, + { + "x": 140.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QA1" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A1" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 140.0, + "y": 635.0 + }, + { + "x": 140.0, + "y": 630.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QA2" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A2" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 140.0, + "y": 645.0 + }, + { + "x": 140.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QA3" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A3" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 140.0, + "y": 655.0 + }, + { + "x": 140.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QA4" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A4" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 140.0, + "y": 665.0 + }, + { + "x": 140.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QA1" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A1" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 140.0, + "y": 785.0 + }, + { + "x": 140.0, + "y": 780.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A4" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QA2" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A2" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 140.0, + "y": 795.0 + }, + { + "x": 140.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QA3" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A3" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 140.0, + "y": 805.0 + }, + { + "x": 140.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QA4" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A4" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 140.0, + "y": 815.0 + }, + { + "x": 140.0, + "y": 810.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C1" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 305.0, + "y": 380.0 + }, + { + "x": 305.0, + "y": 445.0 + }, + { + "x": 245.0, + "y": 445.0 + }, + { + "x": 245.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C2" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 300.0, + "y": 390.0 + }, + { + "x": 300.0, + "y": 440.0 + }, + { + "x": 240.0, + "y": 440.0 + }, + { + "x": 240.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C3" + }, + "name": "unnamedWire#115", + "path": [ + { + "x": 295.0, + "y": 400.0 + }, + { + "x": 295.0, + "y": 435.0 + }, + { + "x": 235.0, + "y": 435.0 + }, + { + "x": 235.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C4" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 290.0, + "y": 410.0 + }, + { + "x": 290.0, + "y": 430.0 + }, + { + "x": 230.0, + "y": 430.0 + }, + { + "x": 230.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C1" + }, + "name": "unnamedWire#117", + "path": [ + { + "x": 305.0, + "y": 490.0 + }, + { + "x": 305.0, + "y": 595.0 + }, + { + "x": 245.0, + "y": 595.0 + }, + { + "x": 245.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C2" + }, + "name": "unnamedWire#118", + "path": [ + { + "x": 300.0, + "y": 500.0 + }, + { + "x": 300.0, + "y": 590.0 + }, + { + "x": 240.0, + "y": 590.0 + }, + { + "x": 240.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C3" + }, + "name": "unnamedWire#119", + "path": [ + { + "x": 295.0, + "y": 510.0 + }, + { + "x": 295.0, + "y": 585.0 + }, + { + "x": 235.0, + "y": 585.0 + }, + { + "x": 235.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "and41#0", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 15.0, + "y": 850.0 + }, + { + "x": 15.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C4" + }, + "name": "unnamedWire#120", + "path": [ + { + "x": 290.0, + "y": 520.0 + }, + { + "x": 290.0, + "y": 580.0 + }, + { + "x": 230.0, + "y": 580.0 + }, + { + "x": 230.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C1" + }, + "name": "unnamedWire#121", + "path": [ + { + "x": 305.0, + "y": 640.0 + }, + { + "x": 305.0, + "y": 745.0 + }, + { + "x": 245.0, + "y": 745.0 + }, + { + "x": 245.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C2" + }, + "name": "unnamedWire#122", + "path": [ + { + "x": 300.0, + "y": 650.0 + }, + { + "x": 300.0, + "y": 740.0 + }, + { + "x": 240.0, + "y": 740.0 + }, + { + "x": 240.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C3" + }, + "name": "unnamedWire#123", + "path": [ + { + "x": 295.0, + "y": 660.0 + }, + { + "x": 295.0, + "y": 735.0 + }, + { + "x": 235.0, + "y": 735.0 + }, + { + "x": 235.0, + "y": 810.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C4" + }, + "name": "unnamedWire#124", + "path": [ + { + "x": 290.0, + "y": 670.0 + }, + { + "x": 290.0, + "y": 730.0 + }, + { + "x": 230.0, + "y": 730.0 + }, + { + "x": 230.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB1" + }, + "name": "unnamedWire#125", + "path": [ + { + "x": 330.0, + "y": 790.0 + }, + { + "x": 330.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB2" + }, + "name": "unnamedWire#126", + "path": [ + { + "x": 335.0, + "y": 800.0 + }, + { + "x": 335.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB3" + }, + "name": "unnamedWire#127", + "path": [ + { + "x": 340.0, + "y": 810.0 + }, + { + "x": 340.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB4" + }, + "name": "unnamedWire#128", + "path": [ + { + "x": 345.0, + "y": 820.0 + }, + { + "x": 345.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C1" + }, + "name": "unnamedWire#129", + "path": [ + { + "x": 210.0, + "y": 330.0 + }, + { + "x": 210.0, + "y": 430.0 + }, + { + "x": 150.0, + "y": 430.0 + }, + { + "x": 150.0, + "y": 440.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "WE" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 290.0, + "y": 155.0 + }, + { + "x": 290.0, + "y": 230.0 + }, + { + "x": 35.0, + "y": 230.0 + }, + { + "x": 35.0, + "y": 375.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C2" + }, + "name": "unnamedWire#130", + "path": [ + { + "x": 205.0, + "y": 340.0 + }, + { + "x": 205.0, + "y": 425.0 + }, + { + "x": 145.0, + "y": 425.0 + }, + { + "x": 145.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C3" + }, + "name": "unnamedWire#131", + "path": [ + { + "x": 200.0, + "y": 350.0 + }, + { + "x": 200.0, + "y": 420.0 + }, + { + "x": 140.0, + "y": 420.0 + }, + { + "x": 140.0, + "y": 460.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C4" + }, + "name": "unnamedWire#132", + "path": [ + { + "x": 195.0, + "y": 360.0 + }, + { + "x": 195.0, + "y": 415.0 + }, + { + "x": 135.0, + "y": 415.0 + }, + { + "x": 135.0, + "y": 470.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C1" + }, + "name": "unnamedWire#133", + "path": [ + { + "x": 210.0, + "y": 440.0 + }, + { + "x": 210.0, + "y": 580.0 + }, + { + "x": 150.0, + "y": 580.0 + }, + { + "x": 150.0, + "y": 590.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C2" + }, + "name": "unnamedWire#134", + "path": [ + { + "x": 205.0, + "y": 450.0 + }, + { + "x": 205.0, + "y": 575.0 + }, + { + "x": 145.0, + "y": 575.0 + }, + { + "x": 145.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C3" + }, + "name": "unnamedWire#135", + "path": [ + { + "x": 200.0, + "y": 460.0 + }, + { + "x": 200.0, + "y": 570.0 + }, + { + "x": 140.0, + "y": 570.0 + }, + { + "x": 140.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C4" + }, + "name": "unnamedWire#136", + "path": [ + { + "x": 195.0, + "y": 470.0 + }, + { + "x": 195.0, + "y": 565.0 + }, + { + "x": 135.0, + "y": 565.0 + }, + { + "x": 135.0, + "y": 620.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C1" + }, + "name": "unnamedWire#137", + "path": [ + { + "x": 210.0, + "y": 590.0 + }, + { + "x": 210.0, + "y": 730.0 + }, + { + "x": 150.0, + "y": 730.0 + }, + { + "x": 150.0, + "y": 740.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C2" + }, + "name": "unnamedWire#138", + "path": [ + { + "x": 205.0, + "y": 600.0 + }, + { + "x": 205.0, + "y": 725.0 + }, + { + "x": 145.0, + "y": 725.0 + }, + { + "x": 145.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C3" + }, + "name": "unnamedWire#139", + "path": [ + { + "x": 200.0, + "y": 610.0 + }, + { + "x": 200.0, + "y": 720.0 + }, + { + "x": 140.0, + "y": 720.0 + }, + { + "x": 140.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "WE" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 285.0, + "y": 165.0 + }, + { + "x": 285.0, + "y": 225.0 + }, + { + "x": 30.0, + "y": 225.0 + }, + { + "x": 30.0, + "y": 525.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C4" + }, + "name": "unnamedWire#140", + "path": [ + { + "x": 195.0, + "y": 620.0 + }, + { + "x": 195.0, + "y": 715.0 + }, + { + "x": 135.0, + "y": 715.0 + }, + { + "x": 135.0, + "y": 770.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA1" + }, + "name": "unnamedWire#141", + "path": [ + { + "x": 210.0, + "y": 740.0 + }, + { + "x": 210.0, + "y": 880.0 + }, + { + "x": 310.0, + "y": 880.0 + }, + { + "x": 310.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA2" + }, + "name": "unnamedWire#142", + "path": [ + { + "x": 205.0, + "y": 750.0 + }, + { + "x": 205.0, + "y": 885.0 + }, + { + "x": 315.0, + "y": 885.0 + }, + { + "x": 315.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA3" + }, + "name": "unnamedWire#143", + "path": [ + { + "x": 200.0, + "y": 760.0 + }, + { + "x": 200.0, + "y": 890.0 + }, + { + "x": 320.0, + "y": 890.0 + }, + { + "x": 320.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA4" + }, + "name": "unnamedWire#144", + "path": [ + { + "x": 195.0, + "y": 770.0 + }, + { + "x": 195.0, + "y": 895.0 + }, + { + "x": 325.0, + "y": 895.0 + }, + { + "x": 325.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "WE" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 280.0, + "y": 175.0 + }, + { + "x": 280.0, + "y": 220.0 + }, + { + "x": 25.0, + "y": 220.0 + }, + { + "x": 25.0, + "y": 675.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "WE" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 275.0, + "y": 185.0 + }, + { + "x": 275.0, + "y": 215.0 + }, + { + "x": 20.0, + "y": 215.0 + }, + { + "x": 20.0, + "y": 825.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "A0" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B0" + }, + "pin2": { + "compName": "demux2#1", + "pinName": "S0" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 450.0 + }, + { + "x": 5.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "A1" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 45.0, + "y": 345.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "B0" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 50.0, + "y": 355.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "B1" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 55.0, + "y": 365.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "A0" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "A1" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "B0" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "B1" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "demux2#1", + "pinName": "S1" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 550.0 + }, + { + "x": 10.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "A0" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "A1" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "B0" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "B1" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "A0" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 40.0, + "y": 785.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "A1" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 45.0, + "y": 795.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "B0" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 50.0, + "y": 805.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y00" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "B1" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 55.0, + "y": 815.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 40.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "D1" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 60.0, + "y": 385.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "D2" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 65.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "D3" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 70.0, + "y": 405.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "D4" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 75.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "D1" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y01" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "D2" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "D3" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "D4" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "D1" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "D2" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "D3" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y10" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "D4" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "D1" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "D2" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "D3" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "D4" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 60.0, + "y": 950.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y11" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 65.0, + "y": 1050.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 70.0, + "y": 1150.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 75.0, + "y": 1250.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y00" + }, + "pin2": { + "compName": "and41#2", + "pinName": "B" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 135.0, + "y": 50.0 + }, + { + "x": 135.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y01" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "B" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 130.0, + "y": 60.0 + }, + { + "x": 130.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y10" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "B" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 125.0, + "y": 70.0 + }, + { + "x": 125.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y11" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "B" + }, + "name": "unnamedWire#76", + "path": [ + { + "x": 120.0, + "y": 80.0 + }, + { + "x": 120.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "B" + }, + "name": "unnamedWire#77", + "path": [ + { + "x": 230.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "B" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 225.0, + "y": 570.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "B" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 220.0, + "y": 720.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "B" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 215.0, + "y": 870.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QB1" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A1" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 140.0, + "y": 375.0 + }, + { + "x": 140.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QB2" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A2" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 140.0, + "y": 385.0 + }, + { + "x": 140.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QB3" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A3" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 140.0, + "y": 395.0 + }, + { + "x": 140.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QB4" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A4" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 140.0, + "y": 405.0 + }, + { + "x": 140.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QB1" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A1" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 140.0, + "y": 525.0 + }, + { + "x": 140.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QB2" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A2" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 140.0, + "y": 535.0 + }, + { + "x": 140.0, + "y": 540.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QB3" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A3" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 140.0, + "y": 545.0 + }, + { + "x": 140.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QB4" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A4" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 140.0, + "y": 555.0 + }, + { + "x": 140.0, + "y": 560.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QB1" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A1" + }, + "name": "unnamedWire#89", + "path": [ + { + "x": 140.0, + "y": 675.0 + }, + { + "x": 140.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A2" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QB2" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A2" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 140.0, + "y": 685.0 + }, + { + "x": 140.0, + "y": 690.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QB3" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A3" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 140.0, + "y": 695.0 + }, + { + "x": 140.0, + "y": 700.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QB4" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A4" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 140.0, + "y": 705.0 + }, + { + "x": 140.0, + "y": 710.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QB1" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A1" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 140.0, + "y": 825.0 + }, + { + "x": 140.0, + "y": 830.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QB2" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A2" + }, + "name": "unnamedWire#94", + "path": [ + { + "x": 140.0, + "y": 835.0 + }, + { + "x": 140.0, + "y": 840.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QB3" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A3" + }, + "name": "unnamedWire#95", + "path": [ + { + "x": 140.0, + "y": 845.0 + }, + { + "x": 140.0, + "y": 850.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QB4" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A4" + }, + "name": "unnamedWire#96", + "path": [ + { + "x": 140.0, + "y": 855.0 + }, + { + "x": 140.0, + "y": 860.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QA1" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A1" + }, + "name": "unnamedWire#97", + "path": [ + { + "x": 140.0, + "y": 335.0 + }, + { + "x": 140.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QA2" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A2" + }, + "name": "unnamedWire#98", + "path": [ + { + "x": 140.0, + "y": 345.0 + }, + { + "x": 140.0, + "y": 340.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QA3" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A3" + }, + "name": "unnamedWire#99", + "path": [ + { + "x": 140.0, + "y": 355.0 + }, + { + "x": 140.0, + "y": 350.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "ram4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "c00": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0" + } + }, + "c0000": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0", + "prefix": "c00" + } + }, + "c0001": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1", + "prefix": "c00" + } + }, + "c0010": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2", + "prefix": "c00" + } + }, + "c0011": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3", + "prefix": "c00" + } + }, + "c01": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1" + } + }, + "c0100": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0", + "prefix": "c01" + } + }, + "c0101": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1", + "prefix": "c01" + } + }, + "c0110": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2", + "prefix": "c01" + } + }, + "c0111": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3", + "prefix": "c01" + } + }, + "c10": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2" + } + }, + "c1000": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0", + "prefix": "c10" + } + }, + "c1001": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1", + "prefix": "c10" + } + }, + "c1010": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2", + "prefix": "c10" + } + }, + "c1011": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3", + "prefix": "c10" + } + }, + "c11": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3" + } + }, + "c1100": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0", + "prefix": "c11" + } + }, + "c1101": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1", + "prefix": "c11" + } + }, + "c1110": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2", + "prefix": "c11" + } + }, + "c1111": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3", + "prefix": "c11" + } + } + }, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "c11.q", + "c10.q", + "c01.q", + "c00.q" + ], + "vectorPartLengthes": [ + 16, + 16, + 16, + 16 + ] + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json new file mode 100644 index 00000000..afd89f18 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json @@ -0,0 +1,214 @@ +{ + "width": 35.0, + "height": 40.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "I2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "S2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 35.0, + "y": 30.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 35.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 60.0, + "y": 40.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 25.0, + "y": 12.5 + }, + { + "x": 25.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S2" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 15.0, + "y": 37.5 + }, + { + "x": 15.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#10" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 25.0, + "y": 62.5 + }, + { + "x": 25.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I2" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 15.0, + "y": 87.5 + }, + { + "x": 15.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#8" + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "sel1", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json new file mode 100644 index 00000000..22f3ce64 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json @@ -0,0 +1,863 @@ +{ + "width": 35.0, + "height": 100.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "B4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "SA", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "SB", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 20.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 20.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 65.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 65.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 20.0, + "y": 102.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 20.0, + "y": 152.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 20.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 20.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 20.0, + "y": 127.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 20.0, + "y": 177.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 65.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 65.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 6.5, + "y": 16.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 6.5, + "y": 66.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 6.5, + "y": 116.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 4.0, + "y": 41.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 4.0, + "y": 91.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 4.0, + "y": 141.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 15.0, + "y": 62.5 + }, + { + "x": 15.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 17.5, + "y": 87.5 + }, + { + "x": 17.5, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#10" + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#11" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#12" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#13" + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#14" + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 7.5, + "y": 167.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#16" + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#17" + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#18" + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#19" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 17.5, + "y": 112.5 + }, + { + "x": 17.5, + "y": 107.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#20" + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 5.0, + "y": 192.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 42.5, + "y": 12.5 + }, + { + "x": 42.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 45.0, + "y": 37.5 + }, + { + "x": 45.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "A" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 47.5, + "y": 62.5 + }, + { + "x": 47.5, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 50.0, + "y": 87.5 + }, + { + "x": 50.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 52.5, + "y": 112.5 + }, + { + "x": 52.5, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "B" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 55.0, + "y": 137.5 + }, + { + "x": 55.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 57.5, + "y": 162.5 + }, + { + "x": 57.5, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "B" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 60.0, + "y": 187.5 + }, + { + "x": 60.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 17.5, + "y": 137.5 + }, + { + "x": 17.5, + "y": 157.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 10.0, + "y": 162.5 + }, + { + "x": 10.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 12.5, + "y": 187.5 + }, + { + "x": 12.5, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 15.0, + "y": 212.5 + }, + { + "x": 15.0, + "y": 132.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B4" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 10.0, + "y": 237.5 + }, + { + "x": 10.0, + "y": 182.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SA" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#8" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SB" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "sel2_4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json new file mode 100644 index 00000000..c16624c8 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json @@ -0,0 +1,937 @@ +{ + "width": 35.0, + "height": 150.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 105.0 + }, + "name": "B4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 115.0 + }, + "name": "C1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 125.0 + }, + "name": "C2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 135.0 + }, + "name": "C3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 145.0 + }, + "name": "C4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "SA", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "SB", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "SC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 50.0, + "y": 570.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 50.0, + "y": 620.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 50.0, + "y": 670.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 50.0, + "y": 720.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 152.5, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 152.5, + "y": 65.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 152.5, + "y": 115.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 152.5, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 29.0, + "y": 584.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 29.0, + "y": 634.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 29.0, + "y": 684.0 + }, + "params": 1 + }, + { + "id": "not4", + "name": "not4#0", + "pos": { + "x": 75.0, + "y": 250.0 + } + }, + { + "id": "sel2_4", + "name": "sel2_4#0", + "pos": { + "x": 35.0, + "y": 250.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SA" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "SA" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 25.0, + "y": 25.0 + }, + { + "x": 25.0, + "y": 255.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SB" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "SB" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 20.0, + "y": 75.0 + }, + { + "x": 20.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A1" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A3" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A4" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SC" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 30.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 30.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 30.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 15.0, + "y": 175.0 + }, + { + "x": 15.0, + "y": 275.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 30.0, + "y": 735.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C1" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C2" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C3" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C4" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 115.0, + "y": 255.0 + }, + { + "x": 115.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 120.0, + "y": 265.0 + }, + { + "x": 120.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 125.0, + "y": 275.0 + }, + { + "x": 125.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 130.0, + "y": 285.0 + }, + { + "x": 130.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 135.0, + "y": 580.0 + }, + { + "x": 135.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 225.0 + }, + { + "x": 10.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 140.0, + "y": 630.0 + }, + { + "x": 140.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 145.0, + "y": 680.0 + }, + { + "x": 145.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 150.0, + "y": 730.0 + }, + { + "x": 150.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 5.0, + "y": 275.0 + }, + { + "x": 5.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 5.0, + "y": 325.0 + }, + { + "x": 5.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 10.0, + "y": 375.0 + }, + { + "x": 10.0, + "y": 315.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 15.0, + "y": 425.0 + }, + { + "x": 15.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 475.0 + }, + { + "x": 20.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B4" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 25.0, + "y": 525.0 + }, + { + "x": 25.0, + "y": 345.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "sel3_4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json new file mode 100644 index 00000000..2eff80ef --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json @@ -0,0 +1,285 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 7.5, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 35.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 35.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 62.5, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 29.0, + "y": 24.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#10" + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#11" + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 5.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4" + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 30.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 30.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 5.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 5.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "xor", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/plugin.xml b/plugins/net.mograsim.logic.model.am2900/plugin.xml new file mode 100644 index 00000000..7a324ad9 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/plugin.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java new file mode 100644 index 00000000..10cf1412 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java @@ -0,0 +1,39 @@ +package net.mograsim.logic.model.am2900; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import net.mograsim.logic.model.serializing.ClassLoaderBasedResourceLoader; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.MachineLoader; + +public class Am2900Loader implements BundleActivator +{ + // TODO use dff16 in dff16_we & dff16_invwe + private static AtomicBoolean activated = new AtomicBoolean(false); + + @Override + public void start(BundleContext context) throws Exception + { + setup(); + } + + @Override + public void stop(BundleContext context) throws Exception + { + // nothing + } + + public static void setup() + { + if (activated.getAndSet(true)) + return; + ClassLoaderBasedResourceLoader resourceLoader = ClassLoaderBasedResourceLoader.create(Am2900Loader.class.getClassLoader()); + IndirectModelComponentCreator.registerResourceLoader(resourceLoader, "Am2900Loader"); + IndirectModelComponentCreator.loadStandardComponentIDs(Am2900Loader.class.getResourceAsStream("standardComponentIDMapping.json")); + MachineLoader.setup(); +// System.out.println("SETUP DONE"); // TODO: Debug + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java new file mode 100644 index 00000000..4450e07b --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.components; + +import net.mograsim.logic.model.am2900.machine.Am2900Machine; +import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.standard.memory.ModelWordAddressableMemory; + +public class ModelAm2900MainMemory extends ModelWordAddressableMemory +{ + public ModelAm2900MainMemory(LogicModelModifiable model, String name) + { + super(model, Am2900MachineDefinition.getInstance().getMainMemoryDefinition(), name); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Am2900MainMemory"; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new ModelAm2900MainMemoryAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MainMemory.class.getCanonicalName(), (m, p, n) -> + { + return new ModelAm2900MainMemory(m, n); + }); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java new file mode 100644 index 00000000..e5e34ebb --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java @@ -0,0 +1,34 @@ +package net.mograsim.logic.model.am2900.components; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; +import net.mograsim.machine.standard.memory.CoreWordAddressableMemory; + +public class ModelAm2900MainMemoryAdapter implements ComponentAdapter +{ + + @Override + public Class getSupportedClass() + { + return ModelAm2900MainMemory.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MainMemory modelComponent, + Map logicWiresPerPin) + { + ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd(); + ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd(); + ReadEnd mode = logicWiresPerPin.get(modelComponent.getReadWritePin()).createReadOnlyEnd(); + CoreWordAddressableMemory mem = new CoreWordAddressableMemory(timeline, 2, modelComponent.getMachine().getMainMemory(), data, mode, + address); + modelComponent.setCoreModelBinding(mem); + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java new file mode 100644 index 00000000..cfd54c52 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.components; + +import net.mograsim.logic.model.am2900.machine.Am2900Machine; +import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.mi.components.ModelMicroInstructionMemory; + +public class ModelAm2900MicroInstructionMemory extends ModelMicroInstructionMemory +{ + public ModelAm2900MicroInstructionMemory(LogicModelModifiable model, String name) + { + super(model, Am2900MachineDefinition.getInstance().getMicroInstructionMemoryDefinition(), name); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new ModelAm2900MicroInstructionMemoryAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MicroInstructionMemory.class.getCanonicalName(), (m, p, n) -> + { + return new ModelAm2900MicroInstructionMemory(m, n); + }); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Am2900MicroInstructionMemory"; + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java new file mode 100644 index 00000000..895c58a5 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java @@ -0,0 +1,34 @@ +package net.mograsim.logic.model.am2900.components; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; +import net.mograsim.machine.mi.components.CoreMicroInstructionMemory; + +public class ModelAm2900MicroInstructionMemoryAdapter implements ComponentAdapter +{ + + @Override + public Class getSupportedClass() + { + return ModelAm2900MicroInstructionMemory.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MicroInstructionMemory modelComponent, + Map logicWiresPerPin) + { + ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd(); + ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd(); + CoreMicroInstructionMemory mem = new CoreMicroInstructionMemory(timeline, 2, + modelComponent.getMachine().getMicroInstructionMemory(), data, address); + modelComponent.setCoreModelBinding(mem); + } + +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java new file mode 100644 index 00000000..14500d5c --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java @@ -0,0 +1,87 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modeldff12 extends SimpleRectangularHardcodedModelComponent +{ + public Modeldff12(LogicModelModifiable model, String name) + { + super(model, "dff12", name, "D flip flop\n12 bits", false); + setSize(40, 20); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 20), Position.TOP); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 10), Position.RIGHT); + addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] QC = (Bit[]) lastState; + if (QC == null) + { + QC = new Bit[13]; + Arrays.fill(QC, U); + } + + Bit CVal = readEnds.get("C").getValue(); + + if (QC[12] == ZERO && CVal == ONE) + System.arraycopy(readEnds.get("D").getValues().getBits(), 0, QC, 0, 12); + + readWriteEnds.get("Y").feedSignals(Arrays.copyOfRange(QC, 0, 12)); + QC[12] = CVal; + + return QC; + } + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + switch (stateID) + { + case "q": + return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12)); + default: + return super.getHighLevelState(state, stateID); + } + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + switch (stateID) + { + case "q": + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 12) + throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); + System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12); + return lastState; + default: + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modeldff12.class.getCanonicalName(), (m, p, n) -> new Modeldff12(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java new file mode 100644 index 00000000..a3e7047e --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java @@ -0,0 +1,110 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modeldff4_finewe extends SimpleRectangularHardcodedModelComponent +{ + public Modeldff4_finewe(LogicModelModifiable model, String name) + { + super(model, "dff4_finewe", name, "D flip flop\n4 bits", false); + setSize(35, 90); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "_WE1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(model, this, "_WE2", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(model, this, "_WE3", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); + addPin(new Pin(model, this, "_WE4", 1, PinUsage.INPUT, 0, 45), Position.RIGHT); + addPin(new Pin(model, this, "D1", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); + addPin(new Pin(model, this, "D2", 1, PinUsage.INPUT, 0, 65), Position.RIGHT); + addPin(new Pin(model, this, "D3", 1, PinUsage.INPUT, 0, 75), Position.RIGHT); + addPin(new Pin(model, this, "D4", 1, PinUsage.INPUT, 0, 85), Position.RIGHT); + addPin(new Pin(model, this, "Q1", 1, PinUsage.OUTPUT, 35, 5), Position.LEFT); + addPin(new Pin(model, this, "Q2", 1, PinUsage.OUTPUT, 35, 15), Position.LEFT); + addPin(new Pin(model, this, "Q3", 1, PinUsage.OUTPUT, 35, 25), Position.LEFT); + addPin(new Pin(model, this, "Q4", 1, PinUsage.OUTPUT, 35, 35), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] QC = (Bit[]) lastState; + if (QC == null) + QC = new Bit[] { U, U, U, U, U }; + + Bit CVal = readEnds.get("C").getValue(); + + if (QC[0] == ZERO && CVal == ONE) + for (int i = 1; i < 5; i++) + { + Bit WEiVal = readEnds.get("_WE" + i).getValue(); + if (WEiVal == X || WEiVal == Z) + QC[i] = X; + else if (WEiVal == U) + QC[i] = U; + else if (WEiVal == ZERO) + QC[i] = readEnds.get("D" + i).getValue(); + } + + QC[0] = CVal; + + readWriteEnds.get("Q1").feedSignals(QC[1]); + readWriteEnds.get("Q2").feedSignals(QC[2]); + readWriteEnds.get("Q3").feedSignals(QC[3]); + readWriteEnds.get("Q4").feedSignals(QC[4]); + + return QC; + } + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + switch (stateID) + { + case "q": + return BitVector.of(Arrays.copyOfRange((Bit[]) state, 1, 5)); + default: + return super.getHighLevelState(state, stateID); + } + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + switch (stateID) + { + case "q": + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 4) + throw new IllegalArgumentException("Expected BitVector of length 4, not " + newHighLevelStateCasted.length()); + System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 1, 4); + return lastState; + default: + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modeldff4_finewe.class.getCanonicalName(), + (m, p, n) -> new Modeldff4_finewe(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java new file mode 100644 index 00000000..981c8488 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java @@ -0,0 +1,78 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modelinc extends SimpleRectangularHardcodedModelComponent +{ + private final int logicWidth; + + public Modelinc(LogicModelModifiable model, String name, int logicWidth) + { + super(model, "inc", name, "Incrementer", false); + this.logicWidth = logicWidth; + setSize(40, 20); + addPin(new Pin(model, this, "A", logicWidth, PinUsage.INPUT, 20, 20), Position.TOP); + addPin(new Pin(model, this, "CI", 1, PinUsage.INPUT, 40, 10), Position.LEFT); + addPin(new Pin(model, this, "Y", logicWidth, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] ABits = readEnds.get("A").getValues().getBits(); + Bit CIVal = readEnds.get("CI").getValue(); + Bit[] YBits = new Bit[logicWidth]; + if (CIVal == X) + Arrays.fill(YBits, X); + else if (CIVal == U) + Arrays.fill(YBits, U); + else if (CIVal == Z) + Arrays.fill(YBits, X); + else if (CIVal == ZERO) + YBits = ABits; + else + { + Bit carry = Bit.ONE; + // TODO extract to helper. This code almost also exists in ModelAm2910RegCntr. + for (int i = logicWidth - 1; i >= 0; i--) + { + Bit a = ABits[i]; + YBits[i] = a.xor(carry); + carry = a.and(carry); + } + } + readWriteEnds.get("Y").feedSignals(YBits); + return null; + } + + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modelinc.class.getCanonicalName(), + (m, p, n) -> new Modelinc(m, n, p.getAsInt())); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java new file mode 100644 index 00000000..4304d4a2 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java @@ -0,0 +1,61 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modelnor12 extends SimpleRectangularHardcodedModelComponent +{ + public Modelnor12(LogicModelModifiable model, String name) + { + super(model, "nor12", name, "=0", false); + setSize(35, 20); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 0, 10), Position.RIGHT); + addPin(new Pin(model, this, "Y", 1, PinUsage.OUTPUT, 35, 10), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + readWriteEnds.get("Y").feedSignals(getResult(readEnds.get("D").getValues().getBits())); + return null; + } + + private static Bit getResult(Bit[] DValArr) + { + for (int i = 0; i < 12; i++) + if (DValArr[i] == X) + return X; + for (int i = 0; i < 12; i++) + if (DValArr[i] == U) + return U; + for (int i = 0; i < 12; i++) + if (DValArr[i] == ONE) + return ZERO; + for (int i = 0; i < 12; i++) + if (DValArr[i] == Z) + return X; + return ONE; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modelnor12.class.getCanonicalName(), (m, p, n) -> new Modelnor12(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java new file mode 100644 index 00000000..53c9960d --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java @@ -0,0 +1,121 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modelram5_12 extends SimpleRectangularHardcodedModelComponent +{ + public Modelram5_12(LogicModelModifiable model, String name) + { + super(model, "ram5_12", name, "RAM\n5 x 12 Bit", false); + setSize(40, 40); + addPin(new Pin(model, this, "A", 3, PinUsage.INPUT, 10, 0), Position.BOTTOM); + addPin(new Pin(model, this, "B", 3, PinUsage.INPUT, 30, 0), Position.BOTTOM); + addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 0, 30), Position.RIGHT); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 40), Position.TOP); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + BitVector[] memC = (BitVector[]) lastState; + if (memC == null) + { + memC = new BitVector[6]; + Arrays.fill(memC, 0, 5, BitVector.of(U, 12)); + memC[5] = BitVector.of(U); + } + BitVector CVal = readEnds.get("C").getValues(); + BitVector oldC = memC[5]; + // TODO is the timing right? + if (oldC.getLSBit(0) == ZERO && CVal.getLSBit(0) == ONE && readEnds.get("WE").getValue() == ONE) + { + int BInt = getAsInt(readEnds.get("B").getValues()); + if (BInt == -1 || BInt > 4) + Arrays.fill(memC, BitVector.of(X, 12)); + else if (BInt == -2) + Arrays.fill(memC, BitVector.of(U, 12)); + else + memC[BInt] = readEnds.get("D").getValues(); + } + int AInt = getAsInt(readEnds.get("A").getValues()); + BitVector YVal = AInt == -1 || AInt > 4 ? BitVector.of(X, 12) : AInt == -2 ? BitVector.of(U, 12) : memC[AInt]; + readWriteEnds.get("Y").feedSignals(YVal); + memC[5] = CVal; + return memC; + } + + /** + * -1 means X, -2 means U + */ + private static int getAsInt(BitVector vect) + { + Bit[] bits = vect.getBits(); + for (int i = 0; i < 3; i++) + if (bits[i] == X) + return -1; + for (int i = 0; i < 3; i++) + if (bits[i] == U) + return -2; + for (int i = 0; i < 3; i++) + if (bits[i] == Z) + return -1; + return (bits[0] == ONE ? 4 : 0) + (bits[1] == ONE ? 2 : 0) + (bits[2] == ONE ? 1 : 0); + } + + Pattern stateIDPattern = Pattern.compile("c(0[10][10]|100)"); + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + Matcher m = stateIDPattern.matcher(stateID); + if (m.matches()) + return ((BitVector[]) state)[Integer.parseInt(m.group(1), 2)]; + return super.getHighLevelState(state, stateID); + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + Matcher m = stateIDPattern.matcher(stateID); + if (m.matches()) + { + int addr = Integer.parseInt(m.group(1), 2); + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 12) + throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); + BitVector[] memC = (BitVector[]) lastState; + memC[addr] = newHighLevelStateCasted; + return memC; + } + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modelram5_12.class.getCanonicalName(), (m, p, n) -> new Modelram5_12(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java new file mode 100644 index 00000000..7cce14a3 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java @@ -0,0 +1,87 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modelsel4_12 extends SimpleRectangularHardcodedModelComponent +{ + public Modelsel4_12(LogicModelModifiable model, String name) + { + super(model, "sel4_12", name, "4-way SEL\n12 bit", false); + setSize(80, 40); + addPin(new Pin(model, this, "SA", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "SB", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(model, this, "SC", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(model, this, "SD", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); + addPin(new Pin(model, this, "A", 12, PinUsage.INPUT, 10, 0), Position.BOTTOM); + addPin(new Pin(model, this, "B", 12, PinUsage.INPUT, 30, 0), Position.BOTTOM); + addPin(new Pin(model, this, "C", 12, PinUsage.INPUT, 50, 0), Position.BOTTOM); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 70, 0), Position.BOTTOM); + addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 40, 40), Position.TOP); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit SAVal = readEnds.get("SA").getValue(); + Bit SBVal = readEnds.get("SB").getValue(); + Bit SCVal = readEnds.get("SC").getValue(); + Bit SDVal = readEnds.get("SD").getValue(); + BitVector YVal; + if (SAVal == X || SBVal == X || SCVal == X || SDVal == X) + YVal = BitVector.of(X, 12); + else if (SAVal == U || SBVal == U || SCVal == U || SDVal == U) + YVal = BitVector.of(U, 12); + else if (SAVal == Z || SBVal == Z || SCVal == Z || SDVal == Z) + YVal = BitVector.of(X, 12); + else + { + YVal = null; + if (SAVal == ONE) + YVal = readEnds.get("A").getValues(); + if (SBVal == ONE) + if (YVal != null) + YVal = BitVector.of(X, 12); + else + YVal = readEnds.get("B").getValues(); + if (SCVal == ONE) + if (YVal != null) + YVal = BitVector.of(X, 12); + else + YVal = readEnds.get("C").getValues(); + if (SDVal == ONE) + if (YVal != null) + YVal = BitVector.of(X, 12); + else + YVal = readEnds.get("D").getValues(); + if (YVal == null) + YVal = BitVector.of(ZERO, 12); + } + + readWriteEnds.get("Y").feedSignals(YVal); + return null; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modelsel4_12.class.getCanonicalName(), (m, p, n) -> new Modelsel4_12(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java new file mode 100644 index 00000000..880d17c9 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java @@ -0,0 +1,286 @@ +package net.mograsim.logic.model.am2900.components.am2904; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2904RegCTInstrDecode extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2904RegCTInstrDecode(LogicModelModifiable model, String name) + { + super(model, "Am2904RegCTInstrDecode", name, "Instruction\ndecode", false); + setSize(80, 80); + addPin(new Pin(model, this, "I12-11", 2, PinUsage.INPUT, 0, 30), Position.RIGHT); + addPin(new Pin(model, this, "I5-0", 6, PinUsage.INPUT, 0, 50), Position.RIGHT); + // muSR MUX: + // 00: 0 + // 01: 1 + // 10: M + // 11: I + addPin(new Pin(model, this, "muSR_MUX", 2, PinUsage.OUTPUT, 80, 10), Position.LEFT); + addPin(new Pin(model, this, "muSR_OVRRET", 1, PinUsage.OUTPUT, 80, 20), Position.LEFT); + addPin(new Pin(model, this, "muSR_CINV", 1, PinUsage.OUTPUT, 80, 30), Position.LEFT); + addPin(new Pin(model, this, "muSR_WEZ", 1, PinUsage.OUTPUT, 80, 40), Position.LEFT); + addPin(new Pin(model, this, "muSR_WEC", 1, PinUsage.OUTPUT, 80, 50), Position.LEFT); + addPin(new Pin(model, this, "muSR_WEN", 1, PinUsage.OUTPUT, 80, 60), Position.LEFT); + addPin(new Pin(model, this, "muSR_WEOVR", 1, PinUsage.OUTPUT, 80, 70), Position.LEFT); + // MSR MUX: + // 000: 0 + // 001: 1 + // 010: mu + // 011: Y + // 100: I + // 101: I, invert C + // 110: Swap OVR and C + // 111: _M + addPin(new Pin(model, this, "MSR_MUX", 3, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + addPin(new Pin(model, this, "OEN", 1, PinUsage.OUTPUT, 60, 0), Position.BOTTOM); + // Y MUX: + // 00: mu + // 01: mu + // 10: M + // 11: I + addPin(new Pin(model, this, "Y_MUX", 2, PinUsage.OUTPUT, 10, 80), Position.TOP); + // CT MUX: + // see Am2900 Family Data Book, Am2904, Table 4 (CT_MUX2-0 = I3-1) + addPin(new Pin(model, this, "CT_MUX", 3, PinUsage.OUTPUT, 30, 80), Position.TOP); + addPin(new Pin(model, this, "CT_INV", 1, PinUsage.OUTPUT, 40, 80), Position.TOP); + addPin(new Pin(model, this, "CT_EXP", 1, PinUsage.OUTPUT, 50, 80), Position.TOP); + // C0 MUX: + // 00xx: 0 + // 01xx: 1 + // 10xx: CX + // 1100: muC + // 1101: _muC + // 1110: MC + // 1111: _MC + addPin(new Pin(model, this, "C0_MUX", 4, PinUsage.OUTPUT, 70, 80), Position.TOP); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] I5_0Bits = readEnds.get("I5-0").getValues().getBits(); + Bit[] I12_11Bits = readEnds.get("I12-11").getValues().getBits(); + int IAsInt = 0; + for (int i = 0; i < 6; i++) + switch (I5_0Bits[5 - i]) + { + case ONE: + IAsInt |= 1 << i; + break; + case U: + for (ReadWriteEnd e : readWriteEnds.values()) + e.feedSignals(BitVector.of(U, e.width())); + return null; + case X: + case Z: + for (ReadWriteEnd e : readWriteEnds.values()) + e.feedSignals(BitVector.of(X, e.width())); + return null; + case ZERO: + break; + default: + throw new IllegalArgumentException("Unknown enum constant: " + I5_0Bits[i]); + } + switch (IAsInt) + { + case 0: + case 2: + readWriteEnds.get("muSR_MUX").feedSignals(ONE, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 1: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 3: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 6: + case 7: + readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ONE); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 8: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 9: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 10: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 11: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 12: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 13: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 14: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 15: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 24: + case 25: + case 40: + case 41: + case 56: + case 57: + readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ONE); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + default: + readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + } + switch (IAsInt) + { + case 0: + readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ONE, ONE); + break; + case 1: + readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 2: + readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ONE, ZERO); + break; + case 3: + readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 4: + readWriteEnds.get("MSR_MUX").feedSignals(ONE, ONE, ZERO); + break; + case 5: + readWriteEnds.get("MSR_MUX").feedSignals(ONE, ONE, ONE); + break; + case 8: + case 9: + case 24: + case 25: + case 40: + case 41: + case 56: + case 57: + readWriteEnds.get("MSR_MUX").feedSignals(ONE, ZERO, ONE); + break; + default: + readWriteEnds.get("MSR_MUX").feedSignals(ONE, ZERO, ZERO); + break; + } + readWriteEnds.get("OEN").feedSignals(I5_0Bits[0].or(I5_0Bits[1]).or(I5_0Bits[2]).or(I5_0Bits[3]).or(I5_0Bits[4]).or(I5_0Bits[5])); + readWriteEnds.get("Y_MUX").feedSignals(I5_0Bits[0], I5_0Bits[1]); + readWriteEnds.get("CT_INV").feedSignals(I5_0Bits[5]); + readWriteEnds.get("CT_MUX").feedSignals(I5_0Bits[2], I5_0Bits[3], I5_0Bits[4]); + readWriteEnds.get("CT_EXP").feedSignals((IAsInt & 0b111110) == 0b001110 ? ONE : ZERO); + readWriteEnds.get("C0_MUX").feedSignals(I12_11Bits[0], I12_11Bits[1], I5_0Bits[0], + I5_0Bits[2].and(I5_0Bits[3].not()).and(I5_0Bits[4].not())); + return null; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2904RegCTInstrDecode.class.getCanonicalName(), + (m, p, n) -> new ModelAm2904RegCTInstrDecode(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java new file mode 100644 index 00000000..3e97cc6c --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java @@ -0,0 +1,323 @@ +package net.mograsim.logic.model.am2900.components.am2904; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2904ShiftInstrDecode extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2904ShiftInstrDecode(LogicModelModifiable model, String name) + { + super(model, "Am2904ShiftInstrDecode", name, "Shift \ninstruction\ndecode", false); + setSize(60, 80); + addPin(new Pin(model, this, "I", 5, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(model, this, "_SE", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); + // SIO0 MUX: + // 000: 0 + // 001: 1 + // 01x: SIOn + // 10x: QIOn + // 11x: MC + addPin(new Pin(model, this, "SIO0_MUX", 3, PinUsage.OUTPUT, 60, 5), Position.LEFT); + // SIOn MUX: + // 000: 0 + // 001: 1 + // 010: SIO0 + // 011: QIO0 + // 100: MC + // 101: MN + // 110: IC + // 111: IN xor IVOR + addPin(new Pin(model, this, "SIOn_MUX", 3, PinUsage.OUTPUT, 60, 15), Position.LEFT); + // QIO0 MUX: + // 000: 0 + // 001: 1 + // 01x: SIOn + // 10x: QIOn + // 11x: MC + addPin(new Pin(model, this, "QIO0_MUX", 3, PinUsage.OUTPUT, 60, 25), Position.LEFT); + // QIOn MUX: + // 000: 0 + // 001: 1 + // 01x: SIO0 + // 10x: QIO0 + // 11x: MN + addPin(new Pin(model, this, "QIOn_MUX", 3, PinUsage.OUTPUT, 60, 35), Position.LEFT); + addPin(new Pin(model, this, "OEn", 1, PinUsage.OUTPUT, 60, 45), Position.LEFT); + addPin(new Pin(model, this, "OE0", 1, PinUsage.OUTPUT, 60, 55), Position.LEFT); + // 00: SIO0 + // 01: QIO0 + // 1x: SIOn + addPin(new Pin(model, this, "MC_MUX", 2, PinUsage.OUTPUT, 60, 65), Position.LEFT); + addPin(new Pin(model, this, "MC_EN", 1, PinUsage.OUTPUT, 60, 75), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit _SE = readEnds.get("_SE").getValue(); + BitVector I = readEnds.get("I").getValues(); + readWriteEnds.get("OEn").feedSignals(I.getMSBit(0).not().and(_SE.not())); + readWriteEnds.get("OE0").feedSignals(I.getMSBit(0).and(_SE.not())); + if (_SE == Z || _SE == X) + { + readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("MC_MUX").feedSignals(X, X); + readWriteEnds.get("MC_EN").feedSignals(X); + return null; + } else if (_SE == U) + { + + readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U); + readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U); + readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U); + readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U); + readWriteEnds.get("MC_MUX").feedSignals(U, U); + readWriteEnds.get("MC_EN").feedSignals(U); + return null; + } else if (_SE == ONE) + { + readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("MC_MUX").feedSignals(X, X); + readWriteEnds.get("MC_EN").feedSignals(ZERO); + return null; + } + if (!I.isBinary()) + { + Bit val = null; + for (Bit b : I.getBits()) + if (!b.isBinary()) + { + val = b; + break; + } + readWriteEnds.get("SIO0_MUX").feedSignals(val, val, val); + readWriteEnds.get("SIOn_MUX").feedSignals(val, val, val); + readWriteEnds.get("QIO0_MUX").feedSignals(val, val, val); + readWriteEnds.get("QIOn_MUX").feedSignals(val, val, val); + readWriteEnds.get("MC_MUX").feedSignals(val, val); + readWriteEnds.get("MC_EN").feedSignals(val); + return null; + } + int IAsInt = I.getUnsignedValue().intValue(); + if (IAsInt < 16) + { + readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); + switch (IAsInt) + { + case 0: + case 2: + case 6: + case 7: + readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 1: + case 3: + readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 4: + case 9: + case 12: + readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ZERO); + break; + case 5: + readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ONE); + break; + case 8: + case 10: + readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ZERO); + break; + case 11: + readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ZERO); + break; + case 13: + case 15: + readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ONE); + break; + case 14: + readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ONE); + break; + default: + throw new IllegalStateException("can't happen"); + } + switch (IAsInt) + { + case 0: + readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 1: + readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 2: + readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ONE, X); + break; + case 3: + case 4: + case 5: + case 6: + case 7: + case 11: + case 12: + case 13: + case 14: + case 15: + readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ONE, X); + break; + case 8: + case 9: + case 10: + readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ZERO, X); + break; + default: + throw new IllegalStateException("can't happen"); + } + } else + { + readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); + switch (IAsInt) + { + case 16: + case 18: + readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 17: + case 19: + readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 20: + case 21: + case 22: + case 23: + case 28: + case 29: + case 30: + case 31: + readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X); + break; + case 24: + case 26: + readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X); + break; + case 25: + case 27: + readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ONE, X); + break; + default: + throw new IllegalStateException("can't happen"); + } + switch (IAsInt) + { + case 16: + case 18: + case 20: + case 22: + case 27: + readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 17: + case 19: + case 21: + case 23: + readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 24: + case 25: + case 26: + readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X); + break; + case 28: + case 30: + readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X); + break; + case 29: + case 31: + readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ONE, X); + break; + default: + throw new IllegalStateException("can't happen"); + } + } + // MC + switch (IAsInt) + { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + case 10: + case 11: + case 14: + case 15: + case 18: + case 19: + case 22: + case 23: + case 26: + case 27: + case 30: + case 31: + readWriteEnds.get("MC_EN").feedSignals(ZERO); + readWriteEnds.get("MC_MUX").feedSignals(X, X); + break; + case 2: + case 8: + case 9: + readWriteEnds.get("MC_EN").feedSignals(ONE); + readWriteEnds.get("MC_MUX").feedSignals(ZERO, ZERO); + break; + case 7: + case 12: + case 13: + readWriteEnds.get("MC_EN").feedSignals(ONE); + readWriteEnds.get("MC_MUX").feedSignals(ZERO, ONE); + break; + case 16: + case 17: + case 20: + case 21: + case 24: + case 25: + case 28: + case 29: + readWriteEnds.get("MC_EN").feedSignals(ONE); + readWriteEnds.get("MC_MUX").feedSignals(ONE, X); + break; + default: + throw new IllegalStateException("can't happen"); + } + return null; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2904ShiftInstrDecode.class.getCanonicalName(), + (m, p, n) -> new ModelAm2904ShiftInstrDecode(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java new file mode 100644 index 00000000..a96b6795 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java @@ -0,0 +1,267 @@ +package net.mograsim.logic.model.am2900.components.am2910; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2910InstrPLA extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2910InstrPLA(LogicModelModifiable model, String name) + { + super(model, "Am2910InstrPLA", name, "Instr.\nPLA", false); + setSize(30, 85); + addPin(new Pin(model, this, "PASS", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "I", 4, PinUsage.INPUT, 0, 20), Position.RIGHT); + addPin(new Pin(model, this, "R=0", 1, PinUsage.INPUT, 15, 0), Position.BOTTOM); + addPin(new Pin(model, this, "_PL", 1, PinUsage.OUTPUT, 5, 85), Position.TOP); + addPin(new Pin(model, this, "_MAP", 1, PinUsage.OUTPUT, 15, 85), Position.TOP); + addPin(new Pin(model, this, "_VECT", 1, PinUsage.OUTPUT, 25, 85), Position.TOP); + addPin(new Pin(model, this, "RWE", 1, PinUsage.OUTPUT, 30, 5), Position.LEFT); + addPin(new Pin(model, this, "RDEC", 1, PinUsage.OUTPUT, 30, 15), Position.LEFT); + addPin(new Pin(model, this, "YD", 1, PinUsage.OUTPUT, 30, 25), Position.LEFT); + addPin(new Pin(model, this, "YR", 1, PinUsage.OUTPUT, 30, 35), Position.LEFT); + addPin(new Pin(model, this, "YF", 1, PinUsage.OUTPUT, 30, 45), Position.LEFT); + addPin(new Pin(model, this, "YmuPC", 1, PinUsage.OUTPUT, 30, 55), Position.LEFT); + addPin(new Pin(model, this, "STKI0", 1, PinUsage.OUTPUT, 30, 65), Position.LEFT); + addPin(new Pin(model, this, "STKI1", 1, PinUsage.OUTPUT, 30, 75), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + ReadEnd PASS = readEnds.get("PASS"); + ReadEnd I = readEnds.get("I"); + ReadEnd Req0 = readEnds.get("R=0"); + ReadWriteEnd _PL = readWriteEnds.get("_PL"); + ReadWriteEnd _MAP = readWriteEnds.get("_MAP"); + ReadWriteEnd _VECT = readWriteEnds.get("_VECT"); + ReadWriteEnd RWE = readWriteEnds.get("RWE"); + ReadWriteEnd RDEC = readWriteEnds.get("RDEC"); + ReadWriteEnd YD = readWriteEnds.get("YD"); + ReadWriteEnd YR = readWriteEnds.get("YR"); + ReadWriteEnd YF = readWriteEnds.get("YF"); + ReadWriteEnd YmuPC = readWriteEnds.get("YmuPC"); + ReadWriteEnd STKI0 = readWriteEnds.get("STKI0"); + ReadWriteEnd STKI1 = readWriteEnds.get("STKI1"); + + Bit PASSVal = PASS.getValue(); + Bit I3Val = I.getValue(3); + Bit I2Val = I.getValue(2); + Bit I1Val = I.getValue(1); + Bit I0Val = I.getValue(0); + Bit Req0Val = Req0.getValue(); + + if (!I3Val.isBinary() || !I2Val.isBinary() || !I1Val.isBinary() || !I0Val.isBinary()) + if ((I3Val == U || I3Val.isBinary()) || (I2Val == U || I2Val.isBinary()) || (I1Val == U || I1Val.isBinary()) + || (I0Val == U || I0Val.isBinary())) + { + _PL.feedSignals(U); + _MAP.feedSignals(U); + _VECT.feedSignals(U); + RWE.feedSignals(U); + RDEC.feedSignals(U); + YD.feedSignals(U); + YR.feedSignals(U); + YF.feedSignals(U); + YmuPC.feedSignals(U); + STKI0.feedSignals(U); + STKI1.feedSignals(U); + } else + { + _PL.feedSignals(X); + _MAP.feedSignals(X); + _VECT.feedSignals(X); + RWE.feedSignals(X); + RDEC.feedSignals(X); + YD.feedSignals(X); + YR.feedSignals(X); + YF.feedSignals(X); + YmuPC.feedSignals(X); + STKI0.feedSignals(X); + STKI1.feedSignals(X); + } + else + { + int IAsInt = (I3Val == ONE ? 8 : 0) + (I2Val == ONE ? 4 : 0) + (I1Val == ONE ? 2 : 0) + (I0Val == ONE ? 1 : 0); + Bit _PLVal = ONE; + Bit _MAPVal = ONE; + Bit _VECTVal = ONE; + if (IAsInt == 2) + _MAPVal = ZERO; + else if (IAsInt == 6) + _VECTVal = ZERO; + else + _PLVal = ZERO; + _PL.feedSignals(_PLVal); + _MAP.feedSignals(_MAPVal); + _VECT.feedSignals(_VECTVal); + if (IAsInt == 8 || IAsInt == 9 || IAsInt == 15) + { + RWE.feedSignals(Req0Val); + RDEC.feedSignals(Req0Val);// "forward" X/U/Z + } else if (IAsInt == 4) + { + RWE.feedSignals(PASSVal); + RDEC.feedSignals(PASSVal == ONE ? ZERO : PASSVal);// "forward" X/U/Z + } else + { + RWE.feedSignals(ZERO); + RDEC.feedSignals(ZERO); + } + if (!PASSVal.isBinary()) + { + YD.feedSignals(PASSVal);// "forward" X/U/Z + YR.feedSignals(PASSVal);// "forward" X/U/Z + YF.feedSignals(PASSVal);// "forward" X/U/Z + YmuPC.feedSignals(PASSVal);// "forward" X/U/Z + } else + { + Bit YDVal = ZERO; + Bit YRVal = ZERO; + Bit YFVal = ZERO; + Bit YmuPCVal = ZERO; + switch (IAsInt + (PASSVal == ONE ? 16 : 0)) + { + case 0: + case 0 + 16: + break; + case 2: + case 1 + 16: + case 2 + 16: + case 3 + 16: + case 5 + 16: + case 6 + 16: + case 7 + 16: + case 11 + 16: + YDVal = ONE; + break; + case 5: + case 7: + YRVal = ONE; + break; + case 13: + case 10 + 16: + YFVal = ONE; + break; + case 1: + case 3: + case 4: + case 6: + case 10: + case 11: + case 12: + case 14: + case 4 + 16: + case 12 + 16: + case 13 + 16: + case 14 + 16: + case 15 + 16: + YmuPCVal = ONE; + break; + case 8: + case 8 + 16: + YFVal = Req0Val.not();// "forward" X/U/Z + YmuPCVal = Req0Val;// "forward" X/U/Z + break; + case 9: + case 9 + 16: + YDVal = Req0Val.not();// "forward" X/U/Z + YmuPCVal = Req0Val;// "forward" X/U/Z + break; + case 15: + YFVal = Req0Val.not();// "forward" X/U/Z + YDVal = Req0Val;// "forward" X/U/Z + break; + default: + throw new IllegalStateException("shouldn't happen"); + } + YD.feedSignals(YDVal); + YR.feedSignals(YRVal); + YF.feedSignals(YFVal); + YmuPC.feedSignals(YmuPCVal); + Bit STKI0Val; + Bit STKI1Val; + switch (IAsInt + (PASSVal == ONE ? 16 : 0)) + { + case 1: + case 2: + case 3: + case 6: + case 7: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 2 + 16: + case 3 + 16: + case 6 + 16: + case 7 + 16: + case 9 + 16: + case 12 + 16: + case 14 + 16: + // HOLD + STKI1Val = ZERO; + STKI0Val = ZERO; + break; + case 4: + case 5: + case 1 + 16: + case 4 + 16: + case 5 + 16: + // PUSH + STKI1Val = ZERO; + STKI0Val = ONE; + break; + case 0: + case 0 + 16: + // CLEAR + STKI1Val = ONE; + STKI0Val = ZERO; + break; + case 10 + 16: + case 11 + 16: + case 13 + 16: + case 15 + 16: + // POP + STKI1Val = ONE; + STKI0Val = ONE; + break; + case 8: + case 15: + case 8 + 16: + STKI1Val = Req0Val;// "forward" X/U/Z + STKI0Val = Req0Val;// "forward" X/U/Z + break; + default: + throw new IllegalStateException("shouldn't happen"); + } + STKI0.feedSignals(STKI0Val); + STKI1.feedSignals(STKI1Val); + } + } + return null; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2910InstrPLA.class.getCanonicalName(), + (m, p, n) -> new ModelAm2910InstrPLA(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java new file mode 100644 index 00000000..0c101bb4 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java @@ -0,0 +1,113 @@ +package net.mograsim.logic.model.am2900.components.am2910; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2910RegCntr extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2910RegCntr(LogicModelModifiable model, String name) + { + super(model, "Am2910RegCntr", name, "Register/\nCounter", false); + setSize(40, 40); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 0), Position.BOTTOM); + addPin(new Pin(model, this, "_RLD", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 20), Position.RIGHT); + addPin(new Pin(model, this, "DEC", 1, PinUsage.INPUT, 0, 30), Position.RIGHT); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 40, 20), Position.LEFT); + addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 40), Position.TOP); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] QC = (Bit[]) lastState; + if (QC == null) + { + QC = new Bit[13]; + Arrays.fill(QC, U); + } + + ReadEnd D = readEnds.get("D"); + ReadEnd _RLD = readEnds.get("_RLD"); + ReadEnd WE = readEnds.get("WE"); + ReadEnd DEC = readEnds.get("DEC"); + ReadEnd C = readEnds.get("C"); + ReadWriteEnd Y = readWriteEnds.get("Y"); + + Bit oldCVal = QC[12]; + Bit CVal = C.getValue(); + + // TODO handle U/X/Z + if (oldCVal == ZERO && CVal == ONE) + { + if ((DEC.getValue() == ZERO && WE.getValue() == ONE) || _RLD.getValue() == ZERO) + System.arraycopy(D.getValues().getBits(), 0, QC, 0, 12); + else if (WE.getValue() == ONE) + { + Bit carry = Bit.ZERO; + // TODO extract to helper. This code almost also exists in Modelinc. + for (int i = 11; i >= 0; i--) + { + Bit a = QC[i]; + QC[i] = a.xnor(carry); + carry = a.or(carry); + } + } + } + QC[12] = CVal; + Y.feedSignals(Arrays.copyOfRange(QC, 0, 12)); + + return QC; + } + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + switch (stateID) + { + case "q": + return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12)); + default: + return super.getHighLevelState(state, stateID); + } + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + switch (stateID) + { + case "q": + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 12) + throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); + System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12); + return lastState; + default: + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2910RegCntr.class.getCanonicalName(), + (m, p, n) -> new ModelAm2910RegCntr(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java new file mode 100644 index 00000000..a99fe0d5 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java @@ -0,0 +1,134 @@ +package net.mograsim.logic.model.am2900.components.am2910; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2910SP extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2910SP(LogicModelModifiable model, String name) + { + super(model, "Am2910SP", name, "Stack\npointer", false); + setSize(40, 30); + addPin(new Pin(model, this, "STKI0", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "STKI1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(model, this, "A", 3, PinUsage.OUTPUT, 10, 30), Position.TOP); + addPin(new Pin(model, this, "B", 3, PinUsage.OUTPUT, 30, 30), Position.TOP); + addPin(new Pin(model, this, "_FULL", 1, PinUsage.OUTPUT, 40, 15), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + BitAndInt SPC = (BitAndInt) lastState; + if (SPC == null) + { + SPC = new BitAndInt(); + SPC.bit = U; + SPC.i = -2; + } + int SP = SPC.i; + + Bit STKI0Val = readEnds.get("STKI0").getValue(); + Bit STKI1Val = readEnds.get("STKI1").getValue(); + Bit CVal = readEnds.get("C").getValue(); + if (SPC.bit == ZERO && CVal == ONE) + if (STKI0Val == U && STKI1Val == U) + SP = -2; + else if (!STKI0Val.isBinary() || !STKI1Val.isBinary()) + SP = -1; + else if (STKI0Val == ONE && STKI1Val == ZERO) + { + // PUSH + if (SP >= 0) + SP = SP == 5 ? 5 : SP + 1; + } else if (STKI0Val == ZERO && STKI1Val == ONE) + // CLEAR + SP = 0; + else if (STKI0Val == ONE && STKI1Val == ONE) + // POP + SP = SP <= 0 ? SP : SP - 1; + readWriteEnds.get("A").feedSignals(getAsBitVector(SP == 0 ? 7 : SP < 0 ? SP : SP - 1)); + readWriteEnds.get("B").feedSignals(getAsBitVector(SP == 5 ? 4 : SP)); + readWriteEnds.get("_FULL").feedSignals(SP == -2 ? U : SP == -1 ? X : SP == 5 ? ZERO : ONE); + + SPC.i = SP; + SPC.bit = CVal; + return SPC; + } + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + switch (stateID) + { + case "q": + return getAsBitVector(((BitAndInt) state).i); + default: + return super.getHighLevelState(state, stateID); + } + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + switch (stateID) + { + case "q": + int i; + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 3) + throw new IllegalArgumentException("Expected BitVector of length 3, not " + newHighLevelStateCasted.length()); + if (newHighLevelStateCasted.isBinary()) + i = newHighLevelStateCasted.getUnsignedValue().intValue(); + else + i = -1;// this makes setting to U impossible + if (i > 5) + throw new IllegalArgumentException("Given value not in range (0-5 incl.): " + i); + ((BitAndInt) lastState).i = i; + return lastState; + default: + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + } + + private static class BitAndInt + { + Bit bit; + int i; + } + + /** + * -1 means X, -2 means U + */ + private static BitVector getAsBitVector(int i) + { + if (i == -1) + return BitVector.of(X, 3); + if (i == -2) + return BitVector.of(U, 3); + return BitVector.of((i & 0b100) > 0 ? ONE : ZERO, (i & 0b10) > 0 ? ONE : ZERO, (i & 0b1) > 0 ? ONE : ZERO); + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2910SP.class.getCanonicalName(), (m, p, n) -> new ModelAm2910SP(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java new file mode 100644 index 00000000..0a0787cc --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java @@ -0,0 +1,104 @@ +package net.mograsim.logic.model.am2900.machine; + +import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory; +import net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MachineDefinition; +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.Register; +import net.mograsim.machine.mi.MicroInstructionMemory; +import net.mograsim.machine.mi.StandardMicroInstructionMemory; +import net.mograsim.machine.standard.memory.WordAddressableMemory; + +public class Am2900Machine implements Machine +{ + private Am2900MachineDefinition machineDefinition; + private LogicModelModifiable logicModel; + private Timeline timeline; + private MainMemory mainMemory; + private MicroInstructionMemory instMemory; + private CoreClock clock; + + public Am2900Machine(Am2900MachineDefinition am2900MachineDefinition) + { + this.machineDefinition = am2900MachineDefinition; + logicModel = new LogicModelModifiable(); + IndirectModelComponentCreator.createComponent(logicModel, + "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", "Am2900"); + CoreModelParameters params = new CoreModelParameters(); + params.gateProcessTime = 50; + params.wireTravelTime = 10; + mainMemory = new WordAddressableMemory(am2900MachineDefinition.getMainMemoryDefinition()); + instMemory = new StandardMicroInstructionMemory(am2900MachineDefinition.getMicroInstructionMemoryDefinition()); + logicModel.getComponentBySubmodelPath("Am2900.Am2900MainMemory#0", ModelAm2900MainMemory.class).setMachine(this); + logicModel.getComponentBySubmodelPath("Am2900.Am2900MicroInstructionMemory#0", ModelAm2900MicroInstructionMemory.class) + .setMachine(this); + timeline = LogicCoreAdapter.convert(logicModel, params); + } + + @Override + public MachineDefinition getDefinition() + { + return machineDefinition; + } + + @Override + public void reset() + { + // TODO Auto-generated method stub + + } + + @Override + public LogicModel getModel() + { + return logicModel; + } + + @Override + public Timeline getTimeline() + { + return timeline; + } + + @Override + public CoreClock getClock() + { + return clock; + } + + @Override + public BitVector getRegister(Register r) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setRegister(Register r, BitVector value) + { + // TODO Auto-generated method stub + + } + + @Override + public MainMemory getMainMemory() + { + return mainMemory; + } + + @Override + public MicroInstructionMemory getMicroInstructionMemory() + { + return instMemory; + } + +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java new file mode 100644 index 00000000..0ac06ea7 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java @@ -0,0 +1,63 @@ +package net.mograsim.logic.model.am2900.machine; + +import java.util.Objects; +import java.util.Set; + +import net.mograsim.machine.ISASchema; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MachineDefinition; +import net.mograsim.machine.MachineRegistry; +import net.mograsim.machine.MainMemoryDefinition; +import net.mograsim.machine.Register; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public class Am2900MachineDefinition implements MachineDefinition +{ + private MainMemoryDefinition memoryDefinition = new Am2900MainMemoryDefinition(); + private MicroInstructionMemoryDefinition microInstMemoryDefinition = new Am2900MicroInstructionMemoryDefinition(); + private final static Am2900MachineDefinition instance = new Am2900MachineDefinition(); + + public static Am2900MachineDefinition getInstance() + { + return Objects.requireNonNullElseGet((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"), + () -> instance); + } + + @Override + public Machine createNew() + { + return new Am2900Machine(this); + } + + @Override + public ISASchema getISASchema() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public Set getRegisters() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public int getAddressBits() + { + return 16; + } + + @Override + public MainMemoryDefinition getMainMemoryDefinition() + { + return memoryDefinition; + } + + @Override + public MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition() + { + return microInstMemoryDefinition; + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java new file mode 100644 index 00000000..478ec242 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.machine; + +import net.mograsim.machine.MainMemoryDefinition; + +public class Am2900MainMemoryDefinition implements MainMemoryDefinition +{ + + @Override + public int getMemoryAddressBits() + { + return 16; + } + + @Override + public long getMinimalAddress() + { + return 0; + } + + @Override + public long getMaximalAddress() + { + return 0xFFFF; + } + + @Override + public int getCellWidth() + { + return 16; + } + +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java new file mode 100644 index 00000000..3657bed9 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java @@ -0,0 +1,112 @@ +package net.mograsim.logic.model.am2900.machine; + +import java.util.Arrays; +import java.util.Optional; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.BooleanClassification; +import net.mograsim.machine.mi.parameters.IntegerClassification; +import net.mograsim.machine.mi.parameters.MnemonicFamily; +import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair; +import net.mograsim.machine.mi.parameters.ParameterClassification; + +public class Am2900MicroInstructionDefinition implements MicroInstructionDefinition +{ + private static final BooleanClassification interruptEnable = new BooleanClassification(false, "IE", "Dis"); + // not implemented, because not documented. + private static final MnemonicFamily interruptInstructions = new MnemonicFamily("X", new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))); + private static final BooleanClassification kmux = new BooleanClassification(false, "D", "K"); + private static final MnemonicFamily am2901SrcInstructions = new MnemonicFamily("AB", "AQ", "AB", "ZQ", "ZB", "ZA", "DA", "DQ", "DZ"); + private static final MnemonicFamily am2901FuncInstructions = new MnemonicFamily("ADD", "ADD", "SUBR", "SUBS", "OR", "AND", "NOTRS", + "EXOR", "EXNOR"); + private static final MnemonicFamily am2901DestInstructions = new MnemonicFamily("NOP", "QREG", "NOP", "RAMA", "RAMF", "RAMQD", "RAMD", + "RAMQU", "RAMU"); + private static final IntegerClassification register = new IntegerClassification(0, 4); + private static final BooleanClassification registerSelect = new BooleanClassification(false, "MR", "IR"); + private static final BooleanClassification abus = new BooleanClassification(true, "H", "AB"); + private static final BooleanClassification dbus = new BooleanClassification(true, "H", "DB"); + private static final MnemonicFamily am2904CarryInstructions = new MnemonicFamily("CI0", "CI0", "CI1", "CIX", "CIC"); + private static final MnemonicFamily am2904ShiftInstructions = new MnemonicFamily("RSL / LSLCO", "RSL / LSLCO", "RSH / LSHCO", + "RSCONI / LSL", "RSDH / LSH", "RSDC / LSDLCO", "RSDN / LSDHCO", "RSDL / LSDL", "RSDCO / LSDH", "RSRCO / LSCRO", + "RSRCIO / LSCRIO", "RSR / LSR", "RSDIC / LSLICI", "RSDRCI / LSDCIO", "RSDRCO / LSDRCO", "RSDXOR / LSDCI", "RSDR / LDSR"); +// private static final MnemonicFamily am2904StatusInstructions = new MnemonicFamily( +// new String[] { "MI_Zero", "MI_NotZero", "MI_UGTEQ", "MI_ULT", "MI_UGT", "MI_ULTEQ", "MI_SGTEQ", "MI_SLT", "MI_SGT", "MI_SLTEQ", +// "MA_Zero", "MA_NotZero", "MA_UGTEQ", "MA_ULT", "MA_UGT", "MA_ULTEQ", "MA_SGTEQ", "MA_SLT", "MA_SGT", "MA_SLTEQ" }, +// new long[] { 0b01_0101, 0b01_0100, 0b01_1101, 0b01_1100, 0b01_1110, 0b01_1111, 0b01_0010, 0b01_0011, 0b01_0000, 0b01_0001, +// 0b10_0101, 0b10_0100, 0b10_1101, 0b10_1100, 0b10_1110, 0b10_1111, 0b10_0010, 0b10_0011, 0b10_0000, 0b10_0001 }, +// 6); + // TODO: Maybe "X" and "notX" are swapped. + private static final MnemonicFamily am2904StatusInstructions = new MnemonicFamily("Load_Load_I_Z", "LoadM_LoadY_µ_NxorOVRorZ", + "Set_Set_µ_NxnorOVRornotZ", "Swap_Swap_µ_NxorOVR", "Reset_Reset_µ_NxnorOVR", "Load_LoadForShiftThroughOvr_µ_Z", + "Load_Invert_µ_notZ", "LoadOvrRetain_Load_µ_OVR", "LoadOvrRetain_Load_µ_notOVR", "ResetZ_LoadCarryInvert_µ_CorZ", + "SetZ_LoadCarryInvert_µ_notCandnotZ", "ResetC_Load_µ_C", "SetC_Load_µ_notC", "ResetN_Load_µ_notCorZ", "SetN_Load_µ_CandnotZ", + "ResetOvr_Load_IM_NxorN", "SetOvr_Load_IM_NxnorN", "Load_Load_µ_NxorOVRorZ", "Load_Load_µ_NxnorOVRornotZ", + "Load_Load_µ_NxorOVR", "Load_Load_µ_NxnorOVR", "Load_Load_µ_Z", "Load_Load_µ_notZ", "Load_Load_µ_OVR", "Load_Load_µ_notOVR", + "LoadCarryInvert_LoadCarryInvert_µ_CorZ", "LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ", "Load_Load_µ_C", "Load_Load_µ_notC", + "Load_Load_µ_notCorZ", "Load_Load_µ_CandnotZ", "Load_Load_µ_N", "Load_Load_µ_notN", "Load_Load_M_NxorOVRorZ", + "Load_Load_M_NxnorOVRornotZ", "Load_Load_M_NxorOVR", "Load_Load_M_NxnorOVR", "Load_Load_M_Z", "Load_Load_M_notZ", + "Load_Load_M_OVR", "Load_Load_M_notOVR", "LoadCarryInvert_LoadCarryInvert_M_CorZ", + "LoadCarryInvert_LoadCarryInvert_M_notCandnotZ", "Load_Load_M_C", "Load_Load_M_notC", "Load_Load_M_notCorZ", + "Load_Load_M_CandnotZ", "Load_Load_M_N", "Load_Load_M_notN", "Load_Load_I_NxorOVRorZ", "Load_Load_I_NxnorOVRornotZ", + "Load_Load_I_NxorOVR", "Load_Load_I_NxnorOVR", "Load_Load_I_Z", "Load_Load_I_notZ", "Load_Load_I_OVR", "Load_Load_I_notOVR", + "LoadCarryInvert_LoadCarryInvert_I_notCorZ", "LoadCarryInvert_LoadCarryInvert_I_CandnotZ", "Load_Load_I_C", "Load_Load_I_notC", + "Load_Load_I_notCorZ", "Load_Load_I_CandnotZ", "Load_Load_I_N", "Load_Load_I_notN"); + private static final BooleanClassification ccen = new BooleanClassification(true, "PS", "C"); + private static final MnemonicFamily am2910Instructions = new MnemonicFamily("CONT", "JZ", "CJS", "JMAP", "CJP", "PUSH", "JSRP", "CJV", + "JRP", "RFCT", "RPCT", "CRTN", "CJPP", "LDCT", "LOOP", "CONT", "TWB"); + + private static final IntegerClassification constant_12bit = new IntegerClassification(0, 12); + private static final IntegerClassification constant_16bit = new IntegerClassification(0, 16); + private static final BooleanClassification hE = new BooleanClassification(true, "H", "E"); + private static final BooleanClassification hI = new BooleanClassification(true, "H", "I"); + private static final BooleanClassification hL = new BooleanClassification(true, "H", "L"); + private static final BooleanClassification rW = new BooleanClassification(true, "R", "W"); + + private static final ParameterClassification[] classes = { interruptEnable, interruptInstructions, kmux, constant_16bit, + am2901SrcInstructions, am2901FuncInstructions, am2901DestInstructions, register, registerSelect, register, registerSelect, abus, + dbus, am2904CarryInstructions, am2904ShiftInstructions, hL, hL, am2904StatusInstructions, ccen, am2910Instructions, + constant_12bit, hL, hE, hI, hE, hL, rW }; + + private static final String[] paramDesc = { "Allow interrupts?", "Interrupt instructions; omitted for simplicity", + "Get D-input from data bus/constant value", "Constant value", "Operand sources for ALU operation", "ALU operation", + "Destination of ALU calculation", "Register for A-operand", "Get A-operand from instruction register/micro instruction?", + "Register for B-operand", "Get B-operand from instruction register/micro instruction?", + "Put data from Y-output on address bus?", "Put data from Y-output on data bus?", "Source for carry-in", "Shift instructions", + "Modify micro status register?", "Modify macro status register?", "Operations on the status register", + "Is conditional jump enabled?", "Instructions for the micro instruction pointer", "Absolute address of a micro instruction", + "Load instruction pointer from data bus?", "Put instruction pointer on data bus?", "Increment instruction pointer?", + "Put instruction pointer on address bus?", "Load instruction register from data bus?", "Read from/Write to main memory?" }; + + @Override + public ParameterClassification[] getParameterClassifications() + { + return classes; + } + + @Override + public ParameterClassification getParameterClassification(int index) + { + return classes[index]; + } + + @Override + public Optional getParameterDescription(int index) + { + return Optional.of(paramDesc[index]); + } + + public static void main(String[] args) + { + String s = "new BooleanClassification(\"R\", \"W\"), hL, new BooleanClassification(\"H\", \"E\"),\r\n" + + " new BooleanClassification(\"H\", \"I\"), new BooleanClassification(\"H\", \"E\"), hL, new IntegerClassification(12), am2910Instructions,\r\n" + + " new BooleanClassification(\"PS\", \"C\"), am2904StatusInstructions, hL, hL, am2904ShiftInstructions, am2904CarryInstructions,\r\n" + + " new BooleanClassification(\"H\", \"DB\"), new BooleanClassification(\"H\", \"AB\"), registerSelect, register, registerSelect, register,\r\n" + + " am2901DestInstructions, am2901FuncInstructions, am2901SrcInstructions, new IntegerClassification(16),\r\n" + + " new BooleanClassification(\"D\", \"K\"), interruptInstructions, new BooleanClassification(\"Dis\", \"IE\")"; + s = s.replaceAll("[\r\n\t]", ""); + System.out.print(Arrays.stream(s.split(", new")).reduce((a, b) -> b + ", new" + a)); +// System.out.println(Arrays.stream(paramDesc).reduce("", (a, b) -> String.format("\"%s\", %s", b, a))); + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java new file mode 100644 index 00000000..01b83212 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.machine; + +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public class Am2900MicroInstructionMemoryDefinition implements MicroInstructionMemoryDefinition +{ + + @Override + public int getMemoryAddressBits() + { + return 12; + } + + @Override + public long getMinimalAddress() + { + return 0; + } + + @Override + public long getMaximalAddress() + { + return 4096; + } + + @Override + public MicroInstructionDefinition getMicroInstructionDefinition() + { + return new Am2900MicroInstructionDefinition(); + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json new file mode 100644 index 00000000..b753895c --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json @@ -0,0 +1,68 @@ +{ + "version": "0.1.0", + "map": { + "Am2900MainMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory", + "Am2900MicroInstructionMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory", + "Am2904RegCTInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904RegCTInstrDecode", + "Am2904ShiftInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904ShiftInstrDecode", + "Am2910InstrPLA": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910InstrPLA", + "Am2910RegCntr": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910RegCntr", + "Am2910SP": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910SP", + "dff12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff12", + "dff4_finewe": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff4_finewe", + "inc": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelinc", + "nor12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelnor12", + "ram5_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelram5_12", + "sel4_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelsel4_12", + "Am2900": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", + "Am2901": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901.json", + "Am2901ALUFuncDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json", + "Am2901ALUInclDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json", + "Am2901ALUInclSourceDecodeInclFunctionDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json", + "Am2901ALUOneBit": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json", + "Am2904": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904.json", + "Am2910": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2910/Am2910.json", + "Am2904MSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json", + "Am2904muSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json", + "Am2904TestLogic": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json", + "Am2901DestDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json", + "Am2901SourceDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json", + "_rsLatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/_rsLatch.json", + "and": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and.json", + "and41": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and41.json", + "andor414": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/andor414.json", + "demux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/demux2.json", + "dff": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff.json", + "dff4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4.json", + "dff4_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4_invwe.json", + "dff8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff8.json", + "dff12_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff12_we.json", + "dff16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16.json", + "dff16_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_we.json", + "dff16_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_invwe.json", + "dff80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff80.json", + "dlatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch.json", + "dlatch4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch4.json", + "dlatch8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch8.json", + "dlatch80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch80.json", + "fulladder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/fulladder.json", + "halfadder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/halfadder.json", + "mux1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1.json", + "mux1_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_4.json", + "mux1_8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_8.json", + "mux1_12": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_12.json", + "mux1_16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_16.json", + "mux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux2.json", + "mux3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux3.json", + "nand3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/nand3.json", + "not4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/not4.json", + "or4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or4.json", + "or_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or_4.json", + "ram2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram2.json", + "ram4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram4.json", + "sel1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel1.json", + "sel2_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel2_4.json", + "sel3_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel3_4.json", + "xor": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/xor.json" + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java new file mode 100644 index 00000000..7a161348 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java @@ -0,0 +1,74 @@ +package net.mograsim.logic.model.examples; + +import java.util.ArrayList; + +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler.BitVectorSplittingAtomicHighLevelStateHandlerParams; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler.DelegatingAtomicHighLevelStateHandlerParams; + +public class GenerateDff80HighLevelStateHandler +{ + public static void main(String[] args) + { + Am2900Loader.setup(); + LogicModelModifiable model = new LogicModelModifiable(); + DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, null, null, null); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#0");// LSB + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#1"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#2"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#3"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#4"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#5"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#6"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#7"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#8"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#9");// MSB + + StandardHighLevelStateHandler hlsh = new StandardHighLevelStateHandler(comp); + comp.setHighLevelStateHandler(hlsh); + BitVectorSplittingAtomicHighLevelStateHandlerParams p = new BitVectorSplittingAtomicHighLevelStateHandlerParams(); + p.vectorPartLengthes = new ArrayList<>(); + p.vectorPartTargets = new ArrayList<>(); + for (int i = 0; i < 10; i++) + { + addHandlersForByte(comp, hlsh, i, p); + } + hlsh.addAtomicHighLevelState("q", new BitVectorSplittingAtomicHighLevelStateHandler(comp, p)); + + System.out.println(comp.getHighLevelStateHandler().getParamsForSerializingJSON(new IdentifyParams())); + } + + private static void addHandlersForByte(SubmodelComponent comp, StandardHighLevelStateHandler hlsh, int LSByteIndex, + BitVectorSplittingAtomicHighLevelStateHandlerParams p2) + { + // TODO remove the "+ 1" as soon as HighLevelStates count from 0 + // Also replace the 1 in "bitIndexInByte = 1" below with a 0 + int LSBitIndex = LSByteIndex * 8 + 1; + int MSBitIndex = LSBitIndex + 7; + String dffThisByte = "dff8#" + LSByteIndex; + String thisByteHLSID = "q" + MSBitIndex + "-" + LSBitIndex; + + p2.vectorPartLengthes.add(0, 8); + p2.vectorPartTargets.add(0, thisByteHLSID); + + DelegatingAtomicHighLevelStateHandlerParams p = new DelegatingAtomicHighLevelStateHandlerParams(); + p.delegateTarget = dffThisByte; + p.subStateID = "q"; + hlsh.addAtomicHighLevelState(thisByteHLSID, new DelegatingAtomicHighLevelStateHandler(comp, p)); + for (int bitIndexOuter = LSBitIndex, bitIndexInByte = 1; bitIndexOuter <= MSBitIndex; bitIndexOuter++, bitIndexInByte++) + { + p = new DelegatingAtomicHighLevelStateHandlerParams(); + p.delegateTarget = dffThisByte; + p.subStateID = "q" + bitIndexInByte; + hlsh.addAtomicHighLevelState("q" + bitIndexOuter, new DelegatingAtomicHighLevelStateHandler(comp, p)); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java new file mode 100644 index 00000000..1e654c80 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java @@ -0,0 +1,58 @@ +package net.mograsim.logic.model.examples; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelComponentTestbench +{ + public static void main(String[] args) + { + SimpleLogicUIStandalone.executeVisualisation(ModelComponentTestbench::createTestbench); + } + + @SuppressWarnings("unused") // for ModelWires being created + public static void createTestbench(LogicModelModifiable model) + { + Am2900Loader.setup(); + ModelComponent comp = IndirectModelComponentCreator.createComponent(model, "Am2900"); + + List inputPinNames = new ArrayList<>(); + List outputPinNames = new ArrayList<>(); + for (Pin p : comp.getPins().values()) + if (p.usage == PinUsage.INPUT) + inputPinNames.add(p.name); + else + outputPinNames.add(p.name); + + inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); + outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); + + comp.moveTo(100, 0); + for (int i = 0; i < inputPinNames.size(); i++) + { + String pinName = inputPinNames.get(i); + ModelManualSwitch sw = new ModelManualSwitch(model, comp.getPin(pinName).logicWidth); + sw.moveTo(0, 20 * i); + new ModelWire(model, comp.getPin(pinName), sw.getOutputPin()); + } + for (int i = 0; i < outputPinNames.size(); i++) + { + String pinName = outputPinNames.get(i); + ModelBitDisplay bd = new ModelBitDisplay(model, comp.getPin(pinName).logicWidth); + bd.moveTo(200, 20 * i); + new ModelWire(model, comp.getPin(pinName), bd.getInputPin()); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java new file mode 100644 index 00000000..f34bf342 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java @@ -0,0 +1,363 @@ +package net.mograsim.logic.model.examples; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.Scanner; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; + +public class ReserializeAndVerifyJSONs +{ + public static double GRIDSIZE = 2.5; + public static boolean changePinUsages = false; + public static boolean changeComponentNames = false; + public static boolean snapWCPs = true; + public static boolean warnNonSnappedPoints = true; + public static boolean warnNonVertHorizLines = true; + public static boolean warnRedundantWires = true; + + public static void main(String[] args) throws IOException + { + Am2900Loader.setup(); + try (Scanner sysin = new Scanner(System.in)) + { + System.out.print("Directory to search for JSONs in / JSON file to reserialize >"); + Path root = Paths.get(sysin.nextLine()); + if (!Files.exists(root)) + throw new IllegalArgumentException("Path doesn't exist"); + if (Files.isRegularFile(root)) + reserializeJSON(root, sysin); + else + { + System.out.print("Recursive? >"); + boolean recursive = Boolean.valueOf(sysin.nextLine()); + try (Stream jsons = recursive ? Files.walk(root) : Files.list(root)) + { + jsons.filter(Files::isRegularFile).filter(p -> p.getFileName().toString().endsWith(".json")) + .forEach(j -> reserializeJSON(j, sysin)); + } + } + } + } + + public static void reserializeJSON(Path componentPath, Scanner sysin) + { + try + { + DeserializedSubmodelComponent comp = (DeserializedSubmodelComponent) IndirectModelComponentCreator + .createComponent(new LogicModelModifiable(), "jsonfile:" + componentPath.toString()); + System.out.println("Reserializing " + componentPath); + LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); + Map componentNameRemapping = new HashMap<>(); + + if (changePinUsages) + changePinUsages(sysin, comp); + if (changeComponentNames) + changeComponentNames(sysin, submodelModifiable, componentNameRemapping); + if (snapWCPs) + snapWCPs(submodelModifiable); + if (warnNonSnappedPoints) + warnNonSnappedPoints(comp, submodelModifiable); + if (warnNonVertHorizLines) + warnNonVertHorizLines(submodelModifiable); + if (warnRedundantWires) + warnRedundantWires(submodelModifiable); + + SubmodelComponentSerializer.serialize(comp, componentPath.toString()); + + if (changeComponentNames) + changeComponentNames_AfterSerialization(sysin, comp, componentNameRemapping); + } + catch (Exception e) + { + System.err.println("An error occurred visiting " + componentPath + ":"); + e.printStackTrace(); + } + } + + private static void warnRedundantWires(LogicModelModifiable submodelModifiable) + { + Map> connectedPinGroups = new HashMap<>(); + submodelModifiable.getComponentsByName().values().stream().map(ModelComponent::getPins).map(Map::values).flatMap(Collection::stream) + .forEach(p -> connectedPinGroups.put(p, new HashSet<>(Arrays.asList(p)))); + submodelModifiable.getWiresByName().values().forEach(w -> + { + Pin pin1 = w.getPin1(); + Pin pin2 = w.getPin2(); + Set pin1Group = connectedPinGroups.get(pin1); + Set pin2Group = connectedPinGroups.get(pin2); + if (pin1Group == pin2Group) + System.out.println(" Wire " + w.name + " connecting " + pin1 + " and " + pin2 + " is redundant"); + else + { + pin1Group.addAll(pin2Group); + pin2Group.forEach(p -> connectedPinGroups.put(p, pin1Group)); + } + }); + } + + private static void changePinUsages(Scanner sysin, DeserializedSubmodelComponent comp) + { + comp.getSupermodelPins().entrySet().stream().sorted(Comparator.comparing(Entry::getKey)).map(Entry::getValue).forEach(pin -> + { + PinUsage usage = null; + while (usage == null) + try + { + System.out.print(" Usage for interface pin " + pin.name + " (empty: " + pin.usage + ") >"); + String usageStr = sysin.nextLine().toUpperCase(); + usage = usageStr.equals("") ? pin.usage + : usageStr.equals("I") ? PinUsage.INPUT + : usageStr.equals("O") ? PinUsage.OUTPUT + : usageStr.equals("T") ? PinUsage.TRISTATE : PinUsage.valueOf(usageStr); + } + catch (@SuppressWarnings("unused") IllegalArgumentException e) + { + System.err.println(" Illegal usage"); + } + setInterfacePinUsage(comp, pin, usage); + }); + } + + private static void changeComponentNames(Scanner sysin, LogicModelModifiable submodelModifiable, + Map componentNameRemapping) + { + componentNameRemapping.put(SubmodelComponent.SUBMODEL_INTERFACE_NAME, SubmodelComponent.SUBMODEL_INTERFACE_NAME); + LogicModelModifiable tempModel = new LogicModelModifiable(); + IdentifyParams iP = new IdentifyParams(); + submodelModifiable.getComponentsByName().entrySet().stream() + .filter(e -> !e.getKey().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)) + .sorted(Comparator.comparing(Entry::getKey, ReserializeAndVerifyJSONs::compareStringsWithIntegers)).forEach(e -> + { + String oldName = e.getKey(); + ModelComponent subcomp = e.getValue(); + String defaultName = tempModel.getDefaultComponentName(subcomp); + String newName = null; + while (newName == null) + { + System.out.print(" New name for component " + oldName + " of type " + subcomp.getIDForSerializing(iP) + " (empty: " + + defaultName + ") >"); + newName = sysin.nextLine(); + if (newName.equals("")) + newName = defaultName; + if (tempModel.getComponentsByName().containsKey(newName)) + { + System.err.println(" There already is a component with that name"); + newName = null; + } + } + componentNameRemapping.put(oldName, newName); + IndirectModelComponentCreator + .createComponent(tempModel, subcomp.getIDForSerializing(iP), subcomp.getParamsForSerializingJSON(iP), newName) + .moveTo(subcomp.getPosX(), subcomp.getPosY()); + }); + SubmodelInterface tempSubmodelInterface = new SubmodelInterface(tempModel); + for (Pin p : submodelModifiable.getComponentsByName().get(SubmodelComponent.SUBMODEL_INTERFACE_NAME).getPins().values()) + tempSubmodelInterface + .addPin(new Pin(tempModel, tempSubmodelInterface, p.name, p.logicWidth, p.usage, p.getRelX(), p.getRelY())); + for (ModelWire w : submodelModifiable.getWiresByName().values()) + createWire(componentNameRemapping::get, tempModel, w); + + Optional o; + while ((o = submodelModifiable.getComponentsByName().values().stream() + .filter(c -> !c.getName().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)).findAny()).isPresent()) + submodelModifiable.destroyComponent(o.get()); + + tempModel.getComponentsByName().values().stream().filter(c -> !c.getName().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)) + .forEach(c -> IndirectModelComponentCreator + .createComponent(submodelModifiable, c.getIDForSerializing(iP), c.getParamsForSerializingJSON(iP), c.getName()) + .moveTo(c.getPosX(), c.getPosY())); + for (ModelWire w : tempModel.getWiresByName().values()) + createWire(Function.identity(), submodelModifiable, w); + } + + private static void changeComponentNames_AfterSerialization(Scanner sysin, DeserializedSubmodelComponent comp, + Map componentNameRemapping) + { + if (comp.getHighLevelStateHandler() == null || !(comp.getHighLevelStateHandler() instanceof DefaultHighLevelStateHandler)) + { + System.out.println(" A non-default HighLevelStateHandler was detected. Check for changes there manually."); + System.out.print(" Empty line to continue to next component, old component name to get new component name >"); + for (String line = sysin.nextLine(); !line.equals(""); line = sysin.nextLine()) + System.out.println(" " + line + "->" + componentNameRemapping.get(line) + " >"); + } + } + + private static void snapWCPs(LogicModelModifiable submodelModifiable) + { + submodelModifiable.getComponentsByName().values().stream().filter(c -> c instanceof ModelWireCrossPoint).forEach(c -> + { + double x = c.getPosX(); + double y = c.getPosY(); + double newX = x % GRIDSIZE == 0 ? x - 1 : x; + double newY = y % GRIDSIZE == 0 ? y - 1 : y; + if (x != newX || y != newY) + { + c.moveTo(newX, newY); + System.out.println(" Snapping WCP " + c.getName()); + } + }); + } + + private static void warnNonSnappedPoints(DeserializedSubmodelComponent comp, LogicModelModifiable submodelModifiable) + { + if (comp.getWidth() % GRIDSIZE != 0 || comp.getHeight() % GRIDSIZE != 0) + System.out.println(" Size is not snapped to grid: " + comp.getWidth() + "," + comp.getHeight()); + submodelModifiable.getComponentsByName().values().forEach(c -> + { + double x = c.getPosX(); + double y = c.getPosY(); + if (c instanceof ModelWireCrossPoint) + { + x++; + y++; + } + if (x % GRIDSIZE != 0 || y % GRIDSIZE != 0) + System.out.println(" Component " + c.getName() + " (type " + c.getIDForSerializing(new IdentifyParams()) + + ") is not snapped to grid: " + x + "," + y); + }); + submodelModifiable.getWiresByName().values().forEach(w -> + { + Point[] p = w.getPath(); + if (p != null) + for (int i = 0; i < p.length; i++) + if (p[i].x % GRIDSIZE != 0 || p[i].y % GRIDSIZE != 0) + System.out.println(" Wire " + w.name + " path point #" + i + " is not snapped to grid: " + p[i].x + "," + p[i].y); + }); + comp.getPins().values().forEach(p -> + { + if (p.getRelX() % GRIDSIZE != 0 || p.getRelY() % GRIDSIZE != 0) + System.out.println(" Interface point " + p.name + " is not snapped to grid: " + p.getRelX() + "," + p.getRelY()); + }); + } + + private static void warnNonVertHorizLines(LogicModelModifiable submodelModifiable) + { + submodelModifiable.getWiresByName().values().forEach(w -> + { + double[] p = w.getEffectivePath(); + for (int i = 1; i < p.length / 2; i++) + { + double x1 = p[2 * i - 2]; + double y1 = p[2 * i - 1]; + double x2 = p[2 * i + 0]; + double y2 = p[2 * i + 1]; + if (x1 != x2 && y1 != y2) + System.out.println(" Wire " + w.name + " part #" + (i - 1) + " is neither vertical nor horizontal"); + } + }); + } + + private static ModelWire createWire(Function componentNameRemapping, LogicModelModifiable tempModelForDefaultNames, + ModelWire w) + { + return new ModelWire(tempModelForDefaultNames, w.name, + getRemappedPin(componentNameRemapping, tempModelForDefaultNames, w.getPin1()), + getRemappedPin(componentNameRemapping, tempModelForDefaultNames, w.getPin2()), w.getPath()); + } + + private static Pin getRemappedPin(Function componentNameRemapping, LogicModelModifiable tempModelForDefaultNames, + Pin pin) + { + return tempModelForDefaultNames.getComponentsByName().get(componentNameRemapping.apply(pin.component.getName())).getPin(pin.name); + } + + private static int compareStringsWithIntegers(String a, String b) + { + int aLoc = 0; + int bLoc = 0; + for (;;) + { + if (aLoc == a.length()) + { + if (bLoc == b.length()) + return 0; + return -1; + } + if (bLoc == b.length()) + return 1; + int aInt = 0; + int aIntLen = 0; + char nextCharA; + for (;;) + { + nextCharA = a.charAt(aLoc++); + if (nextCharA < '0' || nextCharA > '9') + break; + aIntLen++; + aInt = aInt * 10 + nextCharA - '0'; + if (aLoc == a.length()) + break; + } + int bInt = 0; + int bIntLen = 0; + char nextCharB; + for (;;) + { + nextCharB = b.charAt(bLoc++); + if (nextCharB < '0' || nextCharB > '9') + break; + bIntLen++; + bInt = bInt * 10 + nextCharB - '0'; + if (bLoc == b.length()) + break; + } + if (aIntLen != 0) + { + if (bIntLen == 0) + return -1; + int comp = Integer.compare(aInt, bInt); + if (comp != 0) + return comp; + } else + { + if (bIntLen != 0) + return 1; + int comp = Character.compare(nextCharA, nextCharB); + if (comp != 0) + return comp; + } + } + } + + private static void setInterfacePinUsage(DeserializedSubmodelComponent comp, Pin interfacePin, PinUsage usage) + { + Set wiresConnectedToPin = comp.submodel.getWiresByName().values().stream() + .filter(w -> w.getPin1() == interfacePin || w.getPin2() == interfacePin).collect(Collectors.toSet()); + LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); + wiresConnectedToPin.forEach(submodelModifiable::destroyWire); + comp.removeSubmodelInterface(interfacePin.name); + comp.addSubmodelInterface(new MovablePin(submodelModifiable, comp, interfacePin.name, interfacePin.logicWidth, usage, + interfacePin.getRelX(), interfacePin.getRelY())); + wiresConnectedToPin.forEach(w -> new ModelWire(submodelModifiable, w.getPin1(), w.getPin2())); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/.classpath b/plugins/net.mograsim.logic.model.editor/.classpath new file mode 100644 index 00000000..c4b0fff7 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.logic.model.editor/.project b/plugins/net.mograsim.logic.model.editor/.project new file mode 100644 index 00000000..4f792a69 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.project @@ -0,0 +1,28 @@ + + + net.mograsim.logic.model.editor + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF b/plugins/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF new file mode 100644 index 00000000..283c286d --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Editor +Bundle-SymbolicName: net.mograsim.logic.model.editor +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.logic.model.editor, + net.mograsim.logic.model.editor.handles, + net.mograsim.logic.model.editor.states, + net.mograsim.logic.model.editor.ui, + net.mograsim.logic.model.editor.util +Require-Bundle: net.mograsim.logic.model;bundle-version="0.1.0", + net.mograsim.preferences;bundle-version="0.1.0", + net.mograsim.logic.model.am2900;bundle-version="0.1.0" +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Automatic-Module-Name: net.mograsim.logic.model.editor +Bundle-Vendor: Mograsim Team diff --git a/plugins/net.mograsim.logic.model.editor/build.properties b/plugins/net.mograsim.logic.model.editor/build.properties new file mode 100644 index 00000000..d1763276 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/build.properties @@ -0,0 +1,3 @@ +source.. = src/ +bin.includes = META-INF/,\ + .,\ \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java new file mode 100644 index 00000000..90baafb5 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java @@ -0,0 +1,253 @@ +package net.mograsim.logic.model.editor; + +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonParser; +import com.google.gson.JsonSyntaxException; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.editor.handles.ComponentHandle; +import net.mograsim.logic.model.editor.handles.Handle; +import net.mograsim.logic.model.editor.handles.HandleManager; +import net.mograsim.logic.model.editor.handles.PinHandle; +import net.mograsim.logic.model.editor.states.StateManager; +import net.mograsim.logic.model.editor.ui.DialogManager; +import net.mograsim.logic.model.editor.ui.EditorGUI; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer; + +public final class Editor +{ + final Selection selection = new Selection(); + final Set copyBuffer = new HashSet<>(); + public final DeserializedSubmodelComponent toBeEdited; + public final HandleManager handleManager; + public final EditorGUI gui; + public final StateManager stateManager; + private final SaveLoadManager saveManager; + private Snapping snapping = Snapping.ABSOLUTE; + private double snapX = 5, snapY = 5; + public final DialogManager dialogManager; + public final EditorUserInput userInput; + + public Editor(DeserializedSubmodelComponent toBeEdited) + { + this.toBeEdited = toBeEdited; + handleManager = new HandleManager(this); + gui = new EditorGUI(this); + userInput = new EditorUserInput(this); + stateManager = new StateManager(this); + handleManager.init(); + saveManager = new SaveLoadManager(this); + dialogManager = new DialogManager(gui.shell); + + gui.open(); + } + + public LogicModelModifiable getSubmodel() + { + return toBeEdited.getSubmodelModifiable(); + } + + public Selection getSelection() + { + return selection; + } + + // TODO: Remove this error prone method: Relative offset may change between multiple moves, + // because Handles have different ways of responding to reqMove(...), causing strange behaviour + @Deprecated + public void moveSelection(double x, double y) + { + Point ref = selection.getTopLeft(); + Point snapped = new Point(x, y); + applySnapping(snapped); + + for (Handle c : selection) + { + double newX, newY; + newX = snapped.x + c.getPosX() - ref.x; + newY = snapped.y + c.getPosY() - ref.y; + c.reqMove(newX, newY); + } + } + + public void moveHandles(double x, double y, Map handleOffsetMap) + { + Point snapped = new Point(x, y); + applySnapping(snapped); + + for (Handle c : handleOffsetMap.keySet()) + { + Point offset = handleOffsetMap.get(c); + double newX, newY; + newX = snapped.x + offset.x; + newY = snapped.y + offset.y; + c.reqMove(newX, newY); + } + } + + public void deleteSelection() + { + selection.forEach(h -> h.reqDelete()); + selection.clear(); + } + + public void copy() + { + copyBuffer.clear(); + Point refPoint = selection.getTopLeft(); + for (Handle h : selection) + { + Optional cInfo = h.reqCopy(refPoint); + if (cInfo.isPresent()) + copyBuffer.add(cInfo.get()); + } + } + + public void paste(double x, double y) + { + selection.clear(); + for (ComponentInfo info : copyBuffer) + { + ModelComponent comp = addComponent(info.identifier, info.params); + ComponentHandle h = handleManager.getHandle(comp); + h.reqMove(info.relX, info.relY); + selection.add(h); + } + moveSelection(x, y); + } + + public void save() + { + saveManager.save(); + } + + public void saveAs() + { + saveManager.openSaveAsDialog(); + } + + public void addComponent(double x, double y) + { + boolean successful = false; + JsonElement params = JsonNull.INSTANCE; + outer: while (!successful) + { + String selected = gui.getAddListSelected(); + try + { + ModelComponent c = addComponent(selected, params); + selection.clear(); + selection.add(handleManager.getHandle(c)); + moveSelection(x, y); + successful = true; + } + catch (@SuppressWarnings("unused") UnsupportedOperationException | JsonSyntaxException | NumberFormatException + | NullPointerException e) + { + String result = DialogManager.openMultiLineTextDialog("Add component", "Create", "Cancel", "Parameters:"); + if (result == null) + break outer; + params = new JsonParser().parse(result); + } + } + } + + private ModelComponent addComponent(String identifier, JsonElement params) + { + return IndirectModelComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier, params); + } + + public void duplicate() + { + copy(); + Point origin = selection.getTopLeft(); + paste(origin.x + 20, origin.y + 20); + } + + private void applySnapping(Point newP) + { + switch (snapping) + { + case OFF: + break; + case ABSOLUTE: + newP.x = (int) (newP.x / snapX + .5) * snapX; + newP.y = (int) (newP.y / snapY + .5) * snapY; + break; + default: + break; + } + } + + public static class ComponentInfo + { + public final double relX, relY; + public final String identifier; + public final JsonElement params; + + public ComponentInfo(double relX, double relY, String identifier, JsonElement params) + { + this.relX = relX; + this.relY = relY; + this.identifier = identifier; + this.params = params; + } + } + + @SuppressWarnings("unused") + public void addWire(PinHandle a, PinHandle b) + { + new ModelWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]); + } + + public static enum Snapping + { + OFF, ABSOLUTE; + + @Override + public String toString() + { + return super.toString().toLowerCase(); + } + } + + public static void main(String[] args) + { + Am2900Loader.setup(); + openNewEditor(); +// SaveLoadManager.openLoadDialog(); + } + + public static void openNewEditor() + { + DeserializedSubmodelComponent toBeEdited = new DeserializedSubmodelComponent(new LogicModelModifiable(), null, null, null); + toBeEdited.setOutlineRenderer(new DefaultOutlineRenderer(toBeEdited)); + toBeEdited.setSymbolRenderer(new DefaultSymbolRenderer(toBeEdited)); + toBeEdited.setHighLevelStateHandler(new DefaultHighLevelStateHandler()); + new Editor(toBeEdited); + } + + public Snapping getSnapping() + { + return snapping; + } + + public void setSnapping(Snapping snapping) + { + this.snapping = snapping; + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java new file mode 100644 index 00000000..feae04f3 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java @@ -0,0 +1,111 @@ +package net.mograsim.logic.model.editor; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.ui.EditorGUI; + +public class EditorUserInput +{ + private final EditorGUI gui; + + public EditorUserInput(Editor editor) + { + this.gui = editor.gui; + gui.logicCanvas.addMouseListener(new MouseListener() + { + @Override + public void mouseDoubleClick(MouseEvent e) + { + // TODO Auto-generated method stub + } + + @Override + public void mouseDown(MouseEvent e) + { + Point clicked = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y); + switch (e.button) + { + case 1: + editor.handleManager.click(clicked, e.stateMask); + break; + } + + } + + @Override + public void mouseUp(MouseEvent e) + { + } + }); + + gui.logicCanvas.addMouseMoveListener((e) -> + { + Point dest = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y); + editor.stateManager.mouseMoved(dest.x, dest.y); + }); + + gui.logicCanvas.addKeyListener(new KeyListener() + { + + @Override + public void keyReleased(KeyEvent e) + { + // TODO Auto-generated method stub + + } + + @Override + public void keyPressed(KeyEvent e) + { + switch (e.keyCode) + { + case 'c': + if ((e.stateMask & SWT.CTRL) == SWT.CTRL) + editor.stateManager.copy(); + break; + case 'v': + if ((e.stateMask & SWT.CTRL) == SWT.CTRL) + editor.stateManager.paste(); + break; + case 'd': + if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) + editor.stateManager.duplicate(); + break; + case 'g': + editor.stateManager.grab(); + break; + case 'r': + editor.stateManager.delete(); + break; + case 's': + if ((e.stateMask & SWT.CTRL) == SWT.CTRL) + editor.save(); + break; + case 'a': + if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) + editor.stateManager.add(); + break; + case 'h': + editor.stateManager.boxSelect(); + break; + } + + } + }); + } + + public Point getCanvasMousePosition() + { + return new Point(gui.logicCanvas.toControl(gui.display.getCursorLocation())); + } + + public Point getWorldMousePosition() + { + return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition()); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java new file mode 100644 index 00000000..bbe202b1 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java @@ -0,0 +1,75 @@ +package net.mograsim.logic.model.editor; + +import java.io.IOException; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Shell; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; + +public class SaveLoadManager +{ + private String savePath = null; + private Editor editor; + + public SaveLoadManager(Editor editor) + { + this.editor = editor; + } + + public void save() + { + if (savePath == null) + openSaveAsDialog(); + else + innerSave(); + } + + public void openSaveAsDialog() + { + Shell fdShell = new Shell(); + FileDialog fd = new FileDialog(fdShell, SWT.SAVE); + fd.setText("Save as..."); + fd.setFilterExtensions(new String[] { "*.json" }); + String result = fd.open(); + fdShell.dispose(); + if (result != null) + { + savePath = result; + innerSave(); + } + } + + private void innerSave() + { + try + { + SubmodelComponentSerializer.serialize(editor.toBeEdited, savePath); + } + catch (IOException e) + { + savePath = null; + System.err.println("Failed to save component!"); + e.printStackTrace(); + } + } + + public static void openLoadDialog() throws IOException + { + Shell fdShell = new Shell(); + FileDialog fd = new FileDialog(fdShell, SWT.OPEN); + fd.setText("Load component..."); + fd.setFilterExtensions(new String[] { "*.json" }); + String result = fd.open(); + fdShell.dispose(); + if (result != null) + { + new Editor((DeserializedSubmodelComponent) IndirectModelComponentCreator.createComponent(new LogicModelModifiable(), + "jsonfile:" + result)); + } + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java new file mode 100644 index 00000000..bc225eb7 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java @@ -0,0 +1,132 @@ +package net.mograsim.logic.model.editor; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.function.DoubleBinaryOperator; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.editor.handles.Handle; + +public class Selection implements Iterable +{ + private Set selection = new HashSet<>(); + + public Map calculateOffsets() + { + Map offsets = new HashMap<>(); + Point ref = getTopLeft(); + selection.forEach(h -> offsets.put(h, new Point(h.getPosX() - ref.x, h.getPosY() - ref.y))); + return offsets; + } + + public Rectangle getBounds() + { + Point pos1 = getTopLeft(); + Point pos2 = getBottomRight(); + return new Rectangle(pos1.x, pos1.y, pos2.x - pos1.x, pos2.y - pos1.y); + } + + public double getWidth() + {// TODO: Compute this more efficiently + return getTopRight().x - getTopLeft().x; + } + + public double getHeight() + { + return getBottomLeft().y - getTopLeft().y; + } + + public Point getTopLeft() + { + return getCorner(Double.MAX_VALUE, Double::min, r -> 0, Double.MAX_VALUE, Double::min, r -> 0); + } + + public Point getTopRight() + { + return getCorner(-Double.MAX_VALUE, Double::max, r -> r.width, Double.MAX_VALUE, Double::min, r -> 0); + } + + public Point getBottomLeft() + { + return getCorner(Double.MAX_VALUE, Double::min, r -> 0, -Double.MAX_VALUE, Double::max, r -> r.height); + } + + public Point getBottomRight() + { + return getCorner(-Double.MAX_VALUE, Double::max, r -> r.width, -Double.MAX_VALUE, Double::max, r -> r.height); + } + + public Point getCorner(double xIdentity, DoubleBinaryOperator xOp, Offset xOffset, double yIdentity, DoubleBinaryOperator yOp, + Offset yOffset) + { + double x = xIdentity, y = yIdentity; + for (Handle c : selection) + { + Rectangle bounds = c.getBounds(); + x = xOp.applyAsDouble(x, bounds.x + xOffset.computeOffset(bounds)); + y = yOp.applyAsDouble(y, bounds.y + yOffset.computeOffset(bounds)); + } + return new Point(x, y); + } + + private static interface Offset + { + public double computeOffset(Rectangle bounds); + } + + public void add(Handle h) + { + selection.add(h); + h.onSelect(); + } + + public void remove(Handle h) + { + selection.remove(h); + h.onDeselect(); + } + + public void clear() + { + selection.forEach(h -> h.onDeselect()); + selection.clear(); + } + + public int size() + { + return selection.size(); + } + + public boolean contains(Handle h) + { + return selection.contains(h); + } + + public void addAll(Collection handles) + { + handles.forEach(h -> h.onSelect()); + selection.addAll(handles); + } + + @Override + public Iterator iterator() + { + return selection.iterator(); + } + + @Override + public String toString() + { + return selection.toString(); + } + + public boolean isEmpty() + { + return selection.isEmpty(); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java new file mode 100644 index 00000000..14868e94 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java @@ -0,0 +1,107 @@ +package net.mograsim.logic.model.editor.handles; + +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.editor.Editor.ComponentInfo; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; + +public class ComponentHandle extends Handle +{ + private final LogicModelModifiable model; + public final ModelComponent parent; + private final static double POS_OFFSET = 2.0d; + private final static double LENGTH_OFFSET = POS_OFFSET * 2; + boolean selected = false; + + public ComponentHandle(LogicModelModifiable model, ModelComponent parent) + { + super(4); + this.model = model; + this.parent = parent; + Rectangle bounds = parent.getBounds(); + setSize(bounds.width, bounds.height); + parent.addComponentResizedListener((c) -> + { + Rectangle pBounds = c.getBounds(); + setSize(pBounds.width, pBounds.height); + }); + moveTo(parent.getPosX(), parent.getPosY()); + } + + @Override + protected void moveTo(double x, double y) + { + super.moveTo(x, y); + parent.moveTo(x, y); + } + + @Override + protected void render(GeneralGC gc) + { + if (selected) + { + gc.setLineWidth(2); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); + Rectangle bounds = getBounds(); + bounds.x -= POS_OFFSET; + bounds.y -= POS_OFFSET; + bounds.width += LENGTH_OFFSET; + bounds.height += LENGTH_OFFSET; + gc.drawRectangle(bounds); + Font oldFont = gc.getFont(); + gc.setFont(new Font(oldFont.getName(), 5, oldFont.getStyle())); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)); + gc.drawText(parent.getName(), bounds.x, bounds.y, true); + gc.setFont(oldFont); + } + } + + @Override + public void reqMove(double x, double y) + { + moveTo(x, y); + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + public void reqDelete() + { + model.destroyComponent(parent); + } + + @Override + public Optional reqCopy(Point refPoint) + { + IdentifyParams idParams = new IdentifyParams(); + return Optional.of(new ComponentInfo(parent.getPosX() - refPoint.x, parent.getPosY() - refPoint.y, + parent.getIDForSerializing(idParams), parent.getParamsForSerializingJSON(idParams))); + } + + @Override + public HandleType getType() + { + return HandleType.COMPONENT; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java new file mode 100644 index 00000000..959fb896 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java @@ -0,0 +1,71 @@ +package net.mograsim.logic.model.editor.handles; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; + +public class CornerHandle extends Handle +{ + private final static int LENGTH = 5; + private final DeserializedSubmodelComponent toBeEdited; + private boolean selected; + + public CornerHandle(DeserializedSubmodelComponent toBeEdited) + { + super(0); + this.toBeEdited = toBeEdited; + setSize(LENGTH, LENGTH); + initPos(); + } + + @Override + protected void render(GeneralGC gc) + { + gc.setBackground(Display.getCurrent().getSystemColor(selected ? SWT.COLOR_YELLOW : SWT.COLOR_DARK_GREEN)); + gc.fillRectangle(getPosX(), getPosY(), LENGTH, LENGTH); + } + + private void initPos() + { + Rectangle bounds = toBeEdited.getBounds(); + double subScale = toBeEdited.getSubmodelScale(); + moveTo(bounds.width / subScale, bounds.height / subScale); + } + + @Override + public void reqMove(double x, double y) + { + moveTo(x, y); + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + protected void moveTo(double x, double y) + { + super.moveTo(x, y); + double subScale = toBeEdited.getSubmodelScale(); + toBeEdited.setSize(x * subScale, y * subScale); + } + + @Override + public HandleType getType() + { + return HandleType.CORNER; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java new file mode 100644 index 00000000..cbfe2a2a --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java @@ -0,0 +1,150 @@ +package net.mograsim.logic.model.editor.handles; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.editor.Editor.ComponentInfo; +import net.mograsim.logic.model.editor.states.EditorState; + +public abstract class Handle +{ + private final Rectangle bounds; + private final Collection redrawListeners, destroyListeners; + private final int priority; + + public Handle(int priority) + { + this.priority = priority; + redrawListeners = new ArrayList<>(); + destroyListeners = new ArrayList<>(); + bounds = new Rectangle(0, 0, 0, 0); + callRedrawListeners(); + } + + final public void render(GeneralGC gc, Rectangle visibleRegion) + { + if (bounds.intersects(visibleRegion)) + render(gc); + } + + protected abstract void render(GeneralGC gc); + + protected void setSize(double width, double height) + { + bounds.width = width; + bounds.height = height; + callRedrawListeners(); + } + + protected void moveTo(double x, double y) + { + bounds.x = x; + bounds.y = y; + callRedrawListeners(); + } + + public Rectangle getBounds() + { + return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); + } + + public void addRedrawListener(Runnable listener) + { + redrawListeners.add(listener); + } + + public void removeRedrawListener(Runnable listener) + { + redrawListeners.remove(listener); + } + + protected void callRedrawListeners() + { + redrawListeners.forEach(l -> l.run()); + } + + public double getPosX() + { + return bounds.x; + } + + public double getPosY() + { + return bounds.y; + } + + void destroy() + { + destroyListeners.forEach(l -> l.run()); + } + + public void addDestroyListener(Runnable listener) + { + redrawListeners.add(listener); + } + + public void removeDestroyListener(Runnable listener) + { + redrawListeners.remove(listener); + } + + public boolean contains(double x, double y) + { + return bounds.contains(x, y); + } + + public boolean contains(Point p) + { + return contains(p.x, p.y); + } + + /** + * Register a mouse click + * + * @param x Coordinate of the click in the world, not the display context + * @param y Coordinate of the click in the world, not the display context + * @return true if the click was consumed, false otherwise + */ + public boolean click(double x, double y, int stateMask, EditorState state) + { + if (contains(x, y)) + return state.clickedHandle(new HandleClickInfo(this, stateMask)); + return false; + } + + //@formatter:off + public void reqMove(double x, double y) {} + public void reqDelete() {} + public Optional reqCopy(Point refPoint) { return Optional.empty(); } + public void onSelect() {} + public void onDeselect() {} + //@formatter:on + + public final int getPriority() + { + return priority; + } + + public abstract HandleType getType(); + + public static enum HandleType + { + COMPONENT, STATIC_PIN, INTERFACE_PIN, WIRE_POINT, WIRE, CORNER; + } + + public static class HandleClickInfo + { + public final int stateMask; + public final Handle clicked; + + HandleClickInfo(Handle clicked, int stateMask) + { + this.clicked = clicked; + this.stateMask = stateMask; + } + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java new file mode 100644 index 00000000..0a33509c --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java @@ -0,0 +1,390 @@ +package net.mograsim.logic.model.editor.handles; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.states.EditorState; +import net.mograsim.logic.model.editor.util.PrioritySet; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; + +public class HandleManager +{ + private final Map handlePerPin; + private final Map handlePerInterfacePin; + private final Map> pointHandlesPerWire; + private final Map handlePerWire; + private final Set handles; + private final Set wirePointHandles; + private final Map handlePerComp; + + private final Collection> handleAddedListeners; + private final Collection> handleRemovedListeners; + private final Editor editor; + private boolean initialized = false; + + public HandleManager(Editor editor) + { + this.editor = editor; + handlePerPin = new HashMap<>(); + handlePerInterfacePin = new HashMap<>(); + pointHandlesPerWire = new HashMap<>(); + handlePerComp = new HashMap<>(); + handles = new PrioritySet<>((a, b) -> Integer.compare(a.getPriority(), b.getPriority())); + wirePointHandles = new HashSet<>(); + handlePerWire = new HashMap<>(); + + handleAddedListeners = new ArrayList<>(); + handleRemovedListeners = new ArrayList<>(); + + LogicModelModifiable model = editor.getSubmodel(); + + model.addComponentAddedListener(c -> registerComponent(c)); + + model.addComponentRemovedListener(c -> + { + removeComponentHandle(c); + }); + + model.addWireAddedListener(w -> + { + registerWire(w); + }); + + model.addWireRemovedListener(w -> + { + removeWireHandle(w); + removeWirePointHandles(w); + }); + } + + //////////////////////////////////////// + // -- Setting up initial handles -- /// + ////////////////////////////////////// + + public void init() + { + if (initialized) + System.err.println("Warning! HandleManager was already initialized."); + else + { + LogicModelModifiable model = editor.getSubmodel(); + Map compsByName = model.getComponentsByName(); + Set comps = new HashSet<>(compsByName.values()); + ModelComponent interfaceComp = compsByName.get(SubmodelComponent.SUBMODEL_INTERFACE_NAME); + comps.remove(interfaceComp); + registerInterfaceComponent(interfaceComp); + comps.forEach(c -> registerComponent(c)); + + model.getWiresByName().values().forEach(w -> registerWire(w)); + addHandle(new CornerHandle(editor.toBeEdited)); + } + } + + private void registerInterfaceComponent(ModelComponent c) + { + c.getPins().values().forEach(p -> addInterfacePinHandle(p)); + c.addPinAddedListener(p -> addInterfacePinHandle(p)); + c.addPinRemovedListener(p -> removeInterfacePinHandle(p)); + } + + private void registerComponent(ModelComponent c) + { + addComponentHandle(c); + + c.getPins().values().forEach(p -> addPinHandle(p)); + + c.addPinAddedListener(p -> addPinHandle(p)); + c.addPinRemovedListener(p -> removePinHandle(p)); + } + + private void registerWire(ModelWire wire) + { + Point[] path = wire.getPath(); + AtomicInteger oldLength = new AtomicInteger(path == null ? 0 : path.length); + wire.addPathChangedListener(w -> + { + Point[] newPath = w.getPath(); + int newLength = newPath == null ? 0 : newPath.length; + int diff = newLength - oldLength.getAndSet(newLength); + if (diff != 0) + { + if (diff > 0) + { + for (int i = 0; i < diff; i++) + addWirePointHandle(w); + } + + List wpHandles = pointHandlesPerWire.get(w); + int size = wpHandles.size(); + for (int i = 0; i < size; i++) + { + wpHandles.get(i).setIndex(i); + } + } + pointHandlesPerWire.get(w).forEach(h -> h.updatePos()); + }); + addWireHandle(wire); + if (path == null) + return; + for (int i = 0; i < path.length; i++) + { + addWirePointHandle(wire); + } + } + + ///////////////////////////////////// + // -- Adding/Removing handles -- /// + /////////////////////////////////// + + private void addComponentHandle(ModelComponent c) + { + ComponentHandle h = new ComponentHandle(editor.getSubmodel(), c); + handlePerComp.put(c, h); + addHandle(h); + } + + private void removeComponentHandle(ModelComponent c) + { + ComponentHandle h = handlePerComp.get(c); + handlePerComp.remove(c); + removeHandle(h); + } + + private void addPinHandle(Pin owner) + { + StaticPinHandle h = new StaticPinHandle(owner); + handlePerPin.put(owner, h); + addHandle(h); + } + + private void removePinHandle(Pin owner) + { + StaticPinHandle h = handlePerPin.get(owner); + handlePerPin.remove(owner); + removeHandle(h); + } + + private void addInterfacePinHandle(Pin p) + { + // The following is not an alternative to the cast, because the new pin is not yet in the map, when the listener is called + // editor.toBeEdited.getSubmodelMovablePins().get(p.name); + MovablePin pM = (MovablePin) p; + InterfacePinHandle h = new InterfacePinHandle(pM, editor.toBeEdited); + handlePerInterfacePin.put(pM, h); + addHandle(h); + } + + private void removeInterfacePinHandle(Pin p) + { + InterfacePinHandle h = handlePerInterfacePin.get(p); + handlePerInterfacePin.remove(p); + removeHandle(h); + } + + private void addWirePointHandle(ModelWire w) + { + List wireHandles = pointHandlesPerWire.get(w); + WirePointHandle h; + if (wireHandles != null) + wireHandles.add(h = new WirePointHandle(this, w, wireHandles.size())); + else + { + wireHandles = new ArrayList<>(); + h = new WirePointHandle(this, w, 0); + wireHandles.add(h); + pointHandlesPerWire.put(h.parent, wireHandles); + } + this.wirePointHandles.add(h); + addHandle(h); + } + + void destroyWirePointHandle(ModelWire owner, WirePointHandle h) + { + if (pointHandlesPerWire.containsKey(owner)) + { + List handles = pointHandlesPerWire.get(owner); + int pointIndex = handles.indexOf(h); + handles.remove(pointIndex); + removeHandle(h); + owner.removePathPoint(pointIndex); + } + } + + private void removeWirePointHandles(ModelWire owner) + { + if (!pointHandlesPerWire.containsKey(owner)) + return; + pointHandlesPerWire.get(owner).forEach(h -> + { + wirePointHandles.remove(h); + removeHandle(h); + }); + pointHandlesPerWire.remove(owner); + } + + private void addWireHandle(ModelWire w) + { + WireHandle h = new WireHandle(editor.getSubmodel(), w); + handlePerWire.put(w, h); + addHandle(h); + } + + private void removeWireHandle(ModelWire w) + { + WireHandle h = handlePerWire.get(w); + handlePerWire.remove(w); + removeHandle(h); + } + + private void addHandle(Handle h) + { + handles.add(h); + callHandleAddedListeners(h); + } + + private void removeHandle(Handle h) + { + handles.remove(h); + callHandleRemovedListeners(h); + h.destroy(); + } + + public StaticPinHandle getHandle(Pin parent) + { + return handlePerPin.get(parent); + } + + public ComponentHandle getHandle(ModelComponent parent) + { + return handlePerComp.get(parent); + } + + public WireHandle getHandle(ModelWire parent) + { + return handlePerWire.get(parent); + } + + public Handle getInterfacePinHandle(Pin p) + { + return handlePerInterfacePin.get(p); + } + + /** + * @return A Collection of the registered {@link WirePointHandle}s of the specified wire + */ + public Collection getWirePointHandles(ModelWire parent) + { + return pointHandlesPerWire.get(parent).stream().collect(Collectors.toSet()); + } + + /** + * @return An unmodifiable view of all registered {@link Handle}s + */ + public Collection getHandles() + { + return Collections.unmodifiableCollection(handles); + } + + /** + * @return An unmodifiable view of all registered {@link StaticPinHandle}s + */ + public Collection getPinHandles() + { + return Collections.unmodifiableCollection(handlePerPin.values()); + } + + /** + * @return An unmodifiable view of all registered {@link InterfacePinHandle}s + */ + public Collection getInterfacePinHandles() + { + return Collections.unmodifiableCollection(handlePerInterfacePin.values()); + } + + /** + * @return An unmodifiable view of all registered {@link ComponentHandle}s + */ + public Collection getComponentHandles() + { + return Collections.unmodifiableCollection(handlePerComp.values()); + } + + /** + * @return An unmodifiable view of all registered {@link WireHandle}s + */ + public Collection getWireHandles() + { + return Collections.unmodifiableCollection(handlePerWire.values()); + } + + /** + * @return An unmodifiable view of all registered {@link WirePointHandle}s + */ + public Collection getWirePointHandles() + { + return Collections.unmodifiableSet(wirePointHandles); + } + + public void click(Point clicked, int stateMask) + { + EditorState entryState = editor.stateManager.getState(); + // TODO: As soon as wires connected to a component being removed also are removed, change priority) + if (!click(handles, clicked, entryState, stateMask)) + entryState.clickedEmpty(clicked, stateMask); + entryState.clicked(clicked, stateMask); + } + + private static boolean click(Collection handles, Point clicked, EditorState state, int stateMask) + { + for (Handle h : handles) + if (h.click(clicked.x, clicked.y, stateMask, state)) + return true; + return false; + } + + public void addHandleAddedListener(Consumer c) + { + handleAddedListeners.add(c); + } + + private void callHandleAddedListeners(Handle added) + { + handleAddedListeners.forEach(l -> l.accept(added)); + } + + public void removeHandleAddedListener(Consumer c) + { + handleAddedListeners.remove(c); + } + + public void addHandleRemovedListener(Consumer c) + { + handleRemovedListeners.add(c); + } + + private void callHandleRemovedListeners(Handle removed) + { + handleRemovedListeners.forEach(l -> l.accept(removed)); + } + + public void removeHandleRemovedListener(Consumer c) + { + handleRemovedListeners.remove(c); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java new file mode 100644 index 00000000..189d3d17 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java @@ -0,0 +1,108 @@ +package net.mograsim.logic.model.editor.handles; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; + +public class InterfacePinHandle extends PinHandle +{ + private final static int CIRCLE_DIAM = 4, CIRCLE_RADIUS = CIRCLE_DIAM / 2, SELECTED_CIRCLE_OFFSET = 1, + SELECTED_CIRCLE_DIAM = SELECTED_CIRCLE_OFFSET * 2 + CIRCLE_DIAM; + private final MovablePin parent; + private final DeserializedSubmodelComponent owner; + private boolean selected = false; + + public InterfacePinHandle(MovablePin parent, DeserializedSubmodelComponent pinOwner) + { + super(2); + this.parent = parent; + this.owner = pinOwner; + setSize(CIRCLE_DIAM, CIRCLE_DIAM); + initPos(); + } + + private void initPos() + { + Point pos = parent.getPos(); + moveTo(pos.x, pos.y); + } + + @Override + protected void render(GeneralGC gc) + { + double x = getPosX(), y = getPosY(); + + gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); + gc.drawText(parent.name, x + CIRCLE_DIAM, y + CIRCLE_DIAM, true); + if (selected) + { + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); + gc.drawOval(x - SELECTED_CIRCLE_OFFSET, y - SELECTED_CIRCLE_OFFSET, SELECTED_CIRCLE_DIAM, SELECTED_CIRCLE_DIAM); + } + gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); + gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); + } + + @Override + public void reqMove(double x, double y) + { + moveTo(x, y); + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + public void reqDelete() + { + owner.removeSubmodelInterface(parent.name); + } + + @Override + protected void moveTo(double x, double y) + { + super.moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS); + parent.setRelPos(getCenterX(), getCenterY()); + } + + @Override + public double getCenterX() + { + return getPosX() + CIRCLE_RADIUS; + } + + @Override + public double getCenterY() + { + return getPosY() + CIRCLE_RADIUS; + } + + @Override + public HandleType getType() + { + return HandleType.INTERFACE_PIN; + } + + @Override + public Pin getPin() + { + return parent; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java new file mode 100644 index 00000000..2e4a9dc6 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java @@ -0,0 +1,17 @@ +package net.mograsim.logic.model.editor.handles; + +import net.mograsim.logic.model.model.wires.Pin; + +public abstract class PinHandle extends Handle +{ + public PinHandle(int priority) + { + super(priority); + } + + public abstract Pin getPin(); + + public abstract double getCenterX(); + + public abstract double getCenterY(); +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java new file mode 100644 index 00000000..0f4a1524 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java @@ -0,0 +1,61 @@ +package net.mograsim.logic.model.editor.handles; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.wires.Pin; + +public class StaticPinHandle extends PinHandle +{ + private final static int CIRCLE_DIAM = 2; + private final static int CIRCLE_RADIUS = 1; + private final Pin parent; + + public StaticPinHandle(Pin parent) + { + super(1); + this.parent = parent; + setSize(CIRCLE_DIAM, CIRCLE_DIAM); + parent.addPinMovedListener((p) -> updatePos()); + updatePos(); + } + + @Override + protected void render(GeneralGC gc) + { + gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN)); + gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); + } + + private void updatePos() + { + Point pos = parent.getPos(); + moveTo(pos.x - CIRCLE_RADIUS, pos.y - CIRCLE_RADIUS); + } + + @Override + public double getCenterX() + { + return getPosX() + CIRCLE_RADIUS; + } + + @Override + public double getCenterY() + { + return getPosY() + CIRCLE_RADIUS; + } + + @Override + public HandleType getType() + { + return HandleType.STATIC_PIN; + } + + @Override + public Pin getPin() + { + return parent; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java new file mode 100644 index 00000000..839c2b5b --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java @@ -0,0 +1,161 @@ +package net.mograsim.logic.model.editor.handles; + +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.editor.states.EditorState; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.ModelWire; + +public class WireHandle extends Handle +{ + private boolean selected = false; + private final static double WIDTH = 2.0; + private final static double WIDTH_SQUARED = WIDTH * WIDTH; + private final LogicModelModifiable model; + public final ModelWire parent; + + public WireHandle(LogicModelModifiable model, ModelWire parent) + { + super(5); + this.model = model; + this.parent = parent; + parent.addPathChangedListener(c -> updateBounds()); + updateBounds(); + } + + @Override + void destroy() + { + super.destroy(); + parent.removePathChangedListener(c -> updateBounds()); + } + + public void updateBounds() + { + Rectangle r = parent.getBounds(); + moveTo(r.x, r.y); + setSize(r.width, r.height); + } + + @Override + public void render(GeneralGC gc) + { + if (selected) + { + gc.setLineWidth(WIDTH); + gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW)); + gc.drawPolyline(parent.getEffectivePath()); + } + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + public void reqDelete() + { + // this wire could already be removed implicitly when removing a selection containing both wires and components + if (model.getWireByName(parent.name) != null) + model.destroyWire(parent); + } + + @Override + public boolean contains(double x, double y) + { + return click(parent, x, y).isPresent(); + } + + @Override + public boolean click(double x, double y, int stateMask, EditorState state) + { + Optional op = click(parent, x, y); + if (op.isEmpty()) + return false; + WireClickData data = op.get(); + return state.clickedHandle(new WireHandleClickInfo(this, data.segment, data.pos, stateMask)); + } + + public static class WireHandleClickInfo extends HandleClickInfo + { + public final int segment; + public final Point posOnWire; + + WireHandleClickInfo(WireHandle clicked, int segment, Point posOnWire, int stateMask) + { + super(clicked, stateMask); + this.segment = segment; + this.posOnWire = posOnWire; + } + + } + + private static Optional click(ModelWire w, double x, double y) + { + Rectangle modifiedBounds = w.getBounds(); + modifiedBounds.x -= WIDTH; + modifiedBounds.y -= WIDTH; + modifiedBounds.width += WIDTH * 2; + modifiedBounds.height += WIDTH * 2; + if (modifiedBounds.contains(x, y)) + { + double[] effectivePath = w.getEffectivePath(); + for (int i = 3; i < effectivePath.length; i += 2) + { + double a1 = effectivePath[i - 3], a2 = effectivePath[i - 2], b1 = effectivePath[i - 1], b2 = effectivePath[i], r1 = b2 - a2, + r2 = a1 - b1; + + double f = ((x - a1) * r2 + (a2 - y) * r1) / (-r2 * r2 - r1 * r1); + if (f >= 0 && f <= 1) + { + double e1 = a1 + f * (b1 - a1), e2 = a2 + f * (b2 - a2); + r1 = e1 - x; + r2 = e2 - y; + if (r1 * r1 + r2 * r2 <= WIDTH_SQUARED) + return Optional.of(new WireClickData(new Point(e1, e2), (i / 2) - 1)); + } + } + } + return Optional.empty(); + } + + private final static class WireClickData + { + WireClickData(Point pos, int segment) + { + this.pos = pos; + this.segment = segment; + } + + /** + * Position on the wire that is closest to the click + */ + public final Point pos; + /** + * Segment of the wire that the {@link Point} pos is on + */ + public final int segment; + } + + @Override + public HandleType getType() + { + return HandleType.WIRE; + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java new file mode 100644 index 00000000..2947535f --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java @@ -0,0 +1,89 @@ +package net.mograsim.logic.model.editor.handles; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.model.model.wires.ModelWire; + +public class WirePointHandle extends Handle +{ + private final static int END_OFFSET = 4; + private final HandleManager manager; + private boolean selected = false; + public final ModelWire parent; + + private int pointIndex; + + public WirePointHandle(HandleManager manager, ModelWire parent, int pointIndex) + { + super(3); + this.manager = manager; + this.parent = parent; + this.pointIndex = pointIndex; + setSize(END_OFFSET, END_OFFSET); + Point pathPoint = parent.getPathPoint(pointIndex); + moveTo(pathPoint.x, pathPoint.y); + } + + void updatePos() + { + Point p = parent.getPathPoint(pointIndex); + moveTo(p.x, p.y); + callRedrawListeners(); + } + + @Override + public void render(GeneralGC gc) + { + gc.setLineWidth(1.0); + gc.setForeground(Display.getDefault().getSystemColor(selected ? SWT.COLOR_YELLOW : SWT.COLOR_BLUE)); + gc.drawLine(getPosX(), getPosY(), getPosX() + END_OFFSET, getPosY() + END_OFFSET); + } + + @Override + public void reqMove(double x, double y) + { + parent.setPathPoint(new Point(x, y), pointIndex); + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + public void reqDelete() + { + manager.destroyWirePointHandle(parent, this); + } + + @Override + public HandleType getType() + { + return HandleType.WIRE_POINT; + } + + /** + * Sets the index of the {@link Point} within the parent {@link CoreWire}s path that is controlled by this handle + * + * @param index Index of the Point in the Wires path. + * @throws IndexOutOfBoundsException + */ + public void setIndex(int index) + { + this.pointIndex = index; + updatePos(); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java new file mode 100644 index 00000000..ef109cdb --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java @@ -0,0 +1,89 @@ +package net.mograsim.logic.model.editor.states; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.Selection; +import net.mograsim.logic.model.editor.handles.Handle; + +public class BoxSelectionState extends EditorState +{ + private Point origin; + private double mX, mY; + + private final ZoomedRenderer boxRenderer = gc -> + { + if (origin != null) + { + gc.setLineWidth(0.5); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); + gc.drawRectangle(origin.x, origin.y, mX - origin.x, mY - origin.y); + } + }; + + public BoxSelectionState(Editor editor, StateManager manager) + { + super(editor, manager); + } + + @Override + public void onEntry() + { + editor.gui.logicCanvas.addZoomedRenderer(boxRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void onExit() + { + editor.gui.logicCanvas.removeZoomedRenderer(boxRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void boxSelect() + { + manager.setState(new SelectionState(editor, manager)); + } + + @Override + public void clicked(Point clicked, int stateMask) + { + if (origin == null) + { + origin = new Point(clicked.x, clicked.y); + mX = clicked.x; + mY = clicked.y; + } else + { + Selection s = editor.getSelection(); + s.clear(); + boolean leftToRight = mX > origin.x, topToBottom = mY > origin.y; + double x = leftToRight ? origin.x : mX, y = topToBottom ? origin.y : mY, width = leftToRight ? mX - origin.x : origin.x - mX, + height = topToBottom ? mY - origin.y : origin.y - mY; + + Rectangle selected = new Rectangle(x, y, width, height); + for (Handle h : editor.handleManager.getHandles()) + { + Rectangle hBounds = h.getBounds(); + if (selected.contains(hBounds.x, hBounds.y) && selected.contains(hBounds.x + hBounds.width, hBounds.y + hBounds.height)) + { + s.add(h); + } + } + manager.setState(new SelectionState(editor, manager)); + } + } + + @Override + public void mouseMoved(double x, double y) + { + mX = x; + mY = y; + editor.gui.logicCanvas.redrawThreadsafe(); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java new file mode 100644 index 00000000..1c06c52e --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java @@ -0,0 +1,85 @@ +package net.mograsim.logic.model.editor.states; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.PinHandle; +import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; + +public class CreateWireState extends EditorState +{ + private final PinHandle origin; + private double mX, mY; + private ZoomedRenderer drawLine; + + public CreateWireState(Editor session, StateManager manager, PinHandle origin) + { + super(session, manager); + this.origin = origin; + mX = origin.getCenterX(); + mY = origin.getCenterY(); + } + + @Override + public void mouseMoved(double x, double y) + { + this.mX = x; + this.mY = y; + editor.gui.logicCanvas.redraw(); + } + + @Override + public void onEntry() + { + editor.getSelection().clear(); + drawLine = gc -> + { + gc.setLineWidth(1); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)); + gc.drawLine((int) origin.getCenterX(), (int) origin.getCenterY(), (int) mX, (int) mY); + }; + editor.gui.logicCanvas.addZoomedRenderer(drawLine); + editor.gui.logicCanvas.redraw(); + } + + @Override + public void onExit() + { + editor.gui.logicCanvas.removeZoomedRenderer(drawLine); + editor.gui.logicCanvas.redraw(); + } + + @Override + public boolean clickedHandle(HandleClickInfo handleClickInfo) + { + switch (handleClickInfo.clicked.getType()) + { + case INTERFACE_PIN: + case STATIC_PIN: + try + { + editor.addWire(origin, (PinHandle) handleClickInfo.clicked); + } + catch (IllegalArgumentException e) + { + Shell tmp = new Shell(Display.getCurrent()); + editor.dialogManager.openWarningDialog("Warning!", e.getMessage()); + tmp.dispose(); + } + break; + default: + return false; + } + return true; + } + + @Override + public void clicked(Point clicked, int stateMask) + { + manager.setState(new SelectionState(editor, manager)); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java new file mode 100644 index 00000000..05e05d85 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java @@ -0,0 +1,36 @@ +package net.mograsim.logic.model.editor.states; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.InterfacePinHandle; +import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; + +public abstract class EditorState +{ + protected final Editor editor; + protected final StateManager manager; + + public EditorState(Editor session, StateManager manager) + { + this.editor = session; + this.manager = manager; + } + + //@formatter:off + public void add() {} + public void delete() {} + public void copy() {} + public void paste() {} + public void duplicate() {} + public void grab() {} + public void mouseMoved(double x, double y) {} + public void select(Point pos, boolean additive) {} + public void boxSelect() {} + public void onEntry() {} + public void onExit() {} + public void clicked(InterfacePinHandle interfacePinHandle, int stateMask) {} + public void clickedEmpty(Point clicked, int stateMask) {} + public void clicked(Point clicked, int stateMask) {} + public boolean clickedHandle(HandleClickInfo handleClickInfo) { return false; } + //@formatter:on +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java new file mode 100644 index 00000000..1b8447e0 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java @@ -0,0 +1,41 @@ +package net.mograsim.logic.model.editor.states; + +import java.util.Map; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.Handle; + +public class GrabState extends EditorState +{ + private Map offsets; + + public GrabState(Editor editor, StateManager manager) + { + super(editor, manager); + } + + @Override + public void onEntry() + { + offsets = editor.getSelection().calculateOffsets(); + } + + @Override + public void grab() + { + manager.setState(new SelectionState(editor, manager)); + } + + @Override + public void mouseMoved(double x, double y) + { + editor.moveHandles(x, y, offsets); + } + + @Override + public void clicked(Point clicked, int stateMask) + { + manager.setState(new SelectionState(editor, manager)); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java new file mode 100644 index 00000000..baa2eff9 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java @@ -0,0 +1,186 @@ +package net.mograsim.logic.model.editor.states; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.Selection; +import net.mograsim.logic.model.editor.handles.Handle; +import net.mograsim.logic.model.editor.handles.PinHandle; +import net.mograsim.logic.model.editor.handles.WireHandle; +import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; +import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo; +import net.mograsim.logic.model.editor.ui.DialogManager; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; + +public class SelectionState extends EditorState +{ + private final ZoomedRenderer outlineRenderer = gc -> + { + if (editor.getSelection().size() > 1) + { + gc.setLineWidth(1); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); + gc.drawRectangle(editor.getSelection().getBounds()); + } + }; + + public SelectionState(Editor editor, StateManager manager) + { + super(editor, manager); + } + + @Override + public void add() + { + Point curserPos = editor.userInput.getWorldMousePosition(); + editor.addComponent(curserPos.x, curserPos.y); + } + + @Override + public void delete() + { + editor.deleteSelection(); + } + + @Override + public void copy() + { + editor.copy(); + } + + @Override + public void paste() + { + Point curserPos = editor.userInput.getWorldMousePosition(); + editor.paste(curserPos.x, curserPos.y); + } + + @Override + public void duplicate() + { + editor.duplicate(); + } + + @Override + public void grab() + { + if (!editor.getSelection().isEmpty()) + manager.setState(new GrabState(editor, manager)); + } + + @Override + public void boxSelect() + { + manager.setState(new BoxSelectionState(editor, manager)); + } + + @Override + public void onEntry() + { + editor.gui.logicCanvas.addZoomedRenderer(outlineRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void onExit() + { + editor.gui.logicCanvas.removeZoomedRenderer(outlineRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void clickedEmpty(Point clicked, int stateMask) + { + editor.getSelection().clear(); + if ((stateMask & SWT.ALT) == SWT.ALT) + { + String[] result = DialogManager.openMultiTextDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width", "Usage"); + if (result != null) + { + try + { + Pin p = editor.toBeEdited.addSubmodelInterface(new MovablePin(editor.getSubmodel(), editor.toBeEdited, result[0], + Integer.parseInt(result[1]), PinUsage.valueOf(result[2]), clicked.x, clicked.y)); + editor.handleManager.getInterfacePinHandle(p).reqMove(clicked.x, clicked.y); + } + catch (NumberFormatException e) + { + editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!"); + } + catch (IllegalArgumentException e) + { + editor.dialogManager.openWarningDialog("Failed to create Pin!", "Usage must be one of INPUT, OUTPUT, TRISTATE!"); + } + } + } + } + + @Override + public boolean clickedHandle(HandleClickInfo handleClickInfo) + { + switch (handleClickInfo.clicked.getType()) + { + case INTERFACE_PIN: + if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) + { + manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked)); + break; + } + case CORNER: + case COMPONENT: + case WIRE_POINT: + boolean additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT; + select(handleClickInfo.clicked, additive); + break; + case STATIC_PIN: + if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) + manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked)); + else + return false; + break; + case WIRE: + if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) + { + WireHandleClickInfo info = (WireHandleClickInfo) handleClickInfo; + WireHandle clicked = (WireHandle) info.clicked; + clicked.parent.insertPathPoint(info.posOnWire, info.segment); + } else + { + additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT; + select(handleClickInfo.clicked, additive); + } + break; + default: + return false; + } + return true; + } + + private void select(Handle h, boolean additive) + { + Selection sel = editor.getSelection(); + if (sel.contains(h)) + if (additive) + sel.remove(h); + else + { + if (editor.getSelection().size() > 1) + { + sel.clear(); + sel.add(h); + } else + sel.clear(); + } + else + { + if (!additive) + sel.clear(); + sel.add(h); + } + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java new file mode 100644 index 00000000..d4b3fc4d --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java @@ -0,0 +1,78 @@ +package net.mograsim.logic.model.editor.states; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; + +public class StateManager +{ + private EditorState state; + + public StateManager(Editor session) + { + state = new SelectionState(session, this); + state.onEntry(); + } + + public EditorState getState() + { + return state; + } + + public void setState(EditorState state) + { + this.state.onExit(); + this.state = state; + state.onEntry(); + } + + public void add() + { + state.add(); + } + + public void delete() + { + state.delete(); + } + + public void copy() + { + state.copy(); + } + + public void paste() + { + state.paste(); + } + + public void duplicate() + { + state.duplicate(); + } + + public void grab() + { + state.grab(); + } + + public void mouseMoved(double x, double y) + { + state.mouseMoved(x, y); + } + + public void select(Point pos, boolean additive) + { + state.select(pos, additive); + } + + public boolean clickedHandle(HandleClickInfo handleClickInfo) + { + return state.clickedHandle(handleClickInfo); + } + + public void boxSelect() + { + state.boxSelect(); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java new file mode 100644 index 00000000..df7455e6 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java @@ -0,0 +1,199 @@ +package net.mograsim.logic.model.editor.ui; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Dialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class DialogManager +{ + private Shell parent; + + public DialogManager(Shell parent) + { + this.parent = parent; + } + + public void openWarningDialog(String title, String message) + { + MessageBox b = new MessageBox(parent, SWT.ICON_WARNING | SWT.OK); + b.setText(title); + b.setMessage(message); + b.open(); + } + + private static abstract class FlexibleInputsDialog extends Dialog + { + private final String title, acceptLabel, cancelLabel; + + protected String[] result; + + public FlexibleInputsDialog(String title, String acceptLabel, String cancelLabel, String... inputs) + { + this(false, title, acceptLabel, cancelLabel, inputs); + } + + public FlexibleInputsDialog(boolean resizable, String title, String acceptLabel, String cancelLabel, String... inputs) + { + super(new Shell(SWT.CLOSE | (resizable ? SWT.RESIZE | SWT.MAX : 0) | SWT.TITLE | SWT.MIN | SWT.ON_TOP | SWT.APPLICATION_MODAL)); + this.title = title; + this.acceptLabel = acceptLabel; + this.cancelLabel = cancelLabel; + } + + protected abstract void setupWidgets(Composite parent); + + protected abstract void buildResult(); + + /** + * @return May be null (if {@link Dialog} was cancelled) + */ + public String[] open() + { + Shell shell = getParent(); + Display display = shell.getDisplay(); + shell.setMinimumSize(500, 150); + shell.setText(title); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + shell.setLayout(layout); + + Composite inputContainer = new Composite(shell, SWT.BORDER); + GridData gd = new GridData(); + gd.horizontalSpan = 2; + gd.horizontalAlignment = SWT.FILL; + gd.grabExcessHorizontalSpace = true; + gd.verticalAlignment = SWT.FILL; + gd.grabExcessVerticalSpace = true; + inputContainer.setLayoutData(gd); + setupWidgets(inputContainer); + + Button b1 = new Button(shell, SWT.PUSH); + b1.addListener(SWT.Selection, e -> + { + buildResult(); + shell.dispose(); + }); + + b1.setText(acceptLabel); + Button b2 = new Button(shell, SWT.PUSH); + b2.addListener(SWT.Selection, e -> + { + shell.dispose(); + }); + b2.setText(cancelLabel); + + shell.pack(); + + shell.open(); + while (!shell.isDisposed()) + if (!display.readAndDispatch()) + display.sleep(); + return result; + } + } + + private static class MultiTextFieldsDialog extends FlexibleInputsDialog + { + private final String[] inputs; + private Text[] textFields; + + public MultiTextFieldsDialog(String title, String acceptLabel, String cancelLabel, String... inputs) + { + super(title, acceptLabel, cancelLabel); + this.inputs = inputs; + } + + @Override + protected void setupWidgets(Composite parent) + { + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + parent.setLayout(layout); + this.textFields = new Text[inputs.length]; + for (int i = 0; i < inputs.length; i++) + { + Label textFieldName = new Label(parent, SWT.NONE); + textFieldName.setText(inputs[i].concat(":")); + GridData g = new GridData(); + g.grabExcessHorizontalSpace = true; + g.horizontalAlignment = SWT.FILL; + Text newTextField = new Text(parent, SWT.BORDER); + newTextField.setLayoutData(g); + textFields[i] = newTextField; + } + } + + @Override + protected void buildResult() + { + result = new String[textFields.length]; + for (int i = 0; i < textFields.length; i++) + result[i] = textFields[i].getText(); + } + + } + + /** + * @return The Strings entered, in order of the input labels the dialog was opened with, if the dialog was accepted, null if the dialog + * was cancelled. + */ + public static String[] openMultiTextDialog(String title, String acceptLabel, String cancelLabel, String... inputs) + { + return new MultiTextFieldsDialog(title, acceptLabel, cancelLabel, inputs).open(); + } + + public static class MultiLineTextFieldDialog extends FlexibleInputsDialog + { + private final String input; + private Text textField; + + public MultiLineTextFieldDialog(String title, String acceptLabel, String cancelLabel, String input) + { + super(true, title, acceptLabel, cancelLabel); + this.input = input; + } + + @Override + protected void setupWidgets(Composite parent) + { + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + parent.setLayout(layout); + GridData gd = new GridData(); + Label l = new Label(parent, SWT.NONE); + l.setText(input); + gd.verticalAlignment = SWT.TOP; + l.setLayoutData(gd); + gd = new GridData(); + textField = new Text(parent, SWT.V_SCROLL); + textField.setLayoutData(gd); + gd.grabExcessHorizontalSpace = true; + gd.grabExcessVerticalSpace = true; + gd.horizontalAlignment = SWT.FILL; + gd.verticalAlignment = SWT.FILL; + } + + @Override + protected void buildResult() + { + result = new String[] { textField.getText() }; + } + } + + /** + * @return The String entered if the dialog was accepted, null if the dialog was cancelled. + */ + public static String openMultiLineTextDialog(String title, String acceptLabel, String cancelLabel, String input) + { + String[] result = new MultiLineTextFieldDialog(title, acceptLabel, cancelLabel, input).open(); + return result == null ? null : result[0]; + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java new file mode 100644 index 00000000..aedaa481 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java @@ -0,0 +1,51 @@ +package net.mograsim.logic.model.editor.ui; + +import java.util.Collection; + +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; + +import net.haspamelodica.swt.helper.gcs.TranslatedGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.LogicUICanvas; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.Handle; +import net.mograsim.preferences.Preferences; + +//TODO: Remove Inheritance +public class EditorCanvas extends LogicUICanvas +{ + private Collection handles; + + public EditorCanvas(Composite parent, int style, Editor editor) + { + super(parent, style, editor.toBeEdited.submodel); + + handles = editor.handleManager.getHandles(); + editor.handleManager.addHandleAddedListener(h -> + { + redrawThreadsafe(); + h.addRedrawListener(this::redrawThreadsafe); + }); + // TODO: Is this even necessary? The Handle should be finalized by the gc + editor.handleManager.addHandleRemovedListener(h -> + { + redrawThreadsafe(); + h.removeRedrawListener(this::redrawThreadsafe); + }); + + addZoomedRenderer(gc -> + { + Rectangle visibleRegion = new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom); + Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background"); + if (background != null) + setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the + // canvas + + TranslatedGC tgc = new TranslatedGC(gc, 0.0d, 0.0d, 1 / editor.toBeEdited.getSubmodelScale(), false); + editor.toBeEdited.getOutlineRenderer().render(tgc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); + + handles.forEach(h -> h.render(gc, visibleRegion)); + }); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java new file mode 100644 index 00000000..17e12ebb --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java @@ -0,0 +1,232 @@ +package net.mograsim.logic.model.editor.ui; + +import java.io.IOException; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.List; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.SaveLoadManager; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class EditorGUI +{ + public final Display display; + public final Shell shell; + public final EditorCanvas logicCanvas; + private final List addList; + private final Editor editor; + + public EditorGUI(Editor editor) + { + this.editor = editor; + display = Display.getDefault(); + shell = new Shell(display); + + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + shell.setLayout(layout); + + setupTopToolBar(shell); + Composite innerComp = new Composite(shell, SWT.NONE); + GridData innerCompData = new GridData(); + innerCompData.grabExcessHorizontalSpace = true; + innerCompData.grabExcessVerticalSpace = true; + innerCompData.horizontalAlignment = SWT.FILL; + innerCompData.verticalAlignment = SWT.FILL; + innerComp.setLayoutData(innerCompData); + + GridLayout innerLayout = new GridLayout(); + innerComp.setLayout(innerLayout); + innerLayout.numColumns = 2; + + GridData d = new GridData(); + d.grabExcessHorizontalSpace = true; + d.horizontalAlignment = SWT.FILL; + d.grabExcessVerticalSpace = true; + d.verticalAlignment = SWT.FILL; + + logicCanvas = new EditorCanvas(innerComp, SWT.TRAIL, editor); + logicCanvas.setLayoutData(d); + + d = new GridData(); + d.grabExcessVerticalSpace = true; + d.verticalAlignment = SWT.FILL; + d.verticalSpan = 2; + addList = new List(innerComp, SWT.V_SCROLL); + addList.setLayoutData(d); + refreshAddList(); + + setupBottomToolBar(innerComp); + + ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas); + userInput.buttonDrag = 3; + userInput.buttonZoom = 2; + userInput.enableUserInput(); + new ZoomableCanvasOverlay(logicCanvas, null).enableScale(); + } + + private ToolBar setupTopToolBar(Composite parent) + { + GridData d = new GridData(); + d.grabExcessHorizontalSpace = true; + d.horizontalAlignment = SWT.FILL; + + ToolBar toolBar = new ToolBar(parent, SWT.BORDER); + toolBar.setLayoutData(d); + + ToolItem file = new ToolItem(toolBar, SWT.DROP_DOWN); + + // TODO + DropDownEntry newEntry = new DropDownEntry("New", e -> Editor.openNewEditor()); + DropDownEntry loadEntry = new DropDownEntry("Load", e -> + { + try + { + SaveLoadManager.openLoadDialog(); + } + catch (IOException e1) + { + editor.dialogManager.openWarningDialog("Failed to load Component!", e1.getMessage()); + } + }); + DropDownEntry saveEntry = new DropDownEntry("Save", e -> editor.save()); + DropDownEntry saveAsEntry = new DropDownEntry("Save as...", e -> editor.saveAs()); + + DropDownEntry[] entries = new DropDownEntry[] { newEntry, loadEntry, saveEntry, saveAsEntry }; + + setupDrowpDownMenu(file, entries); + + file.setText("File"); + return toolBar; + } + + private ToolBar setupBottomToolBar(Composite parent) + { + GridData d = new GridData(); + d.grabExcessHorizontalSpace = true; + d.horizontalAlignment = SWT.FILL; + + ToolBar toolBar = new ToolBar(parent, SWT.BORDER); + toolBar.setLayoutData(d); + + ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE); + snappingLabel.setText("Snapping:"); + + ToolItem snappSelect = new ToolItem(toolBar, SWT.DROP_DOWN); + DropDownEntry[] entries = new DropDownEntry[Editor.Snapping.values().length]; + int index = 0; + for (Editor.Snapping sn : Editor.Snapping.values()) + { + entries[index++] = new DropDownEntry(sn.toString(), e -> + { + editor.setSnapping(sn); + snappSelect.setText(sn.toString()); + }); + } + snappSelect.setText(editor.getSnapping().toString()); + setupDrowpDownMenu(snappSelect, entries); + + new ToolItem(toolBar, SWT.SEPARATOR); + + toolBar.pack(); + + return toolBar; + } + + private void setupDrowpDownMenu(ToolItem parent, DropDownEntry[] entries) + { + Menu menu = new Menu(shell, SWT.POP_UP); + for (DropDownEntry entry : entries) + { + MenuItem item = new MenuItem(menu, SWT.PUSH); + item.addSelectionListener(new SelectionListener() + { + @Override + public void widgetSelected(SelectionEvent e) + { + entry.listener.widgetSelected(e); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) + { + widgetSelected(e); + } + }); + item.setText(entry.title); + } + + parent.addListener(SWT.Selection, new Listener() + { + public void handleEvent(Event event) + { + if (event.detail == SWT.ARROW) + { + Rectangle rect = parent.getBounds(); + Point pt = new Point(rect.x, rect.y + rect.height); + pt = parent.getParent().toDisplay(pt); + menu.setLocation(pt.x, pt.y); + menu.setVisible(true); + } + } + }); + } + + private static class DropDownEntry + { + public final String title; + public final EntrySelectedListener listener; + + public DropDownEntry(String title, EntrySelectedListener listener) + { + super(); + this.title = title; + this.listener = listener; + } + } + + private static interface EntrySelectedListener + { + public void widgetSelected(SelectionEvent e); + } + + public void refreshAddList() + { + addList.setItems(IndirectModelComponentCreator.getStandardComponentIDs().keySet().stream().sorted().toArray(String[]::new)); + addList.select(0); + } + + public String getAddListSelected() + { + String[] selection = addList.getSelection(); + if (selection.length == 0) + throw new IllegalStateException("Selection in the Add Component List may never be empty!"); + return selection[0]; + } + + public void open() + { + shell.open(); + while (!shell.isDisposed()) + if (!display.readAndDispatch()) + display.sleep(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java new file mode 100644 index 00000000..253dfdd3 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java @@ -0,0 +1,98 @@ +package net.mograsim.logic.model.editor.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.Set; + +/** + * Similar to a SortedSet, except it is allowed for multiple elements to have the same priority (c.compare(e1, e2) == 0 is + * allowed to be true for two different elements e1 and e2). However, to elements are not allowed to be equal according to + * Object.equals(Object o). + * + * @author Fabian Stemmler + * + * @param the type of elements in this list + */ +public class PrioritySet implements Set +{ + private ArrayList list; + private Comparator c; + + public PrioritySet(Comparator c) + { + setComparator(c); + list = new ArrayList<>(); + } + + @SuppressWarnings("unchecked") + public PrioritySet() + { + this((e1, e2) -> ((Comparable) e1).compareTo(e2)); + } + + public void setComparator(Comparator c) + { + this.c = c; + } + + //@formatter:off + @Override + public int size() { return list.size(); } + @Override + public boolean isEmpty() { return list.isEmpty(); } + @Override + public boolean contains(Object o) { return list.isEmpty(); } + @Override + public Iterator iterator() { return list.iterator(); } + @Override + public Object[] toArray() { return list.toArray(); } + @Override + public E[] toArray(E[] a) { return list.toArray(a); } + @Override + public boolean remove(Object o) { return list.remove(o); } + @Override + public boolean containsAll(Collection c) { return list.containsAll(c); } + @Override + public boolean removeAll(Collection c) { return list.removeAll(c); } + @Override + public boolean retainAll(Collection c) { return list.retainAll(c); } + @Override + public void clear() { list.clear(); } + //@formatter:on + + @Override + public boolean add(T e) + { + if (isEmpty()) + { + list.add(e); + return true; + } + int index = Collections.binarySearch(list, e, c); + if (index < 0) + index = -index - 1; + if (index < size()) + { + if (list.get(index).equals(e)) + return false; + list.add(index, e); + } else + list.add(e); + return true; + } + + @Override + public boolean addAll(Collection c) + { + return c.stream().map(e -> add(e)).reduce(false, (a, b) -> a || b); + } + + @Override + public String toString() + { + return list.toString(); + } +} diff --git a/plugins/net.mograsim.logic.model/.classpath b/plugins/net.mograsim.logic.model/.classpath new file mode 100644 index 00000000..4a00becd --- /dev/null +++ b/plugins/net.mograsim.logic.model/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.logic.model/.project b/plugins/net.mograsim.logic.model/.project new file mode 100644 index 00000000..c6d10606 --- /dev/null +++ b/plugins/net.mograsim.logic.model/.project @@ -0,0 +1,30 @@ + + + net.mograsim.logic.model + + + net.mograsim.logic.core + SWTZoomableCanvas + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.logic.model/META-INF/MANIFEST.MF b/plugins/net.mograsim.logic.model/META-INF/MANIFEST.MF new file mode 100644 index 00000000..e6b077ab --- /dev/null +++ b/plugins/net.mograsim.logic.model/META-INF/MANIFEST.MF @@ -0,0 +1,31 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: net.mograsim.logic.model;singleton:=true +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.logic.model, + net.mograsim.logic.model.examples, + net.mograsim.logic.model.model, + net.mograsim.logic.model.model.components, + net.mograsim.logic.model.model.components.atomic, + net.mograsim.logic.model.model.components.submodels, + net.mograsim.logic.model.model.wires, + net.mograsim.logic.model.modeladapter, + net.mograsim.logic.model.modeladapter.componentadapters, + net.mograsim.logic.model.serializing, + net.mograsim.logic.model.snippets, + net.mograsim.logic.model.snippets.highlevelstatehandlers, + net.mograsim.logic.model.snippets.highlevelstatehandlers.standard, + net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic, + net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent, + net.mograsim.logic.model.snippets.outlinerenderers, + net.mograsim.logic.model.snippets.symbolrenderers, + net.mograsim.logic.model.util +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.eclipse.swt;bundle-version="3.0.0";visibility:=reexport, + SWTZoomableCanvas;bundle-version="1.0.0";visibility:=reexport, + net.mograsim.logic.core;bundle-version="0.1.0";visibility:=reexport, + com.google.gson;bundle-version="2.8.2";visibility:=reexport, + net.mograsim.preferences;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.logic.model +Bundle-Vendor: Mograsim Team diff --git a/plugins/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties b/plugins/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties new file mode 100644 index 00000000..fad36e3e --- /dev/null +++ b/plugins/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,3 @@ +#Properties file for net.mograsim.logic.model +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim logic model and user interface \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/build.properties b/plugins/net.mograsim.logic.model/build.properties new file mode 100644 index 00000000..d6642e65 --- /dev/null +++ b/plugins/net.mograsim.logic.model/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/ diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java new file mode 100644 index 00000000..a9fde7a1 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java @@ -0,0 +1,111 @@ +package net.mograsim.logic.model; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; + +import net.mograsim.logic.core.timeline.Timeline; + +//TODO maybe move to logic core? +public class LogicExecuter +{ + // TODO replace with CoreModel when it exists + private final Timeline timeline; + + private final AtomicBoolean shouldBeRunningLive; + private final AtomicBoolean isRunningLive; + private final AtomicLong nextExecSimulTime; + private final Thread simulationThread; + + public LogicExecuter(Timeline timeline) + { + this.timeline = timeline; + + timeline.setTimeFunction(System::currentTimeMillis); + shouldBeRunningLive = new AtomicBoolean(); + isRunningLive = new AtomicBoolean(); + nextExecSimulTime = new AtomicLong(); + simulationThread = new Thread(() -> + { + isRunningLive.set(true); + synchronized (isRunningLive) + { + isRunningLive.notify(); + } + try + { + while (shouldBeRunningLive.get()) + { + // always execute to keep timeline from "hanging behind" for too long + long current = System.currentTimeMillis(); + timeline.executeUntil(timeline.laterThan(current), current + 10); + long sleepTime; + if (timeline.hasNext()) + sleepTime = timeline.nextEventTime() - current; + else + sleepTime = 10000; + try + { + nextExecSimulTime.set(current + sleepTime); + if (sleepTime > 0) + Thread.sleep(sleepTime); + } + catch (@SuppressWarnings("unused") InterruptedException e) + {// do nothing; it is normal execution flow to be interrupted + } + } + } + finally + { + isRunningLive.set(false); + synchronized (isRunningLive) + { + isRunningLive.notify(); + } + } + }); + timeline.addEventAddedListener(event -> + { + if (isRunningLive.get()) + if (Timeline.timeCmp(event.getTiming(), nextExecSimulTime.get()) < 0) + simulationThread.interrupt(); + }); + } + + public void executeNextStep() + { + timeline.executeNext(); + } + + public synchronized void startLiveExecution() + { + if (shouldBeRunningLive.get()) + return; + shouldBeRunningLive.set(true); + simulationThread.start(); + waitForIsRunning(true); + } + + public synchronized void stopLiveExecution() + { + if (!shouldBeRunningLive.get()) + return; + shouldBeRunningLive.set(false); + simulationThread.interrupt(); + waitForIsRunning(false); + } + + private void waitForIsRunning(boolean expectedState) + { + while (isRunningLive.get() ^ expectedState) + try + { + synchronized (isRunningLive) + { + isRunningLive.wait(); + } + } + catch (@SuppressWarnings("unused") InterruptedException e) + {// no need to do anything + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java new file mode 100644 index 00000000..15346c63 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java @@ -0,0 +1,239 @@ +package net.mograsim.logic.model; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.preferences.Preferences; + +/** + * Simulation visualizer canvas. + * + * @author Daniel Kirschten + */ +public class LogicUICanvas extends ZoomableCanvas +{ + private static final boolean OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL = false; + + private final LogicModel model; + + public LogicUICanvas(Composite parent, int style, LogicModel model) + { + super(parent, style, Preferences.current().getBoolean("net.mograsim.logic.model.improvetext")); + + this.model = model; + + LogicUIRenderer renderer = new LogicUIRenderer(model); + addZoomedRenderer(gc -> + { + Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background"); + if (background != null) + setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the canvas + renderer.render(gc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); + }); + model.setRedrawHandler(this::redrawThreadsafe); + + addListener(SWT.MouseDown, this::mouseDown); + + if (OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL) + openDebugSetHighLevelStateShell(model); + } + + private void mouseDown(Event e) + { + if (e.button == 1) + { + Point click = canvasToWorldCoords(e.x, e.y); + for (ModelComponent component : model.getComponentsByName().values()) + if (component.getBounds().contains(click) && component.clicked(click.x, click.y)) + { + redraw(); + break; + } + } + } + + private void openDebugSetHighLevelStateShell(LogicModel model) + { + Shell debugShell = new Shell(); + debugShell.setLayout(new GridLayout(2, false)); + new Label(debugShell, SWT.NONE).setText("Target component: "); + Combo componentSelector = new Combo(debugShell, SWT.DROP_DOWN | SWT.READ_ONLY); + componentSelector.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + List componentsByItemIndex = new ArrayList<>(); + List models = new ArrayList<>(); + AtomicBoolean recalculateQueued = new AtomicBoolean(); + AtomicReference> compAdded = new AtomicReference<>(); + AtomicReference> compRemoved = new AtomicReference<>(); + compAdded.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, + recalculateQueued, true)); + compRemoved.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, + recalculateQueued, false)); + iterateModelTree(compAdded.get(), compRemoved.get(), model, models, true); + debugShell.addListener(SWT.Dispose, e -> models.forEach(m -> + { + m.removeComponentAddedListener(compAdded.get()); + m.removeComponentRemovedListener(compRemoved.get()); + })); + queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); + new Label(debugShell, SWT.NONE).setText("Target state ID: "); + Text stateIDText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); + stateIDText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + new Label(debugShell, SWT.NONE).setText("Value type: "); + Composite radioGroup = new Composite(debugShell, SWT.NONE); + radioGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + GridLayout radioGroupLayout = new GridLayout(2, false); + radioGroupLayout.marginHeight = 0; + radioGroupLayout.marginWidth = 0; + radioGroup.setLayout(radioGroupLayout); + Button radioBit = new Button(radioGroup, SWT.RADIO); + radioBit.setText("Single bit"); + Button radioBitVector = new Button(radioGroup, SWT.RADIO); + radioBitVector.setText("Bitvector"); + new Label(debugShell, SWT.NONE).setText("Value string representation: \n(Bit vectors: MSBit...LSBit)"); + Text valueText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); + valueText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + Button send = new Button(debugShell, SWT.PUSH); + send.setText("Send!"); + Button get = new Button(debugShell, SWT.PUSH); + get.setText("Get!"); + Text output = new Text(debugShell, SWT.READ_ONLY); + output.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); + Listener sendAction = e -> + { + try + { + int componentIndex = componentSelector.getSelectionIndex(); + if (componentIndex < 0 || componentIndex >= componentsByItemIndex.size()) + throw new RuntimeException("No component selected"); + ModelComponent target = componentsByItemIndex.get(componentIndex); + String valueString = valueText.getText(); + Object value; + if (radioBit.getSelection()) + value = Bit.parse(valueString); + else if (radioBitVector.getSelection()) + value = BitVector.parse(valueString); + else + throw new RuntimeException("No value type selected"); + target.setHighLevelState(stateIDText.getText(), value); + output.setText("Success!"); + } + catch (Exception x) + { + output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); + } + }; + Listener getAction = e -> + { + try + { + if (componentSelector.getSelectionIndex() >= componentsByItemIndex.size()) + throw new RuntimeException("No valid component selected"); + output.setText("Success! Value: \r\n" + + componentsByItemIndex.get(componentSelector.getSelectionIndex()).getHighLevelState(stateIDText.getText())); + } + catch (Exception x) + { + output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); + } + }; + send.addListener(SWT.Selection, sendAction); + valueText.addListener(SWT.DefaultSelection, sendAction); + get.addListener(SWT.Selection, getAction); + stateIDText.addListener(SWT.DefaultSelection, getAction); + debugShell.open(); + } + + private void compsChanged(Consumer compAdded, Consumer compRemoved, ModelComponent c, + List models, List componentsByItemIndex, Combo componentSelector, LogicModel model, + AtomicBoolean recalculateQueued, boolean add) + { + iterateSubmodelTree(compAdded, compRemoved, c, models, add); + queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); + } + + private void iterateSubmodelTree(Consumer compAdded, Consumer compRemoved, + ModelComponent c, List models, boolean add) + { + if (c instanceof SubmodelComponent) + iterateModelTree(compAdded, compRemoved, ((SubmodelComponent) c).submodel, models, add); + } + + private void iterateModelTree(Consumer compAdded, Consumer compRemoved, + LogicModel model, List models, boolean add) + { + if (add ^ models.contains(model)) + { + if (add) + { + models.add(model); + model.addComponentAddedListener(compAdded); + model.addComponentRemovedListener(compRemoved); + } else + { + models.remove(model); + model.removeComponentAddedListener(compAdded); + model.removeComponentRemovedListener(compRemoved); + } + for (ModelComponent c : model.getComponentsByName().values()) + iterateSubmodelTree(compAdded, compRemoved, c, models, add); + } + } + + private void queueRecalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, + Combo componentSelector, LogicModel model) + { + if (recalculateQueued.compareAndSet(false, true)) + getDisplay().asyncExec(() -> recalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model)); + } + + private void recalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, + Combo componentSelector, LogicModel model) + { + recalculateQueued.set(false); + componentsByItemIndex.clear(); + componentSelector.setItems(); + addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model); + } + + private void addComponentSelectorItems(List componentsByItemIndex, String base, Combo componentSelector, + LogicModel model) + { + model.getComponentsByName().values().stream().sorted((c1, c2) -> c1.getName().compareTo(c2.getName())).forEach(c -> + { + if (!(c instanceof ModelWireCrossPoint || c instanceof SubmodelInterface)) + { + String item = base + c.getName(); + componentsByItemIndex.add(c); + componentSelector.add(item); + if (c instanceof SubmodelComponent) + addComponentSelectorItems(componentsByItemIndex, item + " -> ", componentSelector, ((SubmodelComponent) c).submodel); + } + }); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java new file mode 100644 index 00000000..1df2f7b7 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java @@ -0,0 +1,58 @@ +package net.mograsim.logic.model; + +import org.eclipse.swt.SWT; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.preferences.Preferences; + +public class LogicUIRenderer +{ + private static final boolean DRAW_PINS = false; + + private final LogicModel model; + + public LogicUIRenderer(LogicModel model) + { + this.model = model; + } + + public void render(GeneralGC gc, Rectangle visibleRegion) + { + gc.setAntialias(SWT.ON); + gc.setClipping(visibleRegion); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + model.getWiresByName().values().forEach(w -> + { + Rectangle bounds = w.getBounds(); + double lw = gc.getLineWidth(); + if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw)) + w.render(gc); + }); + model.getComponentsByName().values().forEach(c -> renderComponent(gc, c, visibleRegion)); + } + + private static void renderComponent(GeneralGC gc, ModelComponent component, Rectangle visibleRegion) + { + Rectangle bounds = component.getBounds(); + double lw = gc.getLineWidth(); + if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw)) + { + component.render(gc, visibleRegion); + if (DRAW_PINS) + { + gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_DARK_CYAN)); + for (Pin p : component.getPins().values()) + { + Point pos = p.getPos(); + gc.fillOval(pos.x - 1, pos.y - 1, 2, 2); + } + } + } + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java new file mode 100644 index 00000000..49182d66 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java @@ -0,0 +1,53 @@ +package net.mograsim.logic.model; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; +import net.mograsim.logic.model.model.LogicModel; + +/** + * Standalone simulation visualizer graphical user interface. + * + * @author Daniel Kirschten + */ +public class LogicUIStandaloneGUI implements Runnable +{ + private final Display display; + private final Shell shell; + private final LogicUICanvas ui; + + public LogicUIStandaloneGUI(LogicModel model) + { + display = new Display(); + shell = new Shell(display); + shell.setLayout(new FillLayout()); + ui = new LogicUICanvas(shell, SWT.NONE, model); + + ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui); + userInput.buttonDrag = 3; + userInput.buttonZoom = 2; + userInput.enableUserInput(); + new ZoomableCanvasOverlay(ui, null).enableScale(); + } + + public LogicUICanvas getLogicUICanvas() + { + return ui; + } + + /** + * Opens the UI shell. Returns when the shell is closed. + */ + @Override + public void run() + { + shell.open(); + while (!shell.isDisposed()) + if (!display.readAndDispatch()) + display.sleep(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java new file mode 100644 index 00000000..03d0335c --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java @@ -0,0 +1,73 @@ +package net.mograsim.logic.model; + +import java.util.function.Consumer; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; + +public class SimpleLogicUIStandalone +{ + public static void executeVisualisation(Consumer setupLogicModel) + { + executeVisualisation(setupLogicModel, (Consumer) null); + } + + public static void executeVisualisation(Consumer setupLogicModel, Consumer beforeRun) + { + CoreModelParameters params = new CoreModelParameters(); + params.gateProcessTime = 50; + params.wireTravelTime = 10; + executeVisualisation(setupLogicModel, params, beforeRun); + } + + public static void executeVisualisation(Consumer setupLogicModel, CoreModelParameters params) + { + executeVisualisation(setupLogicModel, params, null); + } + + public static void executeVisualisation(Consumer setupLogicModel, CoreModelParameters params, + Consumer beforeRun) + { + // setup logic model + LogicModelModifiable logicModel = new LogicModelModifiable(); + setupLogicModel.accept(logicModel); + + // convert to core model + Timeline timeline = LogicCoreAdapter.convert(logicModel, params); + + // initialize UI and executer + LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(logicModel); + LogicExecuter exec = new LogicExecuter(timeline); + + if (beforeRun != null) + beforeRun.accept(new VisualisationObjects(logicModel, timeline, ui, exec)); + + // run it + exec.startLiveExecution(); + ui.run(); + exec.stopLiveExecution(); + } + + public static class VisualisationObjects + { + public final LogicModelModifiable model; + public final Timeline timeline; + public final LogicUIStandaloneGUI gui; + public final LogicExecuter executer; + + public VisualisationObjects(LogicModelModifiable model, Timeline timeline, LogicUIStandaloneGUI gui, LogicExecuter executer) + { + this.model = model; + this.timeline = timeline; + this.gui = gui; + this.executer = executer; + } + } + + private SimpleLogicUIStandalone() + { + throw new UnsupportedOperationException("No SimpleLogicUIStandalone instances"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java new file mode 100644 index 00000000..14073bd1 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java @@ -0,0 +1,38 @@ +package net.mograsim.logic.model.examples; + +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.submodels.SimpleRectangularSubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; + +public class ClickableSubmodelComponentsTest +{ + public static void main(String[] args) + { + SimpleLogicUIStandalone.executeVisualisation(ClickableSubmodelComponentsTest::createExample); + } + + public static void createExample(LogicModelModifiable model) + { + @SuppressWarnings("unused") // Wire + SimpleRectangularSubmodelComponent comp = new SimpleRectangularSubmodelComponent(model, 1, "") + { + { + setSubmodelScale(.4); + setOutputPins("O0"); + + ModelManualSwitch sw = new ModelManualSwitch(submodelModifiable, 1); + ModelBitDisplay bd = new ModelBitDisplay(submodelModifiable, 1); + + sw.moveTo(10, 5); + bd.moveTo(50, 5); + + new ModelWire(submodelModifiable, sw.getOutputPin(), bd.getInputPin()); + + } + }; + comp.moveTo(10, 10); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java new file mode 100644 index 00000000..5f68c9cc --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java @@ -0,0 +1,61 @@ +package net.mograsim.logic.model.examples; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.atomic.ModelNotGate; +import net.mograsim.logic.model.model.components.atomic.ModelOrGate; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; + +public class RSLatchExample +{ + public static void main(String[] args) + { + SimpleLogicUIStandalone.executeVisualisation(RSLatchExample::createRSLatchExample); + } + + @SuppressWarnings("unused") // for Wires being created + public static void createRSLatchExample(LogicModelModifiable model) + { + ModelManualSwitch rIn = new ModelManualSwitch(model, 1); + rIn.moveTo(100, 100); + ModelManualSwitch sIn = new ModelManualSwitch(model, 1); + sIn.moveTo(100, 200); + + ModelOrGate or1 = new ModelOrGate(model, 1); + or1.moveTo(160, 102.5); + new ModelWire(model, rIn.getOutputPin(), or1.getPin("A")); + + ModelOrGate or2 = new ModelOrGate(model, 1); + or2.moveTo(160, 192.5); + new ModelWire(model, sIn.getOutputPin(), or2.getPin("B")); + + ModelNotGate not1 = new ModelNotGate(model, 1); + not1.moveTo(200, 107.5); + new ModelWire(model, or1.getPin("Y"), not1.getPin("A")); + + ModelNotGate not2 = new ModelNotGate(model, 1); + not2.moveTo(200, 197.5); + new ModelWire(model, or2.getPin("Y"), not2.getPin("A")); + + ModelWireCrossPoint p1 = new ModelWireCrossPoint(model, 1); + p1.moveCenterTo(250, 112.5); + new ModelWire(model, not1.getPin("Y"), p1); + new ModelWire(model, p1, or2.getPin("A"), new Point(250, 130), new Point(140, 185), new Point(140, 197.5)); + + ModelWireCrossPoint p2 = new ModelWireCrossPoint(model, 1); + p2.moveCenterTo(250, 202.5); + new ModelWire(model, not2.getPin("Y"), p2); + new ModelWire(model, p2, or1.getPin("B"), new Point(250, 185), new Point(140, 130), new Point(140, 117.5)); + + ModelWireCrossPoint o1 = new ModelWireCrossPoint(model, 1); + o1.moveCenterTo(270, 112.5); + new ModelWire(model, p1, o1); + + ModelWireCrossPoint o2 = new ModelWireCrossPoint(model, 1); + o2.moveCenterTo(270, 202.5); + new ModelWire(model, p2, o2); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java new file mode 100644 index 00000000..17d0a44e --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java @@ -0,0 +1,196 @@ +package net.mograsim.logic.model.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; + +public class LogicModel +{ + private final Map components; + private final Map componentDestroyFunctions; + private final Map componentsUnmodifiable; + private final Map wires; + private final Map wireDestroyFunctions; + private final Map wiresUnmodifiable; + + private final List> componentAddedListeners; + private final List> componentRemovedListeners; + private final List> wireAddedListeners; + private final List> wireRemovedListeners; + private final List> redrawHandlerChangedListeners; + + private Runnable redrawHandler; + + protected LogicModel() + { + components = new HashMap<>(); + componentDestroyFunctions = new HashMap<>(); + componentsUnmodifiable = Collections.unmodifiableMap(components); + wires = new HashMap<>(); + wireDestroyFunctions = new HashMap<>(); + wiresUnmodifiable = Collections.unmodifiableMap(wires); + + componentAddedListeners = new ArrayList<>(); + componentRemovedListeners = new ArrayList<>(); + wireAddedListeners = new ArrayList<>(); + wireRemovedListeners = new ArrayList<>(); + redrawHandlerChangedListeners = new ArrayList<>(); + } + + /** + * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application + * code as it is automatically called in {@link ModelComponent}'s constructor. + * + * @author Daniel Kirschten + */ + protected void componentCreated(ModelComponent component, Runnable destroyed) + { + if (components.containsKey(component.getName())) + throw new IllegalStateException("Don't add the same component twice!"); + components.put(component.getName(), component); + componentDestroyFunctions.put(component.getName(), destroyed); + callComponentAddedListeners(component); + requestRedraw(); + } + + /** + * Destroyes the given component, removes it from the list of components and calls all componentRemovedListeners. + * + * @author Daniel Kirschten + */ + protected void destroyComponent(ModelComponent component) + { + componentDestroyFunctions.get(component.getName()).run(); + if (!components.containsKey(component.getName())) + throw new IllegalStateException("Don't remove the same component twice!"); + components.remove(component.getName()); + callComponentRemovedListeners(component); + requestRedraw(); + } + + /** + * Adds the given wire to the list of wires and calls all wireAddedListeners. Don't call this method from application code as it is + * automatically called in {@link ModelWire}'s constructor. + * + * @author Daniel Kirschten + */ + protected void wireCreated(ModelWire wire, Runnable destroyed) + { + if (wires.containsKey(wire.name)) + throw new IllegalStateException("Don't add the same wire twice!"); + wires.put(wire.name, wire); + wireDestroyFunctions.put(wire.name, destroyed); + callWireAddedListeners(wire); + requestRedraw(); + } + + /** + * Destroys the given wire, removes it from the list of wires and calls all wireRemovedListeners. + * + * @author Daniel Kirschten + */ + protected void destroyWire(ModelWire wire) + { + wireDestroyFunctions.get(wire.name).run(); + if (!wires.containsKey(wire.name)) + throw new IllegalStateException("Don't remove the same wire twice!"); + wires.remove(wire.name); + callWireRemovedListeners(wire); + requestRedraw(); + } + + public Map getComponentsByName() + { + return componentsUnmodifiable; + } + + public Map getWiresByName() + { + return wiresUnmodifiable; + } + + public ModelComponent getComponentByName(String name) + { + return components.get(name); + } + + @SuppressWarnings("unchecked") + public T getComponentByName(String name, Class expectedComponentClass) + { + ModelComponent comp = components.get(name); + Objects.requireNonNull(comp, "Invaild path, component " + name + " not found"); + if (expectedComponentClass.isInstance(comp)) + return (T) comp; + throw new IllegalArgumentException("The component " + name + " is not an instance of " + expectedComponentClass); + } + + public ModelWire getWireByName(String name) + { + return wires.get(name); + } + + public T getComponentBySubmodelPath(String path, Class modelClass) + { + int firstDot = path.indexOf('.'); + if (firstDot == -1) + return getComponentByName(path, modelClass); + String first = path.substring(0, firstDot); + String rest = path.substring(firstDot + 1); + return getComponentByName(first, SubmodelComponent.class).submodel.getComponentBySubmodelPath(rest, modelClass); + } + + public ModelWire getWireBySubmodelPath(String path) + { + int firstDot = path.indexOf('.'); + if (firstDot == -1) + return getWireByName(path); + String first = path.substring(0, firstDot); + String rest = path.substring(firstDot + 1); + return getComponentByName(first, SubmodelComponent.class).submodel.getWireBySubmodelPath(rest); + } + + // @formatter:off + public void addComponentAddedListener (Consumer listener) {componentAddedListeners .add (listener);} + public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners .add (listener);} + public void addWireAddedListener (Consumer listener) {wireAddedListeners .add (listener);} + public void addWireRemovedListener (Consumer listener) {wireRemovedListeners .add (listener);} + public void addRedrawHandlerChangedListener (Consumer listener) {redrawHandlerChangedListeners.add (listener);} + + public void removeComponentAddedListener (Consumer listener) {componentAddedListeners .remove(listener);} + public void removeComponentRemovedListener (Consumer listener) {componentRemovedListeners .remove(listener);} + public void removeWireAddedListener (Consumer listener) {wireAddedListeners .remove(listener);} + public void removeWireRemovedListener (Consumer listener) {wireRemovedListeners .remove(listener);} + public void removeRedrawHandlerChangedListener(Consumer listener) {redrawHandlerChangedListeners.remove(listener);} + + private void callComponentAddedListeners (ModelComponent c) {componentAddedListeners .forEach(l -> l.accept(c));} + private void callComponentRemovedListeners (ModelComponent c) {componentRemovedListeners .forEach(l -> l.accept(c));} + private void callWireAddedListeners (ModelWire w) {wireAddedListeners .forEach(l -> l.accept(w));} + private void callWireRemovedListeners (ModelWire w) {wireRemovedListeners .forEach(l -> l.accept(w));} + private void callRedrawHandlerChangedListener(Runnable r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));} + // @formatter:on + + public void setRedrawHandler(Runnable handler) + { + this.redrawHandler = handler; + callRedrawHandlerChangedListener(handler); + } + + public Runnable getRedrawHandler() + { + return redrawHandler; + } + + public void requestRedraw() + { + if (redrawHandler != null) + redrawHandler.run(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java new file mode 100644 index 00000000..e903257f --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java @@ -0,0 +1,58 @@ +package net.mograsim.logic.model.model; + +import java.util.Set; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.IdentifyParams; + +public class LogicModelModifiable extends LogicModel +{ + public String getDefaultComponentName(ModelComponent component) + { + Set componentNames = getComponentsByName().keySet(); + String componentID = component.getIDForSerializing(new IdentifyParams()); + String nameBase = componentID + '#'; + for (int i = 0;; i++) + { + String nameCandidate = nameBase + i; + if (!componentNames.contains(nameCandidate)) + return nameCandidate; + } + } + + public String getDefaultWireName() + { + Set wireNames = getWiresByName().keySet(); + for (int i = 0;; i++) + { + String nameCandidate = "unnamedWire#" + i; + if (!wireNames.contains(nameCandidate)) + return nameCandidate; + } + } + + @Override + public void componentCreated(ModelComponent component, Runnable destroyed) + { + super.componentCreated(component, destroyed); + } + + @Override + public void destroyComponent(ModelComponent component) + { + super.destroyComponent(component); + } + + @Override + public void wireCreated(ModelWire wire, Runnable destroyed) + { + super.wireCreated(wire, destroyed); + } + + @Override + public void destroyWire(ModelWire wire) + { + super.destroyWire(wire); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java new file mode 100644 index 00000000..d543c543 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java @@ -0,0 +1,362 @@ +package net.mograsim.logic.model.model.components; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.JSONSerializable; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; + +/** + * The base class for all model components.
+ * A ModelComponent has a reference to the LogicModel it belongs to.
+ * A ModelComponent has a name. This name is unique in the model the ModelComponent belongs to.
+ * A ModelComponent has a position and size. The size can only be modified by subclasses. + * + * @author Daniel Kirschten + */ +public abstract class ModelComponent implements JSONSerializable +{ + /** + * The model this component is a part of. + */ + protected final LogicModelModifiable model; + /** + * The name of this component. Is unique for all components in its model.
+ * Does never change, but can't be final since it is set in {@link #init()}. + */ + private String name; + private final Rectangle bounds; + /** + * The list of all pins of this component by name. + */ + private final Map pinsByName; + /** + * An unmodifiable view of {@link #pinsByName}. + */ + protected final Map pinsUnmodifiable; + + private final List> componentMovedListeners; + private final List> componentResizedListeners; + private final List> pinAddedListeners; + private final List> pinRemovedListeners; + + private HighLevelStateHandler highLevelStateHandler; + + // creation and destruction + + public ModelComponent(LogicModelModifiable model, String name) + { + this(model, name, true); + } + + /** + * Creates a new {@link ModelComponent} and, if callInit, initializes the component (See {@link #init()}).
+ * If callInit==false, make sure to call {@link #init()}! + * + * @author Daniel Kirschten + */ + protected ModelComponent(LogicModelModifiable model, String name, boolean callInit) + { + this.model = model; + this.name = name; + this.bounds = new Rectangle(0, 0, 0, 0); + this.pinsByName = new HashMap<>(); + this.pinsUnmodifiable = Collections.unmodifiableMap(pinsByName); + + this.componentMovedListeners = new ArrayList<>(); + this.componentResizedListeners = new ArrayList<>(); + this.pinAddedListeners = new ArrayList<>(); + this.pinRemovedListeners = new ArrayList<>(); + + if (callInit) + init(); + } + + /** + * Initializes this component. This method should be called exactly once in this component's constructor.
+ *
    + *
  • If {@link #name}==null, sets {@link #name} to {@link LogicModelModifiable#getDefaultComponentName(ModelComponent)}. + *
  • Registers this component in the model. + *
+ */ + protected void init() + { + if (name == null) + name = model.getDefaultComponentName(this); + model.componentCreated(this, this::destroyed); + } + + // basic getters + + public String getName() + { + return name; + } + + /** + * Destroys this component. This method is called from {@link LogicModelModifiable#componentDestroyed(ModelComponent) + * destroyComponent()} of the model this component is a part of.
+ * When overriding, make sure to also call the original implementation. + * + * @author Daniel Kirschten + */ + protected void destroyed() + { + pinsByName.values().forEach(this::removePinWithoutRedraw); + } + + // pins + + /** + * Adds the given pin to this component and calls pinAddedListeners and redrawListeners. + * + * @throws IllegalArgumentException if the pin doesn't belong to this component + * @throws IllegalArgumentException if there already is a pin with the given name + * + * @author Daniel Kirschten + */ + protected void addPin(Pin pin) + { + if (pin.component != this) + throw new IllegalArgumentException("Can't add a pin not belonging to this component!"); + if (pinsByName.containsKey(pin.name)) + throw new IllegalArgumentException("Duplicate pin name: " + pin.name); + pinsByName.put(pin.name, pin); + callPinAddedListeners(pin); + model.requestRedraw(); + } + + /** + * Removes the given pin from this component and calls pinAddedListeners and redrawListeners. + * + * @throws NullPointerException if there was no pin with this name + * + * @author Daniel Kirschten + */ + protected void removePin(String name) + { + removePinWithoutRedraw(pinsByName.remove(name)); + model.requestRedraw(); + } + + private void removePinWithoutRedraw(Pin pin) + { + pin.destroyed(); + callPinRemovedListeners(pin); + } + + /** + * Returns a collection of pins of this component. + * + * @author Daniel Kirschten + */ + public Map getPins() + { + return pinsUnmodifiable; + } + + /** + * Returns the pin with the given name of this component. + * + * @throws IllegalArgumentException if there is no pin with the given name + * @see #getPinOrNull(String) + * + * @author Daniel Kirschten + */ + public Pin getPin(String name) + { + Pin pin = getPinOrNull(name); + if (pin == null) + throw new IllegalArgumentException("No pin with the name " + name); + return pin; + } + + /** + * Returns the pin with the given name of this component, or null if there is no such pin. + * + * @see #getPin(String) + * + * @author Daniel Kirschten + */ + public Pin getPinOrNull(String name) + { + return pinsByName.get(name); + } + + // high-level access + + /** + * @author Daniel Kirschten + */ + protected void setHighLevelStateHandler(HighLevelStateHandler highLevelStateHandler) + { + this.highLevelStateHandler = highLevelStateHandler; + } + + public HighLevelStateHandler getHighLevelStateHandler() + { + return highLevelStateHandler; + } + + /** + * Gets the current value of the given high-level state.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @see #setHighLevelState(String, Object) + * @see HighLevelStateHandler#getHighLevelState(String) + * + * @author Daniel Kirschten + */ + public Object getHighLevelState(String stateID) + { + return highLevelStateHandler.getHighLevelState(stateID); + } + + /** + * Sets the given high-level state to the given value.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @see #getHighLevelState(String) + * @see HighLevelStateHandler#setHighLevelState(String, Object) + * + * @author Daniel Kirschten + */ + public void setHighLevelState(String stateID, Object newState) + { + highLevelStateHandler.setHighLevelState(stateID, newState); + } + + // "graphical" operations + + /** + * Sets the position of this component and calls componentMovedListeners and redrawListeners. + * + * @author Daniel Kirschten + */ + public void moveTo(double x, double y) + { + bounds.x = x; + bounds.y = y; + callComponentMovedListeners(); + model.requestRedraw(); + } + + /** + * Sets the size of this component and calls redrawListeners. + * + * @author Daniel Kirschten + */ + protected void setSize(double width, double height) + { + bounds.width = width; + bounds.height = height; + callComponentResizedListener(); + model.requestRedraw(); + } + + /** + * Returns the bounds of this component. Is a bit slower than {@link #getPosX()}, {@link #getPosY()}, {@link #getWidth}, + * {@link #getHeight}, because new objects are created. + * + * @author Daniel Kirschten + */ + public final Rectangle getBounds() + { + return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); + } + + /** + * Returns the x coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. + * + * @author Daniel Kirschten + */ + public double getPosX() + { + return bounds.x; + } + + /** + * Returns the y coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. + * + * @author Daniel Kirschten + */ + public double getPosY() + { + return bounds.y; + } + + /** + * Returns the (graphical) width of this component. Is a bit faster than {@link #getBounds()} because no objects are created. + * + * @author Daniel Kirschten + */ + public double getWidth() + { + return bounds.width; + } + + /** + * Returns the height of this component. Is a bit faster than {@link #getBounds()} because no objects are created. + * + * @author Daniel Kirschten + */ + public double getHeight() + { + return bounds.height; + } + + /** + * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this + * click. + * + * @author Daniel Kirschten + */ + @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden + public boolean clicked(double x, double y) + { + return false; + } + + /** + * Render this component to the given gc, in absoulute coordinates. + * + * @author Daniel Kirschten + */ + public abstract void render(GeneralGC gc, Rectangle visibleRegion); + + // serializing + + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + // listeners + + // @formatter:off + public void addComponentMovedListener (Consumer listener) {componentMovedListeners .add (listener);} + public void addComponentResizedListener (Consumer listener) {componentResizedListeners.add (listener);} + public void addPinAddedListener (Consumer listener) {pinAddedListeners .add (listener);} + public void addPinRemovedListener (Consumer listener) {pinRemovedListeners .add (listener);} + + public void removeComponentMovedListener (Consumer listener) {componentMovedListeners .remove(listener);} + public void removeComponentResizedListener (Consumer listener) {componentResizedListeners.remove(listener);} + public void removePinAddedListener (Consumer listener) {pinAddedListeners .remove(listener);} + public void removePinRemovedListener (Consumer listener) {pinRemovedListeners .remove(listener);} + + private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));} + private void callComponentResizedListener( ) {componentResizedListeners.forEach(l -> l.accept(this));} + private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));} + private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));} + // @formatter:on +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java new file mode 100644 index 00000000..9fba366f --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java @@ -0,0 +1,65 @@ +package net.mograsim.logic.model.model.components; + +/** + * For components that can have different orientations. The meaning is not clearly defined, however it is common that the orientation + * denotes the direction the output is facing or the general flow of signals. _ALT represents an alternative, which is normally + * a mirrored version. A component can choose to not support some variants. + *

+ * In terms of calculation, {@link #RIGHT} is considered the default. + *

+ * Note that this needs to be interpreted using the GUI coordinate system, meaning that UP and DOWN are swapped. + * + * @author Christian Femers + */ +public enum Orientation +{ + /** + * The orientation RIGHT is the default orientation, all others are defined relative to it. + */ + RIGHT(1, 0, 0, 1), LEFT(-1, 0, 0, -1), UP(0, 1, -1, 0), DOWN(0, -1, 1, 0), RIGHT_ALT(1, 0, 0, -1), LEFT_ALT(-1, 0, 0, 1), + UP_ALT(0, -1, -1, 0), DOWN_ALT(0, 1, 1, 0); + + // simple 2D transformation matrix + final double trans11; + final double trans12; + final double trans21; + final double trans22; + + private Orientation(double trans11, double trans12, double trans21, double trans22) + { + this.trans11 = trans11; + this.trans12 = trans12; + this.trans21 = trans21; + this.trans22 = trans22; + } + + /** + * Performs a simple rotation around the origin. This does not work for the display coordinate system. + * + * @return the point's new X coordinate + */ + public double getNewX(double rightX, double rightY) + { + return rightX * trans11 + rightY * trans12; + } + + /** + * Performs a simple rotation around the origin. This does not work for the display coordinate system. + * + * @return the point's new Y coordinate + */ + public double getNewY(double rightX, double rightY) + { + return rightX * trans21 + rightY * trans22; + } + + public boolean doesMirror() + { + return ordinal() > 3; + } + + public boolean swapsWidthAndHeight() + { + return trans11 == 0; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java new file mode 100644 index 00000000..06621baf --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java @@ -0,0 +1,76 @@ +package net.mograsim.logic.model.model.components; + +/** + * This class simplifies the calculation of coordinates, especially for model components. + *

+ * Supply it with the original width and height and an orientation, and use the methods {@link #newX(double, double)} and + * {@link #newY(double, double)} to retrieve the new coordinates, relative to the upper left corner of {@link Orientation#RIGHT}. The + * {@link #height()} and {@link #width()} methods return the width and height in the new orientation. + *

+ * This is meant to be used in the context of a a classic display coordinate system, as done in the {@link ModelComponent}s. + * + * @see Orientation + * @author Christian Femers + */ +public class OrientationCalculator +{ + final Orientation o; + final double oldWHalf; + final double oldHHalf; + final double w; + final double h; + final double wHalf; + final double hHalf; + + public OrientationCalculator(Orientation o, double width, double height) + { + this.o = o; + this.oldWHalf = width / 2; + this.oldHHalf = height / 2; + + if (o.swapsWidthAndHeight()) + { + w = height; + h = width; + wHalf = oldHHalf; + hHalf = oldWHalf; + } else + { + w = width; + h = height; + wHalf = oldWHalf; + hHalf = oldHHalf; + } + } + + /** + * Returns the new height (that equals the old width if {@link Orientation#swapsWidthAndHeight()} is true) + */ + public double height() + { + return h; + } + + /** + * Returns the new width (that equals the old height if {@link Orientation#swapsWidthAndHeight()} is true) + */ + public double width() + { + return w; + } + + public double newX(double x, double y) + { + return (x - oldWHalf) * o.trans11 + (y - oldHHalf) * o.trans12 + wHalf; + } + + public double newY(double x, double y) + { + return (x - oldWHalf) * o.trans21 + (y - oldHHalf) * o.trans22 + hHalf; + } + + public final Orientation getOrientation() + { + return o; + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java new file mode 100644 index 00000000..3e836937 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.model.components.atomic; + +import net.mograsim.logic.core.components.gates.CoreAndGate; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelAndGate extends SimpleRectangularModelGate +{ + public ModelAndGate(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelAndGate(LogicModelModifiable model, int logicWidth, String name) + { + super(model, "AndGate", "&", false, logicWidth, name, false); + setInputCount(2);// TODO make variable + init(); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelAndGate.class, CoreAndGate::new)); + IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), + (m, p, n) -> new ModelAndGate(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java new file mode 100644 index 00000000..1a01e141 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java @@ -0,0 +1,113 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.BitDisplayAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.Preferences; + +public class ModelBitDisplay extends ModelComponent +{ + private static final double width = 20; + private static final double height = 15; + private static final double fontHeight = 5; + + public final int logicWidth; + private final Pin inputPin; + + private final LogicObserver logicObs; + private CoreBitDisplay bitDisplay; + + public ModelBitDisplay(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelBitDisplay(LogicModelModifiable model, int logicWidth, String name) + { + super(model, name, false); + this.logicWidth = logicWidth; + logicObs = (i) -> model.requestRedraw(); + + setSize(width, height); + addPin(this.inputPin = new Pin(model, this, "", logicWidth, PinUsage.INPUT, 0, height / 2)); + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = bitDisplay == null ? BitVectorFormatter.formatAsString(null) + : BitVectorFormatter.formatAsString(bitDisplay.getDisplayedValue()); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + public void setCoreModelBinding(CoreBitDisplay bitDisplay) + { + if (this.bitDisplay != null) + this.bitDisplay.deregisterObserver(logicObs); + this.bitDisplay = bitDisplay; + if (bitDisplay != null) + bitDisplay.registerObserver(logicObs); + } + + public boolean hasCoreModelBinding() + { + return bitDisplay != null; + } + + public CoreBitDisplay getBitDisplay() + { + return bitDisplay; + } + + public Pin getInputPin() + { + return inputPin; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "BitDisplay"; + } + + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new BitDisplayAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelBitDisplay.class.getCanonicalName(), + (m, p, n) -> new ModelBitDisplay(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java new file mode 100644 index 00000000..38963536 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java @@ -0,0 +1,168 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import com.google.gson.JsonSyntaxException; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.OrientationCalculator; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.ClockAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.Preferences; + +public class ModelClock extends ModelComponent +{ + private static final double width = 20; + private static final double height = 20; + private static final double fontHeight = 5; + + private final Pin outputPin; + + private final LogicObserver logicObs; + private ModelClockParams params; + private OrientationCalculator oc; + private CoreClock clock; + + public ModelClock(LogicModelModifiable model, ModelClockParams params) + { + this(model, params, null); + } + + public ModelClock(LogicModelModifiable model, ModelClockParams params, String name) + { + super(model, name, false); + this.params = params; + logicObs = (i) -> model.requestRedraw(); + + oc = new OrientationCalculator(params.orientation, width, height); + setSize(oc.width(), oc.height()); + + this.outputPin = new Pin(model, this, "", 1, PinUsage.OUTPUT, oc.newX(width, height / 2), oc.newY(width, height / 2)); + addPin(outputPin); + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = clock == null ? "null" : (clock.isOn() ? "|" : "\u2015"); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (oc.width() - textExtent.x) / 2, getPosY() + (oc.height() - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + public void setCoreModelBinding(CoreClock clock) + { + if (this.clock != null) + this.clock.deregisterObserver(logicObs); + this.clock = clock; + if (clock != null) + clock.registerObserver(logicObs); + } + + public boolean hasCoreModelBinding() + { + return clock != null; + } + + @Override + public Object getHighLevelState(String stateID) + { + switch (stateID) + { + case "out": + if (clock != null) + return clock.getOut().getInputValues(); + return null; + default: + return super.getHighLevelState(stateID); + } + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + switch (stateID) + { + case "out": + throw new UnsupportedOperationException("cannot set state of clock"); + default: + super.setHighLevelState(stateID, newState); + } + } + + public CoreClock getClock() + { + return clock; + } + + public Pin getOutputPin() + { + return outputPin; + } + + public int getDelta() + { + return params.delta; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Clock"; + } + + @Override + public ModelClockParams getParamsForSerializing(IdentifyParams idParams) + { + return params; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new ClockAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelClock.class.getName(), (m, p, n) -> + { + ModelClockParams params = JsonHandler.fromJsonTree(p, ModelClockParams.class); + if (params == null) + throw new JsonSyntaxException("Invalid!!!"); + return new ModelClock(m, params, n); + }); + } + + public static class ModelClockParams + { + int delta; + Orientation orientation; + + public ModelClockParams(int delta, Orientation orientation) + { + this.delta = delta; + this.orientation = orientation; + } + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java new file mode 100644 index 00000000..1d3bb1ee --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java @@ -0,0 +1,79 @@ +package net.mograsim.logic.model.model.components.atomic; + +import java.util.Objects; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.FixedOutputAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.Preferences; + +public class ModelFixedOutput extends ModelComponent +{ + private static final double width = 20; + private static final double height = 20; + private static final double fontHeight = 5; + + public final BitVector bits; + + public ModelFixedOutput(LogicModelModifiable model, BitVector bits, String name) + { + super(model, name, false); + this.bits = bits; + setSize(width, height); + addPin(new Pin(model, this, "out", bits.length(), PinUsage.OUTPUT, width, height / 2)); + + init(); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "FixedOutput"; + } + + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return bits; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = BitVectorFormatter.formatAsString(bits); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new FixedOutputAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelFixedOutput.class.getCanonicalName(), + (m, p, n) -> new ModelFixedOutput(m, Objects.requireNonNull(JsonHandler.fromJsonTree(p, BitVector.class)), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java new file mode 100644 index 00000000..7a995041 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java @@ -0,0 +1,185 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.ManualSwitchAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.Preferences; + +public class ModelManualSwitch extends ModelComponent +{ + private static final double width = 20; + private static final double height = 15; + private static final double fontHeight = 5; + private static final double heightMiniButtons = 4; // 0 is disabled + + public final int logicWidth; + private final Pin outputPin; + + private final LogicObserver logicObs; + private CoreManualSwitch manualSwitch; + + public ModelManualSwitch(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelManualSwitch(LogicModelModifiable model, int logicWidth, String name) + { + super(model, name, false); + this.logicWidth = logicWidth; + logicObs = (i) -> model.requestRedraw(); + + setSize(width, height); + addPin(this.outputPin = new Pin(model, this, "", logicWidth, PinUsage.OUTPUT, width, height / 2)); + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = BitVectorFormatter.formatAsString(manualSwitch == null ? null : manualSwitch.getValues()); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + + if (manualSwitch != null && logicWidth > 1 && heightMiniButtons > 0 && visibleRegion.y < getPosY() + heightMiniButtons) + { + double x = getPosX(); + double y = getPosY(); + gc.drawLine(x, y + heightMiniButtons, x + width, y + heightMiniButtons); + Color c = gc.getBackground(); + gc.setBackground(gc.getForeground()); + BitVector bv = manualSwitch.getValues(); + double part = width / bv.length(); + for (int i = 0; i < bv.length(); i++) + { + double start = x + part * i; + if (i != 0) + gc.drawLine(start, y, start, y + heightMiniButtons); + if (bv.getMSBit(i) == Bit.ONE) + { +// gc.fillRectangle(start, y, part, heightMiniButtons); // alternative, but not always visible what Bit is where + gc.drawLine(start, y, start + part, y + heightMiniButtons); + gc.drawLine(start + part, y, start, y + heightMiniButtons); + } + } + gc.setBackground(c); + } + } + + public void setCoreModelBinding(CoreManualSwitch logicSwitch) + { + if (this.manualSwitch != null) + this.manualSwitch.deregisterObserver(logicObs); + this.manualSwitch = logicSwitch; + if (logicSwitch != null) + logicSwitch.registerObserver(logicObs); + } + + public boolean hasCoreModelBinding() + { + return manualSwitch != null; + } + + @Override + public Object getHighLevelState(String stateID) + { + switch (stateID) + { + case "out": + if (manualSwitch != null) + return manualSwitch.getValues(); + return null; + default: + return super.getHighLevelState(stateID); + } + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + switch (stateID) + { + case "out": + if (manualSwitch != null) + manualSwitch.setState((BitVector) newState); + break; + default: + super.setHighLevelState(stateID, newState); + break; + } + } + + @Override + public boolean clicked(double x, double y) + { + if (manualSwitch != null) + { + if (heightMiniButtons > 0 && y - getPosY() < heightMiniButtons) + { + int part = (int) ((x - getPosX()) * logicWidth / width); + manualSwitch.setState(manualSwitch.getValues().withBitChanged(part, Bit::not)); + } else + { + manualSwitch.toggle(); + } + } + return true; + } + + public CoreManualSwitch getManualSwitch() + { + return manualSwitch; + } + + public Pin getOutputPin() + { + return outputPin; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "ManualSwitch"; + } + + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new ManualSwitchAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelManualSwitch.class.getName(), + (m, p, n) -> new ModelManualSwitch(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java new file mode 100644 index 00000000..6efc9ad3 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java @@ -0,0 +1,126 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.SWT; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.atomic.ModelSplitter.SplitterParams; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.MergerAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +//TODO delete this legacy class +public class ModelMerger extends ModelComponent +{ + private static final double width = 10; + private static final double heightPerPin = 10; + + public final int logicWidth; + private final Pin outputPin; + + private final ReadEnd[] inputEnds; + private ReadEnd outputEnd; + + public ModelMerger(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelMerger(LogicModelModifiable model, int logicWidth, String name) + { + super(model, name, false); + this.logicWidth = logicWidth; + setSize(width, (logicWidth - 1) * heightPerPin); + double inputHeight = (logicWidth - 1) * heightPerPin; + for (int i = 0; i < logicWidth; i++, inputHeight -= 10) + addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, 0, inputHeight)); + addPin(this.outputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, width, (logicWidth - 1) * heightPerPin / 2)); + inputEnds = new ReadEnd[logicWidth]; + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + double posX = getPosX(); + double posY = getPosY(); + + ColorDefinition c = BitVectorFormatter.formatAsColor(outputEnd); + if (c != null) + gc.setForeground(ColorManager.current().toColor(c)); + gc.setLineWidth( + Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); + double outLineY = posY + (logicWidth - 1) * heightPerPin / 2; + gc.drawLine(posX + width / 2, outLineY, posX + width, outLineY); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit")); + double inputHeight = posY; + for (int i = 0; i < logicWidth; i++, inputHeight += 10) + { + c = BitVectorFormatter.formatAsColor(inputEnds[i]); + if (c != null) + gc.setForeground(ColorManager.current().toColor(c)); + gc.drawLine(posX, inputHeight, posX + width / 2, inputHeight); + } + gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground")); + int oldLineCap = gc.getLineCap(); + int lineJoin = gc.getLineJoin(); + // TODO find better "replacement" for JOIN_BEVEL + // TODO it looks weird that the vertical line is thinner than the single multibit wire. + gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE); + gc.drawLine(posX + width / 2, posY, posX + width / 2, posY + heightPerPin * (logicWidth - 1)); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + gc.setLineCap(oldLineCap); + } + + @Override + public Pin getPin(String name) + { + Pin pin = getPinOrNull(name); + return pin == null ? getPin(name.replace('O', 'i').replace('I', 'O').replace('i', 'I')) : pin; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Splitter"; + } + + @Override + public SplitterParams getParamsForSerializing(IdentifyParams idParams) + { + SplitterParams splitterParams = new SplitterParams(); + splitterParams.logicWidth = logicWidth; + splitterParams.orientation = Orientation.LEFT; + return splitterParams; + } + + public void setCoreModelBinding(ReadEnd[] inputEnds, ReadEnd outputEnd) + { + System.arraycopy(inputEnds, 0, this.inputEnds, 0, logicWidth); + this.outputEnd = outputEnd; + } + + public Pin getOutputPin() + { + return outputPin; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new MergerAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelMerger.class.getCanonicalName(), + (m, p, n) -> new ModelMerger(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java new file mode 100644 index 00000000..b4e91d87 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.model.components.atomic; + +import net.mograsim.logic.core.components.gates.CoreNandGate; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelNandGate extends SimpleRectangularModelGate +{ + public ModelNandGate(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelNandGate(LogicModelModifiable model, int logicWidth, String name) + { + super(model, "NandGate", "&", true, logicWidth, name, false); + setInputCount(2);// TODO make variable + init(); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNandGate.class, CoreNandGate::new)); + IndirectModelComponentCreator.setComponentSupplier(ModelNandGate.class.getCanonicalName(), + (m, p, n) -> new ModelNandGate(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java new file mode 100644 index 00000000..8f3849f9 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.model.components.atomic; + +import net.mograsim.logic.core.components.gates.CoreNotGate; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelNotGate extends SimpleRectangularModelGate +{ + public ModelNotGate(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelNotGate(LogicModelModifiable model, int logicWidth, String name) + { + super(model, "NotGate", "1", true, logicWidth, name, false); + setInputCount(1); + init(); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNotGate.class, (t, p, o, i) -> new CoreNotGate(t, p, i[0], o))); + IndirectModelComponentCreator.setComponentSupplier(ModelNotGate.class.getCanonicalName(), + (m, p, n) -> new ModelNotGate(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java new file mode 100644 index 00000000..c09569ed --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.model.components.atomic; + +import net.mograsim.logic.core.components.gates.CoreOrGate; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelOrGate extends SimpleRectangularModelGate +{ + public ModelOrGate(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelOrGate(LogicModelModifiable model, int logicWidth, String name) + { + super(model, "OrGate", "\u22651", false, logicWidth, name, false);// ">=1" + setInputCount(2); + init(); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelOrGate.class, CoreOrGate::new)); + IndirectModelComponentCreator.setComponentSupplier(ModelOrGate.class.getCanonicalName(), + (m, p, n) -> new ModelOrGate(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java new file mode 100644 index 00000000..962f2acc --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java @@ -0,0 +1,165 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.SWT; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.OrientationCalculator; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SplitterAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +public class ModelSplitter extends ModelComponent +{ + private static final double width = 10; + private static final double heightPerPin = 10; + + private final double heightWithoutOC; + public final int logicWidth; + private final OrientationCalculator oc; + private final Pin inputPin; + + private ReadEnd inputEnd; + private final ReadEnd[] outputEnds; + + public ModelSplitter(LogicModelModifiable model, SplitterParams params) + { + this(model, params, null); + } + + public ModelSplitter(LogicModelModifiable model, SplitterParams params, String name) + { + super(model, name, false); + this.logicWidth = params.logicWidth; + this.oc = new OrientationCalculator(toggleLeftDownAlt(params.orientation), width, + this.heightWithoutOC = (logicWidth - 1) * heightPerPin); + setSize(oc.width(), oc.height()); + double inLineY = (logicWidth - 1) * heightPerPin / 2; + addPin(this.inputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, oc.newX(0, inLineY), oc.newY(0, inLineY))); + double outputHeight = (logicWidth - 1) * heightPerPin; + for (int i = 0; i < logicWidth; i++, outputHeight -= 10) + addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, oc.newX(width, outputHeight), oc.newY(width, outputHeight))); + outputEnds = new ReadEnd[logicWidth]; + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + double posX = getPosX(); + double posY = getPosY(); + + ColorDefinition c = BitVectorFormatter.formatAsColor(inputEnd); + if (c != null) + gc.setForeground(ColorManager.current().toColor(c)); + gc.setLineWidth( + Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); + double inLineY = heightWithoutOC / 2; + gc.drawLine(posX + oc.newX(0, inLineY), posY + oc.newY(0, inLineY), posX + oc.newX(width / 2, inLineY), + posY + oc.newY(width / 2, inLineY)); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit")); + double outputHeight = 0; + for (int i = 0; i < logicWidth; i++, outputHeight += 10) + { + c = BitVectorFormatter.formatAsColor(outputEnds[i]); + if (c != null) + gc.setForeground(ColorManager.current().toColor(c)); + gc.drawLine(posX + oc.newX(width / 2, outputHeight), posY + oc.newY(width / 2, outputHeight), + posX + oc.newX(width, outputHeight), posY + oc.newY(width, outputHeight)); + } + gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground")); + int oldLineCap = gc.getLineCap(); + int lineJoin = gc.getLineJoin(); + // TODO find better "replacement" for JOIN_BEVEL + // TODO it looks weird that the vertical line is thinner than the single multibit wire. + gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE); + gc.drawLine(posX + oc.newX(width / 2, 0), posY + oc.newY(width / 2, 0), posX + oc.newX(width / 2, heightWithoutOC), + posY + oc.newY(width / 2, heightWithoutOC)); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + gc.setLineCap(oldLineCap); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Splitter"; + } + + @Override + public SplitterParams getParamsForSerializing(IdentifyParams idParams) + { + SplitterParams splitterParams = new SplitterParams(); + splitterParams.logicWidth = logicWidth; + splitterParams.orientation = toggleLeftDownAlt(oc.getOrientation()); + return splitterParams; + } + + public void setCoreModelBinding(ReadEnd inputEnd, ReadEnd[] outputEnds) + { + this.inputEnd = inputEnd; + System.arraycopy(outputEnds, 0, this.outputEnds, 0, logicWidth); + } + + public Pin getInputPin() + { + return inputPin; + } + + /** + * Used to leave bit order intuitive (MSB left or on top) + */ + private static Orientation toggleLeftDownAlt(Orientation orientation) + { + // TODO if we upgrade to Java 12, replace with switch-expression + switch (orientation) + { + case LEFT: + return Orientation.LEFT_ALT; + case LEFT_ALT: + return Orientation.LEFT; + case DOWN: + return Orientation.DOWN_ALT; + case DOWN_ALT: + return Orientation.DOWN; + default: + return orientation; + } + } + + public static class SplitterParams + { + public int logicWidth; + public Orientation orientation; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SplitterAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelSplitter.class.getCanonicalName(), (m, p, n) -> + { + // TODO remove legacy params parsing + SplitterParams params; + if (p.isJsonPrimitive()) + { + params = new SplitterParams(); + params.logicWidth = p.getAsInt(); + params.orientation = Orientation.RIGHT; + } else + params = JsonHandler.fromJsonTree(p, SplitterParams.class); + return new ModelSplitter(m, params, n); + }); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java new file mode 100644 index 00000000..ac0f64d7 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java @@ -0,0 +1,74 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.NoLogicAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.Preferences; + +//TODO clean size calculation mess +public class ModelTextComponent extends ModelComponent +{ + private final String text; + private boolean calculatedSize; + + public ModelTextComponent(LogicModelModifiable model, String text) + { + this(model, text, null); + } + + public ModelTextComponent(LogicModelModifiable model, String text, String name) + { + super(model, name, false); + this.text = text; + // If size is unset, it defaults to 0, which could prohibit this component from being rendered, which would prohibit the size being + // set to a better guess + setSize(1, 1); + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + if (!calculatedSize) + { + calculatedSize = true; + Point textExtent = gc.textExtent(text); + setSize(textExtent.x, textExtent.y); + } + + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(text, getPosX(), getPosY(), true); + } + + // serializing + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "TextComponent"; + } + + @Override + public String getParamsForSerializing(IdentifyParams idParams) + { + return text; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new NoLogicAdapter<>(ModelTextComponent.class)); + IndirectModelComponentCreator.setComponentSupplier(ModelTextComponent.class.getName(), + (m, p, n) -> new ModelTextComponent(m, p.getAsString(), n)); + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java new file mode 100644 index 00000000..93bff320 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java @@ -0,0 +1,126 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import com.google.gson.JsonSyntaxException; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.OrientationCalculator; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.TriStateBufferAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.Preferences; + +public class ModelTriStateBuffer extends ModelComponent +{ + + private static final double width = 20; + private static final double height = 20; + private Pin input; + private Pin output; + private Pin enable; + private double[] path; + + private ModelTriStateBufferParams params; + private OrientationCalculator oc; + + public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params) + { + this(model, params, null); + } + + public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params, String name) + { + super(model, name, false); + this.params = params; + + oc = new OrientationCalculator(params.orientation, width, height); + + double wHalf = width / 2; + double hHalf = height / 2; + double hQuar = height / 4; + + this.input = new Pin(model, this, "IN", params.logicWidth, PinUsage.INPUT, oc.newX(0, hHalf), oc.newY(0, hHalf)); + this.output = new Pin(model, this, "OUT", params.logicWidth, PinUsage.OUTPUT, oc.newX(width, hHalf), oc.newY(width, hHalf)); + this.enable = new Pin(model, this, "EN", 1, PinUsage.INPUT, oc.newX(wHalf, hQuar), oc.newY(wHalf, hQuar)); + this.path = new double[] { oc.newX(0, 0), oc.newY(0, 0), oc.newX(width, hHalf), oc.newY(width, hHalf), oc.newX(0, height), + oc.newY(0, height) }; + + setSize(oc.width(), oc.height()); + addPin(input); + addPin(output); + addPin(enable); + + init(); + } + + public final Pin getInputPin() + { + return input; + } + + public final Pin getOutputPin() + { + return output; + } + + public final Pin getEnablePin() + { + return enable; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + double x = getPosX(); + double y = getPosY(); + gc.drawPolygon(new double[] { x + path[0], y + path[1], x + path[2], y + path[3], x + path[4], y + path[5] }); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "TriStateBuffer"; + } + + @Override + public ModelTriStateBufferParams getParamsForSerializing(IdentifyParams idParams) + { + return params; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new TriStateBufferAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelTriStateBuffer.class.getName(), (m, p, n) -> + { + ModelTriStateBufferParams params = JsonHandler.fromJsonTree(p, ModelTriStateBufferParams.class); + if (params == null) + throw new JsonSyntaxException("Invalid!!!"); + return new ModelTriStateBuffer(m, params, n); + }); + } + + public static class ModelTriStateBufferParams + { + int logicWidth; + Orientation orientation; + + public ModelTriStateBufferParams(int logicWidth, Orientation orientation) + { + this.logicWidth = logicWidth; + this.orientation = orientation; + } + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java new file mode 100644 index 00000000..8971285a --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java @@ -0,0 +1,161 @@ +package net.mograsim.logic.model.model.components.atomic; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleRectangularHardcodedModelComponentAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public abstract class SimpleRectangularHardcodedModelComponent extends ModelComponent +{ + private static final double centerTextHeight = 5; + private static final double pinNamesHeight = 3.5; + private static final double pinNamesMargin = .5; + + private final String id; + + private final DefaultOutlineRenderer outlineRenderer; + private final CenteredTextSymbolRenderer centerTextRenderer; + private final PinNamesSymbolRenderer pinNamesRenderer; + + private AtomicReference state; + private Runnable recalculate; + + // creation and destruction + + public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText) + { + this(model, id, name, centerText, true); + } + + public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText, boolean callInit) + { + super(model, name, false); + this.id = id; + this.outlineRenderer = new DefaultOutlineRenderer(this); + CenteredTextParams centeredTextParams = new CenteredTextParams(); + centeredTextParams.text = centerText; + centeredTextParams.fontHeight = centerTextHeight; + this.centerTextRenderer = new CenteredTextSymbolRenderer(this, centeredTextParams); + PinNamesParams pinNamesParams = new PinNamesParams(); + pinNamesParams.pinLabelHeight = pinNamesHeight; + pinNamesParams.pinLabelMargin = pinNamesMargin; + this.pinNamesRenderer = new PinNamesSymbolRenderer(this, pinNamesParams); + addPinRemovedListener(this::pinRemoved); + setHighLevelStateHandler(new HighLevelStateHandler() + { + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return null;// we don't need to serialize this; it's implicit since we are a SimpleRectangularHardcodedModelComponent + } + + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + @Override + public Object getHighLevelState(String stateID) + { + return SimpleRectangularHardcodedModelComponent.this.getHighLevelState(state.get(), stateID); + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + state.updateAndGet(s -> SimpleRectangularHardcodedModelComponent.this.setHighLevelState(s, stateID, newState)); + recalculate.run(); + } + }); + + if (callInit) + init(); + } + + // pins + + protected void addPin(Pin pin, Position namePosition) + { + super.addPin(pin); // do this first to catch errors + pinNamesRenderer.setPinPosition(pin, namePosition); + } + + private void pinRemoved(Pin pin) + { + pinNamesRenderer.setPinPosition(pin, null); + } + + // high-level access + + @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden + protected Object getHighLevelState(Object state, String stateID) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + // logic + + public abstract Object recalculate(Object lastState, Map readEnds, Map readWriteEnds); + + // core model binding + + public void setCoreModelBindingAndResetState(AtomicReference state, Runnable recalculate) + { + this.state = state; + this.recalculate = recalculate; + } + + // "graphical" operations + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + outlineRenderer.render(gc, visibleRegion); + centerTextRenderer.render(gc, visibleRegion); + pinNamesRenderer.render(gc, visibleRegion); + } + + // serializing + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return id; + } + + // operations no longer supported + + @Override + protected void addPin(Pin pin) + { + throw new UnsupportedOperationException("Can't add pins without setting usage, call addPin(Pin [, Position]) instead"); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleRectangularHardcodedModelComponentAdapter()); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java new file mode 100644 index 00000000..89366013 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java @@ -0,0 +1,122 @@ +package net.mograsim.logic.model.model.components.atomic; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.graphics.Color; + +import com.google.gson.JsonPrimitive; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.preferences.Preferences; + +public class SimpleRectangularModelGate extends ModelComponent +{ + private static final double width = 20; + private static final double pinDistance = 10; + private static final double fontHeight = 5; + private static final double invertedCircleDiam = 3.5; + + private final String id; + + private final String label; + private final boolean isInverted; + protected final int logicWidth; + private final double rectWidth; + + private MovablePin outputPin; + private final List inputPins; + + protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, + String name) + { + this(model, id, label, isInverted, logicWidth, name, true); + } + + protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, + String name, boolean callInit) + { + super(model, name, false); + this.id = id; + this.label = label; + this.logicWidth = logicWidth; + this.isInverted = isInverted; + this.rectWidth = width - (isInverted ? invertedCircleDiam : 0); + this.outputPin = new MovablePin(model, this, "Y", logicWidth, PinUsage.OUTPUT, width, 0); + addPin(outputPin); + this.inputPins = new ArrayList<>(); + setInputCount(1); + + if (callInit) + init(); + } + + protected void setInputCount(int inputCount) + { + int oldInputCount = inputPins.size(); + setSize(width, inputCount * pinDistance); + if (oldInputCount > inputCount) + while (inputPins.size() > inputCount) + removePin(inputPins.remove(inputCount).name); + else if (oldInputCount < inputCount) + for (int i = oldInputCount; i < inputCount; i++) + { + // TODO what for more than 24 input pins? + Pin pin = new Pin(model, this, String.valueOf((char) ('A' + i)), logicWidth, PinUsage.INPUT, 0, + pinDistance / 2 + i * pinDistance); + inputPins.add(pin); + addPin(pin); + } + outputPin.setRelPos(width, inputCount * pinDistance / 2); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + double height = (getPins().size() - 1) * pinDistance; + gc.drawRectangle(getPosX(), getPosY(), rectWidth, height); + if (isInverted) + gc.drawOval(getPosX() + rectWidth, getPosY() + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (rectWidth - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + // serializing + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return id; + } + + /** + * {@link SimpleRectangularModelGate}s implementation returns a {@link JsonPrimitive} of type int containing the {@link #logicWidth} of + * this component. + * + * @see ModelComponent#getParamsForSerializing() + */ + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java new file mode 100644 index 00000000..ef567e92 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java @@ -0,0 +1,134 @@ +package net.mograsim.logic.model.model.components.submodels; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; + +public class SimpleRectangularSubmodelComponent extends SubmodelComponent +{ + public static final double width = 35; + public static final double pinDistance = 10; + public static final double pinNameMargin = .5; + public static final double labelFontHeight = 5; + public static final double pinNameFontHeight = 3.5; + + public final String label; + protected final int logicWidth; + + private final List inputPinNames; + private final List inputPinNamesUnmodifiable; + private final List outputPinNames; + private final List outputPinNamesUnmodifiable; + + public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label) + { + this(model, logicWidth, label, null); + } + + public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name) + { + this(model, logicWidth, label, name, true); + } + + protected SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name, boolean callInit) + { + super(model, name, false); + this.label = label; + this.logicWidth = logicWidth; + this.inputPinNames = new ArrayList<>(); + this.inputPinNamesUnmodifiable = Collections.unmodifiableList(inputPinNames); + this.outputPinNames = new ArrayList<>(); + this.outputPinNamesUnmodifiable = Collections.unmodifiableList(outputPinNames); + + SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams(); + rendererParams.centerText = label; + rendererParams.centerTextHeight = labelFontHeight; + rendererParams.horizontalComponentCenter = width / 2; + rendererParams.pinLabelHeight = pinNameFontHeight; + rendererParams.pinLabelMargin = pinNameMargin; + setSymbolRenderer(new SimpleRectangularLikeSymbolRenderer(this, rendererParams)); + setOutlineRenderer(new DefaultOutlineRenderer(this)); + + if (callInit) + init(); + } + + protected void setInputPins(String... pinNames) + { + setIOPins(0, inputPinNames, outputPinNames, PinUsage.INPUT, pinNames); + } + + protected void setOutputPins(String... pinNames) + { + setIOPins(width, outputPinNames, inputPinNames, PinUsage.OUTPUT, pinNames); + } + + private void setIOPins(double relX, List pinNamesListThisSide, List pinNamesListOtherSide, PinUsage usage, + String... newPinNames) + { + int inputCount = newPinNames.length; + List newPinNamesList = Arrays.asList(newPinNames); + if (new HashSet<>(newPinNamesList).size() != inputCount) + throw new IllegalArgumentException("Pin names contain duplicates"); + for (String pinName : newPinNamesList) + if (pinNamesListOtherSide.contains(pinName)) + throw new IllegalArgumentException("Can't add pin. There is a pin on the other side with the same name: " + pinName); + super.setSize(width, Math.max(inputCount, pinNamesListOtherSide.size()) * pinDistance); + for (int i = 0; i < inputCount; i++) + { + String pinName = newPinNames[i]; + int oldPinIndex = pinNamesListThisSide.indexOf(pinName); + if (oldPinIndex == -1) + super.addSubmodelInterface( + new MovablePin(model, this, pinName, logicWidth, usage, relX, pinDistance / 2 + i * pinDistance)); + else + getSupermodelMovablePin(pinName).setRelPos(relX, pinDistance / 2 + i * pinDistance); + } + for (String pinName : pinNamesListThisSide) + if (!newPinNamesList.contains(pinName)) + super.removeSubmodelInterface(pinName); + pinNamesListThisSide.clear(); + pinNamesListThisSide.addAll(newPinNamesList); + } + + public List getInputPinNames() + { + return inputPinNamesUnmodifiable; + } + + public List getOutputPinNames() + { + return outputPinNamesUnmodifiable; + } + + @Override + protected Pin addSubmodelInterface(MovablePin supermodelPin) + { + throw new UnsupportedOperationException( + "Can't add submodel interfaces to a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); + } + + @Override + protected void removeSubmodelInterface(String name) + { + throw new UnsupportedOperationException( + "Can't remove submodel interfaces of a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); + } + + @Override + protected void setSize(double width, double height) + { + throw new UnsupportedOperationException( + "Can't set the size of a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java new file mode 100644 index 00000000..9388e2fb --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java @@ -0,0 +1,477 @@ +package net.mograsim.logic.model.model.components.submodels; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Consumer; + +import net.haspamelodica.swt.helper.gcs.GCConfig; +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.gcs.TranslatedGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.LogicUIRenderer; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.serializing.SubmodelComponentParams; +import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.Preferences; + +/** + * A {@link ModelComponent} consisting of another model. A SubmodelComponent can have so-called "interface pins" connecting the + * inner and outer models. + */ +public abstract class SubmodelComponent extends ModelComponent +{ + public static final String SUBMODEL_INTERFACE_NAME = "_submodelinterface"; + /** + * A modifiable view of {@link #submodel}. + */ + protected final LogicModelModifiable submodelModifiable; + /** + * The model this {@link SubmodelComponent} consists of. + */ + public final LogicModel submodel; + /** + * The list of all submodel interface pins of this {@link SubmodelComponent} on the submodel side. + */ + private final Map submodelPins; + /** + * An unmodifiable view of {@link #submodelPins}. + */ + private final Map submodelMovablePinsUnmodifiable; + /** + * An unmodifiable view of {@link #submodelPins} where pins are not movable. + */ + private final Map submodelUnmovablePinsUnmodifiable; + /** + * The list of all submodel interface pins of this {@link SubmodelComponent} on the supermodel side. + */ + private final Map supermodelPins; + /** + * An unmodifiable view of {@link #supermodelPins}. + */ + private final Map supermodelMovablePinsUnmodifiable; + /** + * An unmodifiable view of {@link #supermodelPins} where pins are not movable. + */ + private final Map supermodelUnmovablePinsUnmodifiable; + /** + * A pseudo-component containing all submodel interface pins on the submodel side. + */ + private final SubmodelInterface submodelInterface; + + /** + * The factor by which the submodel is scaled when rendering. + */ + private double submodelScale; + /** + * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel starts to + * be visible. + */ + private double maxVisibleRegionFillRatioForAlpha0; + /** + * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is fully + * visible. + */ + private double minVisibleRegionFillRatioForAlpha1; + /** + * The renderer used for rendering the submodel. + */ + private final LogicUIRenderer renderer; + + /** + * The {@link Renderer} used to render the symbol of this SubmodelCoponent. + */ + private Renderer symbolRenderer; + /** + * The {@link Renderer} used to render the outline of this SubmodelCoponent. + */ + private Renderer outlineRenderer; + + // creation and destruction + + public SubmodelComponent(LogicModelModifiable model, String name) + { + this(model, name, true); + } + + protected SubmodelComponent(LogicModelModifiable model, String name, boolean callInit) + { + super(model, name, false); + this.submodelModifiable = new LogicModelModifiable(); + this.submodel = submodelModifiable; + this.submodelPins = new HashMap<>(); + this.submodelMovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); + this.submodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); + this.supermodelPins = new HashMap<>(); + this.supermodelMovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); + this.supermodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); + this.submodelInterface = new SubmodelInterface(submodelModifiable); + + this.submodelScale = 1; + this.maxVisibleRegionFillRatioForAlpha0 = 0.8; + this.minVisibleRegionFillRatioForAlpha1 = 0.9; + this.renderer = new LogicUIRenderer(submodelModifiable); + + Consumer redrawHandlerChangedListener = submodelModifiable::setRedrawHandler; + model.addRedrawHandlerChangedListener(redrawHandlerChangedListener); + model.addComponentRemovedListener(c -> + { + if (c == this) + model.removeRedrawHandlerChangedListener(redrawHandlerChangedListener); + }); + submodelModifiable.setRedrawHandler(model.getRedrawHandler()); + + if (callInit) + init(); + } + + // pins + + /** + * Adds a new submodel interface pin. + * + * @param supermodelPin the submodel interface pin on the supermodel side + * + * @return the submodel interface pin on the submodel side + * + * @author Daniel Kirschten + */ + protected Pin addSubmodelInterface(MovablePin supermodelPin) + { + super.addPin(supermodelPin);// do this first to be fail-fast if the supermodel does not belong to this component + + String name = supermodelPin.name; + // TODO if we upgrade to Java 12, replace with switch-expression + PinUsage submodelPinUsage; + switch (supermodelPin.usage) + { + case INPUT: + submodelPinUsage = PinUsage.OUTPUT; + break; + case OUTPUT: + submodelPinUsage = PinUsage.INPUT; + break; + case TRISTATE: + submodelPinUsage = PinUsage.TRISTATE; + break; + default: + throw new IllegalArgumentException("Unknown enum constant: " + supermodelPin.usage); + } + MovablePin submodelPin = new MovablePin(submodelModifiable, submodelInterface, name, supermodelPin.logicWidth, submodelPinUsage, + supermodelPin.getRelX() / submodelScale, supermodelPin.getRelY() / submodelScale); + + submodelPin.addPinMovedListener(p -> + { + double newRelX = p.getRelX() * submodelScale; + double newRelY = p.getRelY() * submodelScale; + if (supermodelPin.getRelX() != newRelX || supermodelPin.getRelY() != newRelY) + supermodelPin.setRelPos(newRelX, newRelY); + }); + supermodelPin.addPinMovedListener(p -> + { + double newRelX = p.getRelX() / submodelScale; + double newRelY = p.getRelY() / submodelScale; + if (submodelPin.getRelX() != newRelX || submodelPin.getRelY() != newRelY) + submodelPin.setRelPos(newRelX, newRelY); + }); + + submodelInterface.addPin(submodelPin); + + submodelPins.put(name, submodelPin); + supermodelPins.put(name, supermodelPin); + + // no need to call requestRedraw() because addPin() will request a redraw + return submodelPin; + } + + /** + * Removes a submodel interface pin. + * + * @author Daniel Kirschten + */ + protected void removeSubmodelInterface(String name) + { + super.removePin(name);// do this first to be fail-fast if this component doesn't have a pin with the given name + Pin submodelPin = submodelPins.remove(name); + submodelInterface.removePin(submodelPin.name); + supermodelPins.remove(name); + + // no need to call requestRedraw() because removePin() will request a redraw + } + + /** + * Returns a collection of submodel interface pins on the submodel side of this component. + * + * @author Daniel Kirschten + */ + public Map getSubmodelPins() + { + return submodelUnmovablePinsUnmodifiable; + } + + /** + * Returns the submodel interface pin with the given name on the submodel side of this component. + * + * @author Daniel Kirschten + */ + public Pin getSubmodelPin(String name) + { + return getSubmodelMovablePin(name); + } + + /** + * Returns a collection of movable submodel interface pins on the submodel side of this component. + * + * @author Daniel Kirschten + */ + protected Map getSubmodelMovablePins() + { + return submodelMovablePinsUnmodifiable; + } + + /** + * Returns the movable submodel interface pin with the given name on the submodel side of this component. + * + * @author Daniel Kirschten + */ + protected MovablePin getSubmodelMovablePin(String name) + { + return submodelPins.get(name); + } + + /** + * Returns a collection of submodel interface pins on the supermodel side of this component. + * + * @author Daniel Kirschten + */ + public Map getSupermodelPins() + { + return supermodelUnmovablePinsUnmodifiable; + } + + /** + * Returns the submodel interface pin with the given name on the supermodel side of this component. + * + * @author Daniel Kirschten + */ + public Pin getSupermodelPin(String name) + { + return getSupermodelMovablePin(name); + } + + /** + * Returns a collection of movable submodel interface pins on the supermodel side of this component. + * + * @author Daniel Kirschten + */ + protected Map getSupermodelMovablePins() + { + return supermodelMovablePinsUnmodifiable; + } + + /** + * Returns the movable submodel interface pin with the given name on the supermodel side of this component. + * + * @author Daniel Kirschten + */ + protected MovablePin getSupermodelMovablePin(String name) + { + return supermodelPins.get(name); + } + + // "graphical" operations + + /** + * Sets the factor by which the submodel is scaled when rendering and calls redrawListeners. Note that the submodel interface pins will + * stay at their position relative to the supermodel, which means they will move relative to the submodel. + * + * @author Daniel Kirschten + */ + protected void setSubmodelScale(double submodelScale) + { + this.submodelScale = submodelScale; + + for (Entry e : supermodelPins.entrySet()) + getSubmodelMovablePin(e.getKey()).setRelPos(e.getValue().getRelX() * submodelScale, e.getValue().getRelY() * submodelScale); + + model.requestRedraw();// needed if there is no submodel interface pin + } + + /** + * Returns the current factor by which the submodel is scaled when rendering. + * + * @author Daniel Kirschten + */ + public double getSubmodelScale() + { + return submodelScale; + } + + /** + * @see #renderSymbol(GeneralGC, Rectangle) + * + * @author Daniel Kirschten + */ + protected void setSymbolRenderer(Renderer symbolRenderer) + { + this.symbolRenderer = symbolRenderer; + model.requestRedraw(); + } + + /** + * @see #renderSymbol(GeneralGC, Rectangle) + * + * @author Daniel Kirschten + */ + public Renderer getSymbolRenderer() + { + return symbolRenderer; + } + + /** + * @see #renderOutline(GeneralGC, Rectangle) + * + * @author Daniel Kirschten + */ + protected void setOutlineRenderer(Renderer outlineRenderer) + { + this.outlineRenderer = outlineRenderer; + model.requestRedraw(); + } + + /** + * @see #renderOutline(GeneralGC, Rectangle) + * + * @author Daniel Kirschten + */ + public Renderer getOutlineRenderer() + { + return outlineRenderer; + } + + @Override + public boolean clicked(double x, double y) + { + double scaledX = (x - getPosX()) / submodelScale; + double scaledY = (y - getPosY()) / submodelScale; + for (ModelComponent component : submodel.getComponentsByName().values()) + if (component.getBounds().contains(scaledX, scaledY) && component.clicked(scaledX, scaledY)) + return true; + return false; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + GCConfig conf = new GCConfig(gc); + GeneralGC tgc = new TranslatedGC(gc, getPosX(), getPosY(), submodelScale, true); + conf.reset(tgc); + double visibleRegionFillRatio = Math.max(getWidth() / visibleRegion.width, getHeight() / visibleRegion.height); + double alphaFactor = map(visibleRegionFillRatio, maxVisibleRegionFillRatioForAlpha0, minVisibleRegionFillRatioForAlpha1, 0, 1); + alphaFactor = Math.max(0, Math.min(1, alphaFactor)); + // we need to take the old alpha into account to support nested submodules better. + int oldAlpha = gc.getAlpha(); + int submodelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * alphaFactor))); + int labelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * (1 - alphaFactor)))); + if (submodelAlpha != 0) + { + gc.setAlpha(submodelAlpha); + renderer.render(tgc, visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale)); + } + if (labelAlpha != 0) + { + gc.setAlpha(labelAlpha); + renderSymbol(gc, visibleRegion); + } + conf.reset(gc); + // reset line width explicitly to avoid rounding errors causing weird glitches + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + // draw the outline after all other operations to make interface pins look better + renderOutline(gc, visibleRegion); + } + + /** + * Render the symbol of this {@link SubmodelComponent}, e.g. the things that should be hidden if the submodel is drawn. + * + * @author Daniel Kirschten + */ + protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion) + { + if (symbolRenderer != null) + symbolRenderer.render(gc, visibleRegion); + } + + /** + * Render the outline of this {@link SubmodelComponent}, e.g. the graphical elements that should stay visible if the submodel is drawn. + * + * @author Daniel Kirschten + */ + protected void renderOutline(GeneralGC gc, Rectangle visibleRegion) + { + if (outlineRenderer != null) + outlineRenderer.render(gc, visibleRegion); + } + + private static double map(double val, double valMin, double valMax, double mapMin, double mapMax) + { + return mapMin + (val - valMin) * (mapMax - mapMin) / (valMax - valMin); + } + + // serializing + + /** + * {@link SubmodelComponent}'s implementation of {@link ModelComponent#getIDForSerializing(IdentifyParams)} returns "submodel". It is + * recommended to override this behaviour. + * + * @see ModelComponent#getIDForSerializing(IdentifyParams) + * @see ModelComponent#getParamsForSerializing(IdentifyParams) + */ + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "submodel";// TODO what ID? + } + + /** + * {@link SubmodelComponent}'s implementation of {@link ModelComponent#getParamsForSerializing(IdentifyParams)} returns an instance of + * {@link SubmodelComponentParams}. It is recommended to override this behaviour. + * + * @see ModelComponent#getIDForSerializing(IdentifyParams) + * @see ModelComponent#getParamsForSerializing(IdentifyParams) + */ + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return SubmodelComponentSerializer.serialize(this, idParams); + } + + // operations no longer supported + + @Override + protected void addPin(Pin pin) + { + throw new UnsupportedOperationException("Can't add pins to a SubmodelComponent directly, call addSubmodelInterface instead"); + } + + @Override + protected void removePin(String name) + { + throw new UnsupportedOperationException("Can't remove pins of a SubmodelComponent directly, call removeSubmodelInterface instead"); + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(SubmodelComponent.class.getCanonicalName(), + (m, p, n) -> SubmodelComponentSerializer.deserialize(m, JsonHandler.fromJsonTree(p, SubmodelComponentParams.class), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java new file mode 100644 index 00000000..331db123 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java @@ -0,0 +1,57 @@ +package net.mograsim.logic.model.model.components.submodels; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.IdentifyParams; + +public class SubmodelInterface extends ModelComponent +{ + public SubmodelInterface(LogicModelModifiable model) + { + super(model, SubmodelComponent.SUBMODEL_INTERFACE_NAME, true); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + {// nothing to do here + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + throw new UnsupportedOperationException("A SubmodelInterface can't be serialized. Use SubmodelComponent.addSubmodelInterface"); + } + + /** + * {@inheritDoc}
+ * This method is only marked public in {@link SubmodelInterface} for {@link SubmodelComponent} to be able to add / remove pins to / + * from a SubmodelInterface.
+ * + * @see ModelComponent#removePin(Pin) + * + * @author Daniel Kirschten + */ + @Override + public void addPin(Pin pin) + { + super.addPin(pin); + } + + /** + * {@inheritDoc}
+ * This method is only marked public in {@link SubmodelInterface} for {@link SubmodelComponent} to be able to add / remove pins to / + * from a SubmodelInterface.
+ * + * @see ModelComponent#removePin(Pin) + * + * @author Daniel Kirschten + */ + @Override + protected void removePin(String name) + { + super.removePin(name); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java new file mode 100644 index 00000000..1f44f570 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java @@ -0,0 +1,531 @@ +package net.mograsim.logic.model.model.wires; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; + +import org.eclipse.swt.SWT; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +/** + * A wire connecting exactly two {@link Pin}s. + * + * @author Daniel Kirschten + */ +public class ModelWire +{ + /** + * The model this wire is a part of. + */ + private final LogicModelModifiable model; + /** + * The name of this wire. Is unique for all wires in its model. + */ + public final String name; + /** + * The logical width of this wire. Is equal to the logical width of {@link #pin1} and {@link #pin2}. + */ + public final int logicWidth; + /** + * The {@link Pin} on one side of this wire, usually the signal source. + */ + private Pin pin1; + /** + * The {@link Pin} on one side of this wire, usually the signal target. + */ + private Pin pin2; + /** + * The user-defined path between {@link #pin1} and {@link #pin2}.
+ * Special cases: null means "choose an interpolation as fits", and an empty array means "direct connection without any + * interpolation". + */ + private Point[] path; + /** + * The bounds of this wire, excluding line width (and line joins, if the line join is {@link SWT#JOIN_MITER}) + */ + private final Rectangle bounds; + /** + * The effective path of this wire, including automatic interpolation and the position of both {@link Pin}s. Is never null. + */ + private double[] effectivePath; + + private final List> pathChangedListeners; + + /** + * A LogicObserver calling redrawListeners. Used for core model bindings. + */ + private final LogicObserver logicObs; + /** + * A ReadEnd of the core wire this model wire currently is bound to. + */ + private ReadEnd end; + + // creation and destruction + + /** + * Creates a new {@link ModelWire} with automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2) + { + this(model, null, pin1, pin2); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, Pin pin2) + { + this(model, null, pin1, pin2); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, Pin pin1, ModelWireCrossPoint pin2) + { + this(model, null, pin1, pin2); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, Pin pin1, Pin pin2) + { + this(model, null, pin1, pin2); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2, Point... path) + { + this(model, null, pin1, pin2, path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, Pin pin2, Point... path) + { + this(model, null, pin1, pin2, path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, Pin pin1, ModelWireCrossPoint pin2, Point... path) + { + this(model, null, pin1, pin2, path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, Pin pin1, Pin pin2, Point... path) + { + this(model, null, pin1, pin2, path); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2) + { + this(model, name, pin1, pin2, (Point[]) null); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, Pin pin2) + { + this(model, name, pin1, pin2, (Point[]) null); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, Pin pin1, ModelWireCrossPoint pin2) + { + this(model, name, pin1, pin2, (Point[]) null); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, Pin pin1, Pin pin2) + { + this(model, name, pin1, pin2, (Point[]) null); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2, Point... path) + { + this(model, name, pin1.getPin(), pin2.getPin(), path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, Pin pin2, Point... path) + { + this(model, name, pin1.getPin(), pin2, path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, Pin pin1, ModelWireCrossPoint pin2, Point... path) + { + this(model, name, pin1, pin2.getPin(), path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, Pin pin1, Pin pin2, Point... path) + { + this.model = model; + this.name = name == null ? model.getDefaultWireName() : name; + this.logicWidth = pin1.logicWidth; + if (pin2.logicWidth != pin1.logicWidth) + throw new IllegalArgumentException("Can't connect pins of different logic width"); + + this.pin1 = pin1; + this.pin2 = pin2; + + this.path = path == null ? null : Arrays.copyOf(path, path.length); + this.bounds = new Rectangle(0, 0, -1, -1); + + pathChangedListeners = new ArrayList<>(); + + logicObs = (i) -> model.requestRedraw(); + + pin1.addPinMovedListener(p -> pinMoved()); + pin2.addPinMovedListener(p -> pinMoved()); + + recalculateEffectivePath(); + + model.wireCreated(this, this::destroyed); + } + + /** + * Destroys this wire. This method is called from {@link LogicModelModifiable#wireDestroyed(ModelWire) wireDestroyed()} of the model + * this wire is a part of. + * + * @author Daniel Kirschten + */ + private void destroyed() + { + // nothing to do + } + + // pins + + /** + * Returns the {@link Pin} on one side of this wire, usually the signal source. + * + * @author Daniel Kirschten + */ + public Pin getPin1() + { + return pin1; + } + + /** + * Returns the {@link Pin} on one side of this wire, usually the signal target. + * + * @author Daniel Kirschten + */ + public Pin getPin2() + { + return pin2; + } + + /** + * Called when {@link #pin1} or {@link #pin2} were moved. + * + * @author Daniel Kirschten + */ + private void pinMoved() + { + recalculateEffectivePath(); + model.requestRedraw(); + } + + // "graphical" operations + + /** + * Recalculates {@link #effectivePath} "from scratch". Also updates {@link #bounds}. + * + * @author Daniel Kirschten + */ + private void recalculateEffectivePath() + { + Point pos1 = pin1.getPos(), pos2 = pin2.getPos(); + + double boundsX1 = Math.min(pos1.x, pos2.x); + double boundsY1 = Math.min(pos1.y, pos2.y); + double boundsX2 = Math.max(pos1.x, pos2.x); + double boundsY2 = Math.max(pos1.y, pos2.y); + + if (path == null) + effectivePath = new double[] { pos1.x, pos1.y, (pos1.x + pos2.x) / 2, pos1.y, (pos1.x + pos2.x) / 2, pos2.y, pos2.x, pos2.y }; + else + { + effectivePath = new double[path.length * 2 + 4]; + effectivePath[0] = pos1.x; + effectivePath[1] = pos1.y; + for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2) + { + double pathX = path[srcI].x; + double pathY = path[srcI].y; + effectivePath[dstI + 0] = pathX; + effectivePath[dstI + 1] = pathY; + if (pathX < boundsX1) + boundsX1 = pathX; + if (pathX > boundsX2) + boundsX2 = pathX; + if (pathY < boundsY1) + boundsY1 = pathY; + if (pathY > boundsY2) + boundsY2 = pathY; + } + effectivePath[effectivePath.length - 2] = pos2.x; + effectivePath[effectivePath.length - 1] = pos2.y; + } + + bounds.x = boundsX1; + bounds.y = boundsY1; + bounds.width = boundsX2 - boundsX1; + bounds.height = boundsY2 - boundsY1; + } + + /** + * Returns the bounds of this wire, excluding line width (and line joins, if the line join is {@link SWT#JOIN_MITER}) + * + * @author Daniel Kirschten + */ + public Rectangle getBounds() + { + return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); + } + + /** + * Render this wire to the given gc, in absoulute coordinates. + * + * @author Daniel Kirschten + */ + public void render(GeneralGC gc) + { + ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end); + if (wireColor != null) + gc.setForeground(ColorManager.current().toColor(wireColor)); + gc.setLineWidth( + Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); + gc.drawPolyline(effectivePath); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + } + + // operations concerning the path + + /** + * The user-defined path between {@link #pin1} and {@link #pin2}. Note that this is not neccessarily equal to the effective path drawn + * in {@link #render(GeneralGC)}.
+ * Special cases: null means "choose an interpolation as fits", and an empty array means "direct connection without any + * interpolation". + * + * @author Daniel Kirschten + */ + public Point[] getPath() + { + return deepPathCopy(path); + } + + public void setPath(Point... path) + { + this.path = deepPathCopy(path); + recalculateEffectivePath(); + callPathChangedListeners(); + model.requestRedraw(); + } + + public Point getPathPoint(int index) + { + return pointCopy(path[index]); + } + + public void setPathPoint(Point p, int index) + { + path[index] = pointCopy(p); + recalculateEffectivePath(); + callPathChangedListeners(); + model.requestRedraw(); + } + + public void insertPathPoint(Point p, int index) + { + if (path == null) + path = new Point[] { pointCopy(p) }; + else + { + Point[] oldPath = path; + path = new Point[oldPath.length + 1]; + System.arraycopy(oldPath, 0, path, 0, index); + if (index < oldPath.length) + System.arraycopy(oldPath, index, path, index + 1, oldPath.length - index); + path[index] = pointCopy(p); + } + recalculateEffectivePath(); + callPathChangedListeners(); + } + + public void removePathPoint(int index) + { + if (path.length == 0) + path = null; + else + { + Point[] oldPath = path; + path = new Point[oldPath.length - 1]; + System.arraycopy(oldPath, 0, path, 0, index); + if (index < oldPath.length - 1) + System.arraycopy(oldPath, index + 1, path, index, oldPath.length - index - 1); + } + recalculateEffectivePath(); + callPathChangedListeners(); + } + + public double[] getEffectivePath() + { + return Arrays.copyOf(effectivePath, effectivePath.length); + } + + private static Point[] deepPathCopy(Point[] path) + { + if (path == null) + return null; + Point[] copy = new Point[path.length]; + for (int i = 0; i < path.length; i++) + copy[i] = pointCopy(path[i]); + return copy; + } + + private static Point pointCopy(Point p) + { + return new Point(p.x, p.y); + } + + // core model binding + + /** + * Binds this {@link ModelWire} to the given {@link ReadEnd}: The color of this {@link ModelWire} will now depend on the state of the + * given {@link ReadEnd}, and further changes of the given {@link ReadEnd} will result in readrawListeners being called.
+ * The argument can be null, in which case the old binding is stopped. + * + * @author Daniel Kirschten + */ + public void setCoreModelBinding(ReadEnd end) + { + if (this.end != null) + this.end.deregisterObserver(logicObs); + this.end = end; + if (end != null) + end.registerObserver(logicObs); + } + + /** + * Returns whether this {@link ModelWire} has a core model binding or not. + * + * @author Daniel Kirschten + */ + public boolean hasCoreModelBinding() + { + return end != null; + } + + /** + * If this {@link ModelWire} has a core model binding, delegates to {@link CoreWire#forceValues(BitVector)} for the {@link CoreWire} + * corresponding to this {@link ModelWire}. + * + * @author Daniel Kirschten + */ + public void forceWireValues(BitVector values) + { + end.getWire().forceValues(values); + } + + /** + * If this {@link ModelWire} has a core model binding, delegates to {@link ReadEnd#getValues()} for the {@link ReadEnd} corresponding to + * this {@link ModelWire}. + * + * @author Daniel Kirschten + */ + public BitVector getWireValues() + { + return end.getValues(); + } + + // listeners + + // @formatter:off + public void addPathChangedListener (Consumer listener) {pathChangedListeners.add (listener);} + + public void removePathChangedListener(Consumer listener) {pathChangedListeners.remove(listener);} + + private void callPathChangedListeners() {pathChangedListeners.forEach(l -> l.accept(this));} + // @formatter:on + + @Override + public String toString() + { + return "ModelWire [" + pin1 + "---" + pin2 + ", value=" + (end == null ? "null" : end.getValues()) + "]"; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java new file mode 100644 index 00000000..b9a5ccc6 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java @@ -0,0 +1,140 @@ +package net.mograsim.logic.model.model.wires; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; + +/** + * A {@link ModelComponent} with only one pin. Is used to create wires connecting more than two pins.
+ * Example: There are three pins P1, P2, P3 that need to be connected. Solution: Create a + * ModelWireCrossPoint (WCP) and create the ModelWires P1-WCP, P2-WCP, + * P3-WCP.
+ * Cross points are drawn as circles. The pin of cross points is in the center of this circle. + * + * @author Daniel Kirschten + */ +public class ModelWireCrossPoint extends ModelComponent +{ + private static final int CIRCLE_RADIUS = 1; + private static final int CIRCLE_DIAM = CIRCLE_RADIUS * 2; + + /** + * The logical width of this cross point. + */ + public final int logicWidth; + /** + * The (single) pin of this cross point. + */ + private final Pin pin; + + /** + * A {@link LogicObserver} calling {@link #requestRedraw()}. + */ + private final LogicObserver logicObs; + /** + * The {@link ReadEnd} currently bound to this cross point. + */ + private ReadEnd end; + + // creation and destruction + + public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth, String name) + { + super(model, name, false); + this.logicWidth = logicWidth; + logicObs = (i) -> model.requestRedraw(); + + setSize(CIRCLE_DIAM, CIRCLE_DIAM); + addPin(this.pin = new Pin(model, this, "", logicWidth, PinUsage.TRISTATE, CIRCLE_RADIUS, CIRCLE_RADIUS)); + + init(); + } + + // pins + + public Pin getPin() + { + return pin; + } + + // "graphical" operations + + /** + * Moves the center (and therefore the pin) of this {@link ModelWireCrossPoint} to the given location. + * + * @author Daniel Kirschten + */ + public void moveCenterTo(double x, double y) + { + moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end); + if (wireColor != null) + gc.setBackground(ColorManager.current().toColor(wireColor)); + gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); + } + + // core model binding + + /** + * Binds this {@link ModelWireCrossPoint} to the given {@link ReadEnd}: The color of this {@link ModelWireCrossPoint} will now depend on + * the state of the given {@link ReadEnd}, and further changes of the given {@link ReadEnd} will result in readrawListeners being + * called.
+ * The argument can be null, in which case the old binding is stopped. + * + * @author Daniel Kirschten + */ + public void setCoreModelBinding(ReadEnd end) + { + if (this.end != null) + this.end.deregisterObserver(logicObs); + this.end = end; + if (end != null) + end.registerObserver(logicObs); + } + + /** + * Returns whether this {@link ModelWireCrossPoint} has a core model binding or not. + */ + public boolean hasCoreModelBinding() + { + return end != null; + } + + // serializing + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "WireCrossPoint"; + } + + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelWireCrossPoint.class.getCanonicalName(), + (m, p, n) -> new ModelWireCrossPoint(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java new file mode 100644 index 00000000..c2291f81 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java @@ -0,0 +1,24 @@ +package net.mograsim.logic.model.model.wires; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; + +/** + * Exactly like {@link Pin}, but {@link #setRelPos(double, double) setRelPos(...)} is public. + * + * @author Daniel Kirschten + */ +public class MovablePin extends Pin +{ + public MovablePin(LogicModelModifiable model, ModelComponent component, String name, int logicWidth, PinUsage usage, double relX, + double relY) + { + super(model, component, name, logicWidth, usage, relX, relY); + } + + @Override + public void setRelPos(double relX, double relY) + { + super.setRelPos(relX, relY); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java new file mode 100644 index 00000000..e9136416 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java @@ -0,0 +1,168 @@ +package net.mograsim.logic.model.model.wires; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.Consumer; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; + +/** + * A connection interface between a ModelComponent and the rest of a LogicModel. Pins usually are created by {@link ModelComponent}s + * themselves.
+ * A pin has a name identifying it. Pin names are unique for a {@link ModelComponent}: Every pin of a {@link ModelComponent} has a different + * name, but different {@link ModelComponent}s can have pins with the same name. + * + * @author Daniel Kirschten + */ +public class Pin +{ + /** + * The {@link LogicModel} the component this pin belongs to is a part of. + */ + private final LogicModelModifiable model; + /** + * The {@link ModelComponent} this pin belongs to. + */ + public final ModelComponent component; + /** + * The name identifying this pin. Is unique for a {@link ModelComponent}. + */ + public final String name; + /** + * The logical width of this pin. Denotes how many bits this pin consists of. + */ + public final int logicWidth; + /** + * How this pin is used by the component it belongs to.
+ * Note that this is only a hint. + */ + public final PinUsage usage; + + /** + * The X position of this pin, relative to its component's location. + */ + protected double relX; + /** + * The Y position of this pin, relative to its component's location. + */ + protected double relY; + + private final List> pinMovedListeners; + private final List redrawListeners; + + // creation and destruction + + /** + * Creates a new pin. Usually it is not needed to call this constructor manually, as {@link ModelComponent}s create their pins + * themselves. + * + * @author Daniel Kirschten + */ + public Pin(LogicModelModifiable model, ModelComponent component, String name, int logicWidth, PinUsage usage, double relX, double relY) + { + this.model = model; + this.component = component; + this.name = name; + this.logicWidth = logicWidth; + this.usage = Objects.requireNonNull(usage); + this.relX = relX; + this.relY = relY; + + this.pinMovedListeners = new ArrayList<>(); + this.redrawListeners = new ArrayList<>(); + + component.addComponentMovedListener(c -> callPinMovedListeners()); + } + + /** + * Destroys this pin by removing all wires connected to it from the model the component is a part of.
+ * Don't call this method from application code as it is automatically called in {@link ModelComponent#removePin(String)}. + */ + public void destroyed() + { + Set connectedWires = new HashSet<>(); + for (ModelWire w : model.getWiresByName().values()) + if (w.getPin1() == this || w.getPin2() == this) + connectedWires.add(w); + connectedWires.forEach(model::destroyWire); + } + + // "graphical" operations + + /** + * Returns the X position of this pin relative to the position of its component. + * + * @author Daniel Kirschten + */ + public double getRelX() + { + return relX; + } + + /** + * Returns the Y position of this pin relative to the position of its component. + * + * @author Daniel Kirschten + */ + public double getRelY() + { + return relY; + } + + /** + * Returns the position of this pin relative to the position of its component. + * + * @author Daniel Kirschten + */ + public Point getRelPos() + { + return new Point(relX, relY); + } + + /** + * Returns the absolute position of this pin. + * + * @author Daniel Kirschten + */ + public Point getPos() + { + return new Point(relX + component.getPosX(), relY + component.getPosY()); + } + + /** + * Sets the position of this pin relative to the position of its component. + * + * @author Daniel Kirschten + */ + protected void setRelPos(double relX, double relY) + { + this.relX = relX; + this.relY = relY; + callPinMovedListeners(); + callRedrawListeners(); + } + + // listeners + + // @formatter:off + public void addPinMovedListener (Consumer listener){pinMovedListeners.add (listener);} + public void addRedrawListener (Runnable listener){redrawListeners .add (listener);} + + public void removePinMovedListener(Consumer listener){pinMovedListeners.remove(listener);} + public void removeRedrawListener (Runnable listener){redrawListeners .remove(listener);} + + private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));} + private void callRedrawListeners () {redrawListeners .forEach(l -> l.run ( ));} + // @formatter:on + + @Override + public String toString() + { + return "Pin " + name + " of " + component.getName(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java new file mode 100644 index 00000000..f229d023 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java @@ -0,0 +1,18 @@ +package net.mograsim.logic.model.model.wires; + +public enum PinUsage +{ + /** + * The component never affects the value of the wire connected to the pin. + */ + INPUT, + /** + * The component is never affected by the value of the wire connected to this pin. This includes the look of the component. + */ + OUTPUT, + /** + * The component (sometimes) affects the value of the wire connected to the pin, but is also (sometimes) affected by the value of this + * wire. + */ + TRISTATE; +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java new file mode 100644 index 00000000..db3b5ac6 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java @@ -0,0 +1,7 @@ +package net.mograsim.logic.model.modeladapter; + +public class CoreModelParameters +{ + public int wireTravelTime; + public int gateProcessTime; +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java new file mode 100644 index 00000000..70f256ab --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java @@ -0,0 +1,165 @@ +package net.mograsim.logic.model.modeladapter; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; + +public class LogicCoreAdapter +{ + private final static Map, ComponentAdapter> componentAdapters = new HashMap<>(); + + public static void addComponentAdapter(ComponentAdapter componentAdapter) + { + componentAdapters.put(componentAdapter.getSupportedClass(), componentAdapter); + } + + public static Timeline convert(LogicModel logicModel, CoreModelParameters params) + { + // TODO replace Timeline with CoreModel as soon as it exists + Timeline timeline = new Timeline(10); + + convert(logicModel, params, timeline, Map.of()); + + return timeline; + } + + private static void convert(LogicModel logicModel, CoreModelParameters params, Timeline timeline, Map externalWires) + { + Map logicWiresPerPin = convertWires(getAllPins(logicModel), logicModel.getWiresByName().values(), externalWires, + params, timeline); + Map logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin); + + for (ModelComponent modelComp : logicModel.getComponentsByName().values()) + { + if (modelComp instanceof SubmodelComponent) + { + SubmodelComponent modelCompCasted = (SubmodelComponent) modelComp; + Map supermodelPins = modelCompCasted.getSupermodelPins(); + Map externalWiresForSubmodel = supermodelPins.entrySet().stream().collect( + Collectors.toMap(e -> modelCompCasted.getSubmodelPin(e.getKey()), e -> logicWiresPerPin.get(e.getValue()))); + convert(modelCompCasted.submodel, params, timeline, externalWiresForSubmodel); + } else if (modelComp instanceof ModelWireCrossPoint) + { + ModelWireCrossPoint modelCompCasted = (ModelWireCrossPoint) modelComp; + modelCompCasted.setCoreModelBinding(logicWiresPerPin.get(modelCompCasted.getPin()).createReadOnlyEnd()); + } else if (!(modelComp instanceof SubmodelInterface))// nothing to do for SubmodelInterfaces + createAndLinkComponent(timeline, params, modelComp, logicWiresPerPinUnmodifiable); + } + } + + private static Set getAllPins(LogicModel logicModel) + { + return logicModel.getComponentsByName().values().stream().flatMap(component -> component.getPins().values().stream()) + .collect(Collectors.toSet()); + } + + private static Map convertWires(Set allPins, Collection wires, Map externalWires, + CoreModelParameters params, Timeline timeline) + { + Map> connectedPinGroups = getConnectedPinGroups(allPins, wires); + Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups, externalWires); + setModelWiresCoreModelBinding(wires, logicWiresPerPin); + return logicWiresPerPin; + } + + private static Map createLogicWires(CoreModelParameters params, Timeline timeline, Map> connectedPinGroups, + Map externalWires) + { + Map logicWiresPerPin = new HashMap<>(); + Map, CoreWire> logicWiresPerPinGroup = new HashMap<>(); + for (Entry> e : connectedPinGroups.entrySet()) + logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(), set -> + { + CoreWire externalWire = null; + for (Pin p : set) + { + CoreWire externalWireCandidate = externalWires.get(p); + if (externalWireCandidate != null) + if (externalWire == null) + externalWire = externalWireCandidate; + else if (externalWire.width == externalWireCandidate.width) + CoreWire.fuse(externalWire, externalWireCandidate); + else + throw new IllegalArgumentException( + "Two pins to external wires with different logicWidths can't be connected directly"); + } + return externalWire == null ? new CoreWire(timeline, e.getKey().logicWidth, params.wireTravelTime) : externalWire; + })); + return logicWiresPerPin; + } + + private static void setModelWiresCoreModelBinding(Collection wires, Map logicWiresPerPin) + { + Map modelWireSharedReadEnd = logicWiresPerPin.values().stream().distinct() + .collect(Collectors.toMap(Function.identity(), CoreWire::createReadOnlyEnd)); + for (ModelWire modelWire : wires) + modelWire.setCoreModelBinding(modelWireSharedReadEnd.get(logicWiresPerPin.get(modelWire.getPin1()))); + } + + private static Map> getConnectedPinGroups(Set allPins, Collection wires) + { + Map> connectedPinsPerPin = new HashMap<>(); + + for (Pin p : allPins) + { + HashSet connectedPins = new HashSet<>(); + connectedPins.add(p); + connectedPinsPerPin.put(p, connectedPins); + } + + wires.forEach(wire -> + { + Pin pin1 = wire.getPin1(); + Pin pin2 = wire.getPin2(); + + Set pin1ConnectedPins = connectedPinsPerPin.get(pin1); + Set pin2ConnectedPins = connectedPinsPerPin.get(pin2); + + pin1ConnectedPins.addAll(pin2ConnectedPins); + pin1ConnectedPins.add(pin1); + pin1ConnectedPins.add(pin2); + + pin2ConnectedPins.forEach(pin -> connectedPinsPerPin.put(pin, pin1ConnectedPins)); + }); + return connectedPinsPerPin; + } + + @SuppressWarnings("unchecked") + private static void createAndLinkComponent(Timeline timeline, CoreModelParameters params, + ModelComponent modelComponent, Map logicWiresPerPin) + { + Class cls = modelComponent.getClass(); + ComponentAdapter adapter = null; + while (cls != ModelComponent.class && adapter == null) + { + adapter = (ComponentAdapter) componentAdapters.get(cls); + cls = cls.getSuperclass(); + } + if (adapter == null) + throw new IllegalArgumentException("Unknown component class: " + modelComponent.getClass()); + adapter.createAndLinkComponent(timeline, params, (G) modelComponent, logicWiresPerPin); + } + + private LogicCoreAdapter() + { + throw new UnsupportedOperationException("No LogicCoreAdapter instances"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java new file mode 100644 index 00000000..517e9464 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class BitDisplayAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelBitDisplay.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelBitDisplay modelComponent, + Map logicWiresPerPin) + { + ReadEnd end = logicWiresPerPin.get(modelComponent.getInputPin()).createReadOnlyEnd(); + CoreBitDisplay bitDisplay = new CoreBitDisplay(timeline, end); + modelComponent.setCoreModelBinding(bitDisplay); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java new file mode 100644 index 00000000..adcda831 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java @@ -0,0 +1,31 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.ModelClock; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class ClockAdapter implements ComponentAdapter +{ + + @Override + public Class getSupportedClass() + { + return ModelClock.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelClock modelClock, + Map logicWiresPerPin) + { + ReadWriteEnd out = logicWiresPerPin.get(modelClock.getOutputPin()).createReadWriteEnd(); + CoreClock c = new CoreClock(timeline, out, modelClock.getDelta()); + modelClock.setCoreModelBinding(c); + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java new file mode 100644 index 00000000..d7f2d2cf --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java @@ -0,0 +1,17 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public interface ComponentAdapter +{ + public Class getSupportedClass(); + + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, G modelComponent, + Map logicWiresPerPin); +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java new file mode 100644 index 00000000..f8236652 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java @@ -0,0 +1,25 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.model.model.components.atomic.ModelFixedOutput; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class FixedOutputAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelFixedOutput.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelFixedOutput modelComponent, + Map logicWiresPerPin) + { + logicWiresPerPin.get(modelComponent.getPin("out")).createReadWriteEnd().feedSignals(modelComponent.bits); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java new file mode 100644 index 00000000..75305f61 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class ManualSwitchAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelManualSwitch.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelManualSwitch modelComponent, + Map logicWiresPerPin) + { + ReadWriteEnd end = logicWiresPerPin.get(modelComponent.getOutputPin()).createReadWriteEnd(); + CoreManualSwitch manualSwitch = new CoreManualSwitch(timeline, end); + modelComponent.setCoreModelBinding(manualSwitch); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java new file mode 100644 index 00000000..22d61122 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java @@ -0,0 +1,34 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.components.atomic.ModelMerger; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class MergerAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelMerger.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelMerger modelComponent, + Map logicWiresPerPin) + { + CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O")); + ReadEnd[] inputEnds = new ReadEnd[modelComponent.logicWidth]; + for (int i = 0; i < modelComponent.logicWidth; i++) + { + CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I" + (modelComponent.logicWidth - 1 - i))); + CoreWire.fuse(input, output, 0, i); + inputEnds[i] = input.createReadOnlyEnd(); + } + modelComponent.setCoreModelBinding(inputEnds, output.createReadOnlyEnd()); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java new file mode 100644 index 00000000..ea87e78e --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java @@ -0,0 +1,36 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +/** + * For ModelComponents that do not have any simulation logic behaviour + * + * @author Christian Femers + */ +public class NoLogicAdapter implements ComponentAdapter +{ + private final Class modelComponentClass; + + public NoLogicAdapter(Class modelComponentClass) + { + this.modelComponentClass = modelComponentClass; + } + + @Override + public Class getSupportedClass() + { + return modelComponentClass; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, T modelComponent, Map logicWiresPerPin) + { + // do nothing + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java new file mode 100644 index 00000000..c38883e6 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java @@ -0,0 +1,50 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularModelGate; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class SimpleGateAdapter implements ComponentAdapter +{ + private final Class supportedClass; + private final ComponentConstructor constructor; + + public SimpleGateAdapter(Class supportedClass, ComponentConstructor constructor) + { + this.supportedClass = supportedClass; + this.constructor = constructor; + } + + @Override + public Class getSupportedClass() + { + return supportedClass; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, G modelComponent, Map logicWiresPerPin) + { + ReadWriteEnd out = logicWiresPerPin.get(modelComponent.getPin("Y")).createReadWriteEnd(); + + // TODO can we do this prettier? + int inputPinCount = modelComponent.getPins().size() - 1; + ReadEnd[] ins = new ReadEnd[inputPinCount]; + for (int i = 0; i < inputPinCount; i++) + ins[i] = logicWiresPerPin.get(modelComponent.getPin(String.valueOf((char) ('A' + i)))).createReadOnlyEnd(); + + constructor.newComponent(timeline, params.gateProcessTime, out, ins); + } + + public static interface ComponentConstructor + { + public CoreComponent newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins); + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java new file mode 100644 index 00000000..dbebc0ff --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java @@ -0,0 +1,55 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class SimpleRectangularHardcodedModelComponentAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return SimpleRectangularHardcodedModelComponent.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, + SimpleRectangularHardcodedModelComponent modelComponent, Map logicWiresPerPin) + { + Map readEnds = new HashMap<>(); + Map readWriteEnds = new HashMap<>(); + + AtomicReference state = new AtomicReference<>(); + + Runnable recalculate = () -> state.updateAndGet(s -> modelComponent.recalculate(s, readEnds, readWriteEnds)); + LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime); + + modelComponent.setCoreModelBindingAndResetState(state, recalculate); + + for (Pin pin : modelComponent.getPins().values()) + { + CoreWire wire = logicWiresPerPin.get(pin); + ReadEnd end; + if (pin.usage != PinUsage.INPUT) + { + ReadWriteEnd rwEnd = wire.createReadWriteEnd(); + readWriteEnds.put(pin.name, rwEnd); + end = rwEnd; + } else + end = wire.createReadOnlyEnd(); + readEnds.put(pin.name, end); + if (pin.usage != PinUsage.OUTPUT) + end.registerObserver(logicObs); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java new file mode 100644 index 00000000..3cfa5f28 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java @@ -0,0 +1,34 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.components.atomic.ModelSplitter; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class SplitterAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelSplitter.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelSplitter modelComponent, + Map logicWiresPerPin) + { + CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I")); + ReadEnd[] outputEnds = new ReadEnd[modelComponent.logicWidth]; + for (int i = 0; i < modelComponent.logicWidth; i++) + { + CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O" + (modelComponent.logicWidth - 1 - i))); + CoreWire.fuse(input, output, i, 0); + outputEnds[i] = output.createReadOnlyEnd(); + } + modelComponent.setCoreModelBinding(input.createReadOnlyEnd(), outputEnds); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java new file mode 100644 index 00000000..56a838b7 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreTriStateBuffer; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class TriStateBufferAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelTriStateBuffer.class; + } + + @SuppressWarnings("unused") + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelTriStateBuffer modelTsb, + Map logicWiresPerPin) + { + ReadEnd in = logicWiresPerPin.get(modelTsb.getPin("IN")).createReadOnlyEnd(); + ReadEnd enable = logicWiresPerPin.get(modelTsb.getPin("EN")).createReadOnlyEnd(); + ReadWriteEnd out = logicWiresPerPin.get(modelTsb.getPin("OUT")).createReadWriteEnd(); + new CoreTriStateBuffer(timeline, params.gateProcessTime, in, out, enable); + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java new file mode 100644 index 00000000..3a2623ed --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java @@ -0,0 +1,33 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.io.InputStream; + +public abstract class ClassLoaderBasedResourceLoader implements ResourceLoader +{ + @Override + public InputStream loadResource(String path) throws IOException + { + return getClassLoader().getResourceAsStream(path); + } + + @Override + public Class loadClass(String name) throws ClassNotFoundException + { + return ReflectionHelper.tryInvokeStaticInitializer(name, getClassLoader()); + } + + public abstract ClassLoader getClassLoader(); + + public static ClassLoaderBasedResourceLoader create(ClassLoader loader) + { + return new ClassLoaderBasedResourceLoader() + { + @Override + public ClassLoader getClassLoader() + { + return loader; + } + }; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java new file mode 100644 index 00000000..8e4d459c --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java @@ -0,0 +1,109 @@ +package net.mograsim.logic.model.serializing; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.Renderer; + +public class DeserializedSubmodelComponent extends SubmodelComponent +{ + /** + * If a DeserializedSubmodelComponent is part of another SubmodelComponent, when it it serialized, it should not return its internal + * structure, but rather the component ID used to create it. + * + * @see SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) + * SubmodelComponentSerializer.deserialize(...) + * @see SubmodelComponentSerializer#serialize(SubmodelComponent, java.util.function.Function) SubmodelComponentSerializer.serialize(...) + */ + public final String idForSerializingOverride; + /** + * See {@link #idForSerializingOverride} + */ + public final Object paramsForSerializingOverride; + + public DeserializedSubmodelComponent(LogicModelModifiable model, String name, String idForSerializingOverride, + Object paramsForSerializingOverride) + { + super(model, name, false); + this.idForSerializingOverride = idForSerializingOverride; + this.paramsForSerializingOverride = paramsForSerializingOverride; + init(); + } + + /** + * If this component has an {@link #idForSerializingOverride} set (e.g. non-null) (see + * {@link SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) + * SubmodelComponentSerializer.deserialize(...)}), this ID is returned
+ * If this case doesn't apply (this component has no {@link #idForSerializingOverride} set), + * {@link SubmodelComponent#getIDForSerializing(IdentifyParams)} is invoced. + */ + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return idForSerializingOverride == null ? super.getIDForSerializing(idParams) : idForSerializingOverride; + } + + /** + * If this component has an {@link #idForSerializingOverride} set (e.g. non-null) (see + * {@link SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) + * SubmodelComponentSerializer.deserialize(...)}), {@link #paramsForSerializingOverride} is returned
+ * If this case doesn't apply (this component has no {@link #idForSerializingOverride} set), + * {@link SubmodelComponent#getParamsForSerializing(IdentifyParams)} is invoced. + */ + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return idForSerializingOverride == null ? super.getParamsForSerializing(idParams) : paramsForSerializingOverride; + } + + @Override + public void setSymbolRenderer(Renderer symbolRenderer) + { + super.setSymbolRenderer(symbolRenderer); + } + + @Override + public void setOutlineRenderer(Renderer outlineRenderer) + { + super.setOutlineRenderer(outlineRenderer); + } + + @Override + public void setHighLevelStateHandler(HighLevelStateHandler handler) + { + super.setHighLevelStateHandler(handler); + } + + public LogicModelModifiable getSubmodelModifiable() + { + return submodelModifiable; + } + + @Override + public void setSubmodelScale(double submodelScale) + { + super.setSubmodelScale(submodelScale); + } + + @Override + public void setSize(double width, double height) + { + super.setSize(width, height); + } + + @Override + public Pin addSubmodelInterface(MovablePin supermodelPin) + { + return super.addSubmodelInterface(supermodelPin); + } + + @Override + public void removeSubmodelInterface(String name) + { + super.removeSubmodelInterface(name); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java new file mode 100644 index 00000000..bf6cf617 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java @@ -0,0 +1,6 @@ +package net.mograsim.logic.model.serializing; + +public class IdentifyParams +{ + // maybe we find something to put here... +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java new file mode 100644 index 00000000..c149848a --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java @@ -0,0 +1,226 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.logic.model.util.Version; + +public class IndirectModelComponentCreator +{ + public static final Version CURRENT_STD_ID_MAPPING_VERSION = Version.parseSemver("0.1.0"); + + private static final Map standardComponentIDs = new HashMap<>(); + private static final Map standardComponentIDsUnmodifiable = Collections.unmodifiableMap(standardComponentIDs); + + private static final Map componentSuppliers = new HashMap<>(); + private static final Map resourceLoaders = new HashMap<>(); + private static final Map componentCache = new HashMap<>(); + + private static final ResourceLoader defaultResourceLoader; + static + { + defaultResourceLoader = ClassLoaderBasedResourceLoader.create(IndirectModelComponentCreator.class.getClassLoader()); + loadStandardComponentIDs(IndirectModelComponentCreator.class.getResourceAsStream("standardComponentIDMapping.json")); + } + + public static void loadStandardComponentIDs(InputStream standardComponentIdMappingStream) + { + try (InputStream s = standardComponentIdMappingStream) + { + if (s == null) + throw new IOException("Resource not found"); + Map tmp = JsonHandler.readJson(s, StandardComponentIdMappingContainer.class).getMap(); + // don't use putAll to apply sanity checks + tmp.forEach((st, id) -> + { + try + { + addStandardComponentID(st, id); + } + catch (IllegalArgumentException e) + { + System.err.println("Component ID mapping contained illegal entry: " + e.getMessage()); + } + }); + } + catch (IOException e) + { + System.err.println("Failed to initialize standard snippet ID mapping: " + e.getMessage()); + } + } + + public static void addStandardComponentID(String standardComponentID, String associatedComponentID) + { + if (!checkIDIsValidResolvedID(associatedComponentID)) + throw new IllegalArgumentException("Unrecognized component ID format: " + associatedComponentID); + standardComponentIDs.put(standardComponentID, associatedComponentID); + } + + public static Map getStandardComponentIDs() + { + return standardComponentIDsUnmodifiable; + } + + public static void setComponentSupplier(String id, ComponentSupplier componentSupplier) + { + componentSuppliers.put(id, componentSupplier); + } + + public static ModelComponent createComponent(LogicModelModifiable model, String id) + { + return createComponent(model, id, (String) null); + } + + public static ModelComponent createComponent(LogicModelModifiable model, String id, String name) + { + return createComponent(model, id, JsonNull.INSTANCE, name); + } + + public static ModelComponent createComponent(LogicModelModifiable model, String id, JsonElement params) + { + return createComponent(model, id, params, null); + } + + public static ModelComponent createComponent(LogicModelModifiable model, String id, JsonElement params, String name) + { + if (id == null) + throw new NullPointerException("Component ID is null"); + if (componentCache.containsKey(id)) + return loadComponentFromJsonObject(model, id, name, componentCache.get(id)); + String resolvedID = resolveID(id); + if (resolvedID == null) + throw new IllegalArgumentException("Unknown standard ID or illegal resolved ID: " + id); + String[] parts = resolvedID.split(":"); + String firstPart = parts[0]; + if (firstPart.equals("jsonfile")) + { + JsonObject jsonContents; + try + { + // don't use parts[1], because the path could contain ':' + jsonContents = JsonHandler.readJson(resolvedID.substring("jsonfile:".length()), JsonObject.class); + } + catch (IOException e) + { + throw new UncheckedIOException("Error loading JSON file", e); + } + return loadComponentFromJsonObject(model, id, name, jsonContents); + } + ResourceLoader loader; + String resTypeID; + String resID; + if (firstPart.equals("resloader")) + { + String loaderID = parts[1]; + loader = resourceLoaders.get(loaderID); + if (loader == null) + tryLoadResourceLoader(loaderID); + loader = resourceLoaders.get(loaderID); + if (loader == null) + throw new IllegalArgumentException( + "Unknown resource loader: " + loaderID + " (but class was found. Probably the static initializer is missing)"); + resTypeID = parts[2]; + resID = parts[3]; + } else + { + loader = defaultResourceLoader; + resTypeID = parts[0]; + resID = parts[1]; + } + if (resTypeID.equals("jsonres")) + { + JsonObject jsonContents; + try + { + @SuppressWarnings("resource") // jsonStream is closed in JsonHandler + InputStream jsonStream = Objects.requireNonNull(loader.loadResource(resID), "Error loading JSON resource: Not found"); + jsonContents = JsonHandler.readJson(jsonStream, JsonObject.class); + } + catch (IOException e) + { + throw new UncheckedIOException("Error loading JSON resource", e); + } + return loadComponentFromJsonObject(model, id, name, jsonContents); + } else if (resTypeID.equals("class")) + { + ComponentSupplier componentSupplier = componentSuppliers.get(resID); + if (componentSupplier == null) + try + { + loader.loadClass(resID); + } + catch (@SuppressWarnings("unused") ClassNotFoundException e) + { + throw new IllegalArgumentException("Unknown component supplier: " + resID); + } + componentSupplier = componentSuppliers.get(resID); + if (componentSupplier == null) + throw new IllegalArgumentException( + "Unknown component supplier: " + resID + " (but class was found. Probably the static initializer is missing)"); + return componentSupplier.create(model, params, name); + } else + throw new IllegalStateException("Unknown resource type ID: " + resTypeID); + } + + public static String resolveID(String id) + { + if (checkIDIsValidResolvedID(id)) + return id; + return standardComponentIDs.get(id); + } + + private static boolean checkIDIsValidResolvedID(String id) + { + return id.matches("jsonfile:(.+)|(resloader:([^:]+):)?(jsonres|class):[^:]+"); + } + + private static SubmodelComponent loadComponentFromJsonObject(LogicModelModifiable model, String id, String name, + JsonObject jsonContents) + { + componentCache.putIfAbsent(id, jsonContents); + SerializablePojo jsonContentsAsSerializablePojo = JsonHandler.parser.fromJson(jsonContents, SerializablePojo.class); + if (jsonContentsAsSerializablePojo.version == null) + return LegacySubmodelComponentSerializer.deserialize(model, + JsonHandler.parser.fromJson(jsonContents, LegacySubmodelComponentParams.class), name, id, null); + return SubmodelComponentSerializer.deserialize(model, JsonHandler.parser.fromJson(jsonContents, SubmodelComponentParams.class), + name, id, null); + } + + public static void registerResourceLoader(ResourceLoader resourceLoader) + { + registerResourceLoader(resourceLoader, resourceLoader.getClass()); + } + + public static void registerResourceLoader(ResourceLoader resourceLoader, Class reference) + { + resourceLoaders.put(reference.getName(), Objects.requireNonNull(resourceLoader)); + } + + public static void registerResourceLoader(ResourceLoader resourceLoader, String reference) + { + resourceLoaders.put(reference, Objects.requireNonNull(resourceLoader)); + } + + private static void tryLoadResourceLoader(String loaderClassName) + { + ReflectionHelper.tryInvokeStaticInitializer(loaderClassName, "Error loading resoruce loader %s: %s\n"); + } + + public static interface ComponentSupplier + { + public ModelComponent create(LogicModelModifiable model, JsonElement params, String name); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java new file mode 100644 index 00000000..32d9f941 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java @@ -0,0 +1,17 @@ +package net.mograsim.logic.model.serializing; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.util.JsonHandler; + +public interface JSONSerializable +{ + public String getIDForSerializing(IdentifyParams idParams); + + public Object getParamsForSerializing(IdentifyParams idParams); + + public default JsonElement getParamsForSerializingJSON(IdentifyParams idParams) + { + return JsonHandler.toJsonTree(getParamsForSerializing(idParams)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java new file mode 100644 index 00000000..c21fa866 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java @@ -0,0 +1,87 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; + +import com.google.gson.JsonElement; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.util.JsonHandler; + +/** + * This class contains all the information necessary to create a new {@link SubmodelComponent} + */ +public class LegacySubmodelComponentParams +{ + // basic stuff + public double width, height; + public LegacyInterfacePinParams[] interfacePins; + public LegacySubmodelParameters submodel; + + // functionality that needs to be expressed in Java code + public String symbolRendererSnippetID; + public JsonElement symbolRendererParams; + + public String outlineRendererSnippetID; + public JsonElement outlineRendererParams; + + public String highLevelStateHandlerSnippetID; + public JsonElement highLevelStateHandlerParams; + + public static class LegacyInterfacePinParams + { + public Point location; + public String name; + public int logicWidth; + } + + public static class LegacySubmodelParameters + { + public double innerScale; + public LegacyInnerComponentParams[] subComps; + public LegacyInnerWireParams[] innerWires; + + public static class LegacyInnerComponentParams + { + public String id; + public String name; + public Point pos; + public JsonElement params; + } + + public static class LegacyInnerWireParams + { + public LegacyInnerPinParams pin1, pin2; + public String name; + public Point[] path; + + public static class LegacyInnerPinParams + { + public String compName; + public String pinName; + } + } + } + + public static LegacySubmodelComponentParams readJson(String path) throws IOException + { + return JsonHandler.readJson(path, LegacySubmodelComponentParams.class); + } + + /** + * Writes this {@link LegacySubmodelComponentParams} object into a file in json format. The correct file extension is important! Check + * {@link LegacySubmodelComponentParams}.fileExtension + */ + public void writeJson(String path) + { + try + { + JsonHandler.writeJson(this, path); + } + catch (IOException e) + { + System.err.println("Failed to write SubComponentParams to file"); + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java new file mode 100644 index 00000000..93fc945e --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java @@ -0,0 +1,305 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import com.google.gson.JsonElement; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacyInterfacePinParams; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerComponentParams; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams.LegacyInnerPinParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.logic.model.util.JsonHandler; + +/** + * Creates {@link SubmodelComponent}s from {@link LegacySubmodelComponentParams} + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ +public final class LegacySubmodelComponentSerializer +{ + // convenience methods + + /** + * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams)}, but first reading the + * {@link LegacySubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class)); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, JsonElement)}, but first reading the + * {@link LegacySubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), idForSerializingOverride, + paramsForSerializingOverride); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String)}, but first reading the + * {@link LegacySubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)}, but first reading the + * {@link LegacySubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name, idForSerializingOverride, + paramsForSerializingOverride); + } + + /** + * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no + * idForSerializingOverride set and using the default name. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params) + { + return deserialize(model, params, null, null, null); + } + + /** + * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} using the default name. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, + String idForSerializingOverride, JsonElement paramsForSerializingOverride) + { + return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride); + } + + /** + * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no + * idForSerializingOverride set. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name) + { + return deserialize(model, params, name, null, null); + } + + /** + * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link LegacySubmodelComponentParams} they are + * written to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(SubmodelComponent comp, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(comp), targetPath); + } + + /** + * Like {@link #serialize(SubmodelComponent, Function)}, but instead of returning the generated {@link LegacySubmodelComponentParams} + * they are written to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(comp, idParams), targetPath); + } + + /** + * {@link #serialize(SubmodelComponent, Function)} using the default {@link IdentifyParams} (see IdentifyParams's + * {@link IdentifyParams#IdentifyParams() default constructor}) + * + * @author Daniel Kirschten + */ + public static LegacySubmodelComponentParams serialize(SubmodelComponent comp) + { + return serialize(comp, new IdentifyParams()); + } + + // "core" methods + /** + * Creates a {@link SubmodelComponent} from the specified {@link LegacySubmodelComponentParams} with the given name. + *

+ * When serializing a SubmodelComponent, it is undesired for every subcomponent to be serialized with its complete inner + * structure. Instead, these sub-SubmodelComponents should be serialized with the ID and params which were used to + * determine the SubmodelComponentParams defining the sub-SubmodelComponent. Because of this, it is possible + * to override the ID and params used in {@link #serialize(SubmodelComponent, Function) serialize(...)} to describe this subcomponent. + * See there for details. + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + @SuppressWarnings("unused") // for ModelWire being created + public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name, + String idForSerializingOverride, JsonElement paramsForSerializingOverride) + { + DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, + paramsForSerializingOverride); + comp.setSubmodelScale(params.submodel.innerScale); + comp.setSize(params.width, params.height); + for (LegacyInterfacePinParams iPinParams : params.interfacePins) + // TRISTATE because we don't have a better choice + comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, PinUsage.TRISTATE, + iPinParams.location.x, iPinParams.location.y)); + LegacySubmodelParameters submodelParams = params.submodel; + LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); + Map componentsByName = submodelModifiable.getComponentsByName(); + ModelComponent[] components = new ModelComponent[submodelParams.subComps.length]; + for (int i = 0; i < components.length; i++) + { + LegacyInnerComponentParams cParams = submodelParams.subComps[i]; + components[i] = IndirectModelComponentCreator.createComponent(submodelModifiable, cParams.id, cParams.params, cParams.name); + components[i].moveTo(cParams.pos.x, cParams.pos.y); + } + + for (int i = 0; i < submodelParams.innerWires.length; i++) + { + LegacyInnerWireParams innerWire = submodelParams.innerWires[i]; + new ModelWire(submodelModifiable, innerWire.name, componentsByName.get(innerWire.pin1.compName).getPin(innerWire.pin1.pinName), + componentsByName.get(innerWire.pin2.compName).getPin(innerWire.pin2.pinName), innerWire.path); + } + comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) + .create(comp, params.symbolRendererParams)); + comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier + .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams)); + comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier + .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams)); + return comp; + } + + /** + * Returns {@link LegacySubmodelComponentParams}, which describe this {@link SubmodelComponent}.
+ * Subcomponents are serialized in the following way:
+ * If a subcomponent is a SubmodelComponent which has been deserialized, and it has an + * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set (e.g. non-null; see + * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement) deserialize(...)}), this ID and + * the component's {@link DeserializedSubmodelComponent#paramsForSerializingOverride paramsForSerializingOverride} are written.
+ * If this case doesn't apply (e.g. if the subcomponent is not a SubmodelComponent; or it is a + * SubmodelComponent, but hasn't been deserialized; or it has no + * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set), the ID defined by idGetter + * and the params obtained by {@link ModelComponent#getParamsForSerializing() getParams()} are written.
+ * CodeSnippets are serialized using the ID defined by idGetter and the params obtained by the respective + * getParamsForSerializing methods ({@link Renderer#getParamsForSerializing()}). + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + public static LegacySubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams) + { + LegacySubmodelParameters submodelParams = new LegacySubmodelParameters(); + submodelParams.innerScale = comp.getSubmodelScale(); + + Map components = new HashMap<>(comp.submodel.getComponentsByName()); + components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME); + LegacyInnerComponentParams[] componentParams = new LegacyInnerComponentParams[components.size()]; + int i1 = 0; + for (ModelComponent innerComponent : components.values()) + { + LegacyInnerComponentParams innerComponentParams = new LegacyInnerComponentParams(); + componentParams[i1] = innerComponentParams; + innerComponentParams.pos = new Point(innerComponent.getPosX(), innerComponent.getPosY()); + innerComponentParams.id = innerComponent.getIDForSerializing(idParams); + innerComponentParams.params = innerComponent.getParamsForSerializingJSON(idParams); + innerComponentParams.name = innerComponent.getName(); + i1++; + } + submodelParams.subComps = componentParams; + + Collection wires = comp.submodel.getWiresByName().values(); + LegacyInnerWireParams wireParams[] = new LegacyInnerWireParams[wires.size()]; + i1 = 0; + for (ModelWire innerWire : wires) + { + LegacyInnerWireParams innerWireParams = new LegacyInnerWireParams(); + wireParams[i1] = innerWireParams; + LegacyInnerPinParams pin1Params = new LegacyInnerPinParams(), pin2Params = new LegacyInnerPinParams(); + + pin1Params.pinName = innerWire.getPin1().name; + pin1Params.compName = innerWire.getPin1().component.getName(); + pin2Params.pinName = innerWire.getPin2().name; + pin2Params.compName = innerWire.getPin2().component.getName(); + innerWireParams.name = innerWire.name; + innerWireParams.pin1 = pin1Params; + innerWireParams.pin2 = pin2Params; + innerWireParams.path = innerWire.getPath(); + i1++; + } + submodelParams.innerWires = wireParams; + + LegacySubmodelComponentParams params = new LegacySubmodelComponentParams(); + params.submodel = submodelParams; + + params.width = comp.getWidth(); + params.height = comp.getHeight(); + + LegacyInterfacePinParams[] iPins = new LegacyInterfacePinParams[comp.getPins().size()]; + int i = 0; + for (Pin p : comp.getPins().values()) + { + LegacyInterfacePinParams iPinParams = new LegacyInterfacePinParams(); + iPins[i] = iPinParams; + iPinParams.location = p.getRelPos(); + iPinParams.name = p.name; + iPinParams.logicWidth = p.logicWidth; + i++; + } + params.interfacePins = iPins; + + Renderer symbolRenderer = comp.getSymbolRenderer(); + if (symbolRenderer != null) + { + params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams); + params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams); + } + + Renderer outlineRenderer = comp.getOutlineRenderer(); + if (outlineRenderer != null) + { + params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams); + params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams); + } + + HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler(); + if (highLevelStateHandler != null) + { + params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams); + params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams); + } + + return params; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java new file mode 100644 index 00000000..187d82c5 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java @@ -0,0 +1,38 @@ +package net.mograsim.logic.model.serializing; + +import com.google.gson.JsonElement; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.util.Version; + +public class LogicModelParams extends SerializablePojo +{ + public ComponentParams[] components; + public WireParams[] wires; + + public LogicModelParams(Version version) + { + super(version); + } + + public static class ComponentParams + { + public String id; + public String name; + public Point pos; + public JsonElement params; + } + + public static class WireParams + { + public PinParams pin1, pin2; + public String name; + public Point[] path; + + public static class PinParams + { + public String compName; + public String pinName; + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java new file mode 100644 index 00000000..97b84ce3 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java @@ -0,0 +1,172 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.LogicModelParams.ComponentParams; +import net.mograsim.logic.model.serializing.LogicModelParams.WireParams; +import net.mograsim.logic.model.serializing.LogicModelParams.WireParams.PinParams; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.logic.model.util.Version; + +public class LogicModelSerializer +{ + public static final Version CURRENT_JSON_VERSION = Version.parseSemver("0.1.1"); + + // convenience methods + /** + * Like {@link #deserialize(LogicModelParams)}, but first reading the {@link LogicModelParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static LogicModelModifiable deserialize(String sourcePath) throws IOException + { + return deserialize(JsonHandler.readJson(sourcePath, LogicModelParams.class)); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LogicModelParams)}, but first reading the {@link LogicModelParams} from the given file + * path. + * + * @author Daniel Kirschten + */ + public static void deserialize(LogicModelModifiable model, String sourcePath) throws IOException + { + deserialize(model, JsonHandler.readJson(sourcePath, LogicModelParams.class)); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LogicModelParams)}, but using a newly created {@link LogicModelModifiable}. + * + * @author Daniel Kirschten + */ + public static LogicModelModifiable deserialize(LogicModelParams params) + { + LogicModelModifiable model = new LogicModelModifiable(); + deserialize(model, params); + return model; + } + + /** + * Like {@link #serialize(LogicModel)}, but instead of returning the generated {@link LogicModelParams} they are written to a file at + * the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(LogicModel model, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(model), targetPath); + } + + /** + * Like {@link #serialize(LogicModel, IdentifyParams)}, but instead of returning the generated {@link LogicModelParams} they are written + * to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(LogicModel model, IdentifyParams idParams, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(model, idParams), targetPath); + } + + /** + * {@link #serialize(LogicModel, IdentifyParams)} using the default {@link IdentifyParams} (see IdentifyParams's + * {@link IdentifyParams#IdentifyParams() default constructor}) + * + * @author Daniel Kirschten + */ + public static LogicModelParams serialize(LogicModel model) + { + return serialize(model, new IdentifyParams()); + } + + // "core" methods + /** + * Deserializes components and wires from the specified {@link LogicModelParams} and adds them to the given + * {@link LogicModelModifiable}. + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + @SuppressWarnings("unused") // for ModelWire being created + public static void deserialize(LogicModelModifiable model, LogicModelParams params) + { + Map componentsByName = model.getComponentsByName(); + ModelComponent[] components = new ModelComponent[params.components.length]; + for (int i = 0; i < components.length; i++) + { + ComponentParams compParams = params.components[i]; + components[i] = IndirectModelComponentCreator.createComponent(model, compParams.id, compParams.params, compParams.name); + components[i].moveTo(compParams.pos.x, compParams.pos.y); + } + + for (int i = 0; i < params.wires.length; i++) + { + WireParams wire = params.wires[i]; + new ModelWire(model, wire.name, componentsByName.get(wire.pin1.compName).getPin(wire.pin1.pinName), + componentsByName.get(wire.pin2.compName).getPin(wire.pin2.pinName), wire.path); + } + } + + /** + * Returns {@link LogicModelModifiable}, which describe the components and wires in the given {@link LogicModel}.
+ * Components are serialized using {@link ModelComponent#getIDForSerializing(IdentifyParams)} and + * {@link ModelComponent#getParamsForSerializingJSON(IdentifyParams)}
+ * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + public static LogicModelParams serialize(LogicModel model, IdentifyParams idParams) + { + LogicModelParams modelParams = new LogicModelParams(CURRENT_JSON_VERSION); + + Map components = new HashMap<>(model.getComponentsByName()); + components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME); + Set componentsParams = new HashSet<>(); + for (ModelComponent component : components.values()) + { + ComponentParams compParams = new ComponentParams(); + componentsParams.add(compParams); + compParams.pos = new Point(component.getPosX(), component.getPosY()); + compParams.id = component.getIDForSerializing(idParams); + compParams.params = component.getParamsForSerializingJSON(idParams); + compParams.name = component.getName(); + } + modelParams.components = componentsParams.toArray(ComponentParams[]::new); + Arrays.sort(modelParams.components, Comparator.comparing(c -> c.name)); + + Collection wires = model.getWiresByName().values(); + Set wiresParams = new HashSet<>(); + for (ModelWire innerWire : wires) + { + WireParams innerWireParams = new WireParams(); + wiresParams.add(innerWireParams); + PinParams pin1Params = new PinParams(), pin2Params = new PinParams(); + + pin1Params.pinName = innerWire.getPin1().name; + pin1Params.compName = innerWire.getPin1().component.getName(); + pin2Params.pinName = innerWire.getPin2().name; + pin2Params.compName = innerWire.getPin2().component.getName(); + innerWireParams.name = innerWire.name; + innerWireParams.pin1 = pin1Params; + innerWireParams.pin2 = pin2Params; + innerWireParams.path = innerWire.getPath(); + } + modelParams.wires = wiresParams.toArray(WireParams[]::new); + Arrays.sort(modelParams.wires, Comparator.comparing(c -> c.name)); + + return modelParams; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java new file mode 100644 index 00000000..1a6a66a4 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java @@ -0,0 +1,36 @@ +package net.mograsim.logic.model.serializing; + +public class ReflectionHelper +{ + private ReflectionHelper() + { + } + + public static Class tryInvokeStaticInitializer(String className, String errorMessageFormat) + { + return tryInvokeStaticInitializer(className, errorMessageFormat, ReflectionHelper.class.getClassLoader()); + } + + public static Class tryInvokeStaticInitializer(String className, String errorMessageFormat, ClassLoader classLoader) + { + try + { + return tryInvokeStaticInitializer(className, classLoader); + } + catch (ClassNotFoundException e) + { + System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage()); + return null; + } + } + + public static Class tryInvokeStaticInitializer(String className) throws ClassNotFoundException + { + return tryInvokeStaticInitializer(className, ReflectionHelper.class.getClassLoader()); + } + + public static Class tryInvokeStaticInitializer(String className, ClassLoader classLoader) throws ClassNotFoundException + { + return Class.forName(className, true, classLoader); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java new file mode 100644 index 00000000..f15b475e --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java @@ -0,0 +1,16 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.io.InputStream; + +import net.mograsim.logic.model.model.components.ModelComponent; + +/** + * For loading JSON {@link ModelComponent}s from other OSGI-Modules or jar-Files. + */ +public interface ResourceLoader +{ + InputStream loadResource(String path) throws IOException; + + Class loadClass(String name) throws ClassNotFoundException; +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java new file mode 100644 index 00000000..4cc94d76 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java @@ -0,0 +1,19 @@ +package net.mograsim.logic.model.serializing; + +import net.mograsim.logic.model.util.Version; + +/** + * This class is the superclass of all POJOs that can be serialized to JSON. + * + * @author Daniel Kirschten + * + */ +public class SerializablePojo +{ + public Version version; + + public SerializablePojo(Version version) + { + this.version = version; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java new file mode 100644 index 00000000..9467200f --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java @@ -0,0 +1,20 @@ +package net.mograsim.logic.model.serializing; + +import java.util.Map; + +import net.mograsim.logic.model.util.Version; + +public class StandardComponentIdMappingContainer extends SerializablePojo +{ + public Map map; + + public StandardComponentIdMappingContainer(Version version) + { + super(version); + } + + public Map getMap() + { + return map; + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java new file mode 100644 index 00000000..97b3c7c1 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java @@ -0,0 +1,43 @@ +package net.mograsim.logic.model.serializing; + +import com.google.gson.JsonElement; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.util.Version; + +/** + * This class contains all the information necessary to create a new {@link SubmodelComponent} + */ +public class SubmodelComponentParams extends SerializablePojo +{ + // basic stuff + public double width, height; + public InterfacePinParams[] interfacePins; + public double innerScale; + public LogicModelParams submodel; + + // functionality that needs to be expressed in Java code + public String symbolRendererSnippetID; + public JsonElement symbolRendererParams; + + public String outlineRendererSnippetID; + public JsonElement outlineRendererParams; + + public String highLevelStateHandlerSnippetID; + public JsonElement highLevelStateHandlerParams; + + public SubmodelComponentParams(Version version) + { + super(version); + } + + public static class InterfacePinParams + { + public Point location; + public String name; + public int logicWidth; + public PinUsage usage; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java new file mode 100644 index 00000000..cf139885 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java @@ -0,0 +1,245 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Comparator; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.SubmodelComponentParams.InterfacePinParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.logic.model.util.Version; + +/** + * Creates {@link SubmodelComponent}s from {@link SubmodelComponentParams} + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ +public final class SubmodelComponentSerializer +{ + public static final Version JSON_VERSION_CURRENT_SERIALIZING = Version.parseSemver("0.1.5"); + public static final Version JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING = Version.parseSemver("0.1.5"); + public static final Version JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED = Version.parseSemver("0.1.5"); + // convenience methods + + /** + * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams)}, but first reading the {@link SubmodelComponentParams} from + * the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class)); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, JsonElement)}, but first reading the + * {@link SubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), idForSerializingOverride, + paramsForSerializingOverride); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String)}, but first reading the + * {@link SubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), name); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)}, but first reading the + * {@link SubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), name, idForSerializingOverride, + paramsForSerializingOverride); + } + + /** + * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} with no + * idForSerializingOverride set and using the default name. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params) + { + return deserialize(model, params, null, null, null); + } + + /** + * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} using the default name. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) + { + return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride); + } + + /** + * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} with no + * idForSerializingOverride set. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String name) + { + return deserialize(model, params, name, null, null); + } + + /** + * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link SubmodelComponentParams} they are written + * to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(SubmodelComponent comp, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(comp), targetPath); + } + + /** + * Like {@link #serialize(SubmodelComponent, IdentifyParams)}, but instead of returning the generated {@link SubmodelComponentParams} + * they are written to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(comp, idParams), targetPath); + } + + /** + * {@link #serialize(SubmodelComponent, IdentifyParams)} using the default {@link IdentifyParams} (see IdentifyParams's + * {@link IdentifyParams#IdentifyParams() default constructor}) + * + * @author Daniel Kirschten + */ + public static SubmodelComponentParams serialize(SubmodelComponent comp) + { + return serialize(comp, new IdentifyParams()); + } + + // "core" methods + /** + * Creates a {@link SubmodelComponent} from the specified {@link SubmodelComponentParams} with the given name. + *

+ * When serializing a SubmodelComponent, it is undesired for every subcomponent to be serialized with its complete inner + * structure. Instead, these sub-SubmodelComponents should be serialized with the ID and params which were used to + * determine the SubmodelComponentParams defining the sub-SubmodelComponent. Because of this, it is possible + * to override the ID and params used in {@link #serialize(SubmodelComponent, IdentifyParams) serialize(...)} to describe this + * subcomponent. See there for details. + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + @SuppressWarnings("unused") // for ModelWire being created + public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String name, + String idForSerializingOverride, JsonElement paramsForSerializingOverride) + { + Version version = params.version; + if (version.compareTo(JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING) > 0) + throw new IllegalArgumentException("JSON version " + version + " not supported yet"); + boolean hasUsageSerialized = version.compareTo(JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED) >= 0; + DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, + paramsForSerializingOverride); + comp.setSubmodelScale(params.innerScale); + comp.setSize(params.width, params.height); + for (InterfacePinParams iPinParams : params.interfacePins) + // TRISTATE because we don't have a better choice + comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, + hasUsageSerialized ? iPinParams.usage : PinUsage.TRISTATE, iPinParams.location.x, iPinParams.location.y)); + LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); + LogicModelSerializer.deserialize(comp.getSubmodelModifiable(), params.submodel); + comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) + .create(comp, params.symbolRendererParams)); + comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier + .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams)); + comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier + .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams)); + return comp; + } + + /** + * Returns {@link SubmodelComponentParams}, which describe this {@link SubmodelComponent}.
+ * See {@link LogicModelSerializer#serialize(net.mograsim.logic.model.model.LogicModel, IdentifierGetter) + * LogicModelSerializer.serialize(...)} for how subcomponents are serialized.
+ * CodeSnippets are serialized using the ID defined by idGetter and the params obtained by the respective + * getParamsForSerializing methods ({@link Renderer#getParamsForSerializing()}). + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + public static SubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams) + { + SubmodelComponentParams params = new SubmodelComponentParams(JSON_VERSION_CURRENT_SERIALIZING); + params.innerScale = comp.getSubmodelScale(); + params.submodel = LogicModelSerializer.serialize(comp.submodel, idParams); + + params.width = comp.getWidth(); + params.height = comp.getHeight(); + + InterfacePinParams[] iPins = new InterfacePinParams[comp.getPins().size()]; + int i = 0; + for (Pin p : comp.getPins().values()) + { + InterfacePinParams iPinParams = new InterfacePinParams(); + iPins[i] = iPinParams; + iPinParams.location = p.getRelPos(); + iPinParams.name = p.name; + iPinParams.logicWidth = p.logicWidth; + iPinParams.usage = p.usage; + i++; + } + params.interfacePins = iPins; + Arrays.sort(params.interfacePins, Comparator.comparing(p -> p.name)); + + Renderer symbolRenderer = comp.getSymbolRenderer(); + if (symbolRenderer != null) + { + params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams); + params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams); + } + + Renderer outlineRenderer = comp.getOutlineRenderer(); + if (outlineRenderer != null) + { + params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams); + params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams); + } + + HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler(); + if (highLevelStateHandler != null) + { + params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams); + params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams); + } + + return params; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json new file mode 100644 index 00000000..b0b8bedd --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json @@ -0,0 +1,17 @@ +{ + "version": "0.1.0", + "map": { + "AndGate": "class:net.mograsim.logic.model.model.components.atomic.ModelAndGate", + "BitDisplay": "class:net.mograsim.logic.model.model.components.atomic.ModelBitDisplay", + "Clock": "class:net.mograsim.logic.model.model.components.atomic.ModelClock", + "FixedOutput": "class:net.mograsim.logic.model.model.components.atomic.ModelFixedOutput", + "ManualSwitch": "class:net.mograsim.logic.model.model.components.atomic.ModelManualSwitch", + "Merger": "class:net.mograsim.logic.model.model.components.atomic.ModelMerger", + "NandGate": "class:net.mograsim.logic.model.model.components.atomic.ModelNandGate", + "OrGate": "class:net.mograsim.logic.model.model.components.atomic.ModelOrGate", + "Splitter": "class:net.mograsim.logic.model.model.components.atomic.ModelSplitter", + "TriStateBuffer": "class:net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer", + "TextComponent": "class:net.mograsim.logic.model.model.components.atomic.ModelTextComponent", + "WireCrossPoint": "class:net.mograsim.logic.model.model.wires.ModelWireCrossPoint" + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java new file mode 100644 index 00000000..22ebc090 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java @@ -0,0 +1,72 @@ +package net.mograsim.logic.model.snippets; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import net.mograsim.logic.model.serializing.ReflectionHelper; + +public class CodeSnippetSupplier +{ + private final Map standardSnippetIDClassNames = new HashMap<>(); + private final Map standardSnippetIDClassNamesUnmodifiable = Collections.unmodifiableMap(standardSnippetIDClassNames); + private final Map> snippetSuppliersForClassNames = new HashMap<>(); + private final SnippetDefinintion defaultSnippetSupplier; + + public CodeSnippetSupplier(SnippetDefinintion defaultSnippetSupplier) + { + this.defaultSnippetSupplier = defaultSnippetSupplier; + } + + public void addStandardSnippetID(String standardSnippetID, String associatedSnippetID) + { + if (!associatedSnippetID.startsWith("class:")) + throw new IllegalArgumentException("Unrecognized snippet ID format: " + associatedSnippetID); + standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetID); + } + + public Map getStandardSnippetIDs() + { + return standardSnippetIDClassNamesUnmodifiable; + } + + public void setSnippetSupplier(String id, SnippetDefinintion snippetSupplier) + { + snippetSuppliersForClassNames.put(id, snippetSupplier); + } + + // TODO report errors + public SnippetDefinintion getSnippetSupplier(String id) + { + if (id != null) + { + String resolvedID = resolveID(id); + if (resolvedID != null) + { + String snippetClassName = resolvedID.substring(6); + tryLoadSnippetClass(snippetClassName); + SnippetDefinintion snippetSupplier = snippetSuppliersForClassNames.get(snippetClassName); + if (snippetSupplier != null) + return snippetSupplier; + } + System.err.println("Couldn't load snippet " + id + "; using default"); + } + if (defaultSnippetSupplier == null) + throw new IllegalArgumentException("No default snippet set"); + return defaultSnippetSupplier; + } + + public String resolveID(String id) + { + if (id.startsWith("class:")) + return id; + return standardSnippetIDClassNames.get(id); + } + + // static helpers + + private static void tryLoadSnippetClass(String snippetClassName) + { + ReflectionHelper.tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java new file mode 100644 index 00000000..622df00b --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java @@ -0,0 +1,41 @@ +package net.mograsim.logic.model.snippets; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.JSONSerializable; + +/** + * A high level state ID consists of parts separated by dots ('.').
+ * The last part (the part after the last dot) is called "atomic high level state ID". The parts before that part are called "subcomponent + * ID"s.
+ * If there is no dot in a high level state ID, the whole high level state ID is called atomic.
+ * Note that subcomponent IDs don't have to correspond to actual subcomponents. For example, a RAM component may supply subcomponent IDs + * "c0000", "c0001" ... "cFFFF" without actually having a subcomponent for each cell. It also is allowed to delegate an atomic high level + * state ID to a subcomponent. + * + * @author Daniel Kirschten + */ +public interface HighLevelStateHandler extends JSONSerializable +{ + /** + * Gets the current value of the given high-level state.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @see #setHighLevelState(String, Object) + * @see ModelComponent#getHighLevelState(String) + * + * @author Daniel Kirschten + */ + public Object getHighLevelState(String stateID); + + /** + * Sets the given high-level state to the given value.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @see #getHighLevelState(String) + * @see ModelComponent#setHighLevelState(String, Object) + * + * @author Daniel Kirschten + */ + public void setHighLevelState(String stateID, Object newState); + +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java new file mode 100644 index 00000000..5ed33bdc --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java @@ -0,0 +1,10 @@ +package net.mograsim.logic.model.snippets; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.serializing.JSONSerializable; + +public interface Renderer extends JSONSerializable +{ + public void render(GeneralGC gc, Rectangle visibleRegion); +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java new file mode 100644 index 00000000..c5fecf25 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java @@ -0,0 +1,43 @@ +package net.mograsim.logic.model.snippets; + +import java.util.function.BiFunction; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; + +public interface SnippetDefinintion +{ + public Class

getParamClass(); + + public S create(C context, P params); + + public default S create(C context, JsonElement params) + { + Class

paramClass = getParamClass(); + if (paramClass.equals(Void.class)) + { + if (params != null) + throw new IllegalArgumentException("Params given where none were expected"); + return create(context, (P) null); + } + return create(context, new Gson().fromJson(params, getParamClass())); + } + + public static SnippetDefinintion create(Class

paramClass, BiFunction supplier) + { + return new SnippetDefinintion<>() + { + @Override + public Class

getParamClass() + { + return paramClass; + } + + @Override + public S create(C context, P params) + { + return supplier.apply(context, params); + } + }; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java new file mode 100644 index 00000000..860557fd --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java @@ -0,0 +1,56 @@ +package net.mograsim.logic.model.snippets; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer; +import net.mograsim.logic.model.util.JsonHandler; + +public class SubmodelComponentSnippetSuppliers +{ + public static final CodeSnippetSupplier symbolRendererSupplier; + public static final CodeSnippetSupplier outlineRendererSupplier; + public static final CodeSnippetSupplier highLevelStateHandlerSupplier; + + static + { + symbolRendererSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultSymbolRenderer::new)); + outlineRendererSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultOutlineRenderer::new)); + highLevelStateHandlerSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultHighLevelStateHandler::new)); + } + + static + { + try (InputStream s = SubmodelComponentSnippetSuppliers.class.getResourceAsStream("standardSnippetIDMapping.json")) + { + if (s == null) + throw new IOException("Resource not found"); + SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class); + tmp.standardSymbolRendererSuppliers.forEach(symbolRendererSupplier::addStandardSnippetID); + tmp.standardOutlineRendererSuppliers.forEach(outlineRendererSupplier::addStandardSnippetID); + tmp.standardHighLevelStateHandlerSuppliers.forEach(highLevelStateHandlerSupplier::addStandardSnippetID); + } + catch (Exception e) + { + System.err.println("Failed to initialize standard snippet ID mapping:"); + e.printStackTrace(); + } + } + + private static class SnippetIDClassNames + { + public Map standardSymbolRendererSuppliers; + public Map standardOutlineRendererSuppliers; + public Map standardHighLevelStateHandlerSuppliers; + } + + private SubmodelComponentSnippetSuppliers() + { + throw new UnsupportedOperationException(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java new file mode 100644 index 00000000..7fd1fc96 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java @@ -0,0 +1,57 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers; + +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; + +public class DefaultHighLevelStateHandler implements HighLevelStateHandler +{ + public DefaultHighLevelStateHandler() + { + this(null); + } + + public DefaultHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + @SuppressWarnings("unused") // we don't need the component; and params are always null + public DefaultHighLevelStateHandler(SubmodelComponent component, Void params) + { + // nothing to do here + } + + @Override + public Object getHighLevelState(String stateID) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "default"; + } + + @Override + public Void getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + static + { + SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier( + DefaultHighLevelStateHandler.class.getCanonicalName(), + SnippetDefinintion.create(Void.class, DefaultHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java new file mode 100644 index 00000000..58e8e64c --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java @@ -0,0 +1,215 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; +import java.util.function.BiFunction; +import java.util.function.Function; + +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams; + +public class StandardHighLevelStateHandler implements HighLevelStateHandler +{ + private final SubmodelComponent component; + private final Map subcomponentHighLevelStateHandlers; + private final Map subcomponentHighLevelStateHandlersUnmodifiable; + private final Map atomicHighLevelStateHandlers; + private final Map atomicHighLevelStateHandlersUnmodifiable; + + public StandardHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params) + { + this.component = component; + this.subcomponentHighLevelStateHandlers = new HashMap<>(); + this.subcomponentHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(subcomponentHighLevelStateHandlers); + this.atomicHighLevelStateHandlers = new HashMap<>(); + this.atomicHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(atomicHighLevelStateHandlers); + if (params != null) + { + params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState); + params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState); + } + } + + public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID, + SubcomponentHighLevelStateHandlerParams handlerParams) + { + return addSubcomponentHighLevelState(subcomponentStateID, + StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create, + handlerParams.params); + } + + public H addSubcomponentHighLevelState(String subcomponentStateID, + BiFunction handlerConstructor, P handlerParams) + { + return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams)); + } + + public H addSubcomponentHighLevelState(String subcomponentStateID, + Function handlerConstructor) + { + H handler = handlerConstructor.apply(component); + addSubcomponentHighLevelState(subcomponentStateID, handler); + return handler; + } + + public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler) + { + checkHighLevelStateIDPart(subcomponentStateID); + subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler); + } + + public void removeSubcomponentHighLevelState(String subcomponentStateID) + { + checkHighLevelStateIDPart(subcomponentStateID); + subcomponentHighLevelStateHandlers.remove(subcomponentStateID); + } + + public Map getSubcomponentHighLevelStates() + { + return subcomponentHighLevelStateHandlersUnmodifiable; + } + + public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams) + { + return addAtomicHighLevelState(atomicStateID, + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create, + handlerParams.params); + } + + public H addAtomicHighLevelState(String subcomponentStateID, + BiFunction handlerConstructor, P handlerParams) + { + return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams)); + } + + public H addAtomicHighLevelState(String subcomponentStateID, + Function handlerConstructor) + { + H handler = handlerConstructor.apply(component); + addAtomicHighLevelState(subcomponentStateID, handler); + return handler; + } + + public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler) + { + checkHighLevelStateIDPart(atomicStateID); + atomicHighLevelStateHandlers.put(atomicStateID, handler); + } + + public void removeAtomicHighLevelState(String atomicStateID) + { + checkHighLevelStateIDPart(atomicStateID); + atomicHighLevelStateHandlers.remove(atomicStateID); + } + + public Map getAtomicHighLevelStates() + { + return atomicHighLevelStateHandlersUnmodifiable; + } + + private static void checkHighLevelStateIDPart(String stateIDPart) + { + if (stateIDPart.indexOf('.') != -1) + throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart); + } + + @Override + public Object getHighLevelState(String stateID) + { + int indexOfDot = stateID.indexOf('.'); + if (indexOfDot == -1) + { + AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID); + if (handler != null) + return handler.getHighLevelState(); + } else + { + SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot)); + if (handler != null) + return handler.getHighLevelState(stateID.substring(indexOfDot + 1)); + } + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + int indexOfDot = stateID.indexOf('.'); + if (indexOfDot == -1) + { + AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID); + if (handler != null) + handler.setHighLevelState(newState); + else + throw new IllegalArgumentException("No high level state with ID " + stateID); + } else + { + SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot)); + if (handler != null) + handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState); + else + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "standard"; + } + + @Override + public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams(); + params.subcomponentHighLevelStates = new TreeMap<>(); + params.atomicHighLevelStates = new TreeMap<>(); + for (Entry e : subcomponentHighLevelStateHandlers.entrySet()) + { + String stateID = e.getKey(); + SubcomponentHighLevelStateHandler handler = e.getValue(); + SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams(); + handlerParams.id = handler.getIDForSerializing(idParams); + handlerParams.params = handler.getParamsForSerializingJSON(idParams); + params.subcomponentHighLevelStates.put(stateID, handlerParams); + } + for (Entry e : atomicHighLevelStateHandlers.entrySet()) + { + String stateID = e.getKey(); + AtomicHighLevelStateHandler handler = e.getValue(); + AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams(); + handlerParams.id = handler.getIDForSerializing(idParams); + handlerParams.params = handler.getParamsForSerializingJSON(idParams); + params.atomicHighLevelStates.put(stateID, handlerParams); + } + return params; + } + + public static class StandardHighLevelStateHandlerParams + { + public Map subcomponentHighLevelStates; + public Map atomicHighLevelStates; + } + + static + { + SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier( + StandardHighLevelStateHandler.class.getCanonicalName(), + SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java new file mode 100644 index 00000000..158adda2 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java @@ -0,0 +1,51 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.snippets.CodeSnippetSupplier; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler; +import net.mograsim.logic.model.util.JsonHandler; + +public class StandardHighLevelStateHandlerSnippetSuppliers +{ + public static final CodeSnippetSupplier atomicHandlerSupplier; + public static final CodeSnippetSupplier subcomponentHandlerSupplier; + + static + { + atomicHandlerSupplier = new CodeSnippetSupplier<>(null); + subcomponentHandlerSupplier = new CodeSnippetSupplier<>(null); + } + + static + { + try (InputStream s = StandardHighLevelStateHandlerSnippetSuppliers.class.getResourceAsStream("standardSnippetIDMapping.json")) + { + if (s == null) + throw new IOException("Resource not found"); + SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class); + tmp.standardSubcomponentHandlerSuppliers.forEach(subcomponentHandlerSupplier::addStandardSnippetID); + tmp.standardAtomicHandlerSuppliers.forEach(atomicHandlerSupplier::addStandardSnippetID); + } + catch (Exception e) + { + System.err.println("Failed to initialize standard snippet ID mapping: "); + e.printStackTrace(); + } + } + + private static class SnippetIDClassNames + { + public Map standardSubcomponentHandlerSuppliers; + public Map standardAtomicHandlerSuppliers; + } + + private StandardHighLevelStateHandlerSnippetSuppliers() + { + throw new UnsupportedOperationException(); + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java new file mode 100644 index 00000000..97ace092 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java @@ -0,0 +1,31 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.serializing.JSONSerializable; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; + +public interface AtomicHighLevelStateHandler extends JSONSerializable +{ + /** + * Gets the current value of the atomic high level state represented by this AtomicHighLevelStateHandler.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @author Daniel Kirschten + */ + public Object getHighLevelState(); + + /** + * Sets the atomic high level state represented by this AtomicHighLevelStateHandler to the given value.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @author Daniel Kirschten + */ + public void setHighLevelState(Object newState); + + public static class AtomicHighLevelStateHandlerParams + { + public String id; + public JsonElement params; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java new file mode 100644 index 00000000..7ae29128 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java @@ -0,0 +1,141 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; + +public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler +{ + private final SubmodelComponent component; + private final List vectorPartTargets; + private final List vectorPartTargetsUnmodifiable; + private final List vectorPartLengthes; + private final List vectorPartLengthesUnmodifiable; + private int length; + + public BitVectorSplittingAtomicHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public BitVectorSplittingAtomicHighLevelStateHandler(SubmodelComponent component, + BitVectorSplittingAtomicHighLevelStateHandlerParams params) + { + this.component = component; + this.vectorPartTargets = new ArrayList<>(); + this.vectorPartTargetsUnmodifiable = Collections.unmodifiableList(vectorPartTargets); + this.vectorPartLengthes = new ArrayList<>(); + this.vectorPartLengthesUnmodifiable = Collections.unmodifiableList(vectorPartLengthes); + if (params != null) + setVectorParts(params.vectorPartTargets, params.vectorPartLengthes); + } + + public void set(List targets, List lengthes) + { + setVectorParts(targets, lengthes); + } + + public void addVectorPart(String target, int length) + { + vectorPartTargets.add(target); + vectorPartLengthes.add(length); + this.length += length; + } + + public void clearVectorParts() + { + vectorPartTargets.clear(); + vectorPartLengthes.clear(); + length = 0; + } + + private void setVectorParts(List targets, List lengthes) + { + clearVectorParts(); + if (targets.size() != lengthes.size()) + throw new IllegalArgumentException("Targets list and lengthes list have different sizes"); + vectorPartTargets.addAll(targets); + vectorPartLengthes.addAll(lengthes); + length += lengthes.stream().mapToInt(Integer::intValue).sum(); + } + + public List getVectorPartTargets() + { + return vectorPartTargetsUnmodifiable; + } + + public List getVectorPartLenghtes() + { + return vectorPartLengthesUnmodifiable; + } + + @Override + public Object getHighLevelState() + { + BitVector result = BitVector.of(); + for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++) + { + Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex)); + BitVector vectorPart; + if (subStateUncasted instanceof Bit) + vectorPart = BitVector.of((Bit) subStateUncasted); + else + vectorPart = (BitVector) subStateUncasted; + if (vectorPart.length() != vectorPartLengthes.get(partIndex)) + throw new IllegalArgumentException( + "Incorrect vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.get(partIndex)); + result = result.concat(vectorPart); + } + return result; + } + + @Override + public void setHighLevelState(Object newState) + { + BitVector newStateCasted = (BitVector) newState; + if (newStateCasted.length() != length) + throw new IllegalArgumentException("Incorrect vector length: " + newStateCasted.length() + "; expected " + length); + for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++) + { + int vectorPartLength = vectorPartLengthes.get(partIndex); + BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartLength); + component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart); + bitIndex += vectorPartLength; + } + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "bitVectorSplitting"; + } + + @Override + public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams(); + params.vectorPartTargets = new ArrayList<>(vectorPartTargets); + params.vectorPartLengthes = new ArrayList<>(vectorPartLengthes); + return params; + } + + public static class BitVectorSplittingAtomicHighLevelStateHandlerParams + { + public List vectorPartTargets; + public List vectorPartLengthes; + } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier + .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create( + BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java new file mode 100644 index 00000000..9d2645d7 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java @@ -0,0 +1,120 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; + +public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler +{ + private final SubmodelComponent parentComponent; + private ModelComponent delegateTarget; + private String subStateID; + + public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component, DelegatingAtomicHighLevelStateHandlerParams params) + { + this.parentComponent = component; + if (params != null) + { + // TODO document this + if (params.delegateTarget == null) + setDelegateTarget(parentComponent); + else + { + ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget); + if (delegateTarget == null) + throw new NullPointerException("No subcomponent with name " + params.delegateTarget); + setDelegateTarget(delegateTarget); + } + setSubStateID(params.subStateID); + } + parentComponent.submodel.addComponentRemovedListener(c -> + { + if (delegateTarget == c) + delegateTarget = null; + }); + } + + public void set(ModelComponent delegateTarget, String subStateID) + { + setDelegateTarget(delegateTarget); + setSubStateID(subStateID); + } + + public void setDelegateTarget(ModelComponent delegateTarget) + { + if (delegateTarget == null) + this.delegateTarget = parentComponent; + else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget) + throw new IllegalArgumentException( + "Can only set components belonging to the submodel of the parent component of this handler as the delegate target"); + this.delegateTarget = delegateTarget; + } + + public ModelComponent getDelegateTarget() + { + return delegateTarget; + } + + public void setSubStateID(String subStateID) + { + this.subStateID = subStateID; + } + + public String getSubStateID() + { + return subStateID; + } + + @Override + public Object getHighLevelState() + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + return delegateTarget.getHighLevelState(subStateID); + } + + @Override + public void setHighLevelState(Object newState) + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + delegateTarget.setHighLevelState(subStateID, newState); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "delegating"; + } + + @Override + public DelegatingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + DelegatingAtomicHighLevelStateHandlerParams params = new DelegatingAtomicHighLevelStateHandlerParams(); + params.delegateTarget = delegateTarget.getName(); + params.subStateID = subStateID; + return params; + } + + public static class DelegatingAtomicHighLevelStateHandlerParams + { + public String delegateTarget; + public String subStateID; + } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier( + DelegatingAtomicHighLevelStateHandler.class.getCanonicalName(), + SnippetDefinintion.create(DelegatingAtomicHighLevelStateHandlerParams.class, DelegatingAtomicHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java new file mode 100644 index 00000000..276f5415 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java @@ -0,0 +1,157 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; + +public class WireForcingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler +{ + private final SubmodelComponent component; + private int logicWidth; + private final List wiresToForce; + private final List wiresToForceUnmodifiable; + private final List wiresToForceInverted; + private final List wiresToForceInvertedUnmodifiable; + + public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component, WireForcingAtomicHighLevelStateHandlerParams params) + { + this.component = component; + this.wiresToForce = new ArrayList<>(); + this.wiresToForceUnmodifiable = Collections.unmodifiableList(wiresToForce); + this.wiresToForceInverted = new ArrayList<>(); + this.wiresToForceInvertedUnmodifiable = Collections.unmodifiableList(wiresToForceInverted); + if (params != null) + { + Map wiresByName = component.submodel.getWiresByName(); + setWiresToForce(params.wiresToForce.stream().map((Function) wiresByName::get).collect(Collectors.toList()), + params.wiresToForceInverted.stream().map((Function) wiresByName::get).collect(Collectors.toList())); + } + component.submodel.addWireRemovedListener(w -> + { + wiresToForce.removeIf(w::equals); + wiresToForceInverted.removeIf(w::equals); + }); + } + + public void set(List wiresToForce, List wiresToForceInverted) + { + setWiresToForce(wiresToForce, wiresToForceInverted); + } + + public void setWiresToForce(List wiresToForce, List wiresToForceInverted) + { + clearWiresToForce(); + for (ModelWire wire : wiresToForce) + addWireToForce(wire, false); + for (ModelWire wire : wiresToForceInverted) + addWireToForce(wire, true); + } + + public void addWireToForce(ModelWire wire, boolean inverted) + { + if (component.submodel.getWiresByName().get(wire.name) != wire) + throw new IllegalArgumentException("Can only force wires belonging to the parent component of this handler"); + if (logicWidth < 1) + logicWidth = wire.logicWidth; + else if (wire.logicWidth != logicWidth) + throw new IllegalArgumentException("Can only force wires of the same logic width"); + // this can add the same wire multiple times, but maybe there is a weird configuration where it is neccessary, due to race + // conditions, to force the same wire twice. + if (inverted) + wiresToForceInverted.add(wire); + else + wiresToForce.add(wire); + } + + public void clearWiresToForce() + { + wiresToForce.clear(); + wiresToForceInverted.clear(); + logicWidth = 0; + } + + public List getWiresToForce() + { + return wiresToForceUnmodifiable; + } + + public List getWiresToForceInverted() + { + return wiresToForceInvertedUnmodifiable; + } + + @Override + public Object getHighLevelState() + { + BitVector result = BitVector.of(Bit.ZERO, logicWidth); + for (ModelWire wire : wiresToForceInverted) + if (wire.hasCoreModelBinding()) + result = result.or(wire.getWireValues()); + result = result.not(); + for (ModelWire wire : wiresToForce) + if (wire.hasCoreModelBinding()) + result = result.and(wire.getWireValues()); + return result; + } + + @Override + public void setHighLevelState(Object newState) + { + BitVector vector; + if (newState instanceof Bit) + vector = BitVector.of((Bit) newState); + else + vector = (BitVector) newState; + for (ModelWire wire : wiresToForce) + if (wire.hasCoreModelBinding()) + wire.forceWireValues(vector); + vector = vector.not(); + for (ModelWire wire : wiresToForceInverted) + if (wire.hasCoreModelBinding()) + wire.forceWireValues(vector); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "wireForcing"; + } + + @Override + public WireForcingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + WireForcingAtomicHighLevelStateHandlerParams params = new WireForcingAtomicHighLevelStateHandlerParams(); + params.wiresToForce = wiresToForce.stream().map(w -> w.name).collect(Collectors.toList()); + params.wiresToForceInverted = wiresToForceInverted.stream().map(w -> w.name).collect(Collectors.toList()); + return params; + } + + public static class WireForcingAtomicHighLevelStateHandlerParams + { + public List wiresToForce; + public List wiresToForceInverted; + } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier( + WireForcingAtomicHighLevelStateHandler.class.getCanonicalName(), + SnippetDefinintion.create(WireForcingAtomicHighLevelStateHandlerParams.class, WireForcingAtomicHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json new file mode 100644 index 00000000..ef9d686f --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json @@ -0,0 +1,11 @@ +mograsim version: 0.1.3 +{ + "standardSubcomponentHandlerSuppliers": { + "delegating": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.DelegatingSubcomponentHighLevelStateHandler" + }, + "standardAtomicHandlerSuppliers": { + "delegating": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler", + "wireForcing": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.WireForcingAtomicHighLevelStateHandler", + "bitVectorSplitting": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler" + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java new file mode 100644 index 00000000..12a98887 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java @@ -0,0 +1,124 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; + +public class DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler +{ + private final SubmodelComponent parentComponent; + private ModelComponent delegateTarget; + private String prefix; + + public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component, + DelegatingSubcomponentHighLevelStateHandlerParams params) + { + this.parentComponent = component; + if (params != null) + { + // TODO document this + if (params.delegateTarget == null) + setDelegateTarget(parentComponent); + else + { + ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget); + if (delegateTarget == null) + throw new NullPointerException("No subcomponent with name " + params.delegateTarget); + setDelegateTarget(delegateTarget); + } + setPrefix(params.prefix); + } + parentComponent.submodel.addComponentRemovedListener(c -> + { + if (delegateTarget == c) + delegateTarget = null; + }); + } + + public void set(ModelComponent delegateTarget, String prefix) + { + setDelegateTarget(delegateTarget); + setPrefix(prefix); + } + + public void setDelegateTarget(ModelComponent delegateTarget) + { + if (delegateTarget == null) + this.delegateTarget = parentComponent; + else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget) + throw new IllegalArgumentException( + "Can only set components belonging to the submodel of the parent component of this handler as the delegate target"); + this.delegateTarget = delegateTarget; + } + + public ModelComponent getDelegateTarget() + { + return delegateTarget; + } + + public void setPrefix(String prefix) + { + this.prefix = prefix; + } + + public String getPrefix() + { + return prefix; + } + + @Override + public Object getHighLevelState(String subStateID) + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID)); + } + + @Override + public void setHighLevelState(String subStateID, Object newState) + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState); + } + + private String getDelegateTargetHighLevelStateID(String subStateID) + { + return prefix == null ? subStateID : prefix + '.' + subStateID; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "delegating"; + } + + @Override + public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams(); + params.delegateTarget = delegateTarget.getName(); + params.prefix = prefix; + return params; + } + + public static class DelegatingSubcomponentHighLevelStateHandlerParams + { + public String delegateTarget; + public String prefix; + } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier + .setSnippetSupplier(DelegatingSubcomponentHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion + .create(DelegatingSubcomponentHighLevelStateHandlerParams.class, DelegatingSubcomponentHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java new file mode 100644 index 00000000..4c82bdcf --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java @@ -0,0 +1,31 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.serializing.JSONSerializable; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; + +public interface SubcomponentHighLevelStateHandler extends JSONSerializable +{ + /** + * Gets the current value of the given high level state of the subcomponent represented by this SubcomponentHighLevelStateHandler.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @author Daniel Kirschten + */ + public Object getHighLevelState(String subStateID); + + /** + * Sets the given high level state of the subcomponent represented by this SubcomponentHighLevelStateHandler to the given value.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @author Daniel Kirschten + */ + public void setHighLevelState(String subStateID, Object newState); + + public static class SubcomponentHighLevelStateHandlerParams + { + public String id; + public JsonElement params; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java new file mode 100644 index 00000000..90f25a41 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java @@ -0,0 +1,54 @@ +package net.mograsim.logic.model.snippets.outlinerenderers; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +public class DefaultOutlineRenderer implements Renderer +{ + private final ModelComponent component; + + public DefaultOutlineRenderer(ModelComponent component) + { + this(component, null); + } + + public DefaultOutlineRenderer(ModelComponent component, @SuppressWarnings("unused") Void params) + { + this.component = component; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.foreground"); + if (fg != null) + gc.setForeground(ColorManager.current().toColor(fg)); + gc.drawRectangle(component.getBounds()); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "default"; + } + + @Override + public Void getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + static + { + SubmodelComponentSnippetSuppliers.outlineRendererSupplier.setSnippetSupplier(DefaultOutlineRenderer.class.getCanonicalName(), + SnippetDefinintion.create(Void.class, DefaultOutlineRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json new file mode 100644 index 00000000..05007698 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json @@ -0,0 +1,16 @@ +mograsim version: 0.1.3 +{ + "standardOutlineRendererSuppliers": { + "default": "class:net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer" + }, + "standardSymbolRendererSuppliers": { + "default": "class:net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer", + "centeredText": "class:net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer", + "simpleRectangularLike": "class:net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer", + "pinNames": "class:net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer" + }, + "standardHighLevelStateHandlerSuppliers": { + "default": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler", + "standard": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler" + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java new file mode 100644 index 00000000..9a6599a6 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java @@ -0,0 +1,75 @@ +package net.mograsim.logic.model.snippets.symbolrenderers; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +/** + * Renders a text ("text") with a given font height ("height") in the center of the component. + * + * @author Daniel Kirschten + */ +public class CenteredTextSymbolRenderer implements Renderer +{ + private final ModelComponent component; + private final String text; + private final double fontHeight; + + public CenteredTextSymbolRenderer(ModelComponent component, CenteredTextParams params) + { + this.component = component; + this.text = params.text; + this.fontHeight = params.fontHeight; + + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Font oldFont = gc.getFont(); + gc.setFont(new Font(oldFont.getName(), fontHeight, oldFont.getStyle())); + ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text"); + if (fg != null) + gc.setForeground(ColorManager.current().toColor(fg)); + Point idSize = gc.textExtent(text); + Rectangle bounds = component.getBounds(); + gc.drawText(text, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true); + gc.setFont(oldFont); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "centeredText"; + } + + @Override + public CenteredTextParams getParamsForSerializing(IdentifyParams idParams) + { + CenteredTextParams params = new CenteredTextParams(); + params.text = text; + params.fontHeight = fontHeight; + return params; + } + + public static class CenteredTextParams + { + public String text; + public double fontHeight; + } + + static + { + SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(CenteredTextSymbolRenderer.class.getCanonicalName(), + SnippetDefinintion.create(CenteredTextParams.class, CenteredTextSymbolRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java new file mode 100644 index 00000000..28ad8a86 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java @@ -0,0 +1,59 @@ +package net.mograsim.logic.model.snippets.symbolrenderers; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +public class DefaultSymbolRenderer implements Renderer +{ + private static final String id = ""; + + private final ModelComponent component; + + public DefaultSymbolRenderer(ModelComponent component) + { + this(component, null); + } + + public DefaultSymbolRenderer(ModelComponent component, @SuppressWarnings("unused") Void params) + { + this.component = component; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text"); + if (fg != null) + gc.setForeground(ColorManager.current().toColor(fg)); + Point idSize = gc.textExtent(id); + Rectangle bounds = component.getBounds(); + gc.drawText(id, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "default"; + } + + @Override + public Void getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + static + { + SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(DefaultSymbolRenderer.class.getCanonicalName(), + SnippetDefinintion.create(Void.class, DefaultSymbolRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java new file mode 100644 index 00000000..ede87105 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java @@ -0,0 +1,116 @@ +package net.mograsim.logic.model.snippets.symbolrenderers; + +import java.util.HashMap; +import java.util.Map; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class PinNamesSymbolRenderer implements Renderer +{ + private final ModelComponent component; + private final Map pinPositions; + private final double pinLabelHeight; + private final double pinLabelMargin; + + public PinNamesSymbolRenderer(ModelComponent component, PinNamesParams params) + { + this.component = component; + this.pinPositions = new HashMap<>(); + this.pinLabelHeight = params.pinLabelHeight; + this.pinLabelMargin = params.pinLabelMargin; + if (params.pinNamePositions != null) + params.pinNamePositions.forEach(this::setPinPosition); + component.addPinRemovedListener(p -> setPinPosition(p, null)); + } + + public void setPinPosition(String pinName, Position position) + { + setPinPosition(component.getPin(pinName), position); + } + + public void setPinPosition(Pin pin, Position position) + { + if (position == null) + pinPositions.remove(pin); + else + pinPositions.put(pin, position); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Font oldFont = gc.getFont(); + gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle())); + for (Pin pin : component.getPins().values()) + { + Position pos = pinPositions.get(pin); + if (pos == null) + pos = Position.RIGHT; + + Point topleft = pin.getPos(); + Point textExtent = gc.textExtent(pin.name); + + double x2 = topleft.x - textExtent.x - pinLabelMargin; + double y2 = topleft.y - textExtent.y - pinLabelMargin; + double x1 = topleft.x + pinLabelMargin; + double y1 = topleft.y + pinLabelMargin; + + double x = pos.posX * x1 + (1 - pos.posX) * x2; + double y = pos.posY * y1 + (1 - pos.posY) * y2; + + gc.drawText(pin.name, x, y, true); + } + gc.setFont(oldFont); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "pinNames"; + } + + @Override + public PinNamesParams getParamsForSerializing(IdentifyParams idParams) + { + PinNamesParams params = new PinNamesParams(); + params.pinNamePositions = new HashMap<>(); + pinPositions.forEach((pin, pos) -> params.pinNamePositions.put(pin.name, pos)); + return params; + } + + public static class PinNamesParams + { + public Map pinNamePositions; + public double pinLabelHeight; + public double pinLabelMargin; + + public static enum Position + { + TOP(.5, 0), TOP_LEFT(0, 0), LEFT(0, .5), BOTTOM_LEFT(0, 1), BOTTOM(.5, 1), BOTTOM_RIGHT(1, 1), RIGHT(1, .5), TOP_RIGHT(1, 0); + + private final double posX, posY; + + private Position(double posX, double posY) + { + this.posX = posX; + this.posY = posY; + } + } + } + + static + { + SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(PinNamesSymbolRenderer.class.getCanonicalName(), + SnippetDefinintion.create(PinNamesParams.class, PinNamesSymbolRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java new file mode 100644 index 00000000..d57203ab --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java @@ -0,0 +1,108 @@ +package net.mograsim.logic.model.snippets.symbolrenderers; + +import java.util.Map.Entry; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.preferences.Preferences; + +/** + * Renders a text ("centerText") with a given font height ("centerTextHeight") in the center of the component and + * draws a label for each pin with a given font height ("pinLabelHeight"). The labels of pins to the left of a given x + * coordinate ("horizontalComponentCenter") are drawn to the right of the respective pin; labels of pins to the right are drawn + * left. A margin ("pinLabelMargin") is applied for pin label drawing. + * + * @author Daniel Kirschten + */ +public class SimpleRectangularLikeSymbolRenderer implements Renderer +{ + private final ModelComponent component; + private final String centerText; + private final double centerTextHeight; + private final double horizontalComponentCenter; + private final double pinLabelHeight; + private final double pinLabelMargin; + + public SimpleRectangularLikeSymbolRenderer(ModelComponent component, SimpleRectangularLikeParams params) + { + this.component = component; + this.centerText = params.centerText; + this.centerTextHeight = params.centerTextHeight; + this.horizontalComponentCenter = params.horizontalComponentCenter; + this.pinLabelHeight = params.pinLabelHeight; + this.pinLabelMargin = params.pinLabelMargin; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + double posX = component.getPosX(); + double posY = component.getPosY(); + double width = component.getWidth(); + double height = component.getHeight(); + + Font oldFont = gc.getFont(); + gc.setFont(new Font(oldFont.getName(), centerTextHeight, oldFont.getStyle())); + Point textExtent = gc.textExtent(centerText); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(centerText, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true); + gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle())); + for (Entry pinEntry : component.getPins().entrySet()) + { + String pinName = pinEntry.getKey(); + Pin pin = pinEntry.getValue(); + double pinX = pin.getRelX(); + double pinY = posY + pin.getRelY(); + textExtent = gc.textExtent(pinName); + gc.drawText(pinName, posX + pinX + (pinX > horizontalComponentCenter ? -textExtent.x - pinLabelMargin : pinLabelMargin), + pinY - textExtent.y / 2, true); + } + gc.setFont(oldFont); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "simpleRectangularLike"; + } + + @Override + public SimpleRectangularLikeParams getParamsForSerializing(IdentifyParams idParams) + { + SimpleRectangularLikeParams params = new SimpleRectangularLikeParams(); + params.centerText = centerText; + params.centerTextHeight = centerTextHeight; + params.horizontalComponentCenter = horizontalComponentCenter; + params.pinLabelHeight = pinLabelHeight; + params.pinLabelMargin = pinLabelMargin; + return params; + } + + public static class SimpleRectangularLikeParams + { + public String centerText; + public double centerTextHeight; + public double horizontalComponentCenter; + public double pinLabelHeight; + public double pinLabelMargin; + } + + static + { + SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier( + SimpleRectangularLikeSymbolRenderer.class.getCanonicalName(), + SnippetDefinintion.create(SimpleRectangularLikeParams.class, SimpleRectangularLikeSymbolRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java new file mode 100644 index 00000000..20491ce5 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java @@ -0,0 +1,69 @@ +package net.mograsim.logic.model.util; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.stream.Collectors; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; + +public class JsonHandler +{ + public final static Gson parser = new GsonBuilder().setPrettyPrinting().create(); + + public static T readJson(String path, Class type) throws IOException + { + try (FileInputStream jsonStream = new FileInputStream(path)) + { + return readJson(jsonStream, type); + } + } + + /** + * @param input The Stream is closed after being read + */ + public static T readJson(InputStream input, Class type) throws IOException + { + try (InputStreamReader reader = new InputStreamReader(input, StandardCharsets.UTF_8); + BufferedReader bf = new BufferedReader(reader)) + { + return fromJson(bf.lines().collect(Collectors.joining("\n")), type); + } + } + + public static T fromJson(String src, Class type) + { + // throw away legacy version line + String rawJson = src.lines().dropWhile(s -> s.length() == 0 || s.charAt(0) != '{').collect(Collectors.joining()); + return parser.fromJson(rawJson, type); + } + + public static T fromJsonTree(JsonElement src, Class type) + { + return parser.fromJson(src, type); + } + + public static void writeJson(Object o, String path) throws IOException + { + try (FileWriter writer = new FileWriter(path)) + { + writer.write(toJson(o)); + } + } + + public static String toJson(Object o) + { + return parser.toJson(o); + } + + public static JsonElement toJsonTree(Object o) + { + return parser.toJsonTree(o); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java new file mode 100644 index 00000000..58a86ea0 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java @@ -0,0 +1,112 @@ +package net.mograsim.logic.model.util; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; + +public class ModellingTool +{ + private LogicModelModifiable model; + + ModellingTool(LogicModelModifiable model) + { + this.model = model; + } + + public ModelWire connect(ModelComponent a, ModelComponent b, String pinA, String pinB) + { + return connect(null, a, b, pinA, pinB); + } + + public ModelWire connect(ModelWireCrossPoint a, ModelComponent b, String pinB) + { + return connect(null, a, b, pinB); + } + + public ModelWire connect(Pin a, ModelComponent b, String pinB) + { + return connect(null, a, b, pinB); + } + + public ModelWire connect(ModelComponent a, ModelWireCrossPoint b, String pinA) + { + return connect(null, a, b, pinA); + } + + public ModelWire connect(ModelWireCrossPoint a, ModelWireCrossPoint b) + { + return connect(null, a, b); + } + + public ModelWire connect(Pin a, ModelWireCrossPoint b) + { + return connect(null, a, b); + } + + public ModelWire connect(ModelComponent a, Pin b, String pinA) + { + return connect(null, a, b, pinA); + } + + public ModelWire connect(ModelWireCrossPoint a, Pin b) + { + return connect(null, a, b); + } + + public ModelWire connect(Pin a, Pin b) + { + return connect(null, a, b); + } + + public ModelWire connect(String name, ModelComponent a, ModelComponent b, String pinA, String pinB) + { + return connect(name, a.getPin(pinA), b.getPin(pinB)); + } + + public ModelWire connect(String name, ModelWireCrossPoint a, ModelComponent b, String pinB) + { + return connect(name, a.getPin(), b.getPin(pinB)); + } + + public ModelWire connect(String name, Pin a, ModelComponent b, String pinB) + { + return connect(name, a, b.getPin(pinB)); + } + + public ModelWire connect(String name, ModelComponent a, ModelWireCrossPoint b, String pinA) + { + return connect(name, a.getPin(pinA), b.getPin()); + } + + public ModelWire connect(String name, ModelWireCrossPoint a, ModelWireCrossPoint b) + { + return connect(name, a.getPin(), b.getPin()); + } + + public ModelWire connect(String name, Pin a, ModelWireCrossPoint b) + { + return connect(name, a, b.getPin()); + } + + public ModelWire connect(String name, ModelComponent a, Pin b, String pinA) + { + return connect(name, a.getPin(pinA), b); + } + + public ModelWire connect(String name, ModelWireCrossPoint a, Pin b) + { + return connect(name, a.getPin(), b); + } + + public ModelWire connect(String name, Pin a, Pin b) + { + return new ModelWire(model, name, a, b); + } + + public static ModellingTool createFor(LogicModelModifiable model) + { + return new ModellingTool(model); + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java new file mode 100644 index 00000000..00aeed89 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java @@ -0,0 +1,139 @@ +package net.mograsim.logic.model.util; + +import java.io.IOException; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +import net.mograsim.logic.model.util.Version.VersionJSONAdapter; + +@JsonAdapter(VersionJSONAdapter.class) +public final class Version implements Comparable +{ + public final int major, minor, patch; + + public Version(int major, int minor, int patch) + { + super(); + this.major = major; + this.minor = minor; + this.patch = patch; + } + + public int[] getVersionNumbers() + { + return new int[] { major, minor, patch }; + } + + @Override + public String toString() + { + return toSemverString(); + } + + public String toSemverString() + { + return major + "." + minor + "." + patch; + } + + public static Version parseSemver(String semver) + { + String[] semverParts = semver.split("\\."); + return new Version(Integer.parseInt(semverParts[0]), semverParts.length > 1 ? Integer.parseInt(semverParts[1]) : 0, + semverParts.length > 2 ? Integer.parseInt(semverParts[2]) : 0); + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + major; + result = prime * result + minor; + result = prime * result + patch; + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof Version)) + return false; + Version other = (Version) obj; + if (major != other.major) + return false; + if (minor != other.minor) + return false; + if (patch != other.patch) + return false; + return true; + } + + public boolean is(int major) + { + return major == this.major; + } + + public boolean is(int major, int minor) + { + return is(major) && this.minor == minor; + } + + public boolean is(int major, int minor, int patch) + { + return is(major, minor) && this.patch == patch; + } + + /** + * Compares this {@link Version} with the specified version.
+ * As required by {@link Comparable#compareTo(Object)}, returns a negative integer, zero, or a positive integer as this version is less + * (earlier) than, equal to, or greater (later) than the specified version. + *

+ * If the versions are equal ({@link #major}, {@link #minor}, {@link #patch} are the same), returns 0.
+ * If they differ in {@link #patch}, but neither {@link #major} or {@link #minor} , returns +-1.
+ * If they differ in {@link #minor}, but not {@link #major}, returns +-2.
+ * If they differ in {@link #major}, returns +-3. + */ + @Override + public int compareTo(Version o) + { + if (major != o.major) + { + if (major > o.major) + return 3; + return -3; + } + if (minor != o.minor) + { + if (minor > o.minor) + return 2; + return -2; + } + if (patch != o.patch) + { + if (patch > o.patch) + return 1; + return -1; + } + return 0; + } + + static class VersionJSONAdapter extends TypeAdapter + { + @Override + public void write(JsonWriter out, Version value) throws IOException + { + out.value(value.toSemverString()); + } + + @Override + public Version read(JsonReader in) throws IOException + { + return parseSemver(in.nextString()); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.machine/.classpath b/plugins/net.mograsim.machine/.classpath new file mode 100644 index 00000000..f0d0c735 --- /dev/null +++ b/plugins/net.mograsim.machine/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.machine/.project b/plugins/net.mograsim.machine/.project new file mode 100644 index 00000000..d179b4ce --- /dev/null +++ b/plugins/net.mograsim.machine/.project @@ -0,0 +1,28 @@ + + + net.mograsim.machine + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.machine/META-INF/MANIFEST.MF b/plugins/net.mograsim.machine/META-INF/MANIFEST.MF new file mode 100644 index 00000000..afbfc4c4 --- /dev/null +++ b/plugins/net.mograsim.machine/META-INF/MANIFEST.MF @@ -0,0 +1,22 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Mograsim Machine Definition +Bundle-SymbolicName: net.mograsim.machine;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Automatic-Module-Name: net.mograsim.machine +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: net.mograsim.logic.core;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.logic.model;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.preferences;visibility:=reexport, + org.eclipse.e4.core.di.annotations, + org.eclipse.core.runtime +Export-Package: net.mograsim.machine, + net.mograsim.machine.isa, + net.mograsim.machine.isa.types, + net.mograsim.machine.mi, + net.mograsim.machine.mi.components, + net.mograsim.machine.mi.parameters, + net.mograsim.machine.standard.memory +Bundle-Activator: net.mograsim.machine.MachineLoader +Bundle-ActivationPolicy: lazy diff --git a/plugins/net.mograsim.machine/build.properties b/plugins/net.mograsim.machine/build.properties new file mode 100644 index 00000000..3090e4c0 --- /dev/null +++ b/plugins/net.mograsim.machine/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +bin.includes = META-INF/,\ + .,\ + plugin.xml,\ + schema/ diff --git a/plugins/net.mograsim.machine/plugin.xml b/plugins/net.mograsim.machine/plugin.xml new file mode 100644 index 00000000..8c71c6db --- /dev/null +++ b/plugins/net.mograsim.machine/plugin.xml @@ -0,0 +1,5 @@ + + + + > + diff --git a/plugins/net.mograsim.machine/schema/machine_definition.exsd b/plugins/net.mograsim.machine/schema/machine_definition.exsd new file mode 100644 index 00000000..e5e147bf --- /dev/null +++ b/plugins/net.mograsim.machine/schema/machine_definition.exsd @@ -0,0 +1,109 @@ + + + + + + + + + Mograsim extension for defining a machine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The machines id, this should be unique, but still readable + + + + + + + A Class that implements the Mograsim Machine Definition + + + + + + + + + + + + + + + 0.1.0 + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java new file mode 100644 index 00000000..eab88b97 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java @@ -0,0 +1,6 @@ +package net.mograsim.machine; + +public interface AddressingScema +{ + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java new file mode 100644 index 00000000..80520140 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java @@ -0,0 +1,119 @@ +package net.mograsim.machine; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +public abstract class GenericMemory implements Memory +{ + private final long minimalAddress, maximalAddress; + private final MemoryDefinition definition; + private final int pageSize = 64; + private Set observers = new HashSet<>(); + + private HashMap pages; + + public GenericMemory(MemoryDefinition definition) + { + super(); + this.definition = definition; + this.minimalAddress = definition.getMinimalAddress(); + this.maximalAddress = definition.getMaximalAddress(); + this.pages = new HashMap<>(); + } + + private void inBoundsCheck(long address) + { + if (address < minimalAddress || address > maximalAddress) + throw new IndexOutOfBoundsException(String.format("Memory address out of bounds! Minimum: %d Maximum: %d Actual: %d", + minimalAddress, maximalAddress, address)); + } + + private long page(long address) + { + return address / pageSize; + } + + private int offset(long address) + { + return (int) (address % pageSize); + } + + @Override + public void setCell(long address, T data) + { + inBoundsCheck(address); + long page = page(address); + int offset = offset(address); + Page p = pages.get(Long.valueOf(page)); + if (p == null) + pages.put(page, p = new Page()); + p.setCell(offset, data); + notifyObservers(address); + } + + @Override + public T getCell(long address) + { + inBoundsCheck(address); + long page = page(address); + int offset = offset(address); + Page p = pages.get(Long.valueOf(page)); + if (p == null) + return null; + return p.getCell(offset); + } + + private class Page + { + private Object[] memory; + + public Page() + { + memory = new Object[pageSize]; + } + + public T getCell(int index) + { + @SuppressWarnings("unchecked") + T data = (T) memory[index]; + return data; + } + + public void setCell(int index, T data) + { + memory[index] = data; + } + + @Override + public String toString() + { + return Arrays.deepToString(memory); + } + } + + @Override + public void registerObserver(MemoryObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(MemoryObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers(long address) + { + observers.forEach(ob -> ob.update(address)); + } + + @Override + public MemoryDefinition getDefinition() + { + return definition; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/ISA.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/ISA.java new file mode 100644 index 00000000..eaec0d94 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/ISA.java @@ -0,0 +1,5 @@ +package net.mograsim.machine; + +public interface ISA +{ +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java new file mode 100644 index 00000000..72e66855 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java @@ -0,0 +1,12 @@ +package net.mograsim.machine; + +import java.util.Set; + +import net.mograsim.machine.isa.AsmOperand; + +public interface ISASchema +{ + Set getSupportedOperands(); + + AddressingScema getAddressingSchema(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/Machine.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/Machine.java new file mode 100644 index 00000000..6ff074d0 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/Machine.java @@ -0,0 +1,29 @@ +package net.mograsim.machine; + +import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.MicroInstructionMemory; +import net.mograsim.logic.model.model.LogicModel; + +public interface Machine +{ + MachineDefinition getDefinition(); + + void reset(); + + LogicModel getModel(); + + CoreClock getClock(); + + BitVector getRegister(Register r); + + void setRegister(Register r, BitVector value); + + Timeline getTimeline(); + + MainMemory getMainMemory(); + + MicroInstructionMemory getMicroInstructionMemory(); + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java new file mode 100644 index 00000000..02cf3757 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java @@ -0,0 +1,59 @@ +package net.mograsim.machine; + +import java.util.Set; + +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public interface MachineDefinition +{ + + /** + * Creates a new instance of the machine + * + * @return a new object of an {@link Machine} implementation. + * @author Christian Femers + */ + Machine createNew(); + + /** + * Returns the schema that all possible ISAs (Instruction Set Architecture) must be based on. + * + * @return an {@link ISASchema} implementation fitting the machine + * @author Christian Femers + */ + ISASchema getISASchema(); + + /** + * Returns a set of all {@link Register}s present in the machine. + * + * @return all registers present in the machine. + * @author Christian Femers + */ + Set getRegisters(); + + /** + * The number of bits used by the machine to address main memory. Note that this should be the number of bits used in the CPU, not a + * possibly different one used by the bus system. + * + * @return the number of bits used by the CPU + * @see MainMemoryDefinition#getMemoryAddressBits() + * @author Christian Femers + */ + int getAddressBits(); + + /** + * Returns the definition of the machines main memory. + * + * @return the {@link MainMemoryDefinition} that defines the main memory. + * @author Christian Femers + */ + MainMemoryDefinition getMainMemoryDefinition(); + + /** + * Returns the definition of the machines instruction memory. + * + * @return the {@link InstructionMemoryDefinition} that defines the instruction memory. + */ + MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition(); + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineException.java new file mode 100644 index 00000000..ee9026a7 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineException.java @@ -0,0 +1,25 @@ +package net.mograsim.machine; + +public class MachineException extends RuntimeException +{ + + /** + * + */ + private static final long serialVersionUID = 6224307211078376836L; + + public MachineException() + { + super(); + } + + public MachineException(String message) + { + super(message); + } + + public MachineException(Throwable cause) + { + super(cause); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java new file mode 100644 index 00000000..9a88575b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java @@ -0,0 +1,36 @@ +package net.mograsim.machine; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import net.mograsim.logic.model.serializing.ClassLoaderBasedResourceLoader; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class MachineLoader implements BundleActivator +{ + private static AtomicBoolean activated = new AtomicBoolean(false); + + @Override + public void start(BundleContext context) throws Exception + { + setup(); + } + + @Override + public void stop(BundleContext context) throws Exception + { + // nothing + } + + public static void setup() + { + if (activated.getAndSet(true)) + return; + ClassLoaderBasedResourceLoader resourceLoader = ClassLoaderBasedResourceLoader.create(MachineLoader.class.getClassLoader()); + IndirectModelComponentCreator.registerResourceLoader(resourceLoader, "MachineLoader"); + IndirectModelComponentCreator.loadStandardComponentIDs(MachineLoader.class.getResourceAsStream("standardComponentIDMapping.json")); +// System.out.println("SETUP DONE"); // TODO: Debug + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java new file mode 100644 index 00000000..a2706462 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java @@ -0,0 +1,52 @@ +package net.mograsim.machine; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.Platform; + +public class MachineRegistry +{ + private static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition"; + + private static Map installedMachines = new HashMap<>(); + + public static void reload() + { + IExtensionRegistry registry = Platform.getExtensionRegistry(); + System.out.println(Arrays.toString(registry.getExtensionPoints("net.mograsim.machine"))); + IConfigurationElement[] config = registry.getConfigurationElementsFor(MACHINE_EXT_ID); + try + { + for (IConfigurationElement e : config) + { + System.out.println(e.getNamespaceIdentifier()); + System.out.println(Arrays.toString(e.getAttributeNames())); + final Object o = e.createExecutableExtension("class"); + final String id = e.getAttribute("unique_id"); + if (o instanceof MachineDefinition) + { + System.out.println("Found " + id); + installedMachines.put(id, (MachineDefinition) o); + } else + { + System.err.println("Invalid machine definition: " + o + "(id=" + id + ""); + } + } + } + catch (CoreException ex) + { + System.out.println(ex.getMessage()); + } + } + + public static Map getinstalledMachines() + { + return Collections.unmodifiableMap(installedMachines); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java new file mode 100644 index 00000000..94140b73 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java @@ -0,0 +1,14 @@ +package net.mograsim.machine; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.BitVector; + +public interface MainMemory extends Memory +{ + public BigInteger getCellAsBigInteger(long address); + + public void setCellAsBigInteger(long address, BigInteger word); + + public MainMemoryDefinition getDefinition(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java new file mode 100644 index 00000000..72153d6d --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java @@ -0,0 +1,24 @@ +package net.mograsim.machine; + +/** + * This interface provides a means to get information about the machines memory architecture. It is not bound to any actual memory. + * + * @author Christian Femers + * + */ +public interface MainMemoryDefinition extends MemoryDefinition +{ + /** + * The width in bits of an addressable memory cell/unit. This is often 8 (= one byte). The actual cells/lines of the memory may be a lot + * larger. + * + * @return the addressable unit width in bits + * @author Christian Femers + */ + int getCellWidth(); + + public static MainMemoryDefinition create(int memoryAddressBits, int cellWidth, long minimalAddress, long maximalAddress) + { + return new StandardMainMemoryDefinition(memoryAddressBits, cellWidth, minimalAddress, maximalAddress); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/Memory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/Memory.java new file mode 100644 index 00000000..0ff9bb41 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/Memory.java @@ -0,0 +1,36 @@ +package net.mograsim.machine; + +public interface Memory +{ + /** + * @param address The address of the desired data. Must be non-negative + * @return The data at the requested address + * + * @throws IndexOutOfBoundsException + */ + public T getCell(long address); + + /** + * Sets the data at the supplied address + * + * @throws IndexOutOfBoundsException + */ + public void setCell(long address, T data); + + public default long size() + { + MemoryDefinition def = getDefinition(); + return Long.max(0, def.getMaximalAddress() - def.getMinimalAddress() + 1); + } + + /** + * Registers an observer to be notified when a memory cell is modified + */ + public void registerObserver(MemoryObserver ob); + + public void deregisterObserver(MemoryObserver ob); + + public void notifyObservers(long address); + + public MemoryDefinition getDefinition(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java new file mode 100644 index 00000000..39d12c44 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java @@ -0,0 +1,45 @@ +package net.mograsim.machine; + +public interface MemoryDefinition +{ + + /** + * The number of bits that the main memory uses to address cells. Note that this does not need to equal + * {@link MachineDefinition#getAddressBits()}. + * + * @return the number of bits used to address a memory cell + * @author Christian Femers + */ + int getMemoryAddressBits(); + + /** + * The minimal address possible to address/use. This is usually 0. + * + * @return the minimal possible address. + * @author Christian Femers + */ + long getMinimalAddress(); + + /** + * The maximal address possible to address/use. + * + * @return the maximal possible address as unsigned long + * @author Christian Femers + */ + long getMaximalAddress(); + + /** + * The size of the MainMemory as the amount of addressable memory cells. + * + * @return the amount of addressable memory cells + */ + default long size() + { + return getMaximalAddress() - getMinimalAddress() + 1; + } + + public static MemoryDefinition create(int memoryAddressBits, long minimalAddress, long maximalAddress) + { + return new StandardMemoryDefinition(memoryAddressBits, minimalAddress, maximalAddress); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java new file mode 100644 index 00000000..1d7fc4dd --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java @@ -0,0 +1,6 @@ +package net.mograsim.machine; + +public interface MemoryObserver +{ + public void update(long address); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java new file mode 100644 index 00000000..d0459dc1 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java @@ -0,0 +1,53 @@ +package net.mograsim.machine; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; + +public abstract class ModelMemory extends ModelComponent +{ + private Renderer symbolRenderer; + private Renderer outlineRenderer; + private M machine; + + protected ModelMemory(LogicModelModifiable model, int width, int height, String name, String centerText, boolean callInit) + { + super(model, name, false); + + SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams(); + rendererParams.centerText = centerText; + rendererParams.centerTextHeight = 5; + rendererParams.horizontalComponentCenter = width / 2; + rendererParams.pinLabelHeight = 2.5; + rendererParams.pinLabelMargin = 0.5; + this.symbolRenderer = new SimpleRectangularLikeSymbolRenderer(this, rendererParams); + this.outlineRenderer = new DefaultOutlineRenderer(this); + + setSize(width, height); + + if (callInit) + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + symbolRenderer.render(gc, visibleRegion); + outlineRenderer.render(gc, visibleRegion); + } + + public void setMachine(M machine) + { + this.machine = machine; + } + + public M getMachine() + { + return machine; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java new file mode 100644 index 00000000..4bcb7f25 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java @@ -0,0 +1,53 @@ +package net.mograsim.machine; + +import java.util.Set; + +/** + * A register in a machine is defined by this interface. A hardware register may have {@link Register#names() named sub-registers}. + * + * + * @author Christian Femers + * + */ +public interface Register +{ + /** + * The unique identifier of the register. This does not have to be the display name or name in the assembly language. + * + * @return the registers id as case sensitive String + * @author Christian Femers + */ + String id(); + + /** + * The name(s) of this register. This is the displayed name and the name used in the assembly language. All names of all registers must + * be case-insensitive unique. A register can have multiple names if these names address different regions (but still have a common + * hardware structure), e.g. EAX, AX, AL, AH. + * + * @return all the names of regions addressing this register, must be case-insensitive. + * @author Christian Femers + */ + Set names(); + + /** + * Returns the complete width in bits of the underlying hardware structure the register and possible sub-registers are part of. + * + * @param name the name of the register + * @return the width of the (sub-)register in bits. + * + * @see #names() + * @author Christian Femers + */ + int getWidth(); + + /** + * Returns the width in bits of the register or a named part of it. + * + * @param name the name of the register + * @return the width of the (sub-)register in bits. + * + * @see #names() + * @author Christian Femers + */ + int getWidth(String name); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java new file mode 100644 index 00000000..22be93ee --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java @@ -0,0 +1,18 @@ +package net.mograsim.machine; + +class StandardMainMemoryDefinition extends StandardMemoryDefinition implements MainMemoryDefinition +{ + private final int cellWidth; + + StandardMainMemoryDefinition(int memoryAddressBits, int cellWidth, long minimalAddress, long maximalAddress) + { + super(memoryAddressBits, minimalAddress, maximalAddress); + this.cellWidth = cellWidth; + } + + @Override + public int getCellWidth() + { + return cellWidth; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java new file mode 100644 index 00000000..f0d755f5 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java @@ -0,0 +1,43 @@ +package net.mograsim.machine; + +class StandardMemoryDefinition implements MemoryDefinition +{ + private final int memoryAddressBits; + private final long minimalAddress, maximalAddress; + + StandardMemoryDefinition(int memoryAddressBits, long minimalAddress, long maximalAddress) + { + super(); + this.memoryAddressBits = memoryAddressBits; + this.minimalAddress = minimalAddress; + this.maximalAddress = maximalAddress; + } + + public StandardMemoryDefinition(MainMemoryDefinition definition) + { + this(definition.getMemoryAddressBits(), definition.getMinimalAddress(), definition.getMaximalAddress()); + } + + @Override + public int getMemoryAddressBits() + { + return memoryAddressBits; + } + + @Override + public long getMinimalAddress() + { + return minimalAddress; + } + + @Override + public long getMaximalAddress() + { + return maximalAddress; + } + + public static MemoryDefinition create(int memoryAddressBits, long minimalAddress, long maximalAddress) + { + return new StandardMemoryDefinition(memoryAddressBits, minimalAddress, maximalAddress); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java new file mode 100644 index 00000000..07b56c29 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java @@ -0,0 +1,6 @@ +package net.mograsim.machine.isa; + +public interface AsmElement +{ + // only marker at the moment +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java new file mode 100644 index 00000000..7a1a6ebf --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java @@ -0,0 +1,98 @@ +package net.mograsim.machine.isa; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.machine.isa.types.AsmNumberFormatException; + +public class AsmFloatOperand implements AsmOperand +{ + private final int size; + private final int mantissa; + private final int exponent; + + public AsmFloatOperand(int size) + { + this.size = size; + switch (size) + { + case 8: + exponent = 4; + mantissa = 3; + break; + case 16: + exponent = 5; + mantissa = 10; + break; + case 32: + exponent = 8; + mantissa = 23; + break; + case 64: + exponent = 11; + mantissa = 52; + break; + case 128: + exponent = 15; + mantissa = 112; + break; + default: + if (size > 128 && size % 32 == 0) + { + exponent = (int) Math.round(Math.log(size) / Math.log(2)) - 13; + mantissa = size - exponent - 1; + } else + { + throw new IllegalArgumentException("Illegal floating point size: " + size); + } + } + } + + public AsmFloatOperand(int exponent, int mantissa) + { + if (exponent < 1 || mantissa < 1) + throw new IllegalArgumentException("illegal floating point specification: e=" + exponent + ", m=" + mantissa); + this.exponent = exponent; + this.mantissa = mantissa; + this.size = exponent + mantissa + 1; + } + + @Override + public int getSize() + { + return size; + } + + @Override + public BitVector parse(String s) throws AsmNumberFormatException + { + String cleaned = s.replace("_", "").toLowerCase(); + int len = cleaned.length(); + BigInteger res; + try + { + return bigDecToBitVector(new BigDecimal(cleaned)); + } + catch (NumberFormatException e) + { + throw new AsmNumberFormatException(e, "Error parsing %s: no valid float format", s); + } + } + + BitVector bigDecToBitVector(BigDecimal bi) throws AsmNumberFormatException + { + BigInteger raw = bi.unscaledValue(); + int mantLen = raw.bitLength(); +// bi. + int bitLength = raw.bitLength() - (bi.signum() - 1) / 2; + if (bitLength > size) + throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size); + BitVectorMutator bvm = BitVectorMutator.ofLength(size); + for (int i = 0; i < size; i++) + bvm.setLSBit(i, Bit.of(raw.testBit(i))); + return bvm.toBitVector(); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java new file mode 100644 index 00000000..29bbf73b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java @@ -0,0 +1,39 @@ +package net.mograsim.machine.isa; + +import java.util.Objects; + +public final class AsmInstruction implements AsmElement +{ + private final AsmOperation operation; + private final AsmOperands operands; + + public AsmInstruction(AsmOperation operation, AsmOperands operands) + { + this.operation = Objects.requireNonNull(operation); + this.operands = Objects.requireNonNull(operands); + } + + @Override + public int hashCode() + { + return Objects.hash(operands, operation); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof AsmInstruction)) + return false; + AsmInstruction other = (AsmInstruction) obj; + return Objects.equals(operands, other.operands) && Objects.equals(operation, other.operation); + } + + @Override + public String toString() + { + return String.format("%s %s", operation, operands).trim(); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java new file mode 100644 index 00000000..d3ac80f9 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java @@ -0,0 +1,95 @@ +package net.mograsim.machine.isa; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.machine.isa.types.AsmNumberFormatException; + +public class AsmIntegerOperand implements AsmOperand +{ + private final int size; + + public AsmIntegerOperand(int size) + { + this.size = size; + } + + @Override + public int getSize() + { + return size; + } + + @Override + public BitVector parse(String s) throws AsmNumberFormatException + { + String cleaned = s.replace("_", "").toLowerCase(); + int len = cleaned.length(); + BigInteger res; + try + { + if (cleaned.startsWith("0x")) + res = new BigInteger(cleaned.substring(2), 16); + else if (cleaned.endsWith("h")) + res = new BigInteger(cleaned.substring(0, len - 1), 16); + else if (cleaned.startsWith("0b")) + res = new BigInteger(cleaned.substring(2), 2); + else if (cleaned.endsWith("b")) + res = new BigInteger(cleaned.substring(2), 2); + else if (cleaned.endsWith("q")) + res = new BigInteger(cleaned.substring(0, len - 1), 8); + else + res = new BigInteger(cleaned); + } + catch (NumberFormatException e) + { + throw new AsmNumberFormatException(e, "Error parsing %s: no valid integer format", s); + } + return bigIntToBitVector(res); + } + + BitVector bigIntToBitVector(BigInteger bi) throws AsmNumberFormatException + { + int bitLength = bi.bitLength() - (bi.signum() - 1) / 2; + if (bitLength > size) + throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size); + BitVectorMutator bvm = BitVectorMutator.ofLength(size); + for (int i = 0; i < size; i++) + bvm.setLSBit(i, Bit.of(bi.testBit(i))); + return bvm.toBitVector(); + } + + public static void main(String[] args) throws AsmNumberFormatException + { + AsmIntegerOperand aio = new AsmIntegerOperand(4); + System.out.println(aio.parse("0")); + System.out.println(aio.parse("1")); + System.out.println(aio.parse("2")); + System.out.println(aio.parse("3")); + System.out.println(aio.parse("4")); + System.out.println(aio.parse("5")); + System.out.println(aio.parse("6")); + System.out.println(aio.parse("7")); + System.out.println(aio.parse("8")); + System.out.println(aio.parse("9")); + System.out.println(aio.parse("10")); + System.out.println(aio.parse("11")); + System.out.println(aio.parse("12")); + System.out.println(aio.parse("13")); + System.out.println(aio.parse("14")); + System.out.println(aio.parse("15")); +// System.out.println(aio.parse("16")); + System.out.println(aio.parse("-0")); + System.out.println(aio.parse("-1")); + System.out.println(aio.parse("-2")); + System.out.println(aio.parse("-3")); + System.out.println(aio.parse("-4")); + System.out.println(aio.parse("-5")); + System.out.println(aio.parse("-6")); + System.out.println(aio.parse("-7")); + System.out.println(aio.parse("-8")); +// System.out.println(aio.parse("-9")); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java new file mode 100644 index 00000000..ddb56582 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java @@ -0,0 +1,49 @@ +package net.mograsim.machine.isa; + +import java.util.Objects; + +public final class AsmLabel implements AsmElement +{ + private final String name; + private AsmInstruction inst; + + public AsmLabel(String name) + { + this.name = Objects.requireNonNull(name); + } + + public String getName() + { + return name; + } + + public void setInst(AsmInstruction inst) + { + if (inst != null) + throw new IllegalStateException("Instrution already set for " + name); + this.inst = inst; + } + + @Override + public String toString() + { + return name + ":"; + } + + @Override + public int hashCode() + { + return Objects.hash(inst, name); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof AsmLabel)) + return false; + AsmLabel other = (AsmLabel) obj; + return Objects.equals(inst, other.inst) && Objects.equals(name, other.name); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java new file mode 100644 index 00000000..ad641d6b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java @@ -0,0 +1,11 @@ +package net.mograsim.machine.isa; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.isa.types.AsmException; + +public interface AsmOperand +{ + int getSize(); + + BitVector parse(String s) throws AsmException; +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java new file mode 100644 index 00000000..f286c315 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java @@ -0,0 +1,43 @@ +package net.mograsim.machine.isa; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public final class AsmOperands +{ + private final List operands; + + public AsmOperands(List operands) + { + this.operands = List.copyOf(Objects.requireNonNull(operands)); + } + + public List getOperands() + { + return operands; + } + + @Override + public int hashCode() + { + return operands.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof AsmOperands)) + return false; + AsmOperands other = (AsmOperands) obj; + return operands.equals(other.operands); + } + + @Override + public String toString() + { + return operands.stream().map(AsmOperand::toString).collect(Collectors.joining(", ")); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java new file mode 100644 index 00000000..abafc45f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java @@ -0,0 +1,41 @@ +package net.mograsim.machine.isa; + +import java.util.Objects; + +public final class AsmOperation +{ + private final String mnemonic; + + public AsmOperation(String mnemonic) + { + this.mnemonic = Objects.requireNonNull(mnemonic.toLowerCase()); + } + + public String getMnemonic() + { + return mnemonic; + } + + @Override + public String toString() + { + return getMnemonic(); + } + + @Override + public int hashCode() + { + return mnemonic.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof AsmOperation)) + return false; + AsmOperation other = (AsmOperation) obj; + return mnemonic.equals(other.mnemonic); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java new file mode 100644 index 00000000..8de66267 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java @@ -0,0 +1,6 @@ +package net.mograsim.machine.isa; + +public class NumericOperand +{ + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java new file mode 100644 index 00000000..8a9d2d02 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java @@ -0,0 +1,32 @@ +package net.mograsim.machine.isa.types; + +public class AsmException extends Exception +{ + private static final long serialVersionUID = 1L; + + public AsmException() + { + super(); + } + + public AsmException(Throwable cause, String message, boolean enableSuppression, boolean writableStackTrace) + { + super(message, cause, enableSuppression, writableStackTrace); + } + + public AsmException(Throwable cause, String formatString, Object... formatArgs) + { + super(String.format(formatString, formatArgs), cause); + } + + public AsmException(String formatString, Object... formatArgs) + { + super(String.format(formatString, formatArgs)); + } + + public AsmException(Throwable cause) + { + super(cause); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java new file mode 100644 index 00000000..4fb4af6d --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java @@ -0,0 +1,16 @@ +package net.mograsim.machine.isa.types; + +public class AsmNumberFormatException extends AsmException +{ + private static final long serialVersionUID = 1L; + + public AsmNumberFormatException(Exception cause, String message, Object... formatArgs) + { + super(cause, message, formatArgs); + } + + public AsmNumberFormatException(String message, Object... formatArgs) + { + super(message, formatArgs); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java new file mode 100644 index 00000000..d45c2772 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java @@ -0,0 +1,32 @@ +package net.mograsim.machine.mi; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; +import net.mograsim.machine.mi.parameters.Mnemonic; + +public interface MicroInstruction +{ + + public MicroInstructionParameter getParameter(int index); + + public void setParameter(int index, MicroInstructionParameter param); + + /** + * @return The amount of {@link Mnemonic}s, the instruction is composed of + */ + public int getSize(); + + public static MicroInstruction create(Runnable updateCallback, MicroInstructionParameter... parameters) + { + return new StandardMicroInstruction(updateCallback, parameters); + } + + default BitVector toBitVector() + { + BitVector vector = BitVector.of(); + int size = getSize(); + for (int i = 0; i < size; i++) + vector = vector.concat(getParameter(i).getValue()); + return vector; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java new file mode 100644 index 00000000..6625fa66 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java @@ -0,0 +1,52 @@ +package net.mograsim.machine.mi; + +import java.util.Arrays; +import java.util.Optional; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; +import net.mograsim.machine.mi.parameters.ParameterClassification; + +public interface MicroInstructionDefinition +{ + /** + * @return The {@link ParameterClassification}s of which a MicroInstruction is composed. + */ + public ParameterClassification[] getParameterClassifications(); + + /** + * @throws IndexOutOfBoundsException + */ + public ParameterClassification getParameterClassification(int index); + + /** + * @return The amount of {@link MicroInstructionParameter}s in a {@link MicroInstruction} that follows this definition. + */ + public default int size() + { + return getParameterClassifications().length; + } + + /** + * @return The amount of {@link Bit}s in a {@link MicroInstruction} that follows this definition. + */ + public default int sizeInBits() + { + return Arrays.stream(getParameterClassifications()).mapToInt(e -> e.getExpectedBits()).reduce(0, (a, b) -> a + b); + } + + public default MicroInstruction createDefaultInstruction(Runnable updateCallback) + { + int size = size(); + MicroInstructionParameter[] params = new MicroInstructionParameter[size]; + ParameterClassification[] classes = getParameterClassifications(); + for (int i = 0; i < size; i++) + { + ParameterClassification classification = classes[i]; + params[i] = classification.getDefault(); + } + return new StandardMicroInstruction(updateCallback, params); + } + + public Optional getParameterDescription(int index); +} \ No newline at end of file diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java new file mode 100644 index 00000000..5d4fac6b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java @@ -0,0 +1,8 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.Memory; + +public interface MicroInstructionMemory extends Memory +{ + public MicroInstructionMemoryDefinition getDefinition(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java new file mode 100644 index 00000000..409d2816 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java @@ -0,0 +1,8 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.MemoryDefinition; + +public interface MicroInstructionMemoryDefinition extends MemoryDefinition +{ + MicroInstructionDefinition getMicroInstructionDefinition(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java new file mode 100644 index 00000000..66aa229c --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java @@ -0,0 +1,28 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.MachineException; + +public class MicroInstructionMemoryParseException extends MachineException +{ + + /** + * + */ + private static final long serialVersionUID = 6820101808901789906L; + + public MicroInstructionMemoryParseException() + { + super(); + } + + public MicroInstructionMemoryParseException(String message) + { + super(message); + } + + public MicroInstructionMemoryParseException(Throwable cause) + { + super(cause); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java new file mode 100644 index 00000000..d049e377 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java @@ -0,0 +1,106 @@ +package net.mograsim.machine.mi; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + +import net.mograsim.machine.MemoryDefinition; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; +import net.mograsim.machine.mi.parameters.ParameterClassification; + +public class MicroInstructionMemoryParser +{ + public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException + { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath)))) + { + parseMemory(memory, reader); + } + } + + public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input) + { + MicroInstructionMemoryDefinition def = memory.getDefinition(); + MicroInstructionDefinition miDef = def.getMicroInstructionDefinition(); + + long minAddr = def.getMinimalAddress(); + long maxAddr = def.getMaximalAddress(); + + String line; + long i = minAddr; + try + { + for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++) + { + long iFinal = i; + memory.setCell(i, parse(() -> memory.notifyObservers(iFinal), miDef, line)); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + + for (; i <= maxAddr; i++) + { + long iFinal = i; + memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal))); + } + } + + public static MicroInstruction parse(Runnable updateCallback, MicroInstructionDefinition definition, String toParse) + { + int size = definition.size(); + String[] strings = toParse.split(","); + if (size != strings.length) + throw new MicroInstructionMemoryParseException("String does not match definition! The number of parameters does not match."); + MicroInstructionParameter[] params = new MicroInstructionParameter[size]; + ParameterClassification[] classes = definition.getParameterClassifications(); + try + { + for (int i = 0; i < size; i++) + { + params[i] = classes[i].parse(strings[i]); + } + return new StandardMicroInstruction(updateCallback, params); + } + catch (Exception e) + { + throw new MicroInstructionMemoryParseException(e.getCause()); + } + } + + public static void write(MicroInstructionMemory memory, String outputPath) throws IOException + { + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath))) + { + write(memory, writer); + } + } + + public static void write(MicroInstructionMemory memory, OutputStreamWriter output) throws IOException + { + MemoryDefinition def = memory.getDefinition(); + long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1; + for (long i = min; i < max; i++) + { + output.write(toCSV(memory.getCell(i)) + "\n"); + } + } + + private static String toCSV(MicroInstruction inst) + { + int max = inst.getSize() - 1; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < max; i++) + { + sb.append(inst.getParameter(i).toString()); + sb.append(","); + } + sb.append(inst.getParameter(max).toString()); + return sb.toString(); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java new file mode 100644 index 00000000..c565432f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java @@ -0,0 +1,41 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; + +class StandardMicroInstruction implements MicroInstruction +{ + private final Runnable updateCallback; + private MicroInstructionParameter[] parameters; + + StandardMicroInstruction(Runnable updateCallback, MicroInstructionParameter... parameters) + { + this.updateCallback = updateCallback; + this.parameters = parameters; + } + + /** + * @throws IndexOutOfBoundsException + */ + @Override + public MicroInstructionParameter getParameter(int index) + { + return parameters[index]; + } + + @Override + public int getSize() + { + return parameters.length; + } + + /** + * @throws IndexOutOfBoundsException + */ + @Override + public void setParameter(int index, MicroInstructionParameter param) + { + parameters[index] = param; + updateCallback.run(); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java new file mode 100644 index 00000000..519c9b3a --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java @@ -0,0 +1,69 @@ +package net.mograsim.machine.mi; + +import java.util.HashSet; + +import net.mograsim.machine.MemoryObserver; +import net.mograsim.machine.standard.memory.MemoryException; + +public class StandardMicroInstructionMemory implements MicroInstructionMemory +{ + private MicroInstruction[] data; + private MicroInstructionMemoryDefinition definition; + private HashSet observers = new HashSet<>(); + + public StandardMicroInstructionMemory(MicroInstructionMemoryDefinition definition) + { + if (definition.size() > Integer.MAX_VALUE) + throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long"); + this.definition = definition; + data = new MicroInstruction[(int) definition.size()]; + } + + private int translate(long address) + { + return (int) (address - definition.getMinimalAddress()); + } + + @Override + public MicroInstruction getCell(long address) + { + int translatedAddress = translate(address); + MicroInstruction actual = data[translatedAddress]; + if (actual == null) + actual = data[translatedAddress] = definition.getMicroInstructionDefinition() + .createDefaultInstruction(() -> notifyObservers(address)); + return actual; + } + + @Override + public void setCell(long address, MicroInstruction data) + { + this.data[translate(address)] = data; + notifyObservers(address); + } + + @Override + public void registerObserver(MemoryObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(MemoryObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers(long address) + { + observers.forEach(ob -> ob.update(address)); + } + + @Override + public MicroInstructionMemoryDefinition getDefinition() + { + return definition; + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java new file mode 100644 index 00000000..73940280 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java @@ -0,0 +1,58 @@ +package net.mograsim.machine.mi.components; + +import java.util.List; + +import net.mograsim.logic.core.components.BasicCoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.machine.mi.MicroInstructionMemory; + +public class CoreMicroInstructionMemory extends BasicCoreComponent +{ + private final ReadWriteEnd data; + private final ReadEnd address; + private final MicroInstructionMemory memory; + + public CoreMicroInstructionMemory(Timeline timeline, int processTime, MicroInstructionMemory memory, ReadWriteEnd data, ReadEnd address) + { + super(timeline, processTime); + this.memory = memory; + this.data = data; + this.address = address; + memory.registerObserver(a -> update()); + address.registerObserver(this); + } + + public MicroInstructionMemory getMemory() + { + return memory; + } + + @Override + public List getAllInputs() + { + return List.of(address); + } + + @Override + public List getAllOutputs() + { + return List.of(data); + } + + @Override + protected TimelineEventHandler compute() + { + if (!address.getValues().isBinary()) + { + return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. + } + long addressed = address.getValues().getUnsignedValueLong(); + BitVector storedData = memory.getCell(addressed).toBitVector(); + return e -> data.feedSignals(storedData); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java new file mode 100644 index 00000000..b3c41749 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java @@ -0,0 +1,51 @@ +package net.mograsim.machine.mi.components; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.machine.Machine; +import net.mograsim.machine.ModelMemory; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public abstract class ModelMicroInstructionMemory extends ModelMemory +{ + private final Pin addrPin, dataPin; + private CoreMicroInstructionMemory memory; + private final MicroInstructionMemoryDefinition definition; + + public ModelMicroInstructionMemory(LogicModelModifiable model, MicroInstructionMemoryDefinition definition, String name) + { + super(model, 120, 150, name, "MPM", false); + this.definition = definition; + addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); + addPin(dataPin = new Pin(model, this, "D", definition.getMicroInstructionDefinition().sizeInBits(), PinUsage.OUTPUT, getWidth(), + 50)); + + init(); + } + + public MicroInstructionMemoryDefinition getDefinition() + { + return definition; + } + + public Pin getAddressPin() + { + return addrPin; + } + + public Pin getDataPin() + { + return dataPin; + } + + public CoreMicroInstructionMemory getCoreMemory() + { + return memory; + } + + public void setCoreModelBinding(CoreMicroInstructionMemory memory) + { + this.memory = memory; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java new file mode 100644 index 00000000..73acc661 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java @@ -0,0 +1,34 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public class BooleanClassification extends MnemonicFamily +{ + String trueName, falseName; + + public BooleanClassification(boolean defaultValue, String trueName, String falseName) + { + super(defaultValue ? trueName : falseName, new MnemonicPair(trueName, BitVector.SINGLE_1), + new MnemonicPair(falseName, BitVector.SINGLE_0)); + this.trueName = trueName; + this.falseName = falseName; + } + + public Mnemonic get(boolean value) + { + return get(value ? trueName : falseName); + } + + @Override + public ParameterType getExpectedType() + { + return ParameterType.BOOLEAN_IMMEDIATE; + } + + @Override + public int getExpectedBits() + { + return 1; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java new file mode 100644 index 00000000..c24cabeb --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java @@ -0,0 +1,42 @@ +package net.mograsim.machine.mi.parameters; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public class IntegerClassification implements ParameterClassification +{ + private final int bits; + private final IntegerImmediate defaultValue; + + public IntegerClassification(int defaultValue, int bits) + { + this.bits = bits; + this.defaultValue = new IntegerImmediate(BitVector.from(defaultValue, bits)); + } + + @Override + public ParameterType getExpectedType() + { + return ParameterType.INTEGER_IMMEDIATE; + } + + @Override + public int getExpectedBits() + { + return bits; + } + + @Override + public IntegerImmediate parse(String toParse) + { + return new IntegerImmediate(new BigInteger(toParse), bits); + } + + @Override + public MicroInstructionParameter getDefault() + { + return defaultValue; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java new file mode 100644 index 00000000..419602c6 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java @@ -0,0 +1,74 @@ +package net.mograsim.machine.mi.parameters; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.BitVector; + +public final class IntegerImmediate implements MicroInstructionParameter +{ + private BitVector value; + + public IntegerImmediate(BigInteger value, int bits) + { + this.value = BitVector.from(value, bits); + } + + public IntegerImmediate(BitVector value) + { + this.value = value; + } + + @Override + public BitVector getValue() + { + return value; + } + + @Override + public ParameterType getType() + { + return ParameterType.INTEGER_IMMEDIATE; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof IntegerImmediate)) + return false; + IntegerImmediate other = (IntegerImmediate) obj; + if (value == null) + { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + + /** + * @return The value of this IntegerImmediate as an unsigned BigInteger + */ + public BigInteger getValueAsBigInteger() + { + return value.getUnsignedValue(); + } + + @Override + public String toString() + { + return getValueAsBigInteger().toString(); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java new file mode 100644 index 00000000..2f135d29 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java @@ -0,0 +1,15 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.logic.core.types.BitVector; + +public interface MicroInstructionParameter +{ + public BitVector getValue(); + + public ParameterType getType(); + + public static enum ParameterType + { + INTEGER_IMMEDIATE, BOOLEAN_IMMEDIATE, MNEMONIC + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java new file mode 100644 index 00000000..5ea2be05 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java @@ -0,0 +1,64 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.logic.core.types.BitVector; + +public final class Mnemonic implements MicroInstructionParameter +{ + private final String text; + private final BitVector vector; + final MnemonicFamily owner; + private final int ordinal; + + Mnemonic(String text, BitVector vector, MnemonicFamily owner, int ordinal) + { + super(); + this.text = text; + this.vector = vector; + this.owner = owner; + this.ordinal = ordinal; + } + + public String getText() + { + return text; + } + + @Override + public BitVector getValue() + { + return vector; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((text == null) ? 0 : text.hashCode()); + result = prime * result + ((vector == null) ? 0 : vector.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + return this == obj; + } + + @Override + public ParameterType getType() + { + return owner.getExpectedType(); + } + + public int ordinal() + { + return ordinal; + } + + @Override + public String toString() + { + return text; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java new file mode 100644 index 00000000..d6906fb3 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java @@ -0,0 +1,262 @@ +package net.mograsim.machine.mi.parameters; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public class MnemonicFamily implements ParameterClassification +{ + private final Mnemonic[] values; + private final Mnemonic defaultValue; + private final String[] stringValues; + private Map byText; + private int vectorLength; + + public MnemonicFamily(String defaultValueName, String... names) + { + this(false, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); + } + + public MnemonicFamily(boolean reverse, String defaultValueName, String... names) + { + this(reverse, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); + } + + public MnemonicFamily(String defaultValueName, int bits, String... names) + { + this(false, defaultValueName, bits, names); + } + + public MnemonicFamily(boolean reverse, String defaultValueName, int bits, String... names) + { + this.values = new Mnemonic[names.length]; + this.stringValues = new String[names.length]; + BitVector[] values = new BitVector[names.length]; + for (int i = 0; i < names.length; i++) + { + values[i] = BitVector.from(i, bits); + } + + setup(names, values, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; + } + + public MnemonicFamily(String defaultValueName, String[] names, long[] values, int bits) + { + this(false, defaultValueName, names, values, bits); + } + + public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, long[] values, int bits) + { + if (names.length != values.length) + throw new IllegalArgumentException(); + this.values = new Mnemonic[values.length]; + this.stringValues = new String[values.length]; + BitVector[] vectors = new BitVector[values.length]; + + for (int i = 0; i < vectors.length; i++) + { + vectors[i] = BitVector.from(values[i], bits); + } + + setup(names, vectors, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; + } + + public MnemonicFamily(String defaultValueName, String[] names, BitVector[] values) + { + this(false, defaultValueName, names, values); + } + + public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, BitVector[] values) + { + if (names.length != values.length) + throw new IllegalArgumentException(); + this.values = new Mnemonic[values.length]; + this.stringValues = new String[values.length]; + + setup(names, values, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; + } + + public MnemonicFamily(String defaultValueName, MnemonicPair... values) + { + this.values = new Mnemonic[values.length]; + this.stringValues = new String[values.length]; + + setup(values); + + int defaultValueIndex = -1; + for (int i = 0; i < values.length; i++) + if (stringValues[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; + } + + private void setup(String[] names, BitVector[] values, boolean reverse) + { + MnemonicPair[] mnemonics = new MnemonicPair[values.length]; + for (int i = 0; i < values.length; i++) + mnemonics[i] = new MnemonicPair(names[i], reverse ? values[i].reverse() : values[i]); + setup(mnemonics); + } + + private void setup(MnemonicPair[] values) + { + for (int i = 0; i < values.length; i++) + { + this.values[i] = createMnemonic(values[i], i); + this.stringValues[i] = values[i].name; + } + if (values.length == 0) + vectorLength = 0; + else + { + vectorLength = values[0].value.length(); + for (int i = 1; i < values.length; i++) + if (values[i].value.length() != vectorLength) + throw new IllegalArgumentException("MnemonicFamily is not of uniform vector length!"); + } + byText = Arrays.stream(this.values).collect(Collectors.toMap(m -> m.getText(), m -> m)); + if (values.length != byText.keySet().size()) + throw new IllegalArgumentException("MnemonicFamily contains multiple Mnemonics with the same name!"); + } + + private Mnemonic createMnemonic(MnemonicPair mnemonicPair, int ordinal) + { + return new Mnemonic(mnemonicPair.name, mnemonicPair.value, this, ordinal); + } + + public Mnemonic[] values() + { + return values.clone(); + } + + public Mnemonic get(int ordinal) + { + return values[ordinal]; + } + + public Mnemonic get(String text) + { + return byText.get(text); + } + + @Override + public MicroInstructionParameter getDefault() + { + return defaultValue; + } + + public boolean contains(Mnemonic m) + { + if (m != null) + return m.owner == this; + else + return false; + } + + public boolean contains(String value) + { + return byText.keySet().contains(value); + } + + public int size() + { + return values.length; + } + + public int getVectorLength() + { + return vectorLength; + } + + @Override + public boolean conforms(MicroInstructionParameter param) + { + return ParameterClassification.super.conforms(param) && (param instanceof Mnemonic ? contains((Mnemonic) param) : false); + } + + @Override + public ParameterType getExpectedType() + { + return ParameterType.MNEMONIC; + } + + @Override + public int getExpectedBits() + { + return vectorLength; + } + + public String[] getStringValues() + { + return stringValues.clone(); + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(values); + return result; + } + + @Override + public boolean equals(Object obj) + { + return this == obj; + } + + @Override + public Mnemonic parse(String toParse) + { + Mnemonic parsed = get(toParse); + if (parsed == null) + throw new UnknownMnemonicException(toParse); + return parsed; + } + + public static class MnemonicPair + { + public final String name; + public final BitVector value; + + public MnemonicPair(String name, BitVector value) + { + this.name = name; + this.value = value; + } + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java new file mode 100644 index 00000000..c81f6e55 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java @@ -0,0 +1,30 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public interface ParameterClassification +{ + /** + * Determines whether a {@link MicroInstructionParameter} is part of this class of parameters. + * + * @return true if the classification contains the Parameter, false otherwise + */ + public default boolean conforms(MicroInstructionParameter param) + { + return param.getType().equals(getExpectedType()) && param.getValue().length() == getExpectedBits(); + } + + /** + * @return The type of the parameters in this classification. + */ + public ParameterType getExpectedType(); + + /** + * @return The number of bits of the parameters in this classification. + */ + public int getExpectedBits(); + + public MicroInstructionParameter parse(String toParse); + + public MicroInstructionParameter getDefault(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java new file mode 100644 index 00000000..3af062e3 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java @@ -0,0 +1,26 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.machine.MachineException; + +public class UnknownMnemonicException extends MachineException +{ + /** + * + */ + private static final long serialVersionUID = 701558899889830975L; + + public UnknownMnemonicException() + { + super(); + } + + public UnknownMnemonicException(String message) + { + super(message); + } + + public UnknownMnemonicException(Throwable cause) + { + super(cause); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java new file mode 100644 index 00000000..ca557a6b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java @@ -0,0 +1,94 @@ +package net.mograsim.machine.standard.memory; + +import java.util.List; + +import net.mograsim.logic.core.components.BasicCoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MainMemoryDefinition; + +/** + * A memory component that only allows access to words of a specific width + */ +public class CoreWordAddressableMemory extends BasicCoreComponent +{ + private final MainMemory memory; + private final static Bit read = Bit.ONE; + + private ReadWriteEnd data; + private ReadEnd rWBit, address; + + /** + * @param data The bits of this ReadEnd are the value that is written to/read from memory; The bit width of this wire is the width of + * a memory word + * @param rWBit The value of the 0th bit dictates the mode: 0: Write, 1: Read + * @param address The bits of this ReadEnd address the memory cell to read/write + */ + public CoreWordAddressableMemory(Timeline timeline, int processTime, MainMemory memory, ReadWriteEnd data, ReadEnd rWBit, + ReadEnd address) + { + super(timeline, processTime); + MainMemoryDefinition definition = memory.getDefinition(); + if (data.width() != definition.getCellWidth()) + throw new IllegalArgumentException( + String.format("Bit width of data wire does not match main memory definition. Expected: %d Actual: %d", + definition.getCellWidth(), data.width())); + if (rWBit.width() != 1) + throw new IllegalArgumentException( + String.format("Bit width of read/write mode select wire is unexpected. Expected: 1 Actual: %d", rWBit.width())); + if (address.width() != definition.getMemoryAddressBits()) + throw new IllegalArgumentException( + String.format("Bit width of address wire does not match main memory definition. Expected: %d Actual: %d", + definition.getMemoryAddressBits(), address.width())); + this.memory = memory; + this.data = data; + this.rWBit = rWBit; + this.address = address; + memory.registerObserver(a -> update()); + data.registerObserver(this); + rWBit.registerObserver(this); + address.registerObserver(this); + } + + @Override + protected TimelineEventHandler compute() + { + if (!address.getValues().isBinary()) + { + if (read.equals(rWBit.getValue())) + return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. + return e -> data.clearSignals(); + } + long addressed = address.getValues().getUnsignedValueLong(); + if (read.equals(rWBit.getValue())) + { + BitVector storedData = memory.getCell(addressed); + return e -> data.feedSignals(storedData); + } + BitVector transData = data.getValues(); + if (transData.equals(memory.getCell(addressed))) + return null; + return e -> + { + data.clearSignals(); + memory.setCell(addressed, transData); + }; + } + + @Override + public List getAllInputs() + { + return List.of(data, rWBit, address); + } + + @Override + public List getAllOutputs() + { + return List.of(data); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java new file mode 100644 index 00000000..5183e323 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java @@ -0,0 +1,27 @@ +package net.mograsim.machine.standard.memory; + +import net.mograsim.machine.MachineException; + +public class MemoryException extends MachineException +{ + + /** + * + */ + private static final long serialVersionUID = 6416796315595721079L; + + public MemoryException() + { + super(); + } + + public MemoryException(String message) + { + super(message); + } + + public MemoryException(Throwable cause) + { + super(cause); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java new file mode 100644 index 00000000..986dbe50 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java @@ -0,0 +1,57 @@ +package net.mograsim.machine.standard.memory; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MainMemoryDefinition; +import net.mograsim.machine.ModelMemory; + +public abstract class ModelWordAddressableMemory extends ModelMemory +{ + private final Pin addrPin, dataPin, rWPin; + private CoreWordAddressableMemory memory; + private MainMemoryDefinition definition; + + public ModelWordAddressableMemory(LogicModelModifiable model, MainMemoryDefinition definition, String name) + { + super(model, 120, 150, name, "RAM", false); + this.definition = definition; + + addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); + addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, getWidth(), 50)); + addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, getWidth(), 70)); + + init(); + } + + public MainMemoryDefinition getDefinition() + { + return definition; + } + + public Pin getAddressPin() + { + return addrPin; + } + + public Pin getDataPin() + { + return dataPin; + } + + public Pin getReadWritePin() + { + return rWPin; + } + + public void setCoreModelBinding(CoreWordAddressableMemory memory) + { + this.memory = memory; + } + + public CoreWordAddressableMemory getCoreMemory() + { + return memory; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java new file mode 100644 index 00000000..4a54ad9f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java @@ -0,0 +1,48 @@ +package net.mograsim.machine.standard.memory; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.GenericMemory; +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MainMemoryDefinition; + +public class WordAddressableMemory extends GenericMemory implements MainMemory +{ + private final int cellWidth; + private final MainMemoryDefinition definition; + + public WordAddressableMemory(MainMemoryDefinition definition) + { + super(definition); + this.cellWidth = definition.getCellWidth(); + this.definition = definition; + } + + @Override + public BitVector getCell(long address) + { + BitVector data = super.getCell(address); + return data == null ? BitVector.of(Bit.ZERO, cellWidth) : data; + } + + @Override + public BigInteger getCellAsBigInteger(long address) + { + BitVector data = getCell(address); + return data == null ? BigInteger.valueOf(0) : data.getUnsignedValue(); + } + + @Override + public void setCellAsBigInteger(long address, BigInteger data) + { + setCell(address, BitVector.from(data, cellWidth)); + } + + @Override + public MainMemoryDefinition getDefinition() + { + return definition; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json b/plugins/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json new file mode 100644 index 00000000..8202b0c4 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json @@ -0,0 +1,5 @@ +{ + "version": "0.1.0", + "map": { + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.branding/.classpath b/plugins/net.mograsim.plugin.branding/.classpath new file mode 100644 index 00000000..bc3587db --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/.project b/plugins/net.mograsim.plugin.branding/.project new file mode 100644 index 00000000..b0c2a7a1 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/.project @@ -0,0 +1,28 @@ + + + net.mograsim.plugin.branding + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..5db31272 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/plugins/net.mograsim.plugin.branding/META-INF/MANIFEST.MF b/plugins/net.mograsim.plugin.branding/META-INF/MANIFEST.MF new file mode 100644 index 00000000..a85a3578 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Mograsim branding +Bundle-SymbolicName: net.mograsim.plugin.branding;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Automatic-Module-Name: net.mograsim.plugin.branding +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.eclipse.ui.intro;bundle-version="3.5.500", + org.eclipse.ui.intro.universal;bundle-version="3.3.400" diff --git a/plugins/net.mograsim.plugin.branding/about.ini b/plugins/net.mograsim.plugin.branding/about.ini new file mode 100644 index 00000000..4f49cd29 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/about.ini @@ -0,0 +1,2 @@ +aboutText=Mograsim - Modular Graphical Simulator by Christian Femers, Daniel Kirschten and Fabian Stemmler +featureImage=icon_blue-orange_32.png \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.branding/build.properties b/plugins/net.mograsim.plugin.branding/build.properties new file mode 100644 index 00000000..37fc21c9 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/build.properties @@ -0,0 +1,6 @@ +bin.includes = META-INF/,\ + .,\ + eclipse_with_icon_32.png,\ + about.ini,\ + icons/,\ + icon_blue-orange_32.png diff --git a/plugins/net.mograsim.plugin.branding/eclipse_with_icon_32.png b/plugins/net.mograsim.plugin.branding/eclipse_with_icon_32.png new file mode 100644 index 00000000..c180b842 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/eclipse_with_icon_32.png differ diff --git a/plugins/net.mograsim.plugin.branding/icon_blue-orange_32.png b/plugins/net.mograsim.plugin.branding/icon_blue-orange_32.png new file mode 100644 index 00000000..a0dc941a Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/icon_blue-orange_32.png differ diff --git a/plugins/net.mograsim.plugin.branding/icons/.gitkeep b/plugins/net.mograsim.plugin.branding/icons/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai b/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai new file mode 100644 index 00000000..d082a8e1 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai @@ -0,0 +1,760 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 25 0 R 44 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + uuid:fa56d82b-e056-4a05-9c36-ef2b93c3828f + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + proof:pdf + + + + + saved + xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T03:03:20+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + + EmbedByReference + + K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai + + + + + + + application/pdf + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T03:03:20+02:00 + 2019-06-22T03:20:05+02:00 + 2019-06-22T03:20:05+02:00 + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqp3FzbW0RluJUhiHV5GCj7zkMmSMBciAPNlCEpGoiyxzUfzC0G1JWAveSD/fYolf9ZqfgDmm1 HtBp4bRuZ8uXzLtMPY2afOojzY7efmXq0hItbeK3U9C1ZGH0/Cv/AAuafN7SZpfRER+38fJ2eLsP GPqJP2LLWf8AMDWqNDLOkLdJRSBKexAWv0VyGKfaGp3BlXf9I/R9jLJHRYOYF931FOLXyBfS0fVd VlkPVo4mY/8ADvX/AIjmyxdg5Jb5ckj7v1n9Tg5O14DbHAD3/qH60fJ5d8kaLCJ7/wBCFO899KAp p/xkIT8M2WHsTTR5Q4j57/scLJ2pnn/FXu2Sa6/OP8ntFqg12yUDalkjTjb/AJhkkGbTFouH6YiP wpwp5JS+ok+9JLr/AJye/KyH+7mvLnp/dWzD/k4Y8yBpZsEHJ/zlZ+WyuqraarID1dYIKD58p1P3 DD+Un5Krxf8AOUn5YO3FhqEQp9p7dSP+FkY4Pys1Tmw/5yD/ACkvCFGuC3c/s3EFxH/wxj4f8NkT p5jorLtI83+VNZIXSdZsr9z+xb3EUj/SqsWGVGBHMKm+RV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KobUNSsdPgM95MsMfYsdyfBR1J+WUZ9Tjwx4pmg24cE8hqIssH1n8yZ3LRaVF6S9P rEoBf5qn2R9Nc5fWe0cjthFeZ5/L+13+m7EA3yG/IfrYfeX97ey+rdzvPJ4uSafLw+jOdzZ55Tcy ZHzd3iwwxiogAJxofkrV9U4ysv1W0O/rSDcj/ITqf1ZsdD2Nmz7n0w7z+gOFq+1MWLb6pdwZedI8 l+U7I6hqtxDCkf2ry+dVFadEDUWvgAK51ui7Fw4uQ4pd53ed1PaebLtfCO4PNvN3/OVflewL2/lq xl1eYbC6mrb2/wAwCDK/yKr8830NITz2de8f8y/85BfmhrjOo1T9F2zdINOX0KfKWrTf8PmTHTwH RLz68vr29na4vbiS5uG+1NM7SOfmzEnLwKVQxV2KuxV2KuxVsEg1HXFWWeXvzX/MTy+UGma7dJCn S3mf6xDTwEc3NR9AyuWGMuYV6z5T/wCcs72MpD5q0hZ4+jXmnnhIB4mGQlWPydflmNPR9xV7d5P/ ADL8k+bowdD1OKa4pyayc+lcrTrWJ6MQPFaj3zFnilHmEMnytXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYqxHzJ5+tbIva6bxubobNL1jQ/R9o/hnPdo9uwxXHF6p9/Qfrd1ouyJZPVk9MftP6nnl9qF7 f3BuLyZppW/aY9B4AdAPYZx+fUTyy4pmy9Liwwxx4Yigu07TL3UblbaziMsp3NOgHix6AYdPpp5p cMBZRmzwxR4pGg9C0jyhouhWrajq8sTvApklnmIWCELuT8VBt/M34Z2nZ3YePFRn65/YPc8vrO1p 5do+mP2l5Z+Yv/OUdjaGXT/JUK3k4qratcKRAp6VhjNGenZmoPZhnUY9Le8nUvnjzD5o8w+Y783+ uX81/dGtHmaoUHfiiCiovsoAzNjARFBKV5JXYq7FXYq7FXYq7FXYq7FXYq7FVSCeaCZJoJGimjIa OVCVZWG4KsNwRir2T8v/APnJrzVojRWfmVTrmmCi+uSFvYx4iQ0Evyfc/wAwzFyaUHlsr6X8o+d/ LPm7Tvr+g3qXUQoJovsyxMf2ZYz8Sn8D2zBnjMTRQnmQV2KuxV2KuxV2KuxV2KuxV2KrJpooYmlm cRxIOTuxoAB3JORnMRBJNAMoxMjQ3LzbzV54n1AvZ6eWhstw8nR5R/Bfbv38M4rtTtuWW4Y9od/U /sep7P7KGP1T3n937WJZz7uU48u+Wr3WrjjF+7tkP764IqF9h4t7Zsez+zZ6mVDaI5n8dXB1uuhg jvvLoGW+Z/Nnkv8ALPy/696/Bnr9XtUo11dSAdht07saKv3DPQND2fDFHgxj3n9byOo1M80uKRfK P5k/m95q89XbC8lNppCNW20mFj6S06NIdjK/+U30AZvMWEQ97QwbLVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVTLy/wCY9c8u6nHqei3kljexfZliPUVqVdTVXU03VgQcjKIkKKvq38o/z+0fzf6O ka0E03zGQFRa0t7o/wDFJJ+F/wDis/QT21+bTmO45IeuZjK7FXYq7FXYq7FXYq7FVk00UETzTOEi jBZ3bYADck5GcxEGRNAMoxMjQ5l5b5t82zaxMbe3Jj06M/CvQyEftN/AZwnavap1B4Y7Yx9vmXru zuzhhHFLeZ+xjeaV2id+WPLNxrd0RUx2cRHrzf8AGq/5R/DNp2Z2bLUz7oDmf0DzcDX66OCPfI8g n35lfmV5d/LTy7HFFGkupyoV0zTFO7Hp6stNxGD1PVjsPb0TR6OMYiEBUQ8dkySySMpGyXx15o80 655n1ibV9aumuryY9TsqIPsxxr0VF7AfrzcQgIigwSnJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq2rMrBlJDA1BGxBGKvpf8j/+cgTevb+V/OE/+ltSPT9YkNPVPRYpz/P2V/2uh33ODn09 bxQ+g8wldirsVdirsVdirsVeZ+d/NR1Cc6fZv/oMLfvHH+7XH/Go7ff4ZxHbXanjS8OB9A+0/qer 7K7P8MccvrP2ftYlnPu5THQtFudY1BLSH4V+1NKeiIOp/pmZodHLUZBCPxPcHF1eqjhhxH4ebL/P /nnQPyz8oibgslywMWmWFaPPN1LMevFa8nb6OpAz0nRaOMIiEBUQ8VmzSySMpcy+MPMXmLWPMesX GsaxcNc31y3KSRugHZVHRVUbADpm7jERFBrSzJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FX1D/zj3+dTarHD5P8AMc9dTiXhpV7Id50Uf3MjE7yqPsn9of5XXA1GCvUEPesw1dir sVdirsVYh5+8yGytv0bbNS6uVrM46pGdqfNv1Zz3b3aPhx8KP1S5+Q/a7rsjRccvEl9MeXmf2PNc 4l6pdFHJLIsUal5HIVFG5JJoAMlGJkQBzLGUgBZ5PULVNI8keVbrU9UlWKK2jNxqFx1JI6IvjueK juT756L2V2cMGMRH1y5/juDxWv1hz5L/AIRyfGf5i+fdV87+ZrjWb4lIj+7sbStVggBPBB4nux7n 7s6fHjEBThsXyxXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVSCea3mjngka KaJg8UqEqyspqrKRuCDir7Q/JH80ovPPlvheMq+YNNCx6jGKD1ARRLhQOz0+KnRvamavPi4D5Iej 5QrsVdiqF1TUINOsJr2f+7hXlTuT0VR8ztlGp1EcOMzlyDdgwnLMQHMvGL++uL68mu7g8pZmLN4D wA9gNhnmufPLLMzlzL3OHFHHERjyCHyltZv+XOgiWV9XnWqREpag93/af/YjYf2Z1Hs9oeInNLkN o+/vdB21q6HhDrzeN/8AOTn5lHVNYXydp0v+4/S3D6kynaS7ptGfFYgf+CJ/lGd/pcVDiLzbwrMt XYq7FXYq9A/I7yjofmvz5FpGtwtPYtbTStGrtGeSAFTyQg5TnmYxsK+jP+hbfyk/6tc3/SVcf815 hfmZ96Hf9C2/lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm/wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/p KuP+a8fzM+9Xf9C2/lJ/1a5v+kq4/wCa8fzM+9Xf9C2/lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm /wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/pKuP+a8fzM+9Xf9C2/lJ/1a5v+kq4/wCa8fzM+9Xf9C2/ lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm/wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/pKuP+a8fzM+9X f9C2/lJ/1a5v+kq4/wCa8fzM+9XnP58fk/5D8o+SI9V0Kykt71r2KAyPPLIODpISOLsw6qMu0+aU pUUvnnM1XYq7FXYqyT8vfO2oeTPNVnrlmSyRNwvLcGgmt2I9SM9txuvgwByGSAkKV926Tqljq2mW up2Eomsr2JJ7eUd0cch8j4jNQRRooRWBXYq89/MnWS88WlRN8EVJbindyPgX6F3+nOQ9o9ZchhHT c+/o9L2JpqByHrsGEZy7v1exs5r28htIRWWZwi/Sev0ZbgwnJMQjzkWvLkEImR5Bn35h+abX8vvy 8ur+34+vbxrbabG37dzJshI703kYdwDnqOi0sYiOOP0h4PNlOSZkeZfDk88080k8zmSaVi8sjGrM zGrMSepJzeMFPFXYq7FXYq9Z/wCcYv8AyakH/MHc/wDERmPqvoV9hZrEIO61nR7SX0bq+t7eUAEx yyojUPQ0Yg4REqpf4l8uf9XWz/6SIv8AmrDwnuV3+JfLn/V1s/8ApIi/5qx4T3K7/Evlz/q62f8A 0kRf81Y8J7ld/iXy5/1dbP8A6SIv+aseE9yu/wAS+XP+rrZ/9JEX/NWPCe5Xf4l8uf8AV1s/+kiL /mrHhPcrv8S+XP8Aq62f/SRF/wA1Y8J7ld/iXy5/1dbP/pIi/wCaseE9yu/xL5c/6utn/wBJEX/N WPCe5Xf4l8uf9XWz/wCkiL/mrHhPcqYgggEGoO4IyKvHv+cp/wDyWcX/AG0rf/k3LmTpPr+CvkXN kl2KuxV2KuxV9L/84q+fTPaXfky9lrJbcrvSuR6xMf30Q/1WIcD3bwzB1eP+JD6EzCVSurmK1tpb mU0jhRpHPsoqcry5BCJkeQFs8cDOQiOZeJX15LeXk13MayTuXb2qen0Z5jnzHJMzPORt73FjEIiI 5BQypsZp+WulCW8n1KRarbj04Sf53HxEfJf1503s5peKZyn+HYe8/s+90PbmoqIxjrufd+PueM/8 5T+cjqPmu18tW71tdGjElyAdjc3Cht/9SPjT5nPQdJChfe808PzLV2KuxV2KuxV6z/zjF/5NSD/m Duf+IjMfVfQr7CzWIfHv/OTv/k1J/wDmDtv+InNnpfoS8mzIV2KuxV2KuxV2KuxV2KuxV2Kv0T03 /jnWv/GGP/iIzSnmh5N/zlP/AOSzi/7aVv8A8m5cyNJ9fwV8i5skuxV2KuxV2Kp15M8zXXlfzTpm vWtTJYTrI6DbnEfhlj/2cbMv05GceIEK++7K8tr2zgvbVxLbXUaTQSDoySKGVh8wc05FIY7+YmoG 20L6upo944T34L8TfqA+nND7QajgwcI5zNfDm7fsbDxZuL+aHl2cK9a7FXrvla0GmeWICY2ZzGbm REFXYuOVAO7caDPReyNP4WniOp3PxeJ7SzeJnkeg2+T5F1/8r/ze1vXL/WLvy3eG41C4kuZdloDI xag+LoK0GdPHLACrcJAf8qW/NT/qWrz/AIFf+asPjw71d/ypb81P+pavP+BX/mrHx4d6u/5Ut+an /UtXn/Ar/wA1Y+PDvV3/ACpb81P+pavP+BX/AJqx8eHerv8AlS35qf8AUtXn/Ar/AM1Y+PDvV6P+ QH5b+etA/MSHUdZ0a4sbJbWdDPKAFDMo4jYnrlGoyxMaBV9PZgIfHv8Azk7/AOTUn/5g7b/iJzZ6 X6EoP/nH7yzo/mbzlfaNrEAnsrrS7gMOjKwki4ujfssp3Bw6iRjGx3qx38yPy81jyL5ik0q+Bltn rJp96BRJ4a0DAVNGHRl7H2ocniyCYtWKZYrsVdirsVdiqrbW1xc3EdtbRtNcTMI4YYwWd3Y0VVUb kk4kq9s82/k9beSfyWn1HUkWXzPfXNr9Yk2YW8ZYn0Iz4/zsOp26DMSGbjyUOSvDsy1fonpv/HOt f+MMf/ERmlPNDzj/AJyI8t675h8gx2Gi2Ul9eC+hlMEQBbgqSAtuR05DL9NIRlZV80/8qW/NT/qW rz/gV/5qzO8eHel3/KlvzU/6lq8/4Ff+asfHh3q7/lS35qf9S1ef8Cv/ADVj48O9Xf8AKlvzU/6l q8/4Ff8AmrHx4d6u/wCVLfmp/wBS1ef8Cv8AzVj48O9Xf8qW/NT/AKlq8/4Ff+asfHh3q+pfyOXz Ha+QbPSPMdpLZalpbNbrFNs7W9eUL7E7AEoP9XNfnrisIQv5l3nq6vBag1W3iqR4NIan/hQucJ7S ZuLMIfzY/f8AgPU9h4qxGX84/cxDOdd2idNtDeahbWo/3fKkZ9gzAE/dl+mxeJkjD+cQGrPk4IGX cHtUyikMQU8C4FV24hAXH0VWmeoAU8ASrYq7FXYq7FXYq7FXYq7FXx7/AM5O/wDk1J/+YO2/4ic2 el+hKJ/5xY/8mZL/ANs24/5ORYNX9HxV9KfmF5C0bzv5dm0fUl4P/eWV2BV4JgCFkXcVG9GXuMwc eQwNhD4h82+VNZ8q69c6Jq8PpXdsdmG6SId0kjb9pWHT7juDm1hMSFhKT5JXYq7FWwCTQdcVfVH/ ADj7+S36Ct4vNfmG3prU61060kG9rGw+26kbTMP+BHuTTX6jPfpHJCdf85O/+Srn/wCYy2/4kchp frV8eZs0v0T03/jnWv8Axhj/AOIjNKeaERgV2KuxV2KuxV2KuxVQkPC8haoCyhoiKbswHNN/BVV/ vwq8k823P1jzJfvWvGUx/wDIsBP+Nc847VycepmfOvls9v2dDhwQHlfz3SjNc5rIfIVsJvM1uSKr CryEfJSB+LDNx2Fj4tVHys/Y6ztefDpz50Ff85vzfk/L290f0NPXUZb6O55xvKYgio0XE7K9amue j4MPHbxzzr/ob3Uf+pZh/wCktv8Aqll35Md6Xf8AQ3uo/wDUsw/9Jbf9UsfyY71d/wBDe6j/ANSz D/0lt/1Sx/JjvV3/AEN7qP8A1LMP/SW3/VLH8mO9Xf8AQ3mpf9SzD/0lt/1Sw/kx3q7/AKG81L/q WYf+ktv+qWP5Md6u/wChvNS/6lmH/pLb/qlj+THerv8AobzUv+pZh/6S2/6pY/kx3q8k/Mrz1N54 8zvr0tmti7wxw/V1cyAemKV5FV6/LMjFj4BSs4/5xY/8mZL/ANs24/5ORZVq/o+KvrnNahgX5vfl Xp/n3QDEOMGuWas2mXp6BjuYpKf7rem/8p3HgbsOUwPkr4t1XSdR0nUrnTNRga2vrRzFcQOKMrL+ sdwRsRm0BBFhKEphV1MVep/kF5XhufzQ0uLW7HlF9VfUbSGdfhai1hl4nqP2lr7HMfUS9BpX2Pms Q8n/AOcnf/JVz/8AMZbf8SOZOl+tXx7TNkl9AW3/ADltqMNvFCPLULCJFTl9aYV4ilf7rMM6Md6q n/Q3mpf9SzD/ANJbf9UsfyY71d/0N5qX/Usw/wDSW3/VLH8mO9Xf9Deal/1LMP8A0lt/1Sx/JjvV 3/Q3mo/9SzD/ANJbf9UsfyY71d/0N7qP/Usw/wDSW3/VLB+THerv+hvdR/6lmH/pLb/qlj+THerv +hvdR/6lmH/pLb/qlj+THeqa+U/+cnbnzD5p0jRrjQorNL+7itxcrcGQo0rcBRTGoNeXHr3yM9Lw gm0I+/lMt9cSnrJK7H6WJzyLPLiySPeS+gYY1ADuAUMpbGY/llEDq11L/JBxH+ydT/xrnSezUf30 j3R/SHR9uy/dxH9L9Dxn/nLG99Xz7ptoDVbfTEYjfZ5J5a/8Kq56JpB6T73mHiWZSuxV2Kt4quph V1MVdTFXUxV1MVew/wDOLI/5CZL/ANs24/5ORZjav6Pir63zWIdiryf89Pyci85aadY0iNU8zWSf CBQC6iXf0mP84/YP0HbcZOnz8Jo8lfIU0EsMrwzI0c0bFJI3BVlZTQqwO4IObNL138h/yZfzZfLr 2txFfLVm/wC7ibb65Kp+wP8AitSPjPf7I70xtRn4dhzV6ckaR/8AOUSpGoRE0YKiKKAAR0AAGY/+ R+KHtWYivKP+cm//ACVk/wDzGW3/ABI5k6T61fH1M2aXUxV1MVdTFXUxVphiVW4FdirsVTLy1eNZ eY9KvFrytry3mFOtY5Vbbp4YJCwVfSGeHPobsVZz+VwPr6ie3GLf6WzqfZj6p/D9Lz/b3KHx/Qnm o+R/KGvaldXmtaPaajdRssKTXEKSOsYjRggJFacmJ+nOyGSQGxebQ/8Ayqb8s/8AqWNN/wCkaP8A pj40+8q7/lU35Z/9Sxpv/SNH/THxp95V3/Kpvyz/AOpY03/pGj/pj40+8q7/AJVN+Wf/AFLGm/8A SNH/AEx8afeVb/5VP+Wn/Usad/0jx/0w+NPvKu/5VP8Alp/1LGnf9I8f9MfGn3lXf8qn/LT/AKlj Tv8ApHj/AKY+NPvKu/5VP+Wn/Usad/0jx/0x8afeVfL3/OQWh6Pov5izWOk2cVjZi1gcW8CBEDMp qeI8c2OmkTCylN/+cWx/yEuX/tnT/wDJyLI6z6Pir61zVoecWf5tWtv+bOseRdXKwrztzot10DNL awyNbv8A5TO7MhPX7PhmQcHoEgr0fMdXzv8A85N/lppcNp/jaw42908qQanABRZi9QswoNn2o3j1 69c/SZT9JV7n5Ttre28raRBbxrDDHZwBI0AVQPTXoBmFM+oq8s/9ek/7dH/MvMn/ACPxV7RmIryn /nJr/wAlbP8A8xlt/wASOZOk+tXyBTNql9x2H5Vfls9jbO/lrTmZokLMbeOpJUVPTNMc075lCv8A 8qn/AC0/6ljTv+keP+mPjT7yrv8AlU/5af8AUsad/wBI8f8ATHxp95V3/Kp/y0/6ljTv+keP+mPj T7yrv+VT/lmf+mY03/pHj/pg8afeVa/5VN+Wf/Usab/0jR/0x8afeVd/yqb8s/8AqWNN/wCkaP8A pj40+8q7/lU35Z/9Sxpv/SNH/THxp95Vw/Kb8swajyxptf8AmHj/AKY+NPvKvMs8lfQ3YEs5/K4/ v9QFeqxGnyLZ1PsyfVP3D9Lz/b3KHx/QmOufmX5G8r6tcafr2qx2N5KUuI4XSViYmjVA1URh9pGG dnHFKQsB5tAf8r4/KT/qYof+RVx/1Tw/l59yu/5Xx+Un/UxQ/wDIq4/6p4/l59yu/wCV8flJ/wBT FD/yKuP+qeP5efcrY/Pj8pSaf4ih/wCRVx/1Tx/Lz7lXf8r0/Kf/AKmGH/kVP/1Tw/lsncrv+V6f lP8A9TDD/wAip/8Aqnj+Wydyu/5Xp+U//Uww/wDIqf8A6p4/lsncrv8Alen5T/8AUww/8ip/+qeP 5bJ3K+a/z38yaJ5j8/zalot0t5YtbQRrOoZRyQEMKOFO3yzY6aBjCilO/wDnF0f8hKl/7Z0//JyL K9Z9HxV9aZq0PjL/AJyCLL+cOvMpowNmQRsQRZQZt9L/AHY/HVL2v8hvzjXzPZp5d1yYf4itU/cT vt9bhTv/AMZUH2h3HxeNMPU6fh3HJCN/5yY/8ldP/wAxdt/xI4NH9avRPLf/ACjul/8AMJB/yaXM efMq8p/9ei/7dH/MvMr/ACHxV7PmGryr/nJj/wAldP8A8xdt/wASOZWj+tXyFTNql9oWP54/lVHZ W8b+YIQ6RorD0p9iFAP+681B02S+SFf/AJXp+U//AFMMP/Iqf/qng/LZO5Xf8r0/Kf8A6mGH/kVP /wBU8fy2TuV3/K9Pyn/6mGH/AJFT/wDVPH8tk7lWn89vymHXzFCP+eVx/wBU8H5efcrX/K+Pyk/6 mKH/AJFXH/VPH8vPuV3/ACvj8pP+pih/5FXH/VPH8vPuV3/K+Pyk/wCpih/5FXH/AFTx/Lz7lbH5 8flKTQeYoa/8Yrj/AKp4/l59ysL1CIw39zEescrof9ixGeUaiPDkkO4l7/DLigD3gIfKW1mP5ZSg avdRfzwch/sXUf8AG2dH7NTrNId8f0h0fbsf3UT/AEv0PGv+csrL0/PmmXYFFuNNRCfFop5a/wDC uuei6Q+k+95h4jmUrsVdirYNCDhVF0yxXUxV1MVdTFXUxV67/wA4vD/kJMv/AGzp/wDk5FmJrfo+ KvrLNUh8af8AOQY/5C9r/wD0af8AUFBm40v92Px1SwGxvLuwvIL2zlaC7tnWWCZDRkdDVWB8QcyC LFFXuHnT817Tzz+S08N0Vh8w2Vzai/thsJF5ECeIfyt+0P2Tt0Irg48Bhk8lfRHlz/lHtL/5hIP+ TS5r58yh5X/69D/26P8AmXmV/kPir2XMNXlX/OS//kr5/wDmLtv+JHMrR/Wr5Fpm2S6mKupirqYq 6mKqE/2gPbISVSyKuxV2Kpn5Zs2vvMmk2Sglrq8t4QB1rJKq+/jkZGgVfU/m62+r+ZL9Kfak9Qf8 9AH/AONs8g7Wx8GpmPO/nu9r2dPiwRPlXy2SfNc5zIPIlz6Hma2BNFmDxt9Kkj/hgM2/YeTh1UfO x9jre1ocWnl5UUd+cH5PR/mJdaSRqZ0uTT0uOUvofWBIshiotPVh48eJz0fDm4L2eNee/wDQn/8A 39v/AHL/APs6y/8AOeSu/wChP/8Av7f+5f8A9nWP5zyV3/Qn/wD39v8A3L/+zrH855K7/oT/AP7+ 3/uX/wDZ1j+c8lVh/wA4j0AH+K/+5f8A9nOS/P8A9H7U23/0KR/39f8A3L/+znD+f/o/b+xbd/0K R/39f/cv/wCznH8//R+39i27/oUj/v6/+5f/ANnOP5/+j9v7Ft5F+ZXkX/BPmh9C+u/pDhDHN9Y9 L0a+oK04c5On+tmXhyccbpWZ/wDOMA/5CTL/ANs6f/k5FlOt+j4q+sM1KHxt/wA5Aj/kLuvf9Gn/ AFBQ5udJ/dj8dUvPKZkq6mKvvzy5/wAo9pf/ADCQf8mlzn58yh5X/wCvP/8Abp/5l5l/5D4q9kzC V5X/AM5K/wDkr5/+Yu3/AOJHMvR/3ivkembdL6Btv+cTfWt4pv8AFXH1EV+P1CtOQrT/AHpzXHX/ ANH7VVf+hSP+/r/7l/8A2c4/n/6P2/sW3f8AQpH/AH9f/cv/AOznH8//AEft/Ytu/wChSP8Av6/+ 5f8A9nOP5/8Ao/b+xbUn/wCcQeTFv8W0r/2r/wDs5yB1t9PtVb/0J/8A9/b/ANy//s6x/OeSHf8A Qn//AH9v/cv/AOzrH855K7/oT/8A7+3/ALl//Z1j+c8lTbyn/wA4uJ5f8zaXrb+YhfDTbmK5FqbL 0uZiYMvx+vJxoRX7JyM9VYIpWX/mZZmPVbe7A+G4i4k/5UZ3/Bhnn/tJhrLGf84fc9R2HlvGY9x+ 9h2c47xEafdG0v7e6HWCRJP+BYHLtPl8PJGf80gtWbHxwMe8PbWdWWORWPCoI478gw4j6PirnqAI IsPAkUqYUOxV2KuxV2KuxV2KuxV8k/8AOSY/5CfP/wAwlv8A8RObjRf3aUR/zjEP+QkS/wDbOn/5 ORYNd9HxUvq7NQh8cf8AOQA/5C5r3/Rp/wBQUObrSf3Y/HVLzymZKupir768u/8AKP6Z/wAwkH/J tc56f1FDyz/153/t0/8AMvMv/IfFXseYSvLP+ck//JYT/wDMXb/8SOZei/vFfJFM3CX6Bad/xz7X /jFH/wARGc6eaERgV2KuxV2KuxV2KuxVawrIlRULVg3gaU/UTirG/wAwtP8ArWgmdRWS0cSbdeJ+ Fv11+jNH2/p+PT8Q5wN/oLtux83BmrpLZ5ZnCPXOxV615TuxqnleKNndXVGtZXRirqVHEFWG4biQ a56J2NqPE08T1jt8v2U8V2nh8PPLuO/zfG/mLzf+Z+h69qGjXXmnWPrGn3ElvIfr91QmNivIfvOj UqM6mMIEXQcFL/8AlZX5i/8AU1ax/wBJ91/1UyXhR7grv+VlfmL/ANTVrH/Sfdf9VMfCj3BXf8rK /MX/AKmrWP8ApPuv+qmPhR7grafmX+YisCfNOrkDqDf3P/VTCMcO4KmA/MX8wCAR5n1ah6f6dc/8 15f4MO4fJXpH/OP/AJu82ap+YkNpqet399am1nY29zdTTRllUUPB2ZajMXWYoiFgBX09mpQ+Sv8A nJIf8hOn/wCYS3/4ic3Oi/u0sK8necdb8o6sdV0Zo0u2iaAmVBIvByCdj/qjL8mITFFWbf8AQyP5 nf7/ALT/AKR1/rlH5HGtMB80eY9T8za7c63qhRr674es0a8F/dxrEtFHT4UGZOPGIigqVUySupir 060/5yI/Mm1tYbWKa1EUCLFGDbqTxQBRU18BmKdFjJVJf+Vtecf8Y/4u9SD9M+h9W5+kPT9OlPsV 65P8tHh4eip//wBDI/md/v8AtP8ApHX+uV/kca0kvm785PO3mvR20jV5Ld7N3SUiKEI3JDVfiByz HpYQNhWDUy9X3/p3/HPtf+MSf8RGc5Lmh5x/zkRq+raV5BjutLvbiwuTfQoZ7WV4ZOJSQleUZU0N OmZWiiJToi9lfNH/ACsT8wf+pn1b/pOuf+a82vgQ/mj5JQl1+ZX5hB+CeaNXFOpF/c9f+RmVTxw7 h8lUf+VlfmL/ANTVrH/Sfdf9VMh4Ue4K7/lZX5i/9TVrH/Sfdf8AVTHwo9wV3/KyvzF/6mrWP+k+ 6/6qY+FHuCu/5WV+Yv8A1NWsf9J91/1Ux8KPcFfWf5C22vr+XVlqGvX91qGoaq73gkvJpJ5Egaiw orSFjxKLzA/ys12oI4qHRD0C4giuLeSCUcopVZHHirChzFyQE4mJ5EUyhMxkCOYeJ6jYy2N9PZy/ 3kDlCfGnQ/SN88x1GE4shgecS97hyjJASHVDZS2sy/LbVRDqE2nufgul5xf8ZEG4+lf1Z0ns5quH IcZ/i5e8fs+50fben4oCY/h+4vHv+cqfJrWHme080W6f6Lq8YhumHa6gUKCf9eILT/VOeh6Sdiu5 5h4ZmWrsVdirsVRdnN/upj/q/wBMtxy6K9d/5xvH/ITYP+YS4/4iMp1392pfWeaVDB/Nv5OeSvNe sNq+rxTteMiRExTFF4oKDYDMjHqZwFBUm/6Fu/LL/fF3/wBJDf0yz89kW3f9C3fll/vi7/6SG/pj +eyLbv8AoW78sv8AfF3/ANJDf0x/PZFt3/Qt35Zf74u/+khv6Y/nsi27/oW78sv98Xf/AEkN/TH8 9kW3f9C3fll/vi7/AOkhv6Y/nsi27/oW78sv98Xf/SQ39Mfz2Rbd/wBC3fll/vi7/wCkhv6Y/nsi 27/oW78sv98Xf/SQ39Mfz2Rbd/0Ld+WX++Lv/pIb+mP57ItvT4o1iiSJPsooVa+AFBmGryj/AJya /wDJcxf9tCD/AIhLmboP7z4KHyfcSiJK/tHZRm2kaCUuJJNT1OY6tYq7FXYqnvkjyvc+afNmmaDb 1DX06pK4FSkQ+KWT/YRqzZHJPhiSr75s7S3s7SC0tkEVtbxrFDGuwVEAVVHyAzTk2hVwKwD8ytGK yw6tEvwvSK5p/MPsMfmNvuzkvaPR0RmHXY/o/U9H2JqdjjPvH6WC5yr0KtaXU1pdRXMJpLC4dD7q a5ZiynHMSjzBtryYxOJieRegee/LNp+Yf5eXNhEVWa6iE9hIx2juot0BPhyqjexOeoaHVicY5I8i 8JnwnHMxPR8OXNtPa3MttcRmK4gdo5omFGV0PFlI8QRm+Ba1LFXYq7FWwSDUdcVeu/8AON+p2kX5 jQyXc0cCra3ALyMEU1UU3YgZDVHix11V9W/4h0D/AKudp/yPj/5qzU8Eu5Dv8Q6B/wBXO0/5Hx/8 1Y8Eu5Xf4h0D/q52n/I+P/mrHgl3K7/EOgf9XO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P8A5qx4Jdyu /wAQ6B/1c7T/AJHx/wDNWPBLuV3+IdA/6udp/wAj4/8AmrHgl3K7/EOgf9XO0/5Hx/8ANWPBLuV3 +IdA/wCrnaf8j4/+aseCXcrv8Q6B/wBXO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P/mrHgl3K7/EOgf9 XO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P8A5qx4JdyvKv8AnJPWtIn/AC7RLe9gnkF/A3pxSI7UCSdl JOZmiBjOz3K+TZpWlcs30DwGZ8pWlTyKuxV2KuxV9N/84reQWtdPu/Od7HSW9DWmmBhuIUb97KP9 d14j/VPjmBq8m/Ch9AZhq7FUPqFjBf2U1nOKxTKVbxHgR7g75TqMEcsDCXKTbhynHMSHMPGNT0+4 06+ms5xSSFqE9iOoYexG+ea6nTyw5DCXMPc4M0csBKPIoXKG5mn5da8ILltKnakVweVuT0ElN1/2 Q/H5503s9ruCXgy5S5e/9v45ui7a0nFHxBzHP3fseR/85O/lo2n6ovnPTYf9B1BhHqqoNo7nospp 2lGxP83u2eg6XLY4S8y8FzLV2KuxV2KtqzKQymhHQ4QVTK1vEkoj7SfgcyIZLVFUyxLqYq6mKupi rqYq6mKupirqYq6mKupirqYqpzTRwrVzv2Hc5GUgEJXPO8zVbYDovhmNKVqpZFXYq7FXYqyj8uPI 1/51812miWtUhc+pfXIFfRtkI9R9++9F8WIyvLkERavurTNNstM06206xiEFnZxJDbxL0VIwFUfc M1JNm0InArsVdirFfPfls6jZ/XrZK3lsvxKOrx9SPmvUZoe3OzvGh4kR64/aP2O47J1vhS4JfTL7 C8wzhnrFyO6OroSrqQVYbEEbgjCCQbCCARRen6bcaX5z8r3Ol6rEsyzRG31CA7VDDZ18K9QR0Ye2 eidkdo+PjB/jjz/X8Xi+0NGcGTb6Ty/U+N/zL/L7U/I3mefSLuslq1ZNOvKUWaAn4W/1h0cdj7Uz qcWQTFuCxTLFdirsVdirsVRlvqDpRZPjXx7jLY5a5qmEU0UoqjA+I7/dmRGQPJV9MKXUxV1MVdTF XUxV1MVdTFXMVUVY0A6k4lUFPqKD4YRyP8x6ZTLL3IS93d2LOase5ygm1W4FdirsVdiqra21xdXM VrbRtNcTuscMSAszuxoqqB1JJxJV9qfkr+WEPkXywEuVVte1ALLqcwoeJH2IFP8ALHX6WqfDNVny 8Z8kPQspV2KuxV2KuxV5v568qG0lfVLJP9EkNbiMf7rcn7Q/yWP3HOM7c7L8MnLAeg8/I/qL1HZP aHGPDn9Q5ef7WHZzbvEdo2r3Wk38d5bnddpEPR0PVTmXo9XPT5BOP9ocfU6aOaBjJmfnbyd5e/M7 yf8AV3YRzislheUBktrim4YeB6OvcfQc9I0GujkiMkOR/FPE6jBLFMxlzfGPmfyxrPljW7nRtYgM F7bGjDqrqfsujftKw3BzewkJCw1JVkldirsVdirsVbBKmoNCOhGFUVFqVwmzUce/X78sGUhUSmqw n7alT7bjLBmCqy39o3+7KfMEZMZIqvF1bH/dq/fh4496VpvbQdZB9FT+rB4ke9Cm+p2y/Zq3yFP1 5E5oqhpNVkO0aBfc7nIHMeioSSaWQ1di3zykyJ5qswK7FXYq7FXYq2ASaDrir6m/5x9/JU6HFF5t 8xQU1iZK6bZSChtY2BBkcH/drqdh+yPc7a/UZ79I5Ie6ZiK7FXYq7FXYq7FWpI0kRo5FDo4KsrCo IOxBBwSiCKPJIJBsPL/N/lCbS5Wu7RS+nOa7bmIk/Zb/ACfA/wCZ4btbsg4Dxw3xn/Y/set7O7SG UcMvr+9i+aJ2yb+XPMd3ot36kfx270E8BOzDxHgw7HNj2f2hPTTsbxPMfjq4Wt0Uc8aP1dCyL8wP y68r/md5ejmDiHUYkb9H6ko+OJuvpSr+0leq9uoz0XRa6M4icDcT+Pm8bmwyxSMZDd8e+bPKOv8A lTWJdI1u2NtdR7qesciHpJE/RlPj9B3zdQmJCw1pNkldirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVXIjyOscal3chURRUknYAAYq+nfyO/ID9FPb+Z/NsIbUhSTT9KcVFueqyzDvJ3Vf2ep+L7 OBn1F7RQ98zDV2KuxV2KuxV2KuxV2KtSRpIjRyKHRwVZWFQQdiCDglEEUeSQSDYedeavIktqXvdL UyW27SWw3dP9X+ZfxGcd2p2GYXPELj3dR7vJ6bs/tYTqGTaXf3sMzmneppoPmG+0a69W3PKFqetb sfhcfwPgcz9D2hk007jy6jvcPV6OGeNS59CzLXvL3kv8zPL5tNQiDsm8ci0W6tZGH2kbfrT/AFW7 53/Z/aUM0eLGfeHkNVpJ4ZVL5975V/Mz8mvNPkW4aadDfaI7Ug1WFTw3OyzLuYn+ex7E5vsWYT97 jsBy5XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FU28teVtf8zarHpeiWb3l5JvxQUVF7vI5oqKP FjkZTERZV9YflJ+Q2i+S1j1TUympeZSKielYbavUQKw+12Mh38OO9ddm1BlsOSHquY6uxV2KuxV2 KuxV2KuxV2KuxV2KsX8x+RrLUi9zZ0tb01JNP3bn/KA6H3GaPtHsSGa5Q9M/sPv/AFu20Xas8Xpl 6ofaHnOpaTqGmzmC9haJ/wBkndWHirDY5xmp0uTDLhmKL0+DUQyi4G1OyvruxuFubSVoZk6Ov6iO hHscjhzzxS4oGpM8uKOSPDIWHoGi+d9L1W3bT9ajjjaZTHIJAGt5VbYhg1QK9w22dj2f2/DJUcno n39D+p5nWdkTh6sfqj9v7XnH5i/84v6RqXq6l5NmTTbt6u2mykm0cnf9045NF8t18OIzq8WrPXd0 z528z+TvM3le++pa9p01jMa8DIKxyAdTHItUce6k5nRmJclSbJK7FXYq7FXYq7FXYq7FXYq7FXYq q21rc3VxHb2sLz3Ep4xQxKXdmPZVWpJxJV7V+Xv/ADjF5j1cx33mqQ6Np5oRZrRryQe43WKv+VVv 8nMXJqgOW6vpTyt5Q8ueVdMXTdCso7O2G7ld3kb+aRzVnb5nMCczI2UJxkVdirsVdirsVdirsVdi rsVdirsVdirsVUbuytLyAwXUSzRN1RxUfMeByrLhhkjwzAIbMeWUDcTRYVrP5aqeUukzce/1aY7f JX/r9+c1rPZzrhPwP6/1/N3um7b6ZB8R+phuoaRqWnScL23eE9AzD4T8mHwn6DnN6jSZcJqcSPx3 u8w6jHlFwIKP0Tzdq+klUjk9a1HW3k3Wn+Seq/RmVou1s2n2BuPcfxs4+q7OxZtyKl3hmMfmXyj5 ks20/WLeIxy7PaXqLJEx6bMw49+9DnWaPt3Dk5ngl5/r/sed1PZOXHuPUPL9TAPNv/OLXk3VOdz5 du5dGuH+JYf96LU132ViJFr7PT2zoserPXd1rx/zJ/zjp+Z+il3hsU1e2U7S2DiRqdv3T8Ja/JTm VHUwPkrzrUdK1PTZzb6jZz2VwOsNxG8T/wDAuFOXAg8lQuFXYq7FXYq7FVyI8jqiKXdjRVUVJJ7A DFWZeXvyc/MrX+DWOg3KQPuLi6Ato6fzBpinIf6tcqlmgOqvWvKn/OJdGSbzVrAIFC1lpw69955R 94Ef05jz1ncEPbPKf5f+TvKcPp6DpcNo5HGS5pzncf5cz8nI9q0zEnklLmVZDkFdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVWyRxyoUkQOjfaVgCD8wcjKIkKIsJjIg2Eg1DyH5eu6skLWsh/ agPEf8Car9wzU6jsLTZOQ4T5fq5Oyw9rZ4czxDzY7efljeLU2d5HIOyyqUP3rzzT5vZqY+iYPv2/ W7LF27E/XEj3b/qQ1tovn3Rj/oYk9MfsxukiH/nmSf1ZTj0faGn+i68iCPl+xtnqtHn+qr8wQfmn Fr5y8x24C6noszAdZY0dNh3oQwP35sMXbGphtlxS94BDhZOzcEv7vIPiQmJ80eWtRh+r6hAyo/WC 8tyyntvs6/fmxxds4Tz4oHzB/Q4U+zMseVS9xSq5/Kz8o9b5N+gdOkJ3Y2qiBt+59AxnNrh1vH9E r+LhzxTh9QISa5/5xr/KaY1j06e2Fa0iupz9H7xpMyBqptaBf/nFr8sWcsH1FAeircJQffGTh/Nz VEQf84yflVGV5213NxFCHuXFdup4cPwwfmpqnWn/AJEflNYkGLy9DIw73Ek09Tt2ld17eGROomeq ss0ry55e0gU0rTLTTxSn+iwRw7f7BVysyJ5lUxyKuxV2KuxV2KuxV2KuxV2KuxV2Kv8A/9k= + + + + + + 1 + False + False + + 119.000000 + 118.999512 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Standard-Farbfeldgruppe + 0 + + + + + + Document + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/Shading<>>>/Thumb 50 0 R/TrimBox[0.0 0.0 119.0 119.0]/Type/Page>> endobj 46 0 obj <>stream +H‰tVËn1 Ýç+òãÚygۂX!„XÀþ +èâ‚Tø‰c'™;s[ZuÆ'3±íL>=ù‡Oìß=y÷â؋tûÛôòç»ûê;&©ÑãõqýóÓ=|øÂþç_÷âÅ3~Û ³øÜ)ùåt]¯[¨Äqêœý–u·P¼¸­fê©íÏ{¥–ãmûĬ¯NÛ¿vžï~g܁ymbóôÃ}ÆB©)ùÜA{âÄpÕ}*T²ˆÂ͗ EÒBwÆW×"•^¤åh¢æâÎøºp­Ô»ŸŽz_Ya'ÚÃN|uƒã„“þðsÎíbU}ÙK¸1±þ€]©(aÈ2ÌÃs Z–2³ EKýøÍ?|yfÿ÷Ù¿ÿ懢ÿë¦^:\æ¦-%í?Í)EJ9[ Q[ˆ^:Ŏ‚V +(z¢ŠÏBœñ²KÉ슈«(F)Õغ8ôk +y᭑öS£°F3k³õìmKò›íIËã‚­ãíy‚rÁ ×nDÇCÎU Œ,6KCûq³ôò¡3EµP‰nҠ̝Ñ"%Pˆ-ÞÔÙ"T-êçjv  ¹ÁWQjý†5%½ãHÊ]QY¹i””1OëꞍލüf¦VúaòÇ»FǬ­S±Í„côåë{zäÒîI‰…ŠWãÀbX¨Zf“ё›ŽB¦ªw„ov,ocáà^²5ãNõM\€ùl/G!’9ac0nGcÅ(eY)˜ª+›{YW±f¥Åƒ¶΁T‰¦¹ „I ¥ ¯Òy‹–_½â¢SÙ(b`€tV¶B¹íáYŠ¯ ó0…Ëќݠi#À= +%ï +žÑî]'«H>.t(™;…YÿÉ]qSñfr¦Þžè½|úMbnííaIµíâ¶QS7¨FØ; Œi€Õç” sÐ6[ãeºóç}6$æêcBU˺̓qõקaU±»'UðåÚ³(TÓ(Í°pÐg‰¬9¼¡‰Î„~Э—㸢I±Ž[­ÖùDoy´ûnß{ÍðÛk†PÑ´ë´Œ¡ÊŠò¢œ¥–úñµŠb‘sYoôßÄ?(ŸÝ?uô­· +endstream endobj 50 0 obj <>stream +8;UT3d0Te-#Xc.2r%d*YWt%"+'N:(9\^ +endstream endobj 51 0 obj [/Indexed/DeviceRGB 255 52 0 R] endobj 52 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 49 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 44 0 obj <> endobj 56 0 obj [/View/Design] endobj 57 0 obj <>>> endobj 48 0 obj <> endobj 47 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (Eclipse_with_icon.ai) +%%CreationDate: 6/22/2019 3:20 AM +%%Canvassize: 16383 +%%BoundingBox: 404 366 514 469 +%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentFiles:K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 399.6704 358.1719 518.6704 477.1714 +%AI3_TemplateBox: 639.5 400.5 639.5 400.5 +%AI3_TileBox: 43.1904 129.791 843.8301 705.7915 +%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: 1 +%AI9_OpenToView: 251.75 551.25 4 1528 954 26 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 60 0 obj <>stream +%%BoundingBox: 404 366 514 469 +%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 +%AI7_Thumbnail: 128 120 8 +%%BeginData: 22957 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 +%524C45FD31FFCFCFC9C9C2FD04C1C8C8CFCAFD6EFFCACFC8C89FC1BAC098 +%C1C1C9C9FD70FFCAC9C2C1C0C1C0C0BAC1C2C9CAFD0BFFA8A87EA87D7E7D +%A87DA8A8A9A8FD58FFCAC9C1C198C09EC198C0C1C9CAFD07FFA8A8535328 +%2821280028002100220021002821282853537E7EFD51FFCFC2C1C0C1C0C1 +%C0C1C0C8CAFD07FF7D772828212800282828212828282128282821282828 +%21282128002828537DA9FD4BFFC9C2BAC098C1C0C198C1C2CFFD05FFA977 +%4C0028002800282128002821280028212800282128002821280028212800 +%280021002853A8A9FD45FFC9C1C0C0C1C1C1C0C1C0C8CAFD05FF7D532128 +%212821282828212828282128282821282828212828282128282821282828 +%212828280028214C53FD42FFC9C198C19EC198C198C09FCFFD04FFA87721 +%220028002821280028212800282128002821280028212800282128002821 +%2800282128002821280028002100537EFD3EFFC2C1C0C1C1C1C0C1C0C1C9 +%FD05FF532800282828272828282728282827282828272828282728282827 +%28282827282828272828282728282827282828272821284CA8FD3AFFC998 +%C0C0C19EC1C0C098C8CFFFFFFFA853002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%2821280028212200537EFD36FFCAC8C0C1C0C1C1C1C0C1C1CFFD04FF7728 +%002821282828212828282128282821282828212828282128282821282828 +%212828282128282821282828212828282128282821282828002853FD34FF +%C9C098C19EC198C198C09FFD04FFA8282100282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%280028212800282128002821280022217DFD31FFC2C1C0C1C1C1C0C1C0C1 +%C9FD04FF7D21282728282827282828272828282728282827282828272828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828280053A8FD2DFFCF9FC0C0C19EC1C0C198C1C9FFFFFFA828 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%0028212800287DFD2BFFCFC1C1C0C1C1C1C0C1C0C1CAFFFFFF7D28212821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%282828002853FD29FFC998C19EC198C19EC198C1CAFFFFFF522100282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%00282128002128A9FD26FFC9C0C1C1C1C0C1C1C1C0C8FD04FF4C28212828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827FD0428A9FD24FFC9BAC19EC1C0C19EC1BAC2FFFFFFA92828 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800A8FD22FFC9C0C1C1C1C0C1C1C1BAC8 +%FD04FF282821282828212828282128282821282828212828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%28212828282128282821282828212828282128282800A2FD20FFC998C198 +%C19EC198C198C1CAFFFFA921282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%28007EFD1EFFCFC0C1C0C1C1C1C0C1C0C1CFFFFFFFFD0428272828282728 +%282827282828272828282728282827282828272828282728282827282828 +%272828282728282827282828272828282728282827282828272828282728 +%28282728282827FD052800A8FD1CFFCF9EC1C0C19EC1C0C198C1CAFFFFFF +%282100282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%21280028212800282128002821280028212800282128002800A8FD1BFFC1 +%C1C0C1C1C1C0C1C0C1C9FFFFFFFD04282128282821282828212828282128 +%282821282828212828282128282821282828212828282128282821282828 +%212828282128282821282828212828282128282821282828212828282128 +%282821282828212828A9FD19FF9FC09EC198C19EC198C0C8FFFFFF520000 +%282128002821280028212800282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%2821280028212800282128002821280028212800282128002827FD18FFC9 +%C1C1C1C0C1C1C1C0C1C2FFFFFF7D28212828282728282827282828272828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%28272828282728282827FD0428FD16FFCAC198C1C0C19EC1C0C09EFFFFFF +%7E2821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212153FD15FFC8C0C1C0C1C1C1C0C1C0CFFFFFA928002828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%28282821282828212828282128282821282828212828287EFD13FFC998C1 +%9EC198C19EC198C8FFFFFF53002800282128002821280028212800282128 +%002800280028002800280028002800280028002800280028002800280028 +%002800280028002800280028002800280028002800280028002800282128 +%00282128002821280028212800280028A8FD11FFCFC0C1C1C1C0C1C1C1C0 +%C1CFFFFFA800282728282827282828272828282728282827FD3B28272828 +%282728282827282828272828280077FD11FFC1C09EC1C0C19EC1C0C0C9FF +%FFFF212821280028212800282128002821280028212828FFA8A9A8FFA8A9 +%A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FF +%A8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8FF772821280028212800282128 +%002821280028212800A8FD0FFFC9C1C0C1C0C1C1C1C0C1C1FFFFFF532821 +%28282821282828212828282128282821282153FD37FFA800282828212828 +%28212828282128282821FD0428FD0FFFC198C19EC198C19EC198CAFFFF7E +%2800280028212800282128002821280028212800284CFD37FF7D21002821 +%280028212800282128002821280028210053FD0DFFC9C0C1C1C1C0C1C1C1 +%C0C8FFFFFF5321282728282827282828272828282728282827282153FD37 +%FFA800282828272828282728282827282828272828282128A8FD0CFFC1C0 +%9EC1C0C19EC1C0C0C9FFFFA8002821280028212800282128002821280028 +%2128002852FD37FF7D220028212800282128002821280028212800282128 +%007DFD0BFFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828212828282128282821 +%28282821282828212828280053FD37FFA821282128282821282828212828 +%28212828282128282821FD0BFFC198C19EC198C19EC198CAFFFF7D280028 +%00282128002821280028212800282128002821214CFD06FFA87EA87EA87E +%A87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87E +%A87EA87EA87EA8A8FD05FF7D280028002821280028212800282128002821 +%280028212152FD09FFCFC0C1C1C1C0C1C1C1C0C8FFFFFF53212827282828 +%272828282728282827282828272828280053FD06FF522828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%28212828FD06FFA821282728282827282828272828282728282827282828 +%2128A9FD08FFC1C09EC1C0C19EC1C0C0C9FFFFA800282128002821280028 +%21280028212800282128002821224CFD06FF530028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%28A8FD05FF7D282128002821280028212800282128002821280028212800 +%7DFD07FFCAC1C0C1C0C1C1C1C0C1C1FFFFFF532821282828212828282128 +%2828212828282128282821282153FD06FF53282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%FD06FFA8002828282128282821282828212828282128282821FD0428FD07 +%FFC998C19EC198C19EC198C8FFFFA8280028002821280028212800282128 +%002821280028212800284CFD06FF53002800280028002821280028212800 +%282128002821280028212800282128002821280028002800280028A8FD05 +%FF7D210028212800282128002821280028212800282128002800217DFD06 +%FFFD04C1C0C1C1C1C0C1CAFFFFA800282728282827282828272828282728 +%28282728282827282153FD06FF532827282153FD04282728282827282828 +%2728282827282828272828282728282827282853FD0528FD06FFA8002828 +%2827282828272828282728282827282828272828280077FD05FFCAC198C1 +%C0C19EC1C0C19FFFFFFF4C28212800282128002821280028212800282128 +%00282128002852FD06FF530028002877FF21282128002821280028212800 +%282128002821280028212800282128007EA82800282128A8FD05FF7D2100 +%282128002821280028212800282128002821280028212821FD05FFC9C0C1 +%C0C1C1C1C0C1C0C8FFFFA828002821282128212821282128212821282128 +%2128212821280053FD06FF52282828007DFFA80028282821282828212828 +%2821282828212828282128282821280077FFA92128212828FD06FFA80028 +%2128212821282128212821282128212821282128212821227DFD04FF9FC0 +%9EC198C19EC198C0C9FFFFFF7EA87EA87EA87EA87EA87EA87EA87EA87EA8 +%7EA87EA87EA87EA8A8FD06FF530028212152FFFF7E002821280028212800 +%2821280028212800282128002821280053FFFF7E2800280028A8FD05FFA8 +%A87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA8FFFFFF +%CFC1C0C1C0C1C1C1C0C1C1FD25FF52282828007DFFFFFF7E002827282828 +%272828282728282827282828272828280053FFFFFFA92828272828FD25FF +%CA98C1C0C19EC1C0C198C8FD25FF530028212153FD04FF7D002800282128 +%00282128002821280028212800280028A8FFFFFF7E2821280028A8FD21FF +%A8FFFFC8C0C0C1C1C1C0C1C1C0C8FD25FF53282128007DFD05FF53002821 +%2828282128282821282828212828280028A8FD04FFA82128282821FD25FF +%C898C198C19EC198C198C9FFFFA8FD22FF530028002253FD05FFA8520028 +%002821280028212800282128002800227DFD05FF7E2800280028A8FD21FF +%A8FFFFC1C1C0C1C1C1C0C1C0C1CAFD25FF53282728007DFD07FF4C002828 +%282728282827282828272828287DFD06FFA821FD0428FD24FFCAC1C0C19E +%C1C0C19EC1C1FFFFFFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8 +%A9A8FFA8A9A8FFA8A9A8FFA8A9A8530028002853FD07FFA8280028212800 +%2821280028212800284CFD07FFA828002821287EFFA8A9A8FFA8A9A8FFA8 +%A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8FFCFC0C1C1C1 +%C0C1C1C1C0C8FFFFFF4C2828212828282128282821282828212828282128 +%282821282828212828282128282821282828007DFD08FFA8280028282821 +%282828212828280053FD07FFA82128212828282128282821282828212828 +%2821282828212828282128282821282828212828282128A8C8C098C19EC1 +%98C19EC0A0FFFFA800280028002800280028002800280028002800280028 +%00280028002800280028002800280028212153FD09FF7D21002821280028 +%212800284C4C28FD07FF7E28002800280028002800280028002800280028 +%0028002800280028002800280028002800280028007EC9C0C1C1C1C0C1C1 +%C1C0C9FFFFA228282827282828272828282728282827FD1728007DFD0AFF +%7DFD0A28FF5253FD07FFA9FD1A28272828282728282827282828272853C1 +%C09EC1C0C19EC1C0C0C9FFFF7E0028212800282128002821280028212800 +%282128212821282128212821282128212821282128212253FD0BFF522821 +%282128212821FFFF5228FD07FF7E28212821282128212821282128212821 +%28212821282128002821280028212800282128002821280053C8C0C1C0C1 +%C1C1C0C1C0CFFFFF7D222128282821282828212828282128282821282828 +%222828282228282822282828222828282228007DFD0CFF4C282828222828 +%A8FFFF5253FD07FFA8212828282228282822282828222828282228282821 +%28282821282828212828282128282821FD04289FC19EC198C19EC198C1C9 +%FFFF53002100220021002200210022002100220021002800220028002200 +%2800220028002200282128002853FD0DFF2828212800A8FFFFFF5328FD07 +%FFA228002821280022002200280022002800220028002200220021002200 +%21002200210022002100220028C1C1C1C0C1C1C1C0C1C1FFFFFF7E7D537D +%537D537D537D537D537D537D537D537E537D537D537D537D537D537D537D +%537EFD0428217DFD0EFF2828217EFD04FF5253FD07FFA822FD04287D777D +%537D537D537D537D537D537D537D537D537D537D537D537D537D537D537D +%537D539EC1C0C19EC1C0C198C1CAFFA8FD24FF530028212853FD05FFA87E +%FD07FFA92228A8FD04FF534CFD07FFA82800282128A8FD23FFC1C0C1C1C1 +%C0C1C1C1C0FFFFFFA8FD23FF52282828007DFD06FF22A8FD07FFA822A8FD +%04FF4C53FD07FFA9FD0528FD24FF9EC198C19EC198C19EC1CAFFA9FD24FF +%530028212253FD05FFA82800A8FD06FF7E287EFD04FF5328FD07FF7E2821 +%280028A8FD23FFC1C0C1C1C1C0FD04C1FFFFFFA8FD23FF53282828007EFD +%06FF282828FD06FFA928A8FD04FF4C53FD07FFA9FD0528FD24FFC0C19EC1 +%C0C19EC1C0C1CAFD26FF530028222253FD06FF28002828FD05FF7E28A2FD +%04FF5328FD07FF7E2822282128A8FD23FFC1C1C1C0C1C1C1C0C1C1FFFFFF +%A9FD23FF53282828227DFD06FFFD04284CFD04FFA822A9FD04FF5253FD07 +%FFA822FD0428FD24FF98C19EC198C19EC198C1CAFFFF7D284C2852284C28 +%52284C2852284C2852284C2853284C2853284C2853284C28532852282822 +%28212853FD05FFA8282128212852FFFFFF7E287EFD04FF5328FD07FFA228 +%002822282853284C2853284C2853284C2853284C2853284C2852284C2852 +%284C2852284C2852284CC8C0C1C0C1C1C1C0C1C0CFFFFF53222128212821 +%28212821282128212821282128282822282828222828282228282822FD05 +%28227DFD06FFFD062853FFFFA822A9FD04FF5353FD07FFA9FD0828222828 +%282228282822282828222828282128212821282128212821282128212828 +%9FC1C0C19EC1C0C198C1C9FFFF7E00280028212800282128002821280028 +%21282228282822282828222828282228282822282828222853FD05FFA828 +%2228222822287DFFA8287EFD04FF534CFD07FFA828222828282228282822 +%282828222828282228282822282128002821280028212800282128002800 +%52C8C0C1C1C1C0C1C1C1BAC9FFFF7D282828212828282128282821282828 +%21FD1728007EFD06FFFD0828A8FF28A8FD04FF4C53FD07FFA9FD1A282128 +%28282128282821282828212853C2C098C19EC198C19EC0A0FFFFA8002821 +%280028212800282128002821280028222822282228222822282228222822 +%2822282228222853FD05FFA828002822282228222853287EFD04FF5328FD +%07FF7E282228222822282228222822282228222822282228222800282128 +%002821280028212800282128007DC9C0C1C1C1C0C1C1C1C0C9FFFFA82821 +%2821282828212828282128282821FD14284D2828227EFD06FFFD05284DFD +%0528A9FD04FF5353FD07FFA92828284DFD12282128282821282828212828 +%282128282821287DC9C098C1C0C19EC1C0C09FFFFFFFFD04282728282827 +%2828282728282827FD13282228282853FD06FF2822282828222828282228 +%A8FD04FF5328FD07FFA228222822FD132821282828272828282728282827 +%28282821A8FFC1C1C0C1C1C1C0C1C0C1CFFD25FF53282828227DFD06FFFD +%0B28A9FD04FF5353FD07FFA8FD0528FD24FFCAC198C198C19EC198C19ECF +%FFFFCBFD22FF530128222853FD05FFA828222822282228222822287EFD04 +%FF534CFD07FFA22822282228A8FD24FFC2C1C0C1C1C1C0C1C1C1C9FD25FF +%5328284D227EFD06FF2828284D2828284D282828A9FD04FF5353FD07FFA9 +%2829282828FD25FFC9BAC19EC1C0C19EC1BAC8FFFFA8FD22FF5322282228 +%53FD05FFA84D22282228282822282828A2FD04FF534CFD07FFA828222828 +%28A8FD24FFC9C1C0C1C0C1C1C1C0C1C1FD25FF53282828227EFD06FFFD05 +%284D2828282928A8FD04FF4D53FD07FFA92828282928FD26FF9EC19EC198 +%C19EC198C1CAFFA8FD22FF530128282853FD05FFA9282228282822282828 +%2228A8FD04FF5328FD07FF7E2822282228A8FD21FFA8FFFFFFC8C0C1C0C1 +%C1C1C0C1C0C9FFFFA87E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7E7E +%7DA27E7E7DA8FD06FF53282829227EFD06FF28292829284D2829284D28A9 +%FD04FF5353FD07FFA92829284D28FD07FF7D7E7DA27E7E7D7E7D7E7D7E7D +%7E7D7E7D7E7D7E7D7E7D7E7D7EA2FD04FFC9C0C0C19EC1C0C19EC0C2FFFF +%FF00000022002100220021002200210022002100282228012801224CFD06 +%FF5322FD042877FD05532822FD072822284DFD04532828FD07534C282828 +%2228A8FD05FF7D2201280128012800220021002200210022002100220021 +%0022007EFD05FFC0C1C1C1C0C1C1C1C0C1CFFFFF53002821282828212828 +%282128282821282828224D2829284D2877FD06FF5328284D282822282828 +%22282829284D2829284D282928292828222828282228282822FD04284D28 +%2828FD06FFA8224D2829284D282821282828212828282128282821282828 +%2128FD06FFC298C19EC198C19EC198C9FFFF7D2200280028212800282128 +%002821280028212822282828222853FD06FF532228222828282228282822 +%282828222828282228282822282828222828282228282822282828222822 +%28A8FD05FF7E282228282822282128002821280028212800282128002821 +%2152FD06FFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828272828282728282827 +%282828272828282128284D284D2877FD06FF5328284D2829284D2829284D +%2829284D2829284D2829284D2829284D2829284D2829284D2829284D2829 +%28FD06FFA8284D284DFD04282728282827282828272828282728282800A8 +%FD07FF9EC1C0C19EC1C0C198C1CAFFFF7D00280028212800282128002821 +%280028212800FD052853FD06FFA9A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8 +%A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2FD04A8FD05FF7E +%28282928280028212800282128002821280028212800280028FD08FFC8BA +%C1C1C1C0C1C1C1BAC9FFFFA8282828212828282128282821282828212828 +%28212828292277FD37FFA82829284D282821282828212828282128282821 +%28282821287DFD08FFCAC098C19EC198C19EC09FFFFFFF4C222128002821 +%280028212800282128002821280028282853FD37FF7D2828280028212800 +%28212800282128002821280028212821FD0AFFFD04C1C0C1C1C1C0C1C9FF +%FFA82128272828282728282827282828272828282728284D287EFD37FFA8 +%284DFD042827282828272828282728282827282828007EFD0AFFCA98C1C0 +%C19EC1C0C198C2FFFFFF5300280028212800282128002821280028212800 +%28282853FD37FF7E29282800282128002821280028212800282128002800 +%28A8FD0BFFC2C0C1C1C1C0C1C1C1BACFFFFFA22828282128282821282828 +%212828282128282821282277FD37FFA82228282821282828212828282128 +%282821282828212877FD0CFFC9C098C19EC198C19EC09FFFFFFF28222128 +%00282128002821280028212800282128002828A8A2A8A8A87EA8A8A87EA8 +%A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A8 +%7EA8A8A87EA8A8A87EA8A8A87EA953280028212800282128002821280028 +%21280028212821FD0EFFFD04C1C0C1C1C1C0C1C9FFFFFF28282728282827 +%282828272828282728282827FD04284D284D284D284D284D284D284D284D +%284D284D284D284D284D284D284D284D284D284D284D284D284D284D284D +%284D284D284D284D28282128282827282828272828282728282827282828 +%007EFD0EFFCF98C1C0C19EC1C0C198C1CFFFFF7D00280028212800282128 +%002821280028212800282128222928292829282928292829282928292829 +%282928292829282928292829282928292829282928292829282928292829 +%28292829222821280028212800282128002821280028212800280028FD10 +%FFC8BAC1C1C1C0C1C1C1BAC9FFFFFF4C2128212828282128282821282828 +%2128282821FD04284D284D284D284D284D284D284D284D284D284D284D28 +%4D284D284D284D284D284D284D284D284D284D284D284D284D284D282821 +%282828212828282128282821282828212828282128A8FD10FFCAC198C19E +%C198C19EC198CFFFFF7D2800280028212800282128002821280028212800 +%282128002828292829282928292829282928292829282928292829282928 +%292829282928292829282928292829282928292829212800280028212800 +%28212800282128002821280028212152FD12FFC9C1C1C1C0C1C1C1C0C1C1 +%FFFFFF53FD05282728282827282828272828282728282827FD04284D284D +%284D284D284D284D284D284D284D284D284D284D284D284D284D284D284D +%284D284D284D284D294DFD04282728282827282828272828282728282827 +%FD0428FD14FF9FC0C0C19EC1C0C19EC0C9FFFFFF28220028212800282128 +%00282128002821280028212800282128284D2829284D2829284D2829284D +%2829284D2829284D2829284D2829284D2829284D2829284D282928282128 +%0028212800282128002821280028212800282128002800A8FD15FFC0C1C1 +%C1C0C1C1C1C0C1CAFFFFA921282128282821282828212828282128282821 +%28282821FD04284D294D284D284D284D284D284D284D284D284D284D284D +%284D284D284D284D284D284D284D28282128282821282828212828282128 +%28282128282821282828007EFD16FFC998C19EC198C19EC198C1FFFFFF7E +%002800282128002821280028212800282128002821280028212800282829 +%28292829282928292829282928292829282928292829282928292829284D +%282800280028002821280028212800282128002821280028212800280053 +%FD18FFC9C0C1C0C1C1C1C0C1C0C8FFFFFF7D002828282728282827282828 +%27282828272828282728282827FD04284D294D2953294D2853294D285329 +%4D2853294D2853294D2853294D284D282821282828272828282728282827 +%282828272828282728282827282152FD1AFFC8BAC19EC1C0C19EC1BAC9FF +%FFFF53002821280028212800282128002821280028212800282128002821 +%2800FD04284D2829284D2829284D2829284D2829284D2829282928280028 +%21280028212800282128002821280028212800282128002821280028A8FD +%1AFFCFC1C0C1C0C1C1C1C0C1C0CFFFFFFF52002828282128282821282828 +%2128282821282828212828282128282821FD042829284D284D294D284D29 +%4D284D294D284D2828212828282128282821282828212828282128282821 +%2828282128282821282128A8FD1CFFCAC198C198C19EC198C19ECFFFFFA8 +%280028212800282128002821280028212800282128002821280028212800 +%280028002821280028222822282228002821280028002800282128002821 +%28002821280028212800282128002821280028212800287EFD1EFFCAC1C0 +%C1C1C1C0FD04C1FFFFFFA84C002827282828272828282728282827282828 +%272828282728282827282828272828282128282821282828212828282728 +%282827282828272828282728282827282828272828282728282827282828 +%2128A2FD20FFC9C098C1C0C19EC1C0C09EFFFFFFA8520028002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002800287DFD22FFC9C1C0C1C1C1C0FD04C1FFFFFFA95300 +%282128282821282828212828282128282821282828212828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828280028A8FD24FFC9C198C19EC198C19EC09E +%FFFFFFA85300280028212800282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%28212800282128002821280028212800280028A8FD26FFCAC1C0C1C0C1C1 +%C1C0C1C1CFFFFFFF7D002828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827282828272828282728282827280053FD29FFCAC1BAC19EC1 +%C0C19EC1C0CAFFFFFF7E2128212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128007DFD2CFFC8C0C1C0C1C1C1 +%C0C1C0C9FD04FF2828212821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%2828282128282821282828212828A8FD2EFFC998C098C19EC198C198C8CA +%FFFFFF532800280028212800282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%2821280028002128FD31FFCFFD04C1C0C1C1C1C0C8CFFFFFFFA853002828 +%282728282827282828272828282728282827282828272828282728282827 +%2828282728282827282828272828282728282827282828272800287EFD34 +%FFA0C0C0C19EC1C0C198C1C9FD04FF7E2722002800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282121007DA8FD36FFC9C1C0C1C0C1C1C1C0C1C1CF +%FD04FF532800282128282821282828212828282128282821282828212828 +%28212828282128282821282828212828282128282821282828002853A9FD +%39FFCAC99EC098C19EC198C098C9CAFFFFFFA87D21210028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002100537EFD3EFFC2C1C0C1C0C1C1C1C0C7C9FD05FF7D53 +%002821282828272828282728282827282828272828282728282827282828 +%272828282728282827282828002853A9FD41FFC9C8C0C098C1C0C198C0C1 +%CAFD04FFA8A8522800280028002821280028212800282128002821280028 +%21280028212800282128002821280028287EA8FD45FFCFC8C1BAC1C0C1C0 +%C1C0C8C9FD05FFA87E522821280028282821282828212828282128282821 +%28282821282828212821280028287EA8FD4AFFCAC99FC198C098C198C09F +%C9CAFD05FFA8A8534C002800210028002800280028002800280028002800 +%220022004C527EA8FD50FFCAC9C1C1C0C1C0C1C0C1C2CFFD08FFA87E5353 +%FD06280028212821FD042853537E7EFD58FFC9C9C1C198C0BAC098C1C2CA +%CAFD09FFA8A9A8A87E7E7DA27EA8A2CBA8FD60FFCFCFC8C8C1C1C0C0BAC1 +%C1C9CAFD78FFCACAA7C9C2C29FC1C1C8A0CACFFD40FFFF +%%EndData + +endstream endobj 61 0 obj <>stream +%AI12_CompressedDataxœì½×vúȳ0z®g-¿8ƒDNÆD 6Ø`œˆ`‚°$&]|Osžá»:wûÅNw+ %Âoïùï5ãõó`Ԫꮮ®ÔUÝÎv'XÑ* aŽ“ß..Ê Er4“q ¯׋ņåø•çÁëÀ! ¶*^§úBËÅ°3z•AÏBQø”€ï{ÊSfÆr3rå ¨%häux¼ðiwÆ-(ð¼:\ÌÖ,ÕÿcÆMû³!½ +‘3¯Ô²Br ]"‰„#žvD3ÌQ¼EMÈÕï$ËÎþ¦ Þh +¡-ћÕh¶š”è?3ŽsD G9b‰4|^Ÿ=P¬¶Q(žÄ¢°e(žHÅ@óh(™Äâàø‹Á+ôp³¤V\›¡‡˖éÍ°Gù/0¶[ržŽj± ÿp”äp®|‡ WhKl¸ C–ºÁ:Eþþ—²ÁE¨‘e3b¶ ØL#ó.í‰fæìšRï+Š -é C²³eh½ØLf«Ð€!Ñ(ßòþ¾ú)Üÿc:ã(@g¹xïC `²–$çÀ#hf‹×x¤_ÚÌ£»Ír@yL¤qô}´ÆýȂƒ±ÃÏèûdÿz ¾êP‚1 y¨•”ÔߢÏ[L02sjõá!3ô~ގ¦Ó¡DN^<“`ÚãxŠÿ&–LÂobÂK]j¹^A3™ˆ¦C`Ò0 üV|›‚qò ái +¤CÉ4îH/RQ w€)‡_ˆ/È3Ný>£þÈ8îè%­Èpžñbÿ[xô°YPÌãj§2¾KóT»¥GÔ¼!ƒ $"úÁåßB‹.ÉL(ð+½Øphy¥$,`fšä_dA\@ÒZS«.ÝC]ÄñP2ÿEx<’r¤ã1G$ÐÄ&H‡_F3Š#fa$<€ðŒ…‡†¡VÿÀ‰ð€¡Áʐ`qã‰TXlÒ뿘ÌhL-g«Ù +¼žŒ„ýgCr±¢¹ðô¯õ”Z…0,5 +/É!ì +˜¤0N,xsƹ?hvˆ6£™07e(Jú‹n8*¼Ü8ðT4Œ¾ Áü#hCj4[,H ,Gé С%É7 Ô£T +>üِ x~œ’‹1Cø’uàéH¸ˆø€*ò‹ŠÙ,òô-J£/„‹ÕpYèB¸Š^WÑËJUñzUzïšouÍ£¸V´¹–ÚT¹iø!`Zü -þ…–â…ߧ–ôÞr³àfëÅ_Ề<ñ(è‘ùQñò£ôÖ ÿ°;¥À-P¯«±a’GLŠã!o“4ÕՐ† +6ãè«uö– + kZ„5/ð‚¸ûz‚ ™&Âvt™ Õýk-*„¸zÒäçЊº[£g©~éýCoÖ׫1}ò›‡·ßzÔØh@]­Á7øXawäp:¡þ¦fÃ)°(ÖQ¤ßKm°öZœ¡üSð.úü ÿoçý +5†‡ €ÿ¶þMƀ¼[_,åþ^Ò£Í<­®~§ôšrnu<‘ÌÚŠö‚\‘Œ=1(á:®¡X!çÜìwǒHA£æ èˆ6 èk &k@5ôj£ÆfÖ@ñÈ*’›ë¨V‚^„ª Ìâf5Ù¢ßÞøÎ_˽˜±K ¸òé³Íž²®Z+¾Ë̆:º4½ ßn rXÏV,µÐôFü{ÿ(DRc=$pñüG (“À”bq= õ°4„ç㥋Ìà}[Ü5DS¥‡µ³¦þž‘ ]ŒÛ¯ý㐠<è*ÈN!`Ú¦óÉ §Žæ øľ²X­p²Ç³Õt´³¾œ„ÊŠ¥¸¿9  x…b¼@(^ÁÇ¡®Qª“`Ø|ŽÒJ©nj Ôú+ø돫¹zd"| H÷k Ï"ŽÒ⹓ߪÑj üÄÁO¢š¬¦À¿4ø?Åj ý+UË观~àÁÂŽþáDü—ˆ‚ÿGù¿ä'¿å>Ô:‚ZD‰úIq" ~D +üNƒßiéwQø”BŸŠèw üÿŸEx"¶Þñái¼„—ñ*è‰Db‘D$IGŠ‘r¤ +:G#ÑX4…qŠt´-E+€ x,‹Åâ±D,KÅÒ±ø©€ŸjxWq,ܶx4‹Çã‰x2žŠ§ãEÃ@,~’X +KcEðSÂÊX Ã#xã è<ãEЯ +^`‘h$Žú%÷* +zûàFË GêQô¦+óýàñ&ÀèL þ^-#`x ƒ$Ž‚ cª(e0ºcŒ4~’à'~ÀPàk'èÀºÅ¢œ$Лj¤~Ê"¾­·à{èMð£|S~¼ ~Jৈ~Òà'~’ðçä70ò?ü]‡€À"¾T*•L%RñT t9’ÂS`•j²’,'KÉb2L%“ÉD2žŒŽE’xK‰J¢œ(%Š‰t"•H&‰8 Q ÁpþÀì•x9^ŠÁÌ¥À &âq„/æ¸è—´4€;K&ãQèƒÉ$øG"ô”á@“ÀM+ƒßàˆ +ðÿ!üìtçQ³Ömÿˆ K,ì!¤M:ÁÅà”‚X:Çá7žHFbàC$™ŠEqøj€q 8LÑÁcA„ý+UdQ&Š*sk9j_ÀéI·EÛ¿¢í_Ñöß'ÚRÉPäè =¦x‹BGq0Çè<|€ÁÿG>5vd€,RiG xc´™qöh +Ž}'Š›Ó‚;e$HêõòÈRÕß©Uk42¦—ùˆÑžæ‡Œàí1fÅXe¦ƒ‚Y"RC”ÏÅ?D ôe½ê$\)ñ;³åz!K|ÌÑâ /¦qáŽg~³Ã¬áü¬¡ýn{=Šü«ƒ~Âÿ‡uP(`ýÿBEÔNW3ŽC{”ŽÌÞùWý«ŽþUG–ê(òOQGÑ_.üÿÇV1ö¿Š­—ö·ôŽ(ªþÇWñ?ƨŒý»Šÿ“Wñžýß´Šÿ§uñXH«Ɍ>öq áԆ’q,cœ‰d:‘Š¢X$‚"£žˆ‰†¿¸¿Ö”ðØãZ±ýßI†Í*<[eÛßÉÅFj ° á.§ÐNè «þó?žTÀ¡ìPiAç0ÈbƒLbÓÀ?b€ƒ*ÁÅí ðL‡âîÐhl TÙü˜Lq8Qps¢Ø#ŌúÙÖÊ°3Óÿ㌰»PÈün_,À¶ÿ †‡ã¢Xã?@üýRÍ°$4¸ ëÐ>§þw¬СZþw-evüÇ?€¿ÿ$9»˜ ÿ÷ˆqK‡"w% ‡ýÇlÄMmÍ»Ðò!½q,†—À-‡7¥à)¶Æ'6ýG P:âÅj€ÙÛ_ÿaIGØX ëO{¢è2,i£Òp<š–F“sü±$¶†·ýÒ?ƨ@Ò²Co˜!…Î(úgX@Ùý#ú±¤8rÌ­#t&}pgÎFBÌÄÏ)Zó¯c! ýç?(Àtzµ><{§Dÿùü"¼ ¥§1ôºÈP$³×³ ´Ë4™ŽãüÙI)…R‘”°Á6þÑh=èÌ"Õjñ [ò·$3»~=DYˆ«ÙŒSì´Â•ôG»ø |%ß$è$wáZté;ߝ6ÍÎàÐãˆ(»ÅC¡Ä# ìƒÀåAñåš-2܀&™Q…“›…ڍ'Mlƒ¨+’ZKÞ¨”.±&G#-¢%ÉÎeªðß±kšÓ¶#3QÖ$E©8ZÏB¢€¾Ò Ffªâµ£¸áhÇ 8˜ýMi¡¯qÜ!ržc¾¢‡szÃ9&|Õ¹YÛKÃcµº“1T­ÓŽ5¹¦;[nè¨6Í:‡MH‚Ž!<K#õaŽ!Wìšäš0³‘ƒ•ÇS§S†Ðлí¶†’V¿ecFŠ %âñhܸ)®ìƒe[e,Ë}@‡ÛIMÅX-ü]G&®šÊ6C±ó;åèRrèØr0[Ì8‘‘=o·3Ž˞L4^ü×ÿe7«ÉÇöºFÀ¤ø0:[Ë!ÜfaáÊÅ—Yá°n)v*1(b‡| ™¸²1Õ+­ ·\jñ&d»Mr5ِÊÑ¦× +NÆED +ѧ8‚ždÖ¢„„ šfzäjÆNÐ  ˜Š;RQHªB¾º [kr(«€XÜ´1A)tº”es8µ[­S†]¶- &0-9ÅüìƖpYˆæ Ú£© ©e[;$E Õ$ÀìʾE$Ác&ë_É!ñT:…›´UŒHiÈ%ìM®¸™˜—¤ÄÔÉtú±TJãs@ßøueÄƓk<‚9¢ßúI¿‚ –7$Vbžžªà}ؙ&äé«fÉbFÇc–’„“!ÓC­SN:'͕ùÚSi¨¨a[Vaԙ@…ãRÓ Ïô£Wª©ÅSI#FD„ÐÈ*]é ü tä&‹2X›­9`“Š FCÀ0‹Äb@±%„ú¼&yÒ,ò¸M2Àú„Gz¶+Ì:‚AeéŠ\¦j[](xp,<¹Aýe +eàñ©[>ŽªÙÓt6œnƒ”[UëÎf¸ ùüE™üF¶—34>çV†’<@@©J·¢‘DàKñ,I3 ž ¼¥lR¼ ÄÛà"ÏÊՕ2=À#8¢&=Tz„"Ô&€&úÔ×b?5~È{4‘=… qg×ÌíP‹?èC¹W„rO¹Ò@ËP÷—Ýÿ Òý[m[ïv 9]Õ¬+³xRöóø6xWˆ¨ñ"ºÍ™QXïð‚ð§¶åhç)Íü-.ƒfka{Ĕ1âIȜ…FbšÂÜÕ6c¡ç'A³lø»ÅHÙáz1üËDŒñ†«­h¶¼å‡Á(Á”-ȵ r Í°ž,ç!js£LÅ5lÆJ•–¼ŒÚóò]±Xì¼Vk ÅÎ(ªŽ·Ú‰5 Òï< õ‡ ½¶jíª°¬Úñ÷N0Vk…Ç ·Z$ÚM©< #•JÉFkN9.«ÆJ¥¤¯`stEŽ¦'6ZË=±ÑXÙ½•5^q¡ÑÂB"òÖ̘^™ŠC؎ΰћ- ÷wÊÌXM3h=šM:ZQR±snÐj¸åñ6ziemQXBŠýè3b§ä^?aèiQ‘ÎPl¸kZjš%õ´ÁŸë:NÅôð‚f £ÝƒC{}zM'[M  +*Sқ[¹!f²hº˜™IÐÆDIµŸkВ^Í$jÁšM?j1Úèû®æ ðÌXÊ5oVC3®á a‰s,4z‰\­¤¼}÷5³ô>†K¥­å)ÓÀW9ˆVí¡M;Þ=ם–$bÉ`$Á°Ø»×Â\«Pi;ꙣ tèT›RzÄ=©áò/3\ђ榖9o®ê­+¡rLlHvU{]1ª¿a© +=,Á?õù¢ø¦Ò•W†wâòÞ|{ö'µhS̘rJ"îüóñ.ñ5tË Ÿ=`š/À¿Õ„Á£"ÿ…2¶ÞRãâƒD;#ã_³môh[&+Һ͔þ£>m…ö:½::FBÐ]_úñZ>Íéäù€p|ü#Ú@„¾áèÅhG-ÀUD–•Ÿ·cʓ±.vþ‚?ÛQ"Åe•ÁcGŒÀdÆÚ¢/® “e 6…çÖ¬­Zâ°%º#°$£@m¥à¦¶¨§€cÍä•Ø– Yî‰À Z)Ø1£XP”#X)‘¢@R²H or ¨ÙÞ«2Ná'à!Å(o Â[<á.$ëX‚zŽ–CÈÑ£˜?¨Õ€èàK9ªJÐx.=uðpØõý¿°”{¶R"qÐ#þ;ˆ~ Ù_ô†’˥ãðöß!G)ä¸^UP„ôšd@ρ¢s,ÿëÿ§ð‚ÿ^Mþëÿ[p³ %ötˆýûj8G ø®lVj4̘ãBæl&²@?dfk+A¯š¿ ‹\f"Þp-2fN¯ØúšÀÄNS÷GՍ’R}X7ubSx«äµ¹g'6í2³¥²Ç¤@dYÕvo›²C¥k)ï–kbØ/>½ <æ/“ g’µéÅL +gèÛàbooé=œ2ô(ç?V|Ú¶º3£¸`›(VL[&×|šàŒ²Cc¡ÿ׫!„Ò1ƒ0xÑz÷X׎‘D +T`ô€Çÿ ™yÉʤßÊþ/ÅVîý†Tl8eöóõ}!•pßs¶ô¦»1“òÖÌæ¡åO€ÛšžÝ¨¬X1ӑÂÞÊýD×´äp+¬0-í¤Šîã@Iʍg;˜}†6CÊ>a5u +¾Q’Þ”ßvŸr»©iöt Ï»ð¬î½ª–›g’G²Ø×Bj’©—Z$b ]u¨¶Å?1[ Å`ºlˆÄ␡$Ç_{¼‘d¥g>PHØéN3¼¥NÄ.Ä-YދÝQؕڊ¨^ÐNi“hsr¬ä´¾¤3ՊrB ʧ±EˆÊÞø­Y +¹½]͆±=ÍÓ¬«¨r°CHe`^v§›å`Eά 1¥Ñn +²tÐ4IÐÔ^ã÷¾¡¦pðl²ëžÿëÎöιÂl +iÏMÓ¾¡Ò|ûÉN‹­‰úDí",uù= ý +Á+«²ä£Šžpi&zÁÅNùú:¯PpDèiìªåzóçž.ÝYò9puµ‚¥S[N3“•ó†p<îòŒ ±ç‰Çz5q–)<Öò·±«LóÝ}[`6Ã$QÜ¦.ðXì ÃØÊweÀÎ Ùϐ¯ ¬Ùۈ„šB¶édÄV7\iR¿or1ªSž]懕PÈ=ÙÂÕ½„É +q‘I¾Ö¸Ê÷G)ö —t“-^w¸©?Ÿ8Û•ØùSé{á~h*cìf  í<™'{÷oïÅn9Ô3ƪl—ù(äæÄG!ƖþJàbCxj£1@ƒèE|y¯Œ?ž’¥Eañœ—¦\yš|ÅUùrU†x󧐻r?ñ€@§Ùòçä“Ÿ\?•ëѵ³L}Ÿ;Á³߉gr´hÒßÿ°:Œß{ÊÓX?›+^D]þÒ]àË_(»‰2µñå{7gÓìpHÎ᧙¿:nNyÔ8&“Ììü+3û¼•Wî ãß›×€·½™FšD¶÷Q(®†î¥ÿò6N.ß/gÉd˜G‹Ìð÷Ï3¸rX¹a{€rI7•|Šb£Ì¬&Á$㷗ž`€*-’í%?†—æE¡|;{ªÒqxˆWåú-q–O–éO®7zËDgn~u†”OøÎà´¼%ž÷+Hª|iîM퍚þqv[ “9áô¿2M>øDPP€œ^ÇÐþ<‘>垪 ¾}9Pýâ¡E^"׀ƒŸ1>_ D*W“KÐÓe.;ú¾ûD³)õÀk•â"Ъt#uáCîî¹|€­¨ú.î,UúˆÜ@Æ\ů‰ïa±[ùöWÆáÆO•$Ýç¥Äàñ>ݾx~,¶Ê¥veܙý~>2€¦{éöy‚¾&F¯Õ>îï•bÏÅQù~ê—g߉pv¼¼˜å±4Ì%“#ZF˜êü,ÅVÓ× *ÞQƒ§ŽHk~ @àÖ¡{ÿUüᇔO¤ÈB¶Ë»7Üf{pâ*(!NÆ3ãAuÀ +j•a’wõut1‰|å®*ñ^ˆ">È}åˆ +à_À_¢ÓŸÚùRW9¹âdðìs5e7ˆNp4JRÝ4kÅþ Žø&ç_g¿ϸ*b¹îkÄ{þ™ã{¢¦Hb󐦏kí-Oóª¿"d~ëà…F¦SAF-€ÕµtÁy˓i•Mf‡ÅäkäI;íú¢§~Z«ƒ´Þ´¤çT£ л·#?6ùt¥Ô|™ëõ5U´«½$Ç`ñÀ«uj±Ûmöáڄ·½È•økğ¯}Á#ß䡁q ÇDµO–ÁVɞ^ïÖJøkí+}s£ei±êÑÅîôùÀhø%ëj€¾‹®`ò­ø0žºÁk®RÂߜ +¢Ó[»ë Ð_zʋÄjï¹.Jt€¡ñэ…Éå3”÷_•AlúT|¼²êv®âC÷m‘ú^sHºÉz¢‘Ð7X®4÷¬gD®†{¢þõÁG*Ét‹BtãØ`Sõ\þ<ɚGó2´‡KN@©ÎVƒÔ—?{͎üžÅKøfñVì|ݔ…§éâW!W/‡@“¯MW Ýô‹M7&?E¡Lß, Ì0ãâ§L¹P­ÜU«¼J&äv3¼Âž5~JX±›—Ë4ÿ‰à½zŸHñü@4è%ôõ ÷ áÃóœW¼Äÿ‰“ñOˆF†‹Ðð¯ÁÞt[ø…—QÍwEl^úñv¥‚–»Wõä-¯|êù„ø—Uq˜°; +P£F®ØŠ9U¶ú&÷œ&üÓ[ê゙ߊžJDC¸ìˆ^®Hý®•ãß¼™¿•€po¢%ŒZ& Âó꾃h@dI9f|]U¶—gD"O>‰#Ôs®à‘hž ;Íê֔¾:›"ã©»(°€Ý¾ ÝQÒ|‹à|ïƒ4ßÆm¹ šiÎåÑÄúS¤µ)íòàé ±ö"x' ‰8k"Ôԉ7q¥yÑ­T‘å¾!n‘  ”VS3’n!GݺTý‰ˆ;ËSX$+BÝ5*KõºUp‰ôìbsÄtäuË£Ñkª$­Š®zßit¶IU¾Ä)(¤€Äž¶—‘†µM 5ÑhÀâ•Z¯—VÌ+£‘‰ä,vEQ @ƒ(-r+˜Ðwµ­é+v{QpS]à_Œ#J½”.®€Vž4‰¯Û— áô…¦5ȤD³"xÐ;©2/<=NʳÏ~¡:œÿ¸x©°]â\Û؍RÚ8þ'7ÊW™½W¼­Ù¾ö¾ËÊTåçag…žÛ“.O7¯•F㧤R©OV•V¡óÉ €3¶Ä·Ðø‘Ë’¹Ãý\ð‹ åüÓð©÷ 8À½uuè†K‰@$¨pYñÒ`R¡|պ”ëÞlÒ2aÁê{OµÃUZ,À/†ŽuzAÐc=Às ¼¤Ã·ïEر p⯲G=‚¢Ý="d@íêíìA«ŽwØUž÷ç\öŒR‹Sæáñb.˜cÏ7%d9«I%€R{3¼9x|‡FãÍ Nû râE7®þF)ἃÒ}áÍWº¿øà ŽÝÔ𤩔.âþ|¢ª\'I åúWuÈнE³[l=6ۃeªíŒ‘/Ó4ŸHø¤uP+-“7Ï!·Š®R­Jm~AuvŸƒa•!øàjëÓA:íÏÆîÔp›¾Q΍°;‹‚¼;ùhðáÃU+Rxt¦7¹ë£½æ1‹ Cäu~Vž¾;3 Óý¾È!0àP£4¿õï§=Ž‰£Í@ä³4\:ågÛc™ÑrÁ©ºQy艑«¾‡¤å–$>?|gDuµùŠ\¤—)ž¹çá7€&•6oJ÷íB;â}YÞ ]ݼ\ïï:=èê‹ž¾£GÐ.,9ß ÚXsZÔØŘ£hô°ŽZdK¢À0ÓG„ÌÜ>]! Yì*ûË26N—¯À[ëR½۔0<ðÈ:UóðöYLgAéA7öšÁÓj ÀœÞÔ Ÿ7h€èzŽU`´êê ú^ç7ZÈ >W…§{¿+3õwf@!¦¿»+dõV¥¬Ü0¾/ ÓRtÚYÍóM¥•¬‚V·³Œ#‰¢KP‰ªe •ôöJŽÊñOy%ë-cEOà2^(=.ÏØY¢2¾[¬úSFðT!UQÜ{'Pæâ2Žâµrcšdð”óŽð¾´¹bãIú²q7ªŒ–é€È…žÓÊØ}…UÊõ3ž¤Aڙñ^g=]Æ3ԗ‹HUo‡K‹ÐàvV²-’¹{L}TûŸo|0eâ,ü”>=’ +›JÜdpâü#} uФ:¿ÎԖ ’ßo(t ¨ðæpÕíº#+s€FnšÌE«Tõ³5è‹% eÏØ[ú±÷b̓¾Òð)ÅÛþèY!wõèª\/go¥xï9T¼÷µ'Ň®Ÿ¨]Ô>’¥9>bõ—'oÀð +æ2\¹~kú ò€ZYëèu?Õuwˆþ™ë¥2$+-RçÊÇë‘MÁ¶˜\Ìẙ±éÓìø¼3UšMÖP«lÕïKŒ•úÎ׺_ú,ôÎ9NBÝÓ½Á©ÚÅýÙúí]n"*iU«ž/y7̶4€²Ô§wŽây™»IvV Я8“q¼Ø‰µ%çsÃvß¼°Q3orœ±@·ÜNy›ä*ñ\+ߕ{W’Á'ð¿§Â8߀Iýófºð£0¶ÀB€ÂOk´)£1n…y…ÚH$.‰Ÿz®²hÆeY˜ËÏ3geÜù¢Ë³Óó8àïX«¸Ê_Ó:Sæ¯E×éÛq‡ë¦•©6 +ÙÒZi– }Ëy +L0½ºPL~Œî*ãôW¸úJq. IÓߌ» lÏ—"=mù4üm1,Œ¾y—»ºuu­`£üe"ªÇ%éy±Ú-&ÓȞìWÆ÷lƒBgëH­•‹¢\˜<ÔÏ/ñëb:4e€—ÚSÍp ÇÊÛrO ”\mq»ô瓵záç5û"M’Уe•…[÷€G¾]…Þ¸»QÏ'n6•ÐÃ(XÈÜ}Ï–;øÕMœ«²°%$­ÛŸb¤YZe¨ÚXè܋ð”úüÉ-ôEê­M¥þɲ•À€¨æ¼ç€#_~JËV>¾Í4÷§@£Í_Kó,î/v ¸né›.üAl¼T,Åköã«vA8æ쓫Œi&¤Ã·i G'^¸éôL”ÇWÑíeô‘„1ሚ^Äùó÷ ‹ÄçÓJ-A»#à#ÂÃÞ++ÁÍžëÑt@ß¡´x®P¹OèHlüZõy¼©8“}–Rí­¼ÞøÕ¼Ë¯Ï”‹R´ŽÀ§QXc¯‰üc¬ZŒ÷PdàZ4¨ êç'éBNÓSR§DsUÆWu0äÕ¡—»˜ìÜ`^ÚEº8Þÿ }#…@؆áF6ÉÜú£oÅn×å´µd͸ Q-i?ãÀrX䊸¬õ…U‡/L¼R¨¯ÄÆÚz ž¡j/…ÚÖD&‡ÿòæUöêÞЦW“ø(-’…säi­ ¸ã‘ôm èxÈÇ9F«2Vq[÷b¥Åbý¥õóÕzí{.gƒê˹•F¶2Á?(.H +ÁM$¬ø@7¹J õ3 ¨ùF깬oWuxšø€œÖY8¢šz¨kLò§þÐDîtv¼t¹€ƒÿP›H«àÈïjHiÿF24²OUËí4ü êé±]þ¬ÇÆ9@M„LQ?r ÂË3´d k¡uL XË?å»jú‹W0yö5-ËJ4¤KϽ÷º/0ªžer‚¹+¶"ú‹pÌÄ¢|žT‹©ËÁ ú á¹ öÊøã’ÍR׌úÁ«DÿY +æåՐڝ›bj°ž(”¿¯÷d4–o(F+ˆi_%¬xCŠÔ ÎIüàé°Ä;Q˜ˆ6ݑ5'sŒˆ½„[ÀFO`¤än‹@ÌÍÄ·Ò0hu¸9íSÁÐ)dh`*&4Lôӊ*Åæ£Q¢÷øÑK%¯Êõòômt +½°ÓBî>úYi4r§Ò~¶öµ,Aºª…ìÇ#0G“÷~h D?C ô_ç@ ×ŇEüI%’Éçë}>­4n¢ÅÎYi­']Åä‚ök²Û߬@»òeeOœæ›÷”ù_¸I¾"G ¦”d•$¦D %È4Vð9Ú.ÿe!yZAI 'ådgDçjëóÏ ì‚4™ÑhØÍDH_»´âÝÚóëó +Ì W’ã|“»ÏÁ†øúØLafˆ9OÁU ۚsŒ#ь>ø¦þÑY`5˜°’¨SüŒ,‘VT䃨àö€]û¹4|¹"î~£~úTì>&»ˆ| ÓóÂw ~ù¤ +sBJ=µÆØ"–»[+©ˆ^%w®[ñÍÂÃ\à¥Q*¦×pF\3M¨45Ô'H0ýªÀÆ* ‹­FîçN^ 1"ª>ݟ]A½eÉ'ú»®~Ó,MϪŸÏ(üÄOðE§ýWâ±õö-›&ñnœðrYº:Lxã¥[¯w–\]ßû51lÞ#¸¶À-á\}þZ ¾¤&¥ØS4¨`Ùg`RìVX_â§A^]Ú¼¯®F(Añ]f™ùeåcör†ØMð=€ûtÐÒFô¾<-Œ‚•ëEùIc`‘û÷3ÂÓ(¥Ší×-_c (ÅÄ º©ñê [ËbR…úÚõŠt‹Á”×4 +¿ œ"Yö‹ñ´*ùõ(®®œmâËó‹â½rãcŠ +ÀûŸÙëVý!‘y~€ÑP„`;†äÆ 6ÆŸ`xçƒüRöC"söa+*žîû«·þ4X€þXK]¶:Ì×´G×ú<ýX};OOžб: è‡>‹Ý鐃]ü?ù©227r´Py «„H±¦$“qÖ4S䟊wÝWˆ`f&䀂g3Ð|Cí¡hJúG{uÈß©Û͂›­TqëL¦í:Å]š[a¾"} ¬ÂëcÁåWú)‰þ|ü+é¿ê ÂXØô_M¹(ü‰åî3QéÁ½ô =ÈF¯º\ ˜.µyýìᒄÎG^zñ_>$¦NO8ƒÅè@㠆Ý7NÏùëÀyAáE§ºt;WãP´™vúó5§+ÆFÏïþØUë+Õ¿n®`ïR¼]J1¥MÕÛ|ª4®ñie +³ñzú«[ƒ¢²úT¢ +av’Ë|´oӕ×ÊÕ4{…§B%ïÒÕ)\/*Õ·/?‰Ófw–½÷Ö‡‚'p|îu÷ǘ~×áh.œþè͈8ðüóEÜåúb÷Áñs#Œ/»™ôb•3*p]eޙT±ž ;`\½Tål´©V®|xöµq»È]„Ê`pZ1¸rÐ÷c#̈́Þl€°4e°¿çÛ­š,ÃdÙ.óþ¸Æ±ŽG9>UfS׋|Òs6rሮ-(ó±9€Om„™Ž°·âàRµXê'û þ¬-Àë/5Öwæãöý^k-ùÏ\†d¬ªÑ0ŸçwMC¬‰Y£v¡5çô0,~Áècmãp[(vÉøô†Ëº·A¬ñ©‡t¿Tõ±Æ^ž1óÝÊXùŒañ)1Jœñ~§‡#ºO¬‰³‹v§X4 +—'V;{}Ôîi-Xp_BϺSûþM&¬m·[Cáh–[ŒVÀ‘h—©§ö…ùˆÜÜA¬Þí© ½Å.oË~€5Fo1ÔgŽ0Ä +ÐÄ­SNF¬ÆJ2Ÿ®‹žVb˜X¹Q]¬lñ#*c…s£B\Ño/´>ÖÜ©‡u']ŒVfó…_x=WozX‘]–®æ †›8;ïô˜¬>ÖØËF|ÔtÇzJ°Ù‹y¸×AX!Ñ4 U lî ±º©I¡e0Vg˜a×ísˆÕ§Á +а©{Âw•,8oâäZ‹µ™,½X_‚ ÖD§9ïñX«ïsB5Ö×Ö|«ÆVÄišáÖØäüì>¡‹õÖÇÌ ±æýrQ+@¿y±N†bõ†Ëž6‚ïàt±vúWYC¬wïõ› +·S·†ûVÆzîç”>ÖæÙ¦3ŒRºX{MœÖà +%4DüX ×D~k`½u´`€õÊÛû|ú*êb}ºøV¤Ö¶‡Ûï¹'¬ï1ì£Õõêc½kM¾Ÿ+9Ÿ«¨¤±.toHäeÛïz6ÂJ`ýûŸœ>ÖVÁ˼YÈкí~XSuçÓÖ䱒§\M½x®˜ÍÓ[ bõËX!^BµÎ²ÞÏͲ°^2Z¬_¾‡së<íÓhv{GX#®ÆbØÉ ÊˆƒÛ²¢r¾Ÿ%€µÀnÉÅw:Íc½òT +;‹DËÍcýà27+BÃÙûèÏÖ/o Öð¶\|ăɦë`%6Z¬ÌìÊ+`Í܇Ôc­?–.\9ހª-¢WÍ¦j¸gol|ðֆX±-p—v>s÷×kdKV3ÅÁêÑÍÉOUJšaJ)÷ËcóýF÷õ éÌa×ï~Îà©;“lûLï)§p^”Î+°Á6SÖ«D’8ÇáSÿöÓéZÔmzOWL²õQó ­×€ãRxþ5©ÿôÚå,´žª÷O¹lãú挕Ÿj,›öÑôûãý׉þ]!¿q•¡axh#WZûµÖ óm@øu…] sã‘$Ô}Œ”˹í²ÒýV:A>”Pð)¿öŒºZð—ÂSªr! *oMÀ .JУ· +î+}°U”‡!‡¦òùê…â“eÉ×õîa?aVªØJ³Üiì&~q~AŽPù!BÇZÒ*þü ZWÐPAúÚc™ê_.h¯o|ÖÝbÍû·LèOR)NªqqyÂ77քG¿”®»Î¯ðFSô=õ)Œý"Ÿ+²¤7‡Ñ«^÷Ö|‘„Ü +|ûLšx)?¬ï9”¢ƒü4Ö:«Ýèe̵ž‚ç%mÁö†ôÂÆîŸgCþ’™KÁÐÆüEãä¹»nµ‚ÌHZ ~øX+¨6`5¤W΍%½4Rè%°ÒJ¡ê{y­Ä ŽmÇù¬âÕ¶&ÁˆêÓ°Öp ƚþò¬¾·8½IÝA¢>½)Cµ[ä«B?»¡^žJ9®»<½†ƒ‹žgMóÁ¡å©ßöàÞÏL‡híâגQO §QdÿÑ@?ÉãòºÐ¸ôyþ%°Vk íN~ӝ²í!UB*v—Ö£ŠÝ1ªr© ù–’ÓªÍûÏÁ´ÁÆÏ«a -t÷½Ä<‰¡ý&ÐÊ¡7#3@”FIkà Bk yÚ´1jíêâÐêþ’„ÔʀGÕÿK˜/\ooï*îSԄ·¡ÍfþD"Š~ë0yz‹2HxJû/yµ¦é[æÇ o‘ŸHé5}£?Ì@É£±Îä–‰¦™–yj­™ðú#cªôŒ¥z´¯AÚšj˚Ü2%3<ªÉ"VRûNò<µ±aT ùhZ»J3É û§9½àÆ}’v`xŸvK6óìõizf¢= òúµV&5ÙÖÓ·6ú·¹G šF+[ÏÞ¢u3O1’ö:jä&«PòÜì +ÍÊ-Qâ…4•yq(Ѭ ¾†©»‡M-Ýv'š Ø-Rz~ ª½Û:\2U–³l6Ë¢SÓ_.o!D¶®þb˜Ôå™0”i²õ½m@CR;ì‡,ÏI=ò±)5vp§c´!§qWöÝi£î˜K ÙN3'P­½´o0MžÕ“;N•Ê ÔôêëОXɳžVg}Ëêܕ,¨'z@&šžÿ8ˆzuuVé¹ÛÍy„[£J«s­ÊžÊ  ÷e®’§Âí†A +lY6×Юí Iô +tÔJ_Ìè²Û­­>ٍ¥Áõ}}°(·"¨Ý^5рæêB Û\7ÖQZ ;‚„.ª6†ñÑÌ)u `ÙìHílšA1ÞaG€öYŠÛPÞ$Ëæ0@VŠPð¤­u!‚¦ÞhÜA­"a£ ¨×:+­% +¿;d{B#l ´ã¨ÔYi×ÈþN¡!5»6¨©Œr¸œÏ¼–w£ö(çS'@W"­µ»¾s¬4øŒëÀ +æ¹mg‚-`£[ŒU®øåÀch¹+ÒÞ*Vù3vRm—6õtÿ1 UÛvþºùNaÛmœ¿nƒT2N¶Ë|¶SÙ|6ëý†}2Ü)4Ø}„º+ÖE|öG²\7v ¯­!ÒéӉíBL‹°™IŸ€ØQÛлÔïí$vÐh^Ì¡ ªy~‰°e3Å䳺çŸìIËí_‚§‡NmצóX–Ýí”_bØ=Ò¬?_bXËʍ²,»³—_ÂÇ:Mhc²E¼ƒ—"0ôÚf¡˜>4u‚plk~µYAðYª¦Af›ò‹<}6Nš}O›Î1!×½ÚÜÊöKh’0¬¨Ü9ÐF çÑ$@\°hSÇýÛ•Q U(¨SFö/î1>x@Ug¯í3·1vª)4;]a9;ªÉkΰþp°ã2®‘ËsW7}RšÙv2ïA·Œ3ï¥é3Cyÿfž>·RöçPõÔ«È·»PkÖ59 +Pb¸Û šÅA v:&lEÔÌ«tvæV&ÿAD³¨ØّhÆ;)ûmëÀ†] ©ãÅIF“Du"”`ÿ˜Ô ˧ä|iÙ°*¢4Àï­Mê–þ`çYÈjîJw‘ëäÜZûƒ[aÐè$‹HéåÔµŒíNôC–.®<Ýd±.Ù۞%mñ¤®ÝX1vԌËþlHkŠïT’Cî6+ØÓÓwFöL]³ÜOtϳ9³kaF>ØAHma^ëUê*‚):¦qmÖj—}é¨c‹Z=kd\–µ•œ´·údQe«ŠrX‘ŠóØ]·Ú'5§n¹C*M É4óHÉþ5zrŸ„¹1+¬Û)zcÐ'TJÂN£G"•QôæD*ö³O*‹ò<½>œ2r…ß°šèMô<½6ϕ7ŽÞh8 oà¸Ñ‹Þl ›^Åòf§è L1*Âîã7Æ)#öëálDoN¬Î‚õp¶ó‘ ‡t¢S$»Gô–™EoN¤“ú,ic•àoV¤²l $ª¨ éÂF6¤O”•^Vi:v éuã(’W¸y +‚®ç ŸÑÕØ3¤78”¥kžAlgp—^\*ºŒuÝ8üØ38ëpCÒôä3›%~yY’ÉaUâwXÂ<¯Ö`‰ŸqœÎ²˜UM ½°©CÛK¨Ïܚ YðG7ßK™ ioÇt¯Ê¼mo ç»2Ï:íú(•y¶8íðÊïØô87^¦™´áýšüÎÒÌV¹ÝJw»êð"Ù÷ŸcÉhG,’}ÿ9N‘,~?4ڄªÄ(F —–€v¢úQÈ⸛ÝÁŽR$k}еdC[‘ƒŠÉQ°–ùK‚©®ZO`k=f<“a;µW¨Ë3X‡åm©5;¹BêaÚ)Ê;±uÚõÁEyšå™ñØYž»åæ{Ú.Ê}O!v¬¢BÙbgâdëøõ„†meðš$CÀŠÃ>¦¦˜¨ [º–ø±¯ol¦» +á¢{þ*=]®V](Ÿ¿“•W¢×h +a®Ô¬2Ÿ—ýËneŽ—KᛧÊuÓ©\ù;ÝKú˟ŸjmÐÎ]&žß‰Qĝ?­ðÊ E‰qèÞvZêîJ:£K茺ìî¬÷ÒVF»T¥hùLùíŨìîÙ¬ØÞXˆbE—‘`MœÁ›È?Œ®Ð³*ö[G±Â›È ±Â›È'rE؉öžB¯IÙ];Q`Uס¡Û¹%¬Ú+ôxƒè ÎkRìwJ!C¬ÑÈÉóºUì—8»ˆÝU¾ŒÊîúfewç C¬PtÖîÏ^ †›ª_´f·¤Ö +ß5z2֓­b?¬Z}$ÔS{Ψ ~Š7¾Ë°­vÑ2¦)%1hŠ}ù2Eíüš«ÊÊŒú%&…í¶±['*S6Kõ·ÊïÝ6niã^õ.SÅêžK.*iüÒÆYÔöî@Û>1Ý<£Ë¸¸¨l‘¹ªÙ?3Œî½ÞvŸšM‚ÿ1®×ӛ¾Âv[§¶íPœ© ·]4fq^º:wÐän7e¶¶~îà¾7ëŽPar˜Ý…guъÕ…à}ÅF®¶ÍòSÚÎ+v o•£mÝÐV×è%@Üʧr +SاWÕ·OÌÆ¢°OÏK0Ûí]اWÕgfCïYاç´ðâ£ödB»°O}N§ó©°Ï<Ü}´Â>½ª>„>FaŸžï¿Ÿ’6-ìÓÛçáÍÁ£ömÏ+‰n•?raŸÉ.î1 û,*VŽUØ·Ã]‡ö© ÉWõo¯î]ا§œÄ8ô ûôú¤Í³9BaŸ^UŸ¸<÷´\õ +ûôæð„?Ì䘅}z ”›ÅG*ìÓ«ê3¨X9¤°ï ¢Ù/ì³C´#öéUõíC4‹Â>½ª¾m;íàÂ>=›ôD¯êû°Â>½ª>’>FaŸÞf‹ä{¯°o ÀË©ËÊÅÝ£°Oo®Í7Vö*ìÓ«ê³Ò7{ö™øžÇ,ìӐÃNAÙ>…}zC:ќœdd¯Ânà#J2íÊSa´—° »Ã°PM¤óTZ7jïê+s¹±mr|‹Ÿ“ã·øI¤rÙ09ì‘Êò`Nâò4!•¥µaƒ„öT8Ë;{mNŸP0Nð7¹r϶6’ú¤Ÿ2rmÃ*°Û'ä…î"lLHEY,c¥°y0r™tN—]Þ¨5„Nb“²‹|øÁêþ¿ý‹ç„ËÿÌòlìÚë6.ÿ;Ù¾cÅ` +ºüOŠr˜Þÿg¿Ó çb·|è½/ÿÓìßÜÿ·[©”Îåû!÷¸üÏ8©¼ÿoz)u  ±qÿߞ$Ñ«GÿÙágt­Ç«ñ¸ÊÜÛ*È5-n÷ÖÀø2ž«nÖ ÃüuÂ¥eMŸqŸýìîÆÁ×}ۙÆz 0–õŽ& C¶Ëã m)ÈUW< +ƵC$©iKšÚË풦öRÖ|ÂÜX(?#ÍëæBvfÓ*%¾sÔT«ÎñR­:vS­,2©ÛK[YV6 +1½ï¤ (²)kÈ6Ùԁf..h票åDQì·G¥½šá!‰Ñi³ÚWçøeðÝ¥±â>ÙíxC­l^;£k÷$‘h[Ùè +efHÍo +–+˜œ:©ëlš•P+ΫMÙßù-÷=í a –™]o»0¦GÛ5/ŒÒy4Ўu¹c–K(‘ìÜÖuK6 +1³¾C½%`É6Yì6ŸØ*.—O`Þ³;‚ƒ©‹:v¼ŒH³P4%nC›Ì·UBáþ±.Œ±¹w»÷Ï03E¼úï%M¨ +ïhëÑäÞ¿LõCîý;Ñbn]ý·Ç2ÒIÚØÇÅÝãÞ?µ&_ýw踶j£v»¬o·{ÿDac³vc¯{ÿlßs_¢¡$ÓvÎ14~¨¾¶>÷D{Š¢ýj_òtpf×Q5¦š¡Ú÷ý•úªw£ödü²‘ÑPí+Ë4èðj_Åôl»ÝªïŸÌ«ïõ +©`€Øl=uÖãóîa0ƒ<8zã“pv-¤ê3h4;ÔRYUËx÷'Šsm¦îh;{÷&ËóÙV|ÛN!"ÚNµT¦%™!C?_Ï÷4ª¥r_öŒÅ´¹Å¨~€Ý²Éö,Ær(ˆ´§Æh,‡,¯J·e1¾È£drRw[zžêÈ" …3ïM*Ó,ü&ý¹)‡l²Û8U €JØ«ú¶Sw«=êÙp7ÊÖ‚û]†©É¹Ewë2ÌMr։i9¶™í&/c,LôƒzÅr7 +Î Ã\á|Á`÷*ùRy%^º•×*S(Öݛr)4,—KáÌí¬EEt±P÷NˆE©Ë·Î׋7U »ºFî͸2/uŸi+JU™çÏ[ºõ€ 5ÝEÎI•j U5r£°!VŒè–îÕþ¦FNY­¦Åúevù_0­À*•ªA¢ñWÓeü¬4\m\ìyÚÌ\Mwê1¬‘c6_xHÌOÓ+Îóç²KãkøL®Œ½¼éa=A§Z!"/Ë1‚îv ±ºšÔtd„•BX•;ê’Àûgc¬Õ»·š!…U÷: +XÑòßoM-X£~ôI`÷ŒÍvY¹ l šÆޛ¶@Ƽm¾ 8› ý”q›…V™šÅ— zêO/;SvØ¿üۇäµ]ô.R¦×ºY¥Øhƒ)ÆeQ?†}RzÒvºµ[Š´Wv¢½˜¦rH▦OrÐINƒÛ3îÔv;mLŸrcŘTv· ·Oäò¸·LÊãô2AO~Û>²ÕWÑ;候d Uìæ†ÚèӖ·v@å¥I˜l§Ù¬K4>¢g×uc’V໳í©ð­‘['ÂEhÇð4>«†Û ;Dn9ùn‹hÕ£m‚V±M÷~„xÚgõ‡ÞYGËXiªï7$[iˆÆª$ñàÓu?ѵn6ëÖ,½XÝhf7ž¦IEDhíäiÓxÔ; ›Ads4OZ/Œ¼_ ™Å©~:ÏnuÁCԌêBÁ>xoæSG`øó+T 5ë“!ÜBݝ:;uië$ EûyŠ;ÎQ zç§ReeÔñ1\¹þƸ[”áQ 6LuÍ}kñ¿K]¢fÕ»’úç Ø®K´,¦PÍ!¿G`H¯^ð8Á3tϲðÈ6õt÷éżΝ¡Yޔ¼Ñ,/9ډh–µIö‡©{ÍÑÞD‹vl«ŠY³Y¼GI¢]³Q[³cIâöòÔ¯GÔ.ÏK·;¡_(ïF)hc¿$Ñn=¢RìQ’h·Ñ`oÍnI¢ÝzDC‡Ý^I¢ Uc’ý`»$Ñn=¢ ޝ";]4¸µ½º[I¢ÝzÄ­tµÅÂ÷hk\£Êú²Â“C.©³Yá‰éÕaG»¬p+çö×\V(eÛٕû]V¨#Ó~Åe…Šê¯¼¬P97¿ð²BQIÿâË +5™÷¿ê²BãðìV3öndW?Ú9ÕJºíP•wȅ‡JVݾípŸl;Ý ÍCÕÆDÛñÂC‘…7ÜGHí½9Ê©V6/<´<Õê8éT+« m×{vá¡jYlÝvhÀл_x(ׁéÑ_ãxìááeû\x¨ÃŠÛu`ö¹ðÐ|p'–÷{Ú¼ðмðä—Ÿ @ÓÛåàýÚJ†=üÂüém‡r¶Ýš/c•uȅ‡æšOÏ÷ÜëÂíÒÕm‡êœÛò…‡Ö{6R³¬/<´—v}ð…‡yÓÛOv¿§pŸª`m0eï Ío;ÜÊèÚ÷ÂCótµ‹ûl_xh¾#ç@x᡹/Ç+‚#\x(wÌî…N{]xh¾Ï#Jƒ/<4Oñæ÷¤pá¡ùm‡'¿Ǽ(›ßv¨´:ºðpG)°ï…‡*vÛºíðä·½ï)Ü弑Ó{ +,¹ðK·^J"\xhä +ß+7<üÂCóZh‡_xh~òˆÚñ8àÂCUá×VÎlj¶hiß mÊ´C/<4Ձ=äßãÂCsƒÿd‡{ +÷;ÿG›D~؅‡J(Û·®ZÛõÂCÓ+ +‘Õo,lv¼ðÐ<Íe¦ãÂC#&ão;<\¦ š?R’…Uu°Õ…‡æƏ&ûaÿ Õ׉ìÔ½ðЊþnÔA±{«¼Í ËèÒ¹ðpŸR})u腇[…WªÛe4^x(­GÝÛ2í° ͓¨ä<›/<4÷î•D;èÂCuÇl.ÏÝ/<<Ì÷´}á¡ùm‡hÝ«ðÊø¶Ã£õ÷ºðP¬ïÒ·OÕ«]xh^¤k¬¤w¼ðмŒ -ÏcœÂ•7½íP„ÜÿÂÃ}-›/<4¿Y—G¸ðÐv^çašë +)¤ªUÍXhËvkÆL:Í« ƒcY•–;zžž‡5aÓ½P‹|ù;$ӈ¾6¦y¹TÀ³T¦,#1-݅‚êÄ:¬”:Ð¥qXaešÓóæÝ8ƒa÷m(ÚLŸ‹Mš,ÃDØ¢Ó7aîÃÁ‹Œ+út/Æ~vz¦7¤»N¥Ò¾«·ó×Sç5çu‰‡ðéËg"Мwztñb¾ê4ÝÔtLtš?ýä|Ԝæ_wÓÕI§ïÞë?½¾nŒ;ÓûÙâ±¾Ýôú5¯§ß/û½ß/ñïÖ²íώ×þ×Ç\tžÿ0…UâÎùt×ð£áêŽuó:÷¹.žÛç©ì¢tÑîÔnÜ_ëËXÚu›ðKW:‚©z¯“M×÷ *óñì)qt2³0¬(}ª¦Å¨°²r}],”ì†l !J[’§º~WIŒ«¤;ã¢#±êSé§Ws¾J±ž¶üéø>U«…ñ#VBµÀÅáýWSlWj¢±FJ/þ*¿¾Ñ¹tùړnÏ üJàbCxê××xõ3“+ÏÈ0'hUÎÒXøyŒôë£&‚PïŸÃ$‹ |¨ÐKz½z< ¡ÍQΟ¹‘«„…ã1/ú“'Zßdüè°°~ÀŸ… ÿçKЧèy.÷Eô½o lüY˜²M'zÞð(úÀV_ÒŸüE ÊéY@ùÒ#>’„”&—cé¦x<¿žŠî¼h¬x­yJ4Ò×~EûÚgh(=*¬3ü.,hˆø‹¦–x=ÑLÀý€†Î n|Å%Ýd‹§§¾˜Ñ¾&m|€†T M#º)$œã&­0 +æçüùˆ£7€t]ràÏ·hø¶3‚w»~þ,wŸÝZ"ÑùÒ Jˆ¿D4_)>ñ¬„Éœ+3Y¹‰\5ö-‹sÁ€ª=ß+¼¨åÅ¥ÝLƒ.®Ê¼Gp,â’Að¼7©ûtªFÜŒªW®G—N$]À¸žq¢¹MÁGä‰xý3¿_Ș4t áÒ´o]“€—aä‚OÏðQ|мö‚?ÞpÞT>#ùôuÌ׀ŒŠŸF1C˜ßùDjüùޝ¿aâ§O\ê΀Ïèjæ…ÍGQùYäÓí£…ùºý¹F3_&Üˆ–RÑT–úôŽËÓÑ*-Rg)…Ö’ª‡Å“úø¡¡_¼ó"OÀ=‡$¬CÄ2à»O ¯áøDââ§QDn'¬oî;&w zçz„Ï›Ï&{ÁÓ[âëö"aÔÕg“ØMÍóõ‘ðW{Ïõbã;Sè}µÑ¨Ù.Kš:£ÉLÑÑÔ¾bã L¿ŸÞgÕ¸}®;ƒ©@ßé^wið)Øp‹QÊé_ĚP£÷œÀPn:}?g …I|@ðË3ìBrT\Ø·+a[”—•îˎ±¢9p¡b‚è|ª’¼°£È>ôHê$ çOõªógt¦è®H%øæRó2 ru=ˆ¬#ð]9½ªg>*~‰§µÆ‰°¾¿Æĕæu©r °p>æ’äX‚OFà¾| ÄÔÄè u4ýð¬£FŽ@’†+79 ™i> Ý·(-NW° +O+Vá,¡Ù‡²5$Œ°VðC¾¹E÷o ª£Faº-&°V­ÆâƒÆ• N!~ Nyȼ°¹ã' +|^m†<Ïçãï¬lܪ¡J«7êòáþMx'*Ø ËÅÀ=d –I`Ôü:ƒ“º:ü­,ü‹^lØJÔõõ•¯'*È[ºœ¹ZxÖ&0>¡×&ŽíÒ4ö³<ЬF¼W…$ÖȐ—‘¯»¯Žÿ*âÅpÿ¼P½sG5 PZÂK2-~u› © ,Åx¦ùʎr5(¤ðz!݄Qlì!.#Þ·`m $ ‹‚&:¯A™¶ß›Òk1Ð1~‚²§YŒT +ΈL"Éñ€æ›lîÃۙ;ÂòPÇPóg÷0„"Þ:}ºÌ#®Ö$ZÆ05-?Euü›|¼Ï°Œp=|¹Â"À&{¹+ÖX˜hwDåÊ¿)肝èl·¯»Ò×íS9]M Uæ3ó™}m®òµEï^^¬Çß°B˜]OýðŒ• ÖL󡐩R³ÒÜ㹯ÖÛ3P?Åp±r½œ±De—o)V™•ùÀA¿é:§þüÆåÜ5Ô7óÊ{¥V»œ»•èÞ˜  A†å’lÈ£hˆxjIø)éËv n•arÆVý³×i±Û{bvFF;~­ Bnc7@ý©„B¹'¢Ï}à…ìÍüÞÕžðWÙ¼kï9ߛÓ|vk󩿑+âæςÎ}¹]A=ä…8æ=Oa[Y•ZíÂQ‰Ç¿ŠÝì·™ƒo‰€ÝsZÈ]!iQþ ‰Ž–gþ±ï«Ún=‚#)°/Í9w(V/.œëÄ̇ŽÐì0ú]†®`7E¹Â¯d7PŒþ=­2óz?òÖ÷®2õ«lÈé’©P،»ël•ù´â‹Áç9xÖn w^úº‹tˆôYÔàe˜€3àürÃ`BOဢT/ª}é‡^Ê¿ö«ïďtÈ«µ +åáb +=÷3Üô*Ðuæ…èêgÅÖ$×´‰WÆ÷ì +³ÎwE˜‡Ë×3d3D‹Œ³¢µj!?Ç^%¿ªóÂê'üºððb×ÆO/è€9VäIëù¾2v­Ï €üÃþXWŒÚ¬PäCïoRÚ@ ÷=ðvu@cfR–Ü;Í´!Á¡Z;Àšü¥ÔîjUâ´#YQ…(l~¥! P4»ËÛ#:ìÎ¥tÞP”tžçݨݨ¯ÅocÔÒfñZÆéû\¬¥åæÙ¢z,ð€Ð?a­O§ÜæNïÝk*“üU‚ZãŽÿÓç>ËA‚âÐM¨SðAªŸü“pzswp³Ʋ±_¡o¢:ìûˆ_+ŸV#{¥öį ÔBÌÆTò÷¨B¯qy –b×YýJ´¦¶Uíÿ€¾ÑÓv»¢¶0 ¦HcFY¿$pc¥o€”ïW¶£';]Íi‘aßWȾOû•ÐÃS_®DZ¬ø½µUî“sû+xNL»>d‰Ûà9È»¬³=Œ ¨=ËAœ¶‹`Ùi‘Ù‘i¶gÚx‘Ài»,2€Æb¡xMƒIÑÕ$™ùhߦ‹õD•Ÿ+•¾îÎîПéjjÓGkñ Þ©>•:ÍB˜»jëñÇPå•èuÀŸ‘qѕLål”À ï5„#¦]1¢ñ«ölX[¦{û¹³{Òû[ØbT}[s'GÈî>fÐVÿá‘[[Œ¯OÓ1·tr §ÙÛ«9µO;ª§ñK#·fþ&ž6OûöŠ§¹gð&ý,¤â£I#ƒü›#ø2E¢?_øˆâ‚üÖ[éhÇCµØÑ'”ëÉl¾šI!Jtèvew·§ÁŠ¯wPûÙ]qW¾÷b÷ñûÓÖJCŸˆ¾|ʼ¾çЮ pxüqgÛäø%³o¹MtœÙ×±:Å싩½¿xö¥xÚ¯}4á(©ï—Î>šz€æϾ” ùkgߦ¾9töÑԟˆl†ÿêìH…âk>möCìG®5AS°Uà)f$@š{•-HéW?ã’Ѭ¾¨ÉòÙlP¡^]ÃTCÑUô“󰌶 ¯†<3ÑK¢}Ê¡‹W‡å‚·²ùñ¤_¢2 ЕM΋ҹäi ] S ++àÄs —«ä$òËâ›ð,ÿ« ÚtxÈä3ˆßõ~Äï^˜ð¬µòËùþÑ«Þ]Cµ´3xßåÊÈiðÆ+‘=¼ðš°ô™Pu²x¼SÎ4Jqæk<.#~©”ÃWxò‘âÒÆC¨Ÿ|Q‰çêm¡r£øYEóM¶æÂEM‘ ./OtËL÷=…ÝyQßô䕉öì¤ÃUþN/¦ôò&*i„Ø38xÇÉÓXM¾ïK¤¾–è𩨰ÉE&÷^•DÐ\º6O­E™€¢ +:\äœ_"ba™°;sÅ·¥ç— ®2óbž¾ 5‚¬ÂÝfhZx9cJ„KN\§à{òtpÆØ7—f¸Ê´9¿KކD„úGèôûQ$B(( ‘ù—wÙw‹„Ìà ¥„±à›òhˆ,`;÷îÞ u’yû^+C€ÎwØî@c{ |Yú^Ԕ¢ðNÑŠ :q"TzY ä1މµ4àºþÿí=i[9ÒßyþC'Ãach·Ô­>HHÀ6ׄ„c8Ç`‡Îؙù²¿ý­R©[êÃÆ6Ìî>ïîd7±Ë-©T*Õ¥Rõ¢óœ>Øìô÷RÿMŽŠ ï>Ç[Uåç +6=̺ñzæI.é7¯Õ½RÅ഑h³úÅ.æ’4«¦8-Ë­«çÞܳöíêݼpڈY›X¬ºçL“ÃœÈÚÜÊóК¿ÁzqÚ {íý6‰î»*K:ÀsOïÁÞ{kôqúeòiÖê‡Äéy¥’AB­79$îØ ¬•A"¥¤ÙÙD0÷,þ>›[°‹¨ à ,ÄÎüúH(Î~L^#›K_ß^ ç^y÷•æAã±µºQÿükô‹r±Åb|¯ý¥/û™ÉÂÒ*J•Oò`%}º aüg%qJqï#қxùnRy·ò0u¡´äbaL)ºXhúcèº\¢üûÏt˜ ÂKçÛ3NõpË6<㽅ùúÒÞԛ›Å7Îï´ovî$•ÄÕi{J¾è¹y•./Ž"6u?qš!ÞkBß7¾ögþ¥ë1¼»L]§Üߗ– VuÊ\hÒu9â«pkӆsŒ«O× üá‚+™u„¬µzºóí£÷‡êþ^ë羟ZŸ~ƒvɜœ¼g—º£f\P‹×FŒg ЖXår½îN-oF ØîVyyÛÝ ¨ÁôÂÁ}vhþõv•îÂ&%w@Ál/òews«òüTwjóZªÄ×HÍUۃË9É1½d|¨ÁñíiP'_0ÐÅm7à^Õ®UÑu^'™‚E›`„à-›ýîFo¹(á­ä÷ìÌv‚x å}jYÑ¥;íN¶§å_g"Ì0±\ý4Åk÷«ª\Jf†k8t‡P¦®ÕèƒËÝäŒãc©%ݞ{+•tL›êoßxùzs š/ÙÕï·AÝ­MM‡zJx–p êcSU©“{,UdÞn|õ~«zqØ^æå«/oÎå +žI»KG[ø€­O,òfÛߔk.à +i60*¬H³íà=Dz‹÷žµ.Û^"üPýþÍ[à_»;«È ¹ñ¾9Q—/ʚŒ°nÁŒÓ9õ‡ã_+²PI1+•Ëü£ì™˜é2<ô»ʽ—ܧýb”hM\ŸÐ%ðé…CAWŽkMY/`N‰ !~MªÀ®N +žË Ç)Ç·øÚLrÛXÞ?žU_붼l'}T5Y€Âwµø’°WÒ÷~åíaF_ Ö¿™Å&Þ-ÎêÌ ï©[Ä°ƒ¾,Æ?l8Æõb_³:/‹N”ͻ˫‹M>sèÕ]øà Ðp¯K7‹é÷ê–Cå&æ'ñNú¦,7_*nÅ·˜?UhSÀÅÝýi.‘š œJk£°0jTtT?9•÷¥F—­mɯê¦òÙÑ1KnäWW*IÕZ^öç“"»¶¹G¯v&—g£ò©GR‚ÔÏv‘^ Ø­>»#ìÅ1÷~õ—û·•½7]ÿݞ‡ùKÁçv‰ÂØ壝Wqí…c]2૎òòcû2žæ¾QÄdÔòá>U፣uF<ß8ÛãTƒ¾\íqõéñø Iþår«©>ñs\Ë}A}4±Ë#[¾·”7¯6jÛ|ÜV-$7֏$ hŒ¾¾iÿH~ó’MqjÌæëþ«zr±]»²Ïg–>ž}Ûh|Xµ£*͂5‘d¥U5›)£¢r¢wA®wâQ?W©–Àßóè²òԛc¡>5ZÉs®zî÷ë% CmÕw?¯4®^Ÿ-mïžL/ŸÎ-î£z}‹— ãýðpçk ãn"uѧB²6Ï­‡Ð¿‚d藨‡Ð¿‚Üž/Q¡1i ¼D=„Ja1„¥¾ „àV("nU·¯:Ý­îÅùō5;>öf|¬º´ÎØÞMûv¥Ûéìvþ|hܞ=^wn¬y«º´S__E£svÛîX³*?0¢¾Ä%ÊHq{ВkoÑêåÚ/Û ­Æ7çð]6`ún÷'&>¯Éë5gö$¦Sª@ií~¿R`Xò¹«£Òښù¥ÑéÖ—+¿mìg¶ ´»£¯»«X¥`y¿ÖÙ^¬ÞŸ¿•)d£Æûïo޳Ю•¯§vêŸ×¯ËÇ_+-i åëonD½=†¤‰Ln(¨F2³»äãäê¯fˋ œÜã¹¹%w çj”Vëo+`¢ãsͅl…X9>Ç\ÀV@uò\sa[‡Ù\(MÀ×=.‹0™E…À5’uš”ýq}NŸ7bQCÚ27lªæDþÊÇmw:ƒ¿Úøõ€ú…}scÓ–'첪Nt¸.W†©³7jTð9Óégʕ4ÕU·«EýIu2j—{Ngüµþ=øp·´»t³O¥ŸjÇ3_¡ÉR8;HÜ®›0ÙWs‘O7f +OTÀètÛ¦âNË'2}j½þ +>i…¸vä®É'`¨·ëò“ªªuz.¨š™F—{6ô±Ê`åBùò›9è|©DŸZõ…¸ŠS‹UœjG{ïµízyîÅÊìHÆÄû½•µÊå³%«¸ñ¤N&¨u“)Ž«²œºe3ôiùä× +}208w%,.'g¢ã]¯]5¾MÞc ®Å·ï¼8„óY YRÉÅä”4þž®•w—x•aâänêˆË¸q©{ +oÂxI½¦jˆ­WpîUeõçÕp²_ïïщl6 íå…C˜Nhgbq¶s§žjýD}ØÖö°V Å^ó!1H¦ñM£?ñäCBke2f¾Mÿ¬(ÿþð֎Óhøôâ«Ïªò]ݞ•ïk—…5D5¤¼pÉó¢GàN-¼aI3 ²°³ÜÖ§@Eio?PaÊ«¨ïžz©¼ +±öËOÿñ·8¯âëd¶ƒÇӏ?uþÚSGü×\ +ÈÂáu’²—O94oL‰Û•lîú±î`'I¦Kh´ÜÄ+Íi^¾®h´—Øê—s£==͞Ãó¦:(iöìCŒ>{¤¤yÓYkìœÆÞäˆVÖ\è¬ìÖ|?g’â´Ô¼rœV@öϬìÃiƒrkYsÚPû6E´Aaω˜œ–¢f†ÓúMDsÚðHqZ¹§ LÍÁ”ô«éÆÉ'Õ¿ÿ’îc&#‡Fb&¥¤{£?HA©¤ûáa²ç(l1“RÒ£ ±™g(i钃×Z¥3ÀÔ ¾ã}­#¬zt„~öÚ«Ù­ò,¥€ßÚ6„=¢µáéV›Ñ©•f3á|¼½Ð;6{~þN–«ÈÖåk;.Æzýà8%»*¿Ê´õéGgFk–U$R»Úòë|i®BU“å× OõñmoþAJ‰u#Xh†IR~³< ÖsÿÙ𩍘ɻúœ“4ýçõªy"ðæ|)þaKWÇ@— +/­.ÌG˜ÆÐàI?C£O ›aDÌI…¼ëÏ÷?á‡m&oªèªófHµù÷U§Ù¨Âó_ÕyʤR…ç_¦Ë¢ªó0Œ.<ÿ÷U«³cáù¿¯ê¼É§_Õù$#$¢zéªóEáΣ{œ>üžVÂKExËãÉKãAt)Z\V⃕/÷$µ.^œJ¤Ö},glrÔvYEúElmâÇ»ä`%9?F¿;tº‚¯ÈÁÒÔ¶ŒôbZÛ¶¼pôñ²ñ6OJZyx'oXeÞ­A‘ÀúäBúÝ¢ +%EibI0õN»ºŸ|šâLµ«‹ÃR¦Å“ܬ˜‡Ÿ*?oŽ²$VïæQmêHdG…€$ӝkq¿æôO8ñ=7xŽÙ\¾i›g˜žÐNçáñN>"šµÎùÅÍFë¯Nw|ŒYôǁ?øwYŒ‡¾„nœŽ•äÓ+[x¦Y]ê>4.Î.noZÝ¿¬y ;ømco½aÍ[ôtž~c•'§ ÃOey|ÚDL›ãcŽµ„ü1>öÿYKw܂¿ìÈ áZð!~ÀWpîDø¹,ðá ¸ðÂ\ü¢-ì‡æƒü…ß~…O?ö‡Åë7ëø³cµÇáÇíñ1Á\;ay,°}—…Öµt#ÇöYÄ,/bvè‹ÀrýÐ8 ,Ï÷ìÐsC 9óÜÀ97€v½êž ›Å0ϳ}Ïõ­¤Ï÷m?ëᶋ±J€z:qWù BÃo½ÖÒ±ªë7´xÖÙíõÝíãMÛºÿÞºëX×·íNv%‘Î\ÑY£(˜ÍB—!)½Ðµ]\ÄèE¡í†ø˜ëÛÌç&„Ptin +èF‘ÍD‰»rCÏvB‡kC°¡çÛ.w\ã1lJÇ Œ®bHjĘ w¥‘ÏÍÖN‘K{77­ëNÛ:ï¶Ú˜DÀEY±!’iŽ©D` îyC~°9ã°ó¬Úùø؜c;øŸkùàɅ0šAòƒÇ#5•xr×qCöC…¾Í#·WK[sïp¶v¦åð„ÍÏdÐÚPƒ"I9PRxBù 9§VëŃ%f‹À "¿lUwº7çV©V[:±¶}ûÐÂgÇ­,9${)r˜Õx‘ãqa»²ÎÔñ}Éü̇M³N€t¹‡ôö€Ã=d{à7Ç÷Âmø$!ŽãÃOܱ=`«ŽCø¶ç¸®nÓú,ä) p|;ŒPŽ˜@¾—ú¾Çôоw5zaÜՓ\Vz-^ –dç÷Õæ.Äî_w‘–KӀyvä‚^R%R1nG1©\îD¶‹BÄvòD%ñ8ì~lb‘x<ˆÒO Dæy«G&j9¢9pO2‡ íöz ‘ÜZA¿íñ1ß*•­ƒ}µG¤*†]ma"& +,yØæú÷Š&øƒâ†NtÒV“nÀ"ZÌè¹8Jj®>€œŠ`–¦ó¤F%îC 5D ìIOÀÖ¤V@ÂÕÂíiJxŽ¢WxÆcŽ‡ÂÖЃç#É41$ÆÆ@èQ­9WRÜEÕë‡Æˆ JÄ`')Ù.!êxœ¢ëÄg‚6{L 79FH9E-µ¾'Ù,KÔ~ªý?†»rrx+Ç- û™H$#K" +€ùp_¢¨r9L ¾yRT‘dó)ø1)i—Ç@µõI¨aSϕ&A6—êÞ%#Á­ŒäHµž@ٚ‹PƒÍåXL:ÑÎV6ghŽ€¾Œààx93 q",l1ÐGi½*Qs}n̸i€u¼ c Æ{6 ÀpEh£E1€»°Ç>ƒ†H3Øðµ!år x(ø vÀ ª’dÑLU"—WZä +¨ÔiJm"œy$’GI„RÞs=+¯5êĝÌC¦4õ 2¨p<£mÂÄIÿ9Üê},J`)èd, –òrKxK‰4KA°È'éÕÔG–òA>â´úðTñ¨’§Â4O 2*S<åý«y +=Ð'£˜#Ë O!}N€ ,A+€˜ $š3°4LJ-Ç•à ’Q஡8Ša’#`æMÁéð{t÷9,úø#.px-‚ùq–…ápÌÃsTp0ÂôZà–ô‰w´W‹d!¡WC¬y0K'畠‹„}ÆDÎAs¶6ܘš„`¿DÿZ¾y¾iö¨”g#ѝ±“‰¤3~«˜á>\Çöt¦ÝŒ<Ifظü€±ˆÍh `ê;X<~d,"ek‡q3WBÀ bŽ +tDò'~ª›˜ÅÀ"t7^,Dá…!˜F(‚Q.cˆD%8X¶¸a1JàFjƨUs‚14ëXoX¬¤wâÄÆ HÒÞ%BÔ À¹ÄµrÀ­’šˆP¤¯”)=€š£º‘ ^(æôäz…*‚́c$ÚÒ@n»>s5æ PLǓ#_Š%¨çV)3¤^£—bŠdݐ¦ˆ&‰¤íÈô#_¸9 fÇA¡ûQ$'Î"´\ÇBbùÚÿha°´©iÇÀÔÄSx  ¨B ‡JRp½üÈ(½€>Ï0J1ÐD ˜/¾È¥ÆÆéáGHe¬fLp“r©íoP.¿/·ÒÒ#"ž–„rQY:f¢†9(›GO‰+éԻ҆S¢ŽÜ|Cj€–™&åªÑ‹’¼y\ë/FÐ:Q¬B2ŸŸÐFý·™ÇÞJ(àà߆$xD>˜‡¡@ÿÌñÑÉ¢õgx("á`7p:èw+èj_ٙôÎÎÈã‘@™ÈÕ}4‡@Öx“ÎœÏl‡…~8£èA(¤«¯Ïv.I7×Gg¬Nè†+”BRz`}ùh?Ƽp)iɅ 0*@`»¡(½ºh’iÇqâȎx,å}šˆlã ãÊ'2Q˜ü% +Cø'b"¡ :`l  äe©°éûÝÇ +OÅ1t}%¾  #ÙT ’aj°¹@¡;– 0Îq,÷ˆe¹Œ + +¸à¸Q Á7€E'”\å +E­cYžPn@XÀŠEŒP͵ðˆ4ò"þÙ¢éNèÀ_°òn:¬€åŒ•>̟œ,Ÿ]]ÜÝwöo»—÷w0ÖÉÉMçÁ¾¾=ï¶î/®í»«GÀÂ>í¶nÚ0»““nëæ7Àåþääâìö¦ùÇ÷‹‡ŽÝº(㛆&×oήÛDvzÏuÞ·oÝuªçñ±*Š,ß´=ž¶(K*ãíÜtš¼ÉœfÿԖ^6öP£©$oÀÁbx–ªAÿlÉž¬=Ù,L1ÀæÈÀ–$ GL“–£&ÊL6{:`jÚæÙ V”àQ3aýsa é¨Ù0¸N#æÃL61\ùüœ˜ÉæÈY1qÓÑòbôÀCgÆ 3p67F1ÜËäÇTͦVuóöa»svÛm¨Èu¿¨nwZW¿µ`„?ña«T_Z_Uë¸ûí¶{M¿ÅBÉ"5Ü\ZP\í<üuÕijÒ²‹v +å˜YøÌ¢3„5b*ù¦$Ä°þD‘)‰ø¢iŒƒÚ×éÈ,…ˆ Ná0ÄN®6g0 æ0_`+»˜C»™1:HÄaл‡.xE‚aîl.‹´h 󢶈]ã9p'Y$ŠC•/”ôñ¨ÎM rðuðAhz膠ÌĜÜ7O:g&?°,¾ÂhhƁÞ-ÈT_$s—¡â’–N(²”ːmR£¯xîwb“0á#± +±La +®oAGJだ+¹HÞæR¹HÉ\JgÓ¹CO3¦¸Ðâ04ŒÅfòIV¡PA,3¨¢¨vÌ)Ia.-55m’ú&O½˜j/ ¤bùDÂê)y¸ ÒðLð‰xHãÑRñÈ#&ãAÓQÓñßòHòŒ”’÷\xa±‘Rz± Éú0Ex1ϔÛFGÉÃ+Bq£¯ë1b6žé€ ™—ø#e䥐árò†8“•7€ҏkŸò9z’ûßîn<Å Ox…I†±U—I3$ðH‰†´ s©†)Ù°¯»>bÂaÏ]ótÊ¡fޑ’{n›§Ó‡9“xø_»mžæ‘§6NQ&%Z}#æRÆ®¢›s Ģì·AFÌ©ÌîÁ³*upi”¼ÊÌî"³r¨qÓ¹•ÿ½[ã)îxbg¼á÷˜þ+sHKÜ¡ q.4öñ3¤*,?|iÏ!‹ÔÄÐHÌ*B\û_…™ –Ïå‚`3ñÓ ØÈþDh>'4 Õê;ŸJÀ‘2CSÃèìLl&‚¦¦Û,pAŽhŠÂ搅y¢%S4·Ž¹¡ÍUü–^#ÛÓ\x#íÐ)Š„m.ç“ÀÃf}šØù”)p£‚ÜOl$zÆ œÉÿ̀ãdO“Kz€ÓåxØLÐÔ^5)Z˜ ªV²0›3^2– œftªN²9*ž:|Vgˆ6¯SÍHJø(#ñ³ßŸÐ½$~Ÿs÷3Âç:/Ô´ Òà”`ɉ¡œ•Wy™–]“§ïÌó:à:Ñ*)¡µT^µäÕO_=¥ÕYFáe5c–ÅSŒY¬¼žž±>æOk}Ýa¼‹3 ȑ®^”ÝÜ=ÀQí»?²ƒŸN,¤Ò“iì3*©‡ë¡k‹ôò‹âÞ˪è¡!{èÓ6Ho¥öâè§9'§YDëÆbpšsr}ÿM蛪ñ:­ìÒ³‡jì¡H‹ÕnoôcÏêé'Cx›Ú<}ÉZ“%­2µ%cªå¼ñ‘˜,†Rd¿¤‡Z§qÎiÿD/d̈́Œ‘¶425m€ä†¾ çœF¿NCMş³ ÒFD½ÉÑÃ@ÉYKÄ° ²&FÎ`…4 -Ÿµ±ÉXâyc=kÕ×Ó¼˜62C?Wáåܕþ*£Øiëáâ»B/ºïŸ6ë˜UZºÁ†é³ùÆ"¬ò•$Ð⫋ðFÉ]ԕnëš%ÐÎÃm÷/„#S ôˆÊ€™Íy($EYÒ:l#Ã<Ó#QÍ{€d1±ƒŠœ²U­ßÞ|»¸Â}l=|'¹UÅi.Ý<\´®.Z÷HÕ4 ‡·Šs5А®f4&˟˜µeEÐ`e(F:*ƒ¦òEû§oJéoR?¦É§73IǓ͗I;†ù½xâqóïJ=žlþ3¡ŽN?Ìiú÷¥ Eê +«ÒIvØîÉÂû‡ÙËOå§:þ þdÁ¾Bñk<Àÿ§­©²,æ܍×Ô5€^ ܨ™’pnn|Ì|–Ó³òÉìs““ˆæn·ÔÕy~ßúGÇjÝÜà;wð“uÞí܃¡Ñ±î¿ßþl”4˜œ\ÞZû?›ÖZò +endstream endobj 5 0 obj <> endobj 25 0 obj <> endobj 37 0 obj [/View/Design] endobj 38 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 45 0 obj [44 0 R] endobj 62 0 obj <> endobj xref +0 63 +0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000026899 00000 n +0000000006 00000 f +0000086484 00000 n +0000000008 00000 f +0000026950 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000020 00000 f +0000086741 00000 n +0000086772 00000 n +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000000 00000 f +0000086554 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 +0000086625 00000 n +0000086656 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000029537 00000 n +0000086857 00000 n +0000027307 00000 n +0000029837 00000 n +0000029724 00000 n +0000029037 00000 n +0000028218 00000 n +0000028475 00000 n +0000028523 00000 n +0000029183 00000 n +0000029297 00000 n +0000029417 00000 n +0000029608 00000 n +0000029639 00000 n +0000029911 00000 n +0000030085 00000 n +0000031263 00000 n +0000054430 00000 n +0000086882 00000 n +trailer +<<91CEEB81984C404395810B8A574978A5>]>> +startxref +87017 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai b/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai new file mode 100644 index 00000000..c7480ad5 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai @@ -0,0 +1,716 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + xmp.did:AD1F418A7C94E91197BDD9C8DFBF9319 + uuid:bddc7d4e-65c4-4f22-90c9-2f47cc2b6270 + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + proof:pdf + + xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + proof:pdf + + + + + saved + xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T03:03:20+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:AD1F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T04:28:29+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + + EmbedByReference + + K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai + + + + + + + application/pdf + + + Eclipse_with_icon_3 + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T04:28:31+02:00 + 2019-06-22T04:28:31+02:00 + 2019-06-22T04:28:31+02:00 + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqp3FzbW0RluJUhiHV5GCj7zkMmSMBciAPNlCEpGoiyxzUfzC0G1JWAveSD/fYolf9ZqfgDmm1 HtBp4bRuZ8uXzLtMPY2afOojzY7efmXq0hItbeK3U9C1ZGH0/Cv/AAuafN7SZpfRER+38fJ2eLsP GPqJP2LLWf8AMDWqNDLOkLdJRSBKexAWv0VyGKfaGp3BlXf9I/R9jLJHRYOYF931FOLXyBfS0fVd VlkPVo4mY/8ADvX/AIjmyxdg5Jb5ckj7v1n9Tg5O14DbHAD3/qH60fJ5d8kaLCJ7/wBCFO899KAp p/xkIT8M2WHsTTR5Q4j57/scLJ2pnn/FXu2Sa6/OP8ntFqg12yUDalkjTjb/AJhkkGbTFouH6YiP wpwp5JS+ok+9JLr/AJye/KyH+7mvLnp/dWzD/k4Y8yBpZsEHJ/zlZ+WyuqraarID1dYIKD58p1P3 DD+Un5Krxf8AOUn5YO3FhqEQp9p7dSP+FkY4Pys1Tmw/5yD/ACkvCFGuC3c/s3EFxH/wxj4f8NkT p5jorLtI83+VNZIXSdZsr9z+xb3EUj/SqsWGVGBHMKm+RV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KobUNSsdPgM95MsMfYsdyfBR1J+WUZ9Tjwx4pmg24cE8hqIssH1n8yZ3LRaVF6S9P rEoBf5qn2R9Nc5fWe0cjthFeZ5/L+13+m7EA3yG/IfrYfeX97ey+rdzvPJ4uSafLw+jOdzZ55Tcy ZHzd3iwwxiogAJxofkrV9U4ysv1W0O/rSDcj/ITqf1ZsdD2Nmz7n0w7z+gOFq+1MWLb6pdwZedI8 l+U7I6hqtxDCkf2ry+dVFadEDUWvgAK51ui7Fw4uQ4pd53ed1PaebLtfCO4PNvN3/OVflewL2/lq xl1eYbC6mrb2/wAwCDK/yKr8830NITz2de8f8y/85BfmhrjOo1T9F2zdINOX0KfKWrTf8PmTHTwH RLz68vr29na4vbiS5uG+1NM7SOfmzEnLwKVQxV2KuxV2KuxVsEg1HXFWWeXvzX/MTy+UGma7dJCn S3mf6xDTwEc3NR9AyuWGMuYV6z5T/wCcs72MpD5q0hZ4+jXmnnhIB4mGQlWPydflmNPR9xV7d5P/ ADL8k+bowdD1OKa4pyayc+lcrTrWJ6MQPFaj3zFnilHmEMnytXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYqxHzJ5+tbIva6bxubobNL1jQ/R9o/hnPdo9uwxXHF6p9/Qfrd1ouyJZPVk9MftP6nnl9qF7 f3BuLyZppW/aY9B4AdAPYZx+fUTyy4pmy9Liwwxx4Yigu07TL3UblbaziMsp3NOgHix6AYdPpp5p cMBZRmzwxR4pGg9C0jyhouhWrajq8sTvApklnmIWCELuT8VBt/M34Z2nZ3YePFRn65/YPc8vrO1p 5do+mP2l5Z+Yv/OUdjaGXT/JUK3k4qratcKRAp6VhjNGenZmoPZhnUY9Le8nUvnjzD5o8w+Y783+ uX81/dGtHmaoUHfiiCiovsoAzNjARFBKV5JXYq7FXYq7FXYq7FXYq7FXYq7FVSCeaCZJoJGimjIa OVCVZWG4KsNwRir2T8v/APnJrzVojRWfmVTrmmCi+uSFvYx4iQ0Evyfc/wAwzFyaUHlsr6X8o+d/ LPm7Tvr+g3qXUQoJovsyxMf2ZYz8Sn8D2zBnjMTRQnmQV2KuxV2KuxV2KuxV2KuxV2KrJpooYmlm cRxIOTuxoAB3JORnMRBJNAMoxMjQ3LzbzV54n1AvZ6eWhstw8nR5R/Bfbv38M4rtTtuWW4Y9od/U /sep7P7KGP1T3n937WJZz7uU48u+Wr3WrjjF+7tkP764IqF9h4t7Zsez+zZ6mVDaI5n8dXB1uuhg jvvLoGW+Z/Nnkv8ALPy/696/Bnr9XtUo11dSAdht07saKv3DPQND2fDFHgxj3n9byOo1M80uKRfK P5k/m95q89XbC8lNppCNW20mFj6S06NIdjK/+U30AZvMWEQ97QwbLVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVTLy/wCY9c8u6nHqei3kljexfZliPUVqVdTVXU03VgQcjKIkKKvq38o/z+0fzf6O ka0E03zGQFRa0t7o/wDFJJ+F/wDis/QT21+bTmO45IeuZjK7FXYq7FXYq7FXYq7FVk00UETzTOEi jBZ3bYADck5GcxEGRNAMoxMjQ5l5b5t82zaxMbe3Jj06M/CvQyEftN/AZwnavap1B4Y7Yx9vmXru zuzhhHFLeZ+xjeaV2id+WPLNxrd0RUx2cRHrzf8AGq/5R/DNp2Z2bLUz7oDmf0DzcDX66OCPfI8g n35lfmV5d/LTy7HFFGkupyoV0zTFO7Hp6stNxGD1PVjsPb0TR6OMYiEBUQ8dkySySMpGyXx15o80 655n1ibV9aumuryY9TsqIPsxxr0VF7AfrzcQgIigwSnJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq2rMrBlJDA1BGxBGKvpf8j/+cgTevb+V/OE/+ltSPT9YkNPVPRYpz/P2V/2uh33ODn09 bxQ+g8wldirsVdirsVdirsVeZ+d/NR1Cc6fZv/oMLfvHH+7XH/Go7ff4ZxHbXanjS8OB9A+0/qer 7K7P8MccvrP2ftYlnPu5THQtFudY1BLSH4V+1NKeiIOp/pmZodHLUZBCPxPcHF1eqjhhxH4ebL/P /nnQPyz8oibgslywMWmWFaPPN1LMevFa8nb6OpAz0nRaOMIiEBUQ8VmzSySMpcy+MPMXmLWPMesX GsaxcNc31y3KSRugHZVHRVUbADpm7jERFBrSzJK9R07/AJxx/MzUNPtb+2gtDb3kMc8Ja4UHhKod aim2xzHOpgDSoj/oWL81P98Wf/SSv9MfzUFd/wBCxfmp/viz/wCklf6Y/moK7/oWL81P98Wf/SSv 9MfzUFd/0LF+an++LP8A6SV/pj+agrv+hYvzU/3xZ/8ASSv9MfzUFd/0LF+an++LP/pJX+mP5qCu /wChYvzU/wB8Wf8A0kr/AEx/NQV3/QsX5qf74s/+klf6Y/moK7/oWL81P98Wf/SSv9MfzUFd/wBC xfmp/viz/wCklf6Y/moK7/oWL81P98Wf/SSv9MfzUFd/0LF+an++LP8A6SV/pj+agrv+hYvzU/3x Z/8ASSv9MfzUFd/0LF+an++LP/pJX+mP5qCu/wChYvzU/wB8Wf8A0kr/AEx/NQV3/QsX5qf74s/+ klf6Y/moK8981+WNV8r6/daFqqot/Z+n6yxtzX97Gsq0YdfhcZdCYkLCpRklfUP/ADj3+dTarHD5 P8xz11OJeGlXsh3nRR/cyMTvKo+yf2h/ldcDUYK9QQ96zDV2KuxV2KuxViHn7zIbK2/Rts1Lq5Ws zjqkZ2p82/VnPdvdo+HHwo/VLn5D9ruuyNFxy8SX0x5eZ/Y81ziXql0UcksixRqXkchUUbkkmgAy UYmRAHMsZSAFnk9QtU0jyR5VutT1SVYoraM3GoXHUkjoi+O54qO5PvnovZXZwwYxEfXLn+O4PFa/ WHPkv+Ecnxn+Yvn3VfO/ma41m+JSI/u7G0rVYIATwQeJ7se5+7Onx4xAU4bF8sV2Kv0B8kf8oXoH /bNtP+TCZp8n1H3oTrIK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxX/wA5Ef8Ak4vMH/Rn /wBQMGbTTfQEvOMvVUgnmt5o54JGimiYPFKhKsrKaqykbgg4q+0PyR/NKLzz5b4XjKvmDTQseoxi g9QEUS4UDs9Pip0b2pmrz4uA+SHo+UK7FXYqhdU1CDTrCa9n/u4V5U7k9FUfM7ZRqdRHDjM5cg3Y MJyzEBzLxi/vri+vJru4PKWZizeA8APYDYZ5rnzyyzM5cy9zhxRxxEY8gh8pbWb/AJc6CJZX1eda pESlqD3f9p/9iNh/ZnUez2h4ic0uQ2j7+90HbWroeEOvN43/AM5OfmUdU1hfJ2nS/wC4/S3D6kyn aS7ptGfFYgf+CJ/lGd/pcVDiLzbwrMtXYq7FX6A+SP8AlC9A/wC2baf8mEzT5PqPvQkf5y+bNX8q eQb7W9IZFvoJIFjaVA60klVGqp9jksMBKVFXzn/0M7+an+/7P/pGX+uZ35WCXf8AQzv5qf7/ALP/ AKRl/rj+Vgrv+hnfzU/3/Z/9Iy/1x/KwV3/Qzv5qf7/s/wDpGX+uP5WCu/6Gd/NT/f8AZ/8ASMv9 cfysFd/0M7+an+/7P/pGX+uP5WCu/wChnfzU/wB/2f8A0jL/AFx/KwV3/Qzv5qf7/s/+kZf64/lY K7/oZ381P9/2f/SMv9cfysFd/wBDO/mp/v8As/8ApGX+uP5WCu/6Gd/NT/f9n/0jL/XH8rBXf9DO /mp/v+z/AOkZf64/lYK7/oZ381P9/wBn/wBIy/1x/KwV6T+Qv5xedPOvnC80vXJYHtIdPkukEMIj b1EnhjG4PTjIco1GGMY2EPecw1fFf/ORH/k4vMH/AEZ/9QMGbTTfQEvOMvV2Ksk/L3ztqHkzzVZ6 5ZkskTcLy3BoJrdiPUjPbcbr4MAchkgJClfduk6pY6tplrqdhKJrK9iSe3lHdHHIfI+IzUEUaKEV gV2KvPfzJ1kvPFpUTfBFSW4p3cj4F+hd/pzkPaPWXIYR03Pv6PS9iaagch67BhGcu79XsbOa9vIb SEVlmcIv0nr9GW4MJyTEI85Fry5BCJkeQZ9+Yfmm1/L78vLq/t+Pr28a22mxt+3cybISO9N5GHcA 56jotLGIjjj9IeDzZTkmZHmXw5PPNPNJPM5kmlYvLIxqzMxqzEnqSc3jBTxV2KuxV+gPkj/lC9A/ 7Ztp/wAmEzT5PqPvQwr/AJyS/wDJSap/xmtf+ohMt031hXxnmzSioNL1C4sbq/gt3ls7Ixi7mUVW L1iRGXp0DFSK9K/MYLHJULhV2KuxV2KuxV2KuxV2KuxVGadpOpakbkWNu0/1SCS7uitKRwQiryMT QAD8TsN8BICoPCr2v/nE3/yYuo/9seb/AKirbMXV/T8VfWGa5D4r/wCciP8AycXmD/oz/wCoGDNp pvoCXnGXq7FXYq+l/wDnFXz6Z7S78mXstZLbld6VyPWJj++iH+qxDge7eGYOrx/xIfQmYSqV1cxW ttLcymkcKNI59lFTleXIIRMjyAtnjgZyERzLxK+vJby8mu5jWSdy7e1T0+jPMc+Y5JmZ5yNve4sY hERHIKGVNjNPy10oS3k+pSLVbcenCT/O4+Ij5L+vOm9nNLxTOU/w7D3n9n3uh7c1FRGMddz7vx9z xn/nKfzkdR812vlq3etro0YkuQDsbm4UNv8A6kfGnzOeg6SFC+95p4fmWrsVdirsVfoD5I/5QvQP +2baf8mEzT5PqPvQwr/nJL/yUmqf8ZrX/qITLdN9YV8Z5s0vff8AnFLT7LUZPNtjfQJc2dzbW0c8 EgDI6M0oIIOYerNUrB/zl/KW98h616luHn8u3rE6fdncodz6Epp9tR0/mG/iBdhzcY81edZcrsVd irsVdirsVdiqP0PRNU1zVrbSdLga5v7xxHBCvcnuSdgANyT0GCUgBZV9VyfllpfkL8kvMtnDxn1S 502d9TvqbySCM0Va9I0rRR9PU5rvFM8g96HyLmyS9r/5xN/8mLqP/bHm/wCoq2zF1f0/FX1hmuQ+ K/8AnIj/AMnF5g/6M/8AqBgzaab6Al5xl6uxV2Kp15M8zXXlfzTpmvWtTJYTrI6DbnEfhlj/ANnG zL9ORnHiBCvvuyvLa9s4L21cS211Gk0Eg6MkihlYfMHNORSGO/mJqBttC+rqaPeOE9+C/E36gPpz Q+0Go4MHCOczXw5u37Gw8Wbi/mh5dnCvWuxV675WtBpnliAmNmcxm5kRBV2LjlQDu3Ggz0XsjT+F p4jqdz8Xie0s3iZ5HoNvk+Rdf/K/83tb1y/1i78t3huNQuJLmXZaAyMWoPi6CtBnTxywAq3CQH/K lvzU/wCpavP+BX/mrD48O9Xf8qW/NT/qWrz/AIFf+asfHh3q7/lS35qf9S1ef8Cv/NWPjw71d/yp b81P+pavP+BX/mrHx4d6vtDyla3Fp5V0a1uUMVxb2NtFNG3VXSFVZT8iM1czZKGC/wDOSX/kpNU/ 4zWv/UQmXab6wr4zzZpfQv8AziF/x0fM3/GG0/4lLmFrOQV9B+ZfLekeZNEutG1eAT2V0vF1/aU/ suh34up3U5hxkYmwh8SfmV+XWseRPMUml3wMtpJWTTr4CiTxeI8HWtHXsfYgna4sgmLSxLLFdirs VdirsVVba2uLq4itraNprid1jhhQFmd2NFVQNyScSVfY35Ifk/b+R9J+v6iiyeZr5B9akHxCCM0I t0IJHUVdh1PsBmsz5uM0OSGSfmz/AOSz8z/9s25/5NnK8P1j3q+EM26Xtf8Azib/AOTF1H/tjzf9 RVtmLq/p+KvrDNch8p/nd+WHn/W/zQ1rU9K0O5vLC4+rejcRhSrcLSFGpUjoykZscGWIgASlg3/K lvzU/wCpavP+BX/mrLfHh3q7/lS35qf9S1ef8Cv/ADVj48O9Xf8AKlvzU/6lq8/4Ff8AmrHx4d6u /wCVLfmp/wBS1ef8Cv8AzVj48O9X1L+Ry+Y7XyDZ6R5jtJbLUtLZrdYptna3ryhfYnYAlB/q5r89 cVhCF/Mu89XV4LUGq28VSPBpDU/8KFzhPaTNxZhD+bH7/wAB6nsPFWIy/nH7mIZzru0TptobzULa 1H+75UjPsGYAn7sv02LxMkYfziA1Z8nBAy7g9qmUUhiCngXAqu3EIC4+iq0z1ACngCVbFXYq7FXY q7FXYq8w/wCckv8AyUmqf8ZrX/qITMjTfWFfGebNL6F/5xC/46Pmb/jDaf8AEpcwtZyCvpbMFDGv zB8h6N528uzaPqS8WNXs7sCrwTAUWRelfBl7jbLMeQwNhXxH5v8AKWs+U9fudE1eL07q3PwuN0lj P2JYz3Vh0+475tYTEhYSkuSV2KuxV2Kvp3/nGX8sNMh0iDz3fcbi/uzKmlx02t445Ggkff8A3Y5R h7L8zmBqspvhQ9+zDVif5s/+Sz8z/wDbNuf+TZyzD9Y96vhDNul7X/zib/5MXUf+2PN/1FW2Yur+ n4q+sM1yHYq7FXYq7FXYqoSHheQtUBZQ0RFN2YDmm/gqq/34VeSebbn6x5kv3rXjKY/+RYCf8a55 x2rk49TM+dfLZ7fs6HDggPK/nulGa5zWQ+QrYTeZrckVWFXkI+SkD8WGbjsLHxaqPlZ+x1na8+HT nzoK/wCc35vyfl7e6P6GnrqMt9Hc843lMQRUaLidletTXPR8GHjt4551/wBDe6j/ANSzD/0lt/1S y78mO9Lv+hvdR/6lmH/pLb/qlj+THerv+hvdR/6lmH/pLb/qlj+THerv+hvdR/6lmH/pLb/qlj+T Herv+hvNS/6lmH/pLb/qlh/JjvV3/Q3mpf8AUsw/9Jbf9UsfyY71Y1+Yv/OQ97508qXPl+XQ47JL l4nNwtw0hHpSB6cTGvXjTrk8em4Tdq8gpmSr6E/5xD/46Pmb/jDaf8SlzD1nIK+lswEOxVgn5ufl Zp3n3QDD8MGtWYZ9MvSOjHcxPTrG9N/Dr7G7DlMD5K+K9X0jUdI1O50zUoGtr60cxXED9VZflsR4 EbHNoCCLCUJTCrqYq9N0f8n7pfys1rz1rSvAqQRnRLU1Vn5zIhuJB/Jxb4B+116UrRLN6xEK+h/+ cd//ACTvl/8A6PP+o6fMLU/WUPRsoVif5s/+Sz8z/wDbNuf+TZyzD9Y96vhGmbdLMvys/MafyB5h uNZhsV1Bri0ezMLyGIAPJHJy5BX/AN9UpTvleXFxilepf9Deal/1LMP/AElt/wBUsx/yY71d/wBD eal/1LMP/SW3/VLH8mO9Xf8AQ3mo/wDUsw/9Jbf9UsfyY71d/wBDe6j/ANSzD/0lt/1Swfkx3q7/ AKG91H/qWYf+ktv+qWP5Md6u/wChvdR/6lmH/pLb/qlj+THeqa+U/wDnJ258w+adI0a40KKzS/u4 rcXK3BkKNK3AUUxqDXlx698jPS8IJtCPv5TLfXEp6ySux+lic8izy4skj3kvoGGNQA7gFDKWxmP5 ZRA6tdS/yQcR/snU/wDGudJ7NR/fSPdH9IdH27L93Ef0v0PGf+csb31fPum2gNVt9MRiN9nknlr/ AMKq56JpB6T73mHiWZSuxV2Kt4quphV1MVdTFXUxV9Cf84iD/cj5m/4w2n/EpcwtbyCvpTMBDsVd iryn88/yci86ab+ltJjVPM1klIuii6iXf0XJoAw/Yb6DtuMnT5+E0eSvkCaCWGV4ZkaOaNikkbgq yspoVYHcEHNml6/+Q35Mt5rvk8wa3CR5ctH/AHUTCn1yVD9gVG8SkfGe/wBnxpi6jPw7Dmr3f89I 0j/KLzBHGoREghVEUUAAnjAAAzD0/wBYQof848f+Se8v/wDR3/1Gz4dT/eFXo2UKxT82P/JZ+Z/+ 2bcf8mzlmH6x71fCVM3CXUxV1MVdTFWmGJVbgV2KuxVMvLV41l5j0q8WvK2vLeYU61jlVtunhgkL BV9IZ4c+huxVnP5XA+vqJ7cYt/pbOp9mPqn8P0vP9vcofH9Ceaj5H8oa9qV1ea1o9pqN1GywpNcQ pI6xiNGCAkVpyYn6c7IZJAbF5tD/APKpvyz/AOpY03/pGj/pj40+8q7/AJVN+Wf/AFLGm/8ASNH/ AEx8afeVd/yqb8s/+pY03/pGj/pj40+8q7/lU35Z/wDUsab/ANI0f9MfGn3lW/8AlU/5af8AUsad /wBI8f8ATD40+8q7/lU/5af9Sxp3/SPH/THxp95V57+fPkDyTo/5aahf6VodlZXsctuEuIIURwGm VWAYCu4NMv02SRmASr5XpmyS+gv+cRh/uR8y/wDGG0/4lLmDreQV9J5r0PKPzx/MLV/I2oeVtUsf 3ts8t1Hf2RNEnh4xfCTvRl6q3Y+1QcnT4hMEFXonlrzJpHmXRbbWdImE9ldLyRujKw2ZHX9llOxG UTgYmiqZ5FXzx/zk5+WulRWQ87WFLa8aWODUoAKLMXqFmFOjilG/mG/Ub52kym+Eq9T/ACYAH5W+ W6f8si/8SbMfP9ZVD/nt/wCSm8xf8YYv+oiPHT/WFQ3/ADj1/wCSf0D/AKO/+o2fDqv7wq9FyhWK fmv/AOS08zf9s64/5NnLcP1j3q+FaZuUvWP+cbPLuh6755vrTWbGDULWPTJZUhuEEiCQXEChgG70 Yj6cxdXIxjt3q+kv+VT/AJaf9Sxp3/SPH/TMDxp95Q7/AJVP+Wn/AFLGnf8ASPH/AEx8afeVd/yq f8sz/wBMxpv/AEjx/wBMHjT7yrX/ACqb8s/+pY03/pGj/pj40+8q7/lU35Z/9Sxpv/SNH/THxp95 V3/Kpvyz/wCpY03/AKRo/wCmPjT7yrh+U35Zg1HljTa/8w8f9MfGn3lXmWeSvobsCWc/lcf3+oCv VYjT5Fs6n2ZPqn7h+l5/t7lD4/oTHXPzL8jeV9WuNP17VY7G8lKXEcLpKxMTRqgaqIw+0jDOzjil IWA82gP+V8flJ/1MUP8AyKuP+qeH8vPuV3/K+Pyk/wCpih/5FXH/AFTx/Lz7ld/yvj8pP+pih/5F XH/VPH8vPuVsfnx+UpNP8RQ/8irj/qnj+Xn3Ku/5Xp+U/wD1MMP/ACKn/wCqeH8tk7ld/wAr0/Kf /qYYf+RU/wD1Tx/LZO5WBfnf+afkDzB+XV/pej6xHd38slu0cCpKpISZWbd0UbAeOX6fBOM7IV8y 0zYpfQP/ADiQP9yPmX/jDa/8SlzB13IK+kc1yHz/AP8AOW4/3HeWv+M11/xGLM/Q8yry/wDJ381r 7yJrXCctP5fvWA1C0G5Q7ATxD+dR1H7Q28CMnPgEx5pfZOn39lqNlBfWMyXFncoJIJ4zyV0YVBBz UEEGih5j/wA5Mf8Akrp/+Yu2/wCJHMnR/WrIvyZ/8ld5b/5hF/4k2V6j6yqG/PX/AMlP5h/4wxf9 REeHTf3gVD/849/+Sg0D/o7/AOo2fDqv7w/jor0TMdWK/mt/5LXzN/2zrj/k2ctwfWPer4Xpm6S9 Q/5x481+XvLHnW9v9dvFsbSXTZYI5XV2BkaeBwtEDH7KMcxtVjMo0O9X0P8A8r0/Kf8A6mGH/kVP /wBU8wPy2TuQ7/len5T/APUww/8AIqf/AKp4/lsncq0/nt+Uw6+YoR/zyuP+qeD8vPuVr/lfH5Sf 9TFD/wAirj/qnj+Xn3K7/lfH5Sf9TFD/AMirj/qnj+Xn3K7/AJXx+Un/AFMUP/Iq4/6p4/l59ytj 8+PylJoPMUNf+MVx/wBU8fy8+5WF6hEYb+5iPWOV0P8AsWIzyjUR4ckh3Evf4ZcUAe8BD5S2sx/L KUDV7qL+eDkP9i6j/jbOj9mp1mkO+P6Q6Pt2P7qJ/pfoeNf85ZWXp+fNMuwKLcaaiE+LRTy1/wCF dc9F0h9J97zDxHMpXYq7FWwaEHCqLpliupirqYq6mKvf/wDnEof7kPMv/GG1/wCJS5ga7kFL6QzX IeAf85aj/cd5a/4zXX/EYsz9DzKQ+b6ZsVevfkT+cL+Vb1NA1qYny5dv+6lY1+qSuftip2iYn4x2 +141xNTp+IWOavW/+ck3ST8rJXRg6PdWzKymoILEggjMTR/3iGR/k1/5K/y5/wAwi/8AEjleo+sq h/zz/wDJUeYf+MMX/J+PDpv7wKhv+cfP/JQ6B/0d/wDUbPh1X94fx0V6JmOrFfzV/wDJbeZv+2dc f8mzluD6x71fDVM3aXUxV1MVdTFVCf7QHtkJKpZFXYq7FUz8s2bX3mTSbJQS11eW8IA61klVffxy MjQKvqfzdbfV/Ml+lPtSeoP+egD/APG2eQdrY+DUzHnfz3e17OnxYInyr5bJPmuc5kHkS59DzNbA mizB42+lSR/wwGbfsPJw6qPnY+x1va0OLTy8qKO/OD8no/zEutJI1M6XJp6XHKX0PrAkWQxUWnqw 8ePE56PhzcF7PGvPf+hP/wDv7f8AuX/9nWX/AJzyV3/Qn/8A39v/AHL/APs6x/OeSu/6E/8A+/t/ 7l//AGdY/nPJXf8AQn//AH9v/cv/AOzrH855KrD/AJxHoAP8V/8Acv8A+znJfn/6P2ptv/oUj/v6 /wDuX/8AZzh/P/0ft/YtsZ/MX/nHv/BvlS51/wDT/wBf+rvEn1b6p6PL1ZAlefryUpyr9nLMOr45 VSvH6Zmq9+/5xMH+5DzJ/wAYbX/iUua/X8gpfR2a1DwH/nLMf7j/AC3/AMZrr/iMWbDQcykPnGmb JXUxVm7fmbqV3+Ws3krU+VwkM0Mul3RNWjjjYloXJO6gH4PDp0pSjwAJ8QV9R/k5/wCSw8uf8wi/ 8SOarUf3hQh/zy/8lT5h/wCMMX/J+PDpf7wKhv8AnH7/AMlFoP8A0d/9Rs2HV/3h/HRXoeY6sV/N X/yW3mX/ALZ1x/ybOW4PrHvV8O0zepZl+Vf5c/498w3Gj/pD9G+haPd+v6Pr14Sxx8OPOKlfVrWv bKM+XwxdWr1T/oUj/v6/+5f/ANnOYv5/+j9v7Ft3/QpH/f1/9y//ALOcfz/9H7f2Lak//OIPJi3+ LaV/7V//AGc5A62+n2qt/wChP/8Av7f+5f8A9nWP5zyQ7/oT/wD7+3/uX/8AZ1j+c8ld/wBCf/8A f2/9y/8A7OsfznkqbeU/+cXE8v8AmbS9bfzEL4abcxXItTZelzMTBl+P15ONCK/ZORnqrBFKy/8A MyzMeq292B8NxFxJ/wAqM7/gwzz/ANpMNZYz/nD7nqOw8t4zHuP3sOznHeIjT7o2l/b3Q6wSJJ/w LA5dp8vh5Iz/AJpBas2PjgY94e2s6ssciseFQRx35BhxH0fFXPUAQRYeBIpUwodirsVdirsVdirz X/nIn/yVWp/8ZbX/AJPpmVo/7wK+P6ZuUvff+cThTUPMn/GK1/4lLmv7Q5BS+jc1iHgf/OWIrp/l v/jNdf8AEYs2Gg5lIfONM2aupirqYq+2fyd/8lh5c/5hF/4kc0ep/vChDfnj/wCSq8wf8YYv+T8e HS/3gVD/APOP/wD5KPQf+jv/AKjZsOr/ALw/jor0LMZWLfmp/wCS38y/9s64/wCTZy3B9Y96vh6m b5L2T/nFgf8AIQdQ/wC2TN/1E2+YWv8AoHvUvqbNSh2KuxV2KuxV2KrWFZEqKhasG8DSn6icVY3+ YWn/AFrQTOorJaOJNuvE/C366/Rmj7f0/Hp+Ic4G/wBBdt2Pm4M1dJbPLM4R652KvWvKd2NU8rxR s7q6o1rK6MVdSo4gqw3DcSDXPROxtR4mniesdvl+yniu08Ph55dx3+b438xeb/zP0PXtQ0a6806x 9Y0+4kt5D9fuqExsV5D950alRnUxhAi6Dgpf/wArK/MX/qatY/6T7r/qpkvCj3BXf8rK/MX/AKmr WP8ApPuv+qmPhR7grv8AlZX5i/8AU1ax/wBJ91/1Ux8KPcFbT8y/zEVgT5p1cgdQb+5/6qYRjh3B X3B5RnluPKmizzSNLNNYW0kkrkszM0KkszHckncnNTk+o+9DC/8AnIj/AMlVqX/GW1/5Ppl+i/vA r5Cpm6S98/5xQH+5DzH/AMYrX/iUua7tDkFL6LzWIeCf85Xj/cf5c/4y3X/EYs2PZ/MpD5zpmzV1 MVdTFX2t+T3/AJLHy7/zCL/xI5otT/eFCH/PD/yVfmD/AIxRf8n48Ol/vAqH/IH/AMlJoP8A0d/9 Rs2HWf3p/HRXoOYysW/NP/yXHmT/ALZ1x/ybOXaf+8HvV8Q0zfJex/8AOLQ/5CBqH/bJm/6ibfML X/QPf+tS+pM1CHyR+fPnnzlpv5p6zYaZr2o2NnD9V9O2trueKNedpCx4ojqoqWJPvmzwQiYDYJef /wDKyvzF/wCpq1j/AKT7r/qplvhR7grv+VlfmL/1NWsf9J91/wBVMfCj3BXf8rK/MX/qatY/6T7r /qpj4Ue4K7/lZX5i/wDU1ax/0n3X/VTHwo9wV9Z/kLba+v5dWWoa9f3WoahqrveCS8mknkSBqLCi tIWPEovMD/KzXagjiodEPQLiCK4t5IJRyilVkceKsKHMXJATiYnkRTKEzGQI5h4nqNjLY309nL/e QOUJ8adD9I3zzHUYTiyGB5xL3uHKMkBIdUNlLazL8ttVEOoTae5+C6XnF/xkQbj6V/VnSezmq4ch xn+Ll7x+z7nR9t6figJj+H7i8e/5yp8mtYeZ7TzRbp/ourxiG6YdrqBQoJ/14gtP9U56HpJ2K7nm HhmZauxV2KuxV+gPkj/lC9A/7Ztp/wAmEzT5PqPvQxD/AJyH/wDJV6l/xltv+T6ZkaL+8CvkSmbt L1D8jfzH8veSLrV5dZW4Zb6OBYfq6K5rGXLcuTJT7QzD1eCWQClet/8AQzP5c/761D/kQn/VXML8 hk8kU8v/ADy/NHy153tNIi0ZblWsZJmm+sRqgpIEC8eLPX7JzM0mnljJtLySmZqupirqYq+i/IH5 +eRtA8maTo99Hem7soBFMY4UZOQJPwkyDx8M1ebRzlMkUql+ZP58eSPMfkjVdF0+O9F5eRosJliR UqsqOakSN2XwxwaOcZgmlUfyt/PPyV5X8iaZoWpJeNe2fr+qYYkZP3txJKtCXU/ZcdsOo0k5zJFK yv8A6GZ/Ln/fWof8iE/6q5T+QyeSKSTzt/zkD5E1ryjrGk2cd8Lq+tJYITJCipzdSByIkNB9GWYt FOMgTWyXzfTNqr2L/nFwf8hA1D/tkzf9RNvmB2h9A9/61L6izUIfFf8AzkR/5OLzB/0Z/wDUDBm0 030BLzjL1dirsVT3yR5XufNPmzTNBt6hr6dUlcCpSIfFLJ/sI1ZsjknwxJV982dpb2dpBaWyCK2t 41ihjXYKiAKqj5AZpybQq4FYB+ZWjFZYdWiX4XpFc0/mH2GPzG33ZyXtHo6IzDrsf0fqej7E1Oxx n3j9LBc5V6FWtLqa0uormE0lhcOh91NcsxZTjmJR5g215MYnExPIvQPPflm0/MP8vLmwiKrNdRCe wkY7R3UW6Anw5VRvYnPUNDqxOMckeReEz4TjmYno+HLm2ntbmW2uIzFcQO0c0TCjK6HiykeIIzfA talirsVdir9AfJH/AChegf8AbNtP+TCZp8n1H3oYx+fNje335aahbWVvLdXDS25WGFGkcgTKTRVB Owy/RkDILV8r/wCDPN//AFY9Q/6RZ/8AmjNz4sO8Jd/gzzf/ANWPUP8ApFn/AOaMfFh3hXf4M83/ APVj1D/pFn/5ox8WHeFd/gzzf/1Y9Q/6RZ/+aMfFh3hXf4M83/8AVj1D/pFn/wCaMfFh3hXf4M83 /wDVj1D/AKRZ/wDmjHxYd4V3+DPN/wD1Y9Q/6RZ/+aMfFh3hXf4M83/9WPUP+kWf/mjHxYd4V3+D PN//AFY9Q/6RZ/8AmjHxYd4V3+DPN/8A1Y9Q/wCkWf8A5ox8WHeFd/gzzf8A9WPUP+kWf/mjHxYd 4V3+DPN//Vj1D/pFn/5ox8WHeFd/gzzf/wBWPUP+kWf/AJox8WHeFer/APONnl/XtO8830+oabdW cLaZKiy3EMkSljcQEKGdQK0B2zC184mAo9VL6SzUofFf/ORH/k4vMH/Rn/1AwZtNN9AS84y9XYq7 FX03/wA4reQWtdPu/Od7HSW9DWmmBhuIUb97KP8AXdeI/wBU+OYGryb8KH0BmGrsVQ+oWMF/ZTWc 4rFMpVvEeBHuDvlOowRywMJcpNuHKccxIcw8Y1PT7jTr6aznFJIWoT2I6hh7Eb55rqdPLDkMJcw9 zgzRywEo8ihcobmafl1rwguW0qdqRXB5W5PQSU3X/ZD8fnnTez2u4JeDLlLl7/2/jm6LtrScUfEH Mc/d+x5H/wA5O/lo2n6ovnPTYf8AQdQYR6qqDaO56LKadpRsT/N7tnoOly2OEvMvBcy1dirsVfoD 5I/5QvQP+2baf8mEzT5PqPvQnWQV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kviv/nIj/wAn F5g/6M/+oGDNppvoCXnGXq7FWUflx5Gv/Ovmu00S1qkLn1L65Ar6NshHqPv33ovixGV5cgiLV91a ZptlpmnW2nWMQgs7OJIbeJeipGAqj7hmpJs2hE4FdirsVYr578tnUbP69bJW8tl+JR1ePqR816jN D252d40PEiPXH7R+x3HZOt8KXBL6ZfYXmGcM9YuR3R1dCVdSCrDYgjcEYQSDYQQCKL0/TbjS/Ofl e50vVYlmWaI2+oQHaoYbOvhXqCOjD2z0TsjtHx8YP8cef6/i8X2hozgybfSeX6nxv+Zf5fan5G8z z6Rd1ktWrJp15SizQE/C3+sOjjsfamdTiyCYtwWKZYrsVfSOgf8AOVHl/TNC03TZNDu5HsbWG2eR ZYwGMUaoSK+PHMGWkJN2hH/9Dc+XP+rBef8AI2LB+TPerv8Aobny5/1YLz/kbFj+TPerh/zlz5br voF5T/jLFj+TPeqKi/5yr8tyiqaLdHxHqx1+7LY9nk8pBNL/APoaTQP+rHdf8jY8P8my7wtO/wCh pNA/6sd1/wAjY8f5Nl3had/0NJoH/Vjuv+RseP8AJsu8LTv+hpNA/wCrHdf8jY8f5Nl3had/0NJo H/Vjuv8AkbHj/Jsu8LTv+hpNA/6sd1/yNjx/k2XeFp3/AENJoH/Vjuv+RseP8my7wtOb/nKby+oq 2iXQA6kyx4ns2XeFpCSf85b+WlNF0K8f3EkYGVHRnvQt/wChufLn/VgvP+RsWD8me9Xf9Dc+XP8A qwXn/I2LH8me9Xf9Dc+XP+rBef8AI2LH8me9Xg/5m+brbzf531LzFbW72sN96HCCQhmX0beOE1K7 bmOuZeKHDEBLF8sVVtba4urmK1to2muJ3WOGJAWZ3Y0VVA6kk4kq+1PyV/LCHyL5YCXKq2vagFl1 OYUPEj7ECn+WOv0tU+GarPl4z5IehZSrsVdirsVdirzfz15UNpK+qWSf6JIa3EY/3W5P2h/ksfuO cZ252X4ZOWA9B5+R/UXqOye0OMeHP6hy8/2sOzm3eI7RtXutJv47y3O67SIejoeqnMvR6uenyCcf 7Q4+p00c0DGTM/O3k7y9+Z3k/wCruwjnFZLC8oDJbXFNww8D0de4+g56RoNdHJEZIcj+KeJ1GCWK ZjLm+MfM/ljWfLGt3OjaxAYL22NGHVXU/ZdG/aVhuDm9hISFhqSrJK7FXYq7FXYq2CVNQaEdCMKo qLUrhNmo49+v35YMpColNVhP21Kn23GWDMFVlv7Rv92U+YIyYyRVeLq2P+7V+/Dxx70rTe2g6yD6 Kn9WDxI96FN9Ttl+zVvkKfryJzRVDSarIdo0C+53OQOY9FQkk0shq7FvnlJkTzVZgV2KuxV2KuxV sAk0HXFX1N/zj7+Sp0OKLzb5igprEyV02ykFDaxsCDI4P+7XU7D9ke521+oz36RyQ90zEV2KuxV2 KuxV2KtSRpIjRyKHRwVZWFQQdiCDglEEUeSQSDYeX+b/AChNpcrXdopfTnNdtzESfst/k+B/zPDd rdkHAeOG+M/7H9j1vZ3aQyjhl9f3sXzRO2Tfy55ju9Fu/Uj+O3egngJ2YeI8GHY5sez+0J6adjeJ 5j8dXC1uijnjR+roWRfmB+XXlf8AM7y9HMHEOoxI36P1JR8cTdfSlX9pK9V7dRnoui10ZxE4G4n8 fN43NhlikYyG74982eUdf8qaxLpGt2xtrqPdT1jkQ9JIn6Mp8foO+bqExIWGtJskrsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdiq5EeR1jjUu7kKiKKkk7AADFX07+R35Afop7fzP5thDakKSaf pTiotz1WWYd5O6r+z1PxfZwM+ovaKHvmYauxV2KuxV2KuxV2KuxVqSNJEaORQ6OCrKwqCDsQQcEo gijySCQbDzrzV5EltS97pamS23aS2G7p/q/zL+Izju1OwzC54hce7qPd5PTdn9rCdQybS7+9hmc0 71NNB8w32jXXq255QtT1rdj8Lj+B8Dmfoe0MmmnceXUd7h6vRwzxqXPoWZa95e8l/mZ5fNpqEQdk 3jkWi3VrIw+0jb9af6rd87/s/tKGaPFjPvDyGq0k8Mql8+98q/mZ+TXmnyLcNNOhvtEdqQarCp4b nZZl3MT/AD2PYnN9izCfvcdgOXK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqm3lrytr/mbVY9L 0Sze8vJN+KCiovd5HNFRR4scjKYiLKvrD8pPyG0XyWseqamU1LzKRUT0rDbV6iBWH2uxkO/hx3rr s2oMthyQ9VzHV2KuxV2KuxV2KuxV2KuxV2KuxVi/mPyNZakXubOlrempJp+7c/5QHQ+4zR9o9iQz XKHpn9h9/wCt22i7Vni9MvVD7Q851LSdQ02cwXsLRP8Ask7qw8VYbHOM1OlyYZcMxRenwaiGUXA2 p2V9d2NwtzaStDMnR1/UR0I9jkcOeeKXFA1JnlxRyR4ZCw9A0Xzvpeq27afrUccbTKY5BIA1vKrb EMGqBXuG2zsez+34ZKjk9E+/of1PM6zsicPVj9Uft/a84/MX/nF/SNS9XUvJsyabdvV202Uk2jk7 /unHJovluvhxGdXi1Z67umfO3mfyd5m8r331LXtOmsZjXgZBWOQDqY5Fqjj3UnM6MxLkqTZJXYq7 FXYq7FXYq7FXYq7FXYq7FVW2tbm6uI7e1hee4lPGKGJS7sx7Kq1JOJKvavy9/wCcYvMermO+81SH RtPNCLNaNeSD3G6xV/yqt/k5i5NUBy3V9KeVvKHlzyrpi6boVlHZ2w3cru8jfzSOas7fM5gTmZGy hOMirsVdirsVdirsVdirsVdirsVdirsVdiqjd2VpeQGC6iWaJuqOKj5jwOVZcMMkeGYBDZjyygbi aLCtZ/LVTyl0mbj3+rTHb5K/9fvzmtZ7OdcJ+B/X+v5u903bfTIPiP1MN1DSNS06The27wnoGYfC fkw+E/Qc5vUaTLhNTiR+O93mHUY8ouBBR+iebtX0kqkcnrWo628m60/yT1X6MytF2tm0+wNx7j+N nH1XZ2LNuRUu8Mxj8y+UfMlm2n6xbxGOXZ7S9RZImPTZmHHv3oc6zR9u4cnM8EvP9f8AY87qeycu PceoeX6mAebf+cWvJuqc7ny7dy6NcP8AEsP+9Fqa77KxEi19np7Z0WPVnru614/5k/5x0/M/RS7w 2KavbKdpbBxI1O37p+EtfkpzKjqYHyV51qOlanps5t9Rs57K4HWG4jeJ/wDgXCnLgQeSoXCrsVdi rsVdiq5EeR1RFLuxoqqKkk9gBirMvL35OfmVr/BrHQblIH3FxdAW0dP5g0xTkP8AVrlUs0B1V615 U/5xLoyTeatYBAoWstOHXvvPKPvAj+nMees7gh7Z5T/L/wAneU4fT0HS4bRyOMlzTnO4/wAuZ+Tk e1aZiTySlzKshyCuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KrZI45UKSIHRvtKwBB+YOR lESFEWExkQbCQah5D8vXdWSFrWQ/tQHiP+BNV+4ZqdR2FpsnIcJ8v1cnZYe1s8OZ4h5sdvPyxvFq bO8jkHZZVKH7155p83s1MfRMH37frdli7difriR7t/1Ia20Xz7ox/wBDEnpj9mN0kQ/88yT+rKce j7Q0/wBF15EEfL9jbPVaPP8AVV+YIPzTi185eY7cBdT0WZgOssaOmw70IYH782GLtjUw2y4pe8Ah wsnZuCX93kHxITE+aPLWow/V9QgZUfrBeW5ZT232dfvzY4u2cJ58UD5g/ocKfZmWPKpe4pVc/lZ+ Uet8m/QOnSE7sbVRA2/c+gYzm1w63j+iV/Fw54pw+oEJNc/841/lNMax6dPbCtaRXU5+j940mZA1 U2tAv/zi1+WLOWD6igPRVuEoPvjJw/m5qiIP+cZPyqjK87a7m4ihD3Liu3U8OH4YPzU1TrT/AMiP ymsSDF5ehkYd7iSaep27Su69vDInUTPVWWaV5c8vaQKaVplpp4pT/RYI4dv9gq5WZE8yqY5FXYq7 FXYq7FXYq7FXYq7FXYq7FX//2Q== + + + + + + 1 + False + False + + 119.000000 + 118.999512 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Standard-Farbfeldgruppe + 0 + + + + + + Document + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/Shading<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 119.0 119.0]/Type/Page>> endobj 8 0 obj <>stream +H‰tVÉn9 ¼ë+ôM“¢Ökœ`NÁ ÈarHâÃK'ÿLQK/^l¸›¥nq)Õ~ø÷Ñ?|~dÿáã£wώ½Hë›]þ|wÿùߎIŠz\Õ®ŠëŸŸî៯ìþuÏ^<ãW°-’0‹Obö·_ÎÖíº…B,Š»Pãä·X©É¸…²àÍm%Q‹uÞ +Õ¤Çö‰Ù^vüÚyu¼ûq浉»§î ~Ÿ +e”fɧ†´'Ž WÍÇL9ù€(\}N`$.tsW|wU)·²p«T$.GÍ07wÅ÷…K¡ÖütÔùÊ +;Ñvâ»9N8Ó~®µÝzWŸ÷nLl?È.´0$M'óôÜB†š$Ïê«X«?|ó_ŸØÿ}òŸ¾ùÁè{jj¹Áeª&)©ïˆI)*K9¥„¨5¨—FÚÐÐBM”CöIˆ^v1v»@JZĐ0Z¨h]èæ ×ÒÂ[%ÓS¥èBëÖÖדï[¢ßúž¸<.ˆÐPç̅¹´žèxÈ©X£Š­—azÜzyé¤L1.Œ¢ƒš(  ȁ‚V=رÝÜÌϽےtÇîWaªí@jìã1±’ån(!Ùl¾E˘§uwO=½#«fL«‰©ævÿ±¡çÔ­MÌeîR5ú^¯Œ×A=¿Q,@Ùi@™PJ/0ã(™ªÕ“ې‡E¯ý4X®ÆÂÉw0Uæ#Ó7q櫽Iwl¢‘•PN²RjxiЙ]µ¼¤v5¼&8ÐSᛔkçvšRH’°P,Œ^’†NvƘ²iƒfŠ+(‡ö&8Úí½ ÷µÀÓÄË'sŠÂ*‡t^¢ÓNâî· $§ ÆJ6ñη€iŠºW`XÂYbçp/÷%‰öub®õ±áº Omsƒž„]óy̬6çe˜s”èS6^îãwýÐØ¡Q“× +×bgB-uÝæ¹Oý냱Äq²1 rTq•QððB➴W˜úÖ̖@§:¾9šâefÕº“ÑÍê§` +:`Ù/½&œ1¼‘"ܕØÏÃìIÚSœˆÇPiÉÆMÚ("Jí÷é3þaùâþ`I§°™ +endstream endobj 12 0 obj <>stream +8;UT3d1$(!#XdW+I*n)TEYph=lWDIX;+X<'.?nF.`PGr7D'0;'C-cJa))@!lGl10> +SVI*;>8s'Sl1D@Ghoas$iEm@/.&inSS-&a*08^n~> +endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 11 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 5 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (Eclipse_with_icon_3.ai) +%%CreationDate: 6/22/2019 4:28 AM +%%Canvassize: 16383 +%%BoundingBox: 404 366 514 469 +%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentFiles:K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 399.6704 358.1719 518.6704 477.1714 +%AI3_TemplateBox: 639.5 400.5 639.5 400.5 +%AI3_TileBox: 43.1904 129.791 843.8301 705.7915 +%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: 1 +%AI9_OpenToView: 60.5 670.5 2 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 22 0 obj <>stream +%%BoundingBox: 404 366 514 469 +%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 +%AI7_Thumbnail: 128 120 8 +%%BeginData: 22177 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 +%524C45FD31FFCFCFC9C9C2FD04C1C8C8CFCAFD6EFFCACFC8C89FC1BAC098 +%C1C1C9C9FD70FFCAC9C2C1C0C1C0C0BAC1C2C9CAFD0BFFA8A87EA87D7E7D +%A87DA8A8A9A8FD58FFCAC9C1C198C09EC198C0C1C9CAFD07FFA8A8535328 +%2821280028002100220021002821282853537E7EFD51FFCFC2C1C0C1C0C1 +%C0C1C0C8CAFD07FF7D772828212800282828212828282128282821282828 +%21282128002828537DA9FD4BFFC9C2BAC098C1C0C198C1C2CFFD05FFA977 +%4C0028002800282128002821280028212800282128002821280028212800 +%280021002853A8A9FD45FFC9C1C0C0C1C1C1C0C1C0C8CAFD05FF7D532128 +%212821282828212828282128282821282828212828282128282821282828 +%212828280028214C53FD42FFC9C198C19EC198C198C09FCFFD04FFA87721 +%220028002821280028212800282128002821280028212800282128002821 +%2800282128002821280028002100537EFD3EFFC2C1C0C1C1C1C0C1C0C1C9 +%FD05FF532800282828272828282728282827282828272828282728282827 +%28282827282828272828282728282827282828272821284CA8FD3AFFC998 +%C0C0C19EC1C0C098C8CFFFFFFFA853002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%2821280028212200537EFD36FFCAC8C0C1C0C1C1C1C0C1C1CFFD04FF7728 +%002821282828212828282128282821282828212828282128282821282828 +%212828282128282821282828212828282128282821282828002853FD34FF +%C9C098C19EC198C198C09FFD04FFA8282100282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%280028212800282128002821280022217DFD31FFC2C1C0C1C1C1C0C1C0C1 +%C9FD04FF7D21282728282827282828272828282728282827282828272828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828280053A8FD2DFFCF9FC0C0C19EC1C0C198C1C9FFFFFFA828 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%0028212800287DFD2BFFCFC1C1C0C1C1C1C0C1C0C1CAFFFFFF7D28212821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%282828002853FD29FFC998C19EC198C19EC198C1CAFFFFFF522100282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%00282128002128A9FD26FFC9C0C1C1C1C0C1C1C1C0C8FD04FF4C28212828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827FD0428A9FD24FFC9BAC19EC1C0C19EC1BAC2FFFFFFA92828 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800A8FD22FFC9C0C1C1C1C0C1C1C1BAC8 +%FD04FF282821282828212828282128282821282828212828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%28212828282128282821282828212828282128282800A2FD20FFC998C198 +%C19EC198C198C1CAFFFFA921282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%28007EFD1EFFCFC0C1C0C1C1C1C0C1C0C1CFFFFFFFFD0428272828282728 +%282827282828272828282728282827282828272828282728282827282828 +%272828282728282827282828272828282728282827282828272828282728 +%28282728282827FD052800A8FD1CFFCF9EC1C0C19EC1C0C198C1CAFFFFFF +%282100282128002800210028002200280022002800220028002200280022 +%002800220028002200280022002800220028002200280022002800220028 +%00220028002200280022002800220028002800282128002800A8FD1BFFC1 +%C1C0C1C1C1C0C1C0C1C9FFFFFFFD04282128282821535353525353535253 +%535352535353525353535253535352535353525353535253535352535353 +%525353535253535352535353525353535253535352535353525353535253 +%282821282828212828A9FD19FF9FC09EC198C19EC198C0C8FFFFFF520000 +%282128002800217DFD43FFA828002800282128002827FD18FFC9C1C1C1C0 +%C1C1C1C0C1C2FFFFFF7D28212828282728282800A8FD44FF282827282828 +%27FD0428FD16FFCAC198C1C0C19EC1C0C09EFFFFFF7E2821280028212800 +%2821227DFD43FFA8280028002821280028212153FD15FFC8C0C1C0C1C1C1 +%C0C1C0CFFFFFA9280028282821282828212821A8FD44FFFD042821282828 +%212828287EFD13FFC998C19EC198C19EC198C8FFFFFF5300280028212800 +%28212800287DFD43FFA828002821280028212800280028A8FD11FFCFC0C1 +%C1C1C0C1C1C1C0C1CFFFFFA800282728282827282828272821A8FD44FFFD +%042827282828272828280077FD11FFC1C09EC1C0C19EC1C0C0C9FFFFFF21 +%282128002821280028212800287DFD05FFA85352534C5352534C5352534C +%5352534C5352534C5352534C5352534C5352534C5352534C5352534C5352 +%534C5352534C5352534C5352527DFD05FFCB280028212800282128002821 +%2800A8FD0FFFC9C1C0C1C0C1C1C1C0C1C1FFFFFF53282128282821282828 +%2128282800A8FD06FF002821280028212800282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%280028007DFD06FF2828212828282128282821FD0428FD0FFFC198C19EC1 +%98C19EC198CAFFFF7E2800280028212800282128002800217DFD05FFA828 +%002821280028212800282128002821280028212800282128002821280028 +%21280028212800282128002821280028212800282128002177FD05FFA828 +%002800282128002821280028210053FD0DFFC9C0C1C1C1C0C1C1C1C0C8FF +%FFFF53212827282828272828282728282800A8FD06FFFD04282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827282828272828282728007EFD06FF28282728282827282828 +%272828282128A8FD0CFFC1C09EC1C0C19EC1C0C0C9FFFFA8002821280028 +%212800282128002821227DFD05FFA8280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800227DFD05FFA8280028002821280028212800282128 +%007DFD0BFFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828212828282128282821 +%282828212821A8FD06FF2828212828282128212821282828212828282128 +%282821282828212828282128282821282828212828282128282821282828 +%21282828007EFD06FFFD042821282828212828282128282821FD0BFFC198 +%C19EC198C19EC198CAFFFF7D28002800282128002821280028212800287D +%FD05FFA82800280028002853280028002821280028212800282128002821 +%280028212800282128002821280028212800282121527D00280028210053 +%FD05FFA8280028212800282128002821280028212152FD09FFCFC0C1C1C1 +%C0C1C1C1C0C8FFFFFF532128272828282728282827282828272821A8FD06 +%FF282827FD0428FF7E282128282827282828272828282728282827282828 +%27282828272828282728282827FD0428FF7D2827282828007EFD06FFFD04 +%282728282827282828272828282128A9FD08FFC1C09EC1C0C19EC1C0C0C9 +%FFFFA80028212800282128002821280028212800287DFD05FFA828212800 +%282128A8FF53210028212800282128002821280028212800282128002821 +%280028212800282128002828FFFF7D00280028212177FD05FFCB28002821 +%28002821280028212800282128007DFD07FFCAC1C0C1C0C1C1C1C0C1C1FF +%FFFF53282128282821282828212828282128282800A8FD06FF2128282821 +%2828FFFFFF53282128282821282828212828282128282821282828212828 +%28212828282128282827FFFFFF532828282128007EFD06FF282821282828 +%212828282128282821FD0428FD07FFC998C19EC198C19EC198C8FFFFA828 +%0028002821280028212800282128002800217DFD05FFA828002821280028 +%A8FFFFFF2821002821280028212800282128002821280028212800282128 +%00282128002800A8FFFFFF7700282128002177FD05FFA828002800282128 +%0028212800282128002800217DFD06FFFD04C1C0C1C1C1C0C1CAFFFFA800 +%282728282827282828272828282728282800A8FD06FFFD0428272828FD05 +%FFFD04282728282827282828272828282728282827282828272828282728 +%21A8FD04FF532828282728007EFD06FF2828272828282728282827282828 +%272828280077FD05FFCAC198C1C0C19EC1C0C19FFFFFFF4C282128002821 +%280028212800282128002821217DFD05FFA828002821280028A8FD04FFA9 +%21282128002821280028212800282128002821280028212800282128007E +%FD05FF770028212800227DFD05FFA8280028002821280028212800282128 +%0028212821FD05FFC9C0C1C0C1C1C1C0C1C0C8FFFFA82800282128212821 +%282128212821282128212800A8FD06FF28282128282821FD06FFA8212828 +%2821282828212828282128282821282828212828282128007DFD06FF5328 +%21282828007EFD06FF28282128212821282128212821282128212821227D +%FD04FF9FC09EC198C19EC198C0C9FFFFFF7EA87EA87EA87EA87EA87EA87E +%A87EA87EA87EA8A8FD05FFA828002800280028A8FD06FFA2002821280028 +%2128002821280028212800282128002821280053FD07FF7D002800282100 +%53FD06FFA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA8FFFFFFCFC1 +%C0C1C0C1C1C1C0C1C1FD1FFF282827FD0428FD08FF7E0028272828282728 +%28282728282827282828272828280053FD08FF532827282828007EFD1EFF +%CA98C1C0C19EC1C0C198C8FD1EFFA828212800282128A8FD08FF7D002800 +%28212800282128002821280028212800280028A8FD08FF7D002800282121 +%77FD1BFFA8FFFFC8C0C0C1C1C1C0C1C1C0C8FD1FFF21282828212828FD0A +%FF530028212828282128282821282828212828282128A8FD09FF53282828 +%2128007EFD1EFFC898C198C19EC198C198C9FFFFA8FD1BFFA82800282128 +%0028A8FD09FFA85200280028212800282128002821280028002821FD0AFF +%7700282128002177FD1BFFA8FFFFC1C1C0C1C1C1C0C1C0C1CAFD1FFFFD04 +%28272828FD0CFF4C00282828272828282728282827282828214CFD0AFF53 +%2828282728007EFD1DFFCAC1C0C19EC1C0C19EC1C1FFFFFFA8A9A8FFA8A9 +%A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FF7E28002821280028 +%A8FD0BFFA8280028212800282128002821280028534C21FD0AFF77002821 +%28002853FFA8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8 +%FFA8FFCFC0C1C1C1C0C1C1C1C0C8FFFFFF4C282821282828212828282128 +%2828212828282128282821282828212828282128282821FD0DFFA8280028 +%2828212828282128282853FF2828FD0AFF53282128282821282828212828 +%2821282828212828282128282821282828212828282128A8C8C098C19EC1 +%98C19EC0A0FFFFA800280028002800280028002800280028002800280028 +%0028002800280028212800280028A8FD0DFF7D2100282128002821280022 +%28FFFF4C21FD0AFF7D002800282128002800280028002800280028002800 +%28002800280028002800280028007EC9C0C1C1C1C0C1C1C1C0C9FFFFA228 +%282827282828272828282728282827FD1428FD0FFF7DFD0A28FFFFFF2828 +%FD0AFF53FD1528272828282728282827282828272853C1C09EC1C0C19EC1 +%C0C0C9FFFF7E002821280028212800282128002821280028212821282128 +%212821282128212821282128A8FD0FFF532821282128212827FD04FF5221 +%FD0AFF7D0028212821282128212821282128212821280028212800282128 +%00282128002821280053C8C0C1C0C1C1C1C0C1C0CFFFFF7D222128282821 +%282828212828282128282821282828222828282228282822282828222828 +%FD11FF52282828222828A9FD04FF2828FD0AFF5328282822282828222828 +%28222828282128282821282828212828282128282821FD04289FC19EC198 +%C19EC198C1C9FFFF53002100220021002200210022002100220021002800 +%220028002200220028002821280028A8FD11FF2828212800A8FD05FF4C00 +%FD0AFF770028212800280021002800220028002200220021002200210022 +%00210022002100220028C1C1C1C0C1C1C1C0C1C1FFFFFF7E7D537D537D53 +%7D537D537D537D537D537D537E537D537D537D537D7777FD0728FD08FFA9 +%FD0AFF28282153FD06FF2828FD0AFF53FD062853777D537D537D537D537D +%537D537D537D537D537D537D537D537D537D539EC1C0C19EC1C0C198C1CA +%FFA8FD1DFFA828002822280028A8FD07FF28A8FD09FFA9282252FD06FF4C +%21FD0AFF770028222821227DFD1DFFC1C0C1C1C1C0C1C1C1C0FFFFFFA8FD +%1DFFFD0728FD08FF5328FD0AFFA80053FD06FF2828FD0AFF53FD0528007E +%FD1DFF9EC198C19EC198C19EC1CAFFA9FD1DFFA828212800282128A8FD07 +%FF282228FD09FFA2284CFD05FFA84C22FD0AFF7D00280028212277FD1DFF +%C1C0C1C1C1C0FD04C1FFFFFFA8FD1DFFFD0728FD08FF5328284CFD08FFA9 +%2253FD06FF2828FD0AFF77FD0528007EFD1DFFC0C19EC1C0C19EC1C0C1CA +%FD1FFFA828222821282228A8FD07FF2828222252FD07FF7E2852FD06FF53 +%28FD0AFF7D0028212822227DFD1DFFC1C1C1C0C1C1C1C0C1C1FFFFFFA9FD +%1DFFFD0728FD08FF532228282853FD06FFA80053FD06FF2828FD0AFF53FD +%0528227EFD1DFF98C19EC198C19EC198C1CAFFFF7D284C2852284C285228 +%4C2852284C2852284C2853284C2853284C28532828212822280028A8FD07 +%FF2828212822227DFD05FFA2224CFD06FF4C21FD0AFF7700282228212828 +%532853284C2853284C2853284C2852284C2852284C2852284C2852284CC8 +%C0C1C0C1C1C1C0C1C0CFFFFF532221282128212821282128212821282128 +%212828282228282822FD0A28FD08FF5322FD0528A8FD04FFA92277FD06FF +%2828FD0AFF53FD0728222828282228282822282828212821282128212821 +%28212821282128289FC1C0C19EC1C0C198C1C9FFFF7E0028002821280028 +%21280028212800282128222828282228282822282828222828282228A8FD +%07FF2828222828280028A8FFFFFFA8224CFD06FF4C22FD0AFF7D00282828 +%222828282228282822282828222821280028212800282128002821280028 +%0052C8C0C1C1C1C0C1C1C1BAC9FFFF7D2828282128282821282828212828 +%2821FD1428FD08FF53FD0628224DA9FFFFA92253FD06FF2828FD0AFF77FD +%1528212828282128282821282828212853C2C098C19EC198C19EC0A0FFFF +%A80028212800282128002821280028212800282228222822282228222822 +%28222822282228A8FD07FF28282228222822280053A8FF7E2852FD05FFA8 +%5322FD0AFF7D002822282228222822282228222822282228002821280028 +%21280028212800282128007DC9C0C1C1C1C0C1C1C1C0C9FFFFA828212821 +%282828212828282128282821FD10284D282828FD08FF532828284D282828 +%4D2253FFCB2253FD06FF4C28FD0AFF7728284DFD0E282128282821282828 +%212828282128282821287DC9C098C1C0C19EC1C0C09FFFFFFFFD04282728 +%2828272828282728282827FD0F2822282228A8FD07FFFD04282228282822 +%28007DA82853FD06FF5328FD0AFF7D012822FD04284CFD0A282128282827 +%282828272828282728282821A8FFC1C1C0C1C1C1C0C1C0C1CFFD1EFFA9FD +%0728FD08FF5322FD0A28532277FD06FF2828FD0AFF53FD0528227EFD1DFF +%CAC198C198C19EC198C19ECFFFFFCBFD1BFFA828222822282228A8FD07FF +%282822282228222822282228222852FD06FF4D22FD0AFF7D002822282228 +%7DFD1EFFC2C1C0C1C1C1C0C1C1C1C9FD1FFF28292828282928FD08FF5328 +%4D2828284D2828284D28282277FD06FF284DFD0AFF53FD04284D227EFD1E +%FFC9BAC19EC1C0C19EC1BAC8FFFFA8FD1BFFA828222828282228A8FD07FF +%282822282828222828282228282853FD06FF4D22FD0AFF7D002828282228 +%7DFD1EFFC9C1C0C1C0C1C1C1C0C1C1FD1FFF2828284D282828FD08FF5328 +%28284D2828284D2828284D2853FD06FF4C28FD0AFF7728284D2828017EFD +%1FFF9EC19EC198C19EC198C1CAFFA8FD1BFFA828222822282228A8FD07FF +%FD04282228282822282828222853FD05FFA85328FD0AFF7D012822282822 +%77FD1BFFA8FFFFFFC8C0C1C0C1C1C1C0C1C0C9FFFFA87E7D7E7D7E7D7E7D +%7E7D7E7D7E7D7E7D7E7D7E7DFD07FF2829284D282928FD08FF532829284D +%2829284D2829284D2877FD06FF4D4DFD0AFF7728284D282922A2FD06FF7E +%7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7EA2FD04FFC9C0C0C19EC1C0 +%C19EC0C2FFFFFF00000022002100220021002200210022002100227EFD05 +%FFA8FD0728A8FD07FFFD0E2853FD06FF5328FD0AFF7E22FD05287DFD06FF +%28002200210022002100220021002200210022007EFD05FFC0C1C1C1C0C1 +%C1C1C0C1CFFFFF5300282128282821282828212828282128282800A8FD06 +%FF28292829282928FD08FF53224D2829284D2829284D28292277FD06FF28 +%4DFD0AFF53282829284D227EFD06FF282821282828212828282128282821 +%2828282128FD06FFC298C19EC198C19EC198C9FFFF7D2200280028212800 +%28212800282128002800217DFD05FFA828222828282228A8FD07FF282822 +%282828222828282228282853FD06FF4D22FD0AFF7D0128282822287DFD05 +%FFA82800280028212800282128002821280028212152FD06FFC9C1C1C1C0 +%C1C1C1C0C1C2FFFFFF28282728282827282828272828282728282800A8FD +%06FF284D284D284D28FD08FF53284D284D284D284D284D284D287DFD06FF +%4D4DFD0AFF7729284D284D227EFD06FF2828272828282728282827282828 +%2728282800A8FD07FF9EC1C0C19EC1C0C198C1CAFFFF7D00280028212800 +%28212800282128002821227DFD05FFA828222928282229A8FD07FF4D2828 +%292828282928282829282853FD06FF5328FD0AFF7D0129FD04287DFD05FF +%A828002800282128002821280028212800280028FD08FFC8BAC1C1C1C0C1 +%C1C1BAC9FFFFA8282828212828282128282821282828212821A8FD06FF28 +%29284D282928A2A2A87EA87EA87E532829284D2829284D2829284D28537E +%A87EA87EA828297EA87EA87EA87EA87EA85328284D2829227EFD06FFFD04 +%2821282828212828282128282821287DFD08FFCAC098C19EC198C19EC09F +%FFFFFF4C22212800282128002821280028212800287DFD05FFA829282822 +%292828222822282228222822292828222928282229282822292828012822 +%2822282828012822282228222801282828222928287DFD05FFA828002821 +%2800282128002821280028212821FD0AFFFD04C1C0C1C1C1C0C1C9FFFFA8 +%2128272828282728282827282828272821A8FD06FF2829284D284D284D28 +%4D284D284D284D284D284D284D284D284D284D284D284D284D284D284D28 +%4D284D284D284D284D284D284D284D22A2FD06FFFD042827282828272828 +%2827282828007EFD0AFFCA98C1C0C19EC1C0C198C2FFFFFF530028002821 +%28002821280028212800287DFD05FFA84D28282829282828292828282928 +%282829282828292828282928282829282828292828282928282829282828 +%29282828292828282928287DFD05FFCB2800282128002821280028212800 +%280028A8FD0BFFC2C0C1C1C1C0C1C1C1BACFFFFFA2282828212828282128 +%28282128282800A8FD06FF22292828222928282229282822292828222928 +%282229282822292828222928282229282822292828222928282229282822 +%2928282229017EFD06FF2828212828282128282821282828212877FD0CFF +%C9C098C19EC198C19EC09FFFFFFF28222128002821280028212800280021 +%7DFD05FFA87D537E537D537E537D537E537D537E537D537E537D537E537D +%537E537D537E537D537E537D537E537D537E537D537E537D537E537D5377 +%7EFD05FFA828002800282128002821280028212821FD0EFFFD04C1C0C1C1 +%C1C0C1C9FFFFFF282827282828272828282728282800A8FD44FF28282728 +%28282728282827282828007EFD0EFFCF98C1C0C19EC1C0C198C1CFFFFF7D +%00280028212800282128002821227DFD43FFA82800280028212800282128 +%00280028FD10FFC8BAC1C1C1C0C1C1C1BAC9FFFFFF4C2128212828282128 +%2828212821A8FD44FFFD042821282828212828282128A8FD10FFCAC198C1 +%9EC198C19EC198CFFFFF7D280028002821280028212800287DFD43FFA828 +%00282128002821280028212152FD12FFC9C1C1C1C0C1C1C1C0C1C1FFFFFF +%53FD052827282828272821A8FD44FFFD04282728282827FD0428FD14FF9F +%C0C0C19EC1C0C19EC0C9FFFFFF2822002821280028212800287DFD44FF28 +%0028212800282128002800A8FD15FFC0C1C1C1C0C1C1C1C0C1CAFFFFA921 +%28212828282128282821535353525353535253535352FD0453785378537E +%5377537E5377537E5377537E5377537E5377537E5377537E5377537E5378 +%537E5353525353535253535352535353525328282128282821282828007E +%FD16FFC998C19EC198C19EC198C1FFFFFF7E002800282128002821280028 +%002100280021002800210028002100282229222922282229222822292228 +%222922282229222822292228222922282229222800280021002800210028 +%002100280021002821280028212800280053FD18FFC9C0C1C0C1C1C1C0C1 +%C0C8FFFFFF7D002828282728282827282828272828282728282827282828 +%27FD04284D294D2953294D2853294D2853294D2853294D2853294D285329 +%4D284D282821282828272828282728282827282828272828282728282827 +%282152FD1AFFC8BAC19EC1C0C19EC1BAC9FFFFFF53002821280028212800 +%2821280028212800282128002821280028212800FD04284D2829284D2829 +%284D2829284D2829284D2829282928280028212800282128002821280028 +%21280028212800282128002821280028A8FD1AFFCFC1C0C1C0C1C1C1C0C1 +%C0CFFFFFFF52002828282128282821282828212828282128282821282828 +%2128282821FD042829284D284D294D284D294D284D294D284D2828212828 +%2821282828212828282128282821282828212828282128282821282128A8 +%FD1CFFCAC198C198C19EC198C19ECFFFFFA8280028212800282128002821 +%280028212800282128002821280028212800280028002821280028222822 +%282228002821280028002800282128002821280028212800282128002821 +%28002821280028212800287EFD1EFFCAC1C0C1C1C1C0FD04C1FFFFFFA84C +%002827282828272828282728282827282828272828282728282827282828 +%272828282128282821282828212828282728282827282828272828282728 +%2828272828282728282827282828272828282128A2FD20FFC9C098C1C0C1 +%9EC1C0C09EFFFFFFA8520028002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002800287DFD +%22FFC9C1C0C1C1C1C0FD04C1FFFFFFA95300282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%280028A8FD24FFC9C198C19EC198C19EC09EFFFFFFA85300280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%28212800280028A8FD26FFCAC1C0C1C0C1C1C1C0C1C1CFFFFFFF7D002828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827280053FD29FFCAC1BAC19EC1C0C19EC1C0CAFFFFFF7E2128 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128007DFD2CFFC8C0C1C0C1C1C1C0C1C0C9FD04FF2828212821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%2828A8FD2EFFC998C098C19EC198C198C8CAFFFFFF532800280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%2800282128002821280028212800282128002821280028002128FD31FFCF +%FD04C1C0C1C1C1C0C8CFFFFFFFA853002828282728282827282828272828 +%282728282827282828272828282728282827282828272828282728282827 +%2828282728282827282828272800287EFD34FFA0C0C0C19EC1C0C198C1C9 +%FD04FF7E2722002800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282121 +%007DA8FD36FFC9C1C0C1C0C1C1C1C0C1C1CFFD04FF532800282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%28212828282128282821282828002853A9FD39FFCAC99EC098C19EC198C0 +%98C9CAFFFFFFA87D21210028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002100537EFD +%3EFFC2C1C0C1C0C1C1C1C0C7C9FD05FF7D53002821282828272828282728 +%282827282828272828282728282827282828272828282728282827282828 +%002853A9FD41FFC9C8C0C098C1C0C198C0C1CAFD04FFA8A8522800280028 +%002821280028212800282128002821280028212800282128002821280028 +%21280028287EA8FD45FFCFC8C1BAC1C0C1C0C1C0C8C9FD05FFA87E522821 +%280028282821282828212828282128282821282828212828282128212800 +%28287EA8FD4AFFCAC99FC198C098C198C09FC9CAFD05FFA8A8534C002800 +%210028002800280028002800280028002800220022004C527EA8FD50FFCA +%C9C1C1C0C1C0C1C0C1C2CFFD08FFA87E5353FD06280028212821FD042853 +%537E7EFD58FFC9C9C1C198C0BAC098C1C2CACAFD09FFA8A9A8A87E7E7DA2 +%7EA8A2CBA8FD60FFCFCFC8C8C1C1C0C0BAC1C1C9CAFD78FFCACAA7C9C2C2 +%9FC1C1C8A0CACFFD40FFFF +%%EndData + +endstream endobj 23 0 obj <>stream +%AI12_CompressedDataxœì½×vúȳ0z®g-¿8ƒDNÆD 6Ø`œˆ`‚°$&]|Osžá»:wûÅNw+ %Âoïùï5ãõó`Ԫꮮ®ÔUÝÎv'XÑ* aŽ“ß..Ê Er4“q ¯׋ņåø•çÁëÀ! ¶*^§úBËÅ°3z•AÏBQø”€ï{ÊSfÆr3rå ¨%häux¼ðiwÆ-(ð¼:\ÌÖ,ÕÿcÆMû³!½êGCäÌ+u­h™G"ᆧ±L$å(Þ¢&äêw’egSs4…—èÍj4[MJôŸG ‹9¢‰„#ŽÇ±D>¯Ï(VÛ(ObQØ2O¤b y4”LbqðN +|ˆÅà‹z¸YR+®ÍÐCŠeËô‚f،£üÝ-9OHÇ µXÐ8J r8W¾CÐ+´%6܆!KÝ`"ÿKÙàŽ¢FÔȲ1[Pl¦‘y÷D3svM©÷Ņ–ô„!ÙÙ2´^l&³UhÀh”ï ùG _}G4þc:ã(@g¹xïC `º–$çÀ#hn‹×x¤_ÚÌ£»Ír@™L¤qô}´ÆýȂƒ±ÃÏèûdÿz ¾êP‚1 y¨•”ÔߢÏ[L02sjõá!3ô~ގ¦Ó¡DN^<“`ÚãxŠÿ&–LÂobÂK]j¹^A3™ˆ¦C`Ò0 üV|›‚qò ái +¤CÉ4îH/RQ w€)‡_ˆ/È3Ný>£þÈ8îè%­Èpžñbÿ[xô°YPÌãj§2¾KóT»¥GÔ¼!ƒ $"úÁåßB‹.ÉL(ð+½Øph¥$,`fšä_dA\@ÒZS«.ÝC]M $áƒ5“Žƒ§Ž8@ƒ'$´¸ü[!A8"†$œÍ6˜à3œ•»˜ìטÙHžõdđâ¡a„RŠiñŸÐ[0vŽ£Vb÷Ǖoüƒ…n[ku5*ÓK8 ,ZÞÀ˜jAO„§òè±YŸüövò[4þÙÐň ʑN„ÁòøӞ +W7 íÀ£˜¢Å€d©ðLÓlÅ;ð߁5 ÖÚ  ÈɄb„ÿçááŒ<2^P†×ÃMé Ö\¸3$zž€%„`/¨1nU›ÄyØð }$rJÔTüƒ4؀o¹0µ‘ì4L-Ñÿ8°:©0Ë# +.ŒÕ å_¦©ðˆÒÈIÀéðËhF1`Ĭ#Œ$œ±ðpÃ0Ôjøø#04X–¬l<‘ +‹íÃCzý—“©ål5[×“‘0 ÿlH.V4žþµžR«0¦‚C£Fá%9„Ýd“¢‰onØ0÷ÍnÑf4æ¦ EI‘à G…—À®Ñ0ún4ó  ©Ñl± $°¥7@‡–$;Ü,PR)øðgC2àøqJ.Æ<áKց§#á"âªÈc,*f³ÈÓ·(¾.VÃe¡ á*z=\E/(UÅëUé½k¾Õ5âZÑæZjSå¦á;„€iñ/´øZŠZ|ŸZÒ{Ë͂›­…[ìòÄ£8 GþåGÅˏÒ[/üÃî”f·@1¼¬Æ†I1)Ž‡T¼Mò¨I ‰ÈARá¡HŠâ¡SòË%½7ã[ÍøV3Š™Ô†äXñi¾9-ö‰V¼@ M¤÷F³ßgð žþÕ i£êÏFzç/þ1‡ˆñ—øõÉoÝ*/ +ã7ý. ´€BøGûHÐTWCj׌£¯VØ[úû-¬iÖ¼À âîë ‚dšÛÑe6T÷¯µ¨uâ>èIŸC+ênž¥úm¤ôk ½Y_¯ÆôÉoÞ|ëQC`¢]5r´ßà`„Ý‘Ãé„ú›š §Àp XG |/µÖÁÚkp†rðOÁ»èOðÿ1ü¿÷+ÔX2þÛú{4òn|²”û{I6 ð´ºúZÐkʸÕñD2k;(Ú rE2ô@Ä „븆b…œs³ßK š3 #Ú$ ¯- @˜¬ÕÐK¨›YÅ#[¨Hn +LK X zª60‹›Õd‹bh |{;à;-ôbÆ.%àÊo¤Ï6{ +Ⱥj­ø.3vêèÒôB‚|»Êa=[±ÔBÓk`ñïý£IõÀÅó¢LSˆÅõt6ÔÃÒžg”.2ƒ÷mq×M•ÖΚú{F.t1n¿öC&ð ¨| ; „€i›Î$7œ:š3à°13ÊbµÂÉÏV#ÐÑÎ8r8h(O(–âþ怀âŠð¡xA‡ºF©N‚A`ó9J+¥º©1Pë¯8à®?®Vä葉ð•#€t¿ú,â(!ž;ù­­ÆÀOü$ªÉj +üKƒßiðS¬–пRµŒ~*èþGü'üàèNDÀpˆ(ø”ÿKþwò[áC­#¨E”ˆ¡Ÿ'’à'A¤Àï4ø–~…O)ô©ˆ~—ÀoñðY„'b;á-žÆKx¯‚.à‘H$IDR‘t¤)Gª x4EãQ¤HG‹ÑR´‚Ç"±X,KĒ±T,+Ÿ +ø©ÆwÇâÀm‹Gã±x<žˆ'ã©x:^ña1 4Àà'‰¥°4V?%¬ŒU‘0<‚Gñ8ž€ž3^ýªàÕ‰Fâ¨_r¯¢ W°On´ z„¡%@oŠ±2ßèaü€ÎÄàà5Ð2F€Ç0Hâ(˜`0¦ +€R£+1ÁHSà' ~à ¾p‚Ž| ‹Q,ŠÁI½©F*à§,âÛz ¾‡Þ?Ê7åwÁÛà§~Šè' ~Rà' N~#O€ñÃØuü'âK¥RÉT"OÅ@—#)<…V©&+Ér²”,&ÓÉT2™L$ãÉèX$‰'±‘¨$ʉR¢˜H'R‰d"‘ˆE<çÌ^‰—ã¥xÌ\ +Ì`"GøbŽ‹~‰AK¸Ã±d2…~1hL‚Ñx$‚AO4 Üôð±â1ø Ž¨ñ€kïH@w>…0;`Ýö²ÄÂBÚ¤#\ N)ø€¥Sq~ƒá‰d$>D’©X‡ð8 ø׀Ã<DØ¿REe¢¨2·–£öœžtûW´ý+Úþmÿ}¢-• EŽ.ÜÐcŠ·(ÄqtÇCµ#æL­4}#í_Aö¯ ûWý+ÈþsYTWEÿdÿ +²Ù£ K€ÖǗdêÿQ¦W³ØÀIóÏ`^÷ׂ‚»ÍýÇ +ýåÈÀpãŠ^yá; ý¸k‰v¤çá2½\üb¶€QLøJyJÎV¾ ÿµm5……6î ÷fìl°à–Hv6T@·ø˜£í쾯ˆN¢0£#Ì0aŽ‰ØqZ¥!ԕÙ&9Ì_Ž &Í=PCšQÏ£)ÑôÂá©þÉ1ä{\­á 5ò§˜ø´Ëë2½úb¸ò†åè%ÿ8„ÅáŠZtÁ›]zA1äjH‰®*ñÀTr% EÔoMgÃùŠbÙm”ÀÈò ¤žn÷Czô@-éß©6 úÁCÃ1S›¡†3˜M%ôAêÂíìO᫘v,"pùÛ[òO遧>[ý½Ã}µ Üá +w8¸yëðTfìzAþÅÿ¹ £ˆ6§Ð÷YšGöä70£$á Óa¸Gç1è =§vA-FxՒ—Â|CaåH™7˜ãù/8¯7àÓ7ø[ÇÛ杀‡ð!øÿ§Ǝ¬Pã€eB*í(oŒ63ÎÞÍAÁ±ïDqsÚ@pÇ¡ŒI½^Yªú;µjFÆô21ÚÓ<␼=Ƭ« ÂtP0KäOjˆ’¹ø‡„¾¬wàÉT*­”øÙr½%>æhñ„Ó¸pÇ3 ¿ÙaÖp~ÖÐ~·­¥±uЯÑAøÿ°‚É‚Àúÿ…Š¨3œ®f‡ö(˜½ó¯:úWý«Ž,ÕQ䢎Òø/þÿc«û_ÅÖKû[zGUÿã«øŸbT¦#ÿ®âÿäUüŸ§@ÿ7­âÿi]üÒjD2£}\C8µ¡d‹Àg"™N¤¢è‰ È(†'b"wò%qc_…7««‘"¸i%m“ ŠƒIÿ{{`¿ßÚò2Dç¿!é´ugí!øW’{#áÜ-Xۜ±œzf¶ÇÌ·Ù38ŒcüC> ‚úÄï0í·F„^‹em’#a`<,~þ©Xè‹çÛæ=¢ gž?—‹h$9à» 6Å;” q‘aÈÿV0G¢h7œG•¡VB«ˆà¥‹á/î¯5%<ö¸Vlÿw’a³ +ÏVÙöwr±‘ìAC¸Ë)´zêÿü'0G(;TZÐÃ9 ²Ø “Ø4ðà`†êoq;ƒ<Ó¡¸;4U6?&SNܜ(öH1#~¶µ2ìÌôÿ8#ì.2¿Û °í?ƒáá8‡(Öø¿”E3, .¨CÁ:´Ï©ÿëtèŸÖŸÿ]K™ÿñàïÿIÎ.fÃÿ=bÇÒ¡†EÄ] Ãaÿ1qS[ó.´üGHo‹€á%pËáM)x +€­ñ‰Mÿ”Îw±à_¶Æö×?dXÒù5VÃúӞ(ú‡ KÚ¨4π急ѤÆ,‰­ám¿ô1*´ìÐfH¡ŠþVPvÿˆ~,)ŽsëIܙ³‘3±ÅsŠÖüëXCÿ9Ä +0^­ÏÞ)Ñ>¿/Héi ½.2ÉÇìõlí2M¦ã8pR +Çc¡T$%lð£4Z:°HµD|–ü-ÉÌÅ®_Qâãj6ã;­pD%ýÑ.>_I‡7IÇ9É]x ]úÇÎw§M³38ô8"ÊnñD(ñü'û pyP¼@¹f‹ 7 IfT¡Æäf¡v£ÅIÛ êŠ¤Ö’7*¥K¬ÉÑH‹hI²s™*üwìšæ´íÈÅL”5IQ*ŽÖ³(à…¯†ô‚‘™ªxí(n8Úñ@Â#fSZ¨Åkwˆœç˜¯èáœÞpŽ _unÖvÆÒðL-dž®Åd Uë´cM®)ÆÁΖ›:§M³ÎaR  cO¿ÒH}؀cÈ»&ù£‡&Ìlä`åqÀÔé”!4Gônc»í„¡¤Õo٘‘"H‰x<7nŠ+û`ÙVÙËÆrÐÉvRS1V˟}בɅ«¦²ÍP,ÅüN9ºÔŸ:v€Ì3NddÏÛíŒãÀ²§ÿõÙÍjò±½®0)>ŒÎÖrwÙGX8‡rñÇ¥DV8¬[ŠJ ŠØÄ!Ÿf&®lLõJkí—Z¼„IÙî_“\M6ä„r´éµ‚Óƒq‘Bô)Ž`'™õ(!á晹š±S@ô‚¦‡‡âŽTOˆ)Qfð ù O¡¡ÊÔbQý““•€8ãWÐ6šµGr"‰Sxv ™Žá;u K¯UãàÁ¤b;‚)!ûI)‘Dx€¶ éR©*۔…܎„•ÕÜõjDýÙ¡€*íø1cX+DˆyLfÐè=iHǘx ØAó.AٞödßaÚ! ÝYWÊ-Ì1–dËZ”`ôï³f¤,Eè§*V¿òɌàïè+ǀ\H©•Æhà9š@èÂXޟxj-Åa<üi¦ +Ól^¼&6‹…(o„cOÁSQ”E’‰¤Ù²®)T€éú/éëݶ’ª…¯nÃ֚Ê* 7mLC +.eÙNíVë”aW m ¨ LKN1?»±%\¢ygƒöhA*HjÙÖIQC5I#0»²oIDð˜ÉúWrH<•Ná&m#Rr {“+nææ%)1u2>G,•Òøз>G]±ñ$ÀO§`Žè·~Rį`€åÄ É…•„G§*x߄v¦ yúªY²˜Ññ˜¥$ádÈôP딁“ÎIse¾öT*jØ‚Uu&Pá¸T@#Æ4¨Ã3ýè•jjcñT҈!4²JWz¹É¢L'Öfkؤ"ƒE£Ñ0Ì"±Pl á£>¯IÞ°$ˁᑞí +³Î€`PYº"—©ÚV— + EnP™Â…@x|ꖏ£jö4 §Û eãVÕº³.Cç=?@Q&¿‘…íå $Ï¹•¡$PªÒ­h$øRõµØOòM$DODá‚DÀÙ5s;ÔâzÆPî¡Ü“G®4Ä2ÔýeA÷?¨tÿVۖÀ»CNW5ëÊ,ž”ý<¾ OÖ0Ö¦£¤5STm[ZãÇÁpGµÝفb°µÉx˜6iÆ7¶&šºÕøF6É&@Ü2•±‹-[•ŽÙ +Ù0b$EÔ,–œLë°,ӃÐø ð?µÛjQ“‹…E3v>[À@ça¦mÇðµ?°‹ŒEÓ!½XÈ>…gÛå×¾ †&v–øŽbKSK@ŠßÐx–¡RÙ&ÅÕY&=†Ã£(uHr«»,·øðêµD8 ’À÷„A^;/­GKðx±²ß¯õÈ>x>íB~Eoþ×kFhgÒØHè€h…¤ã!iÓSÛT¹ƒ™Æ{ʨ¡j+0JBœÁ›BðtQe…ҍ9ZŒóÄSqKЌ¢#),’kÞôÛó[FâTT6Ìpêè2Ôl$+ Ôl5£Î|† °•Jún#jÉiÜJEK`´Ò˜5§m·Å¨ +×Zˆ—ÅÎ&+=ý¯++Â>—)LÔVv’ì`Æ-ɵ} §ž˜í±/˜\¹M†|©%Œï› 6•”Ï^"j¼ˆnsfÖ;¼]D'ü©m9ÚyJ3‹‹Á ÙZØ1e „x2gF¡‘˜€¦0wµÍXèùIÐ,þn1Rv¸^ ÿ2c|£áj+Z§mÄoA¹Åa0J0e rmƒBC³¬'ËyˆZÁÜ(Sq ›±Rå€%/£ö¼|W,;/UÀÁh±3Šªã­¶@âAcM#¨ô;h=Â!C¯­Ú@»jl«vü½ŒÕZáñ­–É°fS*ÈH¥R²ÑšSŽËª±R)éë#Øݏ£é‰ÖrOl4VöDoeW\h´°ˆ|£53¦W¦â¶c3,…Fôf‹Ãý23–A“Á Zf“ΆVԄT윴nyü† ^ZY@[àC–b?úÌÀ†Ø)9‚×O˜ƒzFT¤3šfI=mðç:¤Ž“G1=¼ Ãh÷àÐ^Ÿ^ÓÉVSƒ†‚ÊTăôæVnȇ™,š.ffÒ´€1QRíç´¤×C3‰ƒZ°fӏZŒ6ú¾»á¦«‚…y<3ֆ2AÍƛÕЌkøFBØ@â ‚^"W+)¯Aß=FÍ,½áRikyÊ4ðUG¢U{(FӎwÏu§åÀ#‰X2ÉD0,öîµð—À*Tڎzæ(h:Õ¦”^#qOj¸üËÌ#W´¤¹©¥GΛ«zkÆJg¨’]Õ^WŒªÀoXªBKðO}G¾(¾©tå•á¸¼7ߞýI-Ú3¦†œR€ˆ;ÿ|¼K Áˆ6¡o8ºA1ÚQ p‘e%ÄçíÁ˜òd¬‹¿ÝÏv”HqWeðØ#0™±v…è‹kÂdYCƄMá¹5k«–8l‰.,ÉƨAP[)¸i£-ê)àX3y%¶%H–{¢pƒV +vÌ(ÖåÈVŠC¤(”,GRÃ[‡j¶„÷ªÌ†SxÇ xH1ÊKCƒð +O¸ É:–`…ž£årô(æj5 :8@ÀRŽªtÀžKO<vý_ÿ/,垭”Hôˆÿ¢_‚Eö½á€äŸ0äréø¼ýwÈQ +9®W¡½&Ðs èËÿú¿Ã)ü€`À W“ÿúÿÜlB‰½bÿþƒÎQ¾+›Õ€šÍ3渐9›‰,ЙÙÚJЫæïÁÂ"—™ˆ7\‹Œ™Ó+¶~ &0±ÓÔýQu£¤TÖÍ»¦nØÞ*ymîىM»Ìl©ì±)™EVµÝÛ¦ìPéZÊ»åšö‹Ooù›dÇ™dmz1“Âú6¸ØÛ[zE§ ½Êù_†¶­îÌ(.Ø&ŠÕǖÉ5Ÿ&8£ìÐXèÿõj¡t Å ^´Þ=Öµc$ч•=àñ?hf^²2iÄ7²ÿK±•{¿!›ÄN™ý|D}_H%Ü÷œ-½én̤¼5³ùAhùඦg7*+GÌt¤°·r?ѝÀÅ-9Ü ++LKg;©¢û8P’rãÙfŸ¡ÍP…²OXM‚o”¤7¥ä·Ý§Ünjš=]Ãó.Q»K]~ÏG¿Bðʪ,ù¨¢'\š‰^p±S¾¾NÅ+z»j¹Þü¹§Kw–|ÜD]­`©ÀԖÓÌdå¼!œ»<#Cìyâ±^Mœe +µümì*Ó|wߘÍ0IT#·© <;Ã0¶ò]™°óBö3ä+äk¶À6"a€¦m:±Õ WšÔ\Œê”g—ùa%rO¶p5G/a²B\d’¯5®òýQŠ½Å%Ýd‹×nêÏ'Î6D%vþTú^¸ŸšÊ»èB;O¦ÇÉÞýÛ{±[õŒ±*Ûe> +¹9ñQÈ°¡¥¿¸ØžÚh Ð z_`Þ+㏧diQXoF¥Åŕ;Èøß7ÅfÇõà-do¦Q€&‘í}Š«¡{鿼͆“Ë÷ËY2fÇÑ"3¼Æýó .VnØ \ÒM%Ÿ¢Ø(3+‡I0Éøí¥' J‹d{ɏá¥yQ(_çΞªtâU¹~Kœå“eúӟëÞ2‘ÁÙ‚›_]€!å¾38-o‰§Äý +’*_š{AA{£&†œÝVÂdÎE8ý¯ D“€>Ô Á§×1ô‡?Oä„O¹§jƒo_T¿xh‘—È5ààg̟ÏW‘ÊÕäRôt™ËŽ¾ï>ÑlJ=ðZ¥¸ˆ´*ÝH]ø»€{.`+*†¾‹;K•>"71W±Äkâ{XìV¾ý•q¸ñS%I÷y)1x¼O·/ž‹­r©]wf?…ŸÌ )Å^º}ž ¯‰Ñkµû{¥Øs±ET¾ŸúåÙw"œ//&Dyìà ó_ÉäȖ¦:?ËF±Õô5ˆŠwÔà©#Қ_¸uèÞÕ#ø!å)²ír§Åî ·Ùœ†¸ +Jˆ“ñÌ8EP°‚Ze˜ä]}]L"_¹« +F¼¢ˆr_9¢xÄð—èô§v¾ÔÄUN®8<û\MÙ ¢’T7ÍZ±ƒ#¾Éù×Ù/Â3n„ŠX®ûñžæøž¨)’Ø<¤)ÂãZ{ËÓÄüêo†™_Á:x¡‘°éTGQ `u-]`pgÞòdZe“ÙáãC1ùyÒÎC»¾è©€ŸÖªÁÀ ­7-é9Õ(4ÅîíÈ„M>])5_æzýEMíj/É1X<ðjZìv›}¸6ám/²D%þñçk_ðÈ7yh`\Ã1Q­Ä“¥D°ÕC²'„×{„µþZûJßÜhYZ¬zt±;}>0~ Àº ï"„+˜|+>Œ§nðڇ«”ð7§‚èôVÆîzô—žò"±Ú{®‹`h|t£Darù åýWe›>/†¬º«øÐ}[¤¾Á’n²^€häô –+Í=ë‘«á…¨}ð‘J²Ý¢Ý86ØT=—?O²æÑ<… íá’ÐAª³Õ õåÏ^³c ¿‡gñ¾Y¼;_7eáiºøUÈÕË!Ðä«äAÓUÂ_7ýbgӍÉOQc(ÓÀ7Ë3̸ø)S.Ô@+wÕ*¯’Éy†Ý̯°†gM€_£ÖÀGEìæå2Íâx¯À'R|?Á z }}Ã=@øÀð<ç/ñâdAü¢‘á"4ükð7Ý~áßeԄGó]€—„~¼]© åîU=yË+Ÿz>!þeU&ìŽԨģ‘‡+¶âAÎG•­¾É=燆 ÿô–:»¯ç·"……§Ñ.;¢‚+Rÿ†kåø7oæoE% ܛh‰£– ƒðß¼ºï YRŽ_W•í呈Á“Oâõœ+¸D$š@ çÂN³º5¥¯Î¦Èxê. +,`·oBw”4ß"8ß;À Í·q[n‚æFšsy4±…þimŠF»8d‚c75<©C*¥ „¸?Ÿh„*×ßIRC9þÅU2toÑì[ Àö`™j;cäËð$Í'>iÔJ‹ÄäMãsÈÆ­¢«T«R›_P`Ýç`Xe>¸ÚútNû³±;5ܦo”s#¬Å΢àïN~|øpՊiÁMîú(@¯yÌ"èyŸ•§ïÎ èt¿/²ÀG 8Ô(ÍoýÀûicâh A3Ðù,Í#—Nù™ÄöXf´\`pªnTz¢Däªï!i¹%‰ÏßQ]m¾"éeŠg®Àyø  I%‡Í›Ò}»ÐŽx_–wBW7/Åû»Nºú⃧ï¨À´ KÎ7ƒ6Ö\‡5¶E1æ¨=쇣ْ(0Ìô!3·OWC»Ê~ADzŒÓåkðÖºT/Å6% <²NÕ<¼}ÓÙFPzЍý„fEð´(0§7uÂç Ä ºž€c­€ºz ˆ¾×9…ÍrƒÏUáéÞïÊLýPˆéoÄî +Y½B©+7ŒïKÃ4‚vVó|Si%« Õßí,ãH¢èT¢jC%½½’£rüS^ÉzËXѸŒJË3v–¨ŒƒoÀ«þ”h< V@Vç:zÝOu]ç¢æz©ŒÉJ‹Ôy rãñzd“G°-&s¸nflú4;>ïL•f“€5Ôê[õûc¥¾ƒóµî—> ½sŽ“P7Á4Oœ ®I<”âÝPP~À³€Û‰]¿Õr Iå¢xñí÷xœ™¹ïo­(•—ºOopªvqöƒ~{—›ˆJZÕªçKÞ ³-  ,õ靣x^æn’Uô+Äd/vâÄGmÉùÜ°Ý7/lԌěg,Ð-·SÞ&¹J<×Êwåޕdð ¼Äï©0Î7`Rÿ<€™.ü(ÌF-° ðÓmÊhŒ[aB`¡6‰K⧞«,šqÙ@æòóÌYw¾èòìô<ø;Ö*®ò״Δ†yÆkÑÃuúvÆáºieªB¶´VšåBßržLo „.“£»Ê8ý®¾RœKCÒô7ãî[àó¥HO[> ¿@[@ £oÞåîƒn]]+Ø(™ˆêqIz^¬v‹Éô²'û•ñ=ÛàE†ÐÙ:RkåâDŽ(&õóKüº˜ϋšVB“¢ï»Ðë^“D®Â)ºäòÙi!óDM +©5ÓW„HUhª¯Mà¥öT3\ñòöŸÜ%W[Ü.ýùd­^øy;HS…$ôhYeáÖÁ=à‘oW¡7înÀó‰›M%ô0 +2wßs…å~u§Äª,l Iëö§i––@ª6V:÷"<¥>¿Dr ½@‘zkS©²l%0 ª9ïùÅ#àȗŸÒ²•o3Íý)Ðhó×Ò<‹{€Ä‹]®Fú¦Ë/Kñšýøª]ÎF9ûä*cš éðmèщn:=åñUt{}$aLø¢¦qþü=Ã"ñù´RË_PÀîH'øˆð°÷ÊJp³„çzôÐw(-ž+Tî:¿V`F}o*ÎdŸ€¥TûFë/E7~5/äòë3墭#ðiVÀÀØÀk"ÿ«ãÁÆ=¸ j‚úùIDºÓô”Ô)Ñ\U‡ñ@ yuèå.&;·˜‡—v‘.Ž·Ä?DHßH!¶ax€Q…M2·þè[±Ûu9m-Y3îhT @ÚÀ8°œ»«"¹"îk}aÕá ¯êë±q€†¶^‚g¨ÚKa¶5‘Éῼy•½º7´éÕ$>J‹dáyÂFkîx$}(:2ÁqŽ‘ƪŒUÜÖ½Xi±Xiý|µGûžËÙ :Àrn¥‘-€LðŠ ’‚{%gp +>ÐM®hýŒDj¾‘z.ë„ÆUž&> §uN†¨¦ê“ü©?4‘;/].àà'Ô&’Æ*¸ò»ÒcÁ¿‘ ìSÕßrû ?ƒzzDl—¿ë±qP!SÔO…Ü‚ðò -èZh“ÖòOù®šþâLž}M˲ éÒsï}î Œª‡gg™œ`ˆþ"œ3±($Ÿ'ÕbªÆrpƒ>Hxn‚½2þ¸d³TƵ£~ð*Qç–‚yy5¤¶D禘¬' +%Äïë=YF eÇŠÑ +bÚW +ސ"5ˆs?xº,ñA&…bMwdÍÆ ä#b@/á°ÑS)¹Ûb'Ps3ñ­4 ZnNûÅT0t +˜Š “ý´¢J±ùh”è=~ôRÉ«r½<}B/촐»~VÜ©´Ÿ­}-K®j!ûñÌÑä½Ú‘ÀÏý×9PÃãuñaR‰dò¹ÀzŸO+›èG±sVZëIW1¹ ýšìö7+Ю|Y™Ä§¹Àæ}¥@þÇWn’ï‡ÈC)%Y%‰)QB 2|Ž¶ËYHžVP’èÉG9ÙѹÚúü3(» Mf4v3Ò×.-‚x·öüú¼sÕäøßäîs°!¾>6S˜âFÎSpèƶæãH4#À†>©ô@X &¬$êT ?#K¤ù *¸=`×~n _.€ˆ»ß¨Ÿ>»É."dHÁô¼ð݃_>©ÂœÒ_O@g­1¶ˆåî֊@*¢WɝëV|³ð0xi”Š©À5œ×Lc*ÍA õÅ L¿*°±JÃb«Q‡û¹“HŒˆªO÷§@WPoYò‰þ®„«ßÀ4KÓ³êç3 +?ñ|Ñiÿ•xl½} ¦I¼'¼\–®ÞxéÖë%W×÷~M ›÷î-pK¸WŸ¿Vƒ/©I)ö *X`ö˜»֗øiW—Àƒöï+‡«JP|—ÙAf~Yù˜½œ!v|O äþ´4‚½/O £`åzQ~ҘXäþýŒð4J©bû5@Ëã×ØJ11ƒnj¼:èV㲘T¡~…öD}„"Ýb0å5Â/(§H–ýb<­J~}Š«+g›øò|Dà¢x¯Ü8ǘ¢ƒðþgöºUHdž`4!؎€á¹qƒM ñçÞù ¿”ýÈœ}ØʆŠ§ûþê­?  ?ÖR—­óuíѵ>O?VßÎӓ't¬ú¡Ïbw:ä`ÿOþDªŒŒÀÍ-TÞÃÂ*!R¬)IÅäCœ5Íù§â]÷"Ø£™ 9 àÙ 4ßP{(š†þÑ^òwêv³àfëUÜ:“i»€NqW£æ–@˜¯È_+ŇðúXð@ù•~J¢?ÿJú¯zƒ0ößýWS. +?Eb¹ûLTzp/}B²Ñ«.W¦Km^?{¸$¡ó‘—žFü—‰©ÓSg#Î`1úÐ8ƒa÷Ósþ:p^PxÑé†.ÁÎÕ8m¦þ|Í銱Ñó{„?vÕúÊcõ¯›+Ø»o—RLiSõß6Ÿ*kgG|Z™‡Âl¼žþêÖ ¨¬>•¨‡B˜ä2íÛtåµr5Í^á©PÉ»tuÊ׋JõíËOâÀ´Yŝe`u‡Á¡à Ÿ{Ýýq¦ßu8š g ?zs"D<ÿ|w¹¾Ø}püÜãËn&½XåŒ +\W™w&U¬'èW/U9mª•+_#ž}mÜ.ráŸ2\†V ®ô=ÄØH3¡7›0 ,Mìïùv«&Ë0Y¶Ë¼¿®±p¬ãQ¤O•ÙÁõ"Ÿô܅\8¢kKÊ|`l ÀSa¦#ì­8¸T-–úÉ~ƒ?k ðúKEõù¸}¿×ÇZK~Æ3ן!«j4Ìçù]ÓkbÖ¨]ècÍ9= ‹_0úXÛ8ÜŠF2>½á²îÀmÐk|ê!Ý/U}¬±—gŒÀ|·2V>cXD|JŒç@¼ßéaňîSÅkâì¢Ý)°Âå‰ÕÎ^u‡{Z Ü׃гîÔ¾“ kÛíÖP8šå#„päÚeê©}a>"7w«w{jCo±ËÛ²`Ñ[ õ™# ±4ñE딓«±’̧ë¢g€•&VîDT+[üˆÊXáܨ×côÛ ­5wêaÝI£‡•Ù|á^ÏÕۇVd—¥«yƒá&ÎÎ;=&«5öòõݱžlöbîuVH4 CÕ›;C¬njRhŒÕfØuûbõi°4lêžð]% Î[€8¹Öbm&K/֗ Gƒ5ÑiÎ{<ÖêûœPõµ€5ߪq„qšf¸õ69?»Oèb½õ13C¬…y¿\Ôà +ÐÄo^¬“¡X½á²§à{cD8]¬þUÖëÝ{ý¦„°Âíԭᾕ±žû9¥µy¶éL£”.Ö^§õ°B ?Öµ…‘ßXo-`½òö>Ÿ¾ŠºXŸ®>„©µíáöûEîÉë{ ûhu½úXïZ“ïçJΧÁ**iìƒ ÝyÙö»ž°Xÿþ'§µUð2oE2´îp«ßÁ„ÖTÝùt‡5y¬ä)WS/ž+fóôƒXý2Vˆ†—P­³¬÷s³ì¬—Œë—ïá\À:Oû4šÇ…ÝÞÅֈ;ï©«±†vrƒòâඬh†œïg `-°[rñNóX¯<Հ†ÂÎ"ÑróX?¸Ì ŠÐðDö>ú³õˈ5¼-ñ`²éúX‰+3»ò +X3÷!õX돥 WŽ7 j‹èÕc³©îÙ¼µ!VlKÜ¥]§ÏÜý5ÀْÕLq°zô_DsòS•’f˜RÊýòØ|¿Ñ}}C:sØõ»Ÿ3xêÎã$Û>Ó{ +Eç)Aœ¥ó +l°Í”õÁ*‘$ÎqøÔ¿ýtºu›ÞÓ“l}ÔãAé¶FÒ*Ÿ®Ÿ#I¼ÀvYrޒ +Ñ©õÆÛ×ÈâÎ@åáÉè}v ÚuzÞ¼ø© ÜÐyÙlô‰ô “q·¶ƒ¦º¢i댲ò´ué´ÑŽÙôç¢LãE¸*ž¤\Äàõ€Ç_¢Ù;~íOeh^#ڈĕÖ~­õÈ|~]a×ÂÜx$ uccårn»€¬t¿•…N%|ʯ=£®VFü¥ð”ª\À_gƒÊ[0ˆ‹ô譂ûJßlåaÈ¡©|¾z¡øÄdY²Ä5A½{ØO˜•*¶Æ,w»‰_\ _#T~ˆÐ±–4†Š??ˆÖ4T¾öØF¦ú— ÚëŸu·Xó>Á-ÓúœTŠ“j\\žð͍5áѯ¥ë®3Â+¼Ñ}O½A +#D¿ÈçŠì#éÍaôª×½5ŸC$¡·ßð.“&^ʏ0ë;d¥è ?µÎj7zsD­§àyAI[°½!½°±ûçِ¿dæR0´1Ñ8yî®[­ 3Ò#†¨>Ö +ª X é•scI/z ¬´R¨ú^^+1ˆã‡DÛqF>«xõƒ­I0¢ú4¬5\‚±¦¿<«ï-N¯GRw¨À_oÊPíùªÐÏn¨—§RŽë.O¯áà¢çÙFÓ|phyªÆ·=¸÷3ÓÁ!Z»øµdÔÈiÙ4ÐOò¸¼.4.}ž ¬ÕZC;¤“ßt§l{H•ŠÝ¥õ¨bwŒj‡\jC¾¥ä´*@óþs0m°qÆóªGh Ý}/1O@bh¿ ´rèÍÈ Ð¥QҚ8ˆÐÚHž6mŒZ»ú„8´º¿$!µ2àÑ@5Àÿæ ×ÛÛ»‡Šû5ámh³Y…¿‘ˆ¢ß: BžÞ↠žÒþK^­iú–ù1è[ä'RzMßè3Pòh¬3y†e¢i¦ežZk¦¼þȘ*=c)¤Þ#ík6„¦Ú²&·LIÅ j²ˆ•Á¾“šÖ®ÒL2èþÀiN/8°aŸ$‡Þ§†Ý’Í<{}šž™hς¼~­•IM¶õô­þÆmÑÊÖ³7‡hÝÌSŒ¤½‚ƃ¹Éª”<7»B³rKT xacMe^J4+ƒo‡aªÅî¡DSK·Ý‰&DÂv‹”ž_‚jﶗLՆå,›Í²èÔô—Ë[…­«¿&uy& ešl}oÔû!ËsR|lJÜémÈiܕ}wÚ¨;æÒB¶ÓÌ Tk/íÆŒG“gõ$ĎS¥ò5=úƺ3¨'VòÀ¬'‚ÕYß²:w% ꉞ‰¦ç?¢^]UzîÇvsáÖ¨Òê\«²§2hÃýA™«ä©p»aÂ[–Í5t„k;Hý…5…Ò3ºìvk«OöD@cip}_, +ä­OÕµ'áµ#¼ÊÜßjF(mWÂW8+ëAŹ¥ù`§øqFÈ{Ò/ë]¤F®û÷56ÆO_ô8‚w +w¤—áb×_éb”>½âÐK½Ò/9A­©;~³±áœ[Ç¢nä•nL1 :úܼ;²q‚÷fö}ô<# +V®³E WP7Zû~¯Áy çÆ:"PZ£©w„(¤Àò£ØùӁCºÙèõ4Æ­e(zžþ‰ÙàC a¶ô ¤MŸÙ%\bÛԑb;æ ­ +ª„Ú̆©Ð˜ÚÌnhÌlE0ÅÄÒ֟‡Ìý™]òI›^Û¬Õ0ÛÖÚ²’Íô⺵§J5„{-­d8¸c¬›†V+îÂÎÜ;Õ +ÑN[ËîWQ½!‰{¶‡¤ÕöD*ç͖Vî! +a4áEE¢²‘ò30s!’võ’˜Ÿ&$ê*?¯Ç¯N +ãzîhý\ÓÕ§LQÜ6òHÞ}wC3j´j·WM4 ¹úƒÐÂ6׍u”BÎ ¡Ë€ª…́a|4sJ(X6ûR;›fPŒwØ }–â6”÷ɲ9 •"Ú:¿¬‘C¤›¤Ö€Ái,’v”nì\»k$'Y캡EŽ`@Á’±Î顋÷I·#HGÒMà4k@‡I7ޓF€ÞÅEPúºÛo‚·VÀ(î1,ð’*f0iYÌÐÏF;¢ìQF9T¶‹ÀBgÜÀMÎû49c†¹{dt=÷´‘µ=vøÁ”*ÃÝî Ch¦Wë´º/k zG-Æî}K-ƒTß+~›ÂÆPp§î(Y@è ¬ + JØæF¾% ã$CA›ÅÖë@Û1N¨VŽš¬¡/o@G?>ídýë)G9ÊdÚáÖ?pÁtó TN¡mý éº˜†ÊÑ,r ¡a‘§ÔùÔړ˜-µö´“õo¢ÖžŽbý?*Ç­l;k@úúÑ\9 òô6²“~4WŽhcå²ÐèÇ­œ{©N:ãFÊQŒ ˜§fÉ©†òtìÓÐeEEK +‚Ê+Ó ¶} [So‘ì@h¶V¦ #€Š[†L%¯šh+㕾½‹kê2=یyk·aµNaŸ1‹yï”ü‡ú$¬VŠ3¬PÒQS/²š²‡6t㬉šSãø幕§C‚m +ÿ.‹l;4)=Ï͝'»©½ÔϹÉÜì”Ç¡qZË~0åÅVÚ`WAËÐÖV¦¯ÍÀî(‡ÂšL_ eÒdX¯[Ú>™D“•l¡ÜaWÑKÉVŸˆ®ƒPuNÎÃyž#Ӂ5zMg0ì£Z>€æ8å|æµ|‚q{x9Ÿy-ß :æå|æµ|'êÒÅýËùÌkùšã”ó™×òhJ÷.ç3¯åƒ¶ÀQÊùÌkùN¶J÷,ç3¯å;A¥‹G(ç3¯å;Šý.ç3¯å·¾.ç3¯åãݨ=ÊùÔ ÐƕHk­Ã®ï+ >ã:°‚ynۙ` Øèc•+~9ðZ„·ŠUþŒÝ€TÛ¥M=Ý?@ HÕ¶¿n¾SØvç¯Û •L§“í2ŸíT6ŸÍz@¿aŸ w +M v¡nŊuŸý†,׍]Âkkˆtútb»Ó"lfÒ' vÔ6ô.õ{;‰4š—sh¨jž_"ìFÙL1ù¬î¹Á'{Òrû—àéáƒSÛõ†é<–ew;å—Äv4ëϗÖ²r£,Ëîìå—ð±Nژlïॠ½¶Y(¦Màۚ_mV|–ªiÙ¦ü"OŸ“&DßÓ¦sLÈu¯6·²½Æš$ +*w´Èy4 lÚÔ±FÿvDeTC +ꔑý‹{ŒP•ÇÙ«G{ãÌmŒj +ÍNWØAΎjòš3¬¿,ǸŒkäòÜՍAŸ”f¶Ì{Ð-ãÌ{iúLçPÞ¿™§Ï­Ô°í9TG=õ*òí.ԚuMŽ”î6ƒfqPƒŽ [5ó*]‡¹•ÉÑ,*vv$šñNÊ>DÛ:°ahêxq’Ñ$Q%XÇð/&uÃò)y#_Zö†0¬Š(Mð{k“º¥?ØÅù_²š»Ò]ä:9·ÖþàVDØÄ4:É"Rz9uíc»ý¥‹+O·Y¬Kö¶gI›A<©k7VŒ5ã²?RÀš"Æ;•†äЄ»Í +öôô‘=S×,÷ÝólÎìZ˜‘vR[˜×z•ºŠ`ŠŽ…i\›µÚ¥@_:êØ¢VÏZ—em%'ím§>YTÙª¢V¤âKÚX%ø›U©,H Ä‰*jCº°‘ ée¥—UšŽCzÝ8J…äÕ#nž‚ ë9ègt5öŒé eéšgÛÜ¥×— +.#F]7?ö Î:ܐ4=ùÌf‰ŸE^–drX•ø–0Ï«5Xâg§³,fUH/lªÇÐöÒê3·fC|çÑÍ÷RfBÚÛ1Ý«2oÛ[CÅyǮ̳N»>Jež-N;¼2OH†Õç»2oÇdØ}+ó´.®PœwìÊ<µ³c•ºýÊ<«T«#Uæ)ÒG ëDŽP™§È¼WçÙTf¶+óLæ昕yz;…öö…`ÐÅö.߉yÝaÎF¶S/‘öÔ¡¼êåVâŞRàqÏêmÂe>ÂѪŠ*\¶çf1¤q±M¡Ålx@‡ÀC‹QíF©vyvJ±~4—k3ïm¥XëlÂZ:³MÚ±HÖÆz“±oY–2ÖY>Þ)ÇTϹ³L3\Õ÷;®¦: ù§qÈ5‚:9Pû2? Ǧ‹‹í²Õtøz„P¶•£&fcÓðç¡©Ï;6=΍—i&m8B¿&俳4³Un·ÒÅÝ®ƒ:¼Höýç˜E²Ú‹dߎS$‹ŸÆ6¡*±€ŠQÂ¥% Ý„¨~”²8nÀfw°£ÉZt-ÙÐÖG䠅br¬eþ’`ª«ÖcÆØZÅdØNíêò ÖãaEy[jÍN®z˜vŠòNlv}pQžfyfý–ø©r.,N¿XÀ¬ÄïGÂID;Và‚Ú>q_ËfÀªP¶Ø™8Ù:þC=¡a[¼&ɰⰏ)‚)&ê–®€%~FlÁë›é®B¸èž¿JO—«UÊ'Çoãdå•èušB˜+5«Ìçeÿ²[™ãåRøæ©rFÝt*WþN÷’þò'À§Z´s—‰çwbqçO+¼rBQbEº·]‡–º»’Îè:£.»;ë½´•Ñ.U)Z>S~{1*»{6+öƒ7â†XÑeäXgð&ò£+ô¬ŠýÖQc¬ð&rC¬ð&ò‰\v¢½§ÐkRv׎GXÕuhèvn «ö +=€Þ º0(€óšûdÈ+F4rò¼nû%Î.bw•/£²»¾YÙÝyÂ+µû³Wƒá¦ê­Ù-i„õÁ„ÂwžŒõd«Ø«V õԞó*ˆŸ„¢Àï2l«]´ŒiJI šb_¾LÑF;†æª²2£~‰Ia»íEì։ʔÍRý­ò{·[@Ú¸W½ËT±ºçÀR…‹J¿´qµ½;жOL7Ïè2..*[d®jöÏ £ƒû_¯·Ý§æF“àŒëõô¦o‡°ÝÖ©m;gjÄmYœ—®Î4¹ÛM™­­Ÿ;¸ïÍz†#T˜fwáY]´b5B!x_±‘«m³ü”¶sNJ]Â[åhÛ_7´Õõz зò©œÂãöéUõí³±(ìÓóŒÃv{öéUõ™ÙÐ{öé9-|€ø¨…}™Ç.ìÓcŸÅ鋊•cöípF×!…}jBòU}ÆÛ«{öé)'1}ÄÂ>½>iólŽPاWÕ'.Ï=-W½Â>½9<á39faŸ(åfñ‘ +ûôªú *V)ì;ˆhö ûìí…}zU}ûÍ¢°O¯ªoÛN;¸°OÏ&=Ñ«ú>¬°O¯ªO£¤Qا·Ù"ùžÇ+ìÛðrê²rq÷(ìӛk󍕽 +ûôªú¬ôÍ…}&¾ç1 û4ä°SP¶OaŸÞN4''Ù«°[øˆ’L»òTí%ÅìÄÂî0,TSé駌\Û° +ìö y¡»RQËX)lŒ\&Óe—7j ¡“ؤì"~°ºÿoÿâ9áò?³<»öºËÿN¶ïX1˜‚ƒ.ÿ“¢¦÷ÿÙ¯Á4ȹØ-zïËÿ4û7÷ÿíV*¥sùß>AÈ=.ÿ3B*ïÿÛ£^JBhlÜÿ·gIôêÑvø]ëÆñj<®2÷¶ +rM‹›Ä½50¾ŒçÀª›uÃ0¿CpiYÓgœÀg?»»qðµBAßv¦±^Œe½£Iíò8H›C +rՏ‚qmÅÐIjڒ¦ör»¤©½”5Ÿ07ÊÏHóÁº¹Ù´J‰ï5Õªs¼T«ŽÝT+‹LêöÒV–•BLïÁ;)Šlʲ€M@6u ™‹ËÚy)êA9QûíQi¯fxH¢FtÚ¬öÕ9~|wi¬¸Ov;ÞB+›×ÎèÚ}IäZÄV6ºB™Ró›‚å +&§Nê:›f%ÀŠójS¶Áw~Ë}O{ÁBX‚ef×Û.ŒéÑvÍ £t ´c]îØ£åŠC¤;·uݒB̬ïP/A X²€M@»Í'¶ŠËå˜÷ìŽàß @ꢎ/#Ò,M Ł›ÅÐ&óm•P¸¬ cl®ÇÝîý3ÌL¯þ;FIªÂ;Úz4¹÷oSý{ÿN4…˜[Wÿí±Œt’6öqq÷¸÷Ï@­ÉWÿ:®­Ú¨Ý.ëÛíÞ?QØجÝØëÞ?ÛÇ·Ãܗƒh(É´³@ ª¯­Ï=ў¢h¿Ú—<œÙuTƒ)€æG¨ö}ÿA¥¾êݨ}Y¿ldtA@TûÊ2 :¼ÚB1=Ûn·êû'óê{½B* 6[Aõø¼{Ì ÏŽÞø$œ] ©ú ͵TVÕrÞý‰âÜA›©;ÚÎÞ½Éò|¶߶SH…ˆ¶S-•iIfÈÐÏ×ó=j©Ü—=c1mn1ê„`·l²…=‹± +"í©1Ë!Ë«ÒmYŒ/²Å(™‡Ôݖž§º²ÈBáDçÌ{“Ê4 ¿ÉpÇGonÊ![…ì6NÕ öª¾íÔÝjz6܍²uà~—ajrnÑ݁Ǻ óE“œubZŽmf»ÉË ý B±Ü‚sÃ0Wø_0ؽJ¾T^‰—nåµÊŠõD÷¦\ + ËåR¸óE;kQ],Ô½bQêò­³ÇõâMU{3®ÌKÝgÚJ†RUæù³Ã–n= @Ã_Mw‘sÒF%ÚBDUÜ(lˆ#º¥{µ£©‘SV«i±~™]þL+°J¥jhüÕt?+ W[#{ž6³Wӝz kä˜ÍóÓôŠóü¹ìÒø>“+c/ozXOЩVˆÈKãòGŒ »]C¬®&5a¥V厇º$ðþÙkõî­fHaÕ½ŽV´<Ä÷[S Ö¨€}Ø=c³]Vn'ƒ¦±÷¦-1o›o'(ÎfB?eD\ÄÄf¡U¦fñ傞úÓËΔö/ÿö!ym½K†”éµnV)6Ú`ŠqYԏaŸ”ž´ní–b#핝h/¦©’¸¥é“t’ÓàöŒ;µÝNÓ§ÜX1&•ÝÄ-ÃmŹ갅â¶Cݘ}.<4܉åýž6/<4/<9Æå'¨Ðô¶C9xà…‡¶’a¿ð0ozÛ¡œmwà…‡æËXåFr᡹æÓó=÷ºðp«4BuÛ¡:çvç@„|á¡õÔ,ë í¥]|áaÞô¶Ã“Ýï)ܧ*XLÙûÂCóÛ·2ºö½ðÐ<]íÄâ>ÛšïÇÈ9P^xhîËñŠàʳ{¡Ó^šïóˆRàà ÍS¼ù=é#\xh~ÛáÉoÇ1/Êæ·*­Îƒ.<ÜQ +ì{ᡊݶn;<ùmï{ +w9oäÄôžÂK.üÒm‡‡—’¹Â÷Êã ¿ðÐ<‡V Ú᚟<¢v<¸ðPUøµ•óq¢-ZÚ÷ÂC›2íÐ Mu`ù7ǸðÐÜà?ÙážÂýÎÿÑ&‘vá¡ʶǭ«Öv½ðÐôŠBdõ ›/<4O3@™)ǸðЈÉøÛ—i…‡æƏ”daUlu᡹ñ£É~ØÿÂC5ÁµE"ûDu/<4‡¢¿µÇ…‡FPìÞ*oóÂÃÃ2ºt.<ܧT_Š@zááVá•ê¶ĆJëQ÷¶C…L;ìÂCó$*9ÏæÀ ͽ{%ѺðPÝ1›Ës÷ ó=m_xh~Û!Z7Ç*¼2¾íðDçhý½.<ë»ô-ÆEõêAšé+é/<4/cCËó§påMo;Ô!÷¿ðp_ËfÇ Íoä¥À.<´×y؅‡æºB +©jÕE3ڲݚ1“NójÂàXV¥e㎞§çaMDØt/Ô"ß_þÉ4¢¯ ‚©C^.•ð,•)ËHLKw¡ ú±+¥tiVX™æô¼y7Î`Ø}Š6Óçb“&Ë0¶èôM˜ûpð"ãŠ>ÝƋñ„Ÿ^‡é é®S©´ïêíüõÔyÍyEâ!|úò™È4ç]¼˜¯:M75]æO?95'…ù×Ý´AuÒé»÷úO¯ƒ¯ãÎô~¶x¬…o7½~Íëé÷Ë~ï÷Kü»µlû³ãµÿµÀ1›a¢çÎSš¢ÃØù4 Ðx_›Ãž?í¿õäΗMlt±ª0ÌU¦íô}Ôn‘RkáÏcŒÀ®òÑ}"°Ú}‡ÕZwS†™]™Í4ïf݁»ºS¨üÌÿTý—©»78'ðPmT€‡U{É>ÃNnΰp‹ÒNÂÜô©2ÃäY®òJ›Äeñr(_‰JG½îÒσL/D,€F ×u¦ç?La•¸s>Ý5üh¸ºcÝ|…Î}®‹çöy*»(]´;µ÷Wçú2–vÝ&üҕŽ`ªÞ«ÁdÓõ}‚Ê|ü{J\Ìì# +J€ªi1j#¬¬\F_ %»!CˆÒ–äÁ©®ßUã*éθèH¬úTú霯R¬'†-:þ@€OÕjaüˆ•P-pqxÿÕەšh¬‘Ò‹¿Ê¯ot.]¾öäÛ3h#¿¸Øžúõ5^ýÌäÊ32ŒÃ ZU‡óŸ4~ž#ýú(€…ÉŸ Ôûç0É"_*ô’žG¯OCh³G”ógnä*aáx̋þä‰V Á7?ú,ì‡ðg!ÈÿùÁRô)zžË}}ï[&…lÓɀž7<Š~°Õ—ôÀ'?@¨òÅ@zP¾ôˆ¤!åƒÉåXz€)ϯ§âƒ;/+^kž’ôµ_ѾöJ‚Êë ¿ "~‡Á¢©%^O4ðÆF? ¡sƒ…Û_qI7Ùbãé©/ft¯ D !UBÓ…n + 'Äx I+ €‚ù9>âè ]—øó-¾íÌ£àݮߟ?˝Á§ÀGw…–Ht¾4ƒâ/ÍWʟO¼+a2çÊLVîG"W}Ëâ\0 jÏ÷J/jyqi7Ó ‹«2ï ¤¸d<ïMê>ª7£ê•ëÑ¥I0®gœ¨FnSpàyF"ÞEÿLàï2& h¸´°-ě@×$àåÁcùàÓ3¼F4¯½à7œ7ÕÃÏH>}ó5 £â§Q Áæwþ€@‘>‡…wço˜øé—º3à3ºšy¡GóQT~ùtFûh¡D¾n.„Ñ̗ $7¢¥T4•¥>½ãò4A´J‹ÔYJ¡µ¤êañ¤>~hèï¼ÈÇpÏ! ë± øîÃkxÁ>‘¸øi‘Û ë›ûŽÉÝh„Źáóæ³É^ðô–øº½H#AuõÙ$vSóÇÁ|}$üÕÞs½ØxÆÎz_m´j¶Ë’¦Îh2St4µïƒØ8Óïgg ÷YunŸëÎ`*Ðwº×]| +6œÁb”rú±&Ôè='0”›NßÏEaR üò »öíJ˜Æåãe¥û²ãC,€hŽD'\¨˜ :Ÿª$/ì(²=’ºIè9ÁS½êü] ):…+R ¾ùÔ¼ ˆ\]"ë|WA¯ê™ +_âi­q"¬o„ǯ1q¥y]ª(,œy€$y– Ç“¸/ŸAñ51zCÆM?<ë¨ä…#¤áÊMŽÆ@cBfšh÷-J‹Ó¬ÂӊU8Khö¡l #¬üonÑýۂê¨A˜n‹ ¬Uk†±ø q%ˆSˆˆS2/lîø‰ÂŸA†!Ïóùø;+·ªp¨Òꍺ|A¸žÅ‰ +vÃr10A¨e5¿ÎàÃ$F€®Îã+ ?Å¢¶u}}åÀë‰ +òV£.g®žµÉ́Oè5†‰c»´}À,4«ïU!‰52äeäëî«ã¿Šx1Ü?/”AïÜQ (”–ð’ÌD‹_Ý&hêK1ž©D¾²£F +)¼^H7áFA{ˆËˆ÷-XÛ È¢ ‰ÎkP¦í÷¦ôZ t̟ƒŸ ìi#•‚3"“Hr< ù&›ûðv掰<Ô1ÔüÙ=Œá…ˆ·NÄAŸ.óȀƒ«5‰–1LMKÁOQÿ&ïs,#\_.…°°É^5V&ÚQ¹òÇoŠºàE'ºÛíë®ôuûTNWSÃ@•ùÌ|f_›«|mÑ{†¤ëñ7¬f×S?<ãE%ÏÜp ~4`á¼ è IgÁ ñ›8[—Ë¥¹{õ^ %Ýl–J3óbgãœ&êÍ*IºCMõut:E²ô© /5/菲ÆT·5Ó|(dªÔ¬4÷xî«õö ‡ÔO1\¬\/g,QYà%Á[ŠUf`e>pÐoºƒÅ©?¿q9÷D õMã¼ò^©Õ.çÅn%ú£7fÃCa9„$ò("žZ>GJú²B‚[e˜œ±UÿìuZìöž˜QG€ÑŽ_k‚ÛØ P?E*¡Pî‰èsx!{3@„·Au€†'üU6ïÚ{Î÷æ4߄ÝÚ<@êo䊸ù³`„s_nWPy!ŽyÏSÆVV¥V»ðATâñ¯b7ûíAæà[â`÷œrWDHZ”?H¢£å™ìûªv§[àH +ìKsΊՋK ç:1ó¡#4;Œ~—¡+ØMQ®ð+٠ţO«Ì¼Þ¼õ½«L}Ä*rú„d*6ãî:[e>­øbðyžµ[…0ݗ¾î""}Ïéó‡Qùã欞ÝLòR(Æô€éí«Ù¥„¿9hÙ[°à : ÉpÎρ¨ýyÏD˕~±[þ|·»ì…#Šö6{XÛiEݨm ˜÷P8ŽsWÁÔB +tÝk~Ȩ¡’68lësóe·§í-åmˆxрÚI³ï®ÖU]GT0ž;Ži;¶)cÈi»’{§#OÚlÌzì¶;jèxì6Óºëë`N;Ԋ㙘–7^”³:a‚@å!Ýÿ;§ÿÕS€ÑÂènàŸn?øpú‡!ðôþ4 £-§{ýxî ü¬aÎ-Œ€?"Dòð׈5x&à 8¿Ü0˜ÐS8 (Ջj_ú¡—rÁ¯ýê;ñ#²ðj­ByF¸˜BÏý 7½ +ty!úúY±5É5mbç•ñ=û€‚ƬóÃ]æáòõ Ù Ñ"㬨GmZÈOã±Wɯ꼰ú .<¼Øµ1ÂÓ :`ŽyÒúc¾¯Œ]ë3(àÿ°¿Ö£6+ùÐû›”6PÃ}ϼ]ÝИ™”%÷N3mHp¨Ö°&©µ»Z•8íHV”E! +›_iHÔÍîòöˆ{„s)7%ݟçy7j7êkñÛµ´Y|€–qú>ki¹y¶¨ < 4äOXëÓ)w‡¹„Ó{÷š†Ê¤• Ö¸ãÿô¹ÏrP£ 8tê”|‚ê§ÿ$œÞÜÜ,†±lìWè…(€û>â×ʧÕÈ^i‡ýñkµ³1•ü=ªÐk\^ƒ¥ØuV¿­©mUû? oô´Ý®¨­ ƒ)ҘQ–À/ ÜXé å{ç•íèɎCWsZdØ÷²ïÓ~%ôðŔǗ«Áq,+~omG•»;§ëäÜþ +žÓ®Yâ6x²À.ëlÏ#jÁr§í"XvZdvdší™6^dpÚ.‹  ±Xgh‡^Ó`’Dt5If>Ú·éb=‘€GåçJ¥¯»³;ôgºšÚÀôÑZ|ƒwªO¥N³æ®Åzü1Ty%zð'Fd\t%S9%°C‚…Æ{G áˆi×GŒhüª=֖éÁ~îìÁžôþ¶UßÇÖÜÁɲ»´ÕÃxäÖãëÆÓtÌíÈiööjB-ÆӎêiüÒÈ­™§‰§ÍÓ¾½âinƼI? ©8ÅhRãÈ ÿæ¾L‘èÏ>¢¸ ¿õV:ÚñP-vô åz2›¯fRȆº]ÙÝí)Ϝo^ËÈ­Ln~¦á§ —)gøTÑÒóhcCóòÛD*勻)®¼b¾ÞÇw¯?k¥–4”<ÎËϑ8lî®fŔí´‘ö^×`d¿^mTÃÜßf{ö/í¹Õê¯bH´û×+?Yü蔳^?Öm¾ž}’KÍku§PÒ8m,Ú¬~7ó¹$ɪ NKsëê¹3ÿ¬}»z·`Fœ6æDo–ÊÃî9ÝäÐ'Ҙ_yžj¸M֏ӆÝû›ü $zïË,êÏ=sçÖÇÉ÷©§Yk'ç¥R + E´þxd¸cðV +‰„’f§o¼ùgñ÷éü¢™GMfh!vêÖÆ@aöƒ`òÙ|òúvßuêÔ?”Z{õÇöj³öícð›r±ÅRx¯ý%/ûéÉbe¥ÊWy°’½>“0þ«9¥¸÷éu¼À|7¥¼[ù ˜q¡´èbaLÉ»X¨ûcèºî]¢üû¯d˜ Ä 盳VyÃÔ<ãÅ…ZegúíÍÒ[ë÷7´o¶î$•ÄÕIgZ¾è¹8¥?ørö–?^öÎ3Ä{Mèû†×þô¿âz ïÅ6S×)ww¥eƒURšâºáU¸ÆŒæãêÓµÃ8çJfM!«z<݅ÎÁ‡}u¯ýkWO­Í¼E » ONÞ³KÜQÓ.¨…k#&Óh ¬t¹V³§—×lw«¼¸i7)j0³¸wŸšß®Ò]بä(˜Í%¾l¯o”ÞƒŸjO¯E«S•ø«¹j»w9/y#¤—ŒÕ90¾9êä;ºx½ãâlàUíj]ç5’)X´ FðÞ±¹vó–‹ÞJþÀNMË ×PÞ§–]z3öTgæ#?ž 0_@Çrõë4¯7îWU¹”Ô /8t†P¦¯Õè½Ë6Ýä ãc‰%ݜ'•tH›òç³¥E^¼^߀æ³üãÖ«ÙÕé?žž%ì©úØTUêèKÕè·_}Ø(_ìw–yñêû;«{¹‚gÒvåâ`_â±Óµ7K¼Õq×åšË°B’Œ ++ÒêXxϱhã½g`­ËŽƒ—?•œ9‹üøóÝiI^È ÷͑º|QŒÉëæÍZÝðx8üX’… +H’¨øˆ^©„X6ç‡ðeG¿ÀL—á¡ß%_î½è>íw­´@ûÍõ]ŸYÜt帺גõæ•(âרúìê¨à¹¼pŒ‘p,q‹7f£ÛÆòþñœúZ3åíd3꣓(|W / ;…øÞ¯¼= ÃĈãßôbï—æâô ï‰[Ä°ƒ¾/…?4-íz1Ž³º ‹Nõ»Ë«K¥˜|úЫ+qáƒï@ÝÝ,¦[Ü«•gx³0…wÒ×e¹©ðRq;¼ÅüµD›ö(îî¯ó‘Ô|Ê©Ð@……Q£¢£úÕ*}(Ô{ì´±!¿ª›Ê§‡,º‘_Þ_)EUhxÑ]ˆŠXl›ú½ÚšZž Šß¥IhR?›yzX`»ü쎰KßûåßîߕvÞöÜ÷;æ T¼o…±‹[¯ÂÚ ‡qɀã8ȋËpš»ZQ‹È‡»Ty„×Öñ|ýtCLR børµÃÕ§ÇÃï$ù—‹í–úÄÏq-wõÑ:XÂ.LùÞRÞºjZÔ¶õ¸©:?.îE7Ö$ Ä¿íüŒ~s¢Mq¢Íæx÷U-:ŠØ¬^™ç³•/§gÍú§µW[±‘B¥Y°&’¬´ªf3­UTŽô.Hõn8ê·2Õ˜æ;]Vž~{(Ô§zû"zÎVÏý~]‰Ña£Úö·•úÕëÓÊæöÑÌòÉüÒ.ª×wx :Üwnl`ÜM$Ž"CˆÖæ¹õC ýõCÛó%ê! .† m—¨‡PÊ-†PùçûÉ Onø"àFyóñªÛÛè]œ_Üs“o''ʕ5Ævn:·+½nw»û÷‡úíéãu÷æÁX0ʕ­Úښ/êÝÓÛNטSùûžõ%.QFŠÝπ–|X­Ÿ«—ß6Ûõ3kÿ}:`ænû&>7äõšSs +Ó)U Ð¸ŸÃ¯ûŽ ùÌÕQimÍþVïöªË¥ÏÍÝÔ”vwp¼½ŠU +–w«ÝÍ¥òýù;™BV?¨øñöóÍjñzz«ömíª¾|x\jK[([³ô÷¢R$2¹!§ÉìvÅÅÉÕ^Í—ê8¹OÚsó»sÕJ« ¶0Ññ¹æ¶B¨Ÿc. a+ :y®¹0„­€ÃŒm.ÞÀ×.‹0éE…À5’uš”ýem>>oÄ¢†´e¾4MªæDþʗM w:ƒ¿:øuú…}scÒߘEUhM®& ScoÕ¨às&Óφ, ”)iWÚß,çõ'Õɸ]îX9žñqí‡÷鮲]¹Ù¥ÒOÕÃÙïÈÐd)œîE +nێ˜ìX_ä“æœVበ+lšTÜiù¨^¤Oí׿SÁ§XG¡®Ø ™â õnM~RUµNÎUs"ÓèrDŽ>V¬œ/_~3W +ô©ý¦¶Vqjs­ŠSõ`çCl»^ž;¡2;š1ñag¥Q±|V¤ÄB7Õɵ®3åÃaY–sC·l–>-},Ñ' ó‡s[ÂÂrr::îÁuãª~6u%¸–Þ}ØsÂÎ7þeA$SÓÒø{ºVÞ]äUú‘“»G\&µKÝÓxƉê5ÕQCl¼zS÷ç_•V5©†“ùzw7Gˆ¾Ig“Ð^^Ü'Œéˆ–q6g[wê©ö/Ô÷û=`mK`Pìµ"ƒdß4ú Oþ0$Ô(’1s6ó«¤üûý[3L£á3K¯¾©Êw5sN¾¯]ò\ùbïÁ$[ðbn¡$‹eÚoÞ.Ì«8,Ý]­š•®×Ò·“áâ5ÙJ‚èýb)DúӜ²^vä±À'PÞïÚñe¥#¹5–©¡½ñ‰éÅ\º÷r¾vÇl4Ȋ9ª¨U]­Í¬ýºõ¾®Ñ#hhý$Ó¨1¿‚!Çu½óƇMt‡¾ÎÊDŽÉäÛ§°†hÌ# /\ò¼è¸S ‡°¤PZÜZîħ@yiï>QaÊ«¨mŸ8‰¼ +Ñøí—ûø9Ì«8žJwðxòåWœÿ¶Àôÿ˜IYÜ¿ŽR@v²) ûú iq»’îÀ^;Œ;؊’é¢-7ñÁJk†¯«í¶úýÜÂ(OQÁÚ¿fìòu UR,£: Ò«òhÏ8,—Îå:Ȅ™uà¿é©W;ëZÖA:û¢P˜}ñdցyûܬt(G:€aÒÙ(ê÷[Žt:<nDDØKa.t¬©ÓÁ^úZ((:´?l$è°pŸ—Š3DÎdôòkùÔñO—ÐA°ú¦ LªÒSqÔÛè´ä™<†ԁdè˜)Çê#N(êÛÎfpËGïg‡Øý;#¥m¼‰èl9¨ƒÛs&N,s"ôòí(/l¬‰PIê!S¼ä¾Ééc {>DAçͺ”Ð#ïó‚Λà ŠHD}èì9Ž°)è¼v ˆ6ìŠ${æ ñ­ûñ…û°˜=ç¬õKX+輙à«ÉðêÓÓ‰ÙstÞTG…˜=cÀ)ļi5ê['aû7¢c.´V¶«¾ûßRICqZb^N+!gVà´a¹µsÚHû6A´aa߉蜖 fŠÓM$æ´Ñâ´b?NššÃ)éW3õ£¯ª~ÿ=ÙÇlJŽŒÄlBI÷%Æ`$†‚RIÂCgÏqØb6¡¤Çb³ÏPÒÒ%¯µLg€‰üÀûZXõèýìÆ«¹â¥€ßÚÑ„÷8DkÃKÒ­Ö£S+­VÂùrz¡[wlîüü½<,W‘­Ë×fXŒõúÁ² +fY~•iêÓÏî¬:Ö,ªHdìj˯ …ùUM–_›ŽêãlgáAJ‰5-X¨‡I~³< Žçþ³æSk1“÷µy-&©ûÏkeýDàíy%üa#®Ž.^Z]œÕŽ0µ¡Á“Ö~ІFŸ6Ã,ˆ˜£y×ßî>›LÞT‰«Îë!ÕÖ_Wužf£ +ÏÿuUç)“Jž™.óªÎÃ0qáù¿®êüdX ÏÿuUçu8ùëªÎG!ÉÕKWÏ w\uÝãäá÷Œ^*Â[œŒ^¢KÑrﲬ|¿'©uñúËt$µîC9c’ ¤¶›pÈ*Š_”Áo~¾V¢óhô»E§+øŠ,MmÊH/¦µÐaKÎ+@ñ+>^ÖÞæII+ïå «Ô»5(X›ºSH¿_’B¡ ( B, +&Þ©qW³Â“O]œÉ£¶IuqXÊ´p’ë%ýðSåçÍS–ÄêÝ*¢õ8ÙUG! ÉâÎcq¾æôO8ñ=7xŽÙZ¾éèg˜žÐV÷áñN>"ZÕîùÅM³ýg·79Á úcÁüÛ Æ}ƒ _B›'“ù´ÁŠFoÀ´Ê•ÞCýâôáâö¦ÝûÓX°½Ï͝µº±`ÐÓ-xú­Qœ¬<?åñi 1mMNXFÿÚûcrâ1ü3*w܀¿ÌÀñ§ŸûÃ`–ñÙ8üfIøqsrB0ÛôØK(—C`Sځ Ö»ð¨åUsÚ¬ÀL6·ûÃB ½“¡HÚ[ Dˆš8—¸V¸•BRÓŠô•Â"¥ €ú¨6LŒR–œ\ G*KÑ+¦##Á–rÓv™ã…t85ò¤X4ÿZfRCÆ+ôR,-ŸƒºEð$K„@@ÒrdñWØ ‹FÃA»A 'δlË@b¹Zÿh_x°°‰i‡ÀÄÄu<$$U``‚T¢Å§æ}€–¯Šx'¨£¬Wd€R_ãôð‹%¤*V³G–ö¸åÅDJl~rÙÕx¹•–þ¸ð¤¤E ’r0jÆ lÙ ¸œ{±¹Ê*¤*d _ < ƒN¸pm’8–"?Šb±r&"-T4 s è›cD@؃\î®ÀBþ*8®HÈl2^]ᆃ¥¦ýíûŒø]²Art€µwÜ°ðÈÁ¡8§åá:€Áږ àé+#5P'…€¦/PéƒÐáÜCi(S,,/ÁMtò¤u« ’#ø.žÄď }Œ™BWàҙ$&• ÜrŒ{$æTDeÁxSǏ ړG…ƒZHuÜ>³Éø†qY M%p܇Âq0´Å‘©`_aÌY"ã +‡  Öò0^Šþ> ¼;ðˆÉÎðJ Ô( e„V¸\‡€(e^4-Cɑ“@‘‚f@àŸœkäW͛Pëø>E™m…ë‘m'÷ÌÚõ}d3жkkYJi`?‡u1ÐËÔpŽBV—V ‘rÑ<8lá’ccˆ%j¨€ ï´Íâ»qpݱo!Ⱥ l‚êu`AT||Д7»í«Ïmáïø°Q¨UÖVÕ:nŸÝö®é·b,®PÝ·*k +Å­‡?¯º­¤ì¢]ƒ¢?dþ³ÄùVÄ!•\]bø"‰È”D| QHGAÚñíëdü—Nˆ Σà 0O.=g0 f*0_`“Û˜©»™1:®Äa0Š-lð¾à Ø\6:0IÑêgE+láÛÚs඲@Gû*+<5éq⁠ ® ÔçàSáƒÐÂwÐÝA™‰™56¸‰ŽtL±`i|…%Р '¼h©®ˆæ.CÒ E--_¤)—9†kæR¿9P<:Š˜ð‘X…X&7Q ×7'UŒÀc%‹á@9éb$o3 cH¤œ”1¥€ÓIc'mlª5VòSDÉܜ0•FË‘É C*åd†•2¹aDŽtvAÇÉ{.‘žŠê†¶„Ù¡ÜGƽœ™—6b䎕1“0û†Ì>ÜÙ2‚BJž2ÐîGùÆò]‰ >Å0T-²Álr“[Ú0@k¡Œ'ÀÀ +È&ŸÉPp4U-=Œ]p •Ás.C󲸈Åa iŠÍè1’¬2C!‰P§PEQméS’Â\ZjjÚ$õ½˜<µ|ª½€ +å «g$þávÌIöÓÁ#¦û!ÇKøC"™òMÇMúC|ÇLû#É3Vâßsà…ÅFBé…2$íÃäåù!xÌL?]nk¹~'Û/Åæ@×c̜?Ý1ë/òÆÊûK8 £eþ6p*÷od×>åsô%÷¿ÝÝxŠAžðmaG<’²Ã³¦zÚ¦¯%y1i¤†~®ºË¸*F‡­{—ï½è¾Ú¨cF¡rƒ “ç6òHXG,JÒŗ#áK’¢Û®+½ö5¥bF ­‡ÛޟG¦öé•ýà3“s_È´°P9>­#Áš &ß—Gl®š÷k=Ère{%9e£\»½9»¸Â}i?ü ¹QÆiVn.ÚWí{¤j’†£Ûę*kHW½Î“Ö<ÌØ2´2k°Æ2Ç£œCZS©ƒ³Q¥ôשŸ +ÑdӚ[©Äæ©ÖK¥6à _<¹¹õW¥7OµþÑ'NqÎiú÷¥9çÅér+ßI†ØìËÄCû‡9Ò}s–#ƒ”ù?&üDŽãÿVy¨UþO[Ue-Ì󮪭ylVõ I=8??9¡?kѳòÉôsSSˆæv¯ Ôz~ßþ[×hßÜà»wð“qÞëރ¹Ñ5îÜþl5˜šZÞX™œø?ž‹uÓ +endstream endobj 6 0 obj [5 0 R] endobj 24 0 obj <> endobj xref +0 25 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000029195 00000 n +0000000000 00000 f +0000031822 00000 n +0000088050 00000 n +0000029246 00000 n +0000029600 00000 n +0000032121 00000 n +0000032008 00000 n +0000031322 00000 n +0000030511 00000 n +0000030760 00000 n +0000030808 00000 n +0000031468 00000 n +0000031582 00000 n +0000031702 00000 n +0000031892 00000 n +0000031923 00000 n +0000032194 00000 n +0000032368 00000 n +0000033545 00000 n +0000055932 00000 n +0000088073 00000 n +trailer +<<5C6B5E0266BBED4D88B3C749965F7285>]>> +startxref +88269 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png b/plugins/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png new file mode 100644 index 00000000..0bdea555 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_black.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_black.ai new file mode 100644 index 00000000..be5ef960 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_black.ai @@ -0,0 +1,1414 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 22 0 R 40 0 R 39 0 R 67 0 R 66 0 R 94 0 R 93 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Web + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T01:30:22+02:00 + 2019-06-22T02:45:18+02:00 + 2019-06-22T02:45:18+02:00 + + + + 224 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AF/8AOLv5/m+S28g+armt 6gEeg6jK396o2W1kYn7Y/wB1n9ofD1pyVfT2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KofUNQstOsLi/v50trK0jaa5uJDxRI0HJmY+AAxV81eTfzuvfzH/AOcj NHtrJng8q6dHfDTbY1Bmb6tIpuZRQHkw+yp+yPctVV8lRySRSLJGxSRCGR1JDBgaggjoRir7e/5x s/PpPO+nL5a8wTBfNlhH+7mbb69Ag/vB/wAWoP7wd/tD9riq90xV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKsx2AA7nFXxR/wA5L/n4fOF8/lTy3P8A86vZ Sf6Vcodr6dDsa/75jYfB/Mfi/loqkf8Azif/AOTt0f8A4wXn/UNJirx/FUXpWqajpOpW2p6bcPa3 9nIs1tcRmjJIhqrDFX3z+Q/51af+ZPl3jPwt/M2nIq6rZDYP2FxEP99ue37J2PYlV6hirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfKf/OUf5/8AM3XkDyrc/BvF5h1GI/a7 NZxsO3aUj/U/mxV8r4q9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVTnyh5t1zyj5hs9f0S4NvqFm3JG 6q6nZ43X9pHXYjFX6EflR+aGh/mL5Wi1nTiIbqOkWp6eW5PbT0qVOw5I3VGpuPcEBVmeKuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV8/f85M/n6PKlnJ5R8s3A/xLdpS+vIm3sYXH QEH4Z3H2f5V+LqVxV8WkkkkmpO5J61xVrFXsH/OJ/wD5O3R/+MF5/wBQ0mKvH8VdirsVZd+V/wCZ evfl55ph1zSm9SPaO/sWNI7mAmrRtsaHurU+E/SCq/QryV5z0Hzl5btPMGhz+tZXS7qaCSKQfbil X9l0PUfSNiDiqeYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkn/OQP542f5daF9S0 50n82aih+oW5owgjJ4m5lWvQbhB+03sDir4Nvr68v7ye+vp3uby5dpbi4lYu7u5qzMx3JJxVQxV2 KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXpX5HfnNqn5a+ZBK3O58u3zKmr6eD+zWgniB29W MdP5h8J7EKvv7RtZ0vWtKtdW0q5S7069jEttcRmqsjfqI6EHcHY4qjMVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirA/zh/NrRfy28rvqV3xuNUueUekabWjTzACpNNxHHyBdvo6kYq/PvzN5l1r zNrt5rmtXLXWo30hknlbpv0VR+yijZVGwG2KpXirsVdir2D/AJxP/wDJ26P/AMYLz/qGkxV4/irs VdirsVdir23/AJxx/PibyJqo0HXJmk8pahIKk1Y2UzGnrJv/AHbf7sX/AGQ3qGVfckE8FxBHPBIs sEqh4pUIZHRhVWVhsQRuCMVX4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWOfmB590DyL5YuvMGt S8LeAcYIF/vJ5yCUhiHdmp8gKk7A4q/PX8xfzB17z75oudf1mT95KeFraqSY7eAE8IYx4L3Pc1J3 OKsYxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FX0t/zi/wDn/wDoma38i+ar n/cXMwTRNRmba2c9LeRmO0TH7B/ZO32T8Kr6+xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVAa9rml6 Do15rOqzC306wiae6mILcUQVNAoJJ8AMVfn3+c/5vax+ZPmdr6flbaNaFo9I04kERRmlXenWSSlW P0DYYq8+xV2KuxV2KuxV7B/zif8A+Tt0f/jBef8AUNJirx/FXYq7FXYq7FXYq7FX2F/zi/8An9+m YIPI3mm5rrEC8NG1CVt7mNRtBIx6zIPsn9obfaHxKvpLFXYq7FXYq7FXYq7FXYq7FXYq7FXYqwD8 /v8AyTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdirsV diqpBPNbzRzwSNFPEweKVCVdXU1VlYbgg7gjFX3N/wA45/nvB590kaHrcqx+btPjrKTRReQrt66A UHMf7sUf6w2NFVe1Yq7FXYq7FXYq7FXYq7FXYq4kAVOwHU4qw7yP+Z2h+dNd8xWGiET2Pl+SC3bU FYFJ5pRIZPSp1RPTADftb02oSqgfz+/8k15s/wCYFv8AiS4q/OrFXYq7FXYq7FXYq9g/5xP/APJ2 6P8A8YLz/qGkxV4/irsVdirsVdirsVdirsVR2ia1qmh6taavpVy9pqNjIs1rcR/aV1PvsQehB2I2 O2Kvv78kPzk0v8yvLYn+G28wWKqmr6eD9ljss0desclKj+U7HxKr0jFXYq7FXYq7FXYq7FXYq+X/ APnKL8//AKqlz5C8q3P+lODFr+owt/dqdmtY3U/bPSU9h8PWtFW/+cHP+OV5u/4z2X/EJsVewfn9 /wCSa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/OJ//k7dH/4wXn/UNJirx/FXYq7FXYq7FXYq7FXY q7FU+8j+ddd8l+ZbTzDok3pXlq3xId45Yj9uKRe6ONj94oQDir9Cfyx/MnQfzC8rQa7pLcH2jv7J jWS2uAAXjbpUb1VqfEN/bFWW4q7FXYq7FXYq7FXhP/OSf59x+S9Ok8seXpw3my+jpNMhr9RhcfbN DtM4P7sdvtH9mqr4jkkklkaSRi8jks7sSWLE1JJPUnFX1n/zg5/xyvN3/Gey/wCITYq9g/P7/wAk 15s/5gW/4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FXYq7FX Yq7FWa/lN+aeu/lz5pj1jTyZrKWkeqacWpHcwV6HwdK1Rux9iQVX6D+UvNmhebPL9pr2h3AudPvE 5I3RkYbNHIu/F0OzDFU4xV2KuxV2KvLvz5/OvT/y28vcLYpceaNQRhpdkdwg3BuZh/vtD0H7TbDb kQq+BtU1TUNV1G51LUrh7q/vJGmubiU8nd3NSxOKoXFX1r/zg5/xyvN3/Gey/wCITYq9g/P7/wAk 15s/5gW/4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FXYq7FX Yq7FXYq9T/Ib87NQ/LfzB6dyXuPK2oOBqlku5RtgLmFa09RQNx+0u38pCr740zU9P1XTrfUtOuEu 7C7jWa2uYjyR0YVDAjFUTirsVYX+bH5o6H+XPlaXWdR/fXclYtM09TR7ieleINDxRert2HuQCq/P jzd5t13zb5gu9f1y4NxqF43J26KqjZY41/ZRBsoxVJsVdir61/5wc/45Xm7/AIz2X/EJsVewfn9/ 5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ//AJO3R/8AjBef9Q0mKvH8VdirsVdirsVeveWf yOuvN35Ky+cNAR5tf0u+uY7qxWrG5tY443/dL/v2PkxCj7Y260qq8iIINDsRirWKuxV2KuxV2Kvd /wDnGz8/JPJeox+WPMU5bypfSUhnck/UZnP2xU7QsT+8Hb7Q71VfbiOkiLJGwdHAZHU1BB3BBGKt 4q+A/wDnKHW9U1H85dbtry4aa30ww21hCfsxRGFJCqgeLuxJ64q8nxV2KuxV9a/84Of8crzd/wAZ 7L/iE2KvYPz+/wDJNebP+YFv+JLir86sVdirsVdirsVdir2D/nE//wAnbo//ABgvP+oaTFXj+Kux V2KuxV2Kvt//AJw2/wDJRzf9tW5/5NQ4qwL/AJyj/IH6s9z5+8q23+jOTL5g0+If3bE1N3GoH2T1 lHb7XTlRV8u4q7FXYq7FXYq7FX1H/wA4s/n48E1p+X3mecvDKyweXb+Q1KOxotpIxP2WNBF4H4en Gir6xxV+e3/OSP8A5O3zT/xnh/6hosVeaYq7FXYq+tf+cHP+OV5u/wCM9l/xCbFXsH5/f+Sa82f8 wLf8SXFX51Yq7FXYq7FXYq7FXsH/ADif/wCTt0f/AIwXn/UNJirx/FXYq7FXYq7FX2//AM4bf+Sj m/7atz/yahxV7o6JIjRyKHRwVdGFQQdiCDir4j/5yU/IR/Jeov5n8vQFvKl9J++hQV+ozyH7BoKC FiaRnsfh/lqq8IxV2KuxV2KuxVlf5T/+TT8m/wDbc03/AKjI8VfpTir89v8AnJH/AMnb5p/4zw/9 Q0WKvNMVdirsVfWv/ODn/HK83f8AGey/4hNir2D8/v8AyTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9 g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdir7f/wCcNv8AyUc3/bVuf+TUOKvdcVQ2p6Zp+q6d cabqNul3YXcbQ3NtKOSOjChUg4q+Bvz5/JTUPy38w87YPceV9QYnS71tyh3Jtpj/AL8QdD+0u435 AKvLcVdirsVdirK/yn/8mn5N/wC25pv/AFGR4q/SnFX57f8AOSP/AJO3zT/xnh/6hosVeaYq7FXY q+tf+cHP+OV5u/4z2X/EJsVewfn9/wCSa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/OJ//k7dH/4w Xn/UNJirx/FXYq7FXYq7FX2//wA4bf8Ako5v+2rc/wDJqHFXuuKuxVJ/NvlPQvNnl+70HXLcXOn3 icXXoyMN1kjbfi6HdTir8+PzY/K3XPy580y6PqIM1nLWTS9QAolxBX7Q60dejr2PsQSqwrFXYq7F WV/lP/5NPyb/ANtzTf8AqMjxV+lOKvz2/wCckf8Aydvmn/jPD/1DRYq80xV2KuxV9a/84Of8crzd /wAZ7L/iE2KvYPz+/wDJNebP+YFv+JLir86sVdirsVdirsVdir2D/nE//wAnbo//ABgvP+oaTFXj +KuxV2KuxV2Kvt//AJw2/wDJRzf9tW5/5NQ4q91xV2KuxViX5n/ltoX5heVp9C1VeD7yWF8orJbX ABCyLuKjsy1+Iffir89vO/kvXvJnmS78v63D6N7atsw3SWNvsSxt3RxuPuO4IxVIcVdirK/yn/8A Jp+Tf+25pv8A1GR4q/SnFX57f85I/wDk7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/AIz2X/EJ sVewfn9/5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ//AJO3R/8AjBef9Q0mKvH8VdirsVdi rsVfb/8Azht/5KOb/tq3P/JqHFXuuKuxV2KuxV5t+eH5NaX+ZXlswjhbeYbFWfSNQI6MdzDLTrHJ Tf8AlO47gqvgHWtG1TRNWutJ1W2e01GykaG5t5BRldf1g9QRsRuMVQWKsr/Kf/yafk3/ALbmm/8A UZHir9KcVfnt/wA5I/8Ak7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/jPZf8QmxV7B+f3/AJJr zZ/zAt/xJcVfnVirsVdirsVdirsVewf84n/+Tt0f/jBef9Q0mKvH8VdirsVdirsVfb//ADht/wCS jm/7atz/AMmocVe64q7FXYq7FXYq8U/5yN/IiHz5pJ13Q4lj83afH8AFFF7Cu/ouf9+L/utv9idt 1VfDU8E1vNJBPG0U8TFJYnBV1dTRlZTuCDsQcVZP+U//AJNPyb/23NN/6jI8VfpTir89v+ckf/J2 +af+M8P/AFDRYq80xV2KuxV9a/8AODn/AByvN3/Gey/4hNir2D8/v/JNebP+YFv+JLir86sVdirs VdirsVdir2D/AJxP/wDJ26P/AMYLz/qGkxV4/irsVdirsVdir7f/AOcNv/JRzf8AbVuf+TUOKvdc VdirsVdirsVdir5q/wCcoPyB/S8Nx568rW3+5WFeetafEu9xGo3uI1UbyqPtj9ob/aHxKvmv8p// ACafk3/tuab/ANRkeKv0pxV+e3/OSP8A5O3zT/xnh/6hosVeaYq7FXYq+tf+cHP+OV5u/wCM9l/x CbFXsH5/f+Sa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/ADif/wCTt0f/AIwXn/UNJirx/FXYq7FX Yq7FX2//AM4bf+Sjm/7atz/yahxV7rirsVdirsVdirsVdir5p/Mf8gP0N+bXlTzz5Vtf9xE2vaa+ tafEu1tI15HWeNQNoWP2h+yd/sn4VX0tir89v+ckf/J2+af+M8P/AFDRYq80xV2KuxV9a/8AODn/ AByvN3/Gey/4hNir2D8/v/JNebP+YFv+JLir86sVdirsVdirsVdir2D/AJxP/wDJ26P/AMYLz/qG kxV4/irsVdirsVdir7f/AOcNv/JRzf8AbVuf+TUOKvdcVdirsVdirsVdirsVdirsVfnt/wA5I/8A k7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/jPZf8QmxV7B+f3/AJJrzZ/zAt/xJcVfnVirsVdi rsVdirsVewf84n/+Tt0f/jBef9Q0mKvH8VdirsVdirsVfb//ADht/wCSjm/7atz/AMmocVe64q7F XYq7FXYq7FXYq7FXYq/Pb/nJH/ydvmn/AIzw/wDUNFirzTFXYq7FX1r/AM4Of8crzd/xnsv+ITYq 9g/P7/yTXmz/AJgW/wCJLir86sVdirsVdirsVdir2D/nE/8A8nbo/wDxgvP+oaTFXj+KuxV2KuxV 2Kvt/wD5w2/8lHN/21bn/k1Dir3XFXYq7FXYq7FXYq7FXYq7FX57f85I/wDk7fNP/GeH/qGixV5p irsVdir61/5wc/45Xm7/AIz2X/EJsVewfn9/5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ// AJO3R/8AjBef9Q0mKvH8VdirsVdirsVfb/8Azht/5KOb/tq3P/JqHFXuuKuxV2KuxV2KuxV2KuxV 2Kvz2/5yR/8AJ2+af+M8P/UNFirzTFXYq7FX1r/zg5/xyvN3/Gey/wCITYq9g/P7/wAk15s/5gW/ 4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq+3/+cNv/ACUc3/bV uf8Ak1Dir3XFXYq7FXYq7FXYq7FXYq7FX57f85I/+Tt80/8AGeH/AKhosVeaYq7FXYq+tf8AnBz/ AI5Xm7/jPZf8QmxV7B+f3/kmvNn/ADAt/wASXFX51Yq7FXYq7FXYq7FXsH/OJ/8A5O3R/wDjBef9 Q0mKvH8VdirsVdirsVfb/wDzht/5KOb/ALatz/yahxV7rirsVdirsVdirsVdirsVdir89v8AnJH/ AMnb5p/4zw/9Q0WKvNMVdirsVfWv/ODn/HK83f8AGey/4hNir2D8/v8AyTXmz/mBb/iS4q/OrFXY q7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdir7f/wCcNv8AyUc3/bVuf+TUOKvd cVdirsVdirsVdirsVdirsVfnt/zkj/5O3zT/AMZ4f+oaLFXmmKuxV2KvrX/nBz/jlebv+M9l/wAQ mxV7B+f3/kmvNn/MC3/ElxV+dWKuxV2KuxV2KuxV7B/zif8A+Tt0f/jBef8AUNJirx/FXYq7FXYq 7FX2/wD84bf+Sjm/7atz/wAmocVe64q7FXYq7FXYq7FXYq7FXYq/Pb/nJH/ydvmn/jPD/wBQ0WKv NMVdirsVfWv/ADg5/wAcrzd/xnsv+ITYq9g/P7/yTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9g/wCc T/8Ayduj/wDGC8/6hpMVf//Z + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e + + uuid:29dab8d7-5b1c-014c-8e3b-a6adb016ac80 + xmp.did:66A6819719206811822A897E387FE54C + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 99 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 96 0 obj <>stream +H‰|SÛj1}×WèVž‹®` ö6.B)Ý·úВ”?´ýèh$e×nŒÐŒ4šsÙñîãlw÷3ØÓ»Ù°õ÷ëÉìÞûôÛü´¨Gh9$KÁ~»hÑŔ"ÛKÝ|$‡T$Ë>;Î5þaͧí{NÒœGŒk—)¢8È,o4c +RDÚn“ÜöCæ+>SJJ¨îÊÈ£dHRÅä|ô=xÇ´=…äRxm~w/ìš!Ø 9-¦ÁUOfúZÃåÑ%QlD—…z—Q–‹ÙÀ ü,+I,ËË’¬ ÷³Æ"à ‡åÙW‚¢K9‘í[?E” ‰Ïìˆ u˜ÚÚgYÇ©1¶¶d¯hZmͱÈâûÒîBèyèy§«ï£Äç~Î #ÄJy8@!ÞÈGߥæÞãVè95GûË[Žr’wW~ŠŸzÏÜóq_㲞)ïyco·uº¶—²wX¼Ã"sØd ªƒJð±Ý©éZªÒ7’Îý<ý-iH©VhÞûý´\?i•Q힪ï>9Ì,¾Ëøùp0þÏÌ zwlù`S‡yRKY ›ä‹ïíDbIvùn¾ì¯'Dµ {•ÒeÔ/8&Keäuʶ À›é:^×½ÕcÅ:LìÒ~Æßz}xX>˜»¥ýÏÿ0J‚ý +endstream endobj 99 0 obj <>stream +8;Z]_5n8N$$q/KmrsR+pb-FV*b(FC? +endstream endobj 100 0 obj [/Indexed/DeviceRGB 255 101 0 R] endobj 101 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 94 0 obj <> endobj 93 0 obj <> endobj 104 0 obj [/View/Design] endobj 105 0 obj <>>> endobj 102 0 obj [/View/Design] endobj 103 0 obj <>>> endobj 92 0 obj <> endobj 106 0 obj [108 0 R] endobj 107 0 obj <>stream +H‰\“Ûjƒ@†ï}Š½l.‚§=$ Bb*xÑMûÆS¡®²š ß¾ëþ!….(|̎ÿÇ0†EuªL7³ðÝ͙fÖvF[š†›mˆ]èڙ N˜îšùNþÝôõ„®ù¼L3õ•i‡ ËXøáŠÓlötÐÅ6Aøf5ÙÎ\ÙÓWqÞ°ð|ÇêÉÌ,byÎ4µîC/õøZ÷ÄB߶­´«wó²u=7>—‘Xâ9†L3hšÆº![›+YäNβҝ< £ÿÕS‰¶KÛ|×Ö_OÝõ(J¢ÜÓ´ ½§8• ô¥è‹9( PR ځh’ž’tZ)N}BZ Æc_Ï äIäqäIäq JAH—HçH—HçH—÷„H0 ‰IpLBb¼ž¬å O O™IÌL`f +3°V°°V°°V°°V°°V°°V°ðTÞ3Ù˜ òJx¿÷ XWÄm2{ì_s³Ö­ž_w¿së¶u†Ä8ŒÌu­Oð+ÀøJÏ +endstream endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <>stream +H‰š a{ Áÿç÷  J `Já«Øå +endstream endobj 112 0 obj <>stream +H‰\U P•×þι÷"ˆâ‚ˆŠ>|ˆ ƒJ 0X%bjô‚hAÁ…ºcM£I´Ö­Æhš8­ˆËCͤ©N"“ŕb\f´©©UF¤1¼ÿö€N›ôÝùßîùÏv¿³\€¬†BÌÄÉÏ é³G8§äñÌ,[ä<Ø>¿ @=6 +JfOۓÛð;8¾œ]´´àü£E‡€ €áͅù¹³î. < +¼4Oô‡ +ÃÿÕÈþÙG/ZriÛGËdÿVT4f®ê“9ȏF^*Î]RÒ9§í{Àn-òÎy¹Åùۚ“ïË>Bü7•,È/9z:dp 7àJ×Ñ&Xð³vZC%Ê°§o•‹îdYÜFµe¶Xë;dNcI’Xm+2ҒœH„Ó4ë{ö*9KÏNcD;OoiñŽ`}º‡¼{©<ôÌígÏ×-Z-ßmŸ1|­Åä³çé/CÖïZÿ3(íé³PblÆÛÂJP!t~=²­ø%þ‚Ló­pñáÆQ›Vb/1X´âpùØÄñ*J7‚0bT%­A´XÉÀv„à¢XhüeœÃ8^´2pNÍðs›óÖµ&{(žôœÇCê£a¿f֛]æ]´Ç÷*ÌwÆ 6Å¢• c…D°²y4jޔ˜²$†r|„s¥¡=è„WDú×؁ñ .â+|CD¨?­¦«ToÁWcטq&ÏÌG +^F:VË×0êKc8Gå¨ÃêšïoöÓKlg  K°¿Å&Tâ®ã&)öç ÎT‡Ñ£‘ƒE .á²ØüV0UJQ”IÓh%½Nií£Ct„¥p¾RJýJ¦íãovš +ñÛ=¥6Hfâ0AòY‡r¾ä¦è +G±[‘nç³í¡æ%SnΚkp¡ŸÈŽF²œ9 S%ê¥x 'ñ™èÖáþŽ JŠü©“`á$½B“i±Dq˜“»Jþ⸈q½ŠRuzª>â;aÛÇìǶ1•ÆkΘó­ù&~’$¯¢ [3ö¡ø9‹»¸'âÃA½%ÖT/çÝ!öoS³”“¯âClÔhµIÕêP½Ã~Ù.¶wØÇM¬I“ÚRÒa¡ˆ•5Rª)Ùb{ ¹%3Ç¥zðˆºQ/Š¡q4…²ÈC…4ŸJ¨”–Ó +Aµ‚NÐIj ›ôˆ5;8XpŠâ™¼†·ò ®á¾« &«,Uª–«­ê„º¤þ¡ƒ´[Çè4íÑKõ2 –rtõ;ßÒ\ìËóíô±ÙÉö/ìõvµÝ`m̧æ8#1fc¶Ä¸Rοñ¾ÔÇA‰ñ¯¸‡FÉùw‚…¢¶Ô]"îݚ·$‰;M"ŸJÙT «æ +þ«©’ŽÑ):MÕTKçè +Ý¢ÇLý Y£¤ 2¹@ΰ“+ÙË×e=á«HåVCÔP• ÁôÆ` %HT2­Žê --?Õls Y§ïY¬®ÈM¬¾¤zHéÜUÐÅá’}=”÷8éÀëRùÓTÄé;jÿŒo +¯[©ZÎxE|’öH^â¤P:½«c• +#0—·¡—p©çLü“ÖP°tn“ä&‚  U ÏD=gKÖ/Q'D«¤N‹±žÞ‚›|tçy3†Q¾ú¤9Ôן©ù!U©TTQ“®Õµ¬ÅRµ #Ó#Q*d¯ÌˆLéÌp)U‹ÝRÿ¯Êœ€Žü„VpæÐuŸöñLD¾ZÈci»ýDQC±?É4IrŒðƒo…éXÝr‡$H5Ζ;¦P߶ִÐêªúÞd›p{†ÕÞ¾…e‚NªL·õÒK©¸A]i:M҆Çkc¦ ’ê[&„ÚQ8.é0ûCŠ§ã¤R@“¤Â§;*|ïèõúu½X¯»©I¦æZlÁNüYn“äÞê'8N4§Éì™#wD †ày9]^”©4N¾¥cŠÌSLÉÌC©LÞßãªä†/xL½ÌþB¹¡–c•ôÿ:l°ûq™òû*œßà³\Æsp7Ôç*‘¦ ^¿©Ë1˜DÅópÉRoÑÛ`®Š·è!Ó?VºTêÞ4šsÀwQìí—Ø·8^D£# ý1‘~ÐÝÉJLÊÊÌH|!atü¨‘#â†?;tÈà˜çE»£èß/²o„«O¸³w¯°ž=º‡v éÜ¥s§ŽAÚ¶ ðoë×ÆaiÅwŠk¬Çéôxu¤+55ºeïÊFSXc*ãuzZŜ?•Lɂÿ“L|*™ø_I +rÆ#>ÚíLq9½uÉ.ç)gR–пIve;½[é´VzS+(tx¸(8Sº&;½äq¦xǖ¾•âIsUþI®¤|ÿh7ªü„ Êâ*©¢j%8$edÃ/P‚òvw%§xC]É-xUߔÜYÞôIY)É=Âó£Ý^JšéÊóÂõÆ«>¶©ëŠß{ígûÙ/ö{/þz~Žóž_b'qB$ä£ ~MHF¥ã#e6!•C@@7:R[ÚI„MPú`ÒÖ?¦}HÕ j7UzNYê„QåI¨Cýkü±ibSÖ±ªžV(+8Þ¹ÏNJ¤iÚÍËÉù¸¿{ι'÷š¾”Õ Y˘Ž!Ói-£¡»Aç•|ë¢q¡À£ý¹w@;0µ/cÚ¦²t !ën3C¯,…¿arq(óÚãVÙf ‡(T4Œ×óâÎÌãV•Òl怱¤q$gŒÀÒÀ‰£»XœÉfL|–TèNè®*û;¨ SMîyÅdµAí°ñ|B1L´ë¤:‰èóåÛ(2¬ãM5Ó²–ÚÍû‘±ëä{’®Hë-m­y^¨86ïõU®æqæàšÍâ¬î”ݵæYLiOAB˜Ê´H2쩇’ƒ=ȘînвF™ "GLv(gð}TOǛL#¯)Æ= ?]¯™ªjü=DYš'k©öUÞL¥Ì–š"Î!ˆ)`ÜjÉ]m­/Èí¯ÀpÚ¾ÊöµƒûU•ø|AGûA0gvf*²‚ö˳HoOeM’£–ÅUKàYj™Yµ¬ ÏiÉW}fLWbíóñÁÚáÃ}&þóÁŠ}t·6ºsoF6rUߎŽ¯“*öž5[•3k‡26™T9"Û,+$å¾µÎTÈp¦½>‡•Ô +Nd¥¥ÁʈÉç¶WhÖ­ªÿç Bù_t”õçËaU˜f_j½üÄ:y<ΰ`{‚ŒŽï5 ÷:ÛT Ãє#gLÊ3û5…׌y¸‚$ŒcùՈÊ çesäB6q÷A¶4˜×ð¹yŸÛ½73ÏÃsçÜxf.7C¹Ál¾l™y!ÝÒª¥J*(T@£}®Ž´¿<¯#4cYí–Â’§ Y:ת£é©èøÊB k!.¯Ó{Å¢¯ö¶ƒÎUÑÍTz7U{»ÀÂSËÜ{àJC•F«ÆÐxæñ|°™U0ÀbbÍ|U{YÍà ó[ÚI‹1Lj ô2§£YÃPàGƒù§÷d*Üoâ J­Ïš0¿iQ˜;K‹¼9³&0ö{5jHÌRQ©TôF³Ö ‡Eá0Àfá6`?ÄÀ9ÑHÞá,`î +성SƆܘ9›DX'ÕÍa$¹¾új8õ ¿Ü?Vꆿß?ƗúQº¿ÔO7vlT¡QÔCvôH±->Òô)öE„ÉäÊ#¸»ý^.;ôd3×Â&ä­u‹A‡ƒáCÁÚÀÖZfŒek/zâž½±€ÆÒºâäXi¹Ÿ/òK°\º_{{1%;ð$îÅî-›7Áÿ['\ëý"ýÏëÐâÉIÉþ_$9¯(9_x’èåßÖñݘà]š',¸¹+…K—W +×9· yâøé„qÛÊ#rªŠ¶™%lD"RÄN³¢#ä u»4àõÁu‚ HÝ¥<¶Š÷>Å»€-¸ëÐú qºDWg÷±«“$ô¡ $§þ+ÚÏN¬”Wލs ½Ž·_ºŒ·ß´aO|eТË_³}·ÕûX6ˆ%ÖփzÙü;Á~}¿Ì¾îzý!þ1{¿ÃΡ9ü[|ýþÿƒ½°!‹=ü»_Ù<[Ñ[À³ºO¸®µÛ°í–PÀWó¿§ ¥ârq µa#Ç''á-WÙÞRq¿íviŸ ’›üÜã÷ +ÓðE¦QòqæíWòyÀM+ÿÕv‡¡o¹vüî{"qk å»ÈV^žms5?ÉßT^FÉòç(¿òçsQ/ëuyÉBùâËwgë¼mtDKù®®53Qo½7.uÅ¢"ڀ“LM\óªbë#2LMdȇs¼RǛ ØáiµÒi¬È߇ؤ!£ŠŽÐ[‰ÐÐI}/ÙÀ'ÂRH +JÉ/1Ž¨\'ÇäzÙîH&š͉–„ÝááÜ˹8'Ç8l‰¸Ð #¥6¢ã”£QGmövk>UDz$Áµêh’‚†)Iµ@KF=Ն{oPÙõ€«•Òþ˜J ”c11/”ê:0IT"ó@$7­Q’ôk€bóC?[Lô¤ÛÜ@‚”«óK*äS=ŒÏª§£êÓÄÍ [C”TЭovx+o“ øººxëȅ‚ð9;A“LhqøA7o»lwNüÉÓßÝP7ì 7ú ±m|p|¨EjêýÊ÷.¥ÂM½Û/\$üh峟}û‰.õ='>Â<åãoôï9õÒï4I[¹½8ÿÒ́¸Ô€ÕEÙ¾%ëŽýœÍü¬è’ åºOp +ëòq‡lg} äÄáŸê,Ïq>þÖE¨†ˆ†à\Õë¹S”ý 伪½ÖÅIÄ•œF +‘›º|ñ˜¿FŽ¡(z߬dœïb?_*òËÖ/áx‡z_{ÛØ¿·ü›uÂÆ4iEYP7YÅI[§^˜ÕRÐM¾•X$+}ƒR¬¬üÓÏú$·K²?x¸/T+†ÃbmÈÞ±Ç! ¾ žø%x✥îΓL*£óÍ5B£=î–eÿ@œñ0ðڝ@nÔ^úpsº¸¹bìØ(ÏÃÑú³Þ*7tn÷½â=›<Ût¶ù­¦·š¯rWZØÑìâzZìÍZK,åOƚ4Îï¡ #}"ƒ_ˆ¥ ½ÉÕÔ"†ŸMYtÕ¹z¿ê[æ^B,òਤWXÖÍE +øßW(&tA½ë/Â@ã“5ä›ð 6ý=ä(jÅ?X=¨üýezN€›‹Å4¸|‰/âªgõ,¤+8m´¾A •D@ ë¨Vtª÷ëXlR=t§OW ÇÇSÙnÕª½Á@@íjèÞJº:!‹NGµ@W˚ã?|Wkp×¾ww%­´’vµ»zìZ¯•%Y’eËÆØ ‚DE8!úÙWÏ0HYüwÝì®·¨õ‚ ›¨N§–÷Á›‹#á,>ß/(eÆbû×îøFΚ®ƒýFFÓ#ˆ ”Ø“Ô°Ãá'òRÇk0{  3\ŠŒ>+¬¬j¢Ð©°¥3Ø1=âcn[„ªI5ˆŽás‚Lð3÷wÕo=síýÕ+fêQà^ÛûÒÑë×m`*î'˜d6åځ }'¾®ŽLÑ\¢"þò£·_xïÁã¢Ê°¡'EÈ® +|RŒ*p¯n-ÉáÉ!©_óGò7Ê_ÒíÕL-;ƒidg3-¬1 Þù Žï¡Â^<9œÍŸÖ-p‡o‡Y[¾ù Ã0¬ÌÈl”‰² iºÔ(µJˤ5R—Ô”úÂg¹³âU›Äak +£ +F´¶àBm¶&¶*µ²b_h0ñ™õ’å²UlaA\‡”ä€Óïò¹Ác ¡°Íá¢\‘¢Ê“@SqSiÂà6ÚmáJ葞¾²zš6eñݨ— %õf›çoÆz”ÁDE‚I¢þ„&¡0#+µ£?T_aÇv¥rOÅën[‡t!¤Ñô(XÑ`%RëaReB¯d +í$ƒ# ¼ƒyÚhµq6ʘd:J¡,~Ww¢¨4ø¬ o`–ÒVdMž²×ÆYêk½Èæ9Eõ1Í"†/¦Ä‘ïø‘’ ¥€oˆŸœPÄÂ/¡¿qÇTÞ*h"ý2¹ÞSý¹dåN¹%ÉMqÔEúŸLT|½^µ„ýÛÅÒfÎlâZ$ 2›Ìœ©•BÀ¨à™!¦Œ4/ÀÆXÍ¿Cºq€¦Á>(º3ˆvÓ¸n§_¤iZ•à×xüóÃÂåt))µiÔ3¬B›»§ ÀsöòRxvO! >ãñRܶËÔ"œ”]¹“¹“0¯("“ÏUºí¢GŹŽ"ðýn˜(ÑÆü3‡î@1TƒÕì5mô–ÓQS$P˾qÞPFè̺֧Y8¾Á™Íßԓ|è<ùKÉÅÀEíjäJ‰)ì,q};Øi*™LGZJ–ñ˔¥‘ç+x“¯ôU’iˆ àDm‡-n´ôá)NŽ{eÙçՂ¬GËgZYdƒîüÚodU Až%Pê$½ +£¶àBYØ_ µ£6¯ìï.ˆµ››Ä}¹%³?i|±PüFȽìƒÇ˜ »àéӞŒ º4OcÄLùâ<Ð¥ +y«rÇ?éÓ³¤IFÉìlð(ӆx'¤œ=MÊVh"æû¿øáΝn½sÔouõý„<sR™e薲=ü©çþÏV}Аíä|\⋽ƒcCÀÕ÷`—I·::núÁë'Þ«Kº$·›+]ä+o#rücï«¿8y)ˆø=AXW e–ýzD·/²µÛ^¶ï-é´wÙϼSp³€õÒ.ÆÞÇqSVL”€’h=GZ1¤m=@×ý)wV¾FDZ£¡‚àU©¸ÈG24‹Bâ~­ +ê0¤yDwÄE]Ü,^­¢T¾ýAðú4w4nžÂ–Daa<¡E9Öä½8Z‡ƒe4Î̯Y‘–L~­*Åãpy¼¤¼¼´D«j4²FóóÑqWVŠciF•†|ՉzV5RKz ˜èížÝüÜõ±—8ÃQäãïa÷c?“þOøÕ/IظñŒÿ¦[žU†²ÌÝ.·¿ uyφäü²"#²MR€Ÿ +˜–DžDJá'‹9>rVµ+‚™~ž­Xn£ œÊ¨“Ö5s,õ_óÉhñ¢Ž•m¯´¬R$Iû.«^ÞÞÒß°‹b̐ÆjÃÙ(.knúÞÂô?'ýkY¹«Hݑ~01aF%äÞ_!5xln‚ì=¦I¥’.-–ÖHÛ¤ïHT¶ƒ[. Kڙå6›f÷¤#"ʱ–wa8|.@:ì,.‚Õèï!jCœV«M +@ržÙcB§T.mœRmý—Ï€n:ç=Äpyö ¦…&6|i˜‡?wڇ?%˜÷EPö+6÷G=óðói¤BY3ÿ"údÒ¹hÕËÚÄ­âË"‚…}9f<¢úrLtÞ'q»5@NÕÍq ¹^ÎÂIÒôÕã…?aՏ]ñ¡G×û9^ïD©Ÿvh­"Zk/bh +ÆôZW¥«Ê9ÛUíªuÍqé®FWÃçÚ+ìgä®Bk¨pi j l£¶lTi ‰j +,¥l ºrŽá¾¡jPª«®žS§UŠ.<Ty°ˆ¿Îßå?ã­Ïñ:oáSNžw951¢Æ&4NƒZ*¨iJP‹T$ÌÉ$—„ÉT<™LĵŠ”Ž'× 5‚ÆT}c£^¯ÅÉ`nqQ~N€T¬R¯!Rd,dñ‡ÆBUVTD""ëpª^®”'<íèy˜›Tórñ8·=æ>¬#âj}n<‰ºÞº:KÔ;å›Ö㠇‚ÚÉ: ìt“ÖõµÃîLÇÉÏ&ãî'ŽZ·<Îü$2¿Ç0ÿLd( æG}k·Ú²"Qkžl¤Äzo‹)Àg÷c* ,pµ˜ ˆ ­­r ,ÁŽJXы¿þ×m›µlilA+ ð +üudyÇ+éBwc 5[Ä(ñ©s +(aƒ$S Ï$Ë̞ëÏë74´…ª¶V¯¬hnÆJ}í«Éâ¯5¤ŒÇ…%E…sé?à‹ùKÛÒ­M©TSÍüé³XÍ𘾤i]ú†ñ|¨qYNt­9˜ +HåÊ—!•W}zå-ò /‘—hx‚î"»h˪‚k¨µôZÙòšü ¿¥tƒ3ÐP^P ¬‘_Í$*"S’(ú$ŸYƒÜYf rgŠu:³XÍmÖ Žˆp8£9ÊSf!*­©"Áp—PQ’²R¨&ñ¼›eXÕ?$ —#Î(G¨I¸M!.S‰Lq¦GP¢ø_*ÏÿW‡9`£)š¤!°!ÁÉtŽY‹bF-š[ׯúØ&Î;|ïs¶ïlŸïîõù3¾;;‰“æà $Äé™ø)kÕ]VRHéPéšÐ* ƒM6ÖIãcPV í†(S骕ŒP jÆ`0Æøк…­‰U…‚(C*YaŠ¶J«íýÞ³C-ӒÜÏ÷Þ½Îïóüžçù©¾zñ­0.ЫŒ®nPÜiÅ ø9vÜÉ¢ÏÙÑcó7w=9'µÀâÃe"s³~ðÜ£+û'»Q‘+kºÚ«¢Ê~2áF]«fþ0{ë.‚€m)' á)?zÐLIŠMÁ~…9ƒÎðïÑï—|`g—Ú{Dz ½ÄÖãèázÝϊKä§ýŸÎº“áv—N‘~‚ëÓã·>M·¯i…¼T=õ$˜Õ0½Î H:kÂ6ք=}ìQv„ý½É–°ÃèʁHÐxÎkÍv÷‹…¨AtÇ +…üíP¨@(Äù±ƒ^ìÁþCù+”œ¿rÀ£ùN´µÉ+ØÎ`RÄáü¿LYˆfx ÅÁA±“Ïo˜¥Ÿ±c^‚—P,ú[1)20Ùq”à†ã\^ø&šÔ4ª&ê0ù§ ajbžš<•¦s£ÇOäþ¤ǑÜyy×®ËäBƒÇr7‘xôs7÷³‹—v¾úá%À¦r>éÞrjÍL'´$àjª‹:én÷S0a—º—£U÷-«ãÏã.Ø/8ÿ–¸Ðpýˆs™f•}³`X%bµl0Y FJcJÁ¥xéô–4#–,ºrW%Ã1€©ž¤ÎsU:Úf³SªQÎVè‚9BSk(Jç”.*í+µ•§<±y"ô“M“Ø?M[ÿ‹òþ½»ñ®A`¥«þ ^ ¨W»Ü"¨7ä?x+¿¹…8¦Ðed ÷l©IРûX±ú¯ßÌe\ÞôŽÕRÖ¸Öo\ô‘ü%&ÝԎn™ëq&2ƒ–¡º¨žöm ùç©wä3måóÊùÖ÷Û>–¯6^oûLkü´MâeV)iu¶©²Oñµ†Û6Æ^nüÀ?&?žêIõ+Sß36¤6¯ãý˜Ûl ©ô\GuU¼¢Áœžn Ýçj¡§ÔÇmuӏ‹á(F Ó§ë¢>“FM­Õ £WÌHÅ4]§ {g‹>'º(Úe¢¡Y _‰U>Ý$Šª€vš]}U¨*øÀL;ÃVp:ÿÄ÷ =G&² "ðÎCÕ£ÞìU«ù²ÙQŠ`Ü %+¶$I÷À·#œßÂ\j±Ì-ÕÜ&i‘r¹ÜßêS)#Ü¢¢f ŠÔK%P) uúý¥i𽐑N©ÓT +Ï­ØEL¸PPA-?Gÿ ¹Èáüß)þ՞¿±¿7ƒäˆ)éHj¢»ûad³’X +ôØ ÕÀPRD^¬ ´9nÇ Àí˜2òàdȦ·‰ aR&É18A£E¶q¶%¬|æ£#¿&0K^65¶Â;" M‰Š² +‹…S˜ÕdÐ ÈÀ)65oÝ Ƭúµƒí_[ôçS§Ö8|n"RÐßÞ·{×Üy¹Së9·m/S] +L}1R‚éDª¥º)]ä@|õƒKßXÞPôW@__ZŸYÙޑLjÏ¤Ÿ]C&”­à̆m+UC1ËþFîp(Lï憸ãÜ»ÜU®ä[žµž—=¿ðœäÏó¬ßìDAlh™ésØlvG y±Ó' +^QÂ%AWÕ0zÍ£FY™Ý@ˆb]zÇëmÃè—&®©q8µ +ý$ñF´È7"G#%à¨%Cè*ˆ¤­«TAÁa¶´FÉbÐ]‚ ,ò„Âχœ*Ņ]*EÂp n4Þá¢%ºÍ…£¶N~¼Ý§!€hxÚâԊþΓÍØí ¸µ÷oۻà +Ê f1iîì_Zò(j€týË"&‰&§(MÆX–±,!Š#^ –öcpN6nàaÔkò2m$Ō8(2â!ÔKÉÈiºM ÕK}Ò.é¬d“Ž A`T9ÒÁëŸVŒu÷_ëõŽ)Ò£¤·È_&L®+©«^÷Ýëêä#@9n³àVwH1i}×òî×dMt°¡žÄ£n=ŽŠÐ›1Ž¦Þý„Þ·9÷ÆW ²È u#j,Gu›¬i5T;7AØüK…i"PÄ:•ÏÛ^¬+™s_¥’ð¯eÞT^÷Ó¿Vúí¥×(?V•ß*—”œâØEïû/ãUÅq…ßìÏííýíÞþÜîžíóÞÞÚ·¾ßù8 [v𶍥U Ń¹(?NH„µªÕ4ÅRA•Rhƒ+¨”–¶4IEՒ@Š\‰ÔRhPKAj*ᤆ¤ +V‘J¢4ôLß®€¤BÝÑΛy;3»Úyï›ï£Þ¤è TuFWª‰qÔ¬ÖÆ´©+™•ê:fÒ«ö½Îv²“éWwh;ŒÎS̐z(ñCíêó’zD{•:͌ªÇµ×Œ×œs‰?ho%.jÿHLiùp¢&‘§ò‰¼¶ÇØãü*q:1ÁN(K¼GÞÓ>¢n%>ÒâŽÎÇýøšõã Œ_؈Ê~¼ˆbAEY±¢ŠšÎz®E6Û´]›¾áµŽØlzÀ¶)Ñ^eS¶}رí¬c¥ˆ¼ Mð»ùý<-ðõ|7Oÿ“'¿áÇù+žƒðüa–ç¬a3éÇm]]Á¨«K–iè#TB3Go?ä–T†6–aLUQð8s0,u#Ö ES×°j"´©&pD‚'“(í¾Šñ6‰›£’I7Ã@!tÊv¤“¦Ü tDÒ¦F»t¢Ÿ5È(ù®ÛÏn±Õp|Ùp²XÕ¥°2’X ñ²Ñánrˆsš¼ˆZE#ϺZb-嶴—)o卣\1^¦Fɋn”57©D=«0Ï)ø›÷J±Õ3'ÚÚË~7?ÛÅ×øWð-Î÷-.æYWJheÖU[w³ûY +Øn–bϐw é®œú°RY8û§§ qª’«^§ª_3Äj%©OÏ>¼yÍ{z—ÅKòÙðÍNqÊkT§½ >-¾ŽV¿ÓðìlVæóú}ò°P©T?íû´s!?ï(ÜW dÄ;¤ˆ<™æh:KÏÃò\¦ÊòYþ„ÞÛ?6Úÿë&/]ßõª#'¶Žî,U“¬¿æg‡PµÕ)rWo§”êuêGwçñªÏC˜Ç% ™Ïè Kº•¦µVÒÚ-ùßV˜—?/?dõ“þø»6ã×à'Vl¸]Áw‘JR¼$ÏBx*-,`w•N‘Ôa+…r´ÆÊä[pÈÉæ¢O”57\jnn)Yù’ÌS~z²ìa²±xIÅÏ­¨­ kš"[I¹”³=ïÙl!“ÍÚ+—±äRÉÌXJ&cÅ%É¢€$)á)N ˜b%ÞCúš¥#™D¤§<¤·;r-ù|.©U)j 5™ºáÑôò*–+²&;ÀN²7Øk,ɝòCÿ/b˜ ¢à\P\wa½O£´ö=Áæ<;ZhîXÿ/þÏwÅOŽæ‚bg°“, +é9ü¿B„ÜS<#îÑfiêñ™o©dTM\ó"l¬#_ò©ÁÕú¤¨4W¯Û§nµþ‘Áa¤IQ•÷C­›zy6Ì¢ îÖï}™&ËFYKõÓ_`Yh‚scà`Ò#ów0^NDߺ‹ÃRïζÌLýÇ&Šj 9jÓêìÎØÎF.fêõ‹êÿ{£ñìUàØQªú +!‘QšsyX‚°¦Â£”ìZéÙ£þeyiHχûbËÄE.r=[Շ(Ôe?sÅ|¢/µ, }‘HØÈ}0„Dn«·—7ý=¼9íQ:±RņÏéªS—ÎêU„ï¯>Yñ4I—=–«¡øH·ÂR¾ÔÅ⓮ò<æä(y˜ ËR„›áÉæbmeÅ$&‰ÅÃÁ=mß+Õ=ó ê§5H˜‹n%Q—ÙéҚΖ(Ãñ\¨ùkC6¦ŠÏbñS˜¹½¨t-ÔŽx{Òt»üe²FØJ¶›EŸ0ʎ™°ËìH¤Ê‚°ûd½‚X¶Ýˆ]ÞÜzTÒ’ös”N’“™.ò.&ÿd_¦l¹‡ï oå·F˜L]JKl‚L]¸§)­ª—IׅMç­XcºP7õ¢¾Jߤèô#ú}Réz*–¦éE)3. p±Xãm=ü==_¨ "A^‚ºu 6§©r¡Ë×!Õ)lÇÛ阈œº³ù<îC%Ï6R~<—|u¡ŠlÜïIªøߑÏY­rin3TŠ»°þc·®ÙLZs«G.ÎL)f.×s᭗íYžD;1tfx±V›ýú̹2þü¾3ÿ:uy¦Jf¦–/'»®¼ðü¥á㈚ýÈt·!j6>we7×Íw‡ºÃŒ+ºqWr¦‹ëâ»B]a¦(ãE©¨0®ÀB…0#p‹áz®ž¯›¢7%S A4V“nð1És¦™LXéÀ,ì¡Üc +„aø\Øs‰EÞå)~c„çË3k}Q“*Ô¤Rµ5–©øP+vIÝ%m$I,E5}~}¨ÜÚð­#0MF¨NrÇıìÆõ½7­Á•î”c8o¶œš+Þjó¥o®ü‡¬Æ¯ø&ì'»ü¯ö 9Mºð=~ë¸Ò8ˆ÷8ÿe½Üƒ«ª®0¾Ö¹ i ¤!DÒ  $\Áˆ”Jkr­`‹TD åph-A‰dìXƒ01 +-CIÐ OK•«Ž¼ ´„‰ Òœ–Øê` /iUŠ·¿µï=—K þèùf}û±öÚk}{í2D~+iPóäfó”œÖ2ÏŲ]Æ2³ +ڙN%Hº,œgþ'õ²æÒÏKh^Œå;I©7NRåër Ké+9˜a½(JÆ:ìÒc†´Àݬ»´Pc½ Œ¹Ë4ÉY/¹,ÏÓû Œ—Ïê¥ê3:^‹c+nëRNŸV»‚yš<iñ³ÚÉjÞ/3z¥“JzöåìfR‚ÕŠhgbý,cELÆbE´pRÁ 'c¯íš-µòžÌ‹´h:Ï©âi¹/v—W±Õ*©örÌA½/ÇîQñ/-ç¯ÕvW[Ïm_ÞtÿtÉ¬wž€§Ãä-fé1¿5Ú½¿Æªð™õÚÍ?OŸÐ'ä |Ãlä[ηRÔRåq)ÅwKå»Øyw‚ì¡Å6Ã"ÿ–þ‘ãò©‹ÔDZÉEé$¬a1úkô˜†ß4 C1#äHˆ¿Å2•U[¢»e¢vûu‚,‘­^W$÷Koð ½o”ùÒWÐj)­OöÀÛdpä+6‡¥Œ\K„’¯èd:ÉÇ«{¡À|Ù¤‡ñíÕÚ]6ÈZ-ÓXݝÉZm“}°ÆBâïòCž?•/å/²^ÈkrXÖ²Ê ù»Wþ#hõ_ˆœœ¥Þaìeòžƒßót-Hèw¡ëÓzŒ÷G«ù÷¥¼æ}O«ôQí«õ \ò*mÖ¤Y7 zRÿ¤Ó`¶ÏØ?Çé·5I;i?Y©çå´7RéMÑ~šÆÊ^‰¿F/à©Ðõ$„a}RÄ·:ªâ{¹®Jg¹ÉÕì†vUcy‹-»’]›`ÊO¤ù„Z«‰€&ÆÓÑï5º@›Ðüm¤~ë0 ^úÏÿ‡ Ýë4YM« ¢­×ϝžŽ,xŽÍOé/âsõ¿ÅæzM¹Zǘ8˜ÜµM¼l}u‰Ù'VjOÖ7¡ôm‹÷žpå6âÝþ'ÉÏ]¹E·¸ï_áÕö~]íb>n.›ä÷>/ë¤&A¼›YmüB~*£°ÇI|#؀%¦È­Ò‘uhM¬ÆþÚ(uR§ÿЋz‘ø.Õíú™žÒ<¯«½IÜ “<ý/§ôœþŽb…ÕŒõ>yûrDgè,4<"õè—ãiro¯åEøc‘Noƒz}QÿzÅÚq+˜§˜sœ?ˆŽErAþ¬Ÿ³^ïòÉøÞD‡UZ« úŽîƒà¹;u‘‘¥?ÖïÊåk¿F÷èot¿î‚‘8°@âûÜGm$¾Þ¨$îדXÉö w¸Qi½s$J±Ë;¢b:Øm´Ñš!¸~΀Gç8)Sio2Ͼ nµýî>t¦/ü¡Jѐ—ïån(sQdžè{c«(ºÑ²Íhk' +¯+5ÈK ږ´ŽÜv"øšˆm¯´ˆö¥#°ËgÍX”_SúlÚNg‡6JŸ-Ú+ãö„UÈ:/¸gJäP|]ے®DiŒMcëe"+'Ga;§‰"v•}º–ž‰¿%ë9/¦Ù§3õ°Î¯Ë Ç +çt_ëUð­“oqÖ °Ó×ÉŸç…þË-ôÒ½ltX*_hŠËEj\®Ò<(Cöѱ,:“¿ùN¬F˜üؾTÊv"õi†­ä<ҝh:岻ݰ`w¾Zf"º2i·Õev äN+`V˗CDÙ=Ô²LyÃI²‘|n…äs¦9#q¢HÉè“D¼vɌEäêÀxèçœ6²Ïë¤ +_‰¶µÉh`Ùfkî‰rÌ®«2PŸüì> ¢9í"9ã4ö{±ˆ^Å?Æ-%œáú» lOvž{Øíð%òKPÂò2udzM—=䒖!ïæT™†åºÇ¬W@‡Ùe–ËL‡0jæ¾åœe8†vv|‹õ°3á0ÞÎr2«’×ñ°mH˜Qç1ªÍ`§üŒÌ®ÒýIŽajüéUN“éàIÍ×þ _þÆn¨äFœÚô²—ê¥rÞêNse®7„¥ž{ˆ}ªÞöW£Ö!„§ê`}H'é]:”÷§?ììv/±S¨!Z7Q#7p³ë+ÚÙ+½Ù\­ ùü.=îÆìm½¹–œm7–Ìý4íBºI{é~O¯=ƒôždíðª&zŒîo3tG,€úñv§ŽÖ<í¡wk€•8† +ÙîŠÎA6+Èrù&{µ­uë° åDPÅ®l+õ•ÙØz''‘ýX;LÆ~†•îüSÂý |'È{q¾’¼ünǟivâ‚oc_±òY"2‡…Ô“Õ5éE~?T~B» fj­+èsVy)^Š(ÒïDyÜEn®|‹­v;Wòþ4LM$¾í· ÞílëW™´Ä÷»>œ'Jc°Yr Y¸E}ì|®…³;Øø&~DՐãó:<Î/½„tIüA¼Œ[ÿ7 Ç"D—odÛmÆV`7™²b€•®g^\Ù<ý*«†m·ô•æé—æZœèºCxi#b—%t?VáQqCüHÜȼä²ÏÀmÆOÂúºqÞǨ>£K¨hïy +à,åÃs‚b'¾Œ½ÍC$4%ý¼;¿F:N+x•¯ ö́™ ?R„7ÁAx°ô:⁋©cƒhuLüü ±ñ’ŠŸ^þ!rÚ/þ(þ†5Š(}ƒÞDêš”Ð]7á ø1²i–áÈqÖoðuúÕÔS9ýSß¼êûFÂ.àäIØÚEñSqHœß4Ja'GR¾× üLŒŠWÄ+†H%ñ"ÝŠ¯ñ;ö¬8K·|ÐNÇ¿ÿ^sÂZ!|çgޝ%¸‘ŽTNÍxï|6ۊóôÄx%ˆ–æ`?î@ߛ0ÓÙx¡ÕC*n'}Ž®ÁbòaåO‰Óèÿ+¢A|6¼~ýóԄwU;Ÿ×ˆÎ»($æOþ'ìãؽß!"þ"Úޘ|•Þ@Éìàk¸õ?†ÓV õ0Nx1­Ä øiÌþ<Þ êÝZ¢Ò\`œïŽúÉsO>Îþ:ý¥}nÔXÂgáE:<919Ée‹07ÅÚɁYáÏÏd<ºm鰒­·½9”gNï]Ö^gú\3Ӗ-É­´eƒ +s7Ù²„ÞgË9÷Ùr.ä㶌ùä^¦gȤZª¡T©“úÈßH + ¤(kš‹AVÔ}k,G‰‡BH&u@·íçœn¡ö.Ð×,@jA®Z‹vCÓν‡1nzœ è}} ýFÐgüý£(‹eÆ13³¯¡:H‹3¹zªâ9øÐCuMŒëÃ8ª?õÛu×!×­*Àã™RëäÿÝv>½¼&­A¾%Jë㕸ùSýDì?5y””úùU®}ïFÛkP+À+gBŸÞVÌI­NÛ…ymWs{‹kX´cª•05í¥ëš¬C£Ö/šÙÁ·þC•'0‹ ZƱ +Mö<ƒö\ÚnúÏNÙB€ÇV³ïçÿì}'vôŒY[³¢Þìì³Ì‘p$1µÌ¦H,‰ùÁHx¹é …ÌŽàö¾DÜì°âVl—Xn´X=1k·ÙµÂªÍß`d a†"ۃ~Ó‰ÆTSu_Sg.V¬¾Êìð…¢}f‹/ìøû¡]é ›-¸©³/7CSûéÄÌ5ÁžPÐï ™öˆ¨Á f<2ó[`½‰Ý¾˜e„VÌL¨ÿhí47ýV8n­6ã–eZ;z¬@À +˜¡”Ö Xq,U?Èc¬„/Š/oòn^ßä]ڄ®ƒV¬ÍÚíÝ´±ó¿P¦rf[jš>3ó¬¾X¿é½ý¿Ï®`C»ƒÿwà¥Í´žùÒ,çr ^ڄ™uò~oGiˆÿáí·{oj¾Nl‚:'OÉSÉÍu'Àîe6^XV»Wñ™̓ùunOµ—,sbècã%eµ×=óä8M†<(÷ÑBôýÍ»m> ¾üq›û’«O>ò‚®ƒNþm4¹¶½ö»,Ô»XIkFÆ¡qzJä(f5ŠYbV£˜ÕuP^G ~ú֏à®VÚ]ÙÂhÒ1×Ö@ð̐]r N²S>hó­rK²ÖyÒ³MnF×G™ŽÉNÐa¦ÝLۙqéË–#,»YvÛ²¢ÕS¨“©CQÙ!7Q%4‘ë˜{åý´¼yÅÛd+ór-ó Ðß ¾õŠÀ×É8ߊ|3x òŠ¯•$›5ž(òÝ(30žÒ7c͘S3Ii†1à2kºA‡€ €äšB6#5!y¤-ÑG#JIÊF$7Rƒl@É}¨{h£tñ?ºP˅‘\X+zva{\ØåI¨)WR ÐxmÀ4ôS…vU˜WF¨’˨ }-4öS1¸is§±€/0ö%8=ùÆ1òۀ(°×8–œVä𣞪[ ´ÝÀð4p˜NîTIãLÃm¸e»Ñ.s`ݕã.W-óºU)þ¡ù)>k^­Ã“•X¦JzZªøØZ ¸39'`ÀtÊé$p¸ ¨/Çb”c1Êñƒåh_εr¹Þu`0¢rôsiÜÚ TOéEi+ ©@®m*P·ÚË ‚[¨r/0 œ´ËJ٘KÙ8KÑW)f[ êfÉꔥI#ßqë+îuxÜX÷v…Ƭæ¬ÛåJ uˆL«my?¤ý”n1 ýãÕóÛF…gÖ&»u3Å1QjՊ½Û¥M›I¹I¥]¯×µä•4î’Uk§²RN ÖîÁ‡@•@%m/ qâZ!¬Î¦­Ër„ .9À¿ÀKxoÖ%I¡Î·óÞÌ{Ÿß[ï¼í@I §S€S€ã `ESEXÍ{€»€;€ À€Û°:ãøc®\-¿_þ¨|·üMùAùqYýQišJÓʐ‰ 8ÈäÆ´c•¬’&aô)ûR~(¥%åQëXÀþ Øoû:`_Ì Ø»°WÓUë(gpv³w8;ËY™³×9;ÍYeŒúô2|Xü"¥-å)K9I/o2rè'ºB Þ:õ½ñqé/#NÓÍÒ§F¬ú$™­$j?”^3ÖJ3‰åd¢^6~NCò6ýŽ¨”[3êïêUÕRÏ©¯¨³ê)uJ5Ւ:®å´¬vDÕ2š¦hiMш6ïl[Nd|$‹j$2-ÇY%ž#áì§PMñRÊUÜ%›ºâ×kÄ]ÕÅßKfL3o½+^0m*r.q—í¼˜ãn¬î\ó܇Þ\ñ"Jïø0Êg1%Ë^LwÐt« rUo@(¹µQjßÇßxQšnlødâƅü…Üù±sDs(ùnË󽸓Iñ•»ä‰o'}q;“¾ OnI¼2¯œ­9e•ï 2ëÊ|íÚ3뎿Ë#:؝1PIёGô§xEey'P%¼¢ä÷ñ¢E£æD†ñ„³(9‹û9kû9k’³6䤎±‡£nCr uûNñ98'äìyšm›ÿO£Ò [QµWk›µ¦YkCoŠÛ7®çÅúª®H•n¡K©“ÍÕk×Q·Ú1Ý2ێ¨šŽ5zÏúEÝ Ó‰H¯¶ìE=«íl6¬FÍl9þÃzkº¿/ÝçOÒEÓ­‚µ0Ø4æª÷p÷Ñ]Ç\}ÌÕÇ\u«.sɪ‡²ÔˆíWƒD?Tg €›÷'²œ—Õ¼`äo¥ ½Os_Œš¶`ÐÑ5[™­  Þ2tó‹CWþæ‚QxDï]Y0™6É×Þsà +Ãáà9¯[çJxEjy….t\(øä ;þCeTîÊ%؟¹3㎌»v* ý‘«v Æë Ø ÿߨ ‘i¸· HøtÃÚà$é.ìR`!±;,œ‚¼ÉÄö¯³v7 +endstream endobj 98 0 obj <> endobj 97 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon.ai) +%%CreationDate: 6/22/2019 2:45 AM +%%Canvassize: 16383 +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%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: 2 +%AI9_OpenToView: -497 224 1 1518 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 67 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 115 0 obj <>stream +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 7069 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 +%524C457DFD6DFF52A8F87DFD6BFF52F8FFF8F8A8FD69FF7DF827FFF8F8F8 +%A8FD67FF7DF8F8F8FFFD04F8FD66FFA8F8F8F827FFFD05F8FD64FFA8FD05 +%F8FFFD05F827FD63FFFD05F827FFFD06F827FD61FFFD07F8FFFD07F852FD +%5FFF27FD06F827FFFD08F87DFD5DFF52FD07F827FFFD09F87DFD5BFF52FD +%08F827FFFD0AF8A8FD59FF7DFD0AF8FFFD0AF827FD58FFA8FD0AF827FFFD +%0BF827FD56FFA8FD0CF8FFFD0CF852FD55FF27FD0BF827FFFD0DF852FD53 +%FF27FD0DF8FFFD0EF87DFD51FF52FD0DF827FFFD0FF87DFD4FFF52FD0EF8 +%27FFFD10F8A8FD4DFF7DFD0FF827FFFD11F8A8FD4BFF7DFD11F8FFFD12F8 +%FD4AFFA8FD11F827FFFD12F827FD49FFFD13F8FFFD13F827FD47FF27FD12 +%F827FFFD14F852FD45FF27FD14F8FFFD15F87DFD43FF52FD14F827FFFD16 +%F87DFD41FF52FD15F827FFFD17F8A8FD3FFF7DFD16F827FFFD18F8A8FD3D +%FF7DFD18F8FFFD18F827FD3CFFA827FD17F827FFFD19F827FD3AFFA827FD +%19F8FFFD1AF852FD39FF27FD19F827FFFD1BF852FD37FF52FD1BF8FFFD1C +%F87DFD36FF27FD1AF827FFFD1DF8A8FD35FF27FD1AF827FFFD1EF8A8FD34 +%FF27FD1AF827FFFD1FF8FD34FF52FD1BF8FFFD1FF827FD33FF27FD1AF827 +%FFFD20F827FD2DFFA8FD04FF52FD1BF8FFFD21F852FD2BFF52FD05FF27FD +%1AF827FFFD22F852FD29FF27F8FD05FF27FD1BF8FFFD23F87DFD27FF52F8 +%27FD05FF27FD1AF827FFFD24F87DFD25FF52F8F827FD05FF27FD1AF827FF +%FD25F8A8FD23FF7DF8F8F827FD05FF27FD1AF827FFFD26F8A8FD21FF7DFD +%04F827A8FD04FF52FD1BF8FFFD26F827FD20FFA827FD04F827FD05FF27FD +%1AF827FFFD27F852FD1EFFA827FD05F827FD05FF52FD1BF8FFFD28F852FD +%1DFF27FD06F827FD05FF27FD1AF827FFFD29F87DFD1BFF52FD07F827FD05 +%FF27FD1BF8FFFD2AF8A8FD19FF7DFD08F827FD05FF27FD1AF827FFFD2BF8 +%A8FD17FF7DFD09F827FD05FF27FD1AF827FFFD2CF8FD16FFA8FD0AF827FD +%05FF27FD1AF827FFFD2DF8FD14FFA8FD0BF827A8FD04FF52FD1BF8FFFD2D +%F827FD13FFFD0CF827FD05FF27FD1AF827FFFD2EF827FD11FF27FD0CF827 +%FD05FF52FD1BF8FFFD2FF852FD0FFF27FD0DF827FD05FF27FD1AF827FFFD +%30F852FD0DFF52FD0EF827FD05FF27FD1BF8FFFD14F827FD1CF87DFD0BFF +%52FD0FF827FD05FF27FD1AF827FFFD15F87D27FD1BF8A8FD09FFA8FD10F8 +%27FD05FF27FD1AF827FFFD15F87DFFFD1BF827A8FD08FFA8FD10F827FD05 +%FF27FD1AF827FFFD15F87DFFA8FD1BF827A8FD07FFA8FD10F827A8FD04FF +%52FD1BF8FFFD15F87DFFFF7DFD1BF852FD08FFFD10F827FD05FF27FD1AF8 +%27FFFD15F87DFFFFFF52FD1BF852FD06FFA8FD10F827FD05FF52FD1BF8FF +%FD15F87DFD04FF52FD1BF87DFD06FFFD10F827FD05FF27FD1AF827FFFD15 +%F87DFD05FF27FD1BF87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87D +%FD06FF27FD1AF852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD06 +%FFA827FD19F87DFD04FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD07 +%FFA8FD19F852FD04FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD08FF +%7DFD18F87DFD04FFA8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD09FF7D +%FD17F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD0AFF52FD16 +%F87DFD04FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD0BFF27FD15F852 +%FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD0CFF27FD14F87DFD04 +%FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD0DFFFD14F852FD05FFFD10 +%F827FD05FF27FD1AF827FFFD15F87DFD0DFFA8FD13F87DFD04FFA8FD10F8 +%27FD05FF27FD1AF827FFFD15F87DFD0EFFA8FD12F852FD04FFA8FD10F827 +%FD05FF27FD1AF827FFFD15F87DFD0FFF7DFD11F87DFD04FFA8FD10F827A8 +%FD04FF52FD1BF8FFFD15F87DFD10FF7DFD10F852FD05FFFD10F827FD05FF +%27FD1AF827FFFD15F87DFD11FF52FD0FF87DFD04FFA8FD10F827FD05FF52 +%FD1BF8FFFD15F87DFD12FF52FD0EF852FD05FFFD10F827FD05FF27FD1AF8 +%27FFFD15F87DFD12FFA827FD0DF87DFD04FFA8FD10F827FD05FF27FD1BF8 +%FFFD15F87DFD13FFA827FD0CF852FD05FFFD10F827FD05FF27FD1AF827FF +%FD15F87DFD14FFA8FD0CF87DFD04FFA8FD10F827FD05FF27FD1AF827FFFD +%15F87DFD15FF7DFD0BF852FD04FFA8FD10F827FD05FF27FD1AF827FFFD15 +%F87DFD16FF7DFD0AF87DFD04FFA8FD10F827A8FD04FF52FD1BF8FFFD15F8 +%7DFD17FF52FD09F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD +%18FF27FD08F87DFD04FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD19FF +%27FD07F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD1AFFFD07 +%F87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD1BFFFD06F852FD +%05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD1BFFA8FD05F87DFD04FF +%A8FD10F827FD05FF27FD1AF827FFFD15F87DFD1CFFA8FD04F852FD04FFA8 +%FD10F827FD05FF27FD1AF827FFFD15F87DFD1DFF7DF8F8F87DFD04FFA8FD +%10F827A8FD04FF52FD1BF8FFFD15F87DFD1EFF52F8F852FD05FFFD10F827 +%FD05FF27FD1AF827FFFD15F87DFD1FFF52F87DFD04FFA8FD10F827FD05FF +%52FD1BF8FFFD15F87DFD20FF2752FD05FFFD10F827FD05FF27FD1AF827FF +%FD15F87DFD20FFA87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD +%27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF +%27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F8 +%7DFD26FFA8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD27FFFD10F827FD +%05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF52FD1BF8FFFD15 +%F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827 +%FD05FF27FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15 +%F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F8 +%27FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827A8FD04FF52FD1BF8 +%FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD +%10F827FD05FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827 +%FFFD15F87DFD26FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD27FFFD10 +%F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF8 +%27FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FF +%A8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD +%1AF827FFFD15F87DFD26FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD27 +%FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27 +%FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26 +%FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF +%27FD1AF827FFFD15F87DFD26FFA8FD10F827A8FD04FF52FD1BF8FFFD15F8 +%7DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD +%05FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F8 +%7DFD26FFA8FD10F827FD05FF27FD1BF8FF +%%EndData + +endstream endobj 116 0 obj <>stream +%AI12_CompressedDataxœì½ër$Ǒ&úŸfýµ?ÆLZ[¢33"2#u֎Y.ÎJ"M¤ffwÎ Bƒ$vº^4ZZêeÎÜ;þ}îá™U…F_¨ÑîA6P^™™qñðËç÷¾úúó틻?^NºÍ³ÏþîïNï¯/îîµ!yóÅ˗oß<܃ô‹ßÿrӏ'®Ú~‘¿µ+ÿñúþÍÍÝí¯øÝIÀ·¸ÿ§?Üß¼y¸¹¼Ý\\¿’‹~¹ùÅ/ñí77/¯åû›«»Û“Ë›_z«RËÙåƒ|5>†çC×ϛáW1m¶¿å%—·º|óææ/×h*d¶´»{{ûâæöûÝÝÿúÕ&›Ïcž6 ßÿýÍï¯ßÆîd;©4Ɠ^FxÓ§ùdÎvGƒë?Ý\ÿùW›ßÝÝ^[mï¾Ö±±ëô_ûê÷o_^ßÿáö;’6kýöîÅõK¹£Vqñò’ÃÒ×íŠo.ï¿¿~)s÷òí'uöVd~sùã5&Å`|ùúúö›»ä£~çi3 qƒwêófNògf IéGo´¯ÿZÕ¨µ”úÇ ÷•Œå—÷7ßßÜþª<áôí¯ïo^Ôž†MÖø'¹ù.ÿÛÃÊ«?<\ߖîÉuúÛfªt'¿ý­žß¾8½{…QxÃv-íËüyy÷½}[?ð;©âíëgŸý˳ÏÂüü¾½{¸~#5¾¼ÞÌãóïï/ÿt-ó9??{·éC×\ñÇË7×Ï¿“Qº¹Uê‹?*MÙÍë77Òüó—ß}o¿äûçW7÷2E¾{yý¿ž¿¾¾øáîí›ËÛÏ¿¾º¼¿»}þ½¬Öýòú»‡ç_žË,IZ7Rÿ–.ýáÁ›ä¥åƒ~õÇ·B}x~}ûâòÍϯ_ñ׃,Äëç _\c}HeoVêÍw×Ï_Ü ƒN…Éýü¿¾µ.oüfóüÍëË+éŽ1>¿z{}{õ£|ŸÿñþNVà/e÷c~^®~u÷úG«óþÅwׯnnonåöix.ýsuùòöîáù?¾þáúöù½ ÅyµëÏ_]^ᱤ[ež¿ö-w¾}óüáÏwoÞJ§ÝÜÝ?øáþúÚ?]^½}¸~þê­Ì×ðœ´W2þ¬íêúÅÍ˗—R“,E¿CèÕ囫·/ùD9ãËÿùöò^îÁŸ?\¾üNÛ0â›M?Ï·œRÕV[Ü6£¹ÕþÝúÛoñÏ·çÏO힟óöçç¼Yj9on?÷û¾Ð«¾Ð&¾h®ù¯9øáùïØ Tó¥Þð¥Þðes×úL_ú}¯Þ¾|¸yýòÇç_¾y‰9ñ‡òBЛÿÐÜü¿ë¿ê—ßüpw/³÷V¦Ú›ç—ÚðeyŸËæîKmúÒ+¹dw\^?¿*Ýq­·_kí×õf©êÚï»Ñ«nôª›¦‰¿æZºãV¼ÓËïÊ3Ý57ÜÙ%~ߋ›?݀ ñVo}«-½]<Ï[¿çGýúñc!?ûì›så…é¾ýæl ïߒќß^ÝaÿÕæÛ康¡þËóÕÏW7('þæ¿=cíÂÓJݛoîß^óãë²é°áoåI¾’îàŠúÝk~—¿ýêå[ùò×÷wo_qûÝݳÏ~¡Ó?^_‰T$[Ջ͗üòAäžß]^ýðýõ_®o®~¸½þ·ÙIW +ݯ9èõ/ßQ±0ðûë~+÷ò£üþ¿ŸrÿÙõw"`Ô +”ú÷ÿO˜¢ð»ÛÏÿ›ð҇¿¼º{ñö¥|{~û§ë—w¯¯72[7ÿtyÿú)M|õòòöò~Ã/J m½›/ÀV.ÿõáæO›W—Ò¨\ô›Ù#¾º”þ}R ÂL^K¯ñ&^³lí± š¯žÔÔåÃ"ëÉ6ðÆkßbk“Q|{ûý^ñEôú§Tÿõ¯þx÷òæÍ+¯¼¥øßO|RéÖÛ/oõ‘ïß¾ùaóÍÝÝK¯ù·o±9¼¾¹}sýrõÔ"é}S ùŇÁâùߢ‰ÓKe„-¾þáæêP+ÿžÿîæú`cGîÒìºâPjõë××¹¹|y°ÅýÛþæ³9¸‘-_xç&ðè5_ÿùòáê‡Íonþx/Ûêõ;V+û»›Ûò _¿½y¸öFð2”¿¿~sýð—aÐÂ^Áf䆋æ†Z}Â^Ón'ŸþøF#ZÃä×÷ nD}þõÝË +¤êú·èÓf÷‚òx×üחÿâæï¾Ý‰¤ùŸ…¼þéWehJ°­$þ_ʈÿ¥ÆqQ&/¹›e۔”S+gM9ï.¤Æ‹RÖþ M M‰‹’´Hà÷ԏR&þÎM™eÛ<zÙõgRʧ3©ñ¬?'í¬¿hKÛ}|¼òš›’†åÙgú{˜š’‡YŠþ»mÊN˳ÏþïÃczlTÃb\c3ºuŒ¥Heœc3Ú:ºí(g)øÑ͋qž›‘–¥Fó2ê;oýÑ>oG]þ՟îà˜‹2¾ñ ã‹ßaŒõȒ9ÚÓj¤·V–cŒ1Åïs–³Õh–fDzŽŠŽU¹ÙÆLÆIÆTÇ +cvjåŒåÜÊJYfxÕ˜ö­hýŸÙ¯;®™ öÐÀùŽ3ßçŒOÝÛSŽœ=[̶¶†B c˜BsØI9 2ì} 1Ƨ˜ã·qÏây¼îRH1iJsÚ¦]:MçIÖ©ËçùB&ŽŒéæ8KEsžçy7ŸÎçó…LŸ~¶q›¶ã6oçív»“rº=۞sJ ò +q—vÓ.ïfùj·;ݝï.dšIo²ÓÃižOçù|>—ÆÎOÏe–œŸŸ_`j\H§]¤ yÙ yü‹­iôBn½XýpL;«ÓΛr֔Ӧìe۔¹©q–æk™š2.JjJlJhŠÌF©qðÒr¶Ê•»öáÏ۟³E9Õ"]†ß»¦l›2/JnÊԔ±)ÂÐϓ—¸(¡)CSú¦tmÑnö™ @ûíÏiSvZÊR]Œçr—cWFm9RËё‘c;"ÍH,ûÙëÖÛ«f¯JÍ«>µž\ôá²ßV½µìé¯e¿hŸl­Ì,ÙÊdedIV"K°"óŽ‹ÑöTÝ|)”—ÓÆÊώekefÉVd±ËâŸNG+ÉJd V”'—=@øj3¦çÇÇ-sœÇcѱ÷ÏØÛ[öíÄތ콞½uÎÞÙ±7²¼ÝÄwÇã-;¾ÕßbËçžø”‘O%Ï"Óæ\ºôTØÙVØZö6 +“‹Âìáóò¤2¥Î¥³O…n…-æí$ 2 £ ²ßô²_ÈПI§ìæ­°Ó©À¨"” +†§ïÏ¥‘ÞDw}Í"ŠWћ* k+u՚X;Jï?ØIþüí`ê@. +AfÈ$3eÇ9³4ÚîI¶…fÕ²«:­*Ëj™ٖ÷þf¶deïbd>«¥üIòÎåëRªÆ”ºÔdú•–´ÐÁL/“ƒ1ýQ™¡/µ½²[¹.èÚ‹ôâB‹<¥„^4üžW%¯JÕXõ¯ÑtٶĽöÊp ØÔØþ쩎X­ìç¿Ïa-2 O½ì¼l”ùhÉEÔ§UŸXªöšÚ"5.>»…£þ½_‘©!5O,‡:ù@‘Ÿvå“Ú +>êçÓÕØl¯½w¬J¿EŠ?³¢r[±…ÛH6Ý»ØNlÝ˪V=½¬öb©Ka½¶‹ì[Ör»zw¶ª‹aíNnu­$·IT»ThW«[3Y§ò—ÛBªmlµ6Ëê<ãÖTl,­mwpmî–¹ýÕYl8ë՚V¾j*–¡CëÕ?/l‡i¯Ä…µñøª\Z®Ö6ËCëö±Õ¼Z«\ÕG¾{ÿýèªþXƒŸ¾Æ#Bo«^í+X*µì+XEV騰ŸS"™MÁM&\½ºh¤’i!• Šu*JU¬gŸ‰’5K•,¨YU,U²NiuRE+»¢Lтªu*j֎ŠV¦ Kf#•­ž å‚ú÷š +²¨ZªlAÝTÝ¢Âuf +׎ +W¦Â• ¬L掩]Ô¥¡x©êå+Sù‚ú©~õ\VTÁN©‚A ƒ6I³¸T4-QÑ•1QÇh:§Bv& +T2(ePË ˜M1Q5ƒrȺ:*h¦Ãï´DùÞD)oÄ ?=¬ÊÙ!ë€T9Ne·Lõ %’ƒ·¼»áڍVì¹ú»åÉ­ EyIømܓœ³.xéB²Yp͏”ÓÊ,(+nwÏ="_'žÆ5Žr“O¼ª]ÕÒZÈڟ¥Q°1u.ípeÏ¥ÊћJ[KX”¥Í/­Ê¸(",,‰ÓÂƘ©c-ËvUvëbͶœí•ýŸ‹ýRf›0Èv'ï”á` K±"î—t¤ŒG‹Û“¥ÆiUò£e~G‘baÕ>\vO,äøRãéËÙӊԸO=4”O.Rã±ï>ðçÀöúÁ5¹¨s­u0'Š–hEí©Å¾:Y)ö×يYg¥FµÖ–ŸÂ*ê*ÃRømÑ­‹Ô_,Åj7–ùMó”–ÑK±5g/³•­—ÝžuóÒÇ:Ä«ªá0wjøÒÂO±àIG¸Ñ1.ÔržíAÇyÏ#xdU?^þŠ«ú½Ì¶ ív§jK¥£²Xˆ²E ‡ñNƒ:;sÃqœè:Î"x÷ñȲé¨9Pd…Yö +²Å• gò9ÝÉêPBéTÆË[ŠÊp.c1©ƒ.fȟt3?ûŒ®æ ©œî杰§3w:w"%Bâ„ã9ÊB–ž(ÂÏ"Îoé„>öqn®èn++F„þÂ?œÒpKÛ‰jÁܸ§é –‚‰ y±§­2ÐY w5d÷‰Në,ªÇL×µ:¯Oɜ°Ð/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“Ž^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïäOÝý?|Us8 _M°I¿ä¯q“»“(kg3ã ¸øëgŸýÝ·O¹v÷æ@'I®LÝ&÷'¢?ŽÇ+\_ÈÚNúqšc/ßöPŒ‡Á’r¢ü1¥Á¾ú4Î\ µ '¡K±6÷Ñ5éót¢Ô¦Q.ëdُ¸Q4sQÝYÙS73²F8eLòǀß}SY8é„Ó4õ‰*´§;᳨,õ]šxcþ¬•‰n™µAø,*“áKó¢²ÔusûtŸ¦ÂËa:É!̨*§iþØ]WwhÎÚÃÏó‰ðù£vyêٝUüf`eþýÍ«W×/Ê´¿¤âX ™ÿÙYç…1ÌÁXe27ßdŒqk¬ð¬õÙ›‹†6¡ˆév.|¬7ún=—ü™ä3ƒñA*ËÂGYL|™òä.H]Iz’Ö©ÌÁŽÒU2°ÞÙäÞdíeC5T\ÃaƳÎ݂§4©9l2³W4z_ÂOƦ< —âžôj Võ x"Ý9vhkˆ¡bN† RDPÇíþ|ÏéÜ7º©–Dõ—ž%è‘RôDI:Ó4º¥<½£:-£GÁ邒u•­Š‰qTùZ%ì*cSÊ6p¦Â3!gCÒ‰—Òv¦´]äí³…Ì½’ºMæÆ\(NÊÝEò–U¶”½1KfƒužRt Ö;»Þ‡s7å݀îj6±ˆ[7¯A̓›š—@æÊl¥2Kk0óÙÌ||~f3¬ËY*3»™[sçsöÂl+úrÚÀÎg¯Îߙ[!g±ÌlÉ#·Ê:ŸƒÁì”Ë«ë³Ìísë²ÓÆC®ó\ŠÌlí“Íø‘ZååÉäíº‡¨#UWÀ9Wׁã9³Öá ërØe6왽÷:,A÷{A2÷BV üÃûA֗…BL+ç¸rˆDÓŠèYEÇÖÐÁWÒ®q·ÔµÔ®§fUí²NfJì#ã¹Z¿p õ¿ë……%ÚB.;Eš‡>M %^®n¬]ŸªB5|äqœ{Üg³ä£Û*ÔÎSí&ã‰HZ¹yž®BŸ`ŠAX",4a’]ÁnîûI”¼$þÂÛæ(¼´y4Ê­}cµûèšÌ”»ؙ)̙æ/يs¨ùi&T#“v±Õ3Ÿ¤Ô!INcúتÞÓtóåýÕ7/®¯a¼ñ¿¥š¡¨=E2Fô›¢—´(û?yUæE„Íi»WN”³GŠ;·`>âlïÞ»pB‹B1|Šr0¸¹†7O༫k¶_ÆÖd®Ð] Õƺ”¨ö„EŒ×ÜEc¨þìÙbƒÎ«[,k¶6Y/º>NéÌì< :Y t¦-uk3ûœv5Ìå@ër²Y +«ÚŽsòŒs±ø²ΨêÇÞҏmãH(hO.ÐêYìh™æ}ØÑ ª ­3Z¢MýÖ³{­ÏÌà–8PÜ®4æ³ÛÐ详 í1ŸuõZύýì”×°iŸFÒýÕ¢¦,=Ö#U™Š*žkÕO*"¨"*ˆFÜO\à~ZÄϼ‡÷Yx±|#{L\byŠø¼Fìì#uöQ‚§ >ð.gÈ9ŠÎY('‹¨ìãØ¿cJÒ¡àa-ÅÖÒ/c¡Kt‰~.qÏ5æ¹Ú³…éuaxUo­ûk‹Çvëã<Ù8i¿«@ŽS÷NΫpŽP¯f~=Ÿd.’ì¸fóZNc‹[M±Õ‡½ôb×0‰R°Ì öPoö°ø8'[†}̔Z&7Ù&“å=Ddúž†ø¢¡ §fÌ]„hHˆJL%0DCCT ¡³Iä¨$raúŠ2Te{;€·f.a#màÈhŠ‡)5Af%µ¥³Û<0XÂL–!Ã"ë™Æ67¢ê±°áZâ¡b$Þÿُì;Kvüì檜HyfŒ˜š¼´¾ ØR—E+$|H¤ßÙÌ ö£¾Z’Ün´6p|ÀíïicøÃííå«ë›ï´éao8@m>‡20%WQš,LýñÐM"pQÐLÈín»Ì‘°Ú* @!Û¼v€ÑÉÁµóž[³K➂Už¾$/¨ï°~‹³b¹ù㩁Ëüó·z¯§ÞÙSׄ m¿/zÞ\Ïf®ÙKßðH–ŠÃpgéë:Ë|N?Mž˜O”%f+œ£f‰ùɳÛüüÔ˧^85BœR‡äìä^è÷Mî'j×:ðÇaÆù êÕ¤ô$ÕÊďæµ]w˜Û +Iò×üv0¤!Öû)!0ð”™ë\(,2Ó¬z.ëWÍ:™+VáošÃNÀáoùäD³äY“µ®ÀßJAÍY7Yh +°éÙgmZš Ô´&Hf’Y´†™ó&œbžQÓ`ÊO4CM /M…*JUÕSʏ)cTˊ’V”¶¥³±ÆË,Ô´—Ë"`Ø+á`‰GJZSFkŸT¦ã…¾ëÃ%X±hð§•Úä~± OX~®ñ؍TQä·Ñ¹ŠJm%‡i‘5s m¢Œ Æã*ed¯Ò„R.™AhódˆGƒ^Z “.+ØÒÛD…+@ËÞ´ nr€å^x“‚,G7 ?µk‚œŒ3Y¨SGTø°xJôTJ1kèÔh¬¦to5¢ÓJ5»Ô(šj¦éׅˆ§Z”´WÈ¥Æñh9à_9RªÑ*vå}ʞiY¤Æw\ñ¾åÉ5>ùGjüÄ?ÿgÔøGNrn±‰ZÈVSžøm4£dß?1]O8Ê)µ u@iî]hyÚO‹¼»êj*ðíÖÍt˜£žR`ÛB&r•ÂW&¦…Tî²]pµÁ¯yKå/ƒYt*—Ifú”ݺá4å§N×%ŸY€‡Ö0©ÂqTŽZpcÜg8RVheŒ>ΑÞş¼H|ûåq®÷AåçÿZ5¾g\ԓ­q B{v–ia2Ësr“–šÄ–m”­AjW)rSq¸fÕ"\E%'†—¥-mZ.?E§[çúå§`K™9¦ñì3ºÓ„ÖS»úkbt¤'Ãa€í¨O~\å]ÁèIy“pý9µ¸9xz;s¤k)k¾Œia`Å-VÔ¶˜°÷¢Ñ¬ZͩՆ–úËZºm~ ‹~v ìç¬QÏt÷h,_úÓJ|J1œò»ËøÔ"5>ùÚO56f²³½tÂ;™¾Óy’%ˆ\ºg–7md¾´Ž™Òv4y4wõ–m'óMk0rÁÄóÜip¥©MãΘýL£RÉzFW™§—ÎS ቢÄ%<%µô:¹´§—®ÑÏ>37Wqq÷V°¨„ޝZgMl¶ÉmVÝXta 9Ζ®«â¸ªN«ê²jV¡:«,³e ³åÚMµvRqO=ûlå :æžZ8§sLIGS‡œROpCiØSËéSŠÓñîrÌ µW˜Ïó“–ÿ3jü™£üÌQ~æ(?s”OWãÏågŽò3Gù™£|ºnöG?üð/齟†˜û™Îô8OŒ€J2 A™¦¤Îø¾Cøށ?øçxȑÿI«->}„ƒõa“ú“N¸Ý³¿úÊïf囱?A¢‰Mˆ'cߤÛzä’U “Tœ†q3t'a˜§C5¬/©5LÓ!0BKÿx<Âp0<‚g|;_°ÏV@죥ìvÛ³½rú~ÅkZ®ñó˜çgÏKå1óÓ@þ́ñûGxåýx£Æ‚ÙžR85¹öœÏöŒÏUù›­©MÙtꉫ}ÍfˆÎrÔ#î×Ânl vÃù‰Kv¨‘ŸîÔ¤¨©i–r“`©I¯ôI®Y2Á0feRSH}&Ûê"óÝåØæ¶ëRœ»áÀG LŸ®N‹NÝг:È´^xö1íú1žÕ¬ApΨ y «ÀZÿ$oóéûçãYçaÆ9|löܜÎËrȬÁ6y0.Á¦O‹N{`ÑC0×Xׄ ûh ‡ßæ0„vñ^v ԙá¯?:úN0#øq ¨ø 7؊´`aïhá=@™Ë6jhÈ>ïÉ 0qÉAÖßüu áàzëõ`Àºa•÷·Í@¦˹çú­™~Ss<ŸfÜ1¥‘eömâ#k>ßÑóøn-îÑç5lÓ=PñLTB'ƒ,Ít¹í,^ûÜ ¾šHl¸áD˜5ÞþDUŸ[u0 e¢;®omó +ê:ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£!8~²J ÀÉ%çBŒ¬É§CŒÌü÷M²Zr»îfrc×!ýGèûÀz«ð·1mÞÔ¶Á÷¹ë£Wa>¼ ó:«g,ùیÝ>kb[™{ ¤·BWÖë÷œ;¸k1õîr¿ü”{ù9OÍå¸Ævæ䶖¼#g¨I¶õW¼§šÑ5mDê:½Ô¡SýS–\Š +PUyJt)ƳĒúæ·¸ê=’PYéق-m1Vv´S‰í,‘C ô¶k;é`kÃ#)¯¼ÅÊ +¥íe$â`3«s–èãEóè ¬äœ[Í<Ð*ìzéÏ3æ«åIiVÍ4…©FP?ƒ°K˜q½&²Æn`‚²4ö=üI/JSÔ²p”Àpà¯sNfQçÛgý¤õš±èãŒÿ¥ÎþÛõ§s*¬êµ~íû¯-̆ï–ú.Ì¢nÌúþdßsþí鏪ñ°b¨"¦¨Ð~½,{JÎ*×v‹”«j“«RÂÏKŽð²³iŽqÝyT,ÒÔç0ßQ›,ûc¤L8P âBÔ0ʇ§–éq2p9ó:Z6GØLË!ì†㧢rª¤¨ÖB•w̋¨"eC“! Bþƒ¼)oKòšûÞþí%¤÷5.U; û6`d=“,8¾©ý·*‘ûüŒ®¥š:S-Šj^)ªÓBŵҨ8Ù?{?¥W(Ž_j…Úúþ±oëcÛZ5ÈÕ£½Î¤:%5Φ`íVØV?„°9Fph põè‹ìç·î,{bqg¶ÍÇ\šû9,kK=~bvwÕ2#Û)s$ ´Tá GêgÜþ› ÒUã•ãH1E…Ù –e_ÉY*A‚tè +©Ñœ°²³,0õX‰ó&Lç9aË +s̍Û:qÇÅÁž§Í¡žŸi«‡yn-s]±–f+Ït<žÒBÞÓõ˜ä‘aw(Ì¿½ ý“Ôø¨J—Çûd~hñê‹Óì]•*IçW +W«ŠU­dm¨jÜhþŠ©î 5Î~ÀC9âátáÃXz1Ê!Ê8šÏ¼"Z¤qï<í¨øøÅYÚ§çgÐt“0*Àބ›á#‡Ãÿ",)™‡iÊ'8ñh3œ>M­CðãêQ§Zꆙó®Fž³%Ì´OšÇ3†yè óô¼u$öa§aØÍã|tUv¶Ù{½Už6C<™–OòÁU|¬#/tä¥5"÷ Fg½¥=91pŒ{h5^§oNhF2¯eÚãrjl9áªü[O:]ž[e²°þܜïº>åu-N@BélyÊw­¾?hÕôÎUV\Îåié5 ÿQ ¤qÛ³@.šc÷Ï™›—§D? Džäè‰ U£ß6¶/•S×A€¢3ñðÀnÈÓTË;Y]Ã1Dš[|ë:iïûßmçëÉz¡?\fI&»5—`Y¼Gà¸póG¯ÄÃàøô3:BáÏèøŸÑñtü8\‡B>µÕ?!jëøq¦0~zÐrzâ$|BøfZ×3«Îì”ærnU=¹*ûÉUcsŽV=h˜§tØ3ޛý.ççÝn‡sìÜ±œŠÇ.øØY7Ħ=IÌ *Ãâ<ϽøºGŽÙX ¯ÆïUyh<4¯›Šy$-#‰ ¬uæULàúˆŠ½g> x|b篋éý(Ï~*×~|ÑògÏüûÁ‡þ0QÑñ9S¿&;YUgMMw]dìšò²õÌ ‰"]ŸÛI¾OH£¿JwmFÍG šO‹K9p¸Ç‡F¦,C4‡{¬SƒœN3ñ¤9ñ!*uŸêH¥ö(Ÿ‹'z0Ûўµ[æC“ýÑ9ñ®DèË4èfî¦'ùc¢Ö³ã¬‰[zïx f®43Æ*8œì‘VäÓIäE.ÿ+ÖxÈ©vè$øiÉñ¤Æ}Žw@s9˜Êz™ÈÚ"°ž}ö‘1X“FaÕ,™e…e®Z=hïg²«ËBY&‘9?œFæ';SëC¬‡OÕbÚì'Û¿XЋ%ÅßYMò'ý­Æ&úó4gOJô·Lóg±["ó|Tô–FOj—Ñ[2Ë>8~‹ˆ] 4FC꣋µu±Jö3N ôóœøyNü<'~žÎ‰eZ°÷ȘµŸÿëýoþIÍ[Bùöww·_ÝßÜ>ÜÜ~ÿùç­êÞ~óì³ß½æwA¿ûêòááúþV´úíËß¼¹„6omæùd‡nà8Ža3ÄxÒÉèl†~<‘É5êoõ×?ÿ¿ßê‡â@ýçõó?ÈßÿC¨–®Øüvó/ÿ½Û¼xÆ»~ JK¥âÍ+P÷ÚÛüfA.Ïõ›¶ŠƒÄe·øçùöþáìæêáæîöòþÇͯÔ(ò|ww÷Rúâ ë—oÏ_Ü<ÜÝ»»¼úWé½o¿¹yyýíﯯ~¹ùO¸ãÿÂ?þÞÿñ­Ör¦/ý¥Î•Ç^ª1´gM”Ù’-K¤œË¹—qÎ]˜7ÿ|©u-{2ôýIÆ~“òI%Á:JÞsŠ6i>E&Ûk8AmiÂÅq3d¹\˜Á&¥“^Và抷åt"‹†Y‘C¹o>é¦0l‚|;±ú‰Í ù$ p;äî$͸: 0ëmS<}f3Œ}–ÖFiE„ÒMô¡@¹6A^C$d»M¨½h8öÜË,§Y{@f„àŠN%ƒ›†ËˍÔ:ÄMOpDÕfÎég™±?‘WÂsØ!D¿«?i·÷'Æt"|2iÒ<$§ǓØçyÓ'Ùq,÷'³p£ ÚÀ·x¨8Íi#õåˆÓ S±`4°0$¿O^ +=÷y"ü =òI'úÞ&JW +³‚<É8 ++ ×IvŸtýˆé'{™(¬gƃËÈÇÄÏqÂscäç2r /Ü óÝ ÑEóFE!ê¸Åt"l­Œ[èOäƒÌ¹Qú·—w“ûE]7c”LòÐq‘çÍ(aˆõ>™}ý0n¦ñ™])ÜzÆm²‡ AÖj h#7 O¯³kÀšÊ[½ ¼Ò, Gðyƒ5ÀÉ,“Sö9y°“±“ž¹¯˜Ì*4'Íd¹=IW™xœÝÓ Pb”û4b6ÊõyLX<]Â,_¯9Þ÷®ñ3ý|’c—q ×Í«Uæ²TrêÌY֋L2¼ÈÀŽèü³Í$yºYÎ/’µ›:ø±4äS4™ÆóˆK¬™q¢µB¨SOS/+oá­^«¾xèó‰péË ,@¦×«%5ê 2=e Ȧ< AVã(Óºlìd¾‰rÚ\µåZQ!X{v_¡'¢ËØyEýI”Yдg»¯<–_VÜ+Z½_}õÿøüû‡÷ØC¾xóío/e>½{ýã·wßqOùõýÝÛ׶‰¾å÷ׯ¯/®_|+¬w›yó‹_nþùŸŽl<2SÒØV%ÒÉL·m'L-pÇ65 ©Ýq&=¯Þvœ˜O„oIß`E›Ë•Šôðøʬ 9„ð¹1 î…ûò +äZ¹Q{¬†3Ì:aõ>Y¦ZQÒê0Ûz_¡öÝl7Ø؃PúÑ(Âeso(zk[\(Z/ì²>›Sæ¬rÞY¨Â¸ü­3øá¼Ùë›=N sOºe^5Hÿ +Óyµ¤Šä–Ö Ì"F–ÖcO’ñ±öȓ=ÖkЕAؗWâk«ö8©½ lF[¥žNW±7Ö5«º>‘_UžÙëY½ÚzI¬&aßëd+¡÷Jöµ~´”ÚSÀf…Ès”=Þ¦à {­t¯0Ür2vŠµ=0 ¸l®Â®ºˆ„±Â¸1Å°Áw²-ÉV„'îúÂN;áâع«€©õÂçEùÙÌQ6â,¤,õYԈÍ,û…ˆv6‹ ý1 ‘=bÃ]°—‡™EXÝEÂ+dzbÙç¡ì^BíJw,ï0@(’Ý +‚ r}–Ö҅Xîj¤uÙ$a€e{¢]LØusœqߪWö·!,šNš¶S'-¼ZRñâؾå…SädÃ4„âÈòòùÊ;[4Åz‘HÂ&šJ +ÁÚ²Û +UF[ºaãõLèä8ÖÖ +ÁîÓGªW•gözV¯¶ž|ýfûú0¿¨ë#ëÁJM2b2Ò2UOúÌÍ!cJƒÓˆNœ`<,©|R/“Î!y=…`ÍÙ}…:@ßßԊDîN2j{F°ûì©üªòØ^ÏêíšN4½M;ñ¬á^&Nšr+ÈÃڑP80ö£Œ’ˆj½ð|نù„ý4` šd•Êšž±XlvȤ›!€%|™ù"@Ÿ Xd²$ÆNKŸáþ!¹´C 9tc½J–ù{ec0‚(@í6`TFŒCù”l?Ú}"På ۇ°fßzè!S‘ŸŒˆõS.Ž:‚Œ+e ýV'‹h ó w¨c¶ _ÍÕÏ"œVŠÞ*;²ˆì¹¹PsJ1rƒ¤BÔPDû˜ûTn-d²– _ 9ÉPÉê¯Ðc¬ÊË: œÓ²¥ŽdOBĶ$“³“íDF Ûf?5Ý4t2V/45OØ°Ü1¼pÂb—™7áÆnnöYNƒ¾ƒ&à0Ø4Œ Ã0EèZ²O²ÔÀ£sחõ$Ÿâ((JqÍBUzRxêfîô֓u[‡.ÂÛ£©©HE• 1S^iw›”C¹÷Âϑ*§R|®ÄŒ¡©Ò cßÔåkÓît²tG%­©KÄÙQ–QÓ¨QìV:¿Ð_À+[¿iíŒ~f7Nð. &õcœsÂä.dQ³EŽGÇv2æ´ ˆ˜—'c­å´i*“Òã«ÚªQìÖp2«o/” h³¦2§,[u²?žW毰~צdÝ°DMYZ~µ¤"4!aÕíîˆÇQ¢u#`Z‚s)d ª—YGØ+r‚µwU&ŸRƒÌ€°½¢ÁÞÊÛ3‚­úòX~YyðRÑúýÞ!é}” ZhSUkÐ÷…ÂíYP.p§Å ÕG‘ÞD…[´ ي6»AKÕ™MÅ 1Wæ[\´PÛa"0ƒx)Û+­ž–á! ‹Ù)xb1iÉëŸÀ´î&-y …E«"$À\,Z`¿a>(-rFŒü¢EÆ +û•´°©tã8»A«\ÐسÀQcÄNiÏ-‚.L<½Û³úACžÇ¥= Ô)ˎPìY.;{–@K{X3;Î Z²²`Ðw{Vԓ…9Kd¨k–°…†ˆgnmY`¡«Æ,©# „ÇlYÂÛ9` S–ˆê“ì4nɂ™4K'C–ìjaÇêUü¨†,ôa—EŒ,†,iÿ~Š¥!«—¦¹ÐŠ!«—Ù›×.ðcNâ…!«‡f<ÍnÇÂVÛey±bÇêEç¤^ر°©Q2.v,iY¶pYQŎµ·Ôö·95õqiÇrj±AardL&3QõL.ÌXØ׆1×kz˜Maë+•¸T©fƒòzŠ•ª4¶°eùիʛ”zÖ¯¶dç"EÅ¥-«R;æä6*X¢6/MY่¨j.ë´áZO!´¦¥J5 T­ÈlTµ½Ö”åOåW•ÇözVo÷¿•%ë#Œ† 1´‹óRnMqh܁ðÀEéh÷öXJ'™?ª;”÷Br•}kh‚ÝRĆê”-Oß«¸{ì¹2hÕ)H‹FêݙH¯ ^_ý>Å-å0݋cÝØEgŠÅ3HmiÆ{× (øÂDŒqß ðV‘–ʾUœƒ]8¹¯ÞAޙ@)îAvë4*îAԗ'©Âýƒ°Rßq¡ì€"à;’»‡J¦<“û°ËžÞ?sÂÁiºôÂôDÕ݄ÐX£túf™wâ.³W+r–m€…✃µ„ïäN<§,݅ͅô6UÙgk±u‚-ˆD;WŸ!tcZ—½=§,½†Í…þð^Ùú-8e¬å ú´òÂÈÃIè>º¡—}xê«+¯–®Ãz™ù›šœbM.‡é»Öݦš&°ôÖËüὦõ[þ;‘º„é™ß.ÀY&8öM*‹ø^´Nl¹ùä ÎBE¦Ù›ጤ¸«5Žˆu¡nϏ0ïQó€4¦•Š)`AõBø©€Û$ìßÉZŸÀ˜ý֔˭²k±U¹µ 0ÁD ¡aïU÷õ© –¹Ô5wCîuSB]0ŒÃ<÷X†Ž,¡B1='«Ò[/Ɣ¡;Öº*¥kØP%ˋP˜«•EaC›V åª *Ÿ®^W^ÀëÚ{ÓwÈCŸÄE ï§ÄÒG {²wqRïÐEص‹—ºá ‰•›š6kÞZÐà+:íœR;ɜË$+žê!Å2?ÍS픥§º^X<ÐWEh)ajfY%cXSë›Æž×%®e7wW¥q0Ä«›÷0V‡µï±Å‹ì„¥Óº^Wüѵ®J±F—ŽkîÅ4xe²iÏ+ÂÒwÝ\ç/àu­ßô's_ƒ£ ÛÈ+ÍÓÉEót[dÑ<1MhÂYhž`/¢3 ®yB?™svͶ ݪ§‹êé¶À¢SÂ*>ÁºP=¡Ov‚ +ÛdQ<Ëç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgSÄÓù…Þ}EëÜïЖ«Q#K­³’‹ªH;íE™Ätè/µNڙ ßÔ ûÂ/½2§,´À†lêb­¬¨”µÕ…îY¯^èo敭ßõ¸3ü£Ló1âVpø«_­ÈàHô<ÆâÔU#Ájë ö8Åíó´³6B €±VækÕ‹‘g˜)Æ¢•É®%lnlZ-·î›sÕ/ôWðÊÖïúúÆ,àqPõ°Ã +V-@”‘yê”1PæëÝy±Àî§ r á(³£Ud¶Ðk;ÿÐ+oqe`W窼°üÃÒ4:£‡¥ÇÊ<‡!  ‘zøré”ˤÀÑýH¿=ÜìŽýPö’‰Þû€ ¡ ¦¡W§¹’Eöù”Œ#‚*Êd챂Dµçk`—Ê걸²B`G?£ÄàÞƶų̈Ð(yðiœÕ]G»<,yà ž'ªS®]÷c¡ðtY‡&Ù^_ŒnÉý±¯:°)ÀZ"7Å)èw%+¦Qk‰ôτ jÁãX 6g‚"ŽšëX3Úª +Áš´ 5¸Ö4èÞZ[šÍ¶y2¿ÎŸÞëZ¿æO(H à ¦Ft2ð„ÓÇ^‘ ¹,LŒ 養 ó+0öÂxCÕÖ)ø»r#”Ò‘òe߈sXiµ…0 §;&¹b' ÚP4Äú(êF#CÂ;„‰[/œæ”œµ ÎPÅpÌ rZ‘Á)U“ªB¯Sd!U²’§PäTóóIE'ôaÊ"Pf^Hړk`hÔçËóÊÚhîìU ÅyÆ´ «±ÛŒ•ò>lL+›[¥ |‰Ï E@_u¶¡†D‡¦ƒo¹SCUðV9Û;à΃i‹ š¨C¢ <6¨}’æT¿S™Ëԟм٠ŽíS'–Ô©UɊ¨:/Me‘ÛR4k? +¸¬3¶7¥„ÅãFAR=¥Ð'ù`“uÚïsLOàöðJ´Ú½Z‘eûÉ4»ˆ¡Ùß(ÏÂí#ò- ŇtøÆZ/”½,µUÙçÐÚ 1áĵ~ÓTCLwµ=£Øþ`~¡?¼W¶~ËÆ+(ó—þ7Ì|ne¯VäYM¨€ßÐsE0-ÇAáyN1ÀF¯¨¤æBY¼CZTækÕo5ò¤p­ î]Zk«…b·–Ç«ú+xeëwmúA†gNؗE$óՒŒ vR®Z5Ë`@a9œ2QNpпP¯‹H3šºœRµ[ Q‰®ƒR!bJ›öÙ8Gy´rU}©RÑÞkÖ.€ÍWD¼Ì¡Cñ7äÉYq‰"¼©y‰’9¬²YC¡?‚ÝÆúB&tmÇZYC±VíV'ó¦© n‰ÚVrUØÏ/ôW°Êöߵ釗ô h-ÑŠkÏÉ°éA†‡ìÆ!VFé(h‘þÆJ¹*ÒKJãØ^H8Gn*sJiՅ #›a¤V&\•1\Þ¨ÌiQ®\V_«Ô´÷¢?™±ÀQÝØL‚lùK°;ö³‘yg ÚÛԘàÈ*pwX=Bv‡@¼CU KÊïÀ¦§‰oƒ¼"4 ä£AÌ;TÈRŽyGŸ©çµ€ÞqmHî@2Ð;Í-qŒõN™ˆQö¦æ5ìïG@–ãÞaŠÀ¸ö»èÀveðpüA…n }‡6T R 9wuÀkî”+ïì ͅmoê*”Ò¨+TFÎ'•Õº¤­a¢X-—S íuþZ¥ªõ{Wý? žî¹Áñ®•¬¨“9Ç“¹4WdºSÌ"böæB¹×ªœ`MڝN–즩k2stmtjÍÖþp~?¾×µ~φÛÁx!È\5·Hœ,r—ÜŠPK@”ð +°1öæóìpà«Sl™Écß\`-ÏM]…PÚt–E*Lz³Õš0·âÜ6Y(&–gó ýù½²½ý mµÆÂ"Â|@aŽÆÊ€Õ“ŸÅ@Yj¢LKpݏàiž†¡†8ÅD#¨×ä?$v3ÈÊÜ/T'#“ÛB¦öʝª×X˜lÐ=J®~UE +øA)´RF˜/üV'‹Ô 9×(€–4ð(§˜ädQõÂþ&LTJ±h¸Ðeäþ„é$0Ð Æ$°ÑXŸ· À5¢†¹$G˜Ì{NEJI£Æ” àˆñ j/F“&€ê«ãa€NФcQ‡¾ïs À^ƒ|GE²²8h÷cnâ°›ñ!ögï¾%ºè1š=ÂN^­È¢ÒáPnGãóÍç&T |¾Ý_/³€¦&§X“v§“û¢O—º +Úð§Ø­åÙê…þü^ÙúE¥¡ çc‹½G‘p¿“=«>œ†’Ú™J†…Œà¯ ;¬µU£Ø­îo.´€¦2§,[u²?žW毰~צ +’SiŠnB¯danÀº8(_dà“ŽˆóÞwŠó,‚üë…% VV)ÖêU™‚FîÍVS+ëìõj«F1àçú+”ÊöÞõBó' XBâJ܀#âà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q~ÉçD &pD\NÐ"â<žÀq5   â<¢`ˆóˆ‡Ä•ˆGÄyHÁç1W‚ +W +–h¸Wàp¸Xàh¸Z°ÕØÇ•à‡Â•è‚%Îà  +çñ…óƒÎ  +çÕý^b –P¸dàH82p$œ‡,‘pgàH84p$Üþê<à°5<þ א ¾æÐ~¸•€%Îêu%– ÖU)-0­!‚Í+s”[it‰†ó‡k®ó(uí½ér 8‰†kȆa+0ÿ‚ró`€ÎcêeUÐT䔙֐ ÂVë2”[m²ÃùƒùUþè^Ñúé¬ÕÝ ;Ÿ0b_r2¬“ +h)ë#ÍÅғ{6f³.`¦öBaa!Œm]N±F«aBɲÈÚS¼2šV[¡¡>]¹®¾@©kïM›òQšû:õ5ÅuL`¯Vä^ƒ“`óÙ(éÀuAõ‘B¥¸±Ç43¿{çÚʜb­^K¡‘ƒF7•%È©mÕ(v«?ž_è¯à•­ßµíՏÐYá®ì&U_Ò4i¶’aNcZàﱝwO"u8,ÓäJ¿Šil*«k՘~!Ï¡ÆM­L(ÓL¯wiµP¬ÕòxõÂò +µ²õ»6Ü*f“M°Aañ¼Z‘ш²›S²ä.=„-=¯k®{@|òÐ^HyßVækÕ7?'瑠ÅRlv¹iS?ÛmåÑÊEÍ;Y5ë·üTksÌ +i4pQS¯Vd ¾h¦À¬&b^4H€Ô=7”ºÀÆ~qa‡8Ï©­Ì)֪ۘœL·ÖÓìܶ©gölå²æ­´¢õk¶ú1ZÀšÙ©JH…¾Z‘¬ Sè%•1žÛ×#…øB1ж}¿.°×U)Ö¨{«<ÁpÑoj]0ó©mÓ(WEy¶‡ó ý¼®õ›þd“–Q‡D…@^Îâú2bÔý .(ÑsÆ ”‘¬ú9±}¶÷9qyÝ/BÄJžšZ +ÁÚrÍ_©²¼#]÷¥žIÃÓkkSïÏdTh«gýf­ïwPÝzF»<*]֍ꬥÆ5cöõS;.c»³*Æ~°Y ­È ֞ÝW¨˜&àU^„voÏî,ÖÇòËʃ—ŠÖï÷S-Hîȝé-#Ž’|µ"C6-Àh€ +*O7¨ôÑe˜æ Å9Ühåõ Ñ s[W!X›Îߔ:)ƽ©)[m27¹Nšgó ýù½²õ‹~"ÑcÝ¡CR#8vXe_-É°èÀ u/ö³‚( 4á N0Y¾˜šË:uå55JiÒîtòÀ×ÙÔºh- +¹i³PìÖòlõB-¯lý¢?•„ ž:ZRŸÞ‘.•:2ÞeÀ°{ TÖK#I!˜Jp*ÚÔ^‡e×Ïm]N±6]›42œ5€jÔʐÀ¶ÏM£F°;ýáüºòü^Õê5š JCOG½Ić);ÛÉ0k%ÒÔ¤ˆ\OH¢Œ=6ÌÌAc{7fWŽí…›jeN±VýV#Ê,jeBí<6­Š…>^½Ð_Á+[¿ë'ۄY +êð øþՒšKjˆÑŒ– ’ŠjPƱ•bÂH,ÙýBΐ ª©Ì)Ö¨Û{”,]Çüxµ²¡Ó©Új¡\•çÕÇ«ÚÔºV/Z{ðSFȽ#ðíú7sIí¶€vâF UAvËkwSŸ+°4îÕ \wF¬J®¨nX ;f 1P÷„Á¡ÙµÅt˲¦1UH7²vgìˆîi1ñn݉é²cÅsÃXK§rsÃ;BôÝÍ xWð[í"q™¡b¹ùT8[(·´§ É=šŽâ@î¸ØIZ÷´Z˜+Œ{šeQ‡PQܔ´Áô n˜’ 5f î^–}q‹åÄ ÐÐY^6ú!ÌQ6/߳yfØÀ‰‡kܕjFu$ܜrƒËF<}ØÃoOpOÀøT¨“xøæ_@*+¹À èÛS.+HIÙÇó”ã +Q {?N•š‘­›¹á­&',°N-H¯¨À$½½œ²>W!×g/Uí¿äO£Ó|T֏£7Ï¿¸}8p~]þñåµ>Ïoý/×?Z ©Û<ÿýõ塃sÎn^}ûÕõýÕõíCsƒÅGoã9;ÿtóâá‡ÒıçúêþúO7×–ÇzùæxÏ4O#Ïsý¦}˜£—ÿæú»‡oe.îïnÞyõ7w¯÷.pï‰Fõè{þýõÍ÷?<<õE÷ç7GGöü™žít~ûÂnv𰧸ùÓ5ŽzâoªyŒ–Eœo˜U…È32«‡ÜӒõ×â¤'ƒ›¿ï‰O¥ÉÒ@Åo-ÚÕ›œìø›¶ŽÃÔeÕ3Ÿh —ý¤cvԈƒÔ åä~èôðî¡Þ—És’Æl#wdôìó "¬YãØ‚È78}¾) ŽÖ‚ò‘§ªx÷Äês1 ÏÀ‘kBÅ:UI¨×ðjÙ*¤c5AO€î=!¹L²½‹jFgÈt~îÄS%½;ÝlÇs0GSÀé +Á6Þ֑TrÔÞc#†N 9L³ÂPßNO + €ÈE[3x»î¿”Aàó}YßMvõ9洘Ù³"%óìý<2ô€H³òn-9Ž½Þ⬔ÄQIÈ©M †Í­ 5 •Ý=¼.YxܤÊfŒc=¤¤Ÿúž‡°% vÇ{ y•/ŠáøVºØ…XDž0¯5²{ša—õ]&’ÂÔ5KœhZSðP‰q´øs"ÃII3ñ¤’‰ÆYÀ³õšº‰©}ÝÛ¤¯Ñw6`coY„!˜¤XP\HõÖHM¸Ç¹yÑLé#sCP™­Õ™B Ýyk ªj7@X½ièä6ôŽÑó8:á‰A.Òh5!{ìÝhqt0³ñ:ÚíÊìês +:Â!g $Í£ÓÁ¬  ÜÀè9¤ ê=å6]Â6 ° %éG.Íl‹‡”јÂÐم‰—å>«P'Š¨‚ƒqÌ#))øQæ*¸BiaDìWàÜ%u ¾çDbò°vžúÙfx>¦ö ˆb†;52³Œ|˜{Ȉ:zla§«|† Ž˜ÄNuÜ΃º_ÌAÅaÍ}a`Êç) Z;¼rDj¥Èq£~Žî–‡×{$¦3NèOx2gyº9ZŠ¼GNDa¦¹ !3E —ÐXƒ¹ô43݊…Œm’ÚžIÆ)S_À2qn[oÉ;@û&ŒŒꤘ¦Iªe=ÄiöI»™`zOçÁh¤‘œ:tÁ‚"¥s†Á.;Õ°{¹ ±>P±;šW²^ƒH6^d¶`trq‘ŠøÀ©Ó5BÀÁÂ3gMt6‰Ï£÷Ig9@ v›(ss[Ö¦÷Š¯ÊpAÐFCÍÊÃíõzmošt†Ò,4÷<Åkr…Ö#ä_@˜CçyEò-æñ”¤3ôjŠ½rÃÂD®ÒM³&æ‚žh)‚f•î¹©vªòømD8a{J°â“^Lüÿ¬÷aǙ:}=cs½.nj¦ 1ÀÚtl£›°"çàl1sÔ=t ×j²§ÌLÌWWžFÐÖd}sôËDˆØÆȖrIÓZY’ÇEÉ$Ái/\1àØùæþX€!#Ü؞›6  +£ 5ó÷q¥!HµWóy# +Bžß7caÅrTÈDÃÞé5çaFîk²Giô&§¥NF\»zÄãäý"¨²ÉÞ¡¾eýŒºä•…˜ÔìU,sCŸK2Š•àÝ8À‘¢ !vÎ;;t‰Q‹Ì%Ÿxb­"ö!EnB§ßÄýUõddCàIË¡þ#™´æìG´'EÓd'o ¹±‚<¦^“ Žè/PRèԗ5ÔJäÑ t~Dg„5ÍË[y´‚¶‘£QfÍ3}™°9–„$vpEšétËV{šÌÔÏÝA_5d•ì±ÓS_‰ô~j04-gH›»Yƒ)X—6 +Ã# +ø ‹ÃúSìõ ¾tç£ ÒnÅpôVcâXb¶ÓDMJ̃mšcÓèÐk_r}\G3³>/â/é’âR)¯Ú­ÀôÏ&›LšÝ)d˜Á£Sæ7ØÑ?Cª©aƒ-(Ff'M:ð$ÒG#÷n hxnl¬oÔsQ°DF›Ê +¥a êSffØ^5D{\ŒCÔ4µä¨ /"€o’fÅíë¬G¶­ijpúœi s°²0é­Âÿ4|’hRf?ўêA”ƒ:6˜/)š„-CP×EV3ÁˆÜËúÞ÷4CÎþÙc¾[7…³~T¯ËU±¹)›ì*‚:¥h!ÄÑÅ ô–‚‡–P¿3æNÉ´ªñÂ!©ÏyR WÉ +ws.\t ¡K‹‘ …ž‰Ãy£†ÿr?º`fA›,·-ÌdŽ-˜þ躇,Ȉmœ2g§mÆÎ0£F£ öf,‡±{5ŽW¥6Ý1qB“zÓdöÙb^g“µ¸ÝOÉ(lrýì[Ü2%}ªe ã:O4}'b·gKf>BTÐWE€uA- PnƒÅÀ SmºÒ4­U^à`æN«#˜ïÌ|Åö9Gž?ûÂî˜@hq"«F-´3çrh pT™·uöÀ{ìœ,…H¯y`gc8XÓiÔ]ÃÔ²úvHÞ¦Õujv¼¦Ò<óÈΙÁ¹4 *çlþXÃ@í{ ö±Ï¦·‘«,Ò'L%}©0uÀ›m’ÙI»aŒ#LÃ; }³®¦ÆäΝ¾ gËlNA†ˆL²Tg`LŠÉë‰ÿ•:hÿ’F>~Qø3WŸ-ß2ږx'ý ß“àìJÆ~û‘iÈJ É •¡+ÚN­jpšEM’0ρW4öw&"m K€3z£)€FØ?h*½Óñ3쌺áPø¬¨!ٖ…sþBë'ŒŒ£h@íxH„í<+œù°ø~Í]9ÚäH©Í7S¨A²bF)ߒa;‚ @c5æ!Ä+v43èJD‘|RN÷¤h¬·Á$ƒR{&ˆ²­);`;UO.肧Q$žƒ['ëá2ˆ*̱9X5Š/ÊîÃ×çü01üT ˜spâÛô“²ö23—TCŽS6y‰ê‰‹>¹ÉT@¾@LðÉ ÷V7ÑSFOA +xûY­êõ. 3ü¸ÜGR1~vnE ŒiÖs­9ñìNˆØ=tŠ÷™‚½ «?3é›psƒÀAYŸn@HÍLˆ)´à‰kV}ŽÖ5mq4<|£Â43/LiVŸ/mœJ êî¢O´‘@¨[•¶`V¦V˜N•2¶Ê¬ ÔVaáãQ­ÃjE¨ ЬìÂÉ>iµ4ñ/éœÇ«RéÑÎúÉålé¢hƒcýÎó®ú éT1ÇæŽY£zõ̶ ÉIǹl… 'ÚÜ@&£¡éR'/4ŠÁ™”Éç1 ½^GÇ)<œ’?|gûº@£'€§Ç¢/—d!L/‰-`Kk€À´§ÉÄ;œö={5nÖX3➄ÝÁ¤§œ¿×UÂSí>îY „1Ôû:H) ö¶ÓÌØÄP½ª©yÊÆFÓan¨°ú¤ ÞIN)œ‚ÌToðÂ÷x|w‘YÌÌK»(}˜´«+rS ‚Š H\c.\½ I6Ð!cGÅÞ6šÿÂ¿sÛ(¨ØRçÉE¢Ìšéx*ö V +|.óDnÈÁ@Sá4¨Qή¢gÙÿQk…/ çžìŸÄjæðN½[Iíº@`£³&aÊ5ÌTDÓñ̐@û ­Ðû¢ÐzÅ!€Û´(”g  AÇ>[Õ=êUŠä-BVï–pÆ`škÇ+1ÚȜ™pQÀ'ÏeçêgÝ Z2Çý/ wšè;k㬩®½ raêì*òjìT'#³Æ¬·5†ìŒÓ.`á™u®15$thQ ñ™²**Ñ#jIf +"@,Öð˜PŒ³'±³Í3ùá= à{ F6é4²z²÷aªùgõÿæƜfuìq¯êõ1™­·u>ð'v‘Þ =é‚g(§©7Ûb…€…µ}Z¦cĬ@¸©6שí) Š,'zÅQ$ö$ғÏÛà»b*ˆI£=iannã¶óº¦ÏéÀÔlúÆ!TÛ8 Gˆ3¬pj¨‚‹<ól*õ7±k9âÐsÝûxö2z¥hi25 <ž6ŠŸS“1“Æt¸XèÞnŠH8×@QM³:œ0Ûëô£môȚIµ¨’‘3¶%ª–Öžy{®¡Èס£©snÐŒN§òk:ѕ¨°¼ÑpXy.¨+%#ˆ–&µ\†È((pHJ–²&¿¢JÈÀbe:´cÕ/øY6äÎÃRçgx¸»[| RƒgàU´•!E퐉±j Îá`Íæ‹u|'՝{CO3µàڙša”8°‘úEpàÕu£ÐÍÊX¨í-º·‡¤#%qBʓ¡ CË™ŽåI ˆ®ÕÐ ¦V7|$¸‚6L8zû95žSM\4k]júèœt göÀü›·š")ÛÒ¨ðR˼BŒ“tҙøão—'ºaÕ·Íôrz‡ŽGAˆG/Í~ˆ ³Þ0¥nŽ<0 Òð`Ê1SØGqÅàâ*욡›´Ï!O€Ñ»²ò­¢ý:©ÿ¼ Þâÿ¤×`塄Yü\"ÝqŠì‰=§.NÆ.#ŒeƒÂs— ̈…ë +s,œ5—EÉ + ûõ*w,׉b½¯œ +ˆ Àš#ƒÜñ2µ@Ãö‡£~ ÁµEž› ' VžI—Šæ³˜é¬ä&zêÒVPQeŒÌBfÚ*B×(Ýž×s#ªöXcŦ‘9ÅázÅsG7QFµÆ……2ªi£a´aí10’‘l`†!!7FÆ Êj'„¬gžÂ´¡Í’9ü[ØxU3Õ×3QrElJœ´ÜH0;ˆ€Öì¼²¥b[ágˆj<o²,3ø…«ä·QêÌâÕ`#¡ïxgWŐӒ'~Òè”}ʄ!PzK$K²wììmÎ6= Q\„Lø4yêãÖê +ÜÅè`â<´6&ôïˁ€ª°›Á5-2”ÚêgÑÒ9Sà´v궮·gèNÆ%&ÏòÆeØ©Eݞr&=ÊW€¾•yTÎ+`d'Ô­ iJœ¢}B†™“*;%2Ö+>ó¬~ÝîÍÍ^žÕ,+¦ì0*˜’‰LáBcÉüýH À“4œçG'aŽ*‚ÛT ‰–>5u0ÛAd–;¶’ÀÝ"hOûmt`ap u4Û}è `ƒ£‰€‚ÿmtÑ ÷AL@¨¾î%jâe4™åK³K `Ðê¹ùOf–Ä2çŽ7™\öŸ]ˆší àÄ:ÕqèGÆt@ ½ž÷ˆM¥H8iϝ¢Ò„Õ)þ™²‰¼èt½é»ñ¼t¬æ¤üqÜ +àv-ðŸ~t ìz?òTˆ$€Úї·ËvF½ @âóÛP5[òv¦/ƒ9å@€ÐM䧋±iRV + +n#Ú BӖscŽ˜àz·×ˊ—€zC]¢@‘í€X,€Äˆ½Á• š'gì b ¬EåŒAARc¯²®ÝÔrtõ<"ØÄ4/î#ÛbÍ·9*e“ëHµ I L“šh’±±Ó¢L°½TÎ'µtŽî!`*ç€7'׉Aˆ„¦úÏ„óãLa +¢<ëɭߏ Þ9ªúÏTð ¤È쮞'֙²ßÙé†SV¡ŽF¼N £}!Íjè0QÓ£Y0õ0ÃÀÄX^Œ¼Q&ÆÒ²0zðp‚ÚÂäpÜÆÜŠÜQB Pg@=¹ódUlm¬G"]¾Øè(~˜¯ŠJM¼ýx}ã˜#%Sä:$Z½øO =ÂÆM,͍»¢NŸbeg*à±Bž‘î8 †{'muŽ†4Ðaws‘±Þtd"} rƒ‚Z%1qpÞ Œ¹Z4¼®QCrô|6X›xø­úüh–· pÉÌîÀõOœ'*EÓ¥œ9-ôD›€ÙÝ:TYÅ;h™ ²z€ò;™!`OL¬öºCáf¿øã^Æþ—›ç_?ÜßÜ~¿ùÅn·½ºzûê÷w—¸xgV¹8Í¢J“Á«BVœBßYk² ½´)Cè9K]/¢ .Úiì´J2ZDҒÒYØlÕ©‡>1ë}_ÏÏcšpÊ90 Rý+9FÅÃÔë`¢,‹ê]æ5ôë´Ü§:'"§ÀH¨yõå`à™§ÄôŠ¤;0 ®±õ„Bv*°)˜£›Š³7€øêÎN7V ö!…1?S‰é5Dr,×÷4‚++‡ÀóSªG”0 û Ô<8Œ‹Ä܅ò¬p¸2‰öG.Ù`ÒNÀםõÐó™TËDg¶rzup_Œ©ÞG<³*F½èj€±$aâgîÆövA$ä¤ö/¦œ†e*¶m0/ð]lfcÒYT&`¼Œ€éLÔÆ&Èã@@ñrs N<<¨:É-z¸^Êîúapï}Tz±ê“áÙ'õ2Ž–ƒÅÎ2¥ÛŒ{Ý©ëÀ#¢Ç;“‡Añk?™c¶c.È7«ß7ÊθaÖ ÌcêE3-á*2e:cךÔiÒŽÙ¿„ˆˆ4\Ʊ¤ÿCy…z×ÖY½gc”)!@×c=@÷Ž¶“Ûmà‰cÕ^ˆcÂ0#¸‚ÉJ*†Õ‚˜½]VD7èYY!#ç€V7!¦š4O óX/Ž /HêK†ÔÒõigàð#ûÑ@M5î™lßÅñQ6†Öù«ÿe8—µ ™š¡&-Çefê¡iHaD!¬áÜ A†§lÊû²ðd8Go/+‰ºhô`š‘Lø´‚ø®!W Oôø +…´M•‰y +m ÓyŽ:aµ¹¬¹¨ðg2Ÿ**¯!N È*FK¼ ½PR[¢f– ÜŒ>*€µgÆVô:pwê†WŸ‘}ù‘r½ÝeD³â]h2ÁÙ"z^Oo÷¾ ¥˜+ )£—…¤à‰ÉÁ•0+ÆÆî3jNê蓐ê‰À2Ði ×Çì‡׏<^½ŐK~ˆ‹ gƒ²¡=ä°Gúþ€‡s®¿±gdMvôßM*éÕHÎù¬xÍ,:%‡cЁ {³Ê¹°Ôa:‡o·,®¾‡‡¤+†H,X3íæ§e¨5„¿cT1Þ³ ƒÞ¥+‡ rVo»w¸oÈê™çk a~`<¥J̟’õ‚Û<Æ| "5ñèDÅg8@á¨'3g<•Öë²A_Ãь˜RÌ>ø‰+@1jÀԇ¬)Gªj±V$cö1Ž2*󀟍Ç;â˜Á!Kïê‚À]ßÀœ©Oa:èސÉÍcHªˆËÔHÄѬ`cR00ô’÷´#^ Sy«Æ±Æ<ª¿{P0bÖÙB +ß3dµ¯‘Ò€ýÔ{Œ¬s³“M¤=ål7z&bêu·wh‰á't„†{ãY9Žè¯¡Óóö*@'aqrõê©!!Nz²RÜI,R›@|’9R°ŠCºça‘½Þ©¦$@úÀIiÌq“:\{ʳ&­u¸÷ª8 a¡¾Ï’‰óT=frTÈo…F—°u#TãšÂûí2É̜æÀ’É8zĜ›ÀN#º‹)Ø«‹_§âž|þéUÆ 0|ʼ¤žõŽ [Èà óïËY&”ñ¸ ý¢Šmª'–4‚6˜Kß,<mÕ;SU7?ö¦íÞL*´’‹³”q¦ ¦ˆõ>Çê}¦U•ê•@?Q•Ù£T &ê“þÆYMcŒžœ)o©IN߸yžO£þ{ø=`GÍ°¶2]›Ó‚9—´1†Îx¤Îs_Ò +¸Ú5Ȓ®ê@ÊCJRq„õª XZ?Ý&MÛhEÃ酹mvñÄýC“y@·©O™oÑÛ±µzö¸Àüï´µ ¯Xð b{g‚"Aí®¬&àÙÂ$ÁJN 4@{à@›‡ßfKd®H Ó×AŠF³Ñmeމ¼ óÐUÝïgúÔ0{'4}Â5ÈL謅É"GE¬F³q!7k¬q0ÆÁ¦ôywb þÀ¢Ë|B%ÛU=À3´—å‚xÒq2Ãc5-,¯ìlã(r=Œ­XÖ¥HŒkRh ‘GKª]ÖïÓùŸª/›ú@_øMc`¶£ÎùjYã¨N%Ç æ¢Þ‚µ˜gŽç}ªÅÖ •Qgþ0èp”‚·„Q-ê.èah yhQjIæ¨X"PcP‘pj‹XPiå4†ŠŠúƒž„ËŠè§Q“¼™ò¢ŠÖ°ókç±s¶XÌd±*Æ«OËà©}Ðk„(0/ÁŒ®ô·C‹ C£/Ó¿=Tb¬ ôáL£bl< úÖÕàx_ô< +>«ïd 2pîE3Wzµ#{£ç=V9èãi„(Ý£´ØëÛEcBIAk,ôô ÖP&QÇi—]פVaׇš?šÐL¥ãðgë9ÕÓ&{ÝPÃlÙ£…«€@”™alÁe~ÚСñìӃ¾E`þFFÊc 1Ì6xæÆ$è5W^²°`1“E®Ú*〴À4ãÄQ+)+¨›‡ÁÈDNë·yª†ÌݐÔ#ǏØ.“¥×°»& WI‚f4%ƒO´ Á’§ØÐ p5ê†WaÛ¢ñ–çܙ±7M­™>8ŽðPätÁ@ 0´ øv@p³¨Q¯Ò¸è`2xšjsdfÈQ8ŒI4Ô>–ÃÒC~C|o胲°`¹)ô6Èl™§€¢Þ‚›# •Ìþä÷q³-„$Z6•hØ@>7ÍÙéᡘiöEDáhVG ¶9Ÿ³‚KM jæ˜!,uó%¶wddNn‘¡ƒ9ü¹ ¢ÇFÀYo78¿{iü>š™-,„O‘>êg‚‚Åš€Óë|„V¢Òh2ŒÒ`é˜ /+8ߘs†HYã5ɾM ßÛžßn?€¹(àÄP ÐÎdGb(aÒÃ6ÌS ‰­1Ûñð½eë ê4˜9ÄßNϪ™õqûrÄûPÐ5 VÊ11õM~uš#€™iJÐi™Ê‰‰­Wé_?ýØÛ¤,¹R‡âÂÍTßki¼_“RVèøXôO€Á«t AsôÔ{ à)\Áä!’QÎÆ}YTŒ66!­øñ¬8Z -íš_,üÍ"»̯u¸LV+-yø›pÈá +8gaªì° ÉÄÖl€¹qåƒxçÅáϗÁ˜©*ě)­ò‚.c/2ç „'äéάù“F¿îyŸû‡êqY0Ðcì.)ŸûñVʏ™•t8ˆu™Yõ˜Ð›ÖÀ”¦âÊ"ÿ30©¼¿ +zXýà 4¢ f-ŽF,Î`pCE¬Ÿ®›Ø[§ÆV1ÕI1Ôòáe£¶hŒ•„óûÊ>õøƒëÖåF©¢Ӕ¬ö³ô-´“Uo–°Œ æ5L„Á—˜OQ¡;¿ÇëQ)ªÜ´Ê°x h^„Ì ‘³¹Ý©¨P¾Ô­®‚ª/ÀÙP ‡T®Ä[L«,3Ƅ٬§!±d©Å»÷ÀHçÝUǪ^ºKÍõ’Üf ‚P䖪W×Â(f—•Çßi¯˜[VƒfN’»¼ª¯,`¢´ä¥–¡N_8 ™ôA6UÐ1?m}Sq¤àèrÞ´Ì¢”.¡DcÇŸ¦ç7UÊ žÚiP 7ámdz£—«.P©ó) î•³u÷;u]G¥@’PÃVZøi3¶Š Q•ù†¶ô/Ä#‰ ÒUJ ½„Ëë:²n“P¨Qóž9\i»ÿ¨Ú¡Ä ©È<»0™?}qv™P"Dƒüã Ì°ÐèÝmúüͳÿóg9ÛŸ£ýoCÿ>þ{?ô ¬*¤;Èøz¡?þq®ª¢ ü1‚Ê$*îôã{(Áðc´¾å‘Í>†O Õʎ>ƺ¼ß}’±´E1a€±úçàC‚L䡱ÇøgÔcüÂ®ƒz̝ä0l†#·@7©ÇñÒJˆ—xŒX.¤â?˜áóÝpÇÐ~§rOÚ1ªE/)D(H)Öm°ãÝJŒ/º¶B=QÇå6b÷ —1éL~º$:.Îş¤cfúœe KAœ¤@ǏgÚt 9¨°Bæ3 _Òâ# ¤aÇ#‚ÊßI9f3§^ä˜ê€ÜßÇeˆãG Ð 8æßõ oLã‹nŒÃäþ,¸ñcÁÛÉ6F÷$r<Œ6†lófÑhc,ìĜØÉÆ¡i`ãjþ÷äW•ÌTc¬îg1ܪÚ'ÒÓô•Þ€ÆœÍŸ±xÆ,WKi­­›?‹h܂"ž1ŠãÚxΔŒœ4cxÄJÁfŒÆ@w*‹e܊bOÊîõ%F¶œýçå™Üc‚Œ‘ùG¦þ࣢´©ÿ£I¯¿ê÷‚bŒ¿S;Æ؇…ßB㸨=0ÁÎê,€q¯Êˆ¿5jn_ŒsÇrЋ!$ÃÕ¼˜%Âøt^Ìœü^¬yR­ƒŒì@ú  /–äÍ4ã o â-iÜÔg²‹ù7•—ý€UIY‚]ŒÛÀN°‹Ñ~ +ï]ŒË¾…ˆ¥Tök£ sG•ÍA.–µ— †á‚†¤N`Ù¥1ï@ó½Yàbº8™n;ÕTóÉ-ÆJ¥Ú-肪%KhQ”­Ì-(ÿžÄb®^¾d‹G·ÌkçÈo+pÅóPЊq8È+† +`³Šñ\:.“âöQ»‘ŠÇ­O%@Å|‡ð%‹SŒÉ.ò)%k± ?CDß ?ƟâÇjŀî€F1ØÐÚˆâÇQµ £ä¿„bü}‰&º…ÈŒ|bªçï>ñÄð*àçïtbbºRŸpâªüd ‰aGZã@³Ä¸æ C:…úëЩ|\bäk!.1rMµ +Ôe3XûI%F ˆpÌ +\„ªÇÌ$&þnâ]¯hN ƒHÌÌ +ô•—"ñÁ#¾=nŽao¨vL#†Çõàã;ä˜Y¥ÚcdOJ"~wåVÔÓrfLâ=×DŒÊȏ„!aãa ҔôKÖ²SˆÉÓ`}£òL +`Çۏ²þ}U?Ö¶¿Dâ¿ÉÂO6olç³d,J1‹š f}És,?vø0Šñï6&{Uíº[,ÊTºçƒ¡Š÷˜á‡]ƒ·¿(ð; Ã€Lc– +æ0þv¥%# ø›¥ª;qɐ18̯U/ Î?wÜ0Š1_møµò"õ+`ÃèÛy«èt±†‘s‡“¨a€Œ«;™Ý>ˆ8@Ãðzàlgc 'Æ ãßñ0Êð#ÀC0†‘°ƒãˆá§Ès†aäGæq +#±|aŒ*å„ ÃC#ŸÕlah ñ}Z`pI²0òŸ„†´RÎà +÷¥8°ÂÔY\eR…¡y0F”ÃÓ;”éd +b ![ …¹pÀٚ( (?î( ÕÜ]ò +“øù<“'Œ¿9Ûí8á<„÷ špVˆ1XÂØç~N’0z^âÝ6HIl¸vÁ¾-p=0ÂÈÝe±ÙùW1&¸¾¼sô1ÝÂÕ((Û.ê¹á› |ñM¸ÇAøõö6"€pÕL<ñÁДòF¾Äá›ð`WNvð¥lê‰6Ñn’ƒq‹Êâ_þj0=¤Z'4êÍ[½,U“W¸X8ÁÿbޘÄ`$DJ]Àà!NÓÉ ¶ö;pÁ(*“œ­#<&^äTñP̍î¼HÁtëw7PpÓ59ÁUɉ Ž¿Jp<0þüUúJ"8Û±‰M¼v@ðü{ç‡1ðÀ¨pÂq'دÜÌc—ÉjM /.§õõ.ååTBøâJ ä‰¾(r»û‰Æ÷*–µÙÀßágE¯5øbqºO80Êa)s 60ü°»M40ÓÏs’”„ß`à×{ñqr¹¿ß°Àh‘x¥I¾¨0/yR1j0°rPqKé¸ø"[Š;.>Þ À"•¥Å¾ ì $0‚7w?‰ÀˆQ#f@`hz°¢1£_–‘A……RQ„0Ô}Ÿ,àì^F³â›h©ð7<׌ÝO›`$»Åe²õQÐh§Ãqñ,(À¸ÕÒs+ˆ¡$‚;8Œ¾Ù!:M0ï +Á%›¢(¼6†Rƒcðñï–îüßÛ¶ÀÿÞ®qú/òÿTPmxDu#bö/$Íý ¤0ý½ü ÿ#P€1⡾#˜¾" ØyÿÒÙ¿—‘yï üàßi4ø÷ÁÔQÆäþ¾»¹ËF<Úà³û«F'-Mîo¢~È\z®¿ —͙‹ þMÐ^Qhà_lG _€ÑKóí þ¥9™ñ.!1ÊÉ~ ðobyä“ßÀ¿i S~½'–hm,î/-=õ7î/˜Â{Íý¶ÕÔ4%h¨ôÈõûKüÝÇäþbϛ¼àþeÛÒýÆý¥™í¿‚û‹ÿè­.ì/ÿ£–ú†ýí÷¾ö—ØûXØ_þSò?-FXFî]ö—I0¾$ýå"îÀþ"S%Ö°±¿¸Wû1öW¯Ôö—º\õ—˜Y@,‚úËöƒ‰Îú‹_èÛ šú‹Sºˆü ê/ +ÜÇIýM9°‚Aý¥J+»5¶2XÔmüFýå®,ª&ƒ¯PaI=ôC“úKZ.hè/¢Š3õ—ñÅú¼A™¨Óweê/ÃGBQ›ú;^ÿφ8õ˜Šû™Ì_ð'sj ù‹îd<уø +SeüåfõY¼_èö;Ü c²~ôR‰q¿¸N9'îw AûIÅ ûENBe%;ë±È˪0¦Ü;u7‹ô‹¿s~Þ@¿kÎEùív™&ä—Y“6Þ¿¨_jZˆ_ÆænÌÃGJ å7Ä/¯:_i1~ùøøAÎ&r·"Ÿâw¨&Ӏ_ÄÁ˜o0àœ³ó}aCMà}qºA¦û’‚Šˆò÷MT\uÂ}˜wjC- ›Ö‰'ݗƒZuG5•" ×I÷åÝ€~Ð}ÃGP)è¾40ëå X!t_åJ›t_%hæ[œÂ}ö ûâ´Ù "辬2B!iÐ}q)]:¢÷ewŠ¬‚<¥ŠQ؁ÏÎt_Þ îx_Záaïˬ=‚݁÷…©‹ï kP«jݛ貁÷¥Ù‡ïKåf{êÄû²» Ƃàûb4ÁúêäûJË ’ƒÁ¯ÜŒ%¡æû¦ìdÉø…•kŽüJò©ÍšFi4i9ø¾0ÒÛ¾/ ߗ,èÀ/Fr±‹ øU} †AÛxŒAàVVà7‘ÝzßðKÆރð+k“ð˱ú҄_Hß?¿ìak~U‚šv~Ù6K¸¿j¦ö”IøE"NéAøMddŠÊ»¿z–&â7C—øåß|¿wÄ/­%O¯ôâYyÁæK€ÿ¯âIé*IØÖi¨0’„_i¿¯~~éÿ=YCŸÄªh¢@w'¿¨ Ýídüœn}Éø…Åӗ¿´D¾s1~Óì?aÄ/yP-²€fï@üâBåŒ◓5=ˆ@üÂbýåø¥6‹³H´5Á +G lMøÅÍhlÜp~!Ò7ºØ„_¼cO½ŸEøM—X'á—EBtƒðËÞkJ›ðKç]-6ÂoŠ4ü$üÒÒ¬'é£Û¿- 0Îâ{>¿âJ¤g~1ð¾&þ„_½½ž„_ZñáG·¿$üÂÀ‰ë ü2ß…XAç2n>¿2Ôr~ñ{äíá—_ÉuOÀ/&«ÕƒïËLßÓêäû2MšÒ„÷b„ê +À.Ä/†;ç9ia÷ÀߊÁçºO¾/Œ—A¼]Û0Ã#º/DÇp2w¸/»*ŒÌPÒ_¼ þÄhq}k› 2›á¼fö¢³03חÜ>¡#ûâyÏø{ÇúN›±¾ÝÓsðzÁ°Åòö ú¶GQ깑IÓÁô¿w¤ï´™èû:ÿ5‹‰¾ýRÿэçÛ=dÏ·_ú狿qSš/vâòÜ4ßn­KÀ|û¥7ù`ù678 +”o³8H¾@0 3p€|Iu-÷äøòoÁB¼i‡ƒâ #Þû€øâo¼4ÁðEPœßáÛ.'GðmnM_†Ås:¾Èìá܃ߋO%äÁïmÑøaÇ÷ËUÚTHë¤R'¼·f ãwv/m¢3›}Hƒ4¹4¥G½í¦ܱ»>“Û‹ü*2âÂö‚9ìÒAí¥æõ¼†ö"c¬6‡bö6/-d/{ß²WÄÞêuR{q Þ¼^ž ˜fÆõV¯ƒÖKDP;¬—Õnx9ÍêeM”JFõ®ƒl¤ÞÙ½Ô Þè(~ͯۜ^Ð=ষèÝø](ì1ò^ˆÑ¸Ð‰^Aè%Q ɶÐ+Êá>/þ¬¬MŸ·[Yqàya¢ñÏ u?â÷AçnÃêçEÝÄÅ«›«W6îpõtü½“y§Í`^Ðr*A5SÏˁåfí•Ë:5§µ‚”®ôw*/¬j/ ˜…(OŸT^®V8ýïT^"§Ø¨7ü+Ô5¦òr Òýw*/&;†ŠƒÊ 4‹ãȲJ¬¢ñð&/–]ðŠƒÉËsº´•ê£á_tStWÁ|ŒGw€Ý 5 )ŠÚ}2yåaä>™¼0p¸ &/ lv°3yé¦ñäÍä%ˆt0y?8*Ÿ§óÇdò2X‡¢ˆƒÉK+³ˆfò*„—ÛDð20ÇrНÉ˸ d3Áä%7ƒ‡“w½’—ÎÕ yç +3jYa#å@òª1¦<"yiÀi—>¬ +k–#zhöG y¿ð7«ígå0qyÁÂûD^Æ°v "/ƒ$˜K"ït-Mäå iQƒÈô‰‘8ۉ¼»5»7ðAä%%ƒ×Aä¥Ê¾ø*|©È©M"¯P yœD^*©]HKùÍ@cyñ(¹p:ˆ¼¨QÁê4¼(³"ëZõ¿ì7uâx¡¬ªúézçÅè0^F©ŠJ'Œ—•Úó¤ñN1mÐxi`G«½ˆF²ô$QäqÃwC\Ë¡ù ñ2$ø>éú)¬3l3Ž—Á¬”N/¢=¬ž4Žˆ¬AdD#¬QÁxQBUŠ·!)ÓÒDñ¶ßïÄ ÛMôŒtý¬6+}rx›¿‹à •ò¦ðâOô5/Tj˜¨os۞@ð6$Pó3 ¼ˆä 6rx›ƒ­Áß­p1¯4ù»Õ±½¿ È1%ÆïV ƒ¾K*T;Ù»lՋл•QàîVgìn5?(Š~Ñ ¡Ÿ îâÔo5_Ð]ö¯FÒÎÌ]Ö¨§>‘»ÅR¯ƒ¸KAÀh¸‹’=o Ñ'¿ñv±Å'¸]¬ А*h»øNüۅ +áý`íB…ÜP v†-'g¢ˆnf÷A}édìB‹ƒ÷Ø…±» ìBøM€r¡ñ1'oÞ?EùÀë>ê9ºíó:ñ~²uQJO™º Õ!Á 뢪†’í¬ h~(¸º›VAXT]ñU÷ñ¤P]œÉm8ßL!CðŽ¨ž‘ºHp6v᳀©p«}Îààz¹¶6P+$¼·ÁÓEU-\Nw$ .îÌ0]H–É×Ûaº0bØ –.kŠF™(]h°ìÛIºk?Ïé‡Ðƒ£‹¿ã‡&G—‰Ë‚­¦ ¿¦pctQëØÕAÑEýb¹Ew¦Ýá8òÁÐEVB¯IIJ“˜ó¡Å=+瓡KkW{AKˆ6Mc2tJ‡{{@tÙ*±Æ€èbÞgØ/ º4 ηCt×ÁjôaL|9ÅAÑeÑ‚E®N¼ʘÁs‡‚"(º3_|Pt顱·R[e€œ‘£ûÁ³[A±oŒÑÎu]„|/ƒÙ0,"âÅ\ +N‚.j .wCS]܈_æçb?&s|.+7oùߤçŽ@à—±9ÆØx®*#JÞ6Dß.¼ò“ž»M;>—>—y@ƜG€~†Â!@D3fÒçfp60/@y¾,@ÖBÊ(ºà/с‚.RF A]à°v ‚. tó‚ K®A—L¤¢p5gGA’&?—{±ìgçç¦Ç¾]ðsQÌEIðsÕþ ç2›–äSÉÈs.rÔ? !!ß?è¹°êÇLÏM„ÝcÒsi@8æ çÂZðÀƒžËÍxLÏ呓ðЋž‹ä$Ǻ çâùRXøÜi8ø¹Ëj€.ÏøFqUÔù>ºHêÒS››e/€ » ;@wZ ›Jƒ›d€î|1„.³³ctYpn-°ÛÇ̃u #bº¯ÞZnñKÉäÛ霗ç>üšÀÜ¢"¬¼An©€¶ÂŒ[pPðq‹»€÷ë ÜÂÈ®)܂‰°}ðmo'^¾mko‹¿2Þ"ÈpÐmqKà¬Üö®ÖIÚrsp mQÅz8••ÜVØ5Vø®-‹°oÑF!€ Ú"iZÛÉ´Ív‚i‹¿Ü ¤-þFú Úæ¢ÅßÚ¿@âÙ>€Þp¶È°¸¤Ì4öDnÀl©cèÏɲ}Јì*³ê s'¼È Ù"ò„èÃA²,»O d[r›Û¦Þ'ÆöQx}Rl“çTCl»ôÒÃVui"l;ßæE°í$e¼lÁž üÞüÚ®’Ók»4CoìZÉ~&º¶Y¬crmv}ÔI®­âLp­e±“[Kó;¶–ጲ¨µšY&³×Tߘµˆy Y‹÷–í!L¬¥Þç~ÖÞòr‚W›={®–µÐO9iµÐÔ6YµX{O¨ÚªZ“7Tíë”2Iµc‰)@µZ÷”|‚j%¦ÀzÏ Z*ÝÁ[J—‹¥Ár@©–ÙþGVÃûÓ%ê¿iH\ãoï}cLm^êNR-„ x…TܪàÔ"™F 莩ÅÊ.VPjQ1w6 µëF-¨!½¨Y + Ö¡7ýóZ}ù. I§Â‚Ëö¤;8‘±­˜ w eÁW!u0¬HùŒÅ•¥Zº7¬,H# ûU–è—#çЮUµ;…ÌíZ…»‚Þ]ŠðO¢ìË JÖ([cž@ÙzE¥© –§aGÊ.£˜²Õ<œ‰4Ų“ íƒ(K± 7óbå6Ù£#R\!ve¡´W]µ²”ç;nˆ[‹5L´[©L¤™Òíƒñè=àˆF—§èO–ìcÃDÉ"džâ ÉR¶Ä¼óN’Eb«ŸÉraå­PTKX¥sÌSý‚©Ûw€µÉ%Kˆ51²X¶(&·Sd –ì)¯;ƒêÊ͐-–'YtIԙ;™§ Ⱦ»3Ÿ¿¹ÃôÙ¿A–ݺ˜Ĩ /æÇi¦ª\ŸÔä° % ³¢«‚9ËÍî=áÉú‰n¹D¤#r͌o5¶ €íö¨) áUiN|XPfCá)ÜR‡ Öf÷”»CA1̄¢¥› å涧¹ïŠNߓösKÇªI5p|q^)‹!ù`¥€ä$¾ðHø@à•Ý‰œÉ'¯OÝZ"_Ž†‰ÝÙi\e°ã9h—¼tž›9+r”È­²(©ƒ@ ;#Ár§mWŠM“ë,`p¬y!ÙÔ1ð>›2`Àf©”3`EøP‡dJQñˆ¡Ï`·â)[‰«Tä§H$`µ—z;`YU)Ž~„³À‹í‘°A[ë›#h5¨ ­¯IŒe&._Sš‹/õq‚Ð5»$ŠÐjÊrÁ{þ›rZÙ®ý‰Á‚“¨V +/X¸RâO²?#,5êäÔSìÖO²ŠÝº.7ã¢*7ï93uQ ÃÆñìj í¯@7UÚ[X¤*FĽâ 'ÔúŠÎt +…ø›âŽ¦Ýµu¸|àÎs4÷.ÇÝU7³†.«ó{ o–4ÏÞ"»rF +…•ð$+À’»ž\šL|¾\¨ãÁû7PyyÝ|7n¶…ìYÓ'ÚBn—î8šÚ\ã#‹’g¶¸ìÜíbøxXǧ¸$IDJ_F/ÒҚ6d¼Ã3 KVóÊKóÌô)rhA 1³4"-³|%<þÃ,É™´Ü£¸ð×Än¦!+RD„ê!ö§9t ƒÄð ]Åf,¥jVKLE= øà!X€…}$ðˆ ÐB^À¼. -|””ŠE{ÙÃa]QW+–éx ")±Ks®¿52ž0SŒR‡…h n( òv!Ðß=¡s`&Vʁ B úÇ·x{±kT¿r!žÔ¯Kø×R€uöS[ìw=nà27DÐV2 £fSLáÚô/‹„Q–v¹Õ‰š˜±K\v73UÞ·$×>áË/êmâ5NÒôÒ8p×9͓­ÙtDÙ ¢&XX&Çm¨ªFUQkS VdG³Š‰põ|óW7KµoúÒ,JàÅÙ´KªæK4Ga^lҧܭF³t§`UGìì{²Æ ÜÁ"ÒÜSËm¬yÓО\Á"Ø›Øw=NʾÔnYû«P Ú¥æ`\ \ْËæ”ï¸ô=w%·iá:¼u7€‡´YÍÌ W›»ê2ˆˆ¿ôªþd7 ®F°êË³Ö - ÕºÞÚ¢÷ºqÕI¯Ï±äû‡/[QïáÐi‡ã%Û¸zÅÚ +ï +ä,+À!í~4R©çis¨41é—5_‘JåaÄ~ôã%ïÉXæɖ’Ôy`v'KvÝuº#ñ²p|¿Äá®T‰!†¾¾›’Â{p}^*&ø'ÖÈaýX²ï[ÍÒ=`Þî`Ö¬×ç]4„2-¥˜[Ûâ„XQRvmˆvŠœ,[¼×li»û¸SږžµÅ>•£8Q!4Îüʑþʯ!² 2}˜4M äÍܕAtsnaùÔ£¯”:‰ôX­¼kxŒTÑ\.™Åƒ&AÙ"å~,s7œD·—Z´[QöBàH=݃Ø%0¥/±F`Aù£0?¦J+ ƒP7¢ Û»‹‘gƒi@´]–…ÈKT(«»¼kõ˜Ií‚T‚’#SžÏ³˜–[eåÞsš]JÈ8/£ hÍÀ”´ r#mñ‹~ÞÚÐ+4úY¤L.‹1Þ3¬ Ýdò'ðõså<ß^ aàuø™6)iÔ´Y^È4’ùVX’¼kÏ¢ ¸·®:ÂkGoPå„ï€*_XÊbõ¨ª‹‡^ÝxPLÀµ žèAa££Nå~W‘„ÛÉ ³\ãw[\v÷9^©A§O­»µÍÍ¥ Eøá€N¼"6øFs2Kä«áD<-ޕ*vîZf`,n8–—¦2SZÈs@í(5}ؕá*Ò]Ö§–T|(zßÝëPøm”jçæ¦ß ãÌe ԍÕp/“5ñ(h ~¼õâ0q³J!1zb¸T#¸*î8„zìxGþÃòß S/¯›ò]$K»F«?fÏ箪›€ È.зß$úŽŒގ‚§çñ^Øõƒ.½SÁ/¢1Þ¢31¤i& ‚*YJÙüå!jᏲÃÉýh²À†t>t¾økàpɌFyOWýáѳILF-¢’ør…2Jî„k€kWÆy]ɧ™‹Ñ?¢ê<3½œt+ÀÌ÷Ll‡¡œŸ™(r^ê%Q9,½„äf®khF$µ{AÛ¬`à[Ï¡d¤µ'W˜03âÈcA^ ½Xþ(䅲„†,³9 ¿%)¡Î¨}~åˆ`oÂçà†3:?ŠŒu¡(Å%žA¯›$KZ8ü0*Ž‚D²1€3©T&?ÂãÒf,5—µ'%\°2XÈí2?æÇüËòZf߇|¹ç}&G¬) ýðsQs™äيOº…6ñí¹ ÂaÙӚáS€¬Xõƒ&hOÖ6×8¶œÔ^Fց ¿rf`xJ‡€©²{O—2sîɺ’LWñX;i°8ÝeÍ,uõ #ä™&DH(F¿dÀΛõ(9h])nÀ£=Y†ËǙ}§è1±Sïu+þË8É +DòE¹ W a¥œ*ù6—Ób°<ëㆹ1;ÐUQÌc)¬Þ9=0WºöÌób³¼×ãˆ:?g¹0îð!*C¥Ë̆Ì1ÏÅ‚Df€®GHü“Ú<Y3æø‡ˆ‰Ñ]£„3[$‚i‰HC-‚ÞEs¿µÐ.8VoڐqíÌFŠ=ے·¯Œð8Þ«œ†3:EÍ¢™,Å;-ŒÐõ¨lÜOԎ:Jèøm ‰Fa@ûY\œAå¤è1áQ‰$«Ù_´¸ÕݲP~¼€p›Õ\3zZÝu™²æ¬ Ù†Û°«Z€®˜?„ò\ah±ÁÎPê®‰'©Ç¾rBÁýL‡×Ó QÃaÈ´Î.îÍs`á 7wUƒÑ¢Nä¶ ¾¹·“k;×½àÙ©ppZšŸø…e.ž—óö…SÙ§o‰jåZ³¬Ãºyð'ΘÝwÿ{˜©»33B×ÕÛIŠ®QÝÝBTYf”¾ƒœËà“¡ÌÄ3æ‚ɋ2Ó0àæêIá ä\Ô¹(â;´ø|Y’Fm'lè‰&N ֛ú§dR¨ µCS„i#5óžK'¤•¢µr¿`¤0ýI®Ú­ÓU%ŽU&² +½I—BZŒÎ3¹Bv ]÷øÖI¡ŒË„ÔÞÁ¶¬Ÿ¼ÔP‹)&P›_Þ¡žç·r9 ¢ùÅtôe +fL^°(V˽ïêÆ·ú#4MI´ÖI!lVéÁ²'X«;•ÛÑ46òf”,„ä죝…ââۗê„ÌÞЋ?Z¨ÝƉ±¢½b&ˆ§çP–’xœsü€…µïu,êÏ3÷¬ÑöéZ°ÜNÀèåݏ•¶ûë¦ì›ž›Þ¥Ý臤m@ ƒ®”Y®GvÔT©xÞ_ÂW)o1#{Z<¤÷љŽ@ݐnÖ¬â¡þ…x®gbâ±@î§Ñèv+¥ÛœY˜ù瞷ñ»b5 ;§äö2F‰rN?ÜfŽcèXQžæçÒìŦý›vCvLJ °yX¥Ê¾3Ãagf³€n¡ð‚e¼Q‡iàQƒa®okR‹.‰uB%θlj›„ŠCdDa`[ç aÄÌ`›²É¶ÔÂ;‡s ê +fP(…T"#;æ€Ô´å¿“ïÉÈ<©d”¬±M†ƒCó:©Æ„Ö€ºE¬$y·^¦#–ÜE÷ìŽ.ñ43çÍÊ~†“<ZJ×qÕ1_§’Î\´Ð‰„ÊFqáË=⨻¹ÛÚUž`à”(3f·•Û5t´$‹µþ>".7ÛÐ!;£`Û#½1>WR4‡c-1®S-‚@#aL—Wʄæ éٕɸóñ0VÀ +BåÀ²—"X[sl!eàR´é¡R‚¨x¨˜˜.U@u­L K3̌M8À–޷𛇗E½p!I!vü$‡|XÚ\xR¬_Œñ:/ÂÑw"›ƒ´…—˜e°*v„B4¶DCrŠ•(ZåٻÑfSTZ’dwK¨WÈáZÉ»añCRÿ×Lê> KÁ¹«·-ôšY;ÈLd&Äfî(4àíxq…R–`IN@&gqmŠ5lnZ­å¤p´8=@Ý*e9…° +;²5RIþT¡%~”;”H¾9”Š‡²®¹hÒъÞÁe°M¥ÍAJN&yzs0s*-Å׉Ÿà;ZJ8=‘@†eå)›À%ÌWR±[”j-*A©y).ÕӅB£—=(R‡õåh‰ ü:ÁXì=ÓS™Eâ-ú÷!ÇI9SsÅ,êìz m9÷”¤E{@¬+ÔÝ5;I!k¬0—Æ+ÉߞV¡[¤gE¤?®°•ª˜µãKí*÷æâŒëŸêZcÖ1hòɪYÁSۖN0£Îf)ña¶H-…¢¥ y¾‚Õ¸KšŸGª: +ï]Õ_™‡_ZÝj<«‡~Ìzžl%PshŠþ$Ÿc¤_…4“EÐS«ÒT»¯Ð +C”ÉOºÌ­Y…;:&QhEü-5•ÕwAAu©•{êXR­0™:ߪb}º+\i(¾}· éStàQt«Z–6*Õ=Ýåa!‡v1ÔKýb*³½ìþxK™?½O©'îÍÄäO"àc°8KUTý3weY0Ì\g2SÀßĆLzpzў\ÏñZ͍Èf†&Uóü)¬gç^HÑêTÊ€Öõò²k_ž]0!IR\¸ú ¬}I਺y÷LS\Š›,M<Ðs¹4÷Ïü>²;ú[ÆÉø°‡,v]o‰G°ÉT—Â*ýs3I˜aÊǯ‚zU“•Q]”1ã8뀢fØGߤû@Åqy^‡fN\Tyl4Ó½gÖ¾+ÆD=Mfkâdi×*瀯)YtõoÀ-’´?ê˜ôî·®¸æ7ÆNÓ{a¯o`E ú1Ì]EM#<½¦e6-µ¸ +EÝÃǦýb|²ØoS;qXj·°P×Íj±g™>ÃgϜõRF‰7“!VælÃbǦª…ùÚÎÁzÖ¼im‰ÆªÞwŸcGRÎTÅGKM‡‹IÌ$ _¬Ðq³Ï¾xš¤ú<¹–†-YN#µöï»^N«&‹®hyŠwiQråSR/ë¹ u•`s¶ÿŒŽëF¦UŠÉPúbOqU”ãª'YrÅTíð#m*™2À~>R.ÑY4FÇåvˆ´<~Èp×^Óڕ<2š)a59krÀb׏ޮãÜî ½Å4¤w¨ êaŒÆ8ŽÓ]¦¬‡â½$+¥ÙÊVeýPv‚õ8ÝÂøSêš:ɀ7$oÀ™†Ïñ(HÂìj’îÓE¸ÉŸéÿà +ˆyƒ°,҈|»“8‹,äŽWƒ ­gëJIE#I¹ëi†‚bh”HÒkø½Ÿªœ?•ä¸!‘7aÝoö—¢ÆRˆ(ϵU|hH6Pǽ*Ս(åQï¨ +C>‹G¿á¦\ÍcÂÃ%:ð%AÄ«vùbeùb·[ÐÁüèÅí~TT-ܒºJ£“ÆV Æ#2J OâÒnAü½€2”Èmf_zºÂÌès¤+ènq¸xÖR¨©tvÓ@ø9”4Ýßé¡Þñ¢]à,VȔãf§¼h¡N »2Œ»RZ–ˆ˜ ™ BŒùxCs|…¬ +O÷RJ +Sh7× ÿ^³ž]«–lÉ +ä¼XHÏɛ׍#K)ürÛ¸LDì™tn*ÝnKliYÃklfªw2ïÍ-pò ¥M™1Ýe®.:‡(I}¡×òÊàÛ/>XHÂå#Šsð¢«t”]‰Õâˆ\!û£`}ÈÌ&TçÔI`›4׬¹8XÃ'éáF;"ç¢jXIòÄ¡u=ÎCt/ÕùR™ÏŠŒì‘éŸBÈÐDAˆ-×®ÑJ(~CçÔfÀ™?ʌT2Í +¹ZTÁÔT–¡¬7 —ð°uÈƸ2D æjô{DpqU +Õ|VëWcó +²ÊhØÜL]o%ÖT®ýĽëéÃìŒ:D?ñêÞ7¸Ê6±øQ¦»£a3fçÖ¹v+cðu_«‡Ãeïâ&ºÐ꙲(\-ÕjÐÿWEª>÷N&ÈÂr©¬Á {٘ƒ±N¯ÚV€¡ü\Š’ ÔÊT'‚E¯AˆV0{³V¼kˆt`¦Cˆ4bÉ}v¸ ßx(ÔÒVÍ(5Ìž~!ÛÀéâÆnL5¯|1ø?÷¥z#¥šQÌ¥ ¬_46Œšn÷òٔ ò7•²Èâ‰à›Q(út1©èõï#®©|Ž0!ºF/*¼há g×NÌ]E‰Çb&Jä'Ð/ÝÐT¨VÓÔ¡Ô'u  Mvâ•w”‹Ró2̛×å@lñׁϫ™ôÐ'DLY…Ëß?jVpe­©« ‰Z HXÈ'bSFiZDL¸ú˜©Ã!ãÖu³ä¥ÀóXMÙœ›,êBÃä”긷&-. +~¢¬ÉCýçx¨ªëÂ%0D–H©8¼L¹ƒè%o‹{i™œ5f\b §¾˜"–n„Í<²b'+–Úٟ «¬e&­™CËö&%G¿kÎ֛¸Æ>zNƒ&nç.t¥Å½?8HPI„þ&Dq€‰\9¯ÙÅÌå ±ëñ5º­¯6¹É`ò½ë´Öž-ÀÄràÔ h˜ „"|V.Ó²z½4wï.KmR)ÎÝr~VÅhO?ÓèÜË +Ï[à(}¨5ðйò-­(\KµÊµYÔf—jy«µ˜¯w6­º»ÆÜSe¥0«„­ +ôRÏ¤Aí'š1Þ³U`ŽNŽ"O¯J0]Pµ…„Ÿ)>JÖ²ºb‹V§IŠkµùÅ׶§<QeŽ fÆîP€àt©Ìâ‡NÝ`SÞbîZ¼JúïèkƒVúIK‘§U×lx#AÖȕÝ¥èJk„ÈÇÀbL‹vELK• Íº§ärޗáèÜ°¸h2±Ø†ý°ë–æÍlnºª.!,EҊx²#¤™g¦xìaEsóêmxÉ:Á‡­=’ÚA"<6«tvHD²cϐ‚nwó42UÝ9ÚqÍ=é +ÀL±7-äo¢éÖ,°cõy{ӈ\x¹L+Y€ sÓWŒ!eZ|¥‰"–­s;|µ¸½,·¤O…­Ãâ!¥™];7Ä샕+ƒÄ㪚¡ªöqÕ´±ì¡ÝÞÆ=ݼƒE“ËPÙÄÉ­° «a6kÏo«1Ø«†:c`=··™«2”|w™¡d\‘꼪xš’…[ N“{'63ÆX¶Ç–Õã?9ŠÛž¾äJDð0N¼ªñW½]êCPƒÁilj0.Æ&$+;!n‹ð +áËeˁ“ÁåÇ4BœÝln7É$ܒ¿Î)›sß݊$䙪çl߅ÁG°xU—$Ãg ;µM¯îPé¾HÈYuŽKpÄ¥fâjúü{7kpɔÞa~|«Û59z\i{ϥі?!yŸû\P1Ç>.} š÷ecý)U}o.ØçoîäýÒüï†4Â‰“hŽèë hŽÀyžørö]TåÀ™ßùߠ™߯£f™ü̃eŽÊÔ~ˑÊ-äñþÄ*ÄàqT/s9pÇÁtæb/°ãÏ¿ÌØñY]~PÇëIM¹„?ÐqKԗcgŽ?ö äøc<ïDŽÃ¼Ê…EHÕÄŽG;ØàSI½ÞŽgB$¹üÚêäm°Æèg +ç`#Å×'P㐫]õ^C?f,Ð8ÒV¬ô ÐxqjrÆQúXcº0ãȈ”Rú×(ðGõKÀñ†ûbâÑXïbÄ8SÑUŸeË,b dŒca¨WÅ|qd3Ue¼8\;ʺx®«NJ S<ÕM¶øÏqEl­J‡g@‰üAGPWš–ÿ +° Ë‚+G€Cè'D&)HNØ +3¨Ùåslq)ȃ)Ž¾ÇïqÁ p6s¼ž7 8²/|}ÂÊò¬¡<&aoÑpø¤‰#ߣô²aâE¾ÒD‰#HËA¬œ¯a`ÃqV;X>r1|QÄãÓ&D†¨îeî +v„8ԏ9Ýbàr9•@|v~x‚N|øñΠ‡?H'<ü‰®dÁž¼NÂ6|çj2Á,ÜfA q¡‡cE©”‘¹á¤/=„… ÇY=yAÃÁà`ý~0ßâœÙ ‡Uߦ‰á0$S.bÅؤ|Ñ pÉfˆóRŠ‘ÿÁ +ÂIP‰Žt±Æv“ÂK0^RÐçwNx µN`‘‹»]̑ø€„C@^p0‹¥ê~<þ „ß!~ B8ZÔªnӀpö¬µbñÁóp«ÂÀƒg5kœppìvë0«rﻦs“ÁPª¬*3ü±òÎL Gó²fqiÀ¾«ÚxŸPð¤5/®S³è^]ãMq¯Š ÎÞ³ˆà5 +Å¿œ5œÎ9à!úþ7—? þ?©¾8fûlUûds3“c”`@3Q»ùÛáÀ þ®ª©_Üïi8°ßÓÔïáPG°¼‹LmtšáaÍÍìOOâ÷2lÀïi Þwž•¯ûŽ×ò }Šʧ€}c­E=\°¾/F= õ^òYCb1±¾År(y±¾/Ö ßýõ}‰IqŠaßß!ëgö´iß 9h>hßpSªÛjH²V£·g+ ~ ¾±bgŠ$H߃>®dRø†X¸?½q¾QntÔ; áNցF=½x-æ”Rˆù¾ç±ÅÍ6ÕMB€ƒò}9*Ÿ†ܯd­¥ +*¤¤?ßÙ´†Iø¾³J3&àƒ™ÔO;ߢ‚[ï}g§Çƒî œºÄž;Ü;G#Â`{g·Šžho¢ÍêJâh¨Y°7Ä5´Ô?ŽXoø’ÒHâù®ëe $‘»µ:¡ÞÓå?Ðk°¾:˜Þ¼OöÚVQù0w[DïÛ5Xè-¸Ä8€ÞwÄƒç •‹Çç °„fÕxÖßӂyßÃG°¼§(oGyCEÇ,HÞ( a5P ºÁdâå$o®OîÍZƒµ Øi8HÞËj’÷3§÷G|¹ê˜\³µs¼Õo©¥ò¦ÂMæƒäMy# ’7>^Æ&É +›$o (í2Æo +¨X'¾S¼Ù9>+… \Þo„9ž’NŒ7Âr÷³ Þ+¬Ô*½y¢;Â{˜h6 ÞÃjú ðÆqÞéÝ£ÇÓ5¼›Á<™ƒßëà„tò»QA}‚F +à’éÝ$ߪdšðnD] úx79Ýašîw ¢wr7¼+¢M2p·¯5©Ý؋ïííF@Šƒ`v3âÈZæ`v³7›¿IÐðIìf„OòA»Õ¥KÃ#òâVÝ- ±›«*µ! ("ÑË·{°lÕ²[æ«·6t1¯Ý0ˆ~ »Ù܆ø€@vkÝ`ˆ·ÖÒwô;9ÝêþHX‹‘ÝŒ‡éÙÍeN¶²›ÚsaiÌì¦>]߈™Ý´ècؙÝ4g~l‚Ld7”•‘²[’ÿ¤RZ»²¾Ù--ÿå¬ÙM÷‘a‚€vã¾=¢~Ú­°ˆ b7‚#·Ýæ@OíV¨ä1édB»ÓìGcf÷ ´Lf7ƒ3L|Ìn\ªœ¹`vÓW¤2¼˜|YÀ{0»±€(<¹h„•“Êa‰ì&êŽ/ҁìVdyԅìÆGÄÏDv§ç :ΆìfсÔáÁ°!$§â@vÓõW‘ٝ¦Š!Ý´05È†mE‘™ßùìF&r +®”§)DåQá ‚¹Èžé²›f683²?AÕÚDvÉïDvÃL8ÏDvӢ중ݲ0é¶#»ñ£¤tNd7R¤o±)Eõ.܁Ý̈’tÀîá\ÚdqcdMÄÁìnwä‡mFK÷ÇÄîZ¢HivÃz9òÅÙÒN×]˲¯%Au¾gºkŒM±Y5èêDuWwJŸ¤nðê.G×CvÎC¨›¤ë>–µ· ™™Ó= §{YÍéî9Z†¿ 6–öî˜îö8 ?73g~Bº§á`t/«Ý-š¢ _w@7iå÷èF”[qæsàidÇsc?Îûçî!3 +:w¿üöpî Ô‚Í ŽÚEÍ à ‡©ƒÌMsQw‘†¤Ëá´Ò’ñ•;–FR.ƒÊ Cq™]WĔƒÛ½˜ÜíZÊ?¦I›»]M$7 ÔDn ïX@n„YÉ" w‹yãqYWM»et«Få qƒÑʒ‡ÆM«!æT `?aXâ~Y;HÜ5Öq#ô«ÞmæILùá¦6•mþLáF^qC¸›»'ƒ›MÂÇXîµÐAàÆ ±äèpó´0n·šBà·a w¿Ó·8áÛ,«,m±·÷ã,ôöìâäíy¬àlÏâo7ëÕ&w»¹UĤi£¨‚£üAÝîÕUs³ÁÕâDnCŽH­ÇNÜ]t,à6 œc¸ÝCìrð¶aåp¼mÔu0ƒ¸mPÅU·Ó¶QEÃ@À¶±ôfúͬíù÷Ú^V“¶AÇ©nµÈ +¶Ѧƒ³=?˜m,MÝÑ;ºSÁŸÇff­„"®G¹ÐáRzUSwÌ6¬µf +[&f›Ûðfs­ÂâÙfKMÊ6–Gjû¾C¶_©Ê—€lóÄx—²MB$öªžÓÉkÈ6)ìKm>ÐîÝ ²ÍÇÊÚlC¶ù~p È6-Š‘îm6 «P€ýê.01dû£÷ôyzVLÈ6# –mš•}5d[‘ÉÜR›G• ïm†Ä¨n +È6³Ðmà0ùÂŒmÜ×q›±½–ÉÁØÖ·î†[ 8G?é`lÓÂ+xf„´*r{2¶SÐm&c‰‚±ÍÛ®MbW*‘] ¶ñ +‹ˆmx….õÞÛËžÊ +¼¯!+##E•ÓØÞÌFl³É33Ø†E*·±MbãØNäŸ'•Îª=ÄÂxÄ6^a+GŒØ¦ÄP‰ØÆsèî@l£\ô´`l£nMœ{—¤³{Þ§“¯ œRQÆkà çtm¼.òäwº6ƒHÎ¯Í ’:¡{ ¡…k֝®-+IÆkóXOÀ´Uœ=¼xmÆEÙ¡$øÚxîŒ9N¾öèÁAßÛ¨'Šr]&sz02¯Íú¢$Œö¢k£ÍOÙØÚ‚2’lmtíèJk¬èc‹‚Á k³|±hEËÞl˾sµ±>rÆA +W¼œ¥Z ÀB:T»¹ÅØdj7¯M¤6€lŒmDm4â¸@mê?.SàzV;Ož6°hŒÑO»ÞÂ0N› 5¥«L›­(H2KÇÙ@Ú5µG»¯5 Ñ©Ytþ˜AQ\†òg;EJ +Æ¢¤!?«`h—îm2憴ˆŒmÀÀa9Ú¥)ªr´¡÷Ri°çÐö³þ;ðÙ%ô=%‚Yž ‘]÷yÒõÙ¹¼³Q¢,Ѕ¹Ù¸AÍÆŠ…¶3V¹b+è{ 9–è/;0ûq Êäe?îÁ¼íFÜæ ˞ —‚•]+¨lè_8‰¤l\.@ÙO´WN6jÌÔêjÇd?¨LösZP²qF·ñ˜+7©†Á‘`dczj†fÓ'z\ˆw"²áô+œàNox²¡Ë¢¢zçc£ÞZ!ÇQÇíMÇÕé읎 #ÃLÇÑÓ<ØØÁÌ<ÑؐIÆÎCL06 ñs ŒÍDËeÕCg‘ +™\l¨Ó"Xµ°Ø½E; c±G`NƒŠ="¿C±‘êÑKTg2 ¹OEˆµ¹x¢ûw@±ifà# Ø‰lâ4>M(6sô¹*6ÌÊ+›®ä×Aš 6·é.X¥•ëˆÆbâüV`±SŠ*ü‹­uÓ( ‹Í8]¢Àb‹a´ûÖWþ¢šÇ‹ÍijšÇE'°®æ +~c.6\68<°ØCÅàŠ ր:њ‰=¬ ;‘ØÃø$bà X ØÃ蜇Íêá».ö¦uP®½dô aŠArõÜNvu ö–ÉÛyØ\W¨ƒˆyØ\Õµºp،ªV×u.¦5c«Ôw›gwߋ†Mÿü÷WöTÎ2hØ´ˆÚ¢¶%»ìfÇa³E¥gÆaóÒõÆaOˁÃƞ†<‡•à‰Ã† VT²³ã°a¾ÕFµ…ˆÒԉæ×ÎGuà°éԑ]8l€.Tù'6·à£;pØ<¹û^4ìt¹RrÒ°YÃQy§aÓªÀ4lZª`°XñJ ++ž4lº¤Ùu ·–"®\š4lXT™qà°¹˜¾Í=Ñ8ÁÒÀ,ͲNƒ +e›ËëõîŠrÜ9‚‡­”3þéàa3“̽ÐRë+!Ä&”ŽãÑÄ&(H’j± ¥S‹±•¢)Rr. 6Å/üw±i¸¿®ê÷˽ó°‘Kõsˆ˜EŠ2Ôàacݶƒ‡MÈeô®PnIWEêG€°†£;›3êHç†Oð1ƒˆµ§Þ¤ƒˆÍ°¶pÀ&bÃ5•kHlD#h;Ø"Hõ¼ØÔ1꫌éJš$¶´¡õ^HlaÅ›;ªâlb36xtB‹ŸäµR±¹UFgá°%÷Âaóì™x +6bc*ý8pØ0û'‹WOOÇM‹À;f#J„ÃævºÆaóà±v6×Fä®O^¢Hó°—ábof±ñ +Úèša¨Ð¹oؚ;\¹aŽ1>ˆØ›e'b/s±¹*”¨ÀDìùîžLl¦ÇdžÄ&8€‡@b3©™]Ž¸ôŸ4ó] (6³š|›Åfb’Q‰Š-Q~ ŠÍÒ¥ŠÍm¸v>¨ØR\·º¨Ø«/YP±ëýy£b§ªž¦b3Å AÅæ×⃽k‘â𓊠oá¤b3fÆN›'¶W ,6-šè„ŦA¢ˆ‹ÍÇ Ng#ð}O4¾6qºXlâĊ;2ªü©b–Òƒ ¾º‹M- +5TÁņ³éææb3C´ËÁņ™ øÉŦ…+¸Ø´¨ýâÎÅæ)( +.6Ã1*Hq­®m:¹Øô…™6.6Ù|ì\lf0ÔPsçb/sp±9²`p±yãØáàbÃìÎ;N@Á"­Wp±¹ 5\›f>³àb uØÒcSYß°ØÔy²=°ØÐq¬™\l憲;µ,.6cäd›UÍcÇ]Ãëhjƒ¸s±‡q$Ó:›+*u(ö²šû…þGѵœïä‡ÕÀaÝÁû~=ŸN$öÍ»œ>M"66)Zˆ]=<ìêðËÄaW‡¦' »Û×8aØÝÑÇ ´v‘ÿBa÷xvWo…m7á‹'»»¸æÄ`÷HƒÍ÷åÉAÁ†ÚEù‘‚Lâ Á†c]p¥³Å|FA7MÀF +êê‹ÍdÖ¸ßð×¹F2Ïôk†»äjx¬ê;p¯‰Ç*Hìkô:¡BmžãˆµôŽ¾F½¾ _‹j’¯ïh~€¯!ÿB@:°×T?—{Q¯ª'òú~Âï4ñúŽNμfŠëêo¼ë;.»Fƒ×»¾?9h×0ÒE ØõÊŀ]#-ƾÞëµ@#/Ò5ÒZøUBÅ ;ëœë2LVÌ5ƒ‡ã^”ëÊÔrÔQ q É ézA¸®Öž€ëêEÁä[c?âo3þwЭŸÓû'º±Ûúñv¢­Ñî0²Œ:AsÓZðnÒžóÁµÆBMÉJa­ch¨u3jædZcíèø=Ý(®%‹²ô•±ßÒhPÎ,ø`Mq±61p֐ jÊÜiÖ¸âêþ®L˜RPó(‚Ï@¥"Ì~í,kÐM’5E N01 [99Ö5º¾Æzr‚b]Px@¬Ù%çÖ„ ÓUØí‰ópÁ°†•“b¬TfÂ3֏ùB¿šÄþŒ¯~‚ ôê'¤¸¼Vä»TÆÿ]_K“e×÷£ÐQ€«áӑºÜjfÔǧ“Zä #­3ˆŸ]0«o˅Ndõ=9šXºN ¬¾#Eu«'ò)xÕ0hbtrFJ\õý‚V ºGƒ€UOXûÁªF…ê0]’t[ŠnRu®þ|Puapªs((S 磶7Hu¶'2!Õ00ˆ+FuŽ¾©¢úå hq: Õ%Þ/ªŽ`ï|ê‡ã䆧f!H•ú—Ë+JJºE½3M÷ ôï*«ÜÃ)‰Ç¦FЊLäM=˜—MŸ&™º¸ÚS7w°:¹Ô K÷I&/œmó ÆI±Ð7˜Ñ㖠ùdFCY&2zDeP£÷-`tLq𢻓dÃÃI‹†’—0ƒ z©ÀÁ€nѧò`EC¨@RhX‘X(šû6Þ8ÑÈc1¾iL4þfŔ)ÑíŠbóüXTœ‹Syˆh¤ÚX€}¢«Ãë“]£ì.ÑÓp0¢—Րèj–Ô$c…̨ӁˆF·õQö`…B¯crT,.\<Ñàu=¾™LÊaá”ëâCcE¥Æ…;Ë2øqÕ›ê­\`V,{8áЏU$“ ª“š MISù ]­öšdh.ó\üÇzpBfµ_rúq)-.t,'š‹çÚÞ°ÐXh“÷¼ä€" +]¬4=™ÐàvŹ󃉬ÜDB¿»FŸ¿¹óõ¿/úk¤çŸ=~ùôÿùO¿ÛÃýæ·ü¿¿üÿþúý̗ß|ÿËÿ÷‡ÿî_x®Oÿø/~øË¿þÊnÿׯüåŸÿðÛïøéwÛ‰á¯×öçvûW¿~ýÒ¿ýõ¯~÷Wñ?w^þÛþÿ_ÿðû×iýõßü<{;›×ùÿú‡¿ÙOæg7ÿòÃúÝ/_wöÿþío~úÝÜú_ýæ¿~Ø8*Oþ§×ùÏ~øõþ«ßým/ô/~óû¿ùÙ'û§¯¿þÉ?¿ù§?ýÊ»ÓðÀðË?ûÍOþzû~÷z¿ûÎöúÃ~óö/¿ø“?û¯ü·®û§¿ýoóWóXÿèÏ~øý'ÿõ)ý¿¸>ý“_üÉõéßýþòßð;öûúôÿ¼þ뿼l¿ÿT>ý‹Oÿá?^Ÿ~õÚãßýÅ/þä»60ôã~\]n{û…¦Ë…‰?oíôå8Ö믟ðÃÿòõ?¯‘‡™¸ mB³þ«]”)4xé3½–—¯5þã5€WZ!DŽKŽ ÅÉ u¶$ó¤ÝcìeDÆkÕp±hx8Òv ¥íõÇaéF½†·ã¨#`GñÜ8)üuvÏsØìë„×a·Kûx^GøO¸É ýÓ´{­ûáÙ±‰¦gÂá_îPGÕÈkÁ}?7AXþnoº>ý‹_Äãl@K +–|!iºžÝ£kÚ^FÊúï7£%º¾Í^„æ8 oìõ:œç`ã÷ëU;Îí¯yÝñOõå† øYH£8þ½Û}&¬^å՚ތÌ»Ù‘ÇËõÓyXÒ9îOç9ØøýϜÛ<íx£ÿÐ]zÉFÚu†r^KýqÙv•‚—ùa«]Ôò¶^ðRßD¬ÃnwlÃy{ñ#pÊύáÔæ·xßñ²oïÃ<ìþæ|¸ßì~ÔÔó}dËâïöï4ð tvŒl›ñÙ6ûٶî‘m;‡cdÏ +qnÜ y?ì2žç°ìÛ ¯Ãn—öá>|£(æ™r¥·óÌu¿SJá'³ýâf܇ï?º+$âµçƒ»öÃ!;§½ù0™u–탻‚‡Ó êj>uº +6¾»+ûÆËY‡]Æó6û:áuØíÒ>އo2™®9ú¼½Ë©ØÎa¹ÛÙnÆãÒ6f݇ÍZwlóŽÛ»9ÛÆËý؞Ú4¾=âeßއyØýÍùp¾Õdº¦éó/¿b;ål'¼«Ûܘu+6/hÝ´ÍU8îðæWl/d{pÓøö”—}{%æa÷—çÃ}ø&/ðú.ð-µûãøö㓿Ý/÷4^S~Žhïuµs|È֐Ÿß¦ïãþñúä×a—ñ<‡Í¾Nxv»´÷áÛ/gÎ;¼¾åí4ÖW¿ðf<®n:Ö­ØFžuÓ¶Ïó¸ÃÛ·¼m¼¾úíÁMãÛS^ö하‡Ý_ž÷á/gÎÛ»>äíÖ'¿íf<.m7Ö}؆uǶoó¸½Û‡¼m¼>ùí©MãÛ#^öí}˜‡Ýߜ÷aù¨=ÉÛ + Ã—€ðêŠÃë،‡‹²Ù—?³vy>Û9nÒÇs[‘–+(ú~[Añ$´öXÞöf<\ó;üøí°Ëã¿?.žŽ_Öyþk‡zÿô§_Þ¿Uøþ`ßÀ÷(ðëŋ÷sÖØýËÇ#±àÿõ0åÍö€œn±Þ~½Xk¦É +2ÚîÉHR/ãÓófÄ(\žm¦‘‚V>‡e(¡çOÇ9„qÍ4£µ·­‚?»Œç9löuÂë°Û¥}¼ßr¦Áïw8Erœ†€ÞÏy›ñ¸ºeßnÅ:ìvÓÖ9œwXîM~Û8K¥w>¸i|{Ê˾½ó°ûËóá>|«™†….ï·÷riÒq¼Êûíތǥ-ûvÖa·;¶Îá¼½‰}ÄëÛÆfTOmßñ²oïÃ<ìþæ|¸ß2p͋Ù{l!È,—ý; ͹•öïöfıÚ8³½¨Äæ<ì-èy÷¤§yØXr߸I |vÏsXöí„×a·KûpŽÇ#ú¸EœŸ·ãpª­éüÅÍxœÞf_ײv]õvÇ-‚ÃÐûxÛؕuça—ñ<‡eßNxv»´÷áÛ¬çç{²VBËd7áxu¡8[ß_}ãù6ì‡]ÆçÛû2Mßh=¬µžX¦uÀõü¶Ÿ^÷î<Ïu£÷ç#Ù»ŒÏ‡×gžç·âß„°wŠ2ʛÑWý~[㝇=c >‡1P=Õ·¨à~Øe<ÏaÙ·^‡Ý.íÃ}øʀpÞ¢õä·ã¬‡´ýâf܇o2 ÐS¾?Þ^¤“ Ûωg¼çÇÙnÆãÒ6ûºÛaÏäºÏáCrý<·#¹ÞêÌ+ÌiÇOy·ûLjÎQw3Côf_ãùvØ5òoçpLÏí[ ˵gñ}‰öcÕ@'ÒéŠe´ù¾Ä×;ƒÝ^¹Ø?>Ý{ߗûÆkÕ°»Œç9löuÂë°Û¥}¼ß,Ø-¿ú¼½k!°ÃZ2lg»KÛÖë>l˖uÇ6ßþ¸½ÛB`Ûx-¶§6oxÙ·÷avs>܇oì¶k}ÞáµØNc­¶ތÇÕmKu+¶•Ëºi›{Üám-°m¼V ۃ›Æ·§¼ìÛ+1»¿<îÃ7 v×ÿõ–ê‡ñ!ìÇ'ÏÐ[~§{ú‡ñWú}Ž ÿ½}™4½ kÃõ±¯.ãùë›}ê:èvQïÀ·>œ÷v}ÅÛi¬ï};áÍx\Ý6h¬[±9q˶Ïr»·Û<7\_úö°¦ñíÉ.ûö̃î/̇;ðÃç]ïvë3ßÎv3—¶ë>lCMܯíkÜnìöáÎ ×¾=©i|{¬Ë¾½ó ûÛòá|ÿ÷Œ½þëŸ~úËøÕ§öwý»…^ËŞÆ%Ò]™îïîÑXè²Û¿¼ÙÑUXÛ/oÇù9ûvœŸ|žßFœ{œ,cl\íh_¿(ãj¹ŒÏ5ê>ÇêU¼q¹ûÇÛ¿øEëËúú©Êƒ ïÚãdÐñ9eÙ;v–±Þ(oàï¾^7Ÿûòɔ~ϓaÝ­4Õ×'f#ªÁt¨Ø’1µËçðb¶#\¨´Ó9ô+®} ×¥ns2ú ©ì·cà÷½Ë·7}Uód›^Kßø+åm֚èÞàÙú¤Ú4–§ÆeùÆ_X*ÜÛ=@/o_A™÷|)a݃·çð9Q…2[Ø\͏ ²×ý¶½úY“LNƒû×i9:´íãz­5ü{(ºóûéþ¾6b‰Ì/iŒ¾Œè¨Mcíq;`omnìM &k”¡Î¯Á:94‡å³~¢¶rÇÉ¡²ÎV´³²é~R_ߋoÚCüJS»픽ê&EeœŒ¨|ýêümžÔSº/2%7²×;žU.ÕO¦ø®ö?ð¸û-Üz{_/ÛÙÎÑ냪"çÈÁnÏ0²ß€·$÷ëó<¾ÙÁF‰ÃöØEK6öøÖ÷1öxÀÂã[¦~õ*Ö]EqTŠ·ÚÒ§ýzjØӈ»ŠÏ¹úQŽ¤FÏÒØkoa|’߶øøü3¿¸ÆKíÅûórÔjÜ펬uªëU1§êG‰!ÎÆòÄ£ë^uK{ãöx㫏){ÔáŠ7¹òy„x¸—ž}lŸÆÀ£ùêUì¯ÓëD»rº½N,’”uÀ_¦½L{ñ>Ä cŒÜŽ¼1Kã}>„Éý8íw¶ 0¢xÕOMWÔٰď ›x”»½£â>Ž‹Ï:ìy>=Rå…FG—Ã:¶ Œ …1Þù×hÁßÝxn*ÚÞy&s d!Ï=þ´yOÀÏ<½¹qžãm_ƔcÄöÐêŸÃ¨é#ßwœC‰¯£ÃøêU¬ D­«m¿øã´_kŽ{Ýëˆ …K [܊q÷yU½\mÏ56ÎӇÕ+ ŠÜlÓíÿê©}™S +:æ]öwèüöt%¯eègÚxßþÖەK5´ Ï\š¯*ì9<)–èÈX<{ûÖò§¯žÃéTÆ/ÒgŸãכËU´1·Ýûû¹Äö;´Ä½ØhßGÏr*[\8û|‡±Ú©Ä ñé«W±t^5Q‡d牢k¾/a·Ë{Ÿ¯j½"ìÀƒ|õÈóGï<4_QÏ=^Uçª¸c¡úeÚ¯Ò¶äƒøø0^õÓW¼®ôí+W +ÊZõêX+7§Ã>¨’¤1ÁI’ñÚ_ïÔ¿?#?q„×g—ùÙå+^b*>ÿ̹íq›~½çlóöÚk¶ùø-üû?°ñqäÃEë8ü3ª¢ ö~~ {~4·ÂÞùå“?/ÌãÉËx×6âsmá!ñ¡8îóëK«`èž>9›}\1Bå+…ƒa?Ç M×å)11H$cò×Õ<õìúÚ5Ãæ-óúùØ9]û¹†½ Èo“–Šô*^_@·1@IxH!i½YfüÍÆl]%ÆíK+TûÚ»#¦¡½ñ} {íq¾œD}ˆZý¿fۏÆçÉyÙ+#ÆÿFœ×]o_.=.SŠ+ËÏÚÿu›âÁÄä“‘Ó Zý ¥íõb¸d;ƒ1—ñµ¬k+óã¡'å;Öï9Œ0¾ÖLcÛr9_±þIM#.£Ä;ڇ/"œ7bæ¡}{G/_"¹=¦Vß´„Ša—˜%=ÊJÜöä%RA$kø¼î®ÛSàå¦øvî4Ö^ë¦9‘?Õ¿¾õxM6€9¯éçS¸÷yáåiĔн çöO‰{c1˜©Ol|ەX/^qÇ£4óžƒH)śÖ'AOÆ¿ôÌ-«p¶>nҝÄë©Û[ØÁ)b=¥‡ñõ•¥Í8p]ó½..® `Î⃄Gò5W/~WKÝ®âzÂG®Û7P³&Rô «q+)ô–ë%qèöçu·Z‹^ošÝÍG¡‰¸”ùiÂO˜¯/Z÷6ýºÞãÚfö¡¾¬ð f*6®Ok´¾¹´ùiōø¹Ã^ó.´Ú·#”ö§ÞÞxå ¸(ñ–£ÆdußuaE +c™[æª o8d0bæ›scZ_†gJŸðë¾ ûb°f:OÆüÄ­Hqdä)Ò L¦ùÅ 7°f¡{~1WDìx՚²Ì-qz·—/„‘G†£çÒ|dÐ|k|ò9_Æ&잇òõðÉKž÷í)6®Nb$ó¦/—ø8H^ëþIóÍ.ì¹ÃŽ¢+óÇ·¦qÏk µŽ¾ÆК—óÙҜ¥1#Nû3]ÍQRٜ՟qbK)‚(lüO°eEÎÔ5&ÞC$e?ÇR›OvhÔDÔ9[*4hã“ÇÕâ ¿ÙZ7Þ:DF¿„}²Zaó Žò•»ãç^ó‡:eèñ‘¼æ‘ûÏ!@A-nóÌëÌòW°ÿ̞Gã +6~b9ß{%¯•áœÀ“' žG¨#6¾®>½JMU7{gÄaQ„ã# Z|×ÒË»ˆ»ï«úUNqnÉD3Ç!e¼Tð÷}^jþbjW#\sˆ}îÑãs‰ûú˜UЌö‰§#°ò%ìõŽw"Ftà{ŸxrN|„é…–zµuäpI¼@•ñ¹Ÿ9Õø…¸">ÀQoúólQ;' yç¹Ýs~‹á[MZ"Òë£ú¬Ä}C„v9?qä!§"#‘¼Úä "cLñ‡»û­Õëç†>éöÞáFiÌ9¸5/y®GO$‡Ÿ€qeú °æH µª‰ÿù5s€„]¡ÃÍ}¼–½Ì yízHªîªç‹ØåZ«ôé~C.™æäf_Hòé“W8…2ÞW¼¥Íø5Ž0×01õ£¥ÙÜø5ÄVº«9&¡-B‹ÕsC'3¡ÏïVC]Fç•x¥ê=—!¹({èÏ@Ã<¨æsäfØƹRG¢báéñ–p­&cI}~Hóån»ÿ3PÚ¼iÏ\Š@9ZÅÎ>ÐzÇfžÓ°“O\E¯sV}͙xƒ¿„ýÎW¬ÓœmrLÔþ•fãì+ÐA.ygóÌ듙O͍"\à +zO:Úäa÷;EËáëÎþålÇk9Ë-›{ð¬ìñ£)‘Ó'¬Âajà<;LS_žæ͌ùÆü:BHåHpäˆLëëˆ3H}…Sz‘q)-3ȊFó9FýZµX,©Hz‡(걫_4Ç%ö +÷˜q{ª…Ž¨ÇÇžRJjcç6×薞㯞}â|~É<UZ9&½×ëÉÌ/¾;¡cûԘDØá[€btMˆ]­XUŸÞó…¦1Îåì(áçcÞoþ=_òký<Ã6Ç=S°ñt!GOq„üÄØ͗láºcäÍY ô‚Zã[+a¬ Û¯Ôù–k‰±ÛI¨ÅçÆCÓ{]1_cᚺ¡ø½½ãç.{yì{‡} -ñQ×9Ù\èE3ú>a,¯bÞ¥¶â»ÿI(ä·{NN/8‰qóÒÐÛ2Ö}uÅd®5 gIº¾SÔ¶×9éŽÈ%²ó}Þ´+Çfœä©eËÄî¹(¹vת£I©ŒŒ§Û“ØÍîjŒ"O³›A{sbº%C‡²vMßc„qÉÏz©‘%`ÇÛxpšPhL {Œ”ªm É —4óÍø²æ±ßÕ×RgHÄ¢"|Y±a€v;ÂZvø„›D¬Ë£µqƬø€Ö¦ź•™\*¶sŒ×œ/ìf£o;ñ¤íÜòü<#å2궖¸þ{ï¶äƑ$ˆÎs›é`vLǤ9]`Æ-/-ë²(²5]¹$[­ÙÙ¶2*‹…! +¨Å…õ3ó2ß°Oó¦ÚÇ9áá‘@È/³/,Àéááá÷йس¬bK`|ZKµ¼•œ÷¦ Žìl ®¥`ážVš{]Áîjê0r$m§ª ¾á¡e…‰úÔ2ž£B SZi.D¯0ädEQ0a &6´¥7f‹Ú+Ú £f­Å÷G‚SI–I¥|d”ò'\ƒbÀ|¼΅ “‚ÆÙqà’MÆ}€;+ێ}l\¾ÊqÚ;bL¹¤ä`K¬ñΦvÚ/±kA‘kÝÇâ7c@£¨Ÿ8%h­BÝv¢qZž°±NÌx‹<%  p’ó¨!<ˆ”C´å<ÈG˜,Åð`¾’&j]pD©ñ´“<ÈÄ)G¾¥¢Ð-±N +‰` ÞÀ#¨qJ@›–F> Ïbø:ÐòŒŸ©1ɯ‰“ePyó—};o‘s-ÉÃëðn`7d P²æ |ˆ´dSd7°µEl&‘¡Lâ€ŠMlùpð”ÅùLR‰b iJ+0CZ>Ïî#;Rá]˜±ÇC¨H‰‰¦<p¯‹9ªÛû—yY/qÆ×ÒGBHwpfWB¸±0X-;Óà2„à òw8xw-sx-уX¨Ùã#LFçgžS´ò$#—;ë¹#v,?‡ËyYò"iáÁ\¨}`ož¹òç~\nÖs{>ОJ˜+æ)Å©@Ӕ¹´öAR)Fô Hñ!§¥' (ÞÄPtg¼BPcËBµoŽú‘¥Q Æ{ †b@R2'"PjҒ$ÅÜ6Î +ÁËn2as$’‘£y5L‰YÂÝ̘1˜ €`4$^«ÉC,%`6ÔX3[•iF@Â-:[<yåÐÇ÷❩J>ÍxhÐGZ!ÊGšåޗèé踴d·1ûyâ¤"×ÛBS˜(À9ß/ÇÄEoúµËqº…¦mVd: +ÉÍ}%X +Ýy"}1h^ڈs+õ,÷c ±øؘ¨ I@ÍÒ²¬`ЬI D扻4Å3!Æ  +2öaT;cH G©HÁeí3 +ÖÅmo¥äð™ÂÕÓvô+dΞ)âô.î +&#ÙϲUéÊóŸÕÀ˜ƒ«UpÂFˁ9qüqùÎ0tÇq‚ñǹ¦pvŒañrv¬Cš‡*œ¶êN$È ¢-ʈ€!¥ %ùu…"IUjMqØkU¸RC–’ì'óŒW†×øòÜ2ÀÃöPZGp:cÁ!í3h¬Ü|½Â÷gFžRîGê*»øÆipsùø{¸ã‡ºM ôvdØÁ!T*‹|2ªà>ˆ4gÎîÃI3×w d|’eP,A°ëÐSWêLNJX¹÷̃+ψr˜i쐥`š]ºT€p¡97 w<g’¹xÊ@vœ(Ÿ›áàÁ¥ƒÇ + ÈÚd È|.Ü?Åç®ä8òLG¶~¡œÂ÷ 埊v¡ :ËýыÄÁ0P>紟”ÂÖ +UЂ‡³è_¹1‹]Â+A™r· ùɝRÚ«mÛjÈo¡X8J%7ffBø^šÇŒÇi!’O#ÉÉŠ¢o /e20wÃD&SijKC¹&9çZ9[Ɩ”à˜w®}cŠÿÁ %´voÒçyÔ»¬Yâç|—à‘Tړò"‰yé(…Kº›eýYP¾W8ºHLÍDäÊ۝<0³+¢¬<´%úQHN æôÛx ¾meô¨o9Y’ï0_„4 Lƒž‰€!ñ¶p“k>Nðæ:ß7UÔO³_;’Ö)ÑÚ¡ã c$9[DIæå†56XÚ ¥9ω–[ ËÀ/᜘%º‡x½EJ‘ +ByZdWš åû Ó82•\f‰»¾É%‰¤ Ôf²øݬi&sî#)*x ú%åAKNxÄQ2ó‘)9ўô~kNÀ´àì¿(fV;÷ŽƒƒŽëûfØ.8גkL!X‰KPs-ɶ™8§æ)a@§*‘0fòðc¶Žà!¥„’ÊŒ kö$òñ¿VNÏè*dge`±!Fj|JOf8è+q®z´%àM|á8HirÎRʍ ñg©3b9º…´"¸PÒûéTâµLñRœº¬ÓCFôÁ+üüiË9$,°_‰øZ‡øh–^և›d½®àÜe4aÞ‰žÄš ÊÔ7²}¡ˆBCKDH۔r&iýhÊYÎ9Ž#qaÉ^äË){ÉÄrÎpõ褻4¡Æèbó¢oJ»ÍYA$aú@V9ȓ„™Õ,l”eg Az„ɈÛ ü©¦+¼Tﳂn¸ŒlP BL«CrIÈL|°œÓP4­¡éi “½^Q¢„% }<#λGãìGôµ‘¥¤,8J Y¶ž ^ó†ô½Àò2?§¹¬ðaœä“å:£Æ±]£3Jº ÙÔ¨æƒ ½ƒ„Æo2LéPI©²’ÑÆ}àtJÌ;#¸Jˆ—b1afŽқoÉ\Bç1fŪ¨ôâh.)§ ÷M{M¹V&` $ä…ZÉˏŽ9l’wž° —í4Ë$åÖ¦5z¸ U+ñùc¡1¢uç¥æŒVäa–ƒ½7ñQxظ©³Á„ás)Ž1HÅ;×ýb¼mŒ€¼  ö`I5ïPo¸QäÅ4sCҐ“.L„!+ˆK$^ûSŽÌ3Ú¶’€RÑò“‘¥LÃÜò™Ë +#À Jä¦ÔD@’d¼¹”!  –‘™‰Dפ¯jš­·‰ ͸3Y®Y ÷ï5Nz©RÏ°# qa–l6£àªÄY?Ø *ÈL±M0Ò¥"[ ù1ý)ï1g@øŒáøšé@Çnx "qUWØ% o0Ž¡´€ÝZ™fY¬ !É­ðJ±æ9%$Þ —±¿1 >O×6 '€_2©w˜•¬É + "d’†Ý;uÆ'ß ²úú(À@û)RÛò ¤‚58ãÔPl¼FÒÉI[*ôÔħáç¹ © [‡1ç9¥"¦ÁÓ—=»ÓÒoÉw’DÌ[AÆöÔøaÙædx'9•b)ïðI(€y€÷ž%Ñ|rüÂ3ѓüIʹ™ä锯ÀØûb8”’ǘҪt) èéIå ãbf vs˜µ>¬Ô(o“_‘&yYC´û(| ‚½?VÆɆÞT%3˜9%I„Á‡#§÷<#àuívø–òÞ„m Øû0óRP:K ­Ê€ÁPÁ ÜÁñ–¤†Ú{·Ž$×}ytéQ.&ú³7PՍ-|`Dµ¨¸ÝQŠÅ< •ñVl,¹ìdž!©¦sÅÅ>:o¨³èQ)jÉóM‘&A;¬ÈɊç‘[×ÒwL³µÑWƒ` & g[JŽ^oŠ˜D¡ÝuŒ~9pU Iízâ€^åÝáé`1é{‹ÒMÀPÐ,gÞƒ>lš —k‚@£hñDµ. ± ³…²pHžÜküÈN³1’yŒs|ÝHn)#̆+[`Xcö +0À}â*\«îÔ-fŠ”ÁŒjCpógD7J¸G´Ìàia'û£ x]SÅ !¥ìÑOØh1’ª•d[·!.!$mg7ٚ…6ŠƒRJ× m0A+Skï… À´…!ŠWèÒƒwxÜWU &vKfâÚ2 žå´éȓ œMžz™¸È"v‹»š1•Ï…Ébcd¯óvsὌ)kþâ3VžQ½ÏŠÃ×q¼|ƒg8‹} ”0?ñ"8ù”s iª>;ß7v* +&l:xF‚&3„Ì ùÓÏS8T8T<æœN?XTԉ\Óó䂃Ê’\øyrxåɽÅg¨ `ž|‚uoC‘’â˱Z¹‹w[ˆøuNù90—Áã¡a¹'!^,#’Iïñ+à ¼Ö£°š‚Äœ!_*¡p~g$~]¸Bº~g†•Z@a-¿R>Í +Îåð†“C!HTˆ‚OŠË(¨«MGcÖd I¼M€’t’Þ-É»ŠUSèAAU¬rš¢‚“†WZÁGãe$nȄ Ҝå&̸=#¸Q¼—} p’eu*—8–p‚Î| +K9¯”,¡¼¡$\ÁìÄ42"ðÀ „F‰OYðI’Ü7.¸ +zÛO¶—÷H>—¹@ˆt*õ ɛ…*+gºXx®©o™ä £DQá.x£tI‚å™Py$I1š +œj¬2I*U΋í÷h–Süh(’ì )—Ás9`ÈiØc^–"ÓÌϝ¢ãK+y šLi†J©¹ÐؔD”$+(^vS©“Ñn¦u¬Ÿ@¶`+yŠIb ž‹"WÌ9À7K¹V\üWn\EâB„Cæ`\ó®¥?¬SïÞ÷¯3ó‹*¥˜fÉ fÓ\_>$‹l£IÂaܚCÈš¸ ’ÒXqÕYdŽq.yߘ˛ù¢SX՜[†ô©$*ßäÒo,ò²›LPÌ»fk2C!œ¢e¨¨˜CËõ½Ð,åßÙ5˜d2Šq×.ÂÙ³" ~ùá ŠÜ—†k¼cÍc((øØIY\”£ œ*Ø¡DŸ‚ :ÆĜ™07Ñ!cVÁ]ˆžoÌÅÁ@Oø™köØ yÓ'0²t¢ÇƵ u[e9gA·Ùý +ö…’ ĄL(Å; ™Ã9æê BDVÆė l݇í)›?uÆááPéU²R¹@{á"›(æl$Ìþ0ì‚1øKÔ9ÿS°çÒx£€OüŠ÷†¢<™‡“ dª€±3ð)C§B’«OOdÉ¡ý '' +à¶Ì# }Ïc§!‘¸ 3M¨È•ªœP%ù´u%68æè¼å’d/¸jX!5÷XG…ÿʸI™®”ç'X°ÁË§ô|Æî×$w\Â}Aâ3è¸H›Ë¤éÞÅñƒ ”ù, ÌSš(3|ҙ0Š‚v¥½‰XO,BJ`æꧮ¼%¦#Q2oâjò8`(„‰žÇ`¨*ž×N6ÀK؄—¹ìo £À8!#ÌxPú-ž»è:ǑRIÅÆüé€úçCì”eìDQy³°„Ïx -Ȑç•Íœ.‡Ý5\x_€0'A¡ß=.ªÈƒ™p""Ý¬KHoÄÒ (™ÿ† – ñkT –I´ž¤› eFu21·&`¬ÞÃåžhéK¨): /^€†Î¹âÝlrÂ, ]ÁJ +È(èä³Rªô逺H©®`ž1Ý| ”71Ȥ/ZãÚSN!œ¥L•=,0ã²l˜8í1CIIz£ K@ O@bjBë3$P çe-Aþ£9u–iÌÅ$µ¤ð‡¤åJÅ£^G Kœ<¨18 '˜”ê]·N¶•è=t¤y̆bƒòI”ÆÕÙóIhÃ٩Ù* ‰H/8µÖðR£º'ÒPґIi¢-‹®|?ºÔY˜Ý2œö›²ÒïJyb6±ì„JÃÌe‘Ù’*ìȌ2ÌÝzåŒfÉÕ*“ÖʙÎÐÍ9ž4Û¬XY@iÉ %¡–öÔâ›øyÍË‹hF5ˆ¸Ê²/ +À„=FQwó,‹µ6YSyTö#P‡xŸ «Á>À¢¨¾’¦ª2HEgúJ’tRAô֑W-”Î% îZ»´‰CŽ +֮ζÌ«bš“ ‘¼nËk¨¾H¬%ÆJ‰âáï€2㢪:'´* ’mõ!ÀI<´Š$ã³£¡%‹u2ªÅd¨„Š-¾ôSJµ4©Ã¨ § ë©Wl*ή·¥Y8¥2S)3ŒP +ÏKòb +íÁɁ~0dîI<Ë}} +0gJ³ØœQcb…Æ—_K#NTaªŽ±†8ºÎXrÒºŠØê°>ÀúC; }ŒèÍwr¬"ˆêŽ<㽚ùZh™cª~)ꕿ“ÂøÚéŒA²ð˜kn\u·;"ñ,fŽ'ёŠEP‡ €ÝJhIa ¾(GÜ8$~ª¼ÓÀp.ãõQ°#ŸjZ¶&r!4˜rÆË2Î>L\iGOǔT8‚Îìē‘§Tá¥\ÇfªÜsÁœâÇñ,QÁ½Œ‰“ú҅:6h¥Tt l^xê@9BNä‘ZPã‚cäÈBÀÕʸ†`㤝}+ fa~ƒ¬n*P?± ¦K‡ZL9ž‡ŸQŒf’¹³Ú$Qjâ¢XyʹŒ“I¨´.2fËѐnjr*ýÊ1ŒTÞRÅa¡Ž‚QœË¬Û4d¬Ã0X vm +Éf†¯¯ªjœÅÛ圴`b½„£JĦÜsš;æ+‚fÎFí£¥Ø ðà2¡x{û-笰F%y€g†l¸Ä Aæb§¦ñå¡Üg»p¨Ajá4ɬÑÞóbŠ³›»`/êCê»3a -v4ÎÓܑAIȑnZZ{µO±‡mݔˆ†êoC€"¾5KE©ˆè,•›)Ì.aG‘t"B*(Ó ¢ÄiS,Ÿ4o×XrþVÂåX¡Ø‡¤E( ų̂&>œRˆ…¾ÈÈIeŸ¨æ¦gðýl¹B).‚ëOR,{äF¤"ª¨–§lÚÃD,*ãé˜;ÃUù@‹exÆ5y°°|Dd*1—(Ç®I¨SçËha—N¬{QšŸk싃¦‚/A +e™1‰Ž2犔]ž)$XR-ÌY8#xÆcÌgKÁ0EÉÃTôZ†â«9k"©ª÷ã×´h£Â¥¾Ò0 C®r(1‡[ÊQC)Á ®îõfô?„šlkÂE•BÐ~è\!#W)¡UœsÆ®|/{SXæýÇx`p•ybn™Âú`ó;jˆ”h‰Ÿž«p²³ñ…2͖{R¸IÀ&w¾z7äÄiTJ—aBÇ)q¶Âó +éSòÕ-õvú‚mҕ ¼4åŒÞK¬[S¾sAüĖ°VɐÂý 4Æ7-¸&+‰ÕT”Sœ­Ý„¨ZÁ¢›I—Ëõ䚀:çr¡™Ž0hÞÏhÓtÀP/Ý‚˜-qz †ŒýÄö<†,Ü9àV$uTZKdÌ;^„Òynñ×ø5~zLT6;ÆBöh.ƒâÚ>™W…-PrI7¬6ÂB"$ÓpÀ¨p˜vê¦ÑNüöûŠ%@££ªAX¬Ø7TQøêaP#>åچ&”ƒ÷—²ÉPB|­ôü¿bezÑ{Lbo`Úԛ:8kV10—5À"ÒkBÊ;ňT +$ãm€'± +–úšÞCÆÀ£Œ‡dåíÊ(N©è?jž´1¡ñ†àg{kªl(š)©Êè« -#Í<¡ iÏ3±1UӑR0Ú4yûCã„#¦‚ùŽqb±ÒaXE`æ–…Ó á¤à, +2ô’/€lr)ÎÈ6A,žºŽÁ• Â×%,@š”u5,Á”ëH-£À>—P耚4q²a#äÕTJUÁ ×_Ç1ÌF°Î»BG¢þÜ´ù˜U´ª{Ãp_νüƒ@6û¸ +êJÈQPþÂ:ÞRŽ¯£È' +fÚ¢>JíÈ?…J4kÆ딛”`™x&ùu¬{é0Š5Ež/\IIÙu5¤¢@Î0ÒàšåœSÉÀú„”š¼’PÇ@¬}*emúÌÙÏCE`ÔTo¼®4uÝ ˆòéÙ>stream +¥¢+ë=›e:®(øÆ>ϱ4«y¡êß«`(A€´Ú UÅQ)¾Ì¢îñmÎ+„ÎpÕeÔCg¸ÚÂ=0ca‹*«Ôu†_Ê£c]ò/ÍX9çÀãË ×ðžFד¥:¨Ë"¾¤”U4,{.)5T² *!!Ö¯é6ë5Ìá¥ÚU©r?¥|»o¦åÂÁs¾‰1gíÖÝ àóˆ¸víÖn‡j^t­q_Oàë[èvêö†;w“ÐmC®1:ø¹@C¡8˜rÏ|}IÀ Ùàžˆ¨¼‚ +ɂt“­ášgI¨Á´Ö·øpJCV2N>\œ…¾q0d*iÂÒ° -G™ºPäH³‚.¶[ëC¼2Ç4›?o.ØÓ§œ(i»b%e³J€¡^¯#ï,\X­;+S¾û+¼7U”ö™s¥IwÎÔá ¬6‰b$L”Jtz4À•Z A¨3œmÀsÝ×ÄY,Ê÷хÜAΆq%£Upº º…S~ðÕ×bæs@3Ž'3|ƒ/Œ +r$§:„€²8õΡ\ñôŠî‡¶¿ÑrR«/ˆ½Þ‡ ëÈs„YY7÷4cR½„+r1¤úlGv«U½o¾íýò÷µÏ_?ü!?ÿ~rùh¶œ_?,ål‚PÐ󟦓ç³Ñd1š¼>9ñðGåëÑ$þå«?üt‹¿‰Äýøòç§OFc‹ê«?<àϽ?Ùo¿üxöÓô²ÄϏGÃÅh:ÌÞïøé»Þ7¿ÞŒ'öÇÛÁÙèb¹(çßöþh>œÍ«m†×£ñ嬜` Ù{ðÃd~„ïoKüñ¡“¯¿í=øÛd4´ð—÷äuµíÛÁxé¿].®··ž n\cÛßüÇ0´ërôúzÑ|lÔþ®w"[ î}óq½?’!ýÚ|H¿Þݐþpþðâuy5 ¯å_“Eùãhñrx lfr.wti›î(4úc³áz9]ΆåÃñíõ 9M&Í×Àhrw‹àb¼œ5Ô¬œ/Ç-øµ¿«ÁéÆ#›/.—oGèVóñUŸj¸º7 ElJýþŠpU>,çóÑ`òhçŒFCØ>3>i—-øìå2Ú#jq^Þái؊k +œ^]ÍËÅîíóqâ]²Šg8ÒcfcpAëNÇÓٟÞ]e fÿ~¼£u•Ëcó;Ó’æ»-‡Ëñ`öý¯·ÓI9i±0ן¼³á¶íét2_ ömxò®Fkšv9» ˗ÃA«µ[yª;.>â `=[îXuŸï¬84}"ûŸûf0mÆtf€Ùj¢~k>¨ßî\Ðy>Mg­Œgüt½y鏝3/¼³¶ŸMD¶aíòîöÄ®3(Ôô¶œ Óæ*wôı]ݑ|PêÛéôæv:ß©ñ6i.ç¿iÁ5ÞÜ!Óh~†¾Ù1øʈÄQŒh‡«2"} ÚåÕbDêxxÞñƒÙhq}S.FÃ{};Iêélp{Ýb¤Çr$G‹çƒÑ.ãLw&ï3#‡v¤ïa@ßcßå,ÿXÎ^—@×c–¼ZoÉ/a’>ig #ãÕ¸—W½ï¾:ôð°äþ†‡µÚ±…‡Ý»à°{¦½Ov7ÒÉÅ¿—ÃÅ£érriûøhºc&֘§m»˜7Ÿ½ÊC OÄCc°‹åìb9.'Ãæ¾u÷pS"ñ«îdx“éËÅh1Üq*T ù«Ñ¸l±*݇ê'Í]̓yùdVþ諾ù xå±»êóF4ÎÉòæÙp1xÛf6ãgîj„°-ï»>ýª!ë9lU«ÕLeÇ>›Eîè VrÚ)§rÚ)§‡¡œ6«ï”Óû§œ^ÍVÿ4Í;õôèÕÓ憦ãÖN›ó¬N;í´Óš©N;í´ÓN;ÝݏãÐN­ ý¸¼ž”“óan_PšsJÌ—£e‹c™Úß˸-ò#;®x \ñÇéìöz:ž¾n.÷vlq?¶˜vlя¯9%:¶Ø±ÅŽ-ÞO¶øýlz9*gÀøEŒ¥íŽ1vŒ±cŒ-c'2Þ‘±cŒcìc#Æøt°üý?æÃërö÷r4¼þ þ™”³Oäµ?F6ٕ§ì6ÝgÚtY·éüøšS¢Ûtݦ۽ž„¹¿qžm†vlqž'âÞEz¶ÒÑÄzþe:þíf0/gË]Óº€ÏC½Ÿíªˆ^¶PHïpÜïê/Ýí_º$yhLdÚ ôù²‘î҄†#ê.MøT5Ÿfåe»r°Gû}ü—'\§ÓKsÂÅx0|ó]ρ¦·ƒáhñþOI¿ÍÙvL—)à ï÷o7ª#ÝwO`‰ó¶›_.§ïNïå +ü€c K,9ÏoKÞØ (Ê(ïEyðËÑÕÕ²Ebï±0Êæy®žío7Z{ððÇêvNË»*ÝÕÛÝíVâA®Dñ¥±ÄG‡"„ú”y5LæW-nË9Àݱo¢Igñ9‹Ï^"ñ1Éûn}’Äߙ}¶L†O>e²>{.é.¢÷;s¹—ëµ¹ÍìÈ.ÖÓ÷ùb½6ƒ;’‹õLóͽzýý¿®Çå£Y›XþîZ½êPïõz-|ñÇRT­ßÂq6¸-[Ì8µ¿«±]ŽÆƒ5-Qï¼Ï¡÷>XéÇéìöz:ž¾n~² ªÙ"¬ ã‰O<$¾q,œðއZÝNØ<›éXXa› ö#‰ø¾ap-Öݑò‡ãë¾÷åZ` óû‚*$-DÞã®pÐ<–öX ´CŽå„û,ÑÝwyÂݏz;já!°#ú3öfœ^&“rü²—ÃV:óú“w5ڇͽQ{výÉ»móÕÚ ¿r¦ßñ½?-d±£‰ »ÇZóx¤ÇÚãÑüv<–7ådñãàö˜Ï¶{\«ç¢¹•çXŽíPb¨·öQT>6ú±U j#Œ Ãl¾P”aޓ’CÍÕìcá(m˜ä±l§æ³ttIÓ-ŒvŸ-eúÐvéÕ¬,knŽ¾í +(_‰÷Ãü_ͦ7-F…­ïjTÍ÷ëbÚBøœÞ¡œ¶C ŠíÎåë6ŒÕ7¿« Æïï›ÎòËÅ`֎Áºîl-6Üe‹J®ñ] ªùa ûð£é@W»«!G“rÐüšèá`<üqÚ"¥$z⮆8+ÑÑ|B//G‹ÑÛ6sÉOÜÕ'ÓI‹‡Ë›åîH°Ê£gîTILF7mzþÇOՑûS«fx#—ò.réàÐëîHí9]äRƒ¹º[ë÷°‹\:êÈ¥îr–õkìRAäXθ.vé(ιa»ÔÅ.OìRsõæ¸b—ÚHcG»tµ.véxζ{»4üb—Ä»ÔF;†ÙÅ.³Þ¿Ø¥6LòX¶S»Ô]÷°ÿÌ3Ói¿Cïr‚÷*ByhÓÓ&žµ›žÏ>=Ÿ´äËÑÍÎ'íÌtä>Vp}øÃùóѯåx~;*Çç-Ã1Yô4IÏ4×SÝܾh£ªFÜÕ»Jš­I6+o¦»ìŽ4ô|4¹,¯F“ä+Êm9Xžuöñãc!ÝwG]T»Ý p$\rHW½=[î`÷Á9®µkn}ӂo¼¹C¶ÑÜ4úfÇà+#G1¢Q •é;Ô]šhGØReDêØDßc9Š³Ñâú¦\´3ŽñHÞëô:Æ£ùÞ'‰~ì³ùBûMxçÎÿÀÎ@Gî¿;¿e‚ñ!Í:w~çί!YçÎïÜù›×¹ó;w~ûQ}iîü®[çÎ?w>ŠàЗÉwíDÂ΅ œÎ…ç°Î…-;þÁ°ËÑÕÕ²E¸cá"Í͍ž§Ó‰•ø'-öÛڃ‡?VÇ"^¶+Syè®Æø¾§ït¸rl¿µ³`EÜ±ùêñmgpp@¸í*Mgþ ?ê ÒBw¿-‡–3Ͼÿõ֞mlOëOޙDÙ|ÇP§Û›Ú֟¼;‘d‡ô¡Ú¬äÎ +uXV(Ú1”uhŒº³Du–¨ÎÕY¢:KTg‰ê,Q_ˆ%Ê۝œ%ʛ¥Ð ÕY¢ŽMÑï6^càJg_sM;ûÚGìÏK¯ÞÛýNt¿ç5gö±Kt6—{ŸÝ~èUMŽ¤òL‹ª&]å™ÃёTžiC~4‡ñRufß:~Çq,G‹çƒÑ.wcw&ęÜUƒëÎäƒ^uGr&ï§guçòAË­O®c;’»*p-ÏäcŒ³h?Ù]¸ìÌtäžV€{9¼¶HËÉ}ºÎ­«¶§ÆÜ©8º"ÍË6vE*f·5¿éü²ù-õØö®–a‹½o1¢÷GÂ5Ž…N¯®æå¶Ï¬¼lÇíTay†#þ‚µ•˜ò/Am9´éúl®‹£›©NÁ<>SèäëƋøÝè²MìŸo~WG©P-†v]¶ +œãöw5¸aš®…@w‡ò\«!µºïPèŽÍ7÷¨|g¾éÌ7_Šù&íÌ7Ç'£ç÷Î|ÓbDù¦3ßtæ›c˜ò/Á(phÓՙo:óÍý1߀‚¹°²ã|¸Ã.Ó©—÷Z½¼š †‹Áø§é¨EV„{¼)™øew2ÀaKóIS^}‡Ë|2}¹-ZlÜ965·Éý¯EC!ñH=:_”û#ùRüÍãԎÕýÛòP¼~Úé§÷T?mµÍ: µÓP; µÓPkGÕi¨ŸNCm.ÖvêýÓPï}Ôᥣ6¯sÜ*jóqv*j§¢v*j§¢v*ꪨ_?üA$çßO.YUE˜ÐùOÓÉs‹/Î<ñðGpÿjüËWøéÖáÑîǗïo.¦cÛ¥Gå娜\•ãK¨ï0•¿ÿG99RãÅÕø÷ÿ^—ÏÞÚ>•ô~õ‡¤÷Ë»¯þ°¤ÿýó(òàÏàÑKð¿¿¼‡oÿb?ý»…½ëéޏ½ûGÒ»üJô~y¿Ù¥ý$ItÑ;)z7öü=ûê'ü!ë§&“ +¾Âÿàk* ~N{§¶AÑK±aÑãßèlS@+øs^†_¨9| Ÿ)>x†é—èÅQ—mÛ+ˆ|n½?Y_$FgøWÛfðCŽ]…¿nLôËIh~’»wÛ¿îåð~”F÷ø÷ëIîu’»ðoÑ#¹'Pîèóè&雿M`e]ö^Ï0㋞úç꤀ys3Gÿ>²Ós’À`“DôN„Å(e/²Bê^VhÝûå¦ÒRŠú–©é=6Åù¨N™"Nœ…GìbüL[ÒÏ¢Eˆ„ºq«ª:'8ÌD´Oµè/ÏS4{+[ýڅ‡ý{¬4ÓQ¢ŽÑ4oš9Ù|æ,*™Tig€ÊjuæDQß2•k3·ç£f8eV9œ¸o¾íýòwïCË©’~Zè&=Uv¥Ø?Raì“«TÀáÿ¿ ÖypÙÏe.TO÷¥V÷è |–)¬=ÿ#L1|.l÷ðG,‚>ڟ”@­¢;Ã|}nO°EõœþúüK…,7ªÈ#SÁ£G!€ðÅtJd|}üýÜ÷ ÐÒknÂë:V7€¨Ùºí½•}eRQ覽ýÛ&T$fؓF=‡jA³É÷¿ÞNg‹WtH~}žô<šNÇÕF“ÁŸ|º]z¹àës±Žê…=ºæ‹v(B¨û¦'ýß`!¸môó B…HXªpûݼž×g$Ià.Íøo淁Eš•jx™Lµ!Þaûg;¨28ET&©á-©;íO2>À¹àx?ý%Ö`¥ž¯ ¼û&ê |@vbÂß­Ç´ÙÎìí/ÀiM•ËæÀòø؇ÙÐÄôÝÁ¼Ë£]X’*;ǑÝDC…ڏUÇcßS4ÙÒÛd÷˜õî1';ǬŠê˜—n”Â2ðáÌ}PDþ ¶<-ÂÐuýÐQvH 'v¡Úr²Ý•_tNã\äQý#je*íÒIú%~ôWîΉ@.ÕzD± ¡ª-ì†Ý:²-ÖŒÐø?Bš)ú»u©âՇŽ/]Ÿn>¾tÇø­JA«RÐbTч¸*ueUfÕ´©š®,ʕ'jF$ý€¤OâGA?îšÔw™Þ´ËôÆ]¶aDƏÈøѼÐߏ¹õÎ=¦7í1½sÕ/ñKPúe&ýºKÂߏ¸üDeºtõ-kF%*³µòÄú`¤‹tCIÜüŸ»òĦ$6í$±i'ÕŸ¡8ý¦ç'Ãÿù˜KNlÜBbÓ·PÝP•Ýà_á% ú‹Ã!V÷Q–˜“jæÅ U룡'ÖæÅý°6\bÆ­&ã֖¢?u‰­ E¯ ¥f·¬ EïŠqCñ²®Ÿ ÿç#.±O='±"2{&ýBJ!rì(/¢Â€ +4gítòàM-x‹1Qfhñd» 'Ÿl‚ÿJߌ^ÞdÚK/è) yÅu•›]…”˜MSíP>VΑUåÌ-¡5a…ꚶ&ï¯Û 7ã]“„6á•ÅÚ\JÚ|Bÿ¨»PégÓÛËé»I­BïÍüN¯ßÛØ_ô‹D +;GhA¿YÐIÚ×ø!†å}aÒL÷ò~jLnß(¥8E;/™êªxP0О+ÐÎì’FØõu+Œ±Ñ ߈ûE°æûþ‘@D»J»Ó­Ö={dIV¤;­{cïÁOÓŋr8]Zžà×>*öOªrÑOU +»MIº¾^OþðÔó‘WWÓٍû–©]ϗӋòüáŹíóËÅûqyÞ^]ÍðÚ_.›’û˜ `Ó§´%‹¥yÈ„5˜"e˜]&®QÖOñDtgX¼hÅuàPÛ~åñÍÃ:KÃZgTð¤t+Tû5P@¯îð2¬o-ÑP-5åF¶J£¦›-ËğpàÔüü}à%èÃûAá Üb¿XjãS‰}•Hòè1\ºMØdþóÆ3¸£T•R°rsµ«›û&€b´Æ&VØȯ©œšª®3´U–·Æw2Ëø$Ýcv¼Æ°W9Ö.¶Êì"6K u~¹vâ6rÏ6à…Ù&þä$ؔø“Žy¡Øȟð©D3/Ô1/lù®GMÞ¥õÊk¾x^¸ÃA¿²ÃcÕò£8¾O4í2áwXFh¿‹°óP7°å¸î©³n\ÉûŒcÊ<ýZŽŸ—³«r¸p +ŠS®Þ°ŠÓDIßïšgYO🼄þÏçWזÃ7ådUQ[ Ʋ ]¯BçڇÄôEšd9x=Ó,19,¯‘¦Y}%sQAƒ]õ Ž% +ƆvwKÊ~ڗ*sx ïgYªCO +cŸP¢_¤™ þqÖ!„çÌK~•W¬vædµÃpÊԌë$:~_¥ÍIL¹“˜ªÀ¬á»´}ÀØ#ûÅvHYÝï_ÝOv¨if ’Åc6 *§Léã) ÐçG¨ýÚdð¥ú¦¨¡w§n9P¿ã1½ .KðÌ@ŽÎ¥J•bmŠ: ™õó¤@SÕړŽI™ÐGr@8¹®¡=þL ž£MB|¶þ.×l½þ¤`DÎ>^¾ú½ŠÔ’ßöèzã§Æ¥™ÊàiY„©]„N6÷­o´*d‡sXˆ¼ Ï¼†ì·¾‘Z 8'Ö¿îR@±‚=¼ú”í–‡e†iOç=mÉo„Fn»ÿ¹yû÷£É›ÁòjþnðºžÃæ.ìë¡%KðBN„³9%’—2Ša±Ùu›)¡aiä–I }úWHZià2¹€•–Øݕ¹ƒäȤûãvOñõfyK’;Geuhßg$œ1î»´ß-‡±ïVørå,v®‡:‹A©3ÒLÈ ¹h¢SÇ~ +‚­}«Î-›€­É`à9@ïˆÄ 4Ò«~šË'à‰2öÀ(w¡%P 7ŽËÌö*…0{¤x<îeôÝ7n,:tÀÀ£Ðw€=·,+. |°;±È3…c…‘ ԇ<ñ3C߁ò¾/âûj7‡VJ_¾×†¶)L/=íÖRea96 Á_¢rXIž$žsZÝ0ѶßöÜȍ +w œ¯Üy^éÑcs\4µp¥Rnjßai’åóž ~¦sGS~2uJY†g‘UÛuk9ˆ]ËJCü¼%÷(e_f™BÉ°¨ßôh ˆ°¹—€Y'JÅCal=‹:^ëvñË\Uölô’5lÁ§dUk·í/ ×à{¤OæÅzBÏîJ+r¥á»Æ‡ê¦‡äôwšÜKü÷!*!™eZÜÂêtij™N@A€è-¢ŽxÔϕ¡8Õ>Ÿ™xxöéB%ü”ý“Û #œô•ßJß/zÚ÷Ûcã²íð˜÷%ð%ô4}eìðo§§}ߪ}wã9°ÃÔvMjÓ3V̔cUšÕÌ$ò³«OFã›ú–ʱÚüD§–UÁž;ð·ðæö3Æ[ì,‚Á•Ž øgë`ѳW^§ƒ­“9º $,)- +{T¦ö ­ѓ[¬øÚÛ-t½ÝBëÒx胇¦Æ@à„NMŠáö ¸]S87­t+ ]Í2<•Ô²þÙÌî"{RÚg ŒHw~[ËûÓÜiJÚÊ3Þk;—Ìò&ë' +r n #KEöF#T’oxVf‰QO`ïÃG›uY€Þg\,mbOìñ²ñx1ww0ùƒó7+æ&oËÙ¢¼\ݤ§ãÑí­Ý«ðÇ£9lYjÿ˟áß%üƒIav”âo¸?^ æ.™ìÜöOô~yêlnåÛÞ+ö¾÷ËOù7^'†ÿüt;[ù—ë-äºÿåѺÒ= XÀ>}zø?ÿ÷¿7þçÿÂï›þïÿþ<¿oèx÷{÷û?ÂúÜþû®ýõaÿ¾`Ovà +ÈÑþÂìËBóúiWÌÀEïÉò·ßÞ÷€ÏV%‰¯Ï‘+âü—ÿÏ $þv‰љÕϙÃ~‡ˆÏ×Q:ö&¥î$t%ÄހU9d¥…gêÿ¼t=ƒ¸8ž¹?¯º.™|}^'›DÐX ê¡ Wͺ€A#yÄbYR0S¾>AÆØZT±rïþÂÊ×ç"®|}þ!Ë×ç ²4íx­Ðòõù·‚œçÎyè7 ,œ·o…‡‡?ô.Ӟے£ßÊàZ÷®=»˜—³·å幕éÏ]«yuûØù~8™Nz…,܊_ CK"7G¢2pZÙVð+-|€àL «Õ¿- b &§*Ï06LʐÖÍÀ2í߂`/NëhFÊ ‡žd ˜êðÜÍ +С¼0q¬ê- !?î¼ÝíEšçÕރy QáÑ¢/²,Sú½ÀÐû +ÐÏ«GÏÓƽˆ§œºÏ8Š ÷ØcÏøͼ]HÛ&:UZÆ@7XmÙ¶6*"ˆ桳*1Mß }¶BLÓw6µð¬é[¯„À¤dXDɆCeÔL îALHîkLI?†íÑǦäÅÈÂfŸA¿ZLÉè}_ä´ËüÆ°Éõʞ‚½. +%íÇBeѶ cþ´ Àˆ˜10q™á=S„{QáDÔß +'¢aNÄC'N'Z¥ÚÙwó +ƒº©Âp¬–‰ÜDäÀsLQ¡¤åC>ñ=¢$XeU…¼Á+Umð +„(%+@j@OÔ½ˆ(ÉݍÉc"XµÃ'*®Q‹|›ªHWˆÃp˜Æb11ÍìÉ.tZå’Úž–‰Ì*4TvH‰ŠH¨ú©†´_Fˆ€èÃ`ˆŒ™hÀ¯ˆÇ݌ˆÇc!X­Ã'â­QÉ/·< |Dċa8Â<âªHƒÜ¢i^!^æbbÚY¹Mfñ1šös“j0Ç¢]€ÚÅ0!c&ÐÛ#Òq'#ÒñHÆêÇ߉tk4ògµp^÷˜t1 (D8üÝæV0Í« +ø´®ÒÞ¯bv LUD»@´ °@»CdÌD~}¼i©›ñx,ü ÖcŽ¾ñÖ¨<5ˆÌþ&Ï*2caÑÜK(^}+YäAd¤ï±ÄH°X` Ïy¡/`öz},.¢R–fiþ:}Ï£_Mæ)|?"Q‘@±¤ž#0æÀןÖPɏĜ˜xã!’ ÅDð‚VL<Èbâ‘ØÆϑ`ǘ añ"˜"¡f"ÐûcâùnÆÄ£¡ðsL˜x«TZ‘c⌇Hb„«˜z$…ÅÔ#YôÂcößcÚ("]¹ñZ¦½;¦õ1& „äáêÀ¤[¥ÑŠðWÙ´¶–?¦Ãæó’TL:¹bґ`Æ’èƨ aõ"˜#¡f*Ðû+»Ö÷³²mý`¶%𶠀°mWèT•ö"êI¦•!ÉED’"Ò±Œ‘Ž%1‚±¬Fˆ‘.ÀébŽQøý騛åh$’ˆ7úNd[¥OU¼‹¨F  D4zš"ª‘lä/‘|FXé{D1‚E a¥qӋ#jQ÷"jÑăöX£ïD­UºT幈Z¢qå|P¸q“œQËKS±Hà" d„”¾GÄbP VÂaV¶oD+ê\D«<°zñ=Òè;Ñj•*U.¢hX$òð~ôbQD+’ž"b‘„ÅOy Œ±úﱈœQÙc¥qӋã}è»Q‹FÀOÑ  køNÔZ¥ËÙîÄOëŸM¼ÿ£úi“þ󏞴ªX²ÁOˍ些øióL°›Ö»’èÿ¾èÿTý}êþÓý‡ÿS³†þé㬾Í?îûŸÎZï u~ÐZ'Í +¸¹›Æ{.W5¼«Æ=¹æ¬Y·q×À£ë7â½\6u4DŒwD‘O.'“ë½9öé:Î +¸…GÇ>YçÓ±à}½:øèº_gܳƒƒ[óí t/ïN ·Î@­ÛgÜÆñc­sý xç>¸æþ©B[8€pdë. ï媣àv‚×y‡VÀmüCöÑ:‚÷óá£ë^¢p ?ŽnÝS„à½|EuTÜJô:'RÚ܍d_PçHðž®$x´Æ™´náN² µÆ¡ÞÃ¥TC½­´®ó5U¡Í½M5»îo‚‚Gûxœà¹uŸSÚØëCZ÷;tÏS Õ¶Ò¸Î%U…6wJA¸Ðš[ +€û8¦ riÝ5U…6uNÁ€ÖÝSÝÃAUC³í’Içª +mÏÕx¯º‡ÿ +Ÿ[ó`U¡}X8¤5/BÛû±j¨¶ã(\wpEÐ6.®HڎŒL‘°ÝÊÍÉԑ±© +mîê +bvdsŠ¤lÑÆÝUCµí4®ñƒEÐ6ž°Hœ®Òx/oX$3Wi¼—G,ÈÑUïå«¡Z3ºJã½f‘ü\%òN³ %W)¼ã,œ«ÞËyVC³fBó +§Øǯ ÌU +ïå[‹¤â*‘÷ò¯E’ò +¯ØÇÇVC·FRr…È{¸ß" ¹Báý\p‘\¡ð~n¸ W¼‡+n^Äâ +q÷ðÒ‘¸BÛ=¾-qBqGªHê!g’E}Í}å¤:XxËAïk@ p%ÚÕldº (ƒäêôPÏ¢v+=Øm–õ•åP)$:7:ƒ +!©«#–~þ\ϧ·»­\[[¿ýÍ·QÝ•úÂNÂUæt¸YSÑg>ŸÄNTÞÏ~;ÑpiäÌ&yÂ_}Œ+|vñ¢øáù‰ÃӈU`5&úxúç¿åP® ¿UÐxô{è_zF© = +=}*"ANT¸n裿žÂ}Æbø`ÀW9– ëám0ž ž.Ò&ª‰$>û‡ñYÀ›Ó½¾þå®S¡'Ü(—=|­°<÷æè RU?úþp?Ïâ‰ON¹Cgã"_xr¾Í<ñyäÊ +Ë@W¯ò5›Úfbõ’Ž­xW¯ó݈WêÝúƼ©7&z4Ñ ESQŸˆOSÍ«!Z‰+³Ï[ԡӏqe¯LV/ÍÍ åhi*sR1ÞOXß:+Ö/SيûQsÜÒ¬^`Fópí´ÞjÑ û$¬ìÕ oU?}§•oø“xl¢¿hEÿ4¥Qc±‘ÔÑßWÜÔ:Këé¿÷£æ¸WéÿU£¡¼˜ín(7ë¸æ}C‰e>s†swâQü/]×*cÄ:,‹ Û›D}‹«hŽ©ô)=,ªË`}El+‡v ŦU¿È,ãL¡¾® ½ý¬"Ћ—/·Þêû ¸pÕ¤)ކ^¨œÒØÌò t±Ry¦ šrÔàõB ½Ô†(`§Z¤¡Má-¡Œ…ôª!&t9˜}ƒÖ.ì ±@r!›0ÄT&×nDf,«£n)¬þà—ÏþöÃãޟzß G³á¸*{’y LyAw’,¾H^dõ/÷˜H°\.àsڎûpƯT Y&Ñ#¦‡X½™1#C"üV@5u÷ô*C¤M;Ãc\8+a:)—ޝP4}‚¶™äJÏ' Þd†¨q܂Õ3Ivô0J}HHzÛÔãě\R–¡E¸(Ía?õCùhZOšWä(¼ä¤^ç©kY¯ñlÀY£ïԵܤíTîú‰hvS¥%K¿>ƳQ™'&ð Q¸2ÍkkÀ-Óx¡Ô} ¥5Sëf–Ô*¿|xõē/†hÈÏ¥O­HÑ`Š«‘æ¡øX]Ë4o ÇÎÕÙ߀sU‚?jyU÷ÒDUõùŠ¥= Öêäóÿ>ƒÀ +u ­ÈG¥}µ ¼/UÎËÂ`¡ðܙe!àL¹ܙÎ7)„ñòªÐ:ØפY†7òdV&‡1Mà+±òI‘Ú“Àœ] .Y€ZqV\˄r‚¯ý,¬œ|A "²lO@ÖÕÒK_™J4¸œÝ[á©|«VϳŽ»€Äv×.WN&™ ×%¨hœã)K„«Xd*uÕ¨1‚Š$,a<¦*IªËø)*Ù?õÅ}Úä3™Òr‚!¶f}ÞºÇÌadÝÚܹðµÖ³g«™?ŒHÚc]Ðãêúš­g±†jˆ U™¿¹ q³õõy4_4K9Ö¥‡ÛL‡ðG¸ ŠÛ+Y˜0¡ ÄId}.ýïš*±ð*MÐ*ÚÍÀ+Ç/y,‹ýò'ü<^9ÓèïY°k@9Ç˜DF°¬_(¼~¯lÀ[ee* ܏,5^À‚Wiœd«Åhpr+•àmEI^‹ ütö 3ZêÜ?#S«¯ipíºpgXeºi 0Þ®Êèû©«?jd_«¢€Jq¡Z•)ƒù³=—RP¥âÐö-°ÿPD(Œ»mÇ®C)p×8E"I \Ö}êtԉUùÛ};¡¯5ßèËÜ­Ä4z50èÜn‹w_eà\Ötx‡ogô턾Ö|£/ó#_€îÍ´BޟÙ+àÄsØóäóGÁýÏeïÉàít6Z”“ÞõhòÛòê÷ÿª¹‘òóØØ  •p©¨½ÕÙà¾ÄçEwу)Üí`"Á$-ÓwØ¢ŸŠœâ£ (Àå˜d$8Ye2÷gÞǘô]*8 9æaC¨¢tBª´pÎ_Ъ3ôh è½ÒAœšmÀFcLÐ5³šºNwO£.³ÏÕ/Èû¨Æ´%Ô¾½ª4lž"¥§CÙpƒ;¿ ÿøåCÔòÜ-•ÜÈؙËeš€‹- +Y!˜R :‘Éþµšx( ób0ÞÓÛ ËFãÃ?t“eRaÜÊUQ1‰ÎQ6vQ®…íÐ΋ÝIŽzV‡tNf¸o5ÍáȹB_|fr(: ܽ&hó%â]|Ÿú{O] õ½ða´ +´£€<2q¾œ»P„‰T N4ìÁr\maZÁ c@ZË 2'bUB—N0eI"Üm½0Áhç aç:…‹¤í6¾ ²p¾{Beô:XÍH騄" ýÆ{Yµª ¶r&O _"õ ©t¢dØwqNTÞ¡Šœìðl*áÞX™ÀÍ&(éb¤§ŽÆL݄…1 ïTL%Ø7À¶â‚©!Ó'µ[D+b+itÌ3(q7~£ßþ:GÙm*ŠBâõ’¹(@®Ó©Â[°UÜâN§Û_Ÿ×ò20>îÉÍÀðYÃϼ'GsÙ‹§¹ôö=¸ZL—˜¯Aºägƒ”¸¶¼Í¯{q7ûÜ^üÍÊ5ÎAÛó8|nËYh Ÿ³’ì^œÎ>WÃëÛÜÒgöáw˜¶¹Çäô}xž[ïûp=·Éöâ{àæ©á|އ÷A6s[îy­küÄÐ5¾›=x &ToIÊÞoÙÃ˳ŠÜ¬#JKÀÔWƏ@v† ­kÀ ÎLÔÂèÑ3'˜¢…º, Ð*~´„4ÌRzŠ©EâÌ”­ƒ¢^¬ŽólË©QC“Œ)à3[Wè Ñ˜Gn•64ê~@P ŒÈºU ¬<^C§¬ô©†Vñê:H«{ +^­¢§í†Ls´ºgÇ*µüä¬ zþÓtò|6š,,Š“G=/þå«?üt‹¿åî·çã¥ý÷ÙÅ¿[õØj‚˜²Ü{4[ί{?&ƒ×å¬÷lv Fû?öܯ§ƒñxôz6¸½ }ÓW–Òz/–“ËÞIOõž/úÖÛ³=þ¦þ«!Ö>³Òú‰Ã1 ¯íC&~Æ®’gKêëʝ^Ëùbtµ v—lTi:XüVZµxòº¤¶~æjð:•£yùàÛ^ߓÛNQ•ØŸ`â.­tf&ê<|…Ïà0pÿWÀÝ!öÓ~S½‡?œ?šÙõ=.ÅÙèÂn«óӗ¶ezþdÕ$؎JÀ?ñ9‡³i»Ë[†óSùŽZ÷Dõ«Zû +ÿ…m¨íœ¹½ÒØoâEnEZéh‘l¤Å'˜ÚÂýfgñå⽝°¯þðà¯“é» ~ƒƒö›‡ã÷óùàüéËo{~²ÇՃ‡ö,~[r£§Ó›Û©] OFc;d|îôz0šô\vž¦¾Íá ðóh>²Ç1"­Aòr1¾i…äÑ`>V0̦oÊ6($þ4~6óÖXø°d˜.^”é=/ñW×ÐS£×ÂJBáƒÇåUï»ÞWè}áBÉ໾¼gåƒÞƒçƒÙ¢v”§ÓÉår´h6Àí¨`ì­(¾6€.Pæ/¨o×WwïßD?ó5÷ɀ“ÎäèûËrÔÅþÑ»mef†¦+$æ.!YFüÛ¼üþm9yvyقðŸšZpr'¹ÆXã4‡!ûÁdÂ]„›Z -ðVÇKróB ‘·5Å\m'Ø£qiϱG1Ä·Ç֋ÆPl”}æû_Ëá:ã~D5•—c`–¥'«3ìRÏ<Ÿ]]ÍËÅ·8/Q|óÃx¼Dmk:뗿B‰%w¸Á¥)DF+QLËÙÛr6^Ê +çþ©wf {òýÕUùƾãÁ«ÑbOþͳåbn5Â(@ìñh~;¼w_¿ýä|ž·˜ûÁÑ퇉ëTcvt¼»ëÓnŸdrž¿Éˆv8ÇÞ}Xg÷u„­Î©ž0RLJÕËÑÍí8V^Ésù‰•Ê +‘FÚÙÞëò¹Ý…‹FÝ3Ü=4€w'}wÒw'}wÒï£Ý}«NèD€F"æ¼}âC¬þèxx{§ÓÙÄòúrt|?|SNzƒ‹™E\Nâ“bû䈾PF:ç]ïŽ_ηl†ÎTyïM•B™ÎzöÁ,)?¹ºÛǼ‡QÄJT}öƒ4 ZÉéØY4TîXý{Àöswpƽn?5±%èMÃE0º­?5ÿ))e﯃ɢl~fBæ¯ÉéÌ|±ëÌüryYÑñ²Ž—ÝKyä ¸Qµ +:n´‘=–v$?•ÓÉlp}S‰“òØ&d*™¸+¬D&³Âg߆lÌÌH¸£)8á×Ò2…xi™©©IÉ‹¥Ý…L’fWۗ™ÌS‰éÖ")0ÓʄWÆ£ €Pª"ÝB(q_ •¦)Ü¢aה1™ÈýRR–@¨†L€YŸ¶Pê#ßGeyŠë¦¯%^âM£˜ñ ˨D‡ØF·JbÝK +å™R¹À ¤Ȩì€%˜ ²Q³…2úc’å“ ïn{ªÔ(Œš6 +/ô†*Žã÷•[q–îYª3ä÷»)·Pú“.ÀO,¸Ø:ÑåÞ. “ª¼€E¢%PýÖtç\Š)²Ô]†© `ß楓õґ¦[;­×ŽÖy'Ÿ„ˆp·p )ÔaÇrÂÎNµqÝdǽn>˲é,g¢þü/VAîò :cÞÇqLàrªÍ‚€ì×‡cLˆÒ2íõÚ=QXy´¯ŠäË˂HDZ ÂœÒÉæE‘éãcû¹U¨S Ö{n¾y6^ÃPN¯gӛã䓇‚¶=/t‡¹}Ãc›Mïõ\ÊÛÑd^Ž?,Ö²š±Û{ð·Éh8½,[^¾hQ‚qK¼DjQành/?xúìâß_؟ÿÔ[ЮÙyçhÂmOø#b-rU<œ¼ÌÆ{/`Mʹs`?ÙyÂ5仢ðøãòÖîäù³Iþöó`6 +5Ž+½(Çؘ¯¦•ßè=°rïê1óÏ'ìÕ§Dóð×"}nÕã î²ZgV&Ã& +cRÁô ú¨7ׯ~ضáLžåûm·Ïh_t»×`C¶öõG A|~5¸ìqðz› D*iòï“Å-ÒBӞ¹n¥ÌáŸ^Í-¶Ow˜ío·Ü²‚U*óôX ÙŸåȐè×ü,GÆq&8´WÅ P¹¬+Tž$ÛK•»²Ýǘí WÊËw‹èÓ-"Åܽ\Cæn²¶ŽhþUþÙ¦ÿ‹7½^—–³L@ü,ÿr oGhê,è;ì_Ì+”Køþt<}÷QôÉê>ú_Jeûè”ãÉe՚t1^zµ +’By;~» ·º +åCLðóáØõŒ¯cXÎËç/ÏQEJ* Ü÷¾ÿõv`™ê£òj:+{?[ ü€4…ƒáÉãÁëùðJÓuñ¿¾Ï|øñlzÛ{y=¸üxŒ¸ºyšæ{f5œÏoeóÝõtö›cÊlê¸ÌÞT½-g‹*7¼Œ˜?v̽cÿ›å­»~.ÿ±³bN¯bÅ9ý(ž¶Ú!‹ÞÆ¢:XôûÉeTtw!Óçƒqiw Æó‹æýþæߞæórvc÷X9ùÇ·H_~ÒUøêχuT‚Ô¤ßÿƒ~n±e€w¼ØÍΘë+|}óâé£Þ‹é‚_‘¤nùÄR#tÞ#͕›?-ÇÜ>•YŠɠ܆†³ßÿkÂ-È +wZ_H£\’F)4-5¾BÁÍÚ]`}Íða1–îìE†]zÌÒRëéŸen1«4šÈ̶V8éiž¹Dã$nP0¾âÎVQZØÓ?I%æ~~¤á*oÆ]šˆ¤iæ¸aŽ×£cN—Ò!0oŽY?gãhOpK “â& +|V S`ª.Dî8¾²ç®©"/0š† +skǀ` Q8^RØêO¬\Ì©Tnwd:A̹Nìg<]RàáàRtfûs§rpá¹1Ke%6œ½T[6‡«²Û”ìîaÀ©åšX™=Xº(D¢Š2—„hÑ;2Û]!q£Zꃱ~Çڍ‘¹R8"ë,sÌ3³‡Yêvi&pߦVžD&©Ç‚6]âã’b¤±BFM[Í»…PŠÿcdòH̯w­>PAö—ÑÍ „¶ìDâV~6^.˲ÁãÜ4 üÑ5"{9µ/˜5@ånDôt:¾tQ4;QqS‡lsP{„ƒ×]KÿÔ¶+VŸóméxüæél°œ/–W`‘½ç¯[*fî@Ž“Ò8†¦)rx«yy†]|.8D;Qó8=,> «:’4ÒB;V§\¼å È6ŒU­p‡ÿ“Ð"‹ÞfÂq‘•áe¬ê§¶=¨1Tϲ8×=E½Zýàñf¸™AGÈ"Vlù9Š.FOI–!>iÏt<,5ÿ¿"À¿À%/³ò…ÆãØTaâIf¼|A[ý@¸%r`T¹ì¿;HËÌq¼:Ë{µÇ’q§ºm2Â¥•ãÒlF­—VµD^-­b˜:!ËξSf2êØêBš¹3%—,ð/{t¥ØC²_†ŒòêvÎÿ§Å’h”0à8°ÿ+צpW?…ëÏ +òYêU.êÑê–5Ô³`iËXܯª–(i˜jûo؂//®³‹xú%nY¾¦$PR±"A¿¨H©bI_F¦=E’Œ, ¸aP¬ò²@F†tHyé8¡ ł,’ÚìPK–T©ò–’Ê´15ʴ뉛Ö¦Wz,®óA!µ¢9,Æ¥â®Ø½š¹œ%3Hït⩻ԝr=«=‘¸z³°Í¤åšÌœ€ Dš¥^x¤´ÑHÌ%úäEXr‚ð=ìolekwƒÐÙh¾¨Ú"×-çۃ¾ª«T³–\òUÈÇû*¾¤hݦèz´çýH"‰ïPTÿäz?/®Æ¿ÿ§Æùô­»ïÕà⬴-Êû)@Ë_å j?™¾YÎø|zû·Ûz,൸œ¾›0àQ ±+Wåøòè8*Z'•‡ŸÑ³ƒÅòfŽMéé'£1ëÅK$ÔË¥m>ñ·Y]Žo³^iõýhòf°¼š¿¼v¿?öRœ¼zøòÕ÷ðmóÕñÐã%T]ývíÒBO®-¤÷‹çñt¸´³¼°ýà}‹5|]¹ûñÁ/?žý4½,7üü]ï›_oÆÛàÄ.¸Ùèb¹à»<œÍŸÍGzKÔÎ +‚Vê*'¾¹øégøgî¬üæÿÌÏßfóçqÛ·ƒñ’Ãó !˜Ê·ó½™W¿=©&ÓIلJã©]ñ—ÈDMÿx¼M.m‡E“AÚ5ó²\ü„£i0иùÇ\N±(ÍH1‚kcíŒ&3}ç ¡=SøÓÛælÚƂ‡q­‚8½9ö÷I—èŸæðôÂj÷aó•ú9öÍK¸ä°ús¿¶òüêݬï#àäs¸ûÞ֢̽ŸçÇ +mö»Ñ%¤76˜wßò ¸·bçȬùúºwá¦1¶“¤;÷¾Ñ¸ÞȐ4X¤Ú9ª_›1 Ç©mÏÅta勳òjñl6²êl£á­?t0¢òȗÓålX>‚ðÝÐ%ìwý¸)ƒK+d}„ÎܙÿçÒ[J­¹¨5‚8êôѸ,/a-þ!§ìÜÓÙôöᬸñºcuOfàÆÿóéh²À}ób9.g•2ˆ1ûGŠµƒûŸX|â\püjÒw¤mòIñüá >>dïþ ½xQŽ_M_¸¸=ŸÎGÐyüYr§’æ‰UFñÃüálq1Ì.—Wƒå¸ªÓdP$$Qu•’ŠÏˆÛÁåe ™{Ñ –\¯Âæ·ÓÅ*l0ɈÛ]ގúÄ·)@yêCs]ÿ~è=\.¦½ƒù¢œ~+W±>üÁÏ´¢zo&Óá›érÑ{=›.o··ͧãÁ¢ì]@,¥ëWZ½ÛÁm9ëÍG7ËqHùûš <{¶ãS까,fƒÉüv`7Üð½í×èÒâãq©e¾[OÚÞ-·}=+yWïlìlú R•+nJ–×ÓÁäí`þ2KT¦òù¬œ—³·eÌÛ½ï/G‹ÁÅhLÊÓr<þþ×E…‰c÷7?‚Qí8;/ƒÑ7‡ŠH:5ù«ém¥ÿ€«š£x„rOKšY,€ª–ZJf…iHI8åZ2œY?L.Ë__–Ãéä²åCOF³ù®áBÙ2c›žã!}èD3¢½ç™1¬Os–‰†Óì‘šYŽyPÒ»bæqKܼ^·àbâã.0ÁÊ3ä 'oí[-;¼Ø.ë8]üÌp<ºµüŒl¿ZþùÚ²y˜™HrcE©uÃAU”YŽÿ2XXÞs6ÆÀç±`Ck;²röÃãJÛø÷W`ë‚WWºŸô“HV|óð‡'Ëñ˜¸žÏ«±¿G•Yšmc0O£Cg+'zT’Õ¶}Á‡S8j>» á£ÍÖÆOÃ2TÎÙÖàZë|cW~•ï,5­»ˆ–QóM›•„ÉtG6‘sgÛ&äĆUrÊ 8_ E¦U°™+Å«ÃäE.¶´}TџM¯Fãò¯åû­x©=DçëŠV¥Ù߯­F¾Ž2ˆÝ•Ö/—v±>™Úãøp¸ðÄwÐ>dS®kٖ¡7göÜ&Åù‡Çt¬ýۏååhyÉöÿˆÎ8X=«ÍnS6ªT_`5Õý4^Fˆñ$‚S/¼¨HkmŸùÕórãZ«4{Y,Ã`§Ð<øÙ /V…—JÛg«Ñnb‰Þ÷Ï_¶ ´ÞE.‡³!½\ãÝ«¶Û@1ר!É<ÆUš‰Ø01™1³7š Dæ ZY¯f)Z?Þÿ>½èßZEsfÎՎ­µƒWÆãÍæoF·v oV˜Äj»Y Õ*KèâlGÓát<ŠE’¿úÙÚ ‹ž‰¼Þæÿ—éÅ“«i/kwQøqj9è?¶†["ꪡq­ûóŸél}8 +&äÁsþÈRÛä¡ÛËûóxÒ¼_·—ÍÑ»ˆ‰ðHÝz¸½ùv[:|èØ+LŸËS®69ø675¬¸òŠ~¶ãèÆnªþ؊#$Yô‹S2ô˜ÜìD=‹:’'¦oÒííß‡¦âñr6¼î½š•£ Ëi-¥F“Ö{Ø6C€lRáÆë/®’ss« +-· ›Æ²çt«íÖ6CÛìvsYÎG¯'±ùWnãÞYµ'¶D¦IÃÁüb´¸Ü6çxՉYûxÖ¿ ’é¦&Ãéê~€1ۀ )F–׉×g²¶ùì²o…mHºhº©å•=­¹B Ê«µÍn½/dëÂÀ¿îo_Œ¾ŎEbåj³9ètŒmg÷;F:ގ‡ï·°1×h8Y3á­6ZX©<ögl¥²ñà¶9|Ãm¸}}ó¦_NÀÔ³•]C³9WÙ¹–±½ãïÑfiòÝ ¨ŒCkÀêX"´µ„·FUßù P¢v5Φ·»Ú€œ5²2Ä®v`ãê@Û÷Š{/¨œƒÙšE°~–GƇRƒÖ‹x\»LJRýyÍ¡ÜÉ|¥' Z‡ž4h÷¤ng]MýËñŽèÝή¦“­ìÚÍ­ÒɖŒºÙšÛásK­Ð2ï_Œ@šÜ6éóþ¤|=ˆ<âZ ×4ë í¹4فm,†¨þ³©¦~1ÌûóëçËmԂVåì\7ë ™êìDþI&‰þ_ßîÐo¬Tˎuâ¨m +]ÅkU׈œVÛ÷Û4ô¨åtq½SCwâjݞÙufT“œ½Ò¾–VÐ/çåãé ¡õŠýCz2Víc³ Îùç£_Ëñór¥ábB¾gûzJeŸ¡rœ‹Ø1àž:cÒÙ{ +Ã֞ª¾ËZ¿Ì=Öàmû(xª­ùB&ƒÝm®§ïþ2º\·Ž«ï¾LøÝmƒ‰j,žÄ•ê>†ýÅRF?üäœVؖMÓ M_Í··»Z +h‰Þ„GA´ÛÐl˦Ãm]ÐÝh«}ŽÚ>Ì//ÀÓȦƒQ9ïÙcç²g×](jùÎ|QZRO^—“ÞE9ºé½¼Å8ºÙ¤g,g½x"[Ž.µyϾåäñô Îo +,¾+'—ÅK‹Ü¾`^ö¾Qÿ±gç_{Ïüö÷ÿ„ÝÑ$~IÏÎ.Âàõ7vžŸ.–¾ž nnzïìÓ¿õ{ú½&Qß·½†lrL5½ùýÿ@ÖïÄá€ÿÛ^½þý¿Æ‹Ñë’zi;4ÿí]9|ƒ \W–“‹ò=G جº%a_?œnw±ÍÊü½Ø!߆EäÄÀ‡³m*$µþÿ»û®ìÖufÍ÷³–æ°%Ëʁ¤rŽT–eåd+˒­|ÿû¿ô zýÒéÑô03ERTØ}{õÚgùH"ˆ +…BU¡> 6_ÂDHEgBЌ$__/ÞPt’˜¢ï@¯ä•ý$¦hã°úá·X†ˆÍŒ¨ªnm‰sO$íÎÛr;dÛE¥‹ÁœŠß½ÇÕÎûv³bƒÒ-ÓÚòöw;…ðt°Ôýë—Âc].J§WzÞ쁹u@bSã•a·š«á1ÝþüïT„r xyñúΨ¤UÀª>öˀÞÿ×ö°N^3˜7ÁÒùoÞ$½+®ìâ¨Ïï“ö,ÊýÎђîâŠM SD6…‘‹á¹Ë¼ÉáVì)l-×Î< F'&[Ö}åÙ4b>«I½¼Ça76#‚Újä-öÞkCǓ>ë9åíö!W™ +vÅ¿*xÊ7 +žæÁR{Z-V¬}›¨_…„,N5‚Ñ®\»·ª‰"3\*TbbzØNÆ'`=Ì÷é#nÑSî¨H%\ôô¦¾XN˜&x®Šv¼QäÝ«ÕÚ¼ˆTŒo“ˆ3I®éiiM§¸*ri ( D )uýG¼nçȉlˆÂïòö4ų  †ËÀ¼l|&¿ãÕæ¨BM‰V7Ûd¨˜ñ¦h¯Q;ÉÐãåè©×ìþ÷›ê}hžÙ ,”±:7Mü†`å»Ow^Ùg›¨íù-ÊRRÞCÀkNg¨Å*Åú¨Œ'œ\1^p¢žÊçýžôö=uÇ*†¾5܎C㎭à2TìÉø!ûó\þj ­ÍdL­ÆŽ£ÞÛ̑ޗ`¼™–ݱ`éÃXŽÎS_†$ÊþWÜí~Á°cú;½´aúxhà°ÄöÝ1~,N@&*iL©Â)¹ÌUKñ°{^O­"ÑiÚá0./h•f]@Зμ}½ì)ýý™t÷ì¶Ä϶tLäë§/kÔûrΤÝúvò{cl2éV˜HÖ¦÷¾Vµÿ‘h¤-yªürÁÏxxùŒŽkÚözΘ²³ ƒø•qO/>Û¾ä&¾éɯSêË×ÃÒS¼´‡cÆ6Uhô15X¶à“aŸÎÏòÚ¤Ýÿ­OÔí/¿T#:ãِ |›¬Sr꩚R_îa(œxu¬É7ÛÈO›™Ôül‰¶ +/_¡ét¼†ŸVVrQú¢Hã˜sì;¬ô£àjP˜%7¯1£ý`ý8'JuÃvÀ¾\€Œ7ÔúŒ'~§Æk¤rú~>"+ŸÏy\¸‡i·®ƒ8[å4]8¶ç|ƹ¯íÂfÁUÊ9ƒŒ—#&»mžÜøÞ¨>tK¯ñT>üÒ&m¹&à¦H –š»Ñom2=Dì:&æöö¼ßÓD#ýmM/œÅ=9õIï¤Y ¼¿vš‰J*ùž^ÔWûøþ3¸d’încH1´çõÈ!nm%ݝD%“þnS«o¯3´øy]fR xù|µÙ–#è¯ïŠ‰JÉR̤ͳ"ņ×Ô€"pÚ9ªÖXk¼§ºõúÇñPã¤K4 +§óeçDÌåq‚ŒÎAËTU3¨’‚ÉÐdoöº$FáXË|Ä]H£p& dÄb³&·x¼„Ìå.3”øľŽgÄ'Ø>« +¥lbXÀ‘Ü„­»Ð(cZ ,Üèfý LµDÈ﹘gL†9õå­­Ikɑáä̃î)›:9ƒ‚³ëÇ:÷bN-¿È£/4m־яÃ{nÓT®Ë’vÛ$ 5,õ¼˜dòÌ +”M4N–ºk©ö¢¢¼rÙ®o&I`DÖ]¾ŸÓ{Æü¾ eҞafGðì3®k _ÓE†L{|I¯½ÒBºÇçZ6D5íí,ÉïÓì'¹ùmm¯ŽÔQ´²ìHÛöÈì¾~¢¶ø2‚×> I¯µôE«NszaÌyA{·_”J$[£Ñ…âgՉ/#¨ïGé‰û«h¾NÂr†D­Ñßø¿7ö0ÒnܺÉp¶,œ\›v«L8‹›xª¾W³Œùlk OuãØäLš"û6·òˆžB6|KÐÀyý¢€d å  ¿§/ž$~ÞôõQ!E? $Fñp.åEF- J†$Þ;õsÃÍ=E…¡N¿üÄÓ 2þDµU±Jê×ç+Ž_°Âºʦ]ü™%±">K`…n$@}¢˜c5ðiÌ<€ŸàH½„~.œ: "| ê0u¢¼—¨¯ø8Î|…d¸zê5øÀx§ÿàß)T„"óf +€—èvôc‚ÚÂUAKúQþSÓÒÿ!™nÂæðªš%)2\w™RT•ëYú¢m\˩Ρn¯æd~·§/3¦Ÿ²LC´hêˆ_¨^†û…S%L½YX÷üŠPåfo…aè5ÇD¿Ð3¾A2tEã$¿ÏøŽä—çF„eÅ>V"„cΓ†i4ƒ:ñ›FõbH{Ú#xÂ&Ò" ¶mtsø<¿`8Õ: ¥þâ+‚Ɔs®7‰ª +}ex­HF<=(>°¢½±¿Ñdm–!ƒZ‚ÑgfxÀÍ®mHZØÚhN ¹I*H‚˜^W"‚¯ˆ °±‡™Þ°º”œ£œÎ[ž”°¯Á&–f‡:7o)2REù¬ðUê7‘àƒÆ–æé3¤Kž`ÅSõ4‰6â ä&¯0ê ˜¼¬@KµòšðrdXF"}À©]FðÈ N3Ò +ôChkZVñ77ÎÀ¿Xüu)ø«ò²”•»ÁŒÖâøÂ擠Ÿ1+ìz@ØIéu¼ýÒ\¦Vƒaœœ®÷jÍäÙ.žÓ»¼Å·q¬m7ʒ^ÚÍ1ÊÖ|ϛ?¸ÅTàça/ñ–ÑH}k½t±¸Oò»”εßt%^&ÀûÁ/ÈX‘Ë|Ã6ð}”Ùr¨§N¹à֎œÚΤ×FØy.+žœ,Ós ™ã™rÂ9À1¡­¾…×]¾ÅübèX6™íBªPAÇ ^³oåÚG6ÌOóˆ Gp³St»G„ ¨[¢›="huÂþQ»Àó¬9ÏÈ¿qrô84_×´9Ö)$‘å,d]•Ð›¡ÌÁç;4"oIÚ_phϸq¹èx“^# `ž$«ñ¾%Y}ýh¸÷ŽU<%mñƒ®ËXÌ67 TW8V¶Ù/X®j™ÌЬý‚ÝuÅÓÁo¼]µ‚_Öú +,ˆo$î<]}BÉÙӅƒe$Z €FkÉ(U”É‚Úrj¦1áMè%Q0á"}9“]\ü“›ÉRӘ×8º]¤VǕ7½°÷-FîS¨>AHUE”WoU sf»ðlª¸AE‚¸_û–1wßO‰bŸ±:R|›¥g?#…&]zaŒaéTî…b©}«:¨@µfµ#žà|d˜Ó¬Ê½;“G õÖ9[$øÖô’ÃÁkŸ +¦,µñ}r`b—°/Vú€öê_3y¸-ɉ³·Z6H÷Qè€^ÂKK Uå][Ì®¨/ì"çä 2‹%uÏÂLN­ØGÂm +T6lû)û€¦ïz‰‡cMC:ÿ³ê'=­Ž#Qµ¼/µ†5“}Í~ú’k|v@Ö œž”C-0g:ß/Y RC¥€®×¥šïoôõÌðÅÐM/˒¿Þ–.˜Ì&Îä¡m‹åëΛÕ1  -ôõ/¾ÙDSuƒeµv$­ÞÁñÚ “ƒxK:±¤K`˜—Z穀©%= ‡{@‰€Q‹åûÙ0]»ä¢xqù{±®ŒÕ2°õl‰Lº›³HuNPÎc }nû\f‘”jY|oÓPETQh>0¯QgoéE`ä${ó“AÄÒÀ÷ÁضÀ ›Ø~U,"y¶F¿|pÍ͊åybx]RRX'ÈF¨!{r˜^TEJeЍ͡e-•ø\fRñe-§àùDÀ¹NˆJÑE–ïx«‘gÂé¯9@/¿èâÁö|÷ïC^ˆT@†$Ì4d@–Þ¿Dݕí+eÿq-µ„³›ò5êËæâû^¨ËÒгò·ª@F¾ ñÖ¢qæUõÎiGmfß¾×<Ëüixu™ß½%ÄÎÛ}‚(%Àb(ØXäŒç×|0bØMô4Gr•s:78Ó¶I† ›õ¯M ‘Ý}ò§õ\ +MUV´u/¹á& ñܯÀ€k8ÑzÓ8[üð¦bþø9ʾf´ÅøáepJ/¶‡„ÜÀ:º4ÃM§N&µˆ¹.§Ñ§Ƅ  4½2úÎ÷ +#<ë¯t6ú:vGÀKE„§­Þ‘­7”1ågmè€~@mÑIÏÃèHœ­b…鲘Ì~Ï!Ô–RöÍ<éÞxlGw/üIÉXGàÓÌÉ«;ÚzÞhÓM&<öbª \LAídˆ”4©EJ—)ý’SÏ/ mw˜%øeLøêå ‡î{b›X\¨H°¾èG@¸¬ÃŒ*l,[]ýD£aÐ +¦lr{ûWF§ f»)€Àœnü&0"–©ùaä´{ð¤ã¹Ýž)lÛBƒÏKIU¶ß ½MdwX#…^A°Àµè3¹ñÅõÈÝ w[½pÛÃg9CýQ ÚáÛa~À¢œ3cÉÍf7;ûìb·¾™õ|BN°°‘oiÓUz©‰Íx7L^àN–¨mK§´­²Ÿ1VÔúÌ.·è 2Ðä §:ï'ðx´‡ é¯åD«ŒoŸ«•OZü ÀËÿö +í$‘iPJœtˆ$‡¿Þ°ÖF¨MZ+F+àáÀ.µ˜0å¢e0)‹z@:ãP$ÝFLÛdÌ|+]\[]a‚ ½O½‘µÊD½§0Q—"¦ª¹ ƒ)Àys®^‚aÚæeJe†§hMï&îë,Ʉ?{<Á]z{ÆT°·Rxóçš ? ×53ŸttÿCۘ±é\ ÐPžþÉnÉ[)îUÇ9` n±Ðâd+ϘO¡-9õš=ɲټòýæ«V. ™ÆA9cR­ï‘ö®™t·]vž¬¶e¢‘>Z¼ûâ8n´ ¸`a\H­Å M‚ëHúsÕ}AÞëù²¡Xƒ~äêpUS_ñ™=ß¤Ú"[#ª/S1éO¼÷l[ÔZÒaS+è«zÈIƒôpjR@ºŠÜ …»™ˆJ/€b0(±é~¨Ó˜ M¾m‰ß˜ö=32}pR|¤ ÚÆk ]ùpÊWr5o°Óœ€ÞÌ3´ ŽÖl -@3¨þÃ.ÌOó_>U¥DyC+Y¶À´ÚÀ\jÉi4g‡š†>Ð$ûúÀ²} ËÁ¨¾c€Â_Ólå‹jX¼!úSA0Ÿ#D l ¼Jžwz¿/Ք˜m's„—jmËñdO<ØRÅǎñëà%G^CËIey®~כãÉ1åëgúßÿó¿ÿ¯ÿ¡œ4I¿vœ‡½x™ÿ]ÿ—ôñ—¼¶êãÿ˜—Ï›Ój·™'.eºluHÃ^¾(ºÑR£®úƒGæ¡æ”kÉÿI:kÒõŒ|ÖXkâĜֲÝû:¹à'®]ìƒ*û =¹bSVÙuî¥Cÿ(Ê>%¬‘š÷Kk²ÍZ{é?­ÈZ»ÓèÓZ§ŽºÖüÖÝjÍ®ìÃU +h­Ñ¬Öà>ºôUDß«Œ¢XnTˆÁÖù)«y~HžIk¹ÔNóÚ:ó4½v8ž\`ÔÈF þk'絸ó¸ ?ßˁt/û +Åp¿#iþ1ÔSŸùMšì¬c^¿mÊ\¥©ÞÐ9߁ý3î{­íë;»z8œõa7ëZSîhƒ_»tç"»W®sѝ9¼-/üÐÝג‚S]ÚScSß]”ÎSGæ·A˜]=63à¨#Žñ‡ãÒHûÏ4_‰c™©×ŸuµC/ ð5»ïvӐ ÝûÒñp{‡ÏÐ{sºë&þ` ªYüÃÝù*Ù$©~.“9Yª0—øvj9ÂBª“ÃÀimKS}Kš_š»MIŠêñeàMrTa^@8­ú~[ÒTÝæŽ54­”¥¨Σ Éò֎¤¨¢ø Ët×û¢÷‡ªÝ,ÓHV%ûªË삯•U¹†¨2"ÂXöe[’¥j,”Üe97S¢©šET0Bº¶ëÕs2‚7Ýۋ¡ ê£4Õw£Q4´î†/»ATÁ¬šBªŸ‡ÏÖ¤†¨"I TpèiΖNIª{ãM–ªÏ¹¨¥¨2‡CXk>ƒÖ£Twþw߀ã ªGc´‹ËPõ|™ÉyQ…ûpâîºÍŸÖpè§&IU—{^öÞsYŠ*–)V“RT4´¯¿'&Ídwwˆe¶†4Õ¬>b(Í¿š’T³U QEÊæ‚É9ƒ]ëø¢¨’ë ŸjXg>ã6ÄaËÕÜðdz·ì0@Õ·ã¨2ª+åß>éîví&‘û<GOšª»—ÄJ?UŸ4Õ¼îì/u§~8=…„)ª•Í<'KµèØïl2TûV¬^ڟET!ŠpÑ5(e21­$ÕF~•—¥Z/{#9ªi¬… ŒdwKö—Ælh IRm "GYª-Ó|¸QEdhÂe¬m%e¨’ÖvÜHIRíÙYªßºF)I-kRÝýðbŸã‘Ušê[sµ¾¾Ù$©¡ˆ*E†&¼ÇLK9ªelD–ÒÒT3M\×9UóRT‡7;tRh—Y4y¬ 風Žu§¬`òhƒ‡³+…Aª¶ ª•ˆi? ;q@5r@Tá²Æ¶·]Mu°ˆ¨¾.ú:jy'’]Е‹0ëξ8W‘‰Ì%yôWƒï¥ÐÆÈ»ZS $´Óø„=_ÐÚJSuw;òTu™™S–*r£€+ÄSú|ªÀê®ÐXŽêHjÖÚi3ƒá…#Œ|–ªKÄd脪ٍ€Ã:Ÿª»®ç¨Âõæ<¼î +©"ß@†ª÷úÒTÝ]Þ¸Òæ ^ÀäB–*ò d©Bß`&E­žîî\¶»`á®vä©BCC–ÃÐÊòì4qw«Cû´ÑôÑ'Z܃*˅(;ízQ÷GI]9ó;UŽÒDÉËSLŒ7‰3gà’û).˜ƒŒ;JÏ0Ìåæ~·5qû§Ï÷é) +²v'–Ya5^Ä.únØÂBS½G3ˆG¿ày}Eà¶ùÖ1¨Thu‚¥¡{˜A¥DÁªh Û|_ ¯ôŸq‡gMÓ16fƒÂý4N~³\‡y(Øè(ùJÿ±•·ƒ(«^}r˜ðÏú¤ókž~…€XÆ°¼À’j*Åq›l¤úC³— + V)OÚpVÁxô‡î!ò½%{ø®•ê!$#è$úS“FÞº|m ‡g Óvߎ–4q'‘h±#-Ã/Õc²ÂÞÜÆ/…Úl²UA¸.ö|™Ïvwjå‹.Žiù¸®{÷eYÏ臹)³žaš¿„Zȱ½ÐB]ÛN@í¿`p™ë#BŽdyu°h!³ɦìôìÚNÊ-Bªý¡Ù'µ=ÙG~´´RJ\qzR®Dçbx±tSçP¸[$]û‹ +vców‡ÚŠdsöý‡ë—PÒý2Pý’Ö©›×mµ]’U6@‚„k†KZܳEƒÈ UډC™ƒðf(¿pcóSӉ$G(Д#YÛ䨢6¹ªv¢¨úß]LÀ ±W!ʳè 9åtx6#°lcU¢IF6Æâóœ,Š†”6 £ +ÿÐͧ"ؗz(\½bKšè61 £Ú*Û6l‘rôeºY©JYg¢aºFîýÅ°¬ýeÍ«V A×éåVª+Ö¤P"³bË.S€Ì­ƒ<Ëâc½1w“Q%«Öí5~E&&m"’½@Avõd[tÝփmz‘m§Ô #`éZ¯hm¼\óøÃxÅÖ»a ±ùxØd6½žPÛ÷¼¥Ü0J UÖ&\`ni˜`³˜ªmaÜwžÄ4ÖÚ{ +ÓASïyLi·›™FG˜˜Í)ºy·D²3ÕGò–3×Xfÿ´h™9Œ +¶®ôšƒÛ39eÆ·¾% Ð¥µîYÓ37QŠ·¸Óf™Ñ\æ\úP±„¸Ã:ì·3èÏ°ÆYb ªã r½áԃì¼Q3TÃ+^ ×ƀ’lÌ} ª%„Ø꼋-WÓž'ÜK¯Y§è­€êG´·)È_âÇlì¨Y\(´è;ôÁ˜TOA&üuÚçñW2"§Iä&Êw^ÖÑüózS³@›N/·«¾¤qs/ÿ4UðGªà¦¸€lOV£2סe£’ñœ¡.òÁ7ó…ÑÁ˜)}Â-ÉïÌzxü"8Á¬7W<#×xDُ½ +)E‹ôu~©œì²nëFA~Ý8Ùü¢ ú ‡h¦S«çOA8Ùeœó«±(—>¨Ó© +¦(~ + +® R W"˜éˆÂµ`Êõ@.èNM(N ïˆ¨ü\±V£¬"B/’«’KØc‰ +€L (½PÝ%ñ*+$¢’,âz`¨ +g¡‚¿#HÈ@Þxn —ÈÄv +²± æ”¨ $!4³cÁ÷“ÈÌvŚ¯’ñGT=­¡¯XÚ §wÅ;clœFµW–y+YȾ¢h]P·.»"g%?0ob͈ùAqßÑjÈì{ÞƆöºV¸Jv ‘Q’x(AîGUA‘"#\ïãhå2†Ò¢ÅOÆ̅ ®|W×%ÆÌeì4áâg¤_Œ¼M]ð)~3ý\ïµäì‡:õ‡w7PÜ^´üIm¯ª oÁÚ$¢´R!Zžã!¥µ©…JÎüQ‘…#g6ÉÖ"Ø)¼^‘åÎæðwØQEÖ§ôË&ªE ¡o©È~ÓBÈå§I×æx`Yåí2Ò¶€ùÒíì4ž¶=Ñ¡ì4¡gv÷ò&³k¤¸S(Ë͙pÞd˜" }éÇsÚ ¸6³H»ß‚Û›´›|0¥Ó|†vk]n}«¶ï%kSÔn¸À5íÖÚީ݄Ós~\»Öp__¬”îÒ— ך#å@©Q'כãxÂ..ªH8ƒ[7_[kÉ™H˜pЬ +~6Ò)e¸pV'3e Sd猁ßÔ †ªŒ®x–—ÝÈVi±uZR—¼¿Mé¶nÒ¸´Uº­Û*.gu +´Z§[ÖlA#'L˜’W6W+RaøËւVO¶¢G³*¨Z$Ün©ü«]ËÀ»´×e¶"¨Ú rs‹#eÙd­âõq¬+©ðy®ûޝ6Zu +¡ ¦"øEé4ë#¨M¥õ=r k{Øú‡›ªâàÌ}ËÚXW~β*Rc×^oÎ3’“PEj"{ȍºV®b}T^9eƒë쏬‹cÐdãGŽLÐt£“!“h˜-éŸDS›¿z +R³¸Ô9û4LÞep“šžW¶ð€/qg[bÕöÀ<5L4ÉUdw+0Í«v4Õ)ë2m©wgeÔt‡ +tµd"{¢6IŠ#Ð*æ™h¥"’®]´L]$c¨ˆCË®T]%7N:5N).Úö%Á¾m’A¦-RŽ+ΓÚl,X•ä>«lnÙþµ©–eLëê ·Ør‰Ž.%Ðïªc˜2Ó~rTÊô­@[€“ ÍRŒ&ËO2þ"½ãO/x¨Mf()Õô8 Ü^´ò•Ý´ÆÃôËìLfúø ӈ¾“", ó8Ÿ2–O#Zº ׌åƒÛDOó)cù™çÀù”±|tñn8Ÿ2–’y +œO˧¹€.Þ çSÆòià 0πóIP­Š ‹Ï€ó)—CdžçSÆò à|—(>–³Ó®Âù„ Ð +<‰ š+™÷ò`¤ýMm’ƒf]Ë/oU¶Ö¼Ð“¾;ñ¶ŸÆâ6Ý ~7ޔ¿®°SØO R÷³êæs™Ê&pÊ@iªRþ„;… +µ]ËòºÚCÚ¸UâSÝC)ÍՌ*WÅm’EE@4à•@—B›Äà=:¤z~OÚ\´‘ö¤ïƒqUÄ~¹l~ £äRLÈçlðQipòáðèÜNjlçø颳0µ÷6ý5!Îj=c6©O÷:Ö %S5o½jXL¡:D¥Š [¢n +ì4Q¬ME¬Á6aD% CŠ Œ{7½fY…¥îŒFy²x4ÿ隍q ¦pp¾ð"œ¼Yñ&¡$¦ÐqÉcäæ² y3[:xŸUʼ¯ÔD˜Qå1T‘y¯Sxå0ÍM˜BQÔS½D0LÖvásKÃ.v<ªíú1·Ô&¿÷qӈç1Íõ ӄñbêÀKAÕ2Çò9@™*37' %Íy´ÞÜ +ݻв0ºG#ÄDó¿:ϗ9ePè^ñO±+󜳫¥*@dN1Ã#u 0¦xŽ “£µwç(Im¬(8E²`»+óV󏎨DȱmE\CìZTìÁ.¹e»Äd© +0%)}#u?Ë“2×)[€³0e,¦78ľπRÀêI* yXÖ¥Ýq¯öW1÷¹‰OihyV©ž·ÊP±‹ä¤ûY%Úȁ†û©‘ƒë=™6iÄ8éü­Ñ¥6±"¥rYS`•ªèÍõ”x5ð<…6]œ29‰£7õŒèÍ<0ãát1—>hÒ+Goø;…Ê^Eá‘è8.ðSx8z:ç6)¤Œ¨ÇÃݽÑHA 燣7 ÇÛOEÕoà +ªÞÈï@¬ @H=:p.k÷„$ iç¥!½+"CúJ®ºCº¨"u^s!¬¾^SWý&lçŠ5}Ƈ#@4Îï2KW´H«ÂÙoOûXoŠ*“!®BüÉoí6ˆß-W&BüÔ Z•!~Ü¢Çetݛvq~òçkñZn&‹ÒÂ4ŠsåÁoW$­|"_6ééqd“gópڞ22ïÊ.yri×OFæ=˜ «™w5ö9ÈVµ×« +Bª<ÃÚNWì#õ–MW|„ò-;\o88Š= ¥“‡¡bwŠÖ@™ë¨kQ›DØȉ?¤*µ\pÞuA"APp|Mïƒ×¬×µÀŒ*ií~ûPk)†p ¼U>]kkm­A^·ÞÐZ /üô‹¦´öâЃ9;km,F¶k~£™ø”vg!†è”v÷îÄøœàŽFý–M¬vgšèkkô›ùC£öÓevYªX&é­ÈPõ¾°Y`¿ìN둧šÍº,U1" QÀ…µŸ +×ÊUã5UÑz¡M󍣪¹¼§0Þ¶ìä h]%ØÝ“¥ +‚ÌgNì÷ºv¶&rTÇ +T³XPhuŠ±Ë‹,UíNj·)Ça›"ØO—ÉDC §®ÑGŸ˜;þÎ3Uå*/sQ9z#ÿ¢¨®Ѫ¨òp®ùÇ0Â^_˜¨`3nxÝf­±J1çëù½—Æí»áGœŸ/ŽÃÞ .Ú]Íë¼°ÈßéW>‹ú"£K¾YW¯¨QJṸϺ^Oên=Ì 0×cQ²×ëݶ{7êžÎÔP'\*—.ÊTºYïjîà R¥p³žl%÷oà]x×.ZQÛËÓàîf¼ŠŒM&öz³®d£ß0o°EÉý¡ŠUü} 5·ò©ß +ì»?fs°OÊKà‡ížì“Bõ‰lègû¤¢ˆ’óæ1`ŸªOóSØ'ÆWHð¿Ø'…êî>Ø'U•æúa&·ûd2!Ÿ ì“Ú笞ÏöI¡ú.6VöI…d4¢³ížì“ŠÒó]Ü'û¤L.@ü4`Ÿªï"Kõq`ŸÔ:NˆŸ +ì“j“æòàæG}RcÈ-kOöI¡LªÕ#À>‰ªb[à À>eÄÊӀ}72í^`ŸDUÄS™æzi7û¤\0Ƹ}"°OjÑ×P¨ïgû¤* ÓGŸ ì“Úl‘ȼØ'…ê»tqöIÁØÄ+OöI¡ú.כ‡}Rì™êÏöIùˆùû¤P}ò)#°YûˆÁ#ò…Lƒ¥çÕDwxJ¹QjÑWjõcr<÷?©6]19î¹ÅïŠÉ¡ŽUWïˆ*Ã'FÒ¬ú’_Ôo’¡‘‡cK6K¢MWqõ¢¥+÷„{[7·‰IÍºib+µé27CYÙ(°Ê{“þd—5¡ËäÒÖN¡ËT»L—‰Ýò¡<Á²&{ÿßMà9© QžJ{ýæËÿ”” wÿß#C)V|OúNLß3Ž/ܔð(Û%Hæúý_þ§.ùðå|ËFþþ?Ux)¥Ëÿe£|ÿŸêí'°L¼HõšMƒS{ÆcW|RúèÜ3ÐDEUù@J)¦)`ú”3ÕH)u×Õà½:LßµLc:æêµ}ò™!ªáqèƾ+ tê’Ô ƒ|êZÅ}cíÒT—]ù4r§ZÉlÁ¨þø²ËT+ÐT÷•¨²ÚT+ä<-Õ +M𸤞«œ…W˜OØIAµÈœzΉ€ÊŠî[ʼnc°¢§"]‹ÀÏl¯Þ†´§j»ŠöU¼¼^Œöýž›.оßó+»Q\ôLsíxCX›ªû‘3 Xej³¨Rl¼ÅL–›õ_7edžïl*mN+î2e»%:ÎWúQUYÛù(wcšÏ»Ü±)á°ß!mÊB(nÓ­í +ˆi}ØÆ@µ(§ÞRÑŽ1 *zô†oê¦>ñ’7^F$š(ŠŠÛ7‹Mv9ÁoŠ +õÁû‡îýã…¤¯þ»o>ŠïýS¥Ó¿÷OÑT‡<ν ™‡+R†4©sq¾÷]Öä®þ»½_R©¢˜ZtÊ­÷þi®Þ‹{×½ªoÏ~쟂/SD¬ÜˆöÅuWð¹‚ÜÁkh_\wïýòs®|t˜: æ%ôþb7JeE7¿$£¨¢ÇѾm.‰êš·v½"ù³íx);4*âúþ"kçÆ[¹Ä1Ku™µ![MåíJŒS6 ÷*°T*TÑ^•xY»†¥ºD¦M®Dûü,•1ò¥"'QÞ»LOPÛZÅôT¤êˆ\ü‡|ÏáA-JÃÞÀ, zt(,¾7XŒ$«K¥ÎbœE#EüüÜm²3;K .Ëq+î6åP“Ê'>ó^™öœSµ¦= w;9Jnï´lRɐ¦l"s”‰Þ˜~4·`eÎù5‹]ùTfgš˜Þv”úékW¨©½]ìݘmz]ËFR¸,P˜¸%Û&|¡Ð¬·d÷ʨé™Q>CHí.WZ6kK¹Uwê§e·d‡î4ë¦Ä-šåyð¸+™ ìĪ¤J¼qvK…ˆÐÉ«‰ðj€›\jÞ¨g¼êt9ZÙ(5K>¾|ë¼ É§ÑÒ-ºÌê.‰Ã=äō1wz¤Úsv•#·]ÛIÙ¸U ƒL#?ZÊN·ÚMpò9ÛD]»d®Îñ4ò‡PB<âåþ·(EQ%$ñæ èe–*„$^9‚ôzR yníšWC*怩‹§ SQðËÍ¡ ±¿&î*•Í8óDOzâÒ© (ý±®,yP³qãA]€_ +ÿ_Æøh¦)E`Öþø^qLòª‘B-Òr8;I÷ M#¾Çせêü⣪óVÔDõQ \›¤ð7ë€üQ *LuA›è)ëû^\¢XýK`K5â3ºp‰×nýQCÑFþÚ¸ +R-5·Ç©¯íêEB—_¥ÚüK¦]E©ï&§vŸÁ´«W +ÝÄ4dÜŠYl6ò™v$Q-õæ~H¢Z<"“dq'$Q-‘2ï†$ªÅ# +’ao‡$*H¤öÖî‚$ªÅ#JåÜÞI”[jä²î„$ +Xª€Gär9î‚$*¸‡âíUÞjw3$Q¡M<¢Ø“®4¥ûõàe…š›.©»û²B$û—.+”?<ý²B^Îíß¼¬šžßù¿|Y!½!yãŀ7_V(¶{úe…²)Š·±êÚe…µ÷{>tY¡ ü›5—Éqª9×ËÒ·^ƨ½ðð§Z©¸ðPý©V]x¨|Ûá]©½Rޑuυ‡’À'œj%ºðP9„¤‘?Õê¶ eGéÊ©V7^x¨|Û¡Àä¸~¨µü…‡Êé&Â@ת”=éÙÛùëÍC*wN"Êq߅‡l~Êå'*wI.öæ å°ž§à=¯ß{­žÏ¸ðPù¶CÕùȅ‡Ê+e§=áÂC«âm‡~á¡ä‚Ù]lHÞ{ááUВz”Ò…‡Ê{חi w^x(WáÒ÷šê*×ÂtITôðù?ôm‡ +Iä·]xø„#&./<¼áŠB)ìý*ßvÈm¬}Û¡0žöÀ…‡VÅÛùú¡ •³Ç¤–µ».'NpWk¿¹µv§±‘Àiˆû­hõi~"µÖª.Ia­w‰-WÒZö/ ¯ã½ŸíÌjr +•¨·¤ðPj5vâ°_°7ñPI{@”!‰²|ªïpÛrŸZ{äþcε΁^wé?' 39œè+Ԑ&úÓ÷ÜÞș© Mƽ~µ¢¯pl€Åb‡¿Øé%7]Ð'rºÞ0§'%~¶¥c¢Ønb¹I¾“šûE܆ýŽ˜v-Ö´íõœ1åòyܖz°-À{ÖÄgì3ÿÁ2ÂŒ–xó´KÒ¼ÉÍ`Ð^ÌØÌd +2¿Å­¨0 Ëpr 3Ï2v¶¢ʲ¿•œ”íäÌV0>¶ºôÁWhÎuí+>¼Ž™&V­è*G|²Ã!Ÿªv~€XTŒ ÚUUjêMð+†Òði®‚¾ÒõN{}œ¹nÆê,××.ð´aCO ³7È2¦á`É`f½#6õWÒ0â!¬¥çÇé€SòÜ£KӗÕË §T}HÒî®ãU‰;_Žak3tðF›î·„ïsfBZ›0÷êZ@†ÚnŸ`Gdä҇Ã#$K„ù<[3½oÛ8± Ò¹ˆþæ ¸”îåq$ DzZñП6M}‚Û«és€Ö1‚4‡ô'b Ç·í¡êöâ°Êž]¶E 7ÀøG Ï5ºò‘¹óÅ4§Gðš3 +;yӳ綒­NöfÂëͨ­MÁyrŧZrãXZïÓE)]Ìk뜉1÷¦Ø0‰ÛKáG9’®×s~ÎPýt¢Ž¸ DÓM)C¨ï¡?¥Ç+¶œ‹.×úIˆ›SI5>3én +çM­ña$'öxØ ¥0:ÁŸž#§—R@×u*s÷jkÏœß̘ƒh-Žz_Sçt/3ï¤_fg2õYxɑ‡~xèÙLb[òðÙ*fúæ<1­ŽJd;¹oe=Y‚ý·¬CU`¤eÓSøa÷= +5Sju¬+ …aeJÕ x qÕGøÔɎáøê:ƒ›ÐÆøف¯> ¢ê«»IƒªsÏhȸä¡þìK¬u æùüݦŒ* Nû’žébÿ gû>ÀmÆ/'Å´¢™¯&'¨Â‹Vþo%+TNEJ‰CMêLÂ[ hҌƒ§Iõõ&¹Ñýfp»>ÏÊ÷›™Q6”™•-éDÚÞ·"Ý +G° ғñ-Ò©HuZÛSêÔ3)B~Ã(ú9o‰«œÓ©vQØîŠ}¥ÄHd˜º ²ê\EóQ¬ðýë§úcœÚ“Žb®¤³]„›1kŒ ¼ø¤”7ƒ™¹é¡"PQP.äs%ýŸ¥Û‹ÐÉI>ùÒ£ÍÕ`æOœ-êv%,®A†§1^•× ‹ºw<ø/Â~É¿yÓk¨76ÊòðòŽe¸`Dºu øUŒ -I¯³ì?EñÉr‰9WïúF"ý“¬P;…N3žó…³.Ãaہ‡AÁòڏ漫B)l €|Œe³÷ÃO® 7NIP¾ÀՎ<, hl„¥þ†0Çæ¯ \=¥Þ¼WDÖ¥Ý6=op&Ñ=å8‹RÚ}’e]úÔ?=Ð, þT›\s\­·è\e›ºêJ<<Ï劙ö ú…]â½{Ãvê—Ê7oyhñKTïé-ށ(p15³Œhw^‡[×ùÕáan†Î`qÌ®”†~q /t4@Ê凜 +¸­¥O¤«]¥(‹÷  .·ËàŠ½Æö P—øñ젓¢ú‰"P1s(˜a/ÒEI²Ûfs%æw|Ú+Ñ/-á; ñI„](+#¦a…Îc^ª–áÍá°Ð“€Ó^’Gæ–×Po›×õ:³€7G€ðMœaÐg µ’Oð†×esù&1"! »h ¡ +‹z ó+ç2Œ>CUyçj²«`…ã©K»Ó‘®›svqKr–¦âÕÐñA– §!^b&´ìÇñls‰c‹ÔwŠNnn”wêÇÀ⃑PâÃôàf‚浀“‹7҉U1E˜_µE~as( Z®bR…¡¨.¯ß€!9ñ %‚zŒÃ[@,ìkT.‡ê7qºë3ò LÔ¬›~ÍÒn°ýωÈyØ×r®¤Áã˜v뛷ðšõo¤TYË@ÏÌAŒ\dô:a`>¥„¹Ÿ,Zc!ghRÊexË“cá‹å5æ0>ÀT6ØbèʃDG g;“Á˜Á +وU¤(`ŒH9`.Q)µEø 畋•ÑêI³;ª¢—:“¼Hb +w‡íԞ +ò© S ëâ,&*ÜûšÔ§™:¦‚Ð'ª éäU€g:Yœ ·S;d͙P؄MÅ$+[0Šb’Ìo­=ó[÷à\U~­\4Äk½¾¾n؀ïŠëjè­áÐO‰êš;ðÙ dn¾ñ7Päv ºÇžÚf‰·-cà£Z3àî@íD̦X#H‰§FƒËWYӇÞgRÕÑT§•2Œ&ë.ÿcÎ5BLëh·N’ +·’]:_Û=_¦‰¾ödߝ¥ZÄw^ÐÑ,¼ø6<Ž‘eBÏÐŽ ˆ :G„âCÜÅãÃkX;bøàvr|€ÍYó®4Gû®ŠL €1ë_†–W!ì,hªÜYˆª˜€@yµ ÞÂZŽZ÷±oP# ÔUgH¾“æ"˄ܧC÷Ýd˜à°#&hÐAš´<ðñǵ™ad—(ºÉ +ƽ…“HJT %¿\g½©€ÌEA“í±Ž¤vÑÔb˜¦¾#Í SíˆÈMO[àdyD´á„Uª@F-3àF…ýZGÆá7®Wƒû[߸m—Â$;¢’›0N‡£ +Žºl.ie²´ô®½iÙäÞL…g¯²E_ÝoéÑè1I£nUzDÒJn‡¨IIS¬cÇ–4ã—é1IÃ~Ír’¦ºŽ’ÕvUJøpœà$mà3ô&n¢ ±l(íúzْîú¼U¨’É6M·)‹F ÒÜd×åÉ.ÝWç¾r#vAäx<ґœ>îT!›ÌF¾dGröÌs„_·D) Šiw͑\¬F\iÄ!êÄù‹tÎ}r4ü:&ƒ×ǖ„ÉÒjåÁ_¤%Û!݈~E´DdÄí˜ê}ö‡Äbj8DÜd˜¦bi¢ëð¦ä'»JÕ9åcü¯¹JœÿµÚLÐ[<܄lMQ>Žß®ºÓ1밓>³¥ÔgØxtÖÚQ£7®:؋U˜?Ä÷`€¨µm­µgªhmæØTkˆTz̬3ŽÚ® —¿*Gš«Esq¥8lÖÞ +½ôjȂ7¸õ¼ƒ]/éOÔþwvM¿ç2É®•¼ tNm¼í/X%pݵÌÙ­8Ðk0þê÷6#ÁT¢iý2›õõâ¡g3™Ò½L:p[ÄË6邮 ^n›YCEmÕÓ;š“|z·WŒ/y(Oº»ãgÍxF¾WénPÜK|Ø6ýÉDoõ™fMÖ»F»Óou®"2p«>Ùså8>øÞƱJB#òЦóÞ}AÆ¢•æ–)&ª ïRŒô Jí<##LÓió³%FÛ,J—ãrn ÒâMQd¢ÙO ¨`§Só.ße²íT½ÞYC™kí ù­Qoš@l&LËq´ü;­Î7O0@ û./ø±¡ìû B ga¿vÄ|õx•(†ôÈ¡$*˜òfƊx?cžðveW¬évcóu3A£˜~ÁÞP][ÑR&c±»cbõ`òŠzã±Ë68]‹…ƒ0ÇP’£ÞY·Ð…–®D¨æƒ™®@ªˆ†¥Ý.}àDßM ¼¨ÍŠÁƒîºô!²ÀßqY“ æ|^³îCL›éÁ/“|m,ÀMû¨ãè…âùq!_ÍY [˜j06nð€ÙêÍê;a+ë\Ùp?1*裂¯9—W@ï{ڝ_ wîÃ;–­;è6N8 +p³ŠŸWIk—Ëü$TîH#ä?m×ZÏÁ }5[tc®ž6?;{­­5¨ƒ§Æw­a¼$`âZ ¦÷uà§7ø©•hCk÷Û[ðk‹JpÓ¥:.?NCd!L‘cÄ Òç_‘MÙ¸|ZMvúžzˆv'{¾Ba’äT’¡£y©¤XȽª†C*C)¸ü563aÒ½e¢Zã®i .óЧ}­¡3vi U[žGŠ;ÁiŒR;ä x@uwp&g¯±¬PÜQÎT²ß.HwÈÙZЂ,L»Iò7?™µ…J,GÙ"0NÊD‘® Îz±.£!TIxÞ‚^ ¿˜ÂÓFíQ èˆH&…؝†7¼;x.0Ûj©‹Y²Äpšñ2e7Ò®pÇÅ òà S0p˜€­ƒ[ÿ¸5f֝€ÊÊâp_ :wÓ’Z—¡¼ôíí1À„´ñyz ¢7¡šŽÐEBýÜ<ð1g…|áo¬ïÄ°¢é'Om[¿NwP»6`!°çœ«Éa£@G|ÀrþŽàö×XRë0ª|!²”nOE@».ܖªYú²”ÅîN0²ÉWÎH3#TÄ_Uά²1¸ó6¨b´B˵AåYE<ÔÚö»Ì%ŽÁ¯M­m8íi­Ù}TkO¸&P%'èߦŽ}õP¹óÁ©i ˆù<5}ЊÔô-dPÓì²öwÕ4µSÈÛ!BjšxXMS)ö¬šf<•jÚ|©¦%’G€‘$«¡‡ÞVXçCðlt ih¬PùhÞ¢¡qè–$ўÈbV§¡aL–JºÏàihÆæ}‚Á›ÝÁÄ·`²Ž´ÀÖ…ÁÅÁe³ºD•qwœ”ëLe˜2é˜ÊQ°4#ZxÊfÀ'¥fæ<ÂÅ¡ƒ®wÜâù>9@T¿ (bBµ¶Ó³P»{í<¯0ÉÙCYñ=ÌZ#ŒA†~"P‘ YÏPßûàW„µÑÂOA@áõì2˜+>àDB"…ÍKg‚ºÏ6wn´‹k!KP]'a^v€ÒÕÙT)A-ØÉÑnL— ›ƒ0@@ +$bƒZۋgK¥0´L†JÏCI‰€Û,Ÿ…/Q·‰šÁW”³à(€·‹{Š½OC< ì`{‚i •¾“Òß6"Sgv~mð6ÒÕ¶¯U^7„O߀M¨ë\¦0ŒÜ +/‰»X.øÛÁék}{˜<Ü<½Ÿ²šY½…Në²,ðŽòx«•—ÄMíØÖé ys,b¥:é9½ëçÙÏÞ¦Ä'7þ?|ýni f Š`½#`T†€{â'ð‹ž*–/BÓ¥‘ì[h+PÓ +←Œ9{&ÆÅb êd &Ä·¤ú=XG{ã2¿˜^å™è `î¿wy1Áì&©uhøqÁlaò8cQ#¾ÊE^˪KH){´Pú^¤ÎZ~¾J¤²4yÚÐ4S LñTÅJé#ˆq)û@®{†§dyàç„Ù¡-Q‰óc]ÂÉÙSÈ£gí)çX{=ub‹´>/³Ñq¦,ZDPŠ"ZG„Ö¬h úü¸¨Šƒƒ†ù~¡€ÒàƊ,º5{±”Y=yÊf14¦ b#Aç>œâà" mâeðÂÐrvæ~áf†”8Deø)ÚÿŠ d˜/aÊ·à›¦3T‰¤«Úü5Â7ÃPÕ{AE6(R°{ý]‰Ñ— +X @³0Ü)tQÔ7q³ždµ(4»1Ò¥‘öÉÎE‰í´ÖbÔ4¼:DZs&‰EdŽk ÝtÄ®³Ñ»+èkÊCÀ9û&ŽÍ?û!êfY%DÃü4öL 0zÊ>°ó |,š¾ÈüòL0+8Ç@ó&±p?óîȦl¼c}*Â<È; Ámìû°RAöÏã÷<¨á(§fHÁt¢*uˆ\=Q+'K+äM•^ò€J ÒjÚVÞRP¼©=Í«ª“>€"–‡ ªâôÕ&ªÞÃ~Aë´¬^ÙÓÌv74n<Þcσ8="݁‹‘¥†›ØDÌÇÊKÛNŸ8QMÁŒ®¶Éåã“wH Tº¯ŸàO· 3=>qöÁ/W^ºáonQÊÝ¢jfÔê¦ÒV¿9“!Ë-?½~<Àû zh‡ôÐé"§˜>ž"Ò¥ºz>a¢ŒÛ ÃKàNS¥Æ{(ä]x(ƒÛ•¾…:XÍk„¬ía¤ÙJ+b0—ø‡åt·Hd$Œqí'¨¡ê‚'„½Û€h…óÎUç䠜h`1 ˆY9Rg£ÝKæŒúRÓôQ\¸£èØU4båý6ÖåwM¡óL@§LÖÔéí†Ê×Ê¥FëÄLt”:ځûàVuø t õ»¬ðÍí¥ÛÁD>¶Tn*}ÄD¶‚!ÆWÙ&F‚=ЫêÞþ7à|ø.ÏôÇY;oæ‡Êaµ\ýþ±iþ iþq&ò8Þüm3‡ù¼1ÿÏSz;=ÿÌO‚œ‰z*Ÿ÷{Òóév6ÿC/èqRa§Eˆvo]rñnJc¤ì:÷R‹ŒÓ ¬íWj»Æn3ÂKµ`Üÿ³ûT´ß”;Úà×.…Vá¢?G ãØò’ž’gÒZ.µEÚ¹_Q# %àhÍkqçqvæ½"òÅâζe|ç àšŠãªDgUÁÞèÓ~'ÜԈß p‹ù öð >ˆÁ‹ÜIÎÝt\•è¬*Æ1öqU¢³ª­¬â¸ªñ)À,è>3Fq}M+nåsK0 ÝŒ1ÏòNþÑ*Jvƒ +£AÜ^¥Òn ¦\¬©_ßã\åCtÔ)ø-ƒ 5 㮦×0¤á§g»èŽ +ß÷Š:36tt$øÚDõZ¨r¾÷]ì!UVžA¡»%îl­‘À+îA¦¥ã°ÝÂÿ¾ºëCŸÈÌíú0ÇýÑUJÕG´TWÉøBß=nœ7ÒùYD{™Ð „‹±y3|aα»ÙޏùB6© ul£5ö¤é¤¥ÒÁÐÙ +àS§¦É€ˆò¯É؅¶ƒ¨/37ªƒßu UiGP‚¯æp¦uc> 8™›pÉBàÁÌÅ{0к†ÌòEŒÊ{æT®õ—ç6ÎæEê˛©Ð[zr¹Üj]ãr+NÞLi‘9 0مKðg>͸Á¦tôåôí¾hŽçÔÊXÌѐ¯eו3£òk€±.]†áч²VxÆק—‹tð¦Ô”Œ­°7ŠVËgŠ•&ik H !Û­ù­g¢•è9ølŽÊâ1¯6Q­ý·úk@¸É+o¼ ‰Ç…€þ–ñÂl£þeㅯÓþ¢ñ‚,*<÷WæÄqê|TîàTAZ˜2’œJxºŽ$×pç þM$9Kø«Hr ulò/#Ééd +í_F’k.I®xèd·oý»Hr6yïï"ə使Œ$×pÇæþM$¹†¶û{Hr BÛ©?ÞàN$¹Fÿd$¹æ>Hü­Hr‰éù7äšÊw"É5B òßB’2Lþ—‘är’öd$¹¼¤=I.%iIÎJÚßE’‹$ío!É57¾ð’\Ã@âÿ.’\ÃAâÿ&’’`ò¿Œ$×\…Ä?I®á ñIÎ_¤ÿ"’œ²Ó®!ÚF’3Zà/#É52ø'#É%Tçß@’sYb$¹ð¤Rw݄[×>#ôMŒÛYþåâiÜp¬7*AÞýì¢Ë¨ðã—Ó^»Çad>á&´¯E{Á¼³¤¡ì‰Ø(ç‚mÀהƒy-ãd]|†åo^¿Ø˜ëÅVè#û "2»Ô’}†óûFißøGþeËùÿfã?XºÙcí¡Nm +C•D¥”CÅ'À½e)Ü +}d”hU[¡ìƒRá•û–÷ïƒjþQ½úÈ>(ë¼¾j}`TÃü¯o…>²z±ñxõ…»öA)ISµúÈ>(³U§6šxg(é´¢‰w†5ÿÜM¼3”ÈO QM¼3”H¥†Ü°‚ÑÑ<ŽÉß³üü +~ªÏOç*â&çËÕoiüï9Xnð?Ô? üƒÿ'ßàÓ¸ýÄϟhæ›ùEEë›ín><¬–_'™–š0‡ßãvù<æ?Îúé°ú]þ1%“‰)`im{ʅ}Âÿ$s‡ßQ9ÜåwxqÌÏþ@^¨è~rµ¤Æi8ÝnÎ?W‹ê™Ë‰^{ü~7l• ‡ý @Ê躨4ÿ3û¦Ê&ÖƛÍ͍Ä].–ƒ<2üó}}Råqyqö— I<ª† ‚ûz{K@®†ïãӗš&—’´úÚ)»]BŸ`<}‚Éê“Äï/-›Ç?¦Tå­Þ¨5S|åíìRÏðªÿ“ðùµ€CZˆÑ?ð/Jš’Âþ8aÖ́o¡¯ãŸyþw6ÿOú‡úi{ø7ûl-|±¹IŸáDàÝƒy¡ÁóÄ_KÜWwH®)*-þNÿeÆ©c‹Ágjû»XýuǶøㄽKüžVãÍj|„š‚J”‘ã6Ë)ÐÖhГù¼Åø&NáJœ"ÃëñA‰û¸›@ŒÀ±€ÃE¸ÁdôÑ÷…ŠúŠ9€|=êó€ô#áò:Ü^T®˜ßá#hHÔJ1Hº›Œ +unS¡Ïcôí-xlL¥1q{<ÌÍJ%R9´Œ¡Ï<ùcŠJüôÿ¸Tº9@€îà ?^—¨SjÀu€úw9<­ã„s`@·÷Ñë ÆóBƹ˜Ïƒdõ²VE¡ü/—Éÿ»"éV Sà1îÁ©éN¯š.æð`žÅs ‚ìonÁoÔ{nÄñ‹ºGØ> ØCÿe£pk¢²ö¹Ýa‡úՏc8e\¹ÐÔf¥{=@wSfˆ0: ø ½ˆù)]rQÛÿç!m?½¾—óÆa¼Ú@ëiyÿÇüϘ2mæ;ðèÏò0?‚!™ÿ9~mÿ/±/ß®’Ñüó7íXP +endstream endobj 5 0 obj <> endobj 22 0 obj <> endobj 40 0 obj <> endobj 39 0 obj <> endobj 67 0 obj <> endobj 66 0 obj <> endobj 77 0 obj [/View/Design] endobj 78 0 obj <>>> endobj 75 0 obj [/View/Design] endobj 76 0 obj <>>> endobj 50 0 obj [/View/Design] endobj 51 0 obj <>>> endobj 48 0 obj [/View/Design] endobj 49 0 obj <>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 95 0 obj [93 0 R 94 0 R] endobj 118 0 obj <> endobj xref +0 119 +0000000004 65535 f +0000000016 00000 n +0000000248 00000 n +0000042339 00000 n +0000000006 00000 f +0000183270 00000 n +0000000008 00000 f +0000042390 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000016 00000 f +0000184311 00000 n +0000184342 00000 n +0000000017 00000 f +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000023 00000 f +0000183340 00000 n +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000032 00000 f +0000184195 00000 n +0000184226 00000 n +0000000033 00000 f +0000000034 00000 f +0000000035 00000 f +0000000036 00000 f +0000000037 00000 f +0000000038 00000 f +0000000041 00000 f +0000183479 00000 n +0000183411 00000 n +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000047 00000 f +0000000052 00000 f +0000184079 00000 n +0000184110 00000 n +0000183963 00000 n +0000183994 00000 n +0000000053 00000 f +0000000054 00000 f +0000000055 00000 f +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000060 00000 f +0000000061 00000 f +0000000062 00000 f +0000000063 00000 f +0000000064 00000 f +0000000000 00000 f +0000000000 00000 f +0000183639 00000 n +0000183571 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000183847 00000 n +0000183878 00000 n +0000183731 00000 n +0000183762 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 +0000044681 00000 n +0000044351 00000 n +0000044281 00000 n +0000184427 00000 n +0000042772 00000 n +0000065709 00000 n +0000065596 00000 n +0000043349 00000 n +0000043716 00000 n +0000043766 00000 n +0000044563 00000 n +0000044595 00000 n +0000044445 00000 n +0000044477 00000 n +0000044819 00000 n +0000044846 00000 n +0000045310 00000 n +0000045583 00000 n +0000045653 00000 n +0000045928 00000 n +0000046032 00000 n +0000065784 00000 n +0000065985 00000 n +0000067021 00000 n +0000074284 00000 n +0000139874 00000 n +0000184459 00000 n +trailer +<<1F85C3F3F3281849A05EE2E218B76CF0>]>> +startxref +184640 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_black.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_black.svg new file mode 100644 index 00000000..b61a1330 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_black.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_black_512.png b/plugins/net.mograsim.plugin.branding/raw_files/icon_black_512.png new file mode 100644 index 00000000..25c717c9 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/icon_black_512.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png b/plugins/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png new file mode 100644 index 00000000..18b26e33 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai new file mode 100644 index 00000000..bf34ead9 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai @@ -0,0 +1,1441 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 6 0 R 33 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_blue-orange + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T16:29:46+02:00 + 2019-06-22T16:36:11+02:00 + 2019-06-22T16:36:11+02:00 + + + + 224 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Ann5Hfmx9aWHyprs3+kqA mlXkh/vAOkDk/tD9g9+nWlev9oOxuG8+IbfxD9P6/m6Ts3XX+7nz6fqe25yDu3Yq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7aztZru6lWG2gRpJpXNFVFFSSfY ZKEDOQjEWSiUgBZ5PF/Ln5mXPnH84tOhti0WhWaXQs4Dt6jei49dxtuw6A/ZH051uq7JGl0Eid8k uG/Lcbfjm6XDrDm1IA+kXXy5vAUd0dXRirqQVYGhBG4IIztiLdC+m/yZ/NVfM1mui6tIBr9qnwSN t9aiX9sf8WKPtjv1HennvbvY/wCXl4mMfuj/ALE/q7vk9L2drvEHDL6x9r1DOcdo7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kKCzGgG5J6AYq+afzp/NY+YbptB0aX/c HbP+/mX/AI+pVPX/AIxofs+J38M9A7B7G8CPi5B+8PL+iP1/2PNdo67xDwR+kfalf5C/+TM07/jF c/8AJhsyfaP/ABOXvj97X2X/AH4+P3PPc3rrlexvrywvIb2zlaC6t3EkMyGjKymoIyvJjjOJjIXE soyMTY5h9W/lZ+ZNp5z0ekvGHW7NQL+2GwbsJo/8hj2/ZO3gT5r2x2VLSZNt8cuR/QfP73qtDrBm j/SHNnGadznYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/PH82OXr+U9 Cm+HePV7yM9ezW6Edv8Afh/2Pjnaez/Y3LPlH9Uf779Xz7nRdpa7/Jw+P6v1vC87J0T0L8hf/Jma d/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FUx8veYNU8v6vb6tpkvo3ds1VPVWU7MjDur DY5j6nTQz4zCYuJbcWWWOQlHmH1x5D88aX5w0JNSsyI50ol7aE1aGWleJ6VU9Vbv8655h2j2fPS5 OCXLoe8PWaXUxzQ4h8WR5gOS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkv51 fmuNBtn8v6JN/uauFpdXCHe2jYdAR0lYdPAb+GdP2D2N4x8XIP3Y5D+cf1Op7R13hjgj9X3ftfNp JJJJqT1Od8847Ch6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxVkHkjzpqv lHXI9TsDzT7F3ak0SaImpRutD3U9jmD2hoIarGYS+B7i5Gm1EsUuIPrjy15k0rzHo1vq2mS+pbTj cH7aOPtRuOzKev8ATPMNXpZ4MhhMbj8W9bhzRyREo8k0zGbXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwD82vzOt/J+l/VrNll1+8U/VYTuIkOxmkHgP2R3PsDm77F7JOqncv7qPPz8h+l wNfrRhjQ+s/i3yvdXVzd3MtzcytNcTMXmmclmZmNSzE9Sc9IhARAAFAPLSkSbPNSybF2KvQvyF/8 mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVZn+WH5j33kzWQ55TaPdFV1C0B7 dPVjB/bT8enuNR2t2XHV465ZB9J/QfJzdFqzhl/RPN9Y6bqNjqVhBf2My3FncoJIZkNQyn/PcZ5p lxSxyMZCpB6uExIWORRGVsnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8xPP2m+TNDa9uK S301U0+zrQyyDufBEqCx/iRmy7M7Nnq8nCNoj6j3ft7nF1eqjhjZ59A+Sda1rUta1S41TUpjPeXT l5ZD+CqOyqNgOwz07T4IYoCEBUQ8nkySnIylzKCy5rdirsVehfkL/wCTM07/AIxXP/Jhs0XtH/ic vfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV6X+Tn5pyeVr8aVqkjP5fu3FSd/q0jbeov+Qf2x9I9+e7 c7HGpjxw/vY/7Id3v7nZ9n67wjwy+g/Y+n4pYpYklidZIpFDRyKQysrCoII2IIzzsgg0eb0wNrsC XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk/m3zVpXlfRJ9W1J+MUQpFEPtyykHjGg/man0dTtmXo tHPUZBCHM/YO9pz544o8UnyN5w826r5q1ybVtRf43+GCAH4IYgfhjT2H4nfPT9DooabGIQ/tPe8l qM8ssuKSSZmNDsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdir sVdir2j8kPzY+oSReV9dm/0GQ8dNvJDtCx6QuSf7tv2f5T7dOS9oOxuMHNiHq/iHf5+/v7/v3XZu u4f3c+XR9CZwz0DsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLHStOudRvpPRs7SMyzyEE0VfYbn LMOGWSYhEXKTCcxGJkeQfJX5kfmDqHnPWzdS1h063qmn2dahEPVmp1d6VP3ds9O7K7MhpMfCN5n6 j+Ojyes1ZzSvp0Ylm0cR2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f+Jy98fvdj2X/AH4+P3PP c3rrnYq7FXYq7FXYq7FX0N+SH5sfpKKLyvrs1dRiHHTbuQ7zoo2icn/dijof2h79eF9oOxvDJzYh 6f4h3efu+77uh7N13F+7nz6PZs5N3LsVdirsVdirsVdirsVdirsVdirsVYn+bH/kudf/AOYU/wDE hmz7G/xvH/WcTXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv +/Hx+557m9dc7FXYq7FXYq7FXYquillilSWJ2jljYNHIpKsrKaggjcEHAQCKPJINPqH8nvzTi812 A0zU3CeYLRPj7C5jXb1VH8w/bH0jbp51252OdNLjh/dS/wBie79T0/Z+t8UcMvrH2vSc592TsVdi rsVdirsVdirsVdirsVSbQvNFjrV/qVvYn1INPaOM3ANVkduXLj/kjj175h6bWRzSkI8oVv3ufrOz 56eEJT2M7Ndw2Sz82P8AyXOv/wDMKf8AiQzf9jf43j/rOl139zL3Pj/PU3kHYq7FXYq7FXYq9C/I X/yZmnf8Yrn/AJMNmi9o/wDE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2KuxV2KuxVE6bqV9pl/BqFh M1veWziSCZOqsv6x4g9cry4o5ImMhcSzhMxII5h9Y/ll+Ytj5z0b1fhh1a1CrqFoD0J2EiV/Yen0 dPn5n2t2XLSZK5wP0n9HvD1ei1YzR/pDmzLNS5jsVdirsVdirsVdirsVeXfmn+YPpLLoGky/vWqu oXKH7I7xKR3/AJvu8c5ntrtSrxYzv/Ef0frey9nexeKs+Ubfwj9P6vm78i/95dX/AOMkH6nx9m/p n7x+lfa/6sful+hkv5sf+S51/wD5hT/xIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C /wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXYq7FXYq7FU18seZdU8t61b 6vpknp3MB3U7pIh+1G47qw/zrmNq9JDUYzjmNj+LbsOaWOQlHm+uPJPnPSvN2hRapYNxbZLu2Jq8 MoFWRvH2PcZ5f2hoJ6XIYS+B7w9ZptRHLDiCf5hOQ7FXYq7FXYq7FWB/mX5/XRLZtL05wdWnX43U /wBwjD7X+uR9n7/Cuj7X7T8EcEP7w/Z+3uel7A7F/MS8TIP3Q/2R/V3/ACeHszMxZiWZjVmO5JPc 5xZNvogFPW/yL/3l1f8A4yQfqfOq9m/pn7x+l4j2v+rH7pfoZL+bH/kudf8A+YU/8SGdz2N/jeP+ s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4nL3x+92PZf9+Pj9zz3N66 52KuxV2KuxV2KuxV2KuxV2Ksl8g+etU8na4moWhMls9EvrMmiTReHsy1qrdj7VGa/tLs+Gqx8Euf Q9x/HNydLqZYZWOXV9b+X9f0vX9Jt9V0yYTWlyvJT0ZT+0jjsynYjPMNTpp4ZmExUg9biyxyREo8 imGUNjsVdirsVYt5+872/lrTuMZWTVLgEWsB34jp6rj+UfifpprO0+0Rp4bbzPIfpdz2N2TLV5N9 sceZ/QPP7ngF1dXF3cyXNzI0txMxeWRjUsx3JOcJOZkTKRsl9Ox44wiIxFRClkGb1z8i/wDeXV/+ MkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/wCS51//AJhT/wASGdz2N/jeP+s8Frv7mXufH+epvIOx V2KuxV2KuxV6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxV2KuxV2KuxV2K uxV2KuxVnP5V/mXd+TdW4TFptDu2AvrYblT09aMfzqOv8w28KabtjsmOrhttkjyP6D5fc52h1hwy 3+k8/wBb6tsb20vrOG8s5lntbhBJDMhqrKwqCDnmuTHKEjGQoh6qMhIWOStkGTsVSXzb5psfLelN e3Pxyt8Nrbg0aSTw9gO5zD12tjp4cR59B3uw7N7Onq8vBHl1PcHzxq+r3+r6jNqF9J6lxMasegA7 Ko7ADpnAZ88sszORsl9S0umhgxiEBUQg8pch2KvXPyL/AN5dX/4yQfqfOr9m/pn7x+l4f2v+rH7p foZL+bH/AJLnX/8AmFP/ABIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc /wDJhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXoOi/lhP5g/LWTzDpKtJqtjdTJPaipM0C IjfAP50qdh9r50zRZ+1xg1fhT+iURR7jv9h+x2GPRHJh44/UC8+6ZvHAdhQ7FXYq7FXYq9S/Jn81 n8t3i6Jq8pOg3L/u5WNfqsjH7Qqdo2P2x26+Neb7d7G8ePiYx+8H+yH6+75O17O13hnhl9J+x9Mq yuodCGVhVWG4IPQg558RT0reBXz/APmlfXVz5zvoppC8drwit0PRE4KxA/2TE5wfbOSUtTIE8uT6 f7PYYw0kSBvKyfPdiWap3bsVdir1z8i/95dX/wCMkH6nzq/Zv6Z+8fpeH9r/AKsful+hkv5sf+S5 1/8A5hT/AMSGdz2N/jeP+s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f +Jy98fvdj2X/AH4+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8WK fnl+U/oNN5r0KH9yxL6taRj7LHrOij9k/t+H2vGmy9n+2brBlO/8J/R+r5OL2loa/eQ+P63h+di6 N2KuxV2KuxV2KvcfyM/NZopLfylrcpaOQiLSLpjUqxNBbuT2J2j8Ps+FOO9oexrBz4x/WH++/X83 edma6qxy+H6v1Pe84p3z54/Mr/lONV/4yJ/yaTOA7X/xmfv/AEB9T7B/xPH7j95Yzmtdu7FXYq9c /Iv/AHl1f/jJB+p86v2b+mfvH6Xh/a/6sful+hkv5sf+S51//mFP/Ehnc9jf43j/AKzwWu/uZe58 f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc/8AJhs0XtH/AInL3x+92PZf9+Pj9zz3N6652KuxV2Ku xV9N/wDOOf8A5L+T/mPm/wCIR5557Uf40P6g/S9N2R/c/F6gyq6lHAZWFGU7gg9QRnOg07R8zfnP +VLeW7ttb0iInQbl/wB5Gor9Vlc/Z2G0bE/Ae3Twr6D2F2x+Yj4eQ/vB/sh+vv8Am8z2jofDPFH6 T9jy3OkdW7FXYq7FXYqnvkH/AJTry5/21LL/AKiEzC7S/wAWyf1Jf7kuRpf72P8AWH3vs/PJnsnz x+ZX/Kcar/xkT/k0mcB2v/jM/f8AoD6n2D/ieP3H7yxnNa7d2KuxV65+Rf8AvLq//GSD9T51fs39 M/eP0vD+1/1Y/dL9DJfzY/8AJc6//wAwp/4kM7nsb/G8f9Z4LXf3Mvc+P89TeQdirsVdirsVdir0 L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/wDnHP8A8l/J/wAx 83/EI8889qP8aH9Qfpem7I/ufi9RznHaKN9ZWl9ZzWd5Cs9rcIY5oXFVZWFCCMnjyShISiaIYyiJ CjyfKX5qflrd+TdX5QhptDu2Jsbk7lT1MMh/nUdP5hv409K7H7Vjq8e+2SPMfpHl9zyuu0Zwy2+k 8v1MGzcuC7FXYq7FU98g/wDKdeXP+2pZf9RCZhdpf4tk/qS/3JcjS/3sf6w+99n55M9k+ePzK/5T jVf+Mif8mkzgO1/8Zn7/ANAfU+wf8Tx+4/eWM5rXbuxV2KvXPyL/AN5dX/4yQfqfOr9m/pn7x+l4 f2v+rH7pfoZL+bH/AJLnX/8AmFP/ABIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+ TM07/jFc/wDJhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/AJj5v+IR5557 Uf40P6g/S9N2R/c/F6jnOO0diqX+YNA0vX9JuNK1OETWlyvFh0ZT+y6HsyncHL9NqZ4ZicDUg15c UckTGXIvkfz75G1Tydrj6deAyW71exuwKLNFXr7MOjL2PtQ56f2b2hDVY+OPPqO4/jk8lqtNLDKj y6MbzYOM7FXYqnvkH/lOvLn/AG1LL/qITMLtL/Fsn9SX+5LkaX+9j/WH3vs/PJnsnzx+ZX/Kcar/ AMZE/wCTSZwHa/8AjM/f+gPqfYP+J4/cfvLGc1rt3Yq7FXrn5F/7y6v/AMZIP1PnV+zf0z94/S8P 7X/Vj90v0Ml/Nj/yXOv/APMKf+JDO57G/wAbx/1ngtd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJ mad/xiuf+TDZovaP/E5e+P3ux7L/AL8fH7nnub11zsVdirsVdir6b/5xz/8AJfyf8x83/EI8889q P8aH9Qfpem7I/ufi9RznHaOxV2KpB538maX5u0KXS78cW+3a3IFXhlAorr0r7juMzuz9fPS5BOPx HeHH1Onjlhwl8jeZvLeq+W9ZuNJ1OP07mA7Ebq6H7MiHurD/ADrnp+k1UM+MTgdj+KeSzYZY5GMu aV5ktTsVT3yD/wAp15c/7all/wBRCZhdpf4tk/qS/wByXI0v97H+sPvfZ+eTPZPnj8yv+U41X/jI n/JpM4Dtf/GZ+/8AQH1PsH/E8fuP3ljOa127sVdir1z8i/8AeXV/+MkH6nzq/Zv6Z+8fpeH9r/qx +6X6GS/mx/5LnX/+YU/8SGdz2N/jeP8ArPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz /wAmGzRe0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45/wDkv5P+Y+b/AIhHnnntR/jQ /qD9L03ZH9z8XqOc47R2KuxV2KsM/M78ubHzno3pjjDq9qGbT7s9idzG9P2H/Dr7Hbdk9qS0mS+c D9Q/T73D1ukGaP8ASHJ8n6lpt9pl/PYX8LW95bOY5oXFCrD/AD2PfPTMWWOSIlE3EvKTgYkg8whs sYJ75B/5Try5/wBtSy/6iEzC7S/xbJ/Ul/uS5Gl/vY/1h977PzyZ7J88fmV/ynGq/wDGRP8Ak0mc B2v/AIzP3/oD6n2D/ieP3H7yxnNa7d2KuxV65+Rf+8ur/wDGSD9T51fs39M/eP0vD+1/1Y/dL9DJ fzY/8lzr/wDzCn/iQzuexv8AG8f9Z4LXf3Mvc+P89TeQdirsVdirsVdir0L8hf8AyZmnf8Yrn/kw 2aL2j/xOXvj97sey/wC/Hx+557m9dc7FXYq7FXYq+m/+cc//ACX8n/MfN/xCPPPPaj/Gh/UH6Xpu yP7n4vUc5x2jsVdirsVdirzT84vysj81WB1TTI1XzBaJ8IGwuY139Nv8ofsH6Dt06DsPtg6aXBP+ 6l/sT3/rdb2hovFHFH6x9r5glilileKVGjljYrJGwKsrKaEEHcEHPRQQRY5PMEUnfkH/AJTry5/2 1LL/AKiEzD7S/wAWyf1Jf7kt+l/vY/1h977PzyZ7J88fmV/ynGq/8ZE/5NJnAdr/AOMz9/6A+p9g /wCJ4/cfvLGc1rt3Yq7FXrn5F/7y6v8A8ZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/yXOv8A/MKf +JDO57G/xvH/AFngtd/cy9z4/wA9TeQdirsVdirsVdir0L8hf/Jmad/xiuf+TDZovaP/ABOXvj97 sey/78fH7nnub11zsVdirsVdir6b/wCcc/8AyX8n/MfN/wAQjzzz2o/xof1B+l6bsj+5+L1HOcdo 7FXYq7FXYq7FXjH53/lP+kI5vNGhQ/6fGvLUrRB/fIP92ooH94P2vEe/XrPZ/tngIw5D6f4T3eXu dN2loeL95Dn1eL+Qf+U68uf9tSy/6iEzre0v8Wyf1Jf7kum0v97H+sPvfZ+eTPZPnj8yv+U41X/j In/JpM4Dtf8Axmfv/QH1PsH/ABPH7j95Yzmtdu7FXYq9c/Iv/eXV/wDjJB+p86v2b+mfvH6Xh/a/ 6sful+hkv5sf+S51/wD5hT/xIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/wDkzNO/ 4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/wA45/8Akv5P+Y+b/iEeeee1H+ND +oP0vTdkf3Pxeo5zjtHYq7FXYq7FXYq7FXi/nH8p/wBHef8AQfM+hQf7j5NVs21K0jG0Dm4SsqAf 7rb9ofsn26dboe2fE0uTDlPq8OXCe/0nb3/e6bUaHhyxnDlxC/m9ozkncvnj8yv+U41X/jIn/JpM 4Dtf/GZ+/wDQH1PsH/E8fuP3ljOa127sVdir1z8i/wDeXV/+MkH6nzq/Zv6Z+8fpeH9r/qx+6X6G S/mx/wCS51//AJhT/wASGdz2N/jeP+s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv/kzNO/4xXP8A yYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxV2KuxV9N/845/+S/k/wCY+b/iEeeee1H+ND+oP0vT dkf3Pxeo5zjtHYq7FXYq7FXYq7FXYq7FXzx+ZX/Kcar/AMZE/wCTSZwHa/8AjM/f+gPqfYP+J4/c fvLGc1rt3Yq7FXrn5F/7y6v/AMZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/yXOv/APMKf+JDO57G /wAbx/1ngtd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJmad/xiuf+TDZovaP/E5e+P3ux7L/AL8f H7nnub11zsVdirsVdir6b/5xz/8AJfyf8x83/EI8889qP8aH9Qfpem7I/ufi9RznHaOxV2KuxV2K uxV2KuxV2Kvnj8yv+U41X/jIn/JpM4Dtf/GZ+/8AQH1PsH/E8fuP3ljOa127sVdir1z8i/8AeXV/ +MkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/5LnX/+YU/8SGdz2N/jeP8ArPBa7+5l7nx/nqbyDsVd irsVdirsVehfkL/5MzTv+MVz/wAmGzRe0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45 /wDkv5P+Y+b/AIhHnnntR/jQ/qD9L03ZH9z8XqOc47R2KuxV2KuxV2KuxV2KuxV88fmV/wApxqv/ ABkT/k0mcB2v/jM/f+gPqfYP+J4/cfvLGc1rt3Yq7FXrn5F/7y6v/wAZIP1PnV+zf0z94/S8P7X/ AFY/dL9DJfzY/wDJc6//AMwp/wCJDO57G/xvH/WeC139zL3Pj/PU3kHYq7FXYq7FXYq9C/IX/wAm Zp3/ABiuf+TDZovaP/E5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/nHP/yX8n/MfN/xCPPPPaj/ ABof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+ePzK/5TjVf+Mif8mkzgO1/wDGZ+/9AfU+ wf8AE8fuP3ljOa127sVdir1z8i/95dX/AOMkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/5LnX/APmF P/Ehnc9jf43j/rPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/AOTM07/jFc/8mGzRe0f+Jy98fvdj 2X/fj4/c89zeuudirsVdirsVfTf/ADjn/wCS/k/5j5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0dir sVdirsVdirsVdirsVfPH5lf8pxqv/GRP+TSZwHa/+Mz9/wCgPqfYP+J4/cfvLGc1rt3Yq7FXrn5F /wC8ur/8ZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/wAlzr//ADCn/iQzuexv8bx/1ngtd/cy9z4/ z1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVdi r6b/AOcc/wDyX8n/ADHzf8Qjzzz2o/xof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+ePzK /wCU41X/AIyJ/wAmkzgO1/8AGZ+/9AfU+wf8Tx+4/eWM5rXbuxV2KvXPyL/3l1f/AIyQfqfOr9m/ pn7x+l4f2v8Aqx+6X6GS/mx/5LnX/wDmFP8AxIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7F XoX5C/8AkzNO/wCMVz/yYbNF7R/4nL3x+92PZf8Afj4/c89zeuudirsVdirsVfTf/OOf/kv5P+Y+ b/iEeeee1H+ND+oP0vTdkf3Pxeo5zjtHYq7FXYq7FXYq7FXYq7FXzx+ZX/Kcar/xkT/k0mcB2v8A 4zP3/oD6n2D/AInj9x+8sZzWu3dirsVeufkX/vLq/wDxkg/U+dX7N/TP3j9Lw/tf9WP3S/QyX82P /Jc6/wD8wp/4kM7nsb/G8f8AWeC139zL3Pj/AD1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/5MNmi9 o/8AE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/AJxz/wDJfyf8x83/ABCPPPPaj/Gh/UH6Xpuy P7n4vUc5x2jsVdirsVdirsVdirsVdir54/Mr/lONV/4yJ/yaTOA7X/xmfv8A0B9T7B/xPH7j95Yz mtdu7FXYq9c/Iv8A3l1f/jJB+p86v2b+mfvH6Xh/a/6sful+hkv5sf8Akudf/wCYU/8AEhnc9jf4 3j/rPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c// 2Q== + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:73FE812EFA94E911B987F622BD994B0C + uuid:004ce5b9-fc7c-4b0d-93ee-bf4717f6614d + + uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:73FE812EFA94E911B987F622BD994B0C + 2019-06-22T16:29:45+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Cyan + Magenta + Yellow + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/Properties<>>>/Thumb 38 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 35 0 obj <>stream +H‰lK +Â@D÷}Š¾@:ý™O²5Š« âãÂ,Ôûƒ=ã' +20Ý5¯Šiw¶ãÀ¸ZL¬™L£ß½*Þ&h·ÆéWd?‚3ºã8CÑ3ô½K!)‰ö.-td]ÙÏp‚=È\ _0Ëd +"iA6I°ÉÞ§3Tåoݤ•ý%žð¿Í—1ûiÜä\+—Y;q%ê.S +)¼”w"³X35fÊñ“¸ýà Œ[>¤ +endstream endobj 38 0 obj <>stream +8;Z-Q9+lk"$jPWQ],\i6ZcXl0:91<&O?ajCF]t))bSU7-g/@oZJb=TD4`>/`f0_;N +8C70HZV1@\[_^QkYh(XZhc"omWBGXj"MjeZ8*Do-[FJI3=#Ahc:OcT?i2RIgeHAe+ +eTESII-RNAZO,\Bil_dEc,:DoOCXu,(2q'cVX^Jhe38'i1)g(1JrG!;\,&'M7RVCu +irj;VlI-Cj3d`.0dN +endstream endobj 39 0 obj [/Indexed/DeviceRGB 255 40 0 R] endobj 40 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 33 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 37 0 obj <> endobj 36 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_blue-orange.ai) +%%CreationDate: 6/22/2019 4:36 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%%DocumentProcessColors: Cyan Magenta Yellow +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%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: 1 +%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 45 0 obj <>stream +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 20905 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 +%524C4585FD6DFF7FFF0885FD6BFF5B0EFF0F08A9FD69FF850837FF080908 +%A9FD67FF8508090EFF0F080F0FFD66FFAF090F0837FF080F080F30FD64FF +%AF080F080F30FF310F0F080F31FD63FF310F08310931FF080F080F08095A +%FD61FF3009080F080F30FF310F0F08310F0F5BFD5FFF310F0F0F08310937 +%FF080F080F080F08097EFD5DFF5A09080F080F080F30FF0F08310F0F0831 +%090F85FD5BFF5B0F090F08310F0F0837FF080F080F080F080F080FA8FD59 +%FF7F09080F080F080F08090EFF0F08310F0F08310F310831FD58FFA90F08 +%310F0F08310F0F0837FF080F080F080F080F080F0831FD56FFA931080F08 +%0F080F080F080F30FF310F0F08310F0F08310F0F085BFD55FF3108310F0F +%08310F0F08310931FF080F080F080F080F080F080F085BFD53FF37080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310985FD51FF5B +%090F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F08 +%85FD4FFF5B080F080F080F080F080F080F080F30FF0F08310F0F08310F0F +%08310F0F080F09A9FD4DFF85080F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F08AFFD4BFF85080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F30FD4AFF +%AF080F0F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F +%080F080F080F080930FD49FF0E09080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F30FD47FF300F0F0F08 +%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F +%080F080F08095AFD45FF3009080F080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F7FFD43FF5B0F08 +%310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F +%080F080F080F080F080F080F85FD41FF5A0F080F080F080F080F080F080F +%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F080FA9FD3FFF850F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%37FF080F080F080F080F080F080F080F080F080F080F080F0831A9FD3DFF +%840F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310931FD3CFFA93109310831 +%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 +%0F080F080F080F080F080F080F080F0831FD3AFFA931080F080F080F080F +%080F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F0831085BFD39FF37080F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F +%080F080F080F080F080F080F085BFD37FF5B080F080F080F080F080F080F +%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F0885FD36FF310F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F08A9FD35FF5B080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08AFFD34FF310F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080908FD34FF5B080F08 +%0F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F31FD33FF +%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 +%0F30FD2DFFCFFD04FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F080F5BFD2BFFC2FD05FF300F0F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F08095AFD29FFBBBAFD05 +%FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30FF +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F7FFD27FFC2BABBFD05FF310F0F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F85FD25FFC2B4B4BBFD05 +%FF5B080F080F080F080F080F080F080F080F080F080F080F080F080F30FF +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F08310931A9FD23FFC9BAB4BABBFD05FF310F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F0831A8FD21FF +%C9BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310F310837FD20FFCFBBB4BABABABBFD05 +%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF +%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F +%080F080F080F080F085BFD1EFFCABBB4BAB4BAB4BBFD05FF5B080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F085BFD1DFFC1B4BABABAB4BABBFD05FF300F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F087FFD +%1BFFC2B4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F09A9FD19FFC9 +%B4BAB4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F08A9FD17FFC9B4 +%BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F0FFD16FFCAB4 +%BAB4BABABAB4BABABABBFD05FF310F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F080F0EFD14FF +%CAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F +%080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F31FD13FFFD04BAB4BABABAB4BABABABBFD05FF370F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F080930FD11FFBBB4B4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F30FF310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F5BFD0FFFBBBABABAB4BABABAB4BABABAB4BA +%BBFD05FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 +%0931FF080F080F080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F08095AFD0DFFC2B4B4BAB4 +%BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F31 +%080F85FD0BFFC2BAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F08 +%0F080F080F080F080F080F080F080F087F3009080F080F080F080F080F08 +%0F080F080F080F080F080F080F080FA9FD09FFCABAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%85FF0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 +%A9FD08FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F +%080F080F080F080F080F080F080F0885FFA9080F080F080F080F080F080F +%080F080F080F080F080F080F080F0831AFFD07FFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F85FFFF8508310F0F08310F0F08310F0F08310F0F08310F0F08310F0F +%0831095BFD08FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FFFFFF5B080F080F080F080F +%080F080F080F080F080F080F080F080F080F085BFD06FFCABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F080F85FD04FF5B08310F0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F080F087FFD06FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF +%300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF08 +%0F080F080F080F080F080F080F080F080F080F0885FD05FF31080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F0885FD04FFCABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F +%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F +%0F08310F0F080F85FD06FF37093108310F0F08310F0F08310F0F08310F0F +%08310F0F08310F0F5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD +%05FF310F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937 +%FF080F080F080F080F080F080F080F080F080F080F0885FD06FFA931080F +%080F080F080F080F080F080F080F080F080F080F080F087FFD04FFCABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F +%08310F0F08310F0F7FFD07FFA90F090F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABB +%FD05FF310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%37FF080F080F080F080F080F080F080F080F080F080F0885FD08FF7E0F08 +%0F080F080F080F080F080F080F080F080F080F080F087FFD04FFCABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F08 +%0F080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F +%08310F0F08310F0F85FD09FF7F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F080F7FFD05FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF +%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F080F080F0885FD0AFF5A09080F080F +%080F080F080F080F080F080F080F080F0885FD04FFCABAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F +%080F85FD0BFF5B0F08310F0F08310F0F08310F0F08310F0F08310F0F5BFD +%05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD0CFF3009080F080F080F080F080F080F +%080F080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD +%05FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30 +%FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD0DFF300F0F0F +%08310F0F08310F0F08310F0F08310F0F5BFD05FFBABAB4BABABAB4BABABA +%B4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F08 +%85FD0DFFAF080F080F080F080F080F080F080F080F080F087FFD04FFCABA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F +%080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F +%0F08310F0F08310F0F7FFD0EFFA9080F0F0F08310F0F08310F0F08310F0F +%080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD0FFF85080F080F080F080F +%080F080F080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BBCAFD04FF5B080F080F080F080F080F080F080F080F080F080F080F080F +%08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD10FF85 +%090F08310F0F08310F0F08310F0F080F7FFD05FFB4BABABAB4BABABAB4BA +%BABAB4BABABABBFD05FF370F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F080F08 +%85FD11FF5B080F080F080F080F080F080F080F0885FD04FFCABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F +%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 +%310F0F080F85FD12FF5B080F08310F0F08310F0F08310F0F5BFD05FFBABA +%B4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 +%0F080F080F080F0885FD12FFA931080F080F080F080F080F080F087FFD04 +%FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F0831 +%0F0F08310F0F08310F0F080F85FD13FFAF3108310F0F08310F0F08310F0F +%5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD14FFA90F080F080F080F080F080F +%087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F30FF0F08310F0F +%08310F0F08310F0F08310F0F08310F0F7FFD15FF850F08310F0F08310F0F +%080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD16FF7E09080F080F080F08 +%0F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B08 +%0F080F080F080F080F080F080F080F080F080F080F080F08090EFF0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F85FD17FF5B0F0F0F08310F0F +%080F7FFD05FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD18FF300F080F080F080F0885 +%FD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F +%08310F0F08310F0F08310F0F080F85FD19FF300F0F0F08310F0F5BFD05FF +%BABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F08 +%0F080F080F080F080F0885FD1AFF0E0F080F080F087FFD04FFCABAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F +%08310F0F080F85FD1BFF0F0F08310F0F5BFD05FFBABAB4BABABAB4BABABA +%B4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F08 +%85FD1BFFA9080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F080F +%080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD1CFFA9 +%090F080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF31 +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F +%080F080F080F080F080F080F080F080F080F0885FD1DFF85080F087FFD04 +%FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F +%080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F08310F +%0F08310F0F08310F0F08310F0F85FD1EFF7F080F7FFD05FFB4BABABAB4BA +%BABAB4BABABAB4BABABABBFD05FF370F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F08 +%0F080F0885FD1FFF5B0885FD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F080F +%080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD20FF31 +%5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD20FFA985FD04FFCABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F7FFD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F08 +%0F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F +%08310F0F85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F +%0F080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F +%080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F +%080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F +%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F7FFD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F +%080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08 +%0F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F +%080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F +%85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7F +%FD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85 +%FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F +%080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F080F08 +%0F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD +%27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F +%080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD26 +%FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F080F08 +%0F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD +%27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F +%080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD27 +%FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F +%080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F30FF +%%EndData + +endstream endobj 46 0 obj <>stream +%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´Ù243wdEÂÝ#؜áQBöµ;;’’Ì +c:’Ì,rɗهÙ[ý>U(`æG±9ӕ +34ÌÃ¥ÐãSÅßýo_ýöËë¯_ÿîîËp5ìž|ñwwxs÷ìÝë7?ݑ¼ûù‹ß½}÷¤ýæÇ»q¾ðÔõÏËS{òŸïÞ¼½ýê§üÝUÀooñþxsÿöÝý³W»Û»—òЏw?ú1~û÷ï^ÜÉï~õôw/¾»ûòõ›g¯¾¹»zvÿcÿ©ñøì<6ÿdš~2 㲋? óî«_ò‘g¯þøìíÛû¿Ü¡ÙPØêþõw¯¾¾õÍþõÿóÓ]šw_ƒwÿ˜"~ÿ÷¿¹{ûÐCW%-|òøúùw/ï^½ûêÍëçwoß^¿xýæíOw‡?K_~ùìùͳÝÿy÷âÅë?ÉÓ×?OOoï_ÜI§_>{·'ŽÐõÏÇééþ»û_ÿ껗¿»“ñ˜—‘ôð”õýÓ[©HêÄ¿IÏOþRH¿½{÷N¾Ošã@ÿægûþ+„Êò£ÿö•ôÿNZ|óow¯þûkÍo^ ÞÞ}™Æi‡ÿöÛ¼{ùí Tö}JóU’^ó¯þ‡ú°t‰~Æ«’—e÷凫y¤Ò¯F™“ݘ–«¥ØmÔîþx÷§Ÿî~õú՝ Ðõ›w¿Õيqô¿ö«ß|÷âîÍ?½º'=“¶èýòõ×w/äVÅí‹g–±ýמøÇgo¾¹{'“üúÅwï¸$‹·"³ð‹g¾Ã4ŽÖȯ¿½{õ¯ÿ™Ÿúå8Ía—Ç°d Æ4•Ý’ân,l$I;ãìíŽí¿V;ªBEµ‰Œ©ûJfó×oõÓúùéÏÞÜݦ8O»¢ÿa?®J÷ÿ¥þß>W:ÿîÝÝ«úý²¼¿ìËpõË_£Õ›W_^¿Ä<¼å¦¸“öe½xýý¶ýÀßIß}kÝ á©LÛWoî_¡â'_üJWž~õâ;ùåÏÞ¼þî۟¿úýë'_üHÄ?ß=& sûõî׿ûòƒló_={þ‡oîþrwÿü¯îÞݽÝíeݟ•­þíßS±ô÷ÍÝN+ïòGùû÷øû1ïï~/;²U Ôø¿CŽ/^ܽúòÿúîí³wyùúëï^Èoo^ýñîÅëoïvÏ^}½û—go¾}L_½xöêٛQ[èëÝýüÕ»»7ÏþíÝýw/ŸI£òÐ/îÿ(/>“ñ}T ²œ¾•QãK|fÝÚCt¿zTSÏÞýa·—üú­×~ýꛘÅï„=oGŒÑçSýoÿüòw¯_Ü¿}é•÷ÿ÷#¿T†õÕ¯_é'¿ùîívÿøúõ ¯ù—rdݽùöþÕÛ»›¯.¢ïýM5äŸk›çŠ&Ï^¼¸ÿæͳoÿpÿü\+ÿÕ~ÿûû»³]xÿQ«ë9§ê\«¿ýöî/÷Ï^œmñôµ¿¹Æl în¾¾Þy <øÌoÿôìÝó?ì~qÿ»7ÏÞÜß½g·b²ÿêkùÐß~wÿîÎAgp®|s÷öîÝ_Þ ƒö +6#/Üv/´êÓS9núãäË/>häŒÝ¿êùٛg_ßËQ&ÒâÏ^¿øZþFªnÿ–c3ïö_?ùâ¿=ùbèþ7ÖÿÅÝß=݋|õŸ…¼ý3nÊԕ`%ZIü-3þ/5Ϋ’½”aY•ë®ì¥¬»r3ÜJ·µ¬>­ÿ3u%t%®JÒ"c€¿ó8KÉü»teY•ëqïåàe?¥ÔŸŽRãq¼!í8Þö¥>~^ýº»’¦åÉú÷”»R¦EŠþ÷º+{-O¾ø?ÎÏé¥Y «yÝì¶9–"5ÖyŽÝlëìö³\¤àoÌnYÍóÒÍ´üWjÔ9¯³¾÷ùÖ¿1Û7ý¬ËõÏpvÎ'™~ƃÌ/þÆ c®g–ÂÙΛ™¾¶²žcÌ)þ¾a9nf³68—mîPt®êÌ-6g2O2§:W˜³ƒ•#ˍ•[”ºÍН͜Žœ­hã_8®{î™[ŽÐĘÙDžý9ò«Gûʙ«çk…m£­)„òhŒKØK9†[™ö1†cŠ9–¸Ä븏Çxoe8§’h‡)§%]§}:¤›$ûT>i”%ç4Ïs™—ùzÞχù8ßÊ¢e0bNy΢6å}>äc¾•3–©Ä’Ê\rYÊuٗc¹)·²pdN—°ÄE*Zʲ,ûå°Ü,·²|Æëp¯Óõ|]®—ëë뽔Ãõñú†Kj’.Ä}Úç}Ù/ò«ýþ°¿ÙßÊ2“Ñ䠇C<¤ƒ|Âa9\ö‡Ãáx¸•e7r2â1ç£|Þ±—ãþx8Þoo™žpoæ›|Sn–iìæp#«äæææKãVí6ÝJgoåóo¯¥H£·òêíæçtà´:í¦+Ç®º²_•ë®,µH‹4ßJîʼ*©+±+¡+²¥ÆÉKÏÙWú¿éÿWå E† ï»rݕeUJWrWæ®C¿I^⪄®L]»2ôE‡ýÉ6}ú?‡®ìµÔ­ºšÏõ,®ç®ÎÚz¦Ö³#3"5Æ~Fº™XÿzÔm´7#ÌQ•ñZ6cj#¹Ãõ¸mFk=>2^ëqÑ1¹¶²°+ÙÊ̒¬D–`EÖ7£©z*øV¨ÓÆêŸ=˵•…¥X‘Í.›?f+ÉJd V”'×3@øj7§7œÇ=ç­pžçs1pôíkŽmæhFŽÞÈѺáèì9Ez—Ùwô½Ø«#{qÍïÎüÊȯ’o‘es#Czvv-l­{›…ÉEav“ðyùRYR72Øa†×ÂËu™„Q9oF9ƒoeê2(ûåZØiY²0Ö$ 6È 5ʉ}+ â(ƒµ6¼ùFaɳ°æX‚0éQÎö[Y*GÊ}¾&^rvž„­aî£È·²ˆŽ2¼{aý‹Y‚$BcaœåeIßÈdäи–ãÈ2§$‡ICeùâVÞQ¦d/Î"OŽ³AQŽ¢I¤A¶À,ƒR×rXÉ7ʱ5‡$Xƒl‰æVëQ¦Ç,^ÅIŽ>Õ0Ï)ûíD`{ÏÖ'ù¬l0=ú!îA@X(@¨@!"F]ZeM¬£ÖÐއ€2­øÅmw(§Xd%Y_£¬­s+kꎞRø£'ÕÈ ‹Ó*q[×ËÎ,œXr(‰ÀP?g£Ÿ‹³,½ræd ~2â\¼F›õ}—1‚I°¹Ê”2n(gŒ&i$—5®·SaŒ7ÜzÍò3eÁc¥`CévêÏQ?€ëc†ÏÓ5E››p²(bŽ.>©À¨"” +†Š÷7ÒÈh¢»v³ŠâMô¦ÊÂÚj]­&ÖÁÒ÷Ï’?™:‘+ÁƒBG’e¥ì¹f6‚F?<ɎÊ¬zvՖUcY=Ó"ÛòÑ?ÃÌÖ¬ì}ŒÌ§c³•?ËFÞ»|]KӘÊJ—ʦ_iI+Ìô2©13Ð?*ó¯T⵶WO+×]›`‘Q\i‘JèUóÀß˦”Mi«þk6]¶/ñ¤„“2)öGjìÿœ¨ŽØ½ìçÏa-² +^ö^®/”åb)UÔó¦Ì,M{M}‘W?»…£ýû´„ …KCjœYÎ ò™"5>îÉGÿ9k+ø¤?Ÿ¯Æîx}`Uú­RüъÊmÕRm#Åtïj;±}/»ZõôºÛ«=¦m…íÞ®²oÝËýîÝÛ®®V„Ó½›Ýê0[In“hv©ÐïV·f<°Oå_n i¶±ÍÞ¬»óÈ£©ÚXzÛþìÞܯ,s§»³Úp¶»µ¬¬|Í*T-Cçö«ÿ¼²¦“WÖÆË»rm¹ÚÚ,Ïíۇvóf¯rW_ø݇ïèwõßÀüü5^z{õêTÁR©åTÁª²Ê@…ý†Éb +æl2ÉäêÕm'•ä•T2u*ÖA”,ªXO¾% j–*YP³ªXªdhuRE«¸¢Lтªu5kOE«Ð†%«‘ÊÖȍrKýûˆ&¤‚"ª–*[P·&U·¨pMáÚSá*T¸ r•ÉÚ1µë–º4/U½ |*_P¿"Õ¯‘Ûê–*؁*”0¨aYšÅ£¢i‰Š¨Œ‰:F{Ð ²£(dPÉ ”A-ƒb–c¢jå,u TÐnM‡ßk¾P¾ƒ„—)åÍx!àÏH«qvˆÁ:!MŽSÙ­P=C‰äà=ïî¸v'…U{®þÝóä^†¢¼$ü6žÈFÎYW¼t%Ù¬¸æŠGʎée” ·;Ëç/Îȏã¹ÉgÞÕ®Šjé-dýŸµQ°3u®ípõÌ¥Ê1šJÛJX•µÍ/mʼ*"¬,‰yec,Ô±ÖåzSöÛb;OÊéŸÛÓRW›0Èþ$ϔél gKµ"ž–t¡Ì‹Û“¥Æ¼)åÁ²¼§ˆH±²jŸ/ûGr|©ñðÈr|\‘O©ç¦òÑEj¼ô»üsæxýèšÜ@4¸Ö:™EK´¢öÔj_ÍVªýu±bÖY©Q­µõOem Õi©ü¶êÖUꯖbµËú¦yJËì¥Úš‹—Åʵ—ýžu„yé„cãU͏pž;u|iå§Xñ¤ Üèê9Ϟö Ë¼çž³â1ÆghK»ÌcÎp–÷q©ñA>ò²áôr9×øhNÑíþ‹|â‘\á”<°«.Å]ýAfەáV»ƒÚRé(†,¢ìAçÎa¼Æ NãÁÜÆp'ºŽ‹žÕ}|„Yu Š¬p"ËCA¶º’áL¾¡;YÊR(ÊøÇò5Ee8—±™ÔÁ 3äOº™Ÿ|AWsTNwó^ØÓѝ΃H‰8áxŽò¥3EøEÄùk:¡Â>nÌ=\ˎ¡¢ð§4ÜÒóu¦Z°tîi:¨¥`aB^i« tVÃ] Ù=Ói]DõXèºVçõÌ ý–nìÁ¹p忕óVŽÛ8­ñXᷕ»6®Z¹i㣍{6®Ù¸eÏ#f¡v®¸â†®e²žÛ­9œ Œð²ÆÙÖ¼lýÎHF§ü©—yÎË5—¸ÎF*é‹Ôøy/×xìéÿñ»ºšÃýê Ùãn’Í»2\EÙ;»€^ŸððoŸ|ñwOóìþí™:¯’<™†]¯Dœ/W¸}µ]s^â(¿¡OðJ™¢ü#§É~=i^vx@k™®Âbkî“kÒïD©M³<6ȶŸñ¢h梺³²%¦a!]8eLò ]eájNÓ}ÖgªÐ¾n„Ï¢²4)óÅ"üY+ݲh“ðYT&ӗ–Uei–þë>O…Ÿ0—S¾*!,¨ª¤¼|ê„n«;·fíã—åJøüÅ»~ +õì ¿Y!˜`™ÿpÿòåÝ €2í_Rq¬Ìÿì¬óÖæd¬2™›/c¼6Vxì}¶Æ梡f(bzœ  OyÈQµçávKó‡j3³kd7äpÀSáàÒC뚶­ã4¡"«gDm»j#Æi2öR]ž;IÇ©#ÐÒÅs.£Q{Ëmêì4Ž)"˜G%lÍcÙÐ ŠO0„ d7†Q8$w{>Œ½èÂ]l—~²æ†ïñÍÐÓ»sÇG?­—ê’?úÄA>3¤²R!|”ÅÀW(Aî‚Ô•dD id ”®’õŽÙ½É:ʆjh¸†2Œgƒ»4©9,›Ù+š}lFáGcS…KqOz3«‹zR<‘ሎŽº6ÄP5'C)"hàqsâtÝTK¢zƒKωôL):S’.4^SžÞS–Ù£àtKɺÉÖ +ÅÄ<ª|­v“±)e8Sᙐ³!i‹ÄKi»PÚ®òöq%so¤n“¹±*„“rw•¼e—­eo¬’Å`ŠŽ7îœ(yWˆg/y(yß@䒹WÉ;t’w6©{O©ûH©[áŸMގ¼ YÛ¥m‘ʏ”¸«¼}*q'“¸)s»¼½§ÌM‰Û™•AÞ šÜéN;ý÷ÿ{M5C2qfV6—ÝMsÞÕõ;º¾«‘ºÂŸG7[‡Á·¿ÃêïhŒºB¥“ƒãÕ$.Œq<¾‚ä³ýWéú_u{¶ÿ^¯LïGƒQWùBÅ%ó&n— €:)®T,ØG¡ÁFgקpÐÝÌÁf âÚÍÆ[svSóÈÜA™­t@f©q f>®À̗×g1Ãú¼^¥²²¹‡1¾foͶ¢Óö¾zuý.< +¹ŠeeëJžyT¶õ f§\^]Ÿumßؐ:¹®s)²²uµg[ñ3µÊ1ʓÉÛõ QGªî€îîÇœsfmöå¼Ël:1{Ÿ8œ tXƒîO‚dž„>l@ùç Nƒ ¬/5ž …Èç¼q^ˆDӞŠØE—öЈà³;iß¹[Ú^ê÷S·«N YW‹¥ö‘9Cî‡Ö/Ü£@ýFaa‰¶„K1WÁ2)¯”xyº³v}® +ÕðQæyñj\Dt.fHÝV¡vžf7™¯DÒ*Ý÷|tú9a‰°Ð„,§‚½<ŽY”tÿBoK^Úõ#ÍòêØYí>¹&3•!f +K¡ùKŽâZ:‡Œ +`dÒ!¶z–«”¤”èÌ@ŸZÕšn~ýæù»ƒñÆÿ-ÕL}DíÕ,’1¢äkÂ$‡g¯•£±ŒÏÀ”·µÈڛ»ú¢&ë°·vö’`‘`cz ÕG¼m°Ç¾‰±‹ó•ΫiøØ +>pð‹o0ôö/šâÚÀ÷rz•ž{ ¸LÍF¬0ƽ‡ßT}ËàÎPBªN”\ïɮݴÐÐâÛk/-œ—ʺL+ì´ÂP[ ®BVÀzÙfh5 îÂ(—ª½¨Í`鴘½I7ÕrnŒeWVDë„.ªù²,©¾Î¥–„jMØWùÅNŒêBQÑ|2”¹™3’U›DȤ½è4Z–ŠÙ´˜ Qî’KK(GÉRÈÔ¼$/íOöR¼\{Ù·"5ºÒ`k·PSW%t…Ã÷䋽¤U9ýS6e9SDØÌ×'åp¡(î܂aø‚³}øàÂ- +Åô9ÊÙàæޜ=Àyßö츎­)Ü¡ûª});Pí «î¹ÛÎ>ÐüًÅ;«[¬{¶6Ù/º?tf,ºÐ–zm+û†v5¬å@ër²U +«ÚžkòȵX}ÙWTóc_ӏmóH(èH.ÐêYíh…æ}ØÑ ª m0Z¢Mý֋{­fðKœ(n7 óÅmhôWӆöÏºy­—Î~v`À5lÚ7†‘tµ¨)kõLU¦!…ªçZõ“†jH †â„÷W¸Ÿñ³œà}V^ìßãÈS ×Xž*>o;§HS”à¡ÃžÃå¬9Ñ9+åd•}ûwIIZ#tâ|à%làƒ¥ÚZÆu,t‚®ÑÏ5î¹Å<×/iŠš)aš¥JÕ:ª¹E‰WU¨©=-~ÙšN9Êk¯ÜԒÓ(å¦ÖoTú^•7¬ÅZ•?oh:Qã7*¼)ñ†¿[«ñkE~­Ê¯•ùbVîì¡Ì’«ôM­¯ŠýäO†N½¿í”ü×å<ÜZxEm¼ýY¼/íXk‡tò[‘CWZL߸*=îz Ýè5hNªpÈÆ«²?)כrîhä±ërö`§ÑîrqAIjLJü࣍i4>Cù¨Xø‡£áB*;pDz¿%]GÅ÷qñ杕Õ=¯<´ÍG{\™^W†WõÖº¿¶zl¯}ž³Í“Žë´ ä8¸wrلs„f|5óëM–µH°çVXÌk™)ÆV¶šb›{íÅna™R°¬ öPoö´ +ø¸![‡},”Z²›l“Éò"2ýHC| ÑPƒs×!¢S ÑÐÕBèl9ª‰Üš¾¢ UÙޞàk3×°‘>pd6ÅԚ «’ÚRÙτ ^ +¬a&ëa‘õLc[:QõRØp+ñ\±Ÿþ9ì»Kvüìæ¦Ü|LyfŒ˜š²¶œ ÚÒPD+$|H¤ßÅÌ ö£±Y’Ün´5p|Äëhcø§W¯ž½¼ûz÷‘v#ì g¨½Ñç\¦ä*J—…i¼ú¯Inkš ¹ÝÂm×9Ö@[…(àz¯`trpírâÖlƒx¢`Õ¯¯É Z¶½Ø3+ÖÑ͏ÍøðtX֟÷ꃾzo_Ý.ôã¾ys=ߚ¹æ$}ÃY*ÎÝe¬ÛL¬ó9}?yb>S–˜ká-KÌ÷žÝ懯^õÊ©bNrOY½ Ðï3MîWj×:óóŒó3Ô.ª)œIj•¯ˆŸÌk‡á<·:RJoùídHCì÷!0ð”…û\(,²Ð¬z#ûWÍ:…;VáošÃN&Àáoùd¦YòØe­«ð·dÐrÖe -``A6=ù¡MkX“šVÁÉL2ë`‚Þ0s³À„SÍ3 +ršLù‰f¨©á³©PU©jzJýcÊÕ²ª¤U¥míllñ2«-íåºÈ˜NJ8[⅒ÖŔÑVæG•|¹Ðw}¾”+ þ¸rF›<-äñË5^z¢“*ªü6;WQ©m¢äWY3'ÂÑ2e57é¬ {•&”rÉ Ò@Ÿ'3Ð@<ôҝpÙÀ–Þ$*\ZÖð¦up“ó ,O›d9»qXø‘ð¨}ädœÉB¢Â§UÀSò §ZªYCÿHÆjêð6#J5­4³K‹¢ifšq[ˆxj%œ)ñBI'…ÜQjœ/–3þ• ¥­ŠaW>¤œXÖEj|ÏZ]ã£ÿHŸùÏÿ5>ÀQ “ÜX,D¢r­Î)Oü6›ÎQ³ï‚Ÿ˜®'å@-CPš{ZÞ­ƒöÓ*﮺š*|»w3ç(•§TØö™É³\¥ò•Ì´Ê]®WœEmð[ÞÒøËdÆe’™>å´î8MýӖëšÏ¬ÀC[˜Tå8*G­¸Î%î3](´1F_æHïãO^¤Æ~ûåa®÷Qå‡ÿZ5~`\Ô£ÿúÙÿH5vf²ãI:á½,ß|“d "—îÑò¦Í̗60Sڞ&¯™æ®Ñ2£íe½©s F.˜¸`ނ; ®4u£iÜ‘ÙÏ4Z!Õ¬gt•yzé’kŸH5.á1©¥·É¥=½t‹Fxò…¹¹ª‹«º·‚E%ŒîÔ:v± ×]n³æÆ¢ KxÔ´Êq¶v]UÇUsZ5—Uï° +ÍYe™-Ç3™-·nª­“ê‚{êÉÕ%÷ÔÊ9õcJj¼à˜:ç”z„JƒÀ[)vOÇûË%ƒÖIa>ÏÏZþרñŽòGù£üÀQ>_?p”8ÊåŽòùj\¹Ù¼üðãIï}žb:Óã’•d‚’sRgü8 |ïÌ?øÏùœ#ÿ³V[}úÃ.Wƒp»•gó+Cš•ßÌãMìB¼šÇ.Ý֏ljÈRqšæÝ4\…iÉçjØ>ÒjÈù¡§:aº€G˜€GÁ3¾ÝlØÇ ûb©§Ýõñ¤>¬xM[À5þ<äù9ñRyÌ|ƒÆ ?:0þô +¯roÔY0û[ +s‡‘ëïùìïøܔ¿Ùšú”MOÌØìk¶B|vÖ³¶šqævãºb7<‘߸d—ùíN]Šš–f©t –ºôJŸå™5 sQ&•Cµð¶†È|w%Ž¹í†—a:ó P¦ÏW§ÅF§aYdZ/<û€˜ã ÏjHÖ ¸TÐ}ÐÇU`­–Þ|þñùtÖyžqN›½1ç™û²2k°M^ŒK°é#À¢ù,zæº뚐Á+`lá|oÎChWý²k Ž†¿þèè{ÁŒàÇ5 â{Ü`+҂…m¼§…e®Ûh¡!§¼§tÀÄ5Ùþæ¯m g÷CØîÖM›¼¿}2=Xn<×oËô›ºëù4+àž),³oÙòùΞÇ÷Úâ}]Óɦ1ÝÏD%4di¡ËmoñÚ75hð¥ÐEbà 'ÂĬñÖð? ªúÆ"¨ƒ)Ýq}|kŸWP÷ç;Úf<êsMD ÄÔ¼G}æ£.Dz Áñ›UjN©8Ÿb|aO>b|fåh²Íöø˜×õ4“‡é?Â8æ€ÐW…¿Íeîó¦ö ~È[Ÿ¼ ËùmX¶)X={`ÍØgì®ðYÛêr8É^!½ ºâ°^çÆÁÀCˆio×÷åO}g•Ÿó`.ïÀ=¶7'w°½äí\¸CõB²­¿â;½ÐŒ¡é#R·é¥Î%˜Ï$˜²äRT€šÊS£K1Ÿ5–Ô¿ÕS„ÊâH+¶t¹²«jlg œZd ·ÝÚIg[›Hyå-6V(m¯#'[Yƒ³DŸ/šG'a%7¼Øjá…Va?Êx™¯v–/™¤]\XµÐ¤Aaü Â.aò\dµ%YuÈʁ˦ö²³ðþ ›ø–‘…×¼D +«Ãï0=/Á=êzØ÷ÝØ Ûûâ趻½ÖeNõû +<´ Ü.qÀ5dÈcYÖÙTG“dZ@ïïAú‹w®V`å3w1<Àk·Ü–iáZE@q>„böþæT×a]ÎڴʶѾñWßòõ™Ö¹èa‹  Ø€ˆ§á¨Ùò:§DµÉðLðԅó#œ FÉÌ•…:{Ø醧H8 L,‚’B!ôÇ¿®¿ïûÓnûÖ ‚ ‰ýè+‚ëíÛ?|Ý'~ÝJe?L´<ŒÃBËÃ< ¢ä•ì™ˆ¦ âNÿђèû+#>s½&²Æab‚²4#üÉ(ÊSÍjÙ ¸J`:ó¯sž®Qçûoý¬õš±èӌÿµÎñ +Çõçs*lêµqûÝfþ¥q §h˜‹öŸWHœùÇy5á3Õø©*D<«AÄ­?€É°Œ©Ø- ·¼a¡²Nܯpki–ÀÀ5=¹§7v|3à€DÓuK=¾º Úuý…~µO±OwQšìmÑ6WW¤m.G[_ŒÖÃêח¢u×£­²{>|±ãã +îmýÀ;¶ÞWþjtá¦Ç^GšÁ(S …D«h¸÷eÉÿ2ӕì ×Xy=ê!Z:2Oû-_5Ýx„Übz¢Ñ&zÊ<â¦åЩÍk5XB²‰&jv½biìZhXƒ%wŽ mº¹íöLev¾¤³%҂s®Ì[x Øg-^£¯‘–]¯f¬—dèM±5•e¶ÿ/½¦Q‡):x +ö‰›>azÿ_üÝ'¡ºtô}lÀãb>êÏ5>öv¯Í Ûó j®uƅίqÞóúfȅeBH„! F^Ë<ðBfȁ½¨ÐžKR`'º$x4xʵÝúP¯P®w¾†ÔëéëmíŒþ²äþ*ùådù{*PÞ&pþrä÷^Ô~þ’ä‹—­ô¥ë3ËD/7ÐËÍm>=$®Xn +ÍLáY)¾­Èl\ÍøîÖ­•á}ß彪†÷šûª7½e Ø4ð`¸q#üѲ™îÍí9±ªY¾˜q¾þéR¾òƧ¾Ä“.”é|áí6çÊø±…×´Öòá5:У¹+z‡EuYŒ'ð +þ(ž ±Ï„!sZeAl×<&ÿá:"s»yˆPð҇­s›¥³½Þð†­K嬤ûžrpÈg+ 5nmˆÿþ‚ô÷Rãƒ*‰Ôxþ7ç/ 9½è ¿ð€êØ§W‡Ì'™E×ÙEǓ]U÷Ԟ·g_›Ë°ø…5ч-;ÑùüDãæЫ9pún ­Þ€ Çý­|øž~ž>?sþýéOªñ¼b/¨"¦¨Ð~½.'JÎ&×v”kj“«RÂÏkŽðz²iŽq=yT,ÒÔØï©ÀeËþ)NȀ¸5ŒòáÁ2=f—3¯£es„íPÁä°Ân80~•S%Eµª”¸g^D•)šDIòä=Hy×TP ¯¹ïíß_Bú_ãZµ³°oF¶;ɂã›úÿ6%²bŸ‚ßѵVSª³UQ-E5¯T\+Šó‰ãsòç¯Tãà +Å¥ûK­P[?½öm{m[¯¹zt2˜T§¤ÆŬýÛê—v×N®]}QüþÖ½eO¬îÌÞ¡ùKó4‡eË`©×O,î®Zgd;0GÒDK.ràu¤~Çí¿» ýI5^P9.ST˜Í`]N•œµÔ)Hç. ý +{ËÓ®•¸éòÁ ž桬0—ܸ½w^]ìyè.õœèøL×z™çµe®«ÖòÉl兎Ç-ä#]I>q‡Âüû ÒßKª$py|H懯¾ºÍÞU©št~£põªXSÐjֆ¦ÆÍæ¯Èír©qñ ꇕcíŨ—<4(ãl> óRˆhmÆ“û´£âãWwinŽgÐtY`oÂÍp…‘Ã᪖‚”ÌÔËn<Úåx5¦Ü;?­uª¥aZ1Æiæ=[ÂLǤy瓫²»Í>¨W%ï¦x•×_òÑU|ª#/uä¥-"÷,Fg{¤=:1pŒ'h-^gìnhF2¯uÚãzkl½áªþ·Ýtº¾+¶Édaûsw¿ëö–×­8 M¤³õ-߶úá UÓ;7Yqe:×·¥·,ü-Äíï¹í®Y<½ dé.H\ßý6ù’‹7‚4þº³}©œº ‰—Sɹ^–7²»&†cˆ´ôøÖmÒÞÛîדýB¸¬’8e{µÔ`E¼à¸ñò'ïÄóàøô:BáèøÐñtü¼œÝ‡B>µ5>"jëòu¦0~~ÐúŒzä"|DønY·;«ŽvKs½·ªÝ\Uü檹»G«]4Ì[ºÎœÌ~×ëó£^·Ë9NnîX/ÅK|êªËç±|"‰¹AeZÝçy_÷À5+äõÅø½&ÍçÖu×B5¤u„àq­Î²‰ Ü^Qqò͗£//ìËüuµ¼äُåÚošÇºŠáÜУœjThdAC;e˜—ÅÖ¿qgßÛ Š·»è“+û^¢ +ÿåîþÿûÿÓî·Ïÿð§goþ‚m³¡üµ.¥95é}äµ4O¾8I[\“ ×¤Å}Ââ£ß‰¹N€^0»±$ÅS‡Ô_G\¾„¡¿‚aßE|J„Ä¡»V”d?2FŠç õäž[CÐƌó}_ùsbþýèK˜¨èòš©‰_“ݬª«¦¥»®2vKy ÙzaD•®oì&ßG¤Ñߤ»6£æƒÍÇÅ¥œ¹Üãc#S։!ºË=¶©AŽçÓL‰¼ÊåÅÏ9ÕÎÝŸ×Oj<åxg4—³©¬×‰¬-ëÉŸƒ•5 +«Å`É*ûè(,s…ìÕêA{G8Ê©.eDææ|™ïíN­±ž½U‹i³m?tübE/ÖǖäOÆ[!LôçiþŽJô·Nóg±["ó|Rô–FOj—Ñ[²Ê>:~‹ˆ] 4fC꣋½u»Iö“ϧúaMü°&~X?¬‰×Ä:-ØdÌ:Íÿõá/¯æ-¡<ýÕëW_½¹õîþÕ7_~Ù«îýož|ñ«où» ¿ûêÙ»wwo^‰VýâÏoß>ƒ6oÿÚ-ËÕ2O ÜÀqžÃnŠñjÙÙMã|%‹kÖ/¾Ö¿þõOøû;ý¡:PÿõÏúó‘ÿ¡þI†b÷ËÝûïÃîë'|ë7x ¶T+Þ½õ¤½Ý/Väú]¿è«8K\Wð +ÿùÉõ›wÇûçïî_¿zöæÏ»ŸªQä'ûׯ_ÈXüÜÆåéÍ×÷ï^¿yºöüßdôžþãý‹»§¿¹{þîÇ»ÿ„7þwüÇûý÷ßi-Gíô¯u­L¸öR¡ã”¸j¢¬–bY"íÒàRlK²û×gZ×z$Ã8^ aw©\Ql ¤Ÿ“T´KËÕ,2ÙNXÃjKWÇÝTäqa»”®Fف»ç|­¤+Ùäa—¦«¶¢E\Åi.»¸\‰þ€K“ç«1Èó1\Ɏœê{ËՐô òÛÌê3››ÊUšàv(ÃUZð~¾ +0ëk9^‰>³›f„>Kk³´"Bé.LúQ á\» Ý Ù^ê(ÎN¦½Œ² +ç|%"ëÀ‚\Ñ©drÓÂJíÜØ¢)¶‡D26ÑUR ֖½V©2Û2 ;¯'cãÜZ«{O?©=U¿ÙëÙtm»øÆÝõ·Ÿù@EXÏŒl5ɌÉLËR½ ‡‚% N#:qp‚ñ°¤òI{Ls†DäõT‚5gïUj¾‚¾¿k‰Üd)´öŒ`ïÙWùSõ³½žMïºA4½Mñ3ìáQNʹäaH(˜ûYfIDµQx¾ÃüÂ1OØÂ…²ìRÙÓ 6‹­Yt °$“/+_è« ›L¶Ä<Èf Üß"$W‚4‡anOÉV"¡ F¨?Œ*âόy!Ÿ’íG{Oª’q|kös`„’ƒˆüdD¬ŸrqÔ„`Ü(“,èè¯:YDk˜_xB-˜#°]øjv¨~á´QôU9‘Ed/݃ò™9ÅÈ’ +QGícS}µ’ÉZ‚,Hh`ì6r’©’ݺ0b®êË> \Ór¤Îd’¯Bı$‹sãDf Ç昻aš™«‰šš'lXÞÈ3ÌØì²ò2^–îœå2hBžƒ=@ÃȘ†¡kÉqže«G—a¬ûI~Š³|¢(ÅA4 ùTIá©»eÐØ.ÖÓcºW숦r•Šb¦tiwËÊ!ÈÜGáçH•Ó(¾VbÁÔ´'„yìêr‚µio:Y†#ˆ’ÖÕ%âì,Û¨kÔ(öª?èðʶ=mƒ1.¦À>¤É¤~ÌsIXܕ,j¶ÈñØAÖ’VóÊäSãd쵒v]e²AFüªµj{5\MÂêûå@Ú¬«Ì)ëVìŸç•y¶}íÆAö ÇHÔäP¤å—k*Bv]ÐáŽø%FQ7–e%8—B– öØ\t†½"'X{ÏëâSjõ¶W4Y¯¼=#Ø®¯ŸåÕ¯mû÷Iï“ \ÐB˜ªzƒ¸Ÿ(nςr‘€;­­1Šô&*ÜÚ ÉV°Å Zª~Èjª-ˆ¹²ÞâÚ …Ú–´ÀKÙ^µh´”YY´ÈNÁ«IKºÓº›´@˜äƒV­qŠKµhý†IÆ Z´È1ó+‹+ìWfС2Ìóâ­ú@gÏG'¥}·º0ñŒnÏ'Ù e™×ö,Ps‘¡Ú³\v¨ö,l;€Öö,°fœ´dgÁ ïö,ì4¨'+s–lȄY©Ö,a eæI@c–ü"¾¹·eQ„¡³¤Ž€³e o焭LY"ªg9iܒ3i‘A¨†,9?&|Ôʎ5ªøÑ YáˆY YÒþükCÖ(Ms£UCÖ(«7®]5:áÇ\Ä+CÖÍ8/nÇÂQ;éXµc"ƒsQ¯ìX8Ô(W;–´,G¸ì¨jÇ:Ùj§ÇƒšÆ¸¶c9µÚ °8 +“™¨Æ‰ &Wf,œkÓ\Ú3#̦°õÕJ*ae\jT³Ay=ÕJU[Ù²ü‹ÚSµ'µžm×Öì\¤¨¸¶e5ª™ À7ÒÜF%+BԖµ) <UÝcƒ6Üꩄ޴Ԩfj™ªµ×›²ü«ü©úÙ^ϦwÿSY²>Áˆ `*C‡È;gª«ÄȲÕg1îâðZ!Œj§J©³¡¢Dilfà ÚR0k)8y@X™;/Ì7“R¤¹ê`…ÛTLùðqv‚ù ì«ÑFƒÁ? [/ż•°,hÁÍFÅ6f|§}’Tã  ûðĨJ±Q_ÀáýABìÊ)÷”:¨§Fˆ<¨Å'†HQfkdaž¢ODµ.Ó±1¿fµ‹´07Š!|$MۃÜ]UúsmÑ é‹êƒˆ¶»V ”1N¡·W)öbý0°õ©VvÒËïQFrÄe9ðãÆ뵇¾ºýð\˜€¯~?¸)ÍîÀ3ǟœí"CâÍêùåQ}¶/pþˆ®POÕ÷G!1° uþáx‘ÃylÞ?¨!"MùR÷”g9Û§æÿïãǹgWgS«@œqr@‘0d ˆÂê 6Y÷>—æナ'’dnn@a†Ò<·d}†šXµß©Þ ÷RƒÐ9ac(îÃ1o åÖ§Î\”vàH¥’ù©ºC©q $W9·¦Î!1,UlhA9ò´_Õ%8â̕IkNAZ4ÒèÎDzÑ}õûT· ”ÿeÂr¯ŽA ã)VÏ µ¥ý¬®AQð…ÿˆã¾Aá­"-Õs«:'ºpÊؼƒ|3R݃0ì¶eT݃¨¯d©Âýƒ°Rßq¡œ€"àU;’»§ J¦|“û'°Ë‘Þ?sÂÁeºöÂôDÕ݄ÐX£ úît›^vân³—r‘c€…꜃µ„}r'žSÖîÂîAz»ªìgk±w‚-ˆD»4Ÿ!tcZ—½=§¬½†Ýƒþñ^Ù¶—g‡2×òcÚxaäá"tÝ4Ê9œÇæÊ«„µë°=f>Á®&§X“kç!f:AÀnuA·§®I#¬½‡í1ÿx¯iÛËÿ R—0=óÛX#ëǹIe¿­Gî`>9¨³P‘iö&E8#)®Áj3bf¨Âó#Ì;ÂCÔ< ie•b +XPçc{¾Aªà6 çw2†6&0f5•úªœZlU^LD0ÑBh8éê©> ¡Á2—†îàîÈ£J¨ †q؁—Û0Àñ-T)¦çUzۃ˜ +tÇVW£ jdé…¹VYV1±kµRž×Iå×µçj¼®“ž¾Gú,.jx—¸$Ö>jؓuº«“~…!®]½Ô£O0HlÜÔ´YóÕê€_Ñe甐úEæäXYõTO)Öõižj§¬=ÕíÁꁞ¸+BO ¹[eŒiM½ogސlºÖÃtÙ]=A”ÆÅ/7dÞÓÜÖ~ÆV/²ÖNëö\õG·ºÅ];®yÓDà•AȦ=¯6Z kßu÷œwÀëÚöô{s_ƒ£ Û(ÍÓÉUót[dÕ<±LhÂYiž`/¢3L®yB?™sqͶ ÝVª§«êé¶ÀªSÂ*ža]©žÐ'‡NA…m ²*žõç•ÞY‰®vÂlS—+“ôN8ŠVZ'Lg9âëüA¾ªužèËլƑµÖÙÈUU¤ˆöǪLât诵Nڙ ß´ÇÊ/½2§¬´ÀŽlêb«¬ª”­Õ•îÙ>¯=è=óʶ}½ì ÿ$Ó|L†¸þê—28=±:5gÕH°Ûˆ=Nqû<í¬ÝƒàGl•9ÅZuÆbäf +…±herj ››»V+Å­ûæ\õ½ ^Ù¶¯ß£o|ž'Uì`ÕDYò Œ2Çh\Ÿè~ȋvŸ3äÂQG«Èj¡× vþiTÞ*âÊÄ¡.T3xa'ø‡¥yš²1ÁgŠ#\Í>qŒ™’N!®W]ùޑºjgÜguΤÇjO5iâ«ymB¸Îa±ºÎaFhCä…¾\:å +)p£ÇDtÀ8Óo7»ãCE?”³$Ó{ð 4Á4ê4W@²Èþ"_€RpEPC™Ì#v¨öìN©2 ®›«(vÆõC0JLîmœ`Ë @ÀŒ +r’Ïó¢î:ÚåaɛðIsª¿©Ì%W4o“†£@ûԅ%ujU²#šÎKSYä±ÍÚOƒ«ÅŠƒíM)aõ¹Ñ@TOiôE>Ùb=]ö§Ü˸=t‰V»—²?…f‘c"4{àå[x|Dö²RlsȀg0Öö œe©¯Ê~½°n\w]50DÁt×Ú3Š½èæúÇ{eÛ^v^AY¿ô¿aåó({¹!/jBü†ž;(҄e9O +ÏsŠ6FE%uÊæÒª2§X«þª‘³JÀ­2¸wahm­VŠ½Z?¯=è]ðʶ}íÆA¦gI8—E$ó嚌vRîZ5Ë`Ba9̅('8ˆ_hÏE¤ ]]N©Ú«N†¨D×A­ €H1µMûÙ8Gý´úTëT­è¤›m`ó¯pªçP=Ä9BrV\¢oj^¢d«ìDÖP)Ə`7±¾’ ]›æ¹UÖQ¬U{ÕÉDÁ²ë*ƒ["¤¾U£<¯lŸçz¬²Ó¾vãà’ž­%úOuí96=ÈðàÃ<%ÂÊ(Ý-ÒßÜ(Ï«ô’Ò<÷ÎQºÊœR[uaÂÈfi• We —7jsZԏ«µn՚N:ú½ ՍÃ$ȑ¿»ã<›™w¶¢ÝqLÍ Ž¬ +w‡Õ#wTÀ;Tº¤ñlzÊ´xä}¡h Ÿ bÞ! B–rÌ;ÆL=¯ôŽgCr’Þin‰sl¨wÊDŒú«°w0Ý°laïèYŽ{‡)nã:¢3ǕÁÃñ*tkè;´¡ JÍyª^ëxt§<÷ñÇÉÐ=hÐö®®J©ºBeärPY«Kښ2¥ÀÚh¥¸ü˜bèŸónÕª¶ý¼¬ú<Ýs“ã]YQ'rŽ%&kiiÈt§˜EÄì݃roU9Áš´7,ÿ<„]WW6stk4÷fkÿ8Î?ßëÚö³ãv0G²–EÍ­'‹Ü%¯"Ô%t6ÆÑ|ž.|uŠma8q»¬å¥««j›Î²H…I`¶VÖV\ú&+ÅÄÁúmþ ¿WvÒÑïÑöáPkl,"ÌW‘æh¬¬¡Ø=)ñYl”¥.Ê´Ðýîàѐ‘–¯KÐÈ£ÙjZeƒu¯µjãþyþ w¡VvÒ×÷͟%l` ‰«qŽˆóÀ‡ÄyäÀ硉ó؇ĹÃn ‰óè‡Äyø€câ<~`‰óÅyƒâjÁç1Ž‰ó(ÇĹp‰«a‰ó@‡Äù#+Dœ;½Màˆ¸.œ GÄy<#âZ@AEÄyDÁ +牫Žˆó‚ Îc +*®8®†¬Ñp5®Àáp5°ÀÑp5´` †«±Ž…«Á…«Ñk$œ‡8Îã  +ç+(œ8Î# šû½Æ¬¡p5ÈÀ‘peàH83X#á<ÎÀ‘phàH¸ÓÝyÆakxü5®#|Í¡ýp«k œ +´çj,A««Qz`ZG6›Wæ(·Úè ç×=ç¨uôt}>œ¿FÃudðU˜E¹y0À + ç1í1‹*è*rJLëÈakuÊ­5كáüÃü)ÿt¯hÛÇK:kswÂÎ'̣ڗœ kEV-ý¤¥ZzÊÈƌbÖSîÂÜ×åk´&”,›l¢=Å+3¡kµÚ×ÕçZj]'=í6È'iîÛÔ[ÔCԐÁ^nÈ£'Áæ#²Q҉‚ê-"„Fqcifþ ÎÎ9ô•9ÅZ}^-…FÜU– ¤¾U£Ø«þyþ wÁ+ÛöµÕOÐY᮲ª/)/Ušmd˜Ó˜Vø{çÀÝS…Hƒ+Å4¹šFÅd„bš»ÊÅZ5¦_É E¨y×*J^èõ®­VŠµZ?¯=X»Ð*ÛöµãV±˜l‚ +›ç册Q6”Ý’’%w!lé}]K£Xgñ)Sÿ äc_™S¬U?üœ\f‚ke°Ù•®MýÙ^«ŸVêúdÕl{ù¹öæ6™Òhà4¢¦^nÈ@|ÑL;Yeb^4H€Ô½t”¶Áæqõà€8ÏÜWækÕmLN¦ŠÛê‚ivéÛT‚³û¶úX×+­hÛÍ~@?E Ø2;U ² Ð—2€uAcʽ¤2Çy²s=Rˆ¯SíØ÷çJ…{]bº·ÚȆ‹q×ꂙwJ}›Fy^•gû8Ð;àum{ú½-RXbDy9«ëˈQÏ3¸ DϙwPFŠê_äÄö³õKäÄ,òº?„ˆ•’»Z*ÁÚrÍ_©²½#]÷µž¬áé­µÜÇÇû7Õ?ÚêÙö¬÷ýNª[/r—§SeȆYµÔ¸¬Þ `jǕ`lwQÅØ–¢¨"¡9ÁÚ³÷*˼Ê+†‚ÐîíÁÅúYþXýðZѶß׆ä‰<˜Þ2ã*ɗ2dÃÙŒ&ø¨ ò “JCi¾RœÃ́V^ƒ°ôuU‚µéüM©Y1î]MÅ¢ø[“¥ËuÒ}›?èßï•m;ú™Dí€NIàØa•}¹&â76Ô½8. +þ¡€>ф39ÁdUxøbêԕ×ÕT)µI{ÓÉ»³kuÑZJ×f¥Ø«õÛڃÞ-¯lÛÑïKBO-©ÏèH—F ™ï2`Ø£Æ*륑¤L% ¸-÷ÏaۍK_—S¬M×& g  ­2$°KרìMÿ8®~¿Wµéæ÷³@iè¨7‰ø‹± ³VR!MMŠÈõ„$Ê8cÃÂ4F±¾1»rìÌØÔ*sŠµê¯yRfÑ*Šhç±kµR|.ôóڃÞ¯lÛ×Ïv³Ôáðû—kj©©!f3Z2H*ªA×>4Š #±f[ôE8C&¨®2§X£nïQ² óãµÊ¦AC¦Z«•ò¼~¯~^{ÐzÐêÚt´à猐{OàÛgôo–šÚmíč@«Šì–ny, Ø Ïê®» V¥4T7,3¨;crhví1ݲ-„iäéFÖNàŒÑ=#-!Þ= ;1]vlxnkéT®pnxGˆ¾[¡¹a*~ ¢]$.34,w2Ÿ +gå–ö4¢¡"¹gÓQÈ=÷;IãÎ@«…¥Á¸ó"›:„†â¦¤ ¦·qÔl¨1q +´ˆ› X,× n¦Áò²Ñ×aŽ²yÅpŸÌü‰Í³ÀN<\ànT3ª#áf..ñô῝កñ©R³|b±t§¬¨z(u£äºUd¨ìÖ^ÞnŸUó·ŠNú÷Ч!TD]lXA·\¡Û ²èÈϹ ŸîÛðpƒUܶ0x97Sƒm3Yc€Ï†ŠLEm§Es,6örٖ-¿04ªR’v0l„sm±Ú¡'  =lÙCƒd- ÀUEdOPw¶xlhï ‹=ٗT€5òa™TٚˆI±ý•ˆtüSˆ „­–Û$$_Ç^ñ]C¯±Rs\ò p^*ð+ŽÑÄ+àu.Æ w¢%©Â®™¢8¥ êZ˜O™ÉØ@×0\󱊹.Ù+ÈõÈüP«*äº-Î +¹>]®'ܼ+bºVˆëF5”4“Iuàê\Íd+´5V0¥> ñÃÜêi„úܨ‘nŠºµ×£­ý«ŒØ>Ûê9é]ë? })¥ кQ+4Ú¬êžFPCÞb¬EÈedMƒXËù<÷Õ8a °®Ô +‰®9jښ[ƒ«í›*±}´UsÒ·ÖíÀxìâürE­PhlA\þéhé-Yæ +U ÛÜXº§pðAôòz*a…onTÃA×z (íõpjÿ¤ú÷¤V²íZë5Òo1Yã +Jݨ~ƀŽ=l ŸÔ¦U€HˆéEõ괊œÐÙÕ`Ï­"CF·özuû¬ú˜x­hÛ¿ÖuØ¡à§_§+±¢e¿hÎ +ˆ†qŒùUWÀia|돉(4¤ƒí„„¹Q êìڛë!ÓþQõ¡Ú“Zɦg—|ððOÌ%¾‚T6r…A"Ðw¤\V‘’rŽ—\âQ û8çF-ÈÖÍÜðV“VØF§V ¤WTa’ÞÞ +NÙ¾«’۷תN;ùýè4Ÿ”õã⇤a÷“ßÜ=;wÎñþåÓ¯îÞ<¿{õîé½û³Õw?ùù«wgÇ_Ï~÷âN;ð‹×Ï»—Ò¥—¾zs÷Çû»?=ýÍë?½­ý p‘‰Vré»x'Ï?ÜÝó‡w—‡¦>ûúÛ§2¦·o^¿zÿÿ¸ûý»Ç?á‘®Þß½ýŽ^¿ðŽjPÝüpGÿåþëw¸8³7Oôn§›W_ÛËOÎ^öô_îÿx‡«žø7ÕçÂLò¹, +€ÆfÃk8sô”e+„eiáRvjÊß¡ ë:D\ÛGu*1#-ø¢œÔÊQ0ÏE¦§àD^Ô½W äÅ®X˜‘ÐoÁ0;©ÕÙÏH¿=ÍÎ1q§(«Œ²J‘8ãÜ[jй –ñ«˜F¤2NÔ9(sqb)¶&ÀÔHÀ‘„ÚéæŽE“QGÞÜ°˜C…ÆVÌÀâÃä¶úÙzÛRً8¥“Õe2*¶&FFÃÛÕQ3Í6>Ïí¾¤€ÁzP· ϸlüâD‚<±2RFÀ1*Œ÷ôvY &^” +ˆ.Oÿ‰©6qý& ÁÛ%côPô™‰ËH%¿ a@À×hòÜb£òk{O˜^ÁYT촄¯e ö¡*˜ð©„çU Ðs·>†{¸“%"BêHa·ÂÒ8Ô×挳dя!Jâ¼h³%dà?&tÈã$æAW ê™p2€Gw?ˊŸùÖèG/ä眵. +P3ã…C˜¦ÊGšÁVÝc¨éà „lxì-Î:ã¦îç¢3è"­è ·y$Fµ'€Æ"¯œÍª–/")BTž}fÐçaá#ªy¦av"!,z­LdPñÞà—! ¾pmÃFYߣ¦#rU¾‡Y +QÏJëž|–œÌ`)f„Ex­óÊt&å"Øà%w‚žnLˆJIMo o(f²!)ž©ô«ø{üúy©Ý™ô!Yþ„ß3C“׳®1dvN–¢)ÈÇL©€ ™0͉u¨b>G;59Siª •L.2‚·u0âÝޓ³ƒK}"úÉ·˜Ç[’B1Î0ª)ö¹E2¹ÊMÌ5½ÑRÍ*=òPTåñ׈pÂñ”`Å'¼˜øÿEßɓힱ¹Q· +5SÇ`m:¶1LؑKp6‡ˆ%ê:Ñk•í+ 3ÀՕp§´5Ùß<ý1$"Ž1²¥RSAà6‡^–äuQ²HpÛ w øN~@…y>Ö`È7÷÷¦åIXa´©fþ>î4©ŽJ`>oDBÈó÷l¬X¯ +™h8:£æ<,È} Bñ(Ñä´4è爋ï%çX4!3ڀWƒOé`ŠÈ9#½ŒƒÖ.Œ†Qc†Á‘ú?ÎñÆ5' •i1°a@(5a©,¹õi"¦(jf>ãS  9qH(>šH v‡… Õs@m[¨¡*pÔW@ ƒK¼dò Ÿ¿‡„¨ jFÄ &E38AÿЫƒ:&†„áYfC GæJWíŠ&#ìD¦ u‰MÆӐ"ÅVØÄ  “è±Ãha )ǛþCfAØræj/ê2™žkmnñP†øB*–$̲¢â~‰jÙã4"ö¯Û@#€H¼­œßI- AMŸâvçNÀ¬««L7ªñ7& +¸Ÿ`ýàÕX¡òèhy¼p2++÷D|žY¸° +ãÂԉšiÅצ([µ +×fÐY–+jHvdឿÐûI #ã*P^Òa», +çüXü~ +Ý[%ÚäH©Í79´Æ Y1£”É°A ±ëâ.;Zt%¢H¹ª·{R4Ö×`‰A©#DÙQŠ”°*7 ÁÓ‚(ïA€­“õpDæجÕeïá××ü”™ˆ þ‰*PÌǽ¸ñm ú€ÉGEG€™Kª!穘¼Duæ¦Onr/|2Ƚ5dzÊè©"H½_ÔªÞÞÂ4ÏËs$Uãç0èQʜ½×š ÏބˆMÐàñ èOzõ‚ìþ¤oÂÌ V]x'e}z!53E ¦Ð‚h&®Yõ9Z×´ÅÙ ðð +Ó,|0¥E}¾´q*%¨»wŠ¾Ðf^¡nUڂY™ZaUÊØ*³R€ÒZ…„ŸGµ»=V¡‚`üI³² $û¤ÕÒÄ¿¤k]¥Ò£œÙåbé¢hƒPœcýÎû®Æ éT±Æ–Y£zõζ ÉI祅 'ÚÜ@&£¡éR'4ŠÁ…”ìk˜„QŸ£cŽ^Îɾ³S] ÓÀÓc՗k²¦—Ä‘°%‚5@`ÚÓdânûƙ=Ï7k¬qOÂî`ÒSÎ?ê.ᭈöÏ,ÂÚ{¤PG;ib¨^ÕÔÁLڂU€¹)P+AÅ$®1®>†$y boÍHá?¸mTœiðä"QV Ít¼{R+~®ëDÈÁ@SažÔ(gOѳ‡ìÿ¨µÁsOÎOâN5sø Þ­¤v] pÐُ&aê3ÌTDÓñ@ûZ¡E¥ŠB,iQ<(Ï@@ƒŽýl#T÷hOA*’^„¢Þ-'àŽÁ´´Wb´;ÜeQ¸2ᢀOžÛ4.ÍÏ +"†´dŽû^8î4ÑwÑ!Æ]SCÿäÂÔ;ÙSäÕ8©NFfE_ë Ù·]À³èZcjHèÐ0¢Ⓥ**Ñ#jIf +"@¬Öð™PŒ‹^'q²͓ýòPpÈ££ƒ@›tš Y­Ÿ 䖯qQÿïdn̼¨cgÕ¨ŸÉlõxmð€?qˆôéMÌ8“xA9M½Å6+,ìíC]Ž«á¦ÚÜ ¶§0)² JœGa8’HO>_ƒïŠ© ²F{ÒÂÒ½ÆcæuMŸ3("€©ÙôG‡Pmç4œ!z,°Â©¡ +.ò»©ÔßÄ¡åŒCÏuïà=8Ë蕢¥ÉÔ,H@T\ð=øÚ(B|I]ÆLÓáb ³z»)"á^E5-êpÂjowÐÏvÐ#k&Õ> JF.ÌØW”¨ZZ{æE¹‡"»CGÓàÜ`¨Aå×t¥;Qay³á°ÊRQWJ0F-Mj} ‘QPà”,M~E•*ÅÆthǪ_ðg9;[?ûÀØÝâK`<Ÿ¢­ )êhÿƒLŒÓ P[pk6;6°Oª;¼†žfj'Àµ“»a”¸°‘úEpàÕõ ÐÃÊX¨-ƒº·§¤3%1#åÉT‘!ÈåLÇrV¢k5ô‚©Õ ?\A&½c‡ÌçT-Z…š±:³$ðΘ¿K—àVS$•j›@^Aj™Wˆq’aC:S¼w%Ó «¾m¦—Ó§8u¼"BAÇÙójÈiÉ?itJŠ>e¨ +£¥F’-9:vö¶Œ{MÏH!>Džú¸·ºwF1:˜8­ ýǺA  *ìfrFM‹ ¥vÄ°ê]´tDNÆø­ƒƒº­Ûkź“ñC‰„ìYÞ¸ µ¨ÛW.„#cDÙè[…W…á¾Fvò¯«v”€!åÄÅ!Ú'd˜%©b°S"c`½â7/ê·ÑãÑÜåEýgÀ²bÉN³‚)™ÈþÇ)t–P‹%ogú‚9˜SÝD~º›²â°RPpÑnr˜¶œ{tÄ÷»u¯(^ê u‰ + D¶b±B öW6ižœy4ˆ5‹•3Iͣʺö^PË5ÒÕóŠ4bÓ²zl‹57Üæ¬@”Mî#Õ€$™ €’³šh’±±CU&Ø^ª÷ÎY-ó g&˜Ê9àÍÉubP3‘ÐTÿñ3á<À8S˜‚(ÏzJï÷Æg‚wΪþãgªø!+2{h÷‰ ¦ìv»a.*Ôш7è%a´/¤E &jš#c6 ¦^f˜cƒK‹‘×!*ÂÄxXRæBnðBûàAX< ЂۘÀC‘Û!*Bê ¨§ ž¬Š­ÍíªC¤Ë7ýÕ¯óUU© À‚·Ý7Ž9S2E®C¢Õ«ÿÚ#l`¤0æ'×XQCT@!Çr}O#¸Šr|?¥xD ²Ÿš‡q‘˜§PYW&Ñ>ðÈ%›LÚ)¸ãº³^z¾j™èÌVÂhsK¬ދ1µ÷ègVŨï] 0–$dþÌÓØz4ABIjÿbÊiXQrµmƒyïâ0k“Á¢2ãeÌ`¢6A^ç*@ˆ—›c(pâãAÕEnÑÀõRvÔƒüì£Ò‹]Ÿ ϞÕË8[»Ë”n3žuׁgD& N“â×4<>›cv`.È7«¿7ËɸcÖ ¬cêE -á*2e:óЛÔiÒ‰9¿„ˆˆ4<ƹ¤ÿCy…z×ÖY³wc”)!@×c=@÷Îv’Ûkà‰cÕ^ˆcB˜‘W\Ád%ÃêAÌzWÀzQVÈÈ9 €ÕMˆ¥æ?š§€Æen᱗N¤ õ%Cjáڌ´3qú‘ýh¢&Œ÷Lvîâz(‡Cë¼kÀÿC.uoB¦ƒf¨I@ëõG…YA§viRQk8H€aÀ-€ò½"<NæÙÛ+ŠB¢.=˜f¤>­ >¤kFEÈÃ?TÃ=~ÂJ!mS%ÁgbB€ˆ—Át^¢.Xm.k.*ü„¯ŠÊkH€rDÁŠ‡ÆCÄÃ(ÔԖ¨€%(7³Ï¤ +`홱£ܝºáÕgd?‹üH¹ÞÞ2¢YÑšLp·ˆÞ×3šÇ}ìBiæJ“FÊèc!)x"2¸ÅØØ{F-Iý}R=Ñغ,áúXücâú‘Çk4 r©ÂÂq‘álP6t„öHßðp®Âõ7ŒÌ£ÉŽþ»¬’^‹”áš/:‰Ï,¢Sr:&ÝÈ°‡9kœ [¦søvëæGxH†j€Ä‚ý·Ðn~¨S­!ü£ŠÑÏ!Lú–î2ÈE½í>ྡ¨gžÝ@ÂüÀxJ•†?%û¯yŒùDE*óèDÅÏp€ÂQOfÎx*­'¶mƒ±†£1¥X}ð W&€bԀ©ESŽ4Õs­HÆ!*ìbeT\æ?¯wÄ-<0ƒC–0Þԁ5º¿9SŸ8Ât0¼¡(’›×4 –©™ˆ£EÁƤ`bè%i-F¼À òV‹beV÷¤`Ä¢«…ö3µ¯‘ҁýÔ{Œ¬s‹^“M¤=å7z'bõ´wh‰á't„†{ã[9¯iÐûö@7aqqê©!!f}NY)Þ$iŒ] >ɜ)XÅ!Ýó²ÈQßTS }à¤t測ב²Ä¢IkçIî£*S…FXh‡Ÿ³d⼕C¯™œUEò[¡Ñ5lÝ͸¦ð~{ W23§9°ƒd2N±”.°Óȳ…îb Žêâ×¥x"Ÿ~U€q Ÿ2/©g½#èò0ÃüÇzW… e¼.ˆ@¿¨b›ê‰5  æÒ7 B[5@ÇîTÕÀ¯=i{÷‹J­ä¢Æ,%Ü)¨)"B{Æ±öžiUµz%ÐOÔdF6Ç(Ղ‰ú¤¿qQÓ£'Ê[j’ÓÞ7ÏûiÔ¿ì¨ÖV¦k3pZ0ç’6ÆÐÁŸ4xîKZw»YÒU¨SyHIªŽ°QµKëG [Ö´V4Ü^Xúæ`OÔÐüلÆ`*Ÿ€?XÏÜn›õ@ ‹EdÏ®Qg†±—ùiC‡ÆpNOÚ;Š ÁüŒ”ÇA +b˜lò̍I60j2î¼daÿÀ+ÆiiƉ³VRQP7/ƒ‘…œ, Ö_#òT ?š™»!©GŽ?â¸L–^ÃÞÊ®’ Íh$?jŸh,‚%O±©›4à2jÔ ŸÂ±Eã-ï¹3coʽ™>8ŽðQätÁ@ 0´ øv@p³¨QŸÒ¸è`2xÊ­923ä(œf$jëeé“!¿!¾‚7ŒAYX°Üúd6‹ÌS@ÑhaÁ͑†Êfò÷xØÖB-Ë56ÐD‡Ÿ»æìöðP͎4û"¢p6«#PÛ\ÏEÁ¥&á5óL€HŒzx‡Û;3²H'·ÈPȃÁþ\Ñã àª7ˆ \ߣŠ4þÍ ˆLŒ¯Hõg‚‚Åš€3êz„V¢Òh2ŒÒdé˜& /«8ߘs†HEã5ɾM ß;žß?€¹(àÄP ÐÎdWb(!k€a橆DÖXìzøÑ2Œ ušÌâ½Ó»jýܱ^ñ>Ut ƒÕ£rL,}“ßf]æ`fš Z¡rbb+ÄU:OÔhs°˜s±˜×7Œ+¢Š¾é–uié%*ØO‹~å öÝb™½…õ@°nC¸ÄeQ„!2²MÝVdÿ´0i…ÇӐl¹ôd©aQñ:ÖY½¨<±rªÙÁƒÏ&Íå`GÀ =y‘L0/Bºž£ú;™øSlå.w¨–ƒvdԞ*½Ô©G¨Z"üރ倥S‚WŒz»€>pd }³æ›c§yÓ%¸é\è`…5 æøÜ嬏-نE£iÛ½A£šþÜ_H±¼ú ð5,p‰õ4{{hÂÂbhÔb¡˜t;‚ÕÇH§A=¯€ªK6]“×Kb¤³y˜™h¿É«l4¹Pòñ§ð>œT„bMWB‰«×ŒÊ´ùXñÅÎx4x'XI*qU‚ÉyE÷?¶ +“Cxãŝ0t3§–šufW,ÀRãݐ+âG™zq1;A±Ì$@Â*v5< ùÊZŽ vƒ”A®ô†âÈÇ4íå±콬HPãcÐ$^ >+®‘&hrO]—HøÄ,\5'Ïb Dæ(çÅ}“fÅÈKÄ!›sEnµ¨j—maágjˆ¼íÀwëba Ғ}ÄÏL¹XêiiªL`“‰W³!™5ØÛx..¶}iŒqT!V¦b à´9:€°yfÀ< #O1Ϛµ8*÷+vîó½h¦zt JŒÅBÊý=5¨Ø̌¤Ãç "ÆeNYS蹡‡1°H”¦Á•QåGœÀÌ:ÁñU£‡¡¬ƒ–¢ dUŽ–ªœà†2~zîÀÞúi¼*f6§b 9y“¥Ú"e1ÉҜp¶^yO=~ þøܪ¨ÕduVÛÜW÷-°“³®,À҂856Q ÖÅÑì)èÎý8$ EUq§Ôl••bŒ"›âÂg즢HøR1t€P¥%8[ÔÐìÔÄs=VfŒ3ž†KZ¼âéFç]4ŽQ½—²ÅKò™BÛ8ÛtP»Ö4Š“…•×ŸÇ>b¢Ò&½Ä [ž$8wÙ¢¯i, £4N -Cœv&²LÌMU³cÀ~šK‡>¢¤ÆÑESÎ[¶Ì¨.]&%"O Õ/OYçÏQÊÈz¢I;-Q !˶#5et°èƒÁX#PêœĽò´.¶¦†a)0*Plڟ*~ú¯Š`FUúrÿ0=’f)J +¥„Áô:æj– …5{&‡aìÆQ;„¸ø (2;]èÌwYœ·L¨#D™|2£Ìb@£­Øtøì‚Ùß_̳ý1µýÍd?M|ü‘Oî œ5n•»øóšÿxš5Š®¦?†Q™ûìÇaQgM~Œ«oY³å>†L ÔJŸúzy Å3CµE0aM|  zÏ*ï1 ÈLyhiñ3¾¶f=ÆÏìZe=æK*Ðl†šsMqœí¼l2Z ðrMx [. šï8`†íÛ¥;ö{ŒÁ³#ZtP„)Ñp[ëdÇ=•i|qk+0ўê8K±»Êtk"æšé9ù)’ÔDÇÑ|ñëLÇôôiÂY‚  +â#5Ñq²“v•èpPM+dyŽé†cËs 3r„>Í1,!ˆüõ,Ǽ̩Ėä˜è€©lr ÀT&5ÅñÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc§@¡ 8æßã oLãóLº1SïsO Þv¶1º'‘ãa´1d›iD£±°sb%‡¦5ÁÆÃüïä•ÌíTc¬Ú9™Æܪq'ÒÓôQހƜÍÏgòŒY®VÊ\[_þ,v ñüñŒQw=çÄÀ’‘f X)XÌѨ•>YÆWWìiCý>ÄȖ³¾<“ö$È™dê7Ž1*J/õ`4éõ÷ƒú½ ãïrí cìÃÂo!Œq\Ô˜` g uÀøʈ¿5jn_ŒsDzы!$ÃÕ¼˜%Âøt^Ìœü ^¬yR­ƒŒì@ú > /–äÍ4ã„7PñVŒ4¾Ô3ÙÅü›ÊË{ƒ IY‚]ŒÛÀN°‹Ñ~ +ï]ŒËnBÄR +ªûµQ‹9‰£Êf#Ëz÷ Ãp@C2XvhÌÛÐÅ|o&¸˜.d¦ËN£Œºs‹±’@©v`‹º jÉZ%@+³A‹”'±˜k§—/Àâç¶ÌkåÈo+pŏg¡ ã}ƒR|²AŠO«R ¸~8Å`;@k·!ŠOGՂPŒ’güRŠñ÷!šèD"3l@ð‰©žowâ‰áUÀÏ_éÄÄt•;áÄCùÉ@#Ž´Æ†&f‰ñ¨A&†t +õסSï.øظÄÈ×B$\b ä.Õ*P—AÌà¸w*1]„cŽPà" =f&1ñ÷%ÞõŒæ°0ˆÄ̬@_) qïâo<âæq3pÄ{Cµc1<®ß&ßÀÌ*Õ; {R +ñ»+7£ž–3c¿ëØAĨü€üHb6NÖ ¥¤_²–•BLžëg’P;Þ~ìTõﳚø´¶5Äø%ÿM>«yc+˜å Ϥ³¨™`6ч‘<Çòc…£¿]O²‡QÕ®»Å¢L5 ;wð0ªx¿Ì>Ù5xù‹¿ : È4f©`ãoWZ2’€¿Yªº‡‘ü#€ÃüjQõ"`þ¹â†Q,ˆù*hï•©_FßΦ¢ÓÉFÎNB †2îdÖ4| °†áõÀÙ Î0Æ&NŒÆ¿ãal”áS€‡` #aÇ=Ãgg# ÃȏÌãþFb+øÂUú†‡F>«ÙÂÐâû´0À4à’ldaä?9 , i%¤œÁîîK±a…©³8zR…¡y0F”ÃSc_ʲ3…±„-Â\8àlM”÷ +†j®õš@a?Ï3yÂø›³ÝŠ®ð>A® +1Kû´s' £ç%Þmƒ„‘Ćkáfë†FÍΗxˆ)tàñòÎÑÇte£ l;¨ç†Sl‚ðÁ7¡=oá×ÛK؈ÂC3q⃡èý|ˆÃ—ð`W&;øP6uG›h—ä`Ü¢>¹Á‡¿LiŒ„C½ÙÔËR5y‹…  ð/æ$#!ÒÇ?â4í¼`k¿Œ" ž¬àjá6ñ"§Š‡¨`nÔê$#Эß]@Á—ƨä$o”à0$øQlÀø_ðWé+-ˆàjÇ&6ñÚ!Áù÷ÊcàQá„ã&دÜ~˜ÇîÉjM .§õõNåe*¡ |p%Ðk¢ŠÜÚ½£ñ½Šem6ðwøYÑk >X@\ÚF9,e.Á†Ö®D30}ž;HIˆñ ~½7“ Ìõx{ãEâQ’ +|PaÞkR1j0°²QqKé¸ø [Š;>Þ À"••É> ì $0‚7íމÀˆQ#f@`hz°¢1£_–‘A……RQ„0Tk; ¸º‡—QÀ¬ø&Ú@*ü Ïuã@í¼’Œd·¸L ž +­`8n ž·ZznÑ!”Dpgc‡1À¢K"€yW.Y¤ðEáµ 0” +ƒÿ‹'°tåÿ6GØÿÛ\ãô_äÿ© Z*ðˆêF6Äì_Hš5úHaú{+ùþ F ÿbÄC}G0}OD°ó +þ¥³ß¦‘yïüoàß4ü{bêèOrßÝÜé#mðيýU£“«$÷·P?d.=×_ÐK<—3 þ-Ð^Qhà_lG _€ÑKóíþ¥¹˜ñ.!1ÊÉ~ ðoayäYßÀ¿i<¦üzO,Ñ®gri¹ËýÆýÅëIx¯¹¿Â¶šš¦ •u¼q‰‚o÷“Ü_ìÙÈ î/Q¶WioÜ_šÙþ+¸¿øûûËÿ}¼aEûmmby÷ýLì/ÿ©øŸ&#¬¢F·õ‰ýeŒ/I`ù€È£Û°¿ÈT‰5lì/îÕÁ~́ýÕ+5džýe†®ŽIý%f‹ þ²}ÀÃDçJýÅ/Ü'Û šú‹S:ˆü ê/ +ÜÇNý-5°‚Aý¥J«º5¶2XÔm=õúË]YT4Lþ_ÿ þÂRîÐ%õ—´\ÐÐ_„Egê/ã‹ã|ƒþ2Q§ïÊÔ_†„¢6õ÷yý?âlÔ_`*ڙÌ_ð'k¹&òÝÉx¢ñV¦ÊøËÍÆ9y¿8Ð;ì÷qƒŽdý2è¥"ã~q!œrvÜïóø›ÚïSQLØ/r*+YY¿ˆEV…1å~Sw3I¿ø»Öó ô{cÍ9)¿·]¦„ü2kr=oŒ_Ô¯Ÿ£LÄ/cs +7ֈá#%pÕ7Ä/¯ºe2~ùøøAf¹¦Èç†ø}T“iÀ/â`Ì7ð‹¿ÎYù¾°¡Š&ð¾8Ý Ó}IAEDy…ûªŽ‘p_æÚPKÃKëĝîËAm¸£šJ‘p¤ûòna@ß辌á#¨t_ƒõrŠ¬7º¯ò?ýJº¯4óíNá€>»Ñ}qÚìt_V¡4辸”[:¢ ÷ewŠª‚<¥ŠQ؁ÏÎt_Þ ®x_Záaïˬ=‚݁÷…©‹ ï kP‡jÝ/ÑeïK³+ޗÊÍë‰÷ewŒÁ÷Åh‚õÕÎ÷•–$ƒ_¹KBÍ÷-Õɒ ð +×ø•äS›]¥Ñ¤eãûÂHo#ø¾4 D|_° ß¿ÉÅ.6àW}ô%mã1m€_XY9€ßBvkk ø¥cïFø•õ~’ð˱ú҄_Hßß¿ìak~U‚šv~Ù¶J8 ¿j¦vö$ü¢§ô ü22E坄_ +½Ÿ«$â·tC—øåß|¿WÄ/­½&áWzñª<‚`ó=ÀÿáWñ¢t•$lëô¨0’„_i¿{'üÒÿ;«†>‰UÑDîN0~Q'@ºÛÎø…¹4}Éø…Åӗ¿´D¾s2~KöŸ0â—ÇŠ<¨Y@ 3·!~q¡rÆñËɚD ~á±þrCüR›ÅY$ښ`…£¶&üâf\lÜ°~!Ò7ºØ„_¼cçhç$ü–ÓK¬ðË"!º‚Aøeï5%ŠMø¥ó®– á·D> ¿´\ÖÇÈôÑí_–gñ=o„_q%ʙ„_ ¼¯‰ÿ +¯^ƒ{ì„_ZñáGš¿$üÂÀ‰k#ü2 ±"‚ÎaÜ|~e}'üâ÷ÈÛ Â/¿’£%à“ÇqïËLßyäû2MZJÂ{1BÝ +ÀNÄ/†;ç9ia÷À߁Áçh;ßÆà Þ[Û0Ã#º/DÇp2W¸/»*ŒÌPÒ_¼ þÄh±‘}Ǖ 2/ÃyÍìEgaf6®/!¹÷6ÙÏ{Æß+Ö7mÆúޞžƒ× †-–·Õ÷:¥ÎLš¦oü½"}Óf¢ïëü/¨YLô½õ]x¾·‡Œàùއ†¾ÀùâoÜԍ拝¸<7Í÷¶Ö%`¾÷¡7ycù^np(ßË"à ùÁ€ÌÀò%Õµ·äøòoÁB¼i‡â #Þû€øâo¼4ÁðEPœßá{NŽá{¹5M|¯eø"³‡s~/>A”¿÷ŠÆ+¾X®!ЦBÂX'õ‘ðÞQ%Œ_Ù½´‰rÌl6ö! Òä^ДNõ¶K)&¸cmœÉíE~qa{Ávi£öRóˆz^C{‘1V›C1{//-7d/{ß²WÄÞáuR{q Þo¼^ž ˜fÆõ¯ƒÖKDP+¬—Õnx9ÍêeM”JFõ΃,¤Þì^jPot?òë6§t8€é½ônü.öy7H/Äh\èÄF^Aè%Q ɶÐ+Êá|^ü9X›,>ïmeņç…ñ—x^¨û¿:/pÃV78/ê&^Ø¼X½²q‡«§ãï•Ì›6ƒyAËÕ¤$ž – Ëû˜µT^,ëÔœÖ +R"¸Ò_©¼°ª½€bb¢œwRy¹Záô¿Ry‰œb£ÞðCŽPטÊË-H÷_©¼˜ì**/<Ò*Ž#Ë*±ŠÆÃߘ¼XvÁ+&/ÏéÐVª†q›¢; &àcœºœÐè^¨yHHÁPpµÉ+£ÞÉ䅁Ã]0yi`³ƒ•ÉK7'o&/Ap ƒÉûÁQùœ>Ì“ÉË`Š"6&/­Ì"šÉ«^½ÁËÀËAW&/ã.Í“—Ü ^LÞ§ëÝؐ¼¸t®þɛ+̨eE„” ɫƘòtˆä¥§Ý3|8Öì[ôÐì@ò*~'àoUÛÏÁab#ò2‚…÷3ˆ¼Œ1`íD^I0—lDÞt-Mäå iQƒÈô‰‘8[‰¼«µº7ðAä%%ƒ×Fä¥Ê¾ ø*|©ÈåJ"¯P õى¼T>R»P¦ò›Æ òâQrá´yQ£‚Õi yQfEÖµêÙojÇñBY5ô=Òõ†O‹Ñ!`¼ŒRu•NN/#*ã®IãM1mÐxi`G«µˆF²ô$QäqNÃwC\Ë¡y£ñ2$x>éú)¬3l3Ž—Á¬Rv/¢=¬ž4Žˆ¬‡È ‰FX;¢4þ„ñ¢„ªOÌUÅ ØþÝv/lèéúYmÖïäð^þ.6 /TvÈ?˜Â‹?Ñ× ¼P©a¢Þ¼—Ûö‚÷BµžIàE$±‘ À{9ØüÝó(Éߎímø]@žˆ)1~w8hô]R¡®½Ë&1P½½;Õ îîp¦qÃîóƒ¢è Jú ê.N½©Aø„î²5’vfî²F½Ü‰Üí–zmÄ] +ž+»h!‰ÐSðv=ëo«Q|âÛŚ ©‚¶‹¿áÄo°]¨`ÞÖ.ÔYÈ jhؾsvQ Šèv`vOԗ&cZ¬¸7Ä.ŒˆÝaÄm” 9y³ðþìʇ^÷TÏÑeŸ×‰ß;[¥ô”©2 ².ªj(Ù^Áº€và‡‚«{º9p`uQ„%ñFՅ_QPuOO:Õř4Ãù2… Á;¢zFê"Áy™° ŸL…¦ö9€ƒëåÚÚ@]¬ðÞOUµ@pm8ݧ8ápáãÎLӅd™|½¦ #†Ý`鲦èé‰Ò…Á¾•¤K±öy&H÷q=8ºø;~(9ºL l] +úk +7FµN€]m]Ô/ö6)ºaŠÑ}GÞºÈJè5‰Xvs>´¸¢gÕº3ti½ÕÄ^ТM˓ ]†ÒáÞn]¶JG¬1 º˜÷ö ˆ. ˆó­Ýy°}_NqPtY´€`ÇFх«/‡2fðÜ¡ Šnæ‹7Š.=4öVºf g¤Àè~ðìfPìctçºvŠ.B¾‡Álñâ ®‰+v‚.j wCS]Ü-¾ÌÏÅ~Lælø\Vn6ùߤç>À (.csŒ±oð\UFôºlˆ¾]x哞;M+>—>ë³ãs ê@/®Àç* _Jòs‘$àp³ñsIKéìh¬öq›àç*¹ Ñlòs)º@µWðsihâåª=ö)|ïŠÏE‚O÷Üø\‚Y h|.¶àmÚð¹Ðg°¹}às™dÌù ÐÏ£pÈÐь™ôÜ ÎæÅè"×eèÂÚI%@ü%:AÐEʈ!¨ KÖ®AЅn^ti€Âu#蒉Ô®æì(HRòs¹Ë~V~n9íÛ?eÁ\”?Wýà7z.³iEþ0•Œ<ç.ÇAý“Ðòýž «~ÌôÜB(P{’žKÂ1=֎ô\nÆ;`z.\„‡žô\$'9Ö=ϗºÀç¦aãçN«º8<ãAÆ-TQ׶t‘Ô¥§–›U/€ ; +@7­Ð-¥ÁM2@7_Ì ¡Ëìì3 º,¸F=ºL¯U•~Má ­XÚC—É5¬k‚¡Ë ÍC—¯=Ö´d貘)(3tù¯X‰n]âÅàJD—ÉBu_¶$xÑpè@}ùxªR¹¦è2Ì´uPt¡¼cÅàNÑÅ—,0(º$"\j$KŠ.eh˜•7Š.µ XFÑÅKÈ6`;Ff£K Mbti¡6oÃèòˆý6V•/ä¬ã Œ.,Œ‰­]ú¦LÑ£KˆØuÚá!›*9„­VŒn£Ëéêqw[=IÜ06Ü0º0ëõ2F†£ËM$;Y1º4óQFW¶Ë`]Ñ-Dú´St©¤T (ºP®püHŒ.áÕ­Ù'F—áaVvF—ݳðqùðÊWŒ.W>Ç4>)$D7 CwZ5B›’è¤Ë÷ðƒoþGX°F‹… «âü’]8û\­?wh´Ùñ¹C±Œ¤ç©Éž{Ë/ØÙ¹/ã%R® ·J¢“œ{G»Êœ{“‹¼ìs±ê*¨¹Ö²îÔÜÛéSsÑLE´÷“ªN¬Ì\h̑ß53á5D;F[-øڈ¹0 `.bÇ¸\Ô`¶Þh¹Ð£+-%X.þVFJ°\ü:³•Kê0:í• Å=^Ÿ<;7)ßH¹ÌÇÀ£M jrÓ»è ´À‡ÙÂɅ~Ð* ¶íÑàÜ6Øp}%äÂß@ò'¹ìÉw´äã6ˆ0÷ŽÇmÖK$òw„q³&„v8.¬˜±‚Ûܼ Ù¸­I•µ£qÛC,Á¸HÒ"ªo Òálƒ±bqûca©¸ µ=-¡¸p¼2q÷蓈‹ªÍÏRÒ Æ6.ŒL‡‹(†6 W±”g‡ážk ÷tcÂ@áž1-$\èe½7à ç†ÁEؕ¹6Sp¡3x&5²X3o\äékO.þ‰#ø·ØoáÆ¿…L§ºÍ‹6ѯs\A¿…ª¬ +;á·¸H£û7ß‘£¡Võ%œ‹]Dø„²d²€éô~'÷vy°ao‡[6õ6j«z; Sؘ·ìjÑz"o³@ÖÄÛæªîx %b SR4n:{ðn÷Å »án è(OÒnO·– +Øíi æƺ…1‹@݂×o-H·ø¥bòm:çÝeÁ¹…Ï¿&0·¨ëo[ê# ­0ã|GFÜâ.àýÚ·0²kŠ· d"l|ÛæÄËÆ· `Màmñ7â@ÆÛâO6º-n œÕ€Û¶a„¡-͘ƒ m‹(Ö鬤YU`[ÔXáSܸ¶,~@ÀþŠ>0 +ÕIÓqíLÛj!˜¶øÁÍ@Úâod¡7¢míZü%жûÏöäô†³E†Å%e¦±ŠpfKÃ}î,ۍȎžUo˜;áEÉ‘'D6’íòû2A¶]!·äØ^êý°clO…דb[<§b{K/½1lU7Pa{ómžۛ¤Œ7€-Ø„ß›_{«dÁôÚ[š¡7v­d?‰®½,Ö1¹¶º>j'×ñF\kYlrk)b~ÇÖ2œÑ'µV3K2k‘q-ãY‹˜÷³ kñÞ²=„‰µÔû´7`m“—¼ÚêÙ;pµ¬…>ûN«…d\ɪÅڃxÂ@Õ՚¼¡j_Ï ÷$՞Œ%–ÕjÝÓ몕˜ë=ƒj¨to)]–˝¤ZfûOY ï/‡¨ÿ¦!}p¿½÷1õòR7Iµ.à +Pmp«‚S‹d% +¦+{¸XA©EÅ8ÜـԞ®Gܵ éEÍR`°6µøûÒ?ÏÕÇé|ði‘±DÈ?ð´ä´Œ¾ÓiOxFp€*ŒˆVÅù²‰¦½K¦fiÄڛ÷Až`ay¿qia¼˜å<¿‹r݈Ø≲ªJ‹:fǀҢ.ˆá3o„d]’ö¾µ2$-Y¬÷•¬Yz0ol@ZDñàŽ„qܒº6þÞp´a íåy8(³Ð bIº±h¡ edÅÆ»(’$Úü{ц18´ÄçÞObh¯S¢B mš–BBæZ-‰sê[¶ø§ŠÙ‚@{Y¼Y¼êM;ÍH3®Ò~qDö3}²½¡Þf“?‹ ^Sl’!þ]GÒg³<Î>‹@¾°`ÏÞî¾ìÙÛÝÄ7ô,ƒ¤ý ò,3°âÕrVd†¶<w6˜I½o7 +êìí/r‡Î‚3Œ7 ˜³@Ú" ÈYü]¢žÄYKKàìƒE‘ñ²X=¢jžÛ†›}fW9–¾æ;FÀfY÷RΝ5 @SUê9ÊúTH¤ÙÛ«Á4{‹¦•˜Ù'=A™eeš{éL-2iÂ,p5cçÄÊÉ@Ì¢ç4œv"fƒä¤Vy¿T¥€ÙyŒ•/{GrÓxÙÛɞ€ÉÆ'¿Áe!éTØApÙ»è&2öê&ÃmhYðUH +R>ÏäÊR-}=oXYFö ª,Ñ#.G&Îá:fÕn +™¯cî +zw(ŸDٗA•¬Pv8Ɯ@ÙqD¥© –Ó°"e§QLÙaN"M±ìäB{#ÊRlÃͼ˜@¹M@öèˆtWˆíDY(íUWm ,åùŽâÖb -Àf*i¦Ò|0ý8¢Ñ%Ý)ú%{Zà(YäØP@$Yʖ˜w^I²Hlbõ Y.¬¼Šj «tŽ9Õ(˜j¾¬MîUB¬ÄÈbÙ¢˜ÜJ‘íX²—:ï8 ª+7C¶[ž¸!dÑ%Qgî`dž‚ ûîÎ|þæÓßdÿnYvëb£.¼˜ÓL1„C¹>©Éay”4¬Š®Zæ,W`4oçè OÖOܖKŒÇ‚täOŽÌøc›Ø¾N5¥!¼ªäće5žòÀ%uÈ`muO¹ +ŠÇL(Znsá±Ü\ö4÷]Ñ閴Ÿ&A«&Õ|ÀñżRCò'À4*É)|á‘ðÀ«º9“O^ŸºµD= úf§q•ÁžŽç ]òÔy.æªÈQ!·ê‘EIJØ –V–])6-®³€ÁmL°æ…dÿTLÄÀïlʀU›¥R΀à:$SŠŠG }»§\l%®R‘Ÿ"‘€Õ^ê}ì€åP¥8úf;Û#aƒ¶Ö#è0¨ ­¯IŒe&._SÊŗú8AèZ]Eh5e¹à=<þ›rZÙÎý‰Á‚“¨V +/X¸RâO²?#,#êäÔS¬é'YHŇÎn]‡›‹qQU/º¨„aãxvµ„öW ›!í-,R#â~â 'ÔúŠÎt +ø›îŽ¦·këpùÀç¸Ü»wWÝÌ.tYE ˜ßkxk´”<[x‹ìÊ)XV¬K½õäJ2ðùr¡Žïß@ååÑøn4¶…¼«¦O´…\4.·ãhjs,JžÙâúaçn7ÃÇÃ:>ŵ I"Rú0z‘–ë҆Œ7À`xeaÉl^yh~‚™>E B-4V–&ãC¤%ËçQƒà?̒ü‘IË=º ïqMìf²"ED¨bÏ÷JbßN7žSäZ¼’w]ë ¦™….˜ã½á DÑÖáìõ¸÷Øæˆ0Û®S;)âÅ ÕÑ¿±‘†‚$ì]#-|GŒ’~FÑ3B,}2$ЊC…/µ©ù#Ûo@d‡=µámF/;aE”Á&š‚*\87@gÚ2 ýM† +þ,y‹ŽG”¯Bh²÷S…qì‡*q†“|äïã±°€‹_tvÁ¹Bò\X^,Îý(¿à«,þI,˜ Óƒã)î ÈhŸ5^,Û{æaf§Ã«jµD çBhÞ ¶à‰ñ`W•Z+weU%ÍÌÞ@cK5Çåt;,·zCTQn¼kŠ­€Ø–Ë'vi~˜Í܈@ ¥(‹ê±¬Š,€÷M D–%Þü¨RÃè¯$ñ9ÖQf&³fǟ:L2¤Ñ@=G¹,-gnÔzè.3^ì!‚4Äµ§—Gç™± x/tµáÂDOB¶èÁ1oG©ðޒà©Ñu$Õ`ȕ‰Pä¡G¯E 4Â|ªðžñ/¿\·ÉÌâVþ¨8÷À}_.W³ŸñŸs9t ƒÄð ]Åf,¥º¬–HE= øà!X€…}$ðˆ ÐB^À:.<( sÕÚky@%?}l2W=‹+E1‚^"ÇÍėà+ãJ[:“”›Þ®ÿ>½N±Ëº|Zø()‹ö²›Ã:£®V,Óñ@ERa—æ]Gdü¢6¯qz”¦o–ÂÁ€»æ4O¶æ¥#20Èf5ÁÂ29nCU5ªŠ®+•`ÃHv4K ˜WÏWà4u±Ü¢ö¥/Í¢~Pœ}@»¤j¾G£qæ°áÈ&wÊÝF4«Ax +ÖXuÄξ͐5–hàvqrO-·±æ-öäj ÁFØÄþÖ³á¤ìK½-ëa +To©9ØWWµäòrÊw\úžo%·iá:üºÝÒf533\-wÕeè7TýÉn@·ÁªO,ç\7\ÑHhÄÐðÖ+z/`p 7œôúK±ø²uõžv8^²«W<¬©ð®@βÒîS#•zž^•&ýªæ+R©<ŒÀ~¼ä} Ë<ÙT’:ÌîDϔÝEwÛ‘xY8¾ +âpWªÄCŸßM/á=¸>¯tü kä°~ìÕ÷mTé0›;˜]ցëóîB™ƒRÌ­mqB¬+);7D;EN–W¼G¶´]}ܔ¶•ó‰ÚŠnŸƒÊQœ(‚'¿r¤¿*FÀkˆ,C†LfMKÇy“»2ˆ.bN–O=ZñJ©“È வ‚w ‘*šÃ%³¸bÐ$([¤ÜeèöR‹Öu`/^ÔÓW`o LéKÌAPþ(̧é‡Ò +ÃÇ ÔèÂëÝŨÙ`ÚmWe!r€ÇÊê.ï:ìÊpé.óS+*>=ŒïÛëPøm”j×ËM¿AÇÉe ԍp/‹5ñ(h ~¼õî0q«J!1zb8T#¸*î8„zìxGþÃò·†©—×ÍNù.’¥Š]£Õ³ç¹«ê&ಠtó›DߑqÃæx ,xzï…ýW?è.Ñ;µü"ã·Bt&r@J3aTÉRÊæ/猻Æqÿg&ç½q0U€7†> + ‡`1å€+ÌÜS Vž;Rüš³óÄ]]:BýâÚŠï{¹ôș+BI´Ê#°ñòC܈¦v?9ƒ³riÁ\÷­V{3Š ŒN½¦!Wvѧϛ©›³Ê è~Ûaâ3Òÿ kwrŒÝJšòTz?, æê¡Û*d†x1ÝN Ù/D󼘬æºULbø[Ä&œÀµüï†íÕfÝJÅwÆÐ+bky½4LÈÔvÏÈ)¬ +mÀ“Áƒ…9QZ¨ÀD©Wӎ|Ž¹'•÷۞„ÓñŠÿF3éfÝ@îH?¨RN‰È^pÜÛZ½PÅupˆD–ó‹®|2¼£ë”Æ«2»©¶Ö\*±äYô}Â,©¯’f·–»ÊÂw–Ù0FÿpDyè©W:hp‚‘š—z†¨…?Ê'íÔd é|è|ñ/ÖÀᒍòž®úãg“˜ŠZ D%ñä +U”Ü ×ð®]IçuŸfíFS@üˆªóÊôrÑÌ3ß3±å<øŒ(¨D‘óR‰Êa¹{H`溆fDÒaQ»´ÝÀ +¾õJž2÷ä +fFy,È+`¡Ë…¼P–АU6gâ·%Ôµï_9"Ø/áspÝπ"c](ŠFDD1@Ä_ „gЫ‘d Ã?ŒŠ†£ ‘l àL•É§ð¸´€Y˨}îI ¬ r»Êù4ÿ°¼…–ìûP÷¼¯äˆ] +HŸü\Ô\¦x¶â“¾B›ˆøöˆ\á°ìiÍð)@V¬úA´³j„k[.j/#ë@Ð_¹2 ðxJ‡€i°{Ï-efîɺ’JWñX;i°8ÝeÍ,cö #ä™&DH(F¿bÀΛõ(5h])nÀ©=Y†ËÇY}§è1±SïÑÿeœd"ù¢†‹«…°RNƒ|›Ãi1XÎùqÃ|1;p«¢˜ÇRXýæôÀT\¿µgÍwˆÍ>ð~§G êüœå¸Ãw„x¨b •.³2Ç<_|™:N!ðOjód͓ã Fw®l‘þý¡%" £»r zÍwÓvB»àX÷¥ ×®l¤xW[êò•Ç{UËãŒNW³h&KñN #tœ*÷µ£Ž:~H¢Qp?ûY\\Aå¤è1áT‰$«Õ_´¸Õ·e¡üx=à6³ ¸fô´n×mTʚ«6dÿnîh:cþÊs…õD‹võ¨¾5ñõ8ÂWN(¸Ÿéãõ4hÔpj‚ÖÙÅýòœ¿9sGÍ \Ê9ûêç.íHXTÓKŠ‰aÖÇyKÄS)Ho:Vþ&1HîFNÞ¥s¡EQ%^ÕîڞJ¤î7ÂN¬1äõS`Ö¿Ñ[õ4؟#!(0²<³€V ÒMº'K_LãYò7cÔ~–ßìrÁ‘c˜§«÷î03®’:s¦P"ØWÑ«üˆOW{ɃÝö²Îàa}“Q!˜o6ÛyTz !BL 1§‡M”î{”R˜{²¢<¯ç<#‘òHéWÌ{t0j±½«µ¢0»ÅؐsɑŒÃ;Èޑ2ŒÌ'ÜǪÁSÂ-t¡0º }RGЮŠiúÍáæ{4«ãoۗ1ñ\à lX֚ƒªì73Òx§y0 +³‘PWkë“h™¿z¢¤¥&¥>I´Ì©ìX6<òÂíµiú & a«à×`5SÙõˆ¶¦,%ç]CŸŒáJü0„R¢Œ¹÷ÊÐ/œJñÁ÷áëS\£mBeä>+·³…X8Èå®j‡j%¾pðJÎýҏîK‰e™© çÊüõfk™ÁŠ¯CA)v„E²ô"4 _\C¥’ЋDw =rÎ(æ_îÞ çk˜évgf„®‡·“ \%¢ºo QeÉ(ý r.ƒO†F0Ϙ +$ÊLÃD€›«'…3sQ碈ïÐâóeIµœ°¡'Jœ¬ú§bR¨ µCS„i£\æ=– &¤•¢µr¿`¤0ýI®ZÓéª +ÇꉬBoRÆ¥£³ÁLC×w|ë¤PÆeBjï`[ÕOj¨Å¨—_Þ¡»æ·r8 ¢ùÁtôa +fL^°(VK[wucƒ¦þHMS’­uQ›Uz°¬ ÖáE½9šÆFތ’…œ}´«ðQ\|ûRÙzñG µÛ81V´³WL‰xze)‰‡À9ÇXXû>žIý9sÏmná KsF/ïz¬²Ü_÷0eßôzémPڍ~HY”0èJ™å:ÕaGMuŠçý%|•ò3²Óâ!¥»Nnøê†t³Ë*ê_ˆç:ç(& ä~š[)5s6žÈêÄ̟{6ãwÅjx윒ÛË%Ê8ýp›Çб¢Ÿ—ŸËe/¶”èß´ª;>d$ÀæÇ*Uöyvf6 è +/XÆÕy˜æNéN5æúvµè’X'TâŒË–k‘PqˆŒÈ! lë\¢!0,13ئ/²-µð®á\Á‚ú†‚*!•¨ÀÈŎ5 5×ôßÉ÷ddžT2JÖØ&ÃÁ¡¼Nª1¡5 n+IÞm†—éˆwÑÀ=kÑ%žfæ¼YÙÏ0c‘C‹‚§ÅÀïӃ†;IuOÓ»E«1ª§(ŽþN ú™?z¸;U?¢`¤Åêïƒ/ö9ý´?&—™QNE¶‡ÜëÓLÃÁ1øy «ŠšÃœl–\ê;Eñ,}ìâÚ)j®SK<½3àêÔhÏM'°Ùiâä8—ÜÀÞG@Tˆs 77:1W©¸sw…Á™QØn-ʹGa»eµg4•ÄoP‹reJA[(v`ÇKÕÔÇjî"W¹- ÀÙµ”z+Æg^køÔљYolÕ[MåIe î©tWù:=! àÌE H¨l>Ü#Žº›vÍ]å N‰2cv[i®¡£¥X¬À¨õ÷qilC‡ìŒ‚m§ôÆø\IÑ`ŽµÄ¸¦ZF˜¯” Í{¤gW&ã8Í?ÆØg(•«^Š`mͱ…”CѦ“J + â¡bb:Tukej€\É036áGXú½„ß”8<,êE€+I +±ã'9äÃrå“2`ý‚`ˆ×±xŒ®¸Õ¤(<Ä,ƒU±#¢±E ’S¬DÑ*ÏÞŽ4›¢Ò’$»,¡{@×JÞ ‹Šúï̸fQ÷ÝX +ÎÈ]m¶Ðkfí 3‘•›ÜQhÀæxqR–`I& “Î9¹6Ý67ÖrR8ڝ n•²@ˆœBX…Ù©ªÐŸÊJ$9”Š‡²®\4éh] ïàŒ2X ‹¦ÒËAJN&5½9˜9•öîëÄOðí=œžH Ã2ó”—À%ÌWR±[ôa-*A©yé.ÕӅB£W=(R‡õåh§‰ ü:ÁXìé©ÀÌ"ñ+ú÷!ÇI9ÓåŠ-XÔÙµ m™{JrE{@¬+Ôݵ:I!k¬0§Æ+É7O«Ð-Ò³"ÒWxõª˜µãK½UîÍÅ×?õƬcÐäSU³‚§¶,`F%ÌRâÃòØ"µNˆrD”6Ô|‡q—4Ÿ§TuÞo»ª¿2?µºÃxV>ú1ëyª•@—ëDKô'ù+ ý*¤™,j„¶˜Z•Kµû +­0A™|ÒÅ`¾.+à¡pGÇ$ +­¨€oRSùX÷*(.u£rOK†&©ó*váÑÓ]áJCñè»MŸ¢§¢3XÕ²´Q©ît—Ÿ 9´‹¡^êS™íe÷Ç&e~zŸ0ROú¸7“<‰€Áâ,UWõOîʲ`˜¹Îd¦€¿‰ ™ôàô¢=¹*ÎñZ—‘e†¦ óü)¬gç^HÑF*å@»õò²k_Í.˜$).<üŽ{J਺yw¦)ÅM¦&è9Š\.÷Ïü>²;ú¯;'ãÃ~d±ëÚ$Á&©.…UúçË$a†)O¿ +êUMVÆpQFÆqæ#DÍ6°§¾IöŠãò|Ùí·©8,#‚Û§ X¨ëfµØ9 ‚LŸá³gN„¿z(£Ä›É+s¶a±c3ÔÂ|nç`=kÞ´6ŒDãPï»Ï±#)gªâ#È¥‹¦ÃÅ$f„Vè¸Ùç ¼—¤ú<¹«<¶T9ÔÚ¿ïz8­Z,º¢åT(Þ¥EŕOE½¬sAê*ÁËÙü3f8®™V +&Cé‹=ÅUARŽ«žbÉSµ饒)ìó‘r‰Î¢1*8·C¤åôC&°€»Þ£Ì]É#£™V“³&,výhsµçv_hӐޡ.4¨‡wd0ÆqœÆ蒲Š÷Š¬”f+óäQ¨;䎛0Ô±ìه+>šÞúÇ]raáâpÓMrþäsM÷ÀWĬc8_'±EÑV3`>çš]qÃ¹àêNS¾8rZËŽ7Ê3rWQÐKy‰ç På ‚3!ÑÜQˆfŽ­¨`Xï:B¤Ó-~»ÌÁË¥js0â、“<â’ì)ßܒ–k¾óÍmZq“´¢ªn\J]µ²Z4º,E>‚ð +¥Šœœ ŠÆL‡!Õ§Tv ™;uu…{›!‹ÄBå—+¢Œ>\¢bÏ~zS•¬òªÊB†Fq0ödG±§ñÓ\ŽÂžy¡¨‘L$¾e 縄æ°°³-&[F{sWQó àL {´ ¤> »Rl Ëqç¯Þ#[t>V£o!Ü+äUß} ¥ºtw™T½$oW÷0"òsjaÙ΅܎+ã!¨ÂЏvU=Ce¯“‹²dX˜¢’Ó`à5(xô܎w¤+ÝÀƒSü8¡é=Oc`xcŠRĮ€• 1ߦõ{¿°F ,ÖMtÅÁ.Br¬ö"ˆ²TiAP%ÁPn´6¿ÑÛܐłâì\6§ù1i¼²‘%£²êÙýæ2×Î̆wËaÀÀ§¸À­ o—V"'è–êUæ\e'߃ûþՋÚMBjüåWü2¢ô—Ñë:¬'à3¢>V}ýPv‚õ8ÝÂøK¹5u*’oHހ3 Ÿã5P„ÙÕ"ݧ‹p‹?3Òÿ+ òaY¤¹¹“8‹,䎃 ­g{敒ŠF’ò­;¤Y +ŠG£D‘^Ãï}^¨rþT’ã†Dބu¿Õ_ŠK!¢œkª ùАl Ž zUªQ8Ê£¶¨ +xù,ý7åº<&´.ÑÁ€/ "^ã–/Ö§/Ö܂æS/îíGEÕB“ÔUò,j<"£”ð÷$.½-ˆ€¿P†¹Mö¥§+̌>'Aº‚g}!…šJg_?‡G.s±Ú‡’¦fñj‹í³X¡RjŒgXò¢…:êÊ0îJiYí b‚f>2H1æãIp ­ñ"°öPxº–RR˜ª@»¹Nø÷Qð¼µj©–¬@΋…tNÞ¼nYJá—ÛÆe"bϤsSéÖ,±¥eg1S½SyošÀ ӂ–6=cºÓ<\t)P‘úB¯å‡Á·_|°„ËGçàEWé(»ªÅ¹ BöGÁú™M¨Î©“À6%׬µ;XÃ'éáF;"ç¢aXIñÄ¡u=Ώè^ªó¥2ŸÕ#'Ò?¡ ˆ‚[4Î]£•Pü†,ΩeÀ™?ʌT1Í +¹ÑUÁt©,CYo@/áaë:‘qeˆ2̍è÷ˆà2⪪xVëuWcó +ªÊhØÜL]›k*׋~âÞõŒôauF¢Ÿøpï‰Æ° ®òJA,~”éÂîh،ٹy®·•1øºÙÃá°÷ ñ]hõL Y®öa5èÿ³" UŒ{da9TÖà†½lÌÁX'ÈW×R€¡ü\‰’ ÔÊ '‚E¯AˆV0{³V¼kˆt`¦Cˆ4bÅ}v¸ ßx(ÔÊRÍ(5Ìž~¡ÚÀéîÆnL5Ï|1ø?íP½‘RÍ(æRÖ/Ɵ—n÷ôٔ ò7U²¨â‰à›Q(út1©èõï#®©|0!ºF/*¼há W×N䮢Äc1%êè—ÛÐT¨VKêPƏú + Muâ•w”‹Róò˜7‡/ˁØ×eÒÃÍ8!ò`Ê*þþQ30ƒ“(k-· +’¨•€„…|"6e”¦EĄ¶ÕÇÀL·®›%‡¨¶˜Çº”}`Àɱɮ.4LN©Ž{iÒâ¢à3ʚ<ÔŽ‡ªº.|QCT‰”ºÃ˔;0ˆÞ벸W–ÉYcÆ%Æpê‹)béFØÌ£*v2c©7ûT•µLÂC"Ð.SchYÞ¤âè7`ÍÕz×ØGωnÐDsîBWÚÝûƒƒ•DèoB˜ŕóš PÌÜ7j»þ?1¢ÛJ÷j“›X,ÜxƗØJ… ˜»›«øë(Î/ã—8åóBG4ô*¢¿ò`Ä1 þ‰Iú ´»ëNíSK×Ptuå\sJs#ÄYuñb¤/Ó{´‰UnŠ×ÉÉ¥L†Ý#]°øšÓæiv¤n‘®ãÌímF|eQÝi9תcµðãz&šwÓï͚×#yrðÐZ„é¦~ +꒼Ð5ìÞQo!*É)ÀŸâlX«q‡ÖJѓÕaLëÏ9˜UTM€%o!7#OÅôe=¾ìÂNgÑãÛíÎU‹ÂèqWU¿šØÃr¨XLZªKXx¨P]éø̺K‰?Âr…2S—`\.Xe˜odt<•À "hßë.~‰§“cJ«…}ƒÞ>›¢5¥Ú4oÂ2¡»Ði‚9(1Myäî¦H°(ڗ~CR„ÅpRHØRö‹†ãT5!íE&:g¦t‰Iãaîãí²r4¾I!È#r£%=!Ä¥•Í÷f€ë¹È›A°Ç±;.K2×ÊAü9¢´èñ;ÿ¸,,¢wÀ2}´,-Ö· c¼-ÀؐO8|J\x¨ ñÚ—KJ; bÓÞÑbòÞ0NDt÷e;vÇ;ɇ2aAÐmÙsD­^ô +»íG(%Ìb®Óa€°Øϼ•›˜2…p*¡söõïc‘ ¦™Ì©jõ‹'×ìÞ͊¢§®y÷;ºyÁŒŠ Z¨xªâ/´Ãðìþ´A¼Œ§o(ÞÝã6-üÕ«,ïzh3רÈ쟮f†*Ïä…^ÛÇÅ)Œ<“jELuÑÉ*ä7š£±ö9É3´Ìú:wà}Ô¨ 7ÃH%µa~ÙěRð(bÊ;J} ,Ä¸R;Ý֜92žÑsGÞá2㰝ëñ§^Ùl"DÈðA—Ž(ã$…›UX…ïH±JçqfÒ¿ZìL?v+¸kwò¢TKîêã +ñÜSÚ¤4XãsŽÎ »‹& ‹mØ{,iÞÊö覫jà. ÂR$­ˆ'û„43ð̏¬h¾¼z{¼ŠdàÉÖEí ËꝑìØóHAŒ·k<JUwv\¹']˜)ö¦…üM4ÝÊÛ8֝··<‘ ï‡iEO ƒÅÜôcHI‹¯´0@IJun‡¯·—å–ô©Ð€£uX<¤\f×憘}°rExx\U3 Õ>Κ6–=ô®Û{qO7ï`ѤÅ2T6±Dr),¸Õ0›µçÍj öª¡…ÎXgó6¹*AÉw—JÆ©®³ŠçR²p)Á cqïÄˌ1–í±e5Äøgâ¶óžr%"x˜'Þ +Õx‚«6—ú”Å`py5c ƒ•·]xŽðŽÕ¾äÀÉàòcʟg·šÛÄM*IMòל²91÷}[‘D‚­†—wwTMv9ðdêlèr ¡à%º¼·hfåøM·ŽaG—3ãix4‡„T¥mrùSòJ.‡„WpmÓ©`èJþ1ÎËr‡.S’ +ÎȂ¶uãÌ絜ڊz¿AËٍï¼'³õj b9ÿ;¯œ¶ç™¸r£Þ礕Ÿ–î°ò³œÆ¬r„µÔYѬr,/“&¤—yé^&©|˜òŸ ò¡’ÌSŽ>F͠㠗¨/ÇÊ?#ìÈñÓxÞDŽÃ¼Ê‰EHÕÄŽG;ØàSI½ÞŠgB¤¸üÚáäm°Æèg +gc#Å×'P㐫£Í +„¡O³ &hi+Vúh¼;•œq”ƒžÖ˜NÌ82"½„”þ5Êü1üp|€á +È}†˜x4Ö»1ÎTôÐgFÙ2‹€YãXêU1_ÙL•D/׎€ò.^Ǭ“RÃOuÉÿà9Έ­Uéð (‘ßÈâ(º•¦å¿,Ã2†àŠÃàºaÅ ‘) +’¶Â juù[ÜF +rcŠcÅD o Åñ{\0(œÍó (Žì _Ÿ°²<ëQ“°·h8¼ÓđïQzÙ0ñ._)QâHRDz‘Ä+çkØpœÕ +‡Ü ŸñÓø´„ˆÃÕ½Ì=à BÁŠ‡šâ4§›B \.§’ˆOÃʏBÐćŸï zøyJ€´ÃÃÏèJìpàɇà$lÃw&dá6 Zˆ 58+J¥ŒÌ '}ùÑC˜ØpœÕY'4 Öï3üìΙmÈpXõmšC1å‚!VŒMšÁ'-œ—j†8/¥ù¬p œ•XQáHkl7)¼8@á½}~å„÷Pë&¹¸æâ`Žt-¦â ayÁÁ'"¼<~#„·¿!-jU·i@8{ÖZ1ùàõq«ÂÀƒW5kL88vk:̬œÃû®éÜdp”«Ê o!V^¹à€ ÔhÞ@6@—ì{¨÷AZ³ñà:µŠnáÕ5Þ÷ªXà\ᝓ>¢€Q<ðÃYÃîêÜI:愁NBï,pÓ$' +ü ï;AàðÂÊœ¾ÚÐgj¹³w¯ýªúìÊ%o ð›!oÕJ ~36 àÓ9;½q¾QntÔ» áNցF=½x-æ”Rˆù>ç±Ec›êKB€ò݈•ŒOà îW±ÖRRÒïˆïjZC¾[UiF¾1˜Iý´ò½!j!¸%ðÞ­:=toàÔ%ö\áÞ5Û»ºUt¢½aˆ6«3!ˆ£¡f!ÀÞŒÐ:P_|:B¶a½áKJÿi ‹æo]/k ‰Ü÷§êÖ(ÿ^ƒõÕÁôæ}²×6‹"ȇi×$z7×`%Љ±½[Äƒç •‹Çç °„fÖxÖ— ón`y§(oEyCEÇ,HÞ( a5P ºÁdâån$o®OÚbÁZPl6’÷´šä}>ŽÓÈûƒ#>]u L®ÙZ9Þê·t• ò¦ÂMæƒäMy# 6’7>^Æ’ä …Í ’7<'õäM+ë ‚Ç­×½ö$yVãžõä÷í1¶Û;¦òæß·iÑÇÃwF3AސrÖà*vLýTUQÆy“!‰Aޔ…ŠÄb7éH,\Ù@Þ4  o>©kLŽ7E6Ìoo +k¢ÜƒihHjp9Éñæ&üd7Ž7Ìl~oŠnþ$Ç’!"7Ž75ûšºÌñ.ä,_Ïäxã UÅÐÆñ¦VÛ%ـ™aŒÄx 4e„ùÒ'2 –ã ¹ÔAg`¼)|&ågÃxì`n`¼)•c ×oiçX­¶b¼¹'«jã]xoX¼Û1Þ¸°Ëå¡]ÆØãMëÄWŠ7û/Çg¥pÂb‚Ëã0ÇÙˎñFX®âý`…U®‰ +FoEžèŠð~L4K‚÷c5}¼qœwz÷sÇÓ5¼›Á<™ƒßëà„´ó»QA}‚žÀ%Ó»I>nªdJx7¢®ý¼ŠœÛaš¾[ ¢Wr7¼+¢M2ðm_+©Ý؋ïííF@Šƒ`v3âÈZæ`v³7Ëß$hx'v3Â'ù ‰ÝêÇrKÃ#òâV·[Lb7WUjCPD¢—›{°lÕ²[æ; +V›6t1¯Ý0ˆ~¿!»Ù܆ø€@vkÝ`ˆ·ÖÒ-úlÈnu$¬ÅÈnÆÃôìæ2'ÛÙMí¹°4fvSŸ®oÄÌnZô1¬Ìnš»3¿ + ^‚$²›?ÊÊÈ Ù-ÉQ)­·²¾‰ì––ÿpÖDvÓ}d˜  Ý¸o§¨†v+,â‚ØEà„àH3¢Ûèîé/ Ý +•œ&$´»d?3»3ВÌng˜øܘݸT9sÁ즯H$¼˜|YÀ»1»±€è<¹h„•“Êa‰ì&êŽ/҆ìVdùٍ7ŽˆŸDv—ó :΂ìfсÔáÁ°!$§â@vÓõW‘Ù]RÅÈnZ˜d÷ÇUò¢ÀÈÌï|Cv#™‚+å)@ +QyT8ƒ`.²gú†ì¦™ ΌìÆOPµ–ÈnX8ñíÈn˜ çId7-ÊNÙ- “n+²?JJg"»‘"¥x+ˆÝH)ªwá +ìfF”¤ëv?Î¥%‹ k"6f÷Õ"?l+0Zº?&vEJ+°ÖÑ/Î>0v¸îѧ}. †ó= ë16Åfà«Õ=Ü)=IÝàÕŽ®36†6윇6P7I×÷3­÷43sºÓ°qº§Õœî»FË0ã·ÁÆRÃÞÓ}ÃçfæÌ'¤; £{Z…è¾¢)a ºâ`ðut“VÞ@7¢Üªˆ3ŸM#+žûqÞ<÷2£ s߇ßþ Î}Eµ`sƒ£v‘FsøÂaj#s“ÅÜÂã]¤¡èr8­\ÅøÊË #)—A冡»L®+bÊÁížLîë˜Ê?¦I/w»J$7 ÔnDn ïX@n„YÉ" ÷òÂã²n˜vËèֈÊA㣕%Œ›VCÌ©À~°Åý2(²¶‘¸G¬ âFèW½Û̓Hù†á¦6•mþLáF^qC¸//vw7›„?ÏDp¨…7Nˆ%G€›§…q3øÛ¸Õ¿ ½û•¾€À„o³¬²_“½½g¢·³‹s·¯Ècg;ˆ ¼}Y¯–ÜíË­"’¦¢ +Žòuû®ÈÍ®¹ 9"µ+q[tÑg·aàÀí;Ä.oVGÁÛF]3ÛU\µq+mU4\lKo¦ßÌÚο7Ôö´š´ :Îp«EV°ÝmÚ8ÛO৳¥©;zGwc*øëó†Ù†Y+¡ˆëQ.tF¸”…^ÃÔų «@­Ù†…–ÄlsbÁlc®UX<0ۏÙRIÙÆòHmßWÈöë"Uùmžïr@¶ A¸‰=«gàtòÚ²M +ûd›ôv‹î Ùæcem¶!Û|?8„d›ÅHWÈ6›…ÆU(À~Ü.01dû£÷ô9=«?&d›HË6È6Íʾ²­Èd½&R›G• ¯m†Ä¨n +È6³Ðmà0ùÂlŒmÜ×q›±=—ÉÁØÖ·î†K ¸F?é`lÓÂ+83B:¹ÝÛ%è6É؆Eâ†`l³ÄöÖ&±+•È.Ûx …Å +Ä6¼B—z¯ˆí駲ïkÈJÄÈ(Qå´!¶³ÛlòÌÌC ¶a‘ÊmCl“˜Áø@ ¶ ùçE¥³êF±0ž ±WØÊ#¶)1Tcb#¶ñœºÛÛ(×#=-Û¨[çÞ%éìž÷içkC#§T”ñÚpÃ9¤]¯‹<ù•®Í ‡óÀk3ˆ¤NèChášu¥kËJE’ñÚ<Ö0m•W/^›qQv( ¾6ž;cŽÉ×~îà /€mÔE¹.“9w02¯Íú¢"Œö¤k£ÍO_ØÚ‚2’lmtí¸•Ö˜ÑÇ+ +ƒ¬ÍòÅ®-xٖ}åjc}$䌃.®x9Kµ€…t6¨öåcÉÔ¾\¼–HmÙ ZˆÚhÄq;€ÚÔ¦Àõvî݃yٍ¸Í– —‚•=+MT6ô/œÄ7R6.‚? ì3Ú«'5fjuµb²ÏT&ûŒ9-(Ù8£f<æÌÍcªap$٘ž.C³é.ÄÛÙpúNpȧÇ7<ÙÐeQQ½ò±Qo­Œã¨ÏíMÇ~†ÓÙ+F†™ŽýDOó`c3sGc?„$ûq"ÁØ0ÄÏM06-‡Uw E*$¹ØP§E°jb±ï+Úa‹ýæ4¨ØOàW(6R=z‰F&ŠûT„X›‹'º›f>Š]È&.ϧ„b3'AŸ{£bì¼RP±‰à*~¤Ù`s›Ûų´rÑXlX”ß +,v)Q…¿a±µnzúÄb3N—(°Ø¢@í¾ô€¿¨æqÆb3ñ¬æqÑ ìƒ«9ƒ‡ß˜‹ —ƒ 7,ö£bð„bƒ5 N´fb?քíHìÇx±a,Ð@ìÇèŝ‡Íêá6&û ¦uP®½dt£aŠArun'»º{Éä­º ‡Í“kmÒ°ËáJɤa³ +†£òJæUiØ´ 7À`±âQVÜiØtI«ëš–"®\J6,ªÌØpØ\L7sO4N°4°J³¬ÓÀ BAÙÆÃæòºF½»¢Í#Gð°•rÆ?mf±±öԛ´±ÖØDl¸¦rM‰h„m[©»N$6uŒú*cz‡…’æ ‰-mèh‰-¬ØbsGUœ­@lÆæNhñY¼V + 6—¢ÊèL¶Ä O›8lž=OÃFlL¥fÿd÷êéŒb8ã°i¸bÅaÃlD‰pØÜNwÃ8l\#֊ÃæڈܕÀaãÉKiö4l@ìÅl"6~BA›]3 :÷[ÓÂ%Ì kŒñAÄ^,+{šƒˆÍU¡D&bç»»3±™$6Á8›IÍêrÄ©ÿ¤™ïJ@±™ÕäÛ$(6“ŒJlPl‰ò¯gB±Y T@±¹ ×Î[ŠëkL*öìKTlFÀîû|£b§ªž¦b3Å AÅæ×⃵k‘âðIņ·0©ØŒ™±ÓÅFÅfĉíÕ‹M‹&:a±i(bÅbó1¨ÓÙø¾3_‹¸‚ +]7,6qbÝUþƒT1K鋍AP_݆Ŧ…ªàbÃÙtós±ˆ!ÚeãbÃÌ|r±iáà +.6-j¿¸r±yD +Š‚‹ÍpŒ +ҟ¸V×6í\lúÂL››l>ö .63j¨¹r±§9¸ØœÙ +0¸Ø¼qì¿°q±avç' `‘Ö+¸Ø܆®‹M3ŸYp±…:¼ÊcS9Þ°ØÔy²=°ØÐq¬I.6sC՝Z&›1r² +‚‹ÍªægÅ]Ãë¸Ôqåb?Ƒ¤5›+*5 {ZÍýBÿ£èZÎwòÃjà°îà}?ÎO;»ñ.—OIÄÆÃ&E+ØÃÃÑÎÿ${844ìÛ¾Æþ}L µ‹ü' +ûŽp#aßê­°ì&|qb°o×ìì;FÆ`ó}9kP°¡vQ~d…`“8!ØРq¬ ®tµ˜oC`Ã(è¦ ØHA÷ä_3™õ´7üu‘Ì3ý†Ç]r5<õØá×Ċc$ö5zP¡–çøÄZzE_£^ƒ_¯ƒE•äëÂ7ð5ä_HöšêçÞ&õ¨ªgG^·3üN¯[trà5S\ÇýÆ»n!p Ü5Š ¼Üu3þd£]ÃH5`×-”‹»FZŒ}½7Ö5jž:I×HohaàW 7쬳q®ûc²z`®<|Ú¤\P¦nk¤Žú3א̐®„ëaà¸^$ßû1xk˜ñ¿n}^ñ8¸?£k°­OÏa;Úí#›Á¨47×¼[„ôƒç¼q­±PS²RXëXj}5³3­±vtüžnג]ÙúÊ؍oé´F(' >XSÜ­M œ5䂚2Wš5®x¸¿+¦ԜŠà3F©³_+ËÚtI²¦¨Á &¦a‡ ;ÇzDחÀX'7 (Ö#…Ě]rš \˜ÎÂnOœ-ÀÂTNŠA°P™ ÏXŸæ müjlû3¾ú &XЫϐânðjXYìjPmÿ t5~­$˺ÎïG¡£Wç#u#¸Ǫ̃?Ÿvj5’'Œü´Ì ~vÁ¬n– íÈꖍM¬F]Š§V·HQmÀêD>¯MŒNÂÀHɆ«nÑ hÕ ûq4XuÂÚ7V5*ìT‡é’¤f)ºIÕuøóÝ@Õ5T„Á©®¡ L5œq½Aª«=‘„TÃÀ ®Õ5ú¦nˆê—' Åiª{¼_TŸÁÞùÔ'ÇÉOÍB!õ/—W””ÜõfšîDéßÑg¹%†SM ™Èšúa^¶|J2uw+´S_î`µs©O'K]|³øTSÏ÷‘­Rˆ¿Ú¿ÓÀƒÐÙ6²-Æmd[ìsd[;G¶å¶‘ ?‚(ľñÉûa§q?‡i_Nxv¹´÷áûE1Ïô£|¸E˜gŽövL)ŸÌò‹‹q;½Å>¯e9ì¼êå¶[„‰ñBäsÛ4¬ò¶ÃNã~Ó¾œð<ìriîCÞ¢y÷öi}>îeZŸ/Æ2­/ÆmZ_ìsZ_;§õå¶i}>îuã|1ÖÃNã~Ó¾œð<ìriîÃWÞ¢ýÍǽg¾Ë/.Æíôû¼–å°óª—sØnÑ|ÜëÆùb¬‡Æý¦}9áyØåÒ>܇ï?º+$â]çw%ì›BvÎõæÃTÖY^ÜÌ È8ì^ЭæS»«`ã»»²n<=yØiÜÏa±Ïž‡].íã}ø&“霣÷Û;Šå¦û±œíbÜ.mñaæ}X\ yÇ?a»½‹S±l<ݏ婥ñíOûò>äa×7çÃ}øV“霦÷;<ýŠå4¦²œðbÜ®nqcæ­X¼ yÓWa»Ã‹_±l<=åÁ¥ñí)OûòJäaחçÃ}ø&/ðü.ð-]íãøöí“oïãÚ{×>>TkÈ÷oÓÆ÷ñaÝx~òó°Ó¸ŸÃbŸ'<»\ÚÇûðí—3ûžßòró«_Nx1nW· óV,#ϼiËç¹Ýáå[^6ž_ýòàÒøö”§}y%ò°ëËóá>|ãåÌ~{燼œÃü䗳]ŒÛ¥-ãƼË°3ïØòmn·wù—ç'¿<µ4¾=âi_އ<ìúæ|¸Ó@ ÀóѓlVm¾„/PWl^ÇbÜ\”Å>ý™å°ÓóYÎas“>žÛŒ´|\AñÐímœÐÚczۋqsÍûôã—ÃN¿}\ÌÃ.wlžÃ~{ ûˆ·Í¨ÚŸZßñ´/ïCv}s>܇o8ƒæŃl{–d–Óþ†æzõöÛõfı®5pf{W‰Í~Ø&è~-éãßéGN6–\7¾$Þ;û9LûrÂó°Ë¥}¸[È㔽Ý"οçÛq8Վ²ÿâbÜNo±ÏkY;¯z9‡íÁa¸ïçmcWÖ퇝Æý¦}9áyØåÒ>܇o³žÏ÷d®„¦ÉnÂöê„C±=¶0¾¿:ëÆù6¬‡ÆóÛû2¥o4Ö\OLÓ<à|~ËOÏ{·Ÿç¼ÑëÆùHÖÃNãùáõÉóü–Büâû€öíNñBžþfôU¿ßÖ¸Eûa÷¨ÏáC TOõ-ª¸v÷s˜öå„ça—Kûp¾2 ì·h>ùå8ó!-¿¸·Ó[ìóZ–Ãî1PŸÃ‡¨^¨·h¿E‹q?‡i_Nxv¹´÷ᛠô”ÛÇۋt2Abë9 ñŒ÷|;ÛŸ]ÚbŸ÷a9ìž\÷9|H®ïç¶%ׯ‘y…œ&püRW»ÏdÜç>ê.Æmˆ^ìs<_;Gþå¶iâã¹}«ábºÖá,¾/1¾­èD:]1v"ߗòz3Ø핋ýãݽ·ñ}‰±n,CMܯåk\nìòáæ†ó_žTßë´/ï@t}[>܁ïÿ7c¯ÿ槟þòÇ~õéz»þÝB¯ý`Oã^?鿎J÷wí¹Xè²Ú¿¼ÙÑUXÛ/oÇù9ûrœŸ|žßFœ»,ϳ\ra´W l|ý¢Œ¨å2žÇsÊXP‡ô9Ž0Žî{»?ކøÅ/òX_Ö×O=¨<8и;NŸK•ýÆÎ2Ž†òþîëu³ñl‡O¦ß-O†u·þÑ2^Ÿ˜¨Ó5¢bKÆr>‡×³á@¥Îá>âÚôºÔ a.BF´ôõv©+ýqY¾ñ– +m¹èåí+èyÀ—Òæ=x{ŸãÝ ¡Bæ` ›ãò#ƒìu¿m~Ö$“ŃÓ` CÄþ#-ûAó÷@Û.ñ8Ž×Zÿ‡¢;¿Ÿîïk#–Èü’žçžFtÔ¦qÜq;`¿®Ü؛vLÖ:(C_;ƒyrhËgý:ĸz‹“Ce­hgeS;K_ߋoÚIüʧÖí”}è&EeœŒ¨|ýêümžÔÙo_d)nd-žUíÃO¦ûnÜàq]ì·Ðôö¾^¶ÙÎÑ뉪"sä`·gÙoÀ[’ûõ9€¯Av°Qâ°wlŒ¢%ïøÖ×1öxNÀÂã[¦~õ*æ]EqT‰·ÚÒÓ~œ#ì剻ŠÏyøQ>EŒ(ž¥ñ÷Ƴø a‹Ï?ó‹s¼DÑ^¼?/GmÄݾ‘µŽCÝzU`¬eøQbˆ³±Ÿñ(Ÿy¯nK{ãëôÆÇè+Jõ¨Ãoråy„x¸‡ž}lŸÆƒGóÕ«X_§×‰Þ:H{Æò:±HRvÔI{Oûxâ} ˆAƹ?y>b–Æû|“û1í­<¶w 0¢xÕOMWt³a‰"6ñ(WûŠû8Bí6žó°û9øôh(ƒoëØÞý-0&Æxç¼FywÏÙX¨hûÍ3ájn|_ùsu9Âzyz‹×¤•°j²W( hgÙbz9õ>ýtΎ%¥‡Ÿ«?›gæ¯ýb~ û„øé´ÒãýH5Û/¥CïÆz†ñ‰×û@hxãŠV6^ñsüš¾zy¯€H¼cÐ`sÏÃþúº|ð×u}’Ñ_¿^m<õAñ“÷Ãö3fðƒ¯%e®ËÄôµsX¿>¶µÑ@Šé4¿¾9ŠžþšjúAçao‚É9Þæ8\kÏ¹àˆ¹ ÜÏçñvë­{»ð¿fÇxûÁør‡ÿCÞèldA[ö§Å@ˆŸrÄüøº£÷Ïޝ!˜Ö5¦fNC?¦½\~Φ‡«î¹~ÍÎëha¼ŽpŽ/<íµÅÆWï3Ûõ~<‡é»\Ò +yŽhéXæÔcî$áKØïQ|¨×Œã9Œ5>ÒÀ¿zäyO 0ê²ýa·›Á1ðÖ½ŒgŽ,¡ñlyðóÊ{ÄsæéåÆ5ÇÛ{KÛC«£¦ÜZœC¯ã†'ðÕ«˜ˆ&Zǵüâi?æ÷º'2Ž'&.5l¼âV<íÎ êåj{±qMV¯$l(r³M·ÿ«§ö%§tÌ;ìïÐù1ìå(^ËÐÏ´±5ë×Q{5´ Ï\ÉWöžKtdìž=€}»ê§¯žÃîTÆ/ÒgÏqˆëÍé*ÚX¯Õûû¹Äö Zâ^l´ïƒ#<çr*¯¸pöùã°S‰AâÓW¯bý,è¼j:}D’ýî#ìXó} »]Øï|UÇaä«GÎm'xh¾¢»Þñª‚„œ«â Õ/i?úµ< ÄLJñŸ¾zäy¥'øh_¹RPֆWÇZ¹É˜ûC•$N’ŒÇúz—ëôûóÔ3Žðú¬b㞟]=âe ¦âóϜÛú·é×;g›·×^³ÍÇoá?ü·#ÿ[þ(ZÇáŸñPM°÷ócØ멹ö›_>iñyaO^Æ6®'>×+<„“m°}ÇójãrÕ¼5y„£Þþ­2rDBŸÌÁsx¢’ñŏáå.W ƒ”±ç‡½G¬äÿÍÆGàÛcãêÇ=0¿´öˆîéYc±y?GŒPõ(á`ØÏñ¸Òu9{ F ÉxŸõë*@=»¾v °yË:>v.Ç:@ÎaïòÆ¢¥"½Š×pÛ "<¤P´Þì³1[GqûÐ +Æ{î}#¦¡½ñ} û¸ã|9‰úcø ~ͶçYë<²WFŒÿ=q^m4_.=.K‰+«çÜÿu›âÁÄäS‘Ó :ü •åõb¸d9ƒ'—ñ£ÏkëùñГò»[NO_k¦gÙ2\Xÿ”K#.£Ç;z?¾`t6ŠpÞ3íË;zøêɽcjõÍAK¨v‰YÒУ¬Çm/^"uD²ŸW»u{:¼ÜßN+Ï<Âkݔù9¼ñë[gqiÂ0ç5ý| +÷¾Î#¼<˜n/ùýÙã^ÆX fê7»RëÅ«ó´xô€f¶DzïÞtÔ8 z2þ¥3·ÂÙú¸Ew¯§nog§ˆõô;Œ¯¯¬,Æ<Âqäz]\\ÀœÝ <ä#W/~WûX®â„zÂGË70ª&Rô q+)ô–ó%qèöóu·®+^x½ihv—BqïùiÂOÈ×­ûž+ýºûŽkË %ì>ú>Ã'x˜¥Û8?­çº—#÷+?­¸?wØ#ïÂ5îåý +û9š7ž9.J¼å3b²jmÌ#ÌHa,s{®ºðöC#f¾œËü22h¾#>ùœ/ã%잇òÝá“÷š÷­W'1µ•ôå +Ékw„J¾ÙÀ…-ì(º’±æ8®¸5sä8_k¨y„ð50†Ž:Ï«ä,1ígºšO/}qVƉí5\¤¢°ñK<Á«*r¦®1ñ")û9ŽP®|²FM´AÍÙR¡A˜<Ž+ÞðÆÖºñÖ!2ú%ìs”Õ +›qp”¯\‹Ÿ{Íÿa|Ô)CGˆä5ÔØ?‡µ¸]Ì3¯3«9®`ÿ̞=§Æl|Ær(¾=öJž+ÜÀ“' žGOl|wz•šª{gÄaQ„ã# Ú}×ÊË»ˆ»ïkøU.qnÅD3Ç!eꑓ́^T1£?OË«˜w©­øîJù­åd¡áô€“琗†Þ–±î3&s̹JÒõ¢¶÷ÈI÷‰\™ˆe‹hn†±3aáE¼¡111w’1Š9µ¡aœ¯n¹í-ªölÞ4ýܓéê8a8rámöDFÿÌK»žs9‡¹,Ëg4 -ñ¦I¢÷œ‘d¥+xäÎ5Ð6žÜ8#NŒWè°ÓG½ ÖÊ#pì_9GÈdkV6åKðŽ…AÁz> ɤ°ñõáæ ÉL:ç•ç€ž•-cÇÖF ùjê»ÄŽÔ´Eú¨Ö[’ñž¡öø^ÖÔB‹ 4Y÷«ûG`PÔ®•xWÁmûÓ§Nëe?2X×ϔ^ù—{„ñœðqçUC‹CÆò¾„}úG,–Jû _ÕsÙúIEéé{Wó"-Ž¼e éVºX´Ç‚ÄVف§ÄÆ#ŒÖ¦%'aûµÚ?_cÆ¿Ã=äËÈØþzý‚2²‹œ¶<Ï{þ{ë’áAÉXsåÐ,‘ÖŠ\´èü‘ѺØ0K ¬Á‘±e("#²*‰"cÎIíhiÌ)­õÖæf Œ‘Ï/a·²c§ +d¼2ãQÂôŒDG> ôµH7§ƒnﳯw(x¢-­ÅÄú]ö®JѵÁ8£–§æ44C˜É ÷:}ŠÁµåŸûH =3>å¼bþ¼ïP[qL²FîVô\· kȿќ7=¯ð†hŸáÂnaï}‰ôíëÒS¿_óC|SGŽŠ÷ +69`k‹¤=4µœäzõÁÂ;FºîyÜRbã×Ú½ñœúð•EA=±p†dD8‘ÆÚc•TCs{fp¶”|íÐÉ$Ѽ©æí0Á½-r`¦˜ F c¬ms¹§–G>cãžÃjWÏtl™lñê’Täðe,©ïeϊacÍÙ,/ çoH³Òìv.Ñ÷Q£¶ÌwŸšýûW¤³}zÈDaO%¾_ÇCêM¿»©Ó}z|fÏÕIîm%"…šO§Ò—¢ù‡]FîV–3»}mS‹Ïã.”£†±§·\·#ô\IO‘÷¡¦)„òí‰`Uíy„ãL•J-y„gwEÓkñ×Ù֚ò™G€<Éŕ*Û>ˆ$ŒL%—Yd®o²@N"饙,v7 … ƜÚHŠÞ̄>IyÐÒ%<â(óá 9–ô.ü֔€Iæ²ÿ‚˜YaÜ;:®í›tvéȸ–Lc +ÁŠL‚šiI¶ÍÈ85:UŽ|Äa&?&`‹îSJ(©Lš°fK"ÿ«åtEoŒ}v–‹ 1RiSz”tA_‘¹pÕ¢U”T€7ñùã ¡Uèr–çÐð¿JŒËÐͧÁ…’ÖO™ {¨©Ø 9" Å) Ë: 0(¢^ágO[—Câ6ð+Ÿ@ë;š¹•õá&YF¯Ë\nO,aà։…š ÊÔ7²}¡ˆBC‹˜O›—rÆiýÊYN]Gd’­È—Rö(’ÉaH]†®E#Ý%5F›}ÚuhÎò"±Óú8•ƒ+è†ÉÈÕÀ÷AF¡:4'G‘„ÌÈË EÐúa1#=-rÄtÞF«(Q†>‘ +gÝ£aö#úZ‰ÈœS%ˆú,[ WÌ­yIúžgyÊÎiÊ ›ÕܶÃÀHï ¡1ś :TêÏ8whÃ>¸tJÌ;"x/Å bÂì8Ho¶¥ã" 1ÇNåVM9åtábs}ÖGA®•ôHñy¡€–»Ž)æFç8hâ.îhË« Kr1Ñ÷è0[UÝX€ÁF‹:€»Ñ¥XÌCR9k%ÁÆܕý˜S#$t®˜ØGã 5=*¥@-ݼS$HÇÇädÅóȬkn;&œµÑVƒpdâ϶„½Ö0‰L˜ëírpUq4Ü'µcè‰Z•w†¥ƒÆÀ¸í-J7CF³¬¬ }Ø4&ׁ2¦ÅÔº€Æ&ÌÊÀ!yDp«ñ#;q˜¥äŽÇÇø×%w-y€YºÊÖà0[à6q®U7êU쀔ÁŒjƒwó+¢%Ü#ZÇàiaK#Û£À{]Å !%Σ9£9Ä@pªV¢”³nC\‚OÚVÊ5N©š…± VH(M\DNhÀ Z™BXß(\&ì(„¹ˆÝJ]Úc°€ÛªJÄnÉL\Z†ÁÀUJ›Ž<™áá²É+g*`·¸«¯ò™0Yllƒ áuÖ.a.n/cʚ ±+W”Fo³âðu®V¾Á3܉} 9~bEpºSÎ$¤ÅåÙù¶±QQð0q¦€+4CP&XȞ~–Âi Â¡`1§túÁ¢¢N¤‚ž'Tà¤à¢Ààž'Už ÐZÜq†2¦É'X÷ÆaÈR|]¬Vj¢ÃÍ"~R~Ì¥÷øAh˜gSD2n=~¼Á­õ ¬&#±gȖJȌßى_g¦®Ý™~¥fPXË.‡Äf™Ëå°'‡‚—¨…;a(.#£@¦6AŒY1$²6=rÒqHz´$ïÆN5…dTÅ*¥)Ê\ÒpdJ+Øh®Zæ㒷]y3[t +«š»–>}*JƒÊ7)·[C^v©ż gMvÁP§h**fкú^h–²ïÎ5)ĸ a‰ì9& vùá1ŠÜç’k¼cÍbÈ(øØHY®(GF9U°C‰>t¤)2ˆ9qœ…~ó8¨"Ndä鬐hì¦`]Dz#–n°@îø¯Ÿ`¿FUа`ë‰[± Z*ª“‰¹5sê=\îi€’‘¾„š¢Úâhp97P¼Û™œ0 Í.sJ +ÈÈèäÓR*·é€"K¨®`ªÝl ”51Hȸ-ZcÚSN!œ¥L•=4P¹²l˜8m1CIIz£ K@ M@b +Bk3$P w˚ƒüGsj,Ә‹IjIfI Jã8íó"`ˆXêàˆà^ÁIØäTëº5²-·@ë¡#-Èb– b›D)M=k`à„ÖŸÂŸ©\’ˆðÌ¥ÖJ·Ô¨î —‡ttÇ$—Á–EW¾]b,Ìf I—ö›8¥ß”òÄlbΜ*ñ3§³%UØáŠ2ÌÍzuÍÜU«Œ|Z«Ët†>—ãÉA³UÙÔÂHK·P"Êg^QÒø£ÀœGf/ՈL}“¶êX켊23ûÏbpõ™žI×8%íÚX)L!gçÀÀ ‡A¥™ë°}]ìr4½þ@ã#Æõã2"M݁po¸B LÐÀ©ÐEljTÚmÀèu6üGçŠï@ ?ѱã±<T jWHÏLm´$¨Å‰q8s#IpzÒm™ƒ$(G›wÄÀ/ÆÐGÛ7e"ÔÍXb£çŐÿNÓl«a€¹&uKÐíFÝÔÆÁªòIüº=w +åÈB5_\Û¦ŽÇ ½“)ÉxŽEh,ßõe‡Òþ·q r4÷“g +åh6Ÿ’ßÏ f€+WV36r%YÀ„­Ã&"O2O#ÔW÷m ¼`ÌÖŒÊÖàlø‚/,ˆÅˆ™‘Q§Bʸl8åù’vd1ðàdÄžG÷»4³Åhè4[[Ät3·5 FŽ«ÆI#ÓЩÅT€Dc̜å>n{êÆd2ñ£òAXË¥óÔâ›ÜóÂ-S,¢Ô rU–m)PFÎ(cênªT¨µŶʣ:0…×±Ù°ìÎCÔWTU©h,0P_‰“NʈÞ"ðª‚ÀFI‚»&OÙ µ… èXIH_IqØÒ[°ðÉíÜ*B†!G™Ó®îl™™UńK&Dòš-/ ú"±”_JäÊU)¡#/Ù¦A<œÄ@“$"mv4´tbj1I*a„b‹-ý”P-Mê° +æ„ÓÈ驏©8\½-á„S*3•8&€JþyNþBL¡="¸?1ÐfŽ{ÏÒ@[E§LxÌ*NlVԘX¡´åגÀ…T؃ªcÎC]('¹aI]òEl…_`ý¡†>F´áÒ:9¦uG®Ü^U¶š2LÕ.F½²wRH[;ÝaàNxL…k\t·PLâYÈN¢#‹ ðA;ƒs+¡%Åa°E9ÂÆI ñSå˜'§<\™säSÍ#@묉®Ì ¹FÊeÊeF¦´£¥cB*A¤ËìēÑ=îO©ÌJ¹" ÍT©å‚)ŏãY‚‚{Ê'±¥ EhÐJ¨èؼ\à¯7å]"Œg.FŽ,DôQ¾Œ;`ð6NÚ9Ðw¿ò\ACåç×Ëê2¢âaÁ)õ3bºt¨A¡ÅÄÅó¸çY£)sVË(¨BM\Tb«›rWÆIFTÚ ™cËѐn*S*ýêb©¼e†yø: +2v¹¬Þº @IÆ: ƒµ@a‡×6 ¬’nñÚªªÒØX¬]ÎH 2ÔK\T ½ؔZnÀL¸ŽÙŠ Êبm´”3Ü»L(Þ^K]ÖX£¢ÔÕ$.1C¹œSSÚòPf‰;»°¯Aªá4ÉN=¢½gÅc77Á^ԇÄ,vcÂô’ÐEº‰˜Ðê〬}±óР­›ÑpBímPÄ"#÷pRQÂ:óØÌf—8G7"BÂ(Ó¢Äi,Ÿá5oӘ»ü­È•c…bœ!—ÎgF5i¬ða”B,ôEFN*ûD57Í8½ïgÁqìŠàړË™‘Û*# *ª¥‰3ía"•q +ô̝qUù@‹upåjò`aù€ÈTb.Š »$¾N-£…@®t*sº¥ù™Æ¶8hÂÜ%H¾,3&ÑQæ\–8—g –TF sŽ®ÜUdìc ¦(y˜Š~BK_|5ušHb£êíø-Ú p©­4 hŸ«ìK̡ǖrÔPJ°ÀÌU·z3ú|ÍGgkÂE•BÐ~h®BF'„6v9gΕoeoÊSÖŒ†«2OÌ-sA¦°>œù5DJ´ÇÄOËU\²³´…2å‚{R\!.’€ej|õfȑѨ4З.Ďâl™åܦä#0¨[jí´Û¸)Aáyiâ +0Z/ °nAùÎñs[üZõ'B÷'Ð\HÛ4s5YI¬`L9Å©×Ú¥ªeNt“ éºr=©  H]¹P% Âíg´i ¯—@Žn AL„ƒ8-IÆ~b{ƒòw˜‰G•ÖbÊñ€g¾tžY|R†5~¥”MŎ9 >{4åCìjû(« +k w%ݰڈÃà!±˜†…ÄQ7¥0â·ÝWN”"¨„ÅŠmcFÕ™­5âWÛPúrðöR6îKˆÏ”žÿ+V¦gC{=Óp ^”ÁfS^̽Ƨ¼SŒH¡@2Þ¸ª`‰­éÝvÜ(ƒÆ>Y9@;5Š*úš'­DLh¼ ¸rÙނªKŠ&B`Bª2ú*}Ë@3(CÚòLlLÕt8gmânûCãˆ#¦‚ÙŽ¹ÄâX(Â05 +?@e–…Ñ á¤p3˜edè%_ Ȥ8 ³ bñüƒY ¦\¾.r¤Lœ®†%ø¼r¨eØg + P&N6l’¼šp0ðÙ×¹fɜÎ;EC¢?ý7m:­¨À^8¸ _N­üƒ@g¶q…#¯üù;t¬¥_G‘OÌ´@}äN´#ÿ*ÑN3VN§œ§óÄÃw¯sº—ð£˜Qä݅ƒS))Ë®†Œ)PÀe pͺœSî€å )%y%¾,Ž €˜ÚTÊÒô™3²ŸûŠÀ¨©^xxYiê$¸AåÓ£9xŽ‚K§jz¸KãÌív’X¨éµù-ÐÕ½#ˌp*†À)Ù- +.?uÙ+euEܵ‚SÅ(ܵ‚Ò (qæê5ÜWT£òbtõb* QVæ¾lI.}œŽwØbºµT9՗8ݺ¾HclÃêƒ+Î]} ÆÂÔÔbߎÂk´ŠÕöÜ5Z”ª pIÑ»^4wq¨àòsu¢U’جCˆ‘uu-Œ ÊFﺣ‘«×7[ñÏvo¦j×Á•)¥ìeŒ²_`v"WÊË×Hà.š•¹df(Ó`%¼ÌšÁà™Ò„×ÙMÈMqpU´$ÃF¡1]”² ö%]"`k +X`4ݛs=RiÏü„ó €.‡ª0îBÚÈ]oaNd“tãÊKS‚ï\Šf Éâ6Û:ã(KEWf{à7Êt®~ s7öYŽ%œšç«>¸{$%hV»¤ª,(Eâ.³({cx›óÔ#¾3®ê2ꎾ3®ÚÂ-P9a‹*«”uƽԗGǺäK_ªœrînc®ˆ˜»ÌpïAp=Y"¼ºÌÂKJŠ†eÏü%¥’Jv!C%$ÄúÝf=ƒÙ¿T˜*Uæ§ÄÝ±\xênbLvkn0È݈\íڅÝöÕ¼èZc^O`î¡*ë›ïvbö†9w#ßmI®1:ø]†,v9À”{tœñÌ֗ ÂÜ#”Wˆ}² Ýd+]ͳÈ×`šé[x8%>„NÄÜN6\Ü9 +mcoȖTÒȇ¥a%w´(ejBm ÐEšet±ÝL¼ä¥ ÎüyáàÌyxÒÄ%Jênû˜GNÙ¬ÜÀP¯gûwf&¬Öœ•‰»û+fnoÆAÚgê*åpºs¦ gµQ#!ý° T¢Ñ£É Ô¢:@áhž£à¾F/Îb™PwÏtÙ0¦dtìîŒnaÄTƒ|õ¥˜Ý¹ ÊœIwƒ/ŒJ +r$§:„€:?pb;,6ÅÓ R¸mìÚöLDë’ZmAìÙ>xXž#Ìʺ ¸¿§“ê\Ћ¿"Cªæà1d×ZUÖ¸ùiãÙO3ŸoÜyžÜíwö‡“ÑùãÖxœû•=ù~Ð<ìöÇÝþó½= ßϟwûá/ôý%þÆ"óãñ÷ïu{ÕÇÝrŸ_èoÏ}?èäøù°ÛwýÖð͒Ÿn7n¾¾èõõ{ºƒÃîédœ>m|®Þ[ÓmÚçÝ^g˜÷±oÜzÐ +endstream endobj 47 0 obj <>stream +ûáŸñ›Ë¼ÉDtãÓÆ­úݶ†kÜýçŶ/[½‰müªÛŸ/nÝo]˜Æº;¶ùç›0´ó¼ûü|\}lÔ~]ƒ»óàäÎéóü¬×jŸóïZýqþ°;>nŸÃÊïvtÓe£…Fëé¯1¯«Ïàë қêCzãƶ¬ßW ‰Êä;‡ùËn ºU2ŧÖ5什ɰò@‡ùhÒ«Á‘¨ýºw<˜ ÛùÞåy«:ó©1…Ý~åÕ=olÑʹ`ÐÙ³ü~k2u[ýý¥ót|ñ|\ñÝÖ©Á}:oÖ·øjŒ¨ÆÑYã18;åãå+mƒ9F-v¸a¬âNß&3‰¸ õ´½Áð‹WçÝq^ã”~Ó[Òºxú@®ÏÒ7å0îuǏ[Ýeæ‹ >,uغ<¯±H¯ù™¼‰*ÿ +^ ›å‡ùðytÝdÉ«6ù“ô^;s:‚1^•ûqë0?kÜþøª‡‡EÛVgh›68ý5o÷“~G÷s°ÄN:³ŒuÛñ¨úp ­kÌÖ¤m +~ۺз]à[‘ãÉðtÒËûíê¾uópUÒ¸W­exK4Ä`TýÉÅ£ö¸õ2¯ÁvÂgÖ¶ ›Quóik”ßæÿšè ¯±¼§[×PûƒãqwÜ^rÄ¢@ ùÓn¯Î¤Z×Pa[~kÁ:…ø§YÏÕVµ¶ÜKVk!nŽEng°Ú)§;åt§œ^?å´z¤úN9½ÂºÊéÙ°¥Õ«Þ÷ƒîh;ÕÓê›qsÕÓêÖ°vºÓNwÚéN;Ýi§;ítÎþÚi§u$þÃü¼Ÿ÷O–W®(òo¢@YÃV§;©q.Sûu±ŒN·×ª‘¹‰ÌþZp҃áåù 7x^]Þ±ÅÕØb²c‹v|Õ)±c‹;¶¸c‹ÛÉïn>Ü Œ×B`ÌõlïãŽ1îc Ƹ·_dÜ1ÆcÜ1ÆJŒñ~kòïÿµÏóáOy·}þüÓχï)Æ`Ùä¯+ºÎ-·jyÊݦ{›Ní6_uJì6ÝnÓ-_OLnoœg¡íâ<7"Îó/ƒÞo­Q>œ,«?¶IÁž{lëÂ=k éZ|îÊðϚOv¥`¦¹Ð¦LòÔªƒª.n_5Irs™Èîvµ‰f®ŽÐ0ïÔ«Á¹i ñ}WŽ^ãüm+'ÜüËÎzƒAÇޜpÚkµ_ÜnÐà²ÕîŽß|5ëÈZ›t™zk¹I½Ñmؾ»Kt“·Ý–§[¼Å©½9É×H4©ÉL6D6·:ƒWÛÌ(·¢ÄJÜDõlÅýºaKy³#zßSG¶òb½:`mØÅzbw±ÞÜeüÃf^¬÷Ý¿ÿû¼—ïë„Æ_ý{õdõuº!×êÕÙz×âZ=Ö¬á[juº“›“Ú¯k¶;Ý^«FÈMÔB·7¶çÅ^ñYÛ°RxÃËóAoð¼:"ªæŽ'n4OÜÞ¥íã„5b>vœpòòÖE|ŸÖ½fsØÃ{  ºê“µaüaóú·¾@õ0ÓM­ÕtwÕª_j[,\ç8ؔnk¯-ڎzK +O†£æ}*ë½H¥ÎºÛ˜˜•Óê³µc}ëg}ÕgkÖ·O`uçÒÁy«ßÏ{Çy/o×2°Í>¹®Ñ. #½ƒ+vöÉ5k‡ÝÑe¯ÕÎ/òþøaër“϶-®Õãëñ4f>²ÂÇÊÃß´r=§ÕmwwÖ896å0¬>[¦lIÉ¡W…npÒñiu£×Æ1;lS˜FõÙº&yŸ óü·êæè³î²€ò©`ÃÞú&»?èWX«Ýž\L–»úÃá…ϬkÃ…ëêãìtºãîË:£tO¬kŒ½n?oU¿áµÝêµjD¼O¬kˆÕÀp.©ßãX*Ohñ±u Y.Q BWy2¦ñºÕê½j½©>0}ď[Ãz2y`mzbõÁæÏëȶùږcuµ~PC©¬oDÕð³áà¢Æ©Ž­×ª$µú݋:Gõçï«#ÛS«f/ݺȥö.risT³“µaöœ]äR•ƒr½•ê·ÿ"“hw“Éä¦Æ.µ·7v©Î°)gÜ.véJŸsÕEà͊]ª³î6&v©½½±KÛÈúv±K»Ø¥]ìÒ.vé= mIÀÒuˆ]jooìR“cSÃ]ìÒÕf–×#v©½½±Kuvئ0µÇ.m mC±êLpý5»Î ^©åU›ž:±ƒ»éùàÓ³µ÷Ùí*¸–td+¸Ê¨!«k¨†Oê(©Á#ëb®iµÓÇÝ×yotÙÍ{'5ö8ô|˜_ –"ohèy·ßÉϺý¥ä ÖeÞ։t Y×@w1öeãÜÀûÑ%DÙouŒ}ÅskìYXí]„}`¹ÚEØ¿ŸõØ`·yÔ`Rÿ5ôÿoëÏúïmýCõ[ÜÞÂ3³>-n…xõ«&­©ka?]j‚Ü`£ø6W¯5q;ûøš´¢Ê3´‰e´·ý‚»6݊öh²„ém0¬ÇG6˒¼×ÚU·Ÿ½X8δ]›À_}DK¼Ú…‰ђé,Œˆ­Qw©>¢ìüŹykØŸ_äãGÕæÊueÞM<’·7Ùu%Á㚟͛èZm5oØDïÜù%Ù¹ówîüÊ#¾Rîüš;wþΝ?_ÌÚ¹ówîü]ɼ;¿Ü±sçïÜùWȝò-8ôyt»ž¬»sáï\øWă³i¦° çÂ_' y“÷zƒW•g©×}~>Ö öڐ\}ƦŸ[›ÌU]âꞝMFùÁ ¯å~ Ž2óàÕ«a‚ÇõJ Z›ÌRýœ Ï´’XsÅ§Ö5J»¤¶ö|ß11i×ä~ŠUqgUÜYwVÅ7Äêëö˜wwqìL‹WÈ´h´ÌÛχyÞ¿­¥½ü¶>+»Ï·_v½||{˜wn†­þ²Ø…Íqíò[RÝ,œ÷ô·zÇà‘µñδú[¿u/&ã%uÉ ç=°fóÕaGp8^p!ÝT–Žìa½É¤Æգ˼­¥Üa}#Óì“ë5j÷îëK­@¬2\ÿäú´‚%jú6K¯‡u×. ju ÛÎ5ØY¢v–¨%jg‰ÚY¢v–¨Yiag‰º–(kw2–(k–BƒÔεiŠöÎõ®,Që;×í¿.öµc«ãnƒíZTÙÖ÷ë`lYeŒ–ô¼•gjT5ÙUžY— T}DRy¦Æí*Ï\¥ƒ¹v@çÆʽîøq«»Ì!·Á'òª•üvgòæ÷»3ùêhCÎä]5¸ =“WSµ6í\ÞÞJpµ%k~&obœEýU¼a“¼«Wґm¬wM«£·Ï5Ò¼¿»êÌQ¥z•¸]å+*z| Êë<˜¶¥HEõ»¿;ojD½Yßâ«1¢%‡LaD¯×7¢ÁÙÙ(ÃJæz»jÓ8ÇU¦~_,ãNã5ÖVÞboØToÅ-áײ¿S0¯‰‚ÉDt£ò"~ÕíÔ ø³Í×uh²¸ÆÐÎóZs®ýڄŸknx?EÓ×2¬=&«¯Ó²ùEóZCª¡@½ÙXóM²3ßlº¶3ßlŒŒžnù¦Æˆv曫Æ9v曝ùf ¦zg¾Ùê™Ú™o6Ï|s]Íc­èŒÚKlQ×(:àlØj[½ïÝéæñªsï^vÕkœõ'41^ÖɐŸY×£fõêW§­Q~o˜ÿk’÷Û54˜©ÇÖ5ÒþàxÜ×ؾ#lþ´Û«3§…‡Ö5ÔvuCå¦i5í÷^yÕgkW<ŽT±+Y¶+Y¶+Yö^Æx J–Õl¶¦bÙ®`ÙF,kV¿ q<¨¡g 6C9.jõغ¢ô~ @+ {_&±§“á餧YÜF›Rwe‘JMÉô¬£êl–ñ{¥ ȝ͹†)n{Cë m2¸¾‚óá«îð4ïMúÏO–Tðؤ°Á+u3‚k èZ„ Ž+ +‰êÑ©Ñ´¹hçљ3ÜÍõèÀ¶ü>uŠÐ;ýt§Ÿ®Y?­µÍvêNCÝi¨; u 4ÔêãNC½ÂºêÖGV/š²¹:jõ1îTԝŠºSQw*êNEÝ©¨W_E½qç‹Nîö;NUE˜ÐÉ÷ƒþc/Çܳð}¸'0üå㏾¿4x„ùñøÍÅé §»´Ÿwºyÿ,ïu "E¯›ÿû¿òþ§èÏzÿþ_íóüÑKÝ珣Ɲ?ŠÏ^}üфþ÷§ Päààֈð¿ÏÞÀ·oõ§_5ìUC46~þ%jt>fgOà7Ý£¤E‘È{YãBƒ¿G´ç>¨f"á+ü¾&\âç¤q df ÷=ƒm2hŽüËð 5‡¯þ3"ŏð/ý¼8è²n{уOõ£ðG5Y$…¿B7ƒRì*ü5c¢_ö|ó½Ô¼[ÿ5/‡ð#—¢á1¿î¥fP{©ˆû-x$µJ }öOa’nþЇ•Õi<¶`ÆǍøSœ«½ æÍÌý»¯§g/‚ÁFkì1‘󆨌‹†Ê„h<»(´ä¬¼e"ûíª8÷«áä âÄYØß׋ñ˜¶¨©‚Eˆ„º0«ª8{8žÌD´=Kµà¯›§`ö¦&¶øÇ·óÛ9¶Xi¦ƒ£iž7s¼úÌiT<*ÒN•ãé™cYy˄ÏÌÜ|œûÕprUœ9œ¸›Ÿ6žýã½£9UÔL2‘¤'±^)úg’IýA¦qÂàÿÿg­YÞ\†7Sž²¸!š\Ä ÷è|æ ¬=û#L1|Ît÷ðG†,‚>êŸb=šFw„#¸q¢O°qñœ¾qrSSA¥2ÎÒÀ°±¿¢ËŸ ƾ¶Éàï'¶g€–^sáßXÖ±²ÍfÐ-î-oÆ2a™¨ÚÛæ¡MÙ`1ýß`Nn=É[½‡-ù54jÜÔQüÊ ûÙq¯ÛΏۭž~íýa·ó]þƾŒÛ õ}xÆCìÒS:woœèWì½BÓ»ýÖi/¿?év¬¨qã„Ï"¼ûúr0¨ì݂ü0C•Wa¨^ΰÒA™ÀpØO.F(0 JƒÈì_”š’%BÁ&ÕKQd2ü)ÍlèˆeIÙ³­£f:G¨`‘“*Ì~ׯåõŠ$ Ü¥ÊýUvh¤JƉ€—ñDH⺺ƒ±‚S$V\Êޒ˜Ó~OÙóÎÃûé/±-õ|,áÝAgà²éÿ.<¦åbf¯N+‹\6~̐ÇGÀ>äœ&²iæ…Xö—a‰ŠìGv >;VŽ}EÑdAo£åcËÇ-sœÇ<1£d搁GæCLpØ¢‘'™º(:ÊôD/TýOJCÖ¢ð‹Hiœ³ì—?OM¥þ‘Û!q;¢ÈŽƒþòeÃÙcÈk($âb ½aŽlÁ£%#”v„ÒŽfŠþ.\ª8ÂømǗLOT_²d|1­JF«’ÑbŒƒïpUŠÂªTÅ„,š(,Ê©'JFÄ퀸OdGAßíšsw™˜·ËÄÜ]6gDҎHÚѼÐßw¹ÅÒ=&æí1±t•/²KÛeÆíº‹üßw¸üXaºDñÁKFÅ +³5õÄì`¸ 7C‰ÌìŸw»òؼÄæí$6o'•Eš¡ý¦a'Ãþy—KŽÍÝBlÞbs·PÙP•]à_f% ú‹Ã!V÷N–˜‘JæÅ +U³£¡'fæÅü03\bÒ¬&iÖVLÞ雊˜JÉn™ŠX6i†be];öÏ;\bï{NBE`öŒš猥Ø1P^XƙhÆÚiäÁ /[¸-æÅDFš  Å“íŸdîdcî/·íÁèeM& ½4¼žê‘UŒPW¹(ÑUH‰™7j‰ò1u0U”•YB3 +Õ%meڜµÎÇ;# ÍÃ˳™¹,WéQ›èŸøÚ¨ôÃÁegðª_ªÐ[3¿ÑëW6ögÍ,‘BÏZÐ/fAG´—4~ai“ÉD‰FÚL¤Tà&°jA€´ó’©Þ£ÚƒG…êsÚIÝC’ƒ¾.„9lôÆÌ6rý"Xómÿ3ˆÆH "ᝦÝÁBëž>T¤²d©u¯àolÜú~0~’·Îæ v¡¢¡ÿ$qʚIœÀn‹³(™Ý$wÜ·|äéÙ`xa~£eªWqgpšŸÜyè>ßôòÿöâj†×>ë6ÅW1À¦OhKKóú k ’Yâ`z™˜Fª™àÐÝÁÂEëð(®ƒZ°+Ï-ÐÔ¯³Ä¯u‡ +žäf… +»2¨Óé=^†Ù­E  +¡¥±&n…ù‘MÓ¨ªÅfÁ2±çÃì9µûþ>ð4á‹þã Ì¢¿hñܧ"ý*¥Ácx–Ô}×~•w 9õw¸ì6a•Mø§¹gðŽREJÁÊMepÖNoî  +YÐ ›˜b#3¼¦pj ¨8ËЦYÞ _\Ê,Óṯã†=ͱæp±if°YÍò˙·’{¶/Tóø“‘`âO"ä…l.§"áx¡yaÍwíWy—S¯¹ö¼p‰ƒ~j‡‡ªå;q|ï ÚeÌî2°ŒÐ~g~çE ã`Ë^ÙSGK<ܸ +¢·ö‡ê|Ü}÷çó¼=6 +ŠÑ„^8½J4S¥Ìý‰Àagÿ|u­]]›´_äýiEm*K/$t½2‘ +ÓdI¤Rðz&*’),¯4M¸*ss.ô´Æ`ÁmFR&hW€¯RóÇ ž5ãˆa\‹Šb­½óÄÖLSó‰$QtäAŒ7cž²Âôªq,Š õa¨w7g¨ì'M+ƒ×Ò¦R‰0 =ʤ~"fÍ,Q&øÇ4š…ž#+ù^µ7ݙ½éÃ)S2®½pèø}š6{!åöBª³†ï\÷côÝ¡Xë~5?é¡&JB$‹Å +lTNžÐÇ ýîP ô»oï‘Á—⛂NøÞ˜å@ýÇôÒ[¸4Á•„0-œó8‰ ™yБqÕL£ MU3O&%}KɅá䚆úø“%€pŽæAñÑì»L°Yðú½À!bpö1ÿòéïE¤šüº·@× ;5ö+͔‚§yæ§vàØóØÌ·¦qF =˜ÃŒ¥}vkHkJ.ƒsbö›t]ò(¦°ûW8»å܁% ‘6„¦„dcª1] SÜÝnÿEkr6zÕz^Îá?sgz‡5ВÅÜBŽ˜±9EÜ-eýbÓëVÅLÀÒH5“@û>ô/ËD,€Ë¤ VZ¤wWš¥’"“n2ŒÛ=Àטæ-Qj¤0êP¿Or8cÌw®¿k£ßã#Hcc±3=$ÐQJŒ‘Ž`Œ+䢑H ûÉ$¶ú­"ÕlN´&k€„ç½!’¡‘>n&)°|îÅRâÎbDIÃ¥áòÓ½J >R,ó2ún3á;`aÀQè;@Ÿ[šgH‹>蝘¥*ƱÂÈêC–øJÒw ¼í‹…ؾê)b ¥¯1¾W†º L/=mÖRaa6ÀÁ_§°$¢4Š,çÔºa$t¿õ¹‘Jn@8_©ñ¼Ò£% ‡ÍpÑDÃã8qMõ;4MT +1Ÿþij*‘šº'#P§bÉ @ÿ,²j½n5ÛÒk9¿oI-JÞäJÅÈ#,è7=Z"læ%``Q‡Cq0Øzu¸Öõâçi\سÁKf°yŸ’V­Í>Ö¿€\ƒïáö=ʊ?ô„†Þ•ZäJüw;ÕM Ié5î4=˜—ØïmTB”fZ®…Öé’D3‚Á[D±8¨ŸSC1 +ª~^Épxúé,ŽÜSúOª'ŒpÒW÷VØ~ÑӶ߻—n‡Ç¼…Ä _BOÓW‡öíô´í[±ïf<óS݊ ِZ$S±„c•ËU%#~=ŽÕ{ÝÞEy +KáX­~H¢S‹ª Ïø›Ùsýã­ vÀàC¬2Ãì³e°àÙ3«ÓÁ։²]÷E۔`…>*}–€èÉV|aí¢ÜnÁu ª”1 ö€}°È,7ÌèÑ0VÒFèõc r½ bcîU³3(ÿ¨·C@°e4#eƅî)ÈL„îb +hЃžÉ° Zõfv^ïö,IÓbïÁ¼†(ÿhÖdJ©8@B\ï=Ð÷¾´ójÑ»is½§œºθ”{ÔÜbnÆghfíBB7 +Ò2šÁ +Ͷ…Œ‚`B‰)›í³bʦ±©ùgeS³Àp%GJ (Àp¨µ£†ëAHH×א’nHîY?l‹>8JÎPŒ,lúô«…” vÑ7YJ»Ìn ݑTLí)؋à",PRÌb,` Q»àñ‡GK ˆ#“nÑ;Š¸^8õ·À‰hXž¹¡' +žMSíˆì»iA]a8V͋X*r0à92+PRó!›øP¬²q¼ÁËã4ØàQ2zJ€0Tž¨á{PÒu7 ¤Áü¨ îð;Qq†Zäی³dŠˆ! ‡)5ÒLŸìL$E.)ôiqU a¬‡Å ãf" íסD@óô a0D‡™hà^Ïu3 ž Áüh æð;o†J†x©æXà# ^æWE¤-KÒñ”‰i§å6®Âc4i¦2ÒcD;ó´ a0B‡™H@oHç:Î„`~¬qøH7C#{V3ãuIÂp€ŒùÃßl^¦Ó´x €ŸAˆ"íàýqÈ.¡ƒIÐ.í<ÌÓ.„Áf¢{}¸i©›ñÜX܃n´sðˆ7C%ï©Adú/“©*Ȍ™DS+I x•5µd‘z‘‘¾‡#ÁBÑ?g…>Ùèõ¡¸ˆJY¢ +Ò"ü5úžE ¾e)|?Q‘@¡¤èŸ#8Ì€¯?(¡’%‰9!ñæ†H2”#‚´Bâ‘@Ä6÷ v3Bâ9X@¼f†H¨èý!ñl7CâÑPÜsŽ„98âMSiJ ‰G07D›H¸ +©GRXH=’Õ܃V˜s˜í÷v +HçAf|„ÖQ€ÞRŽú’ŽâtÃ'ÔÀ‘nšFSÂ_aÓZ˜ßZö˜ö›ÏJR!éHä +IG‚™{D7‡š!ñ, ^3c$Ԏ +ôþ®µý,l[;¿m‰nÛz€ß¶St*J{õ¸£•!ÉED’Ò9+ “Äæd5Bìé<̓.„áøj¢€{@:êf@9 ¸'$â ¾Ù¦éS愈Gž„¦€j$[D#ù‹@$ŸVúṔ<ÁŽ‹°Ò¸éŵ¨{µhrƒ¶XƒïD­iº幀Z¢q¥î 0ã&9) –•¦b‘ÀE È)}ˆå@žX‡EXiØö½­¨s­RÏêä†l‘߉VÓT) +p­DÃ"‘ÇíG+´"é) IXî)+9¬ö{@,òÄ +@ƨl±Ò¸éÅá>´Ý ¨E#pOÑ  «ÿNԚ¦ËÑòÄ÷럍¬ÿúi£þóKƒkU,šã§udš«øiS%ÞÚMk]Iô¿ÿñßßöÇÿ(þ>íþ³ûûOÉúw³úæÿ¸êvÎÐrg¨ñƒ–:i¦ÀÕÝ4Ös9í¨1àU\5æÉg͸Ž»uؘ¯ä²)£!bì›#Š|r)ž\ÏèÍÑO—ùs¦À5<:úÉ2ŸŽ¯êÕÁGgý:Sàž܌o¡+ywÊh¸pJÝ>Sà:Žýh™ëÁ«8ðÁ÷OZÄ#›u!x%'P¼Ì;4®ãҏ–yˆ¼šõMkø‰pt³ž"¯ä+*£âB¢—9‘ŠÐên$ý‚2G€Wt%Á£%Τ)p w’f¨%%ð +.¥ê-¤u™¯©­îm‚TÝYTYZÅãÏÍúœŠÐÊ^'Ò¬ß  +xžJ¨¶Æe.©"´ºS +…fÜR\Å1‘K³®©"´ªs +4ëžè +ªš-–LJ¶ºU’’ D^ÁýHÈ +¯æ‚ Äà…WsÃyѸ@à\q³ôª$ˆ»‚—΋ÄÚ®à©ó‚o®+xë¼,\ ê +»Y:U’ƒ D]Á™çdàMWpèyI·@ÓúN=/üHº‚co–J•ßIWðùy¡·@Óü~^´-Ðtߟ—v D]Áÿ7K§…D_«ðÃ$A¤KrGWʈþn˜wºã­á8//32gñ+Ž`± SËÀ~<2Ւx–™kâ°#~1·µáG}êšÚ +æ«þ¦Oaúns°á“Ch?pnª%q ÎÀGXåˆ~ 2˜Lu£àÅ؞Ñ'ÂŒÄðÀÌ@- “É0›_êÏí_0è$ðÜccÇýÏ{ÁS{¶Í +œýê2ËMSÓù úšXâ7ö JÄ,3‹ƒky)Æ¢™Å҄@,Ö/1®//€q`»‰ÙÞX>ФªihÛ":”‚WsWÇJï= ¶³;›K,m‚¢3è" b4©Ûw‚F¦Ê!¾ D?Mß™G¡8‹¡ +U$µ#QA_S[9© æŸÄòFÐû(\‘05Ý”A2uz¨gA»©ÎVÙfªëm •B"(9#TILI¯äšàz<¸üá²pýmiUüú7ßuCâÄvb¦2§¹¸ÀÌZ|æþó^Øh/N›Šá·=7@Îl”Fq…Ï&^?b#ðã˄5ð6KOn?ÕXä‰FŸíÃø,àMé^_ûrÓ)ß×(å |­°næÍÁx\ühûãúyN|d)‹Xá«*ô‰ˆpà:tô..ò'u·Ù'>̀\*Ó tú*_9¯­bӗt,Ä;}ï\¼\,¿Ð7¤àE‘¸!у¹f(˜º€úD|šj·‚•85;á¼:xWöòhúÒÜ4‹ -eaŽ@*Æû Ë[«lö2•…¸÷«ãærú3š‡‹`§í¹­la¿°÷üʞސáVµÓwPØÙá†ß Á<ú³ZôO5ûgQýmEÀy­URNÿ¹¸÷«ãž¦ÿ[V†òbºs¸¡Ì¬ãš·e 9–ùLÜeqGÃÿÒu­Æú$³*˜ò¼îĝøÂIxá §™ÇX„årŸÑv̇#÷jF’yÑ B!ˆÕšá· ª©› WÁm +ØãŒÄY»ÐH¹ôîˆzÑ é´UÜUzÞ³hð&3DãfN=cdG£Ô‡„¤÷йM=Ž¬É%q24ó¥ìv(ïLëI҂…—œ”ëÐÒêù©53Kj•]>nõ„“.†`Èíw¥OMIÑ`Š+‘æ¡øXYË$­ ÇÎéٟƒsZ‚g—£4’DÕøzˆªÇ}@ÌÔÉwÿû+ԁÖ"#œÏZP´Õ‚Ò&3t^f …§Æ, g±)Á­3¾IƤ•W™ľFW +oäQZ&‡1Mà+ÑòI–è“@Œ] .Y€ZqZ\S,6‚¯þÌ´œ|A "ÒtO@ÖÜJ_*Ž¸œÍ[á© |«ZÏÓŽ¹€DwW/W N&ž2Ó%¨(ãIEÌÔÌTœ˜jÔ AEš0Ó•z$•eüd…ìŸòâ‡6mò‘L©9Á[3;o]aæ0²nfîLøZíÙӏ•ÌF$­0ƒ&èqzmÍÇÚ³XB5ĆªÌfBÌlÝ8 æë­f)źôb«„„ z ¸}Ì3é&b qªéJÿ›&1ÈXx•Œ hí|à™arn,?„~yåŠ~¯œl2ô÷À,è5Gʈ0ÕÌb¼~¯lÀ[ey†* ܏Ì^À‚W œd­ÅprÇq„·E¸~46ðÓéƒL +.Rû O´¾&Àµka•)ô A`¼^•Á÷SÔ>ñ¦ˆ³ f(Á…ªU&ó§{Î9£J!Ä!ô[`ÿ¡ˆIsێ^‡œá®1Š"D’J¸¬ûÀè¨i‚òŽ^È0F:ӝHšú`¥nT#üo±‰D…\y½càšíÁýzƒ“ë,•M‘$x¡”é7Ñ*v„)MÆç®!Œ¥ >nÓd4›^S¡UmØdXR#Ka?3=£Lá•øœ âÖx״řñÙèµ%%¤8Äx€~rєŒñØM +}GmTë1±Ár‡kG8– e°³Sa/Z@ÙìoÆЪ0h7p7‘¹uM€¨ ×rÈØT”Õ,ËØKÐa OaMT.MPy^a俞†w|›P¼†1åTŒÖºŠa¶˜0°ÄpF`IÌÏÌÌì”Ìh(\j§gAÝÑj—Ú ¼d}ö ›£ÛK͌5 +ânUC@0¯4wgqyM‚ž¶Nrݱ|O*Uî£{£g5ÆéBoܵ±U…ÐõÀí‡4$ã-<øݘñ^ ÷”©ù΅mLx ±Øìw0ÑÛy¸œ §Â啕 Ðrã2S¿ë~ ûŒÔôxøE«zayâÑâÛÓ=s%¿7HN¥ÞÍÓ¾d å›ÙH;RïaÒr‰2?b!âY} /¤L—=šdx¥Ê´ŠVã½Ó:[µ÷–Þx:í¯,¬’‹à»[F…E®À’êV/~.®ë’—Ád×_É*Å%ù.\hDû¸„€©£½(™s(à ™Á‹MTéœ×x^é½¥sn½axC1/K0>^ Z²²ÓèvUX?Y”•,š–‹Òm™ùëŠéPðЙ}U\ò*zòb7|Mgñ–€‚‡Þ©ÏM‹]xQþYîvå×èŠ×§ùëñi>Ì»íó“{ƒ“Ñ<‡ÜÔ9Ò$a¨h¤ g´ôk5C`*EÊc-'>»3ïHƒ5‹5š=Y\K‰|«0ºoGôm¾–|£/#³“àÕÀ S½-^}¬À¹,èðöߎèÛ}-ùF_Fïn2¸ÂR ex•e#ƒ #L'O£·îõ÷·Iã^ëå`ØçýÆy·ÿÛäìßÿ]r#凱±A.@ÂáRQz«5²Á5|‘Í‹`梙™ÛÿÀD‚IZ²i°Y3a)ÅGË1R$8ie2µgÞÇ5M*8 )æaC|$7BÆIfœ¿ U+ ´h%è½Ü@Œš-ÁF#=ŒÐ4ӚºH"sO#g&³ÏÔ/H›¨„´%T¿½ª4lé"Nƒ +²-àw÷.Tü×·QË3·TºFRÏ\ÊýÐ\l‘ñÀtÕ‰Lú¯Öĕ§$̋ÄpxKo#,MŒ ÿN–L˜4WüŦŠŠŒDŠ²±‰rÍt€vVìŽRÌÐÓ:¤q2Ã}›¨i0GNcôÅ+™BÑfî5A›(ñïbû£¿÷ÀÄÀPß3Fã‚6´C‡GÆw‚3¢ +“0‘1¨“ {°\$Wk˜ˆáX“ ­)(Ì ÚX•Ð¤…,Ö$aæ¶^˜`´sЂÐsÀEÒÆ vÛ ™ß=!ò‹2x¬f¤tÐ N_¦|¿ñ^VÛ'6&K _"õ ©´s¿ïbœ¨n‡Æäd‡g÷Æòn6AIó ˜8E0fê&,ˆix§bÂÁ¾¶L ™>‰Þ"Bj[jqH cށ"sã7ú÷ef¯s$Þ¦,Ë8^/™² ä:0Æx vv†¸ÓÁ\ãö“R^Æǹ>Kø€Wäh¦3+ñ4“Þ¾W éò5H—œálW—·éu%[‰¿é£¹„Ãh}‡ÏÍp9 -ásZ|^‰ÓéçJxb[ÛAÎÎ*üÓ6Wâx˜”¾ +Ï3ë}®g6ÙJ|Ü<%œÀ«ð>Èf®Ëý ¯u†ÿì;ÃÁw³ĄJï-Iœ·ÄZöðò¬,5…F™Ó¥&`êŒ)ãG =و kÀ NÅJaôè‘LÑB]‰8|´„4T‰ =Ŏ”€‚qfaÊfAA/¦Çy´àÔ(¡‰†°™­StñÐàeÆ#7M›tß#(äðÝ*/¡“úTB«pu-³º'à`ÊBï$E«»âøZ.ø2(|`£;Ö=ù~Ð<ìöǺß{{Žz^øËÇ}‰¿¥æ·Ç½‰þ÷Ñé¯Z=֚ ¦,7ö‡“Ñyãa«ßzž†0Ú/ù±a~=hõzÝçÃÖåy·m›>Ք¸Õx2éw{¸ñxܼ5ÓøӆîñÍòG´†XúÌTë{G¯Õ>×Éð½Jõ5Ï |78ïå£q÷lLí:û6*4m˵ZÜžS[;_%x Žï†yw”ßú´Ñ´äÖST$ö{˜¸ÎþT×af‚ÎÃW(ð óÿ¸;œêoqã΃“ý¡^нQuOõ¶:98Ö-““{½ÖøÄ îñ@wêÃmμÈî…s¦?š¸º ÿgÿ»¸Ã+¾¼°HÍËõgüŸù¿·œ¿×Äþýq#.¼½Òðßõ|•í9\n×Á7ÍäzP·ô_ Ø­†M5ñ¶#æ>EàŸøÃ™·Ý?u[†ó}þŠZ7Xñk<óþ ÛPè#X™½RêoâYªEZnhÍ¥Å{˜ÚÌü¦gñxüFOØÇÝú®?xÕÇopÐÞ¼Ó{3µNîÚ¸õ½ž@8®nÝÑgñËÜ5ºu0¸¸èz¯ÛÓCÆçÎ[Ý~Ã41`ãiºeÛ|ý­»£®>.i ’ãq«ý¢’ýÖ¨Û.`^äuPpü©÷hh¬¡ð¡É0?ÉÛ}$vðWÓÐR£QÃJBá­Ãü¬q»ññG›.” n7ðå -4n=n Ç¥£<ô;“î¸Ú£‚±×¢øBÚ8 é‡Q~÷eÞÔ1•Å‘ÄžbÜBûtvÕ7~fMe=mæ“çD{ƒŒUŠJÚ/ËZögh:E{ק”_¹àHRAÈI +‘CúƒTÌܐ›hÕMóZ9ÇÛsÓL0–ֵѯF£ÅÛïåú {g»…øVØ{Á˜<Š…ƒÒÏÜ}·'Ðó#¢(a™¨½l·|'=™žas’Zîùèìl”?Åy™‹âæƒ^o‚úÕ`ØÌ_C%sºÁ­)DF-RôǓáË|8jŸwóS-è~Ñ8҄ݻ{v–¿Ðï¸õ´;^‘‡ß|4´ÊDˆvG—½ÖóõÓ÷ÎèÝÖ7?º=è›NUfG›»»ÞÏéö^øÚxþ<ëڇ?ö¶amëkS &¹«ãîÅeÏVVØHÓ"-~e, Ô³•×ßc½ Ǖº'¯p÷о;éw'ýî¤ßôïR»{‘W;`'Lbê½båGÇÀÛ8 ûš×¿“£ãnûEÞo´N‡qÞOŠÅ“Ú,–ܸ 7!:~2Z°v¶Êkk«|Ší¬g•YRºrõnoâF+ŠDúé\Fh%§`gPÒcúï°Ÿ›ƒ3¼éuñ©‰-Aoj›­îeù©ùä¤äïZýq^ý̄Ô_™Ò™ùdٙy}yY¶ãe;^¶•òȕâF)+Øq£¹Üh¿×šè‘|ŸúÃÖùE¾!NÊ«À–0#3摹Ê)®2›~ëÓ1•äpI“w¶Ïäe2=ñ ó2Y’“ÉÞK[…d”(ÈæmrÅӄc¾5‹2̯„:!ÌÔ1Æ0( Tœq–, ÛVB%I×hè5%¥b©]J±&AT’©Oeði… @ò6H¥ ®›¦àxKˆ5bÊ3, >`]@ ¨‰µ•JU§ ££LQÝM0û£7"—reÄ»$Ë{1®o{ƉŒ1lZÆx£7”‘0¿›§é®¡ßCð&_@é÷ºß³à¢üþD—­]@2‰Ó IÅPÕnMsÞÁ­˜L%æ6Ì*öÍ_:ÉF/.wk§öÚ"MáäãnŽ$Á BìXOØأ段Ùëæƒ,›%`癨£?«ä]"ÄΘ÷~¸ÌJÓ ýAà½â ž4á¾íË´œÚŒ³èúeAD,ÉP‘Ž2ndö,K$·ñ±ÍT+Ú ë +xn®‡<ê¶Ïa(çÃÁÅfòÉ«‚¶81t‰¹}ÎcóMïßÙκùe·?Ê{okQâ{ÿy/’÷Z°ž( +ÒXêñÇ[î/Ä[xî0¿Ô‹tôÈü$é±Ã®î3Ò3D†Eý|d,ÿYñ%†‰Ütúë½|¿hLe7–ÑúV˜r —7ᏈuÕ­úÝö “×1}R£Ú䂊,Ã}__ú¦‰[>-ŽÈÅ©™„òÇ yñé+¢yØ˘>´ê±FC…„ˇ´Ö©²L*ü #cì)˜žAµæúé‹–¡LUºÚ"ü€öE³ßM6¤kŸ/ã§AÓù<ôñY«ÓpÁëu‚¡P9\çc÷Ñàl4F’‚\ôºŸÚÙǽôk|Ycûì“Ïá[}˜Ø}i/ò\°WㄧÉîÈXåÈàè×ü GÆv%8ÔWÅ ‚9/«`E‹k˜›zÞW9ہO՗ß-¢¿ˆìÝs½†äz²¶¶`þãôOÿµ7·ÏsÍYú Ë´&ÿþ¯¼ˆ4hÚYЗؿ®_¸ᰏ&ðý~oðj™Ju8\6ŽÏ[Á«ùjTqý=ŽU­Ä6"Ûd”?>>ÚïM†séuî:ySú¨Ý³ªÔ$$m÷²Õ.šøN©¯¤ížöúfÎYBJÜ7î¾¾li¦ºŸŸ †yãG­“qÎç+Ó{­ç£ö9Ô¦ÛÅÿîøð6óျ¾+F\ÜÿpMei†Ñ4T€[cЈüñ’ÀVgxb¥ÜcNxlv‡bNE¤?ãé’ôWLg¶=w +ž[³ŒµÄ†³—ÍæñpõvÀ%½{™_pjمƦf–.Š¨¢§Ì$!jô†ÌzWpܨš:R¢ÄáŽX»cõF Ȝ) ‘=…R†y*}˜%f—*†û6Ñò$ò0N=f´é"—d#cdÔ´Õ¬û¥øÏ$“b~¹ãgú²¿t/. ´e)Û°ðð£aû¼ÛÉó +»¦‰àûçˆìx _0¬€Ê6œ‹èþ ×1±%KQ¹¦Ùüàõ©›–ö©Eµÿ§Ÿ³méx¼yؚŒÆ“3°È°Æãç53s GŽI. CH’9¼Ö¼2†¢+ù@œ‡UHI& «‹M¼æ È6¤V­pûÿ“Ð"‹Þ&ýq‘ÈXá%µê§¶>¨1TO³8Ó½˜z5ýÁâU¸™AGP+ÖüEɀ§À‡H)ÄÇõ™Ž‡¥pÿ/Hð/pIÏË´|!ðx6•ÉðC¤¤•/¨sÓ7GŒ*—þ×s®™9ŽW¨Ô°W},IsªkÑFÙ.)—æ`“ñôq©UKäÕ\+†‰²ôìeFQǦ?ReÎ`”\”ç_úèJ°‡ d?…dlÕíÔýŸK$P€ã@ÿë¬TÈÌ\ñÀb\ZW‰U¹¨GÓœ¬¡žK›‡šàje¯PµDAHÀTëýü)?=k OÃh—¸fù‚’@IÅ +ý¬ &±“ôy `êS$RdÁ ƒb•• Ü uKÇm(¨@jÓCñXÒ¤Jbk)™«LKY¢L›ž˜iÍ`z¹ÅÂà>R :‘ÁÂa\qؽW•É]‰¹‚ôN#žš[Ý)׳ØŽ«WùmÆ5/¸Ð¸2c‰J¬ðHi£˜KôI3¿äá{¼ïíoÎÊVï +¡£îh\´EÎZÎ|\V©f&¹äcŸ÷qxKѬMÑôhÅ ’X^¢¨þÃô¾ÕŸõþý¿ô0N/ÍÝxO[§G¹n‘ïéOš¿ŸæC¨itroðb2àãÁå—åXÀѼê;À~1*gy¯stìæ@­½ÂÏèÙÖxr1¦ôô½n‰õä u<ÑÍûö:«Nwü¢5ãVw»ý­ÉÙèUë¹ùýñ£c¶÷ôÎñÓ»ðmþÝñÐã T]ýtæÖBK®¤·‹çpОèYëþ·ðÂG€Å¾N]þxëÙãï|ÎÏ·7__ôúºÁž^pÃîédì.c¼ug8l}P4ïè-A;-j©+ïOÝ/I?Ã?cµäÍ?ôG'/[ÃÑí æyØöe«7qá‡Ñœ†4eÛÙތŠ_7žT§Ý~G›U¡”&éq>þiR\aóϯÄ`ûƒþ¼®ÚèíÝ©4Hjú.ÅÛ‚-&Dµ¹î½®•vF•Ù]ûä×g +_¼¬Î íÕXä0ζVW€ý½×%úŨž^8C5£©¾R?ľ9†›A®V¶k+Î^]õ½œ|÷~oÍ܋ÈÅ Íñ«n2+L¹my%·H8d &K‡§õÈç畸‹kz%(—íuµzE´'RµtHo* éÍ’‹¯›;žÓÁX‹GùÙøÑ°«5ÙJÛ}èÊHȏ“a;߇ÈÝ«!FèÓíJôã"·:Z¾zÉÞº3Ÿt¬‘¤Òš Z#ȝû½<ïÀZü1@N‰·ÃÁåaÞ2Ñáe'þôžTà ÆÿãA·?ÆÝ|2éåÂ÷齘Ðü"_õàþ†5ÀûÖ¾×ÀOgAš4£±<¾ó„¸+ã=øÇ÷âIÞ{:xb:`zôx0êBçñgî:UˆM3Š£;Ãñé 5ìæg­I/Tøýš 6HH¢ê4%cw@\¶:O2ó¢ ¬¶^„.ãiX«×%¢ˆÛu.»M:f)¤x`£vMÿ4îLƃƓÖhœ»¿åÓXï<`¬A+ªñ¢¯ÕþÁdÜx>L.·íŽ½Ö8oœBð+å¯ZgËÖe>lŒº“žÏ÷ûš´,ºãê9Œ‡­þè²¥7\ûîW·£ñ¹qH.x:[ƒëÞM*·}>ÌÝ®^Úxè¬#‰”°Iæ5ea–¶ û°´±ïKâ4vMÉèzÐê¿lŽ=¹Xa*óQ>|™7À²Ý¸ÛéŽ[§Ý^wL ùæì^ÅçœMW+_“Ëƽ:ôD#Âq#ÜÐ>Fð0»µˆ+¢ñ$×ëh,Ž8*<òh2¾Ô rÉC¯˜ÙµúÏ'­çyãñàÒ­j¿~¿78mõžä—“ÞÈ#,rÕ§ƒË)¦üødÑðgZÞ/î>¼X5ù +Sîí¨qæfRó€^·Ÿ7Æze”¬²¦#̎ÍlqÆOŽ5;;€5ûpÐqjLñ¬Çºƒ—9žL÷õ?¹× †÷ƒÀý2šnû—^ƒþ_B@¦s›Ãùx÷õØŸñܦy¯ìHq°2¹ëÈfŽïR"Ð]¬ÛÂn:ؔÿ9iÁŒ6Žò—¾b:».[m¿€Í̙hü$ïL-ÂéVšGøEÂfąéæÇíV¯ìJ‚EÕꏻ =¬ÖÈQ?Kق^îûíǐžß´°°æ´{¨wKf¨@˘«D-Z՞šK›CJ¡Æ=.%î¸ådZ6óîÝü•^BZl·úm¿5-ž{­vî ç,jÛbºù|rbóÙ¥)çЛ/_œØ, å"²cÛpyÜd¢5£@.×LõޤףƦ/é_ç SúÞqÞûKk¬×ȇGÉqNÛ£Þ2pªZ‡-ž‚-^]zBí£šQ¸ TVaAÁ”?îµú¹>ÃU5Þ®=f`áYkrZ)]ñ+<è"úüõ½îp´¬‹ÓÏçíAŸÖ‘ʤÞj1KªSXzû§‰Ò8€ÄËpX١ߝëåÒ·ú–GØ3Ï3X*ͳÇRq¢ýå3†a=•é1ÍP2Òº_-Ç`«ˆá**%'óReA.:žœêöÞ ?=ÎY"GMÉ;í^÷RKàà¡y­%ðçz³;½ÌKë…G†(¼î½Ô=Ör»–6f;ï5—$œCüÇ%[¸·(VqucÀ[-.·Èg×ÖmxØ'RNñ¾™DK/irâüàXíÏóNwrÈö¿|äȆÖf)EaT_"î€áõӐވñæóÀÎç“Â|δ}deÝガÍköÔKÏáÒÀ6F¡¹õ£YûÓk¢ÐöÑôXN,Ö¸ûø¸µ õ2rœée/'X±ÝŠ™FIf1Nӌ…†‰þÀï«F·ûÌAÎ2¶d){ZßòÞ[¿N›—ZÑj…sºc3íàÕ­^oI³Ñ‹îå©è‹)n<Ýn˜C¡Êº8\Ò´=èõ<›.Qò§ »CaÑ3ãÑÚ€âßNôύ@bYFqˆ¸÷S~zëÇn'Üz8ÐçÎ/‹GÃÍuÑÐ8ÓýѸ×ì[ŽÂr ‰à9û@`©­òÐeçBÿÜëWï×e§:z,á)[——CÛnA ‘í ñ™lºš›ÓMCçc*X3×°àÅ˚j.Æî…ÞT͞>ŠHçhfKÎГʥ¨‡AGÒH6½K¯¼½ñûÐTN†íóÆÓaÞ=՜VSªÛïb9ˆE3Èún<ûÂö49ç·*Ðr²AhPX€nºÝÌ¢Àfh›]Ân:ù¨û¼šù"ÞqjU qbK´{Ui؝vÇ­Ëê¯81³cï ›ޔ5¯‰Ö* ,ó šºÃHóú6ñzÅK›;ÍÁŠÝ…4×òLŸÖ®ìZ=K›]Z_È…/~Þ\¼m# + äîéf#°9lK¾\2ÒQû²×~³€™FíþŒ~8Ýh¬u™ÐŸ1g”zÊz­Ë +ä°  àòùŋfÞ-~!»†f#WhdéZÆö†¿›¥ÊCzŒ¡(un+c‰ÐVs<Þ¦UyçOÁ±¬Q{8¸\Ö䬮–!–µ m¤ùԒ½bÞ 6êÓÖp´hJý04 ¥ +­ÇḖ5¥òóšC¥“ÑTO*´ö=©Ð8ìIÙÎ:돛ÞŽh]Ïý…ìڍ´Vî ôe³5ÒÃõÖîR¡eÔ<í‚4¹hÒGÍ~þ¼xÄç´jÏuÈÌ4ÔçR ¶k£+†XÎùtÃÑyK‹óù"jA«| fWß_ª¡qµlÏ,;3 +ŠIÎ^h_ÊF è'£üpÐFŸB¹b‡ž UûÐ,$½sþq÷uÞ{œ¡*\È@È÷ol_÷©²33ñ #ÌSG`Lº34OaxÃÌSÅw£Q헙Ç*¼­~€B`$;n½Ìjí»{ÙËïLV–ÚMþ¿ÿûÿüÿ¯Å[¢ÛÑéS·=<þkÁÚ´íځûš¦ÿAÿE²Ãy·uÿÞÛûQë­ÓÄÊÁåؘ ‹¶Ýo§Gæ§ÐJ© *P` ›Îù[û]¢ÀãƒRy˜ÃhñWñçGøù³/úꏷ[Ï>ÿ6þã½ýo†÷/οxÞÿÝ·÷~÷ùÍ?t[ÍÑï“þr7ùä‹o~¸ÿõCñç/ŽþþÇ‡ß 'muï.˜Þ`B|E£Ã_Ÿýþ›Ûÿhþé›/?¿}3úŽßÒ¯ùæöÑï†ÔêÛñþó¿üçÑ7_Šüø ûÕ×íÃfóÏgÞuÔù«~¡:¼wã õ·ûãÃ_ÙÛûüÎÅàh¤ç}|þÙ×É'“{‡â÷?íÿÚûãOú5‡gÑ·§¥Ø~¯²3õãþü÷;Oš?ÎkØî‹_¾ùòŽ_¾ùbÔ¼øìðó“{7ïwÎôk^÷þyòhrxöËOj¿÷MïÙgûçãƒsõ7V È?ÿpØfGÿúæË?ÿñ'ƒHwztðçÿèOø×áƒÎƒßí勵þþÎñÞ'}Ӊg­ÎD¿&ûõægí»mùŸ7ÎÅÉí/ï܈ÿðÙþ÷Ÿÿó³oþøýƒ|ò§¯üö“óÛívë|ê~v÷ìèܼšE·ZjØýý?¿èþãÛÎ~ïƟÿ¸7üìï“;GÇø àÓon{ë×$·üå›;ýö/>ûêáí[êâï_u•º5:‹ï ÛØg/¾`eûðÛяšrꏹú)Ž:_tnµô$³‡_ÝÜû<ßï©Çf =ºñÍÁƒ/?ùéî癄Š‡‡~N>ùZ þñٗ?v~þ‚Ÿ~ò âýºCéëäOŸÀ´üœü”ügHõõþ‹O“=»@ìEì—OÞj}ù‡{¿ûìoCxM?ü±`ýšèôÿx ðËg_ßûÒ~úò§»ß™öŸßý§ÁÆÿÊèü,úìë¯ï~Îÿüü+‹è§¯¾¼Ýùõûàlºk|ö%½F·ÚÿÖuáßvó«'Ð*“¿Û?e‚Îú+’=.OñՁ°æܓ-ó{šÿe֛×mºóÝ3; `—wl_¼¤É¦[_ßfð³S&h¯~ӢӚû2ƒ`¼ÛoJ$æ_{EF¢ •ŽL-Ÿ{PÞOr3ÿ÷[ºûôyä¿gJ·:ÃuøwíŒ#éƝ  ÷¶LÄ3+Ë<LÔZ¶)Np¶`¢ÛCÌÎyËóþ;yO!C[N¡%à¢}ñBxb•Ž_@~Ïy=L·'å,ý4’ž¤âŬ ¼2yò jÊxçqº}îø¹§èe(ÓÀ7©ÃgÔD-¾Qõx²žÝ„B•©(¯ºI¢bّàŸy†¨xæi¢ÜŽPŸ¨Öd |š2à'ø¢A?B_—O=ȳ0,½ö#êOÏ4Åü Ñppêgð5Ò ÿñüfÑ+šßóø=Ža’-Þäd˜ÀŸZFÿ_ž™&jž¡ÐpÓeÞ¢@®æ¹‹±q#§&‡¦ ÿ´fÚôoÆCaú)K4„‹ÆŽè…à2Ô/Ÿêqê—åÕ0BÀ­Á:C 0kŽ0y`~hh@Ó >gÏ.¿Ï­K Š|,Gð×ã†h4z)M«z±¤}•a<þiP;6z88Í/N0HuøÕà^Akî97››XB2´–E#ÜXÖ^;_h4^}AƒF‚1dvxÀínlˆ[Xh4¥ùÔôFꈃ˜Yןy""ÀÁRffÃÊ +„PtrR€¿o1.a‡XÚܾ¥Ðˆ½Š“–GW±ïŒ[]ä&̒.1)À²§êm$`mDHMìe4°yY†¥órhXB"yÀ‰]F`h¥n úÎ×5méÎkeC¦Ì‹°/¾¼ø¹IoÀ©¼¬’“Z?Jêm®ob1‹†µÂih€ž”[¥Þ Ýeög4Nå?W{ufbºKàԐ6£pÇþ&cFÙrK§5I隍’õ;LyvaH½š-‘ì÷¹5ÈU*û >¥Ìx‘nmrõT{t˜cìÏsÆŽL–è ±ǝr˽@=u?Z‡À~Ýå?w&èð:1“Õ“™-s [¾ˆ©rò9 ¡µ¾÷p›.®±»֑5¹ýƒôüàgέ»ÖzOÁ9p´4EÚ-"¤@i5Š4[DPë„ó£ vžå=Zq–Qxí:éuè>­hu¬WΠ͙O*ߚ¡ÔÁû4kqÚ¿`Ð #ž1ãŠïÐð¨d‚f€Á:Ë4SC[¦ùôqB*8Q.xB"¤ÂM Äý‰`ŕ+ý†¦ÊÑôOoŠ¡_×ÕNºÞ­¶ÛT8)[†"i"´±û Y—CÍÁ)·ØPõ\aõ´û¬‡n•OðÉq*ìg‘ˆ=æáíJØFq3šn¯SvðÛå ñ|¶’uoª«ÐfrǶôZùœÞÁʐý~×GÁ Çc†>\`®JfU³ë§ñågf …öÈ(³ò>ë¹g,ÛÑùߚ€KUæYèÁ Ï¿»Øí"G6™ßœ'Þ§È_˜b.‡Ñ=h¡Ïj9Ól¤^kÿï…ê¹ÿ”n¾´_¡©ÏA½Êîd´â»šmì ¦Mô‘ÈÛÆð¾ÜÉ>ÎÿÉíd±mŒnc`…n¿²?ǟ`îË9ºX~ŸEðx.U^ nSsfû<…le^‰zÂúÒÚoœÒ•¾gÎJèçÊË<7ÿ‹8.´<æ¾ÌI"—-(’:·ú„‹rDPgÖÛs º˜˜4©Š wfíjyÜö†ÓE¢/ÝðG~µÏŒ,ìöÍrÁAã F¤Ï e~æüð5$¿‡Èu@áÕ%àªÚ®Íæ ÷j(îË/ò£úl 4–”=_Öü§xOû-‘&†oaJ? ñû ©x²kʕþ~†™ÀkϕnÚËt«c' O…Pf噐ö·'¥ÀP̳;WVmPi¡·€¬Ž·Å†mrl0õs_€d™uØèȕ-V §òкÅòi÷ÍÏ1òû2¶¿qµ‰ÆêÇj똷ۂ_øy×k7ΌR¯ÆӉE]˼ÔOU²• t\NîÅf=Qâ4 öÈEþâÚï×WôÇܬ]ϑ&sý¢Mlr¼÷öØÇvøνÂÒ¼·^m¡—ÏX](¶YWȟ}YÆ~òŽíÀÄdÀ“nȏÂßÉf†ïýR†ÏH”Êa8‚³¥öMé$É`¯}ɾ&Y…æ%*¦rЁJ½o•Ní1µ‘f Â(ü¶CArK¯ƒ lÔJ0øLî‹ñܺàdz-G}î«=ÙfÀßþzz“(mE–ÔM1^}û¹‹Ô¾Ü¸oêÑ|%Ëìpµœ[ܒ:8#g(¡SéÐÇü%÷™¸óƒÅÉ$ iä÷`î]`ÔOo¿ë6¿@]€q £oÞ¹áƒa%K%žƒ>1.‰¬ÒùN:i!}rœûj+”È [DÇZ6ý±$³©e«h|ö”Ò÷*-x‹~%mûM½vJS2ž;aÃrÙ𘊾-–©ðî0Æ\¤<4y¯Õ†– ðRã[0]ɹRú7%^X×þì‰P¡˜Úb}v©„žÿå0tÐ<òkJ½~uÎðD°|ιZsg*úò»Â4wðO'øHn²tHˆÝ·û´·šù‡!/°Й×îïÅh›VèiŠëç\qt<æ32·Ÿº€#ûûÌ_=¸dšæ#8ÑVƒÌ*汉ç +\ǍΛÎ؃Ä׶KǏIá‰ÔWRÃè”ûÚ\"|çèÒ +ƒN=2û•ô]n£ô —!¨z‘ÆÞïá ¬¾s…ÄÓè‘ åþ|Y¸1ÒRš¿AôJ‹^nACâl +LŸÍb ±7 )~Ѿñd|ÀO®RñÄ΀oJF;Ÿæn qt ‚‰®?Ÿ8+M(2Ëψ¸×´iAêAz=]À€‰F’ˆtk[=åõýœÑ¢Vgvq¹C¡*Gþó1ø,ýÌ‡[EÁ)Ú[UdSǾþL&`åÿùz’@5¨!žw 8?oXm#ö–·×Ív@ÑSì0aÞKÔÀ¦¬jÒ%‹ú mMZq-]­-³ Á†Þg_ò‘ uÊ$Žƒ'0єž-Mk:S€óâþ1Dã´Î˼EŽ×î šÁu*Ô[æÓáÂñ£ôNÒRv¾f=Ý¿cl5ýY·¬8êÄþÖ1“Ÿ CCùyN‡g»%vR ÿìD½S[#³vz:…Þ ·ksÊpN@ꕗÑìLN>Îß0=Č,(çÆÑñ ÖÊÃ)µ_n'Ü7`õ»–ôf¶<²¢ŽräýCG#–ƒû +”ÛÑаÿD\óÌú–îtC„†¡`d•ú­‚Éÿ½ñ|Ò“7ppíˆcšˆ¿ì0o*¢WÆïäl?îϸ£_ɤ΄gúáC֒– >³@´þ—ŠVæ3]¯aPwه”ðòÆÔ|gÅb›¾msîü/ÐÏ"Û(:G½ï.?ξÈû“`·>ü¥…M•|—NZO±mþ3h djVëOhSjÚ9G6$ó*Pj¤pµqwöÃˌÿÍçÄXàgäX¦;¹£-¸¯L“ÏÀŒ¶,îá#d¡Øžc³èê9÷ñÓ7 kµ|Y@ÈΠ?)¾fö;5wæJëì›@ ¼Íwi©dÂéÆÀ±Eó§9ÍËw£sbâÚªü¬“pb’‡z•Šâ¹»Ê ‚|0(±É~(Ó'M4?ü:қ¤¾AN,^¸)Þseý >ÅJõb+íug`6 ’V ÃÑr£L,¡hàߝüü´`Ôð¡*%*Ûó5{l@»ì¥Î1ÿ™(:S±®igŒtóCcdùv+B¯¾k„Üߟ'8Êÿàù‰{9tóžÊ²ÏÒz}FۃµäS4{æ.6r䘽;O&N¾Ë B&Q’Û9üüÁËðä2ø™wÓå¢Ä+hQnG¾˜„÷nÏó•Ek±Ä,Aô*sKUú [ÃG «$±ä~LJãÏfþ0ÿ%âY?›ãi}³\lf‹Ÿ¿‡ö]"xØ<€‡‹Ã΀—ðª #Ê3ÍmW(±ÖKÿg±™m 8.ò8hÇxÎ>} àwÿó`k’Ÿ Žäðú¢ÿ{¨Nÿ»=Ÿv‡íò0ýû{øøõÿr=d\¥M;‚QÃ.:¨ÅÆßÿü_ØídCÁ€ÿ£ZþÏÿ·>ý,Ì(Á€Žÿë?‹ÏzÊy3[¬¦tÓÞÉ%Ïð kôŸ‡ŸB³"äôxz[Ìà%@*–›Ú"?l%ºÜ»lñ½ŠQ ‹Á2¼¢+É­×9Lw;îÒ;ñ7ýˆtšºŠÁ2×àa ïÂDÎNwԍx?l Žx5 ª¶Ýl?aW›EnûŸ uûE*¸hٍ¶C$ Dݖïڜè›á ll×?²µ‘¼ÅàÆ^ùaïőªŠº7¼Y¡N„?êìv3NjPåæ ,}Õ67•±Ÿ¿¨.Ùg~Ü¢* +ÿû"_…ñºÒ»ULâ²w e°Óÿb×b '·ÜˆH›Î÷ùo¶™þ¬ÕTô¥"ì^N[·{\ JtðâZo@iNàõ~¥ìöã.óAwù¨!@!ÊîbU‡øÁ'r‘¢Òž¹SQ~þh3 + iG]È­WB‰É€¼ñ =Û²5’¢eE¬äG÷@µà?[À󬖢F§?ÛÙôNØ{ øU \q旟)õ/&ª((1œô%ŒW‘¨u³Ä,=çôóõÃV–I ]å=VâuœâT»8Þ9Z|¥®)…H$xɺæHüZþ/Õ]F뗥ä¾»m•ÖMBXýzž~r +¦šà§„ìD"A®(NHeu÷÷*Éè;í´ŒR¹£¦»mŖ‡¶¥Í'P&…ëlaðÅ£YÖF@…DÔ֝- ¼¸ùó{ûŸâ^‚/ñކ½ %&bpÇtlßEA3?HUªË,qdêþAäÆ¿¯Â³'“=ù:sn{ÍiO~Ÿ|ð“×oF}ìƒ&û =ˆù’S&÷)¬Š†ÖóÆÛìS¯ý¹üÖ[}Åg½Óm†i×z{b×[_½ãû<›|¹ôös´­wÔz9½“¨y ÷s߂ðôYkÓôk`t¹•?YŸ$|™°/ÿ(ûyj¸§Dq¼€+‡Cây–vì^Ê©Jä˜ão.r;ð¿æï"7 ûò9ýüé±¥CÏØ´g¶@X JM˜š’ËWÀ,ÕË·ªÇÃ!vì,Žáö·©‰pc;†ÉÓ«w´]™ˆ¹ÉƒP×9¸‡âÀÃg{¢ 7¡©Sk“[¹ÜÇpÁÞÇ~ÁŸ…5øy?ÇÇú~ø¨½7űB£@´4r‰b_`xU€˜Ãü©žÄ±Æõ–ÃÑótÇÚð¼û½Q‡¦Z±ˆfGÍ)5ðm™šûyq¬~ë»=î]ŠÏõ‘ÁT+Cw·®ŠM— 3•”Ö Á¸9XŸ%°öGùõÒæ°êPõ*‹¸ ›<åqGk¡èíHRØ;Ht&+àÈYž¿®Ð«~x?'ª±õri-}ßpí±¬þíCU‰ µa6 °ã‡ch +ñøðñ½éH`MMƒ!ÒèÅ:JNZRXa^§Ñg‰½‹O7®ÿ8¾-q¬Í¬5±7þUÅ°Úcëh‚à +׆ÏP¶ä UÇêï÷ 2B¼ˆb}$—!cëÏ[ÊRF>>H‰é O«M-+…uJ“Wq¬"m^XB}„ ùdp$i¬}§E@ää‹ÿ™¦pþ}Eò°âD5äô@¬6V€æøX\lƒ­©Ó ‡vB6®S ¬ACh5'GRXsDÍöAX§ ¦[ÚGS¿‡—–(ÖvÌì“ÄZY´}„Vtø‡N¢=¶>ŠM÷øX).^†«Eë«y³”ÄÚþnNf+@s9Ýax­ìââX«¾§.™Š?‹cݕÅ°B ¿Ž ' "ëÄ[²’ÇZKäÇ£æLJ(֏úª„°¢óærº¿ýÀœ”Àú&>Žk§8֗ßÝ_=ö °B4ñ¸äÜHùðÔ¶ë%°ö»Dþç¯,Š5üâ|Ô§>œ¨ÌgnŠî…›ç<i¬3ŸU°y¬ƒêԆ°zÍ K‘?×*1±EÓ«ƒÃ +Ñ@Äîïž9žB¬Ç­é™ÆzJÚsÕ¿O‡V +k¦ï)ñ…¢ãpì&ô @캔P%'š.Àš=]ÈÅâcÂšôTœ¡èØù_¨“ÇgŒf++BC#6ÓÙb%X‡ôbË°qY/Àz üFé“'mº~Ü.&J³íb:ò‡UìšFÛ¨äÓ~Óó÷*õô›(NžÎÜÓ˃âœIâç`Lö,3°ßEHð4öŒ;ôÓã*|¹=ƒ›ïÇžØ ”„l”¢ï’OÃ^[k"ýô{:2sD»|!í5 >%ŸV훤Wúé¬þ㞠+‰4Ô?gE‰Ÿ‡‹¦b¼{¤ž~™÷Áo»öFmýò…¡mÀε°æaEÙvÄ<"?{%±"Û@+0m0â°ÂÙð¦û!‰ùè—Æ +mI¬ 4¾Å§×»ä°V͒X‘¢ÁaER€‡*ÞÒ." ~ô‰^ kv0ÿSóÞèü·áI‰Wƒ†ý(ß«+¾ø¦¹–0ë÷4#:/6ñÄò Ôœ9 ò| åŒ©ì}˜¬éàþIì,ómÓCñDû;k|ǂ´ ‰HÑø‹Æ‘ˆ†9 ĦyˆÚlj)"ÿDÿã¨mi H;f0pZ'˜ßóŽzKà¬20ãþ^äžØZ¸6MûØêìË9ˆ¦€OxRN2(0èn|c‚ºîÙƈÒêiáŒÍ¡aâӐuсåÀÓú²å›ÀŒÖ*R Óøl\sxÍIó» ˆˆêPt~œ3%ÂÃèáSF¿È Ízɵa'‰þ‘\Ff ۏÊkh`ghc8Ml’P¯íÊÐKýn—Ò†‡JzÉ@óØ2¿¤$(Ý?j؞¡WÌ©‰¿8æâÒÞ÷Ú©/Jz ò †¾™úÞÌ R–'="š½øRÈz)…Fy¾òIJ!$ÓdW$ÿ^:à4dÍ£¡‰’Bâäå‘fCYbDŽ¼ƒú‡&Ÿg#N¾¾S/)Ä%·'rà‰N®ÿ¨}r¼c Íϗ|íԔÈ]¨˜èP„èHrvÁ¼xÇ6¯EÃe¢YàB¦æš×­¦)‰ +ÀAÀâëaôe÷#Îî« Œ®—“X*ÇÎ35š‹htŒàJÚÒ÷÷ÖþÌ°ÎÐÈ$Í£š(Dzöβ jð8ºüghÇB¼Ĥ%_[RH4|Uá?`U9ö%ƒ€²"ñ’AêMvLØÀ¨Ùœ +¢cKfG©i¦ˆÅ©ë¾ÐÎ.—3 +köËe™”´3µRh†~hɓJ…6ɽ tœáIò˜‚†‡†E.@²µ+U¢R`^àKmzÕ¶ÜY,3¦S²,}zÖ[ôˆÔèz`LҊ³|Ôé©b#FymCÑ"à-ãæIVÛа†…ÆŠfè µ7*·§*hüFëÀØ`1 ­/oäh™&®íÝN´ñážDãK7Û |6“Ðáº=%ŽWjÎüø QQÌ`”ÒuEÏlo¦÷­W’i˜ö-¾=OÉÇûmÏLooÔfNS‘Ý‹Õ,ˆK•£2ص¨ÿhRk›pZ§@‰#{R+úÄ5Æ¢@<ˆïå¥Jå­@ÁH†¾Œ‚µ\ʽäè¥~³KšE”è¥q³óèÅnvô Ÿ1²rówz͆¿ÙEse_`ÞG•Î9§CYèÈGΑ+t¦ü•ùú½„é¬ìÈ“Ã6Ú=*e˜éPSëáÌ(á`ÊgþI}…#0Ãދ¦D%À\,™úõœ²N"ZO“òëý•aœ¸““F…wP $|;@Au  QžKbÇS³Sg¡š ˜AÚÿÈHhš6¤tE¨fk!­§¡=ɏH­#—ì†Ì¶À­5MGcE %_¹o¢M«üä”ٽ†Üys…{W„RS¢BxR8ˆ ^# +’ݧ€PO»’6cÿ>ãb÷¨”š $8ù”Î%\Í¥gƒ~0ÞeƓBà¼Àwj8Br÷á #rió–_κ×;þáUÕ¡LMÊK+梥 )/-„¦aŠT`ó47‡8ÐÊɟ\¤PßØÔ6&ÂNºu+RPX‹“ƒÂJh-€´„œ_@/ШíXåG͔Êá°ð•Ñ,ʈ½Kx"‹Ò\ÙøÜ~Tqü@h^—öH¡„f“Fmª¨‰)¦Ñ=ÿXJ·ãÊz!ݎ+aP…tw¦dmRû[¥[—“n¬‰«E¿BS–nœ_@!¡]/ݸíYxÝÞAº•“nÚ¥¤]º]z9(@·K7åQ\H&œäÈXØ(Ólxž0üTzÝÊÙÙxR\qñ;Z‚¼N`]xÕáw·†rÙóæ˼—I*5¶,Øñõ“Ø®¦÷ڄ.€öª×$qaÄCJè^™PÁßÕ¯Èâæìר-`å S’ÂF:Å_ +å³€nϪ@P$Ìna _?†¯Ò--Š@Ðîáä¦G0C;R9øç#øÚy‹ö±êô±u¼Ý(콩u~á^ÉóñM“ö¯à¹…Ðn×þß÷b‡£æc ®œv˜È±Ý¢ýcPØÃñ†c ÑþÅ p&® µç£üáH ›÷ýÍç#ïp CÎðõ]R (ÍòbNO^j—Ú!©Œ2˂SÓ¡&„×ëÝâäÆ´[÷960‘M®Ý-C4Uš0³š”ÉÔ¥jÇ˄a³€¤¯¸:xMƞ`L’lAe )î3áI•u9/Ž©¬Ë­ÎöTqRy3½¹d tjœ”_ŒÍ«Žš*6ÙìxÇÔ^M2öù†Ôæñh>c¬R½‹3-¤MïHt„«9v©óÜRÐ$¶}_6ӗb ,Fœ¡jX*Ùâb“1‡4µ‰¹.¨mD zPÝÞq©wnšc½ãu”×;Ó¾¬àˋÕò騋fn/çϵËZ> héêr>ùZ>JBß¡œO+ªåÓI–.j,瓯åÓ᥋·”óÉ×òñÕÁÊùäkùt¼ÒÅÊùäkùt2¥‹šÊùäkùt¨tñå|òïéèªï›Ëù.v0¯–3^´L¥[ÃLŠiâ2™÷ÒÅH‚$cwç”sÅmꊶH¡%}uâmN¨‹8T;ˆ‡9¾ mùðHaN˜r5©b6Ó +ªWÙsߢ¦(mñ»xUò·"…rÐä³¼Ô͐ò*ñ©ž¡ÀÑ%²oÔÞ­}L¢UpXòŽ.¹1‰ï¡ÙhªßS%vò‚ü,kH[×IS~ Ÿ&šb¢ÝÝ,åk¦.6»Ù½Õwä'ÇZkJewü„K­®DŠ¡ÁÂßêi¦Êî¤Â>3J©ìNڈ•Và¢3/›b³_•¬”¼ ŽBÇ+`VŸà幌ø̼{ÅBLuòkJj²Œ©í)eÏ|Ò©ššŠ^u¨ +¯¦²RÙè%çô´K_›’¯qÞ <*à·]ÑÝk‚^IuL² W „õhŠê˜êšÂ³b潆šÂ™býç㒮‘“.‘W³E2ïÍÏß©a¥ÄjF¥×P9ó^uZ¼À÷zŠ®¡NmMaø T“#Ç‚”xín5«.n"Y£š2ãk ß-{+Ñ WÕO““n׍ï/öfz}'?‰ª(Hç׉”©Ss/\ŗv»ç[¾NùÒ= «GÁ!-câyà?Ù}^TarF¡‚=¸,ª¶¥\dB^Cé°Ö:öúuU{W­Ò˜PqÞ0ŠŽøö€ÅvÊÞÝ?²¾lX'aç]p¿\µž wP†"rú ˜’üý,ÌÚ¨Ó0£Ç‹Kêx`EŠ¡KÚ|A"¶­@)Ôê] 鲬“荞VR»÷¹/­§ý–´ù‚¤+þ.’“®&Õ·‚K‚Þ7| Ñ{ÃϾÃòjñ”ÈŒ‰¿«Uk2¤ò«“BJ¼ryžÜ˜.nq üÆTYÔ=¼7eä½¹5 hÉFÞ&R¨P dŒºL·xop¿@ùvï `‘KÑPw÷FwQºx»÷Öà ¼7åV}­ _“÷FÌ®¯Ìã½T¤t^W™wa­IŅ`MÝ +ÿá‘w·ÔKŠŸz)©uªI½|ݪJ½T”ǕïVÕ ‹r.Ô%\*r(²€J@jªX$¡Ðzt‡‚²‹Ü¹Ì{eéëü¤h—ùÕ:¬›DŠµyo»H±6ïC°¥]C½×[ö#Wÿ„»nݏšì58¢2Mr?öwj÷£œªi®Í¦e·;]uŒiÛFâ&.t—ºÌœ[屦Hú¾c©«À¤»/ï;V¼ÎïÍDq'VÇ¥Ë VÁÉßH¥hv³>›/Ïãµi'ج¥nM¾Æ ¡U”µª-’>ÎÔøÊïS$û¾¿S‘,t—"YX·v{‘,„r—"YHÝE×»Y4wmé«`5ç/Y ð÷cïæý((ʓi÷.Ê£êds…îQ”'¾6w/Ê»Á×É'š¼‰¯Åö¼¡(÷§QuyÿJQž˜ûá_(ʓ𧩴àúr#.tøýÐrÕWߒi±jn¿èiY—‚ݤ6 ‚ +¨sBªpë5Üia |۞âú­NªØÏßïɕÝÍݒX ²“‘-ö{ªÿÔ¦RX'2X ΆUXµq·°ìÎßû®²M¥h¹²;K€UÇïSû“*ö  ûàù]ªìn(Wýö§Pì·ít$±šª‹ï¹օBŸÂfOkþeX¤°q㋍¥°BåöbiÁÖ¥'Ž>ÑìUù^Lì=ÚýÀ{Õÿ^UÒomPïчi5(¢¢¾°fT‚<¯…g¬œÏYE~/_¹µoèÙð¢L Óö>ÅE*’a…éž^{cÂck2ÃRʃUJ¡MÜ{¶×k¹¢¹F…/J®½ž6·Ý0§:S¡8“ºáRCî Rg=ùÜAõ\¥ÐYOr†ñ›œŠF+jg¨¢»‚jÂ+õXÞwCS= û¦°îÇ$™Z«¶+Ÿ‚ƒøšÂ¾+}6Z ûĬÆmwÇÂ>µ÷ÙÜXØ'æE¼Ø7·ö‰Uõé®-Ĕ.ìsãK$øßRØÇ# ½y¹HáÝ +ûÄ@é.3¹¢°ïÚCZcaŸXœ‡;=ïVØ'VÕÇó ܧ°O¬ªOm֐†Â>1/=câÞ±°Ol…)ñ] ûÄT^–ê} +ûĪútWëßPØw9¦oƒŒumaŸ˜ÚŠˆvßÂ>±5Kµº±°OJ¹óU…}’Zç} û4í–Â>¨‹û +û®#šæÂ>ùJ¯»öIT}ß»°O DsçÂ>±`‹0óþ…}b‚B`âÞ£°O)°r§Â>çÍ= +ûÄȁ©ê÷*ìS,(»OaŸXUŸxÊHñ.6¢“³1¢ý–´Ý9%ÝÓ첇§ÀŒR]}µWØö<úû·R*Ç ]ü.ÆtBa¢{wñ“Q9ԑêd7k"G'~Â%,UÔ6Tò¯4B'QŽ-5,Á˜Ô +6%3,~lëª1!¢aiêS-7&ñÜ ia#C*™>Õòk|“)é)&“ÏÙ)t„—wå±Çšlÿ¿››ÿé°;ºTêë×4ÿ“6¼þ×NŽ½öM'UP¦®¦OU΅B>4×ÿï¶õ*ôw:5mvdZªšÿ);!!mnnþÇh6òýÿnnþ§£ªðúÿ© ?í*÷¸£Ë—ìzäRCGånéO» +§Ž‹¥ó¨žÜ³U-—J‡‰`Û>Å G%.…}ÐĖwÞ«ªéS“A Ñ(Õ;Jg†¨.v„hd’5$©AI:  ­®ß@m0 KšàU°’³Ö‰Ýj%0*4þ®¬/ã§ZÖRÈAWj@)秩NµÐT&‘ËgR#AxŸBÌÛ#)°×¢Ì­ç ¨¤ª®}šša"jÊèiýûݪէBxwª»íKÞªu…f3;jj†©Ô@Ð}eÝ-¶QÙԝŠrlåº[0&õåØru·´».F5$ŽÑ aí]ñ¹“[y²wù-gX”¡w0—´·;Ïۉ=>¨Ôì½“s¯9ñ˜£"äÆ|Îô'^=àK²…cåUæ4GÃk¿{¶ø­é¢Ùa_¢2Ï*]x8O¢„”6©BÄ ÁjY?¤êß%±ÂÙ<’;Ÿät‰‚aЕÄj.Í\K©ÖtV«Ž-(ãˆÜx1¬ü¹£9dâ:,úE—VKr¸à +Ð@" ;ññJ§ÂBDœÂ•xCkÐðäÉM0Ï­°8o,ƒµ` Jc-4 1¬:Ô /\ä•z +±¶ä:,V^¥±æó]’Ÿ8á ö]z¶=»ù, ñž/KH¾§Ãë=‰‰-šVÒݞòÜÁ fÝ÷ ÕQ6Øø†øçiVƿ̞|*³3]VNÂ5›œŠMÇ5þ,,®Rv¦H—E]&nIŽ 1´ô°²j꫔‹«Žº{5¦A~`¥Æ4jýN9ùÄ-Éåc4Þ°ÚZrÜä +…iÞP§ JÑI÷:®δΐswÃ@Í-(%Æt‘v±oT^S@#7,iÿ²¶1AÑ)Fè"W ºòï ?žés¥€—T\ï­ä¹åïueß© +›ë+¢dÝÒªÃD£ü-Wìê¸ +ɋ{ï®*»ã)ŠªJ¯óHó³TQIâ­·ëŠÝw§“¬[S²j.ﻓ1$üiüT‘`í”ÔÔâAFؐw³¤§ä…°¹6†NÕþImh*è¥Üԏ76aŒ@ÙǧC} +%=0þýEFÂ*|Ю¤Hì`^=飶‚¶Ë>7tª“¯¦ÒiªôŠhºŠ“°þf^ó9+ªê¼1aLèÛ¿ëWFµ¥:üŽ.™ºD¥Ð +kˆòçåR!Õ!h­m³£šR#!óEɯ 4Á)s#Ñ«‰ÔO“½•hŠ-…´­ê—€vQÅ,¦62D»²$Qm=¢Rýr¡šªzD¹”x%‰jëEüÐZJÕÖ#rÉ°W•$ª­G¤ÜÝW—$òøEÆ +½È¹ÕV’¨¶íú’DŽ¤òDǯôÒZ’¨¶‘³¤¯*I”ÓE="/îIèr^·7+Ô©oRwK³B|6ÿb³ÂK÷ÿҬP§Ô¤î>Í +éŠyµåöf…ºžDôÅ»7+¼tÛý+Í +ESï߬P§ª¿ç-Í +yî8¬ ä°h*)U,Kw;”/ŒÑÐðPÞ%¡œm§²á¡º[­nnxˆMî·ZI5<ԘumÃCùn‡bNÈ«Ê»$ ví ÅYPþV«+ª`è{4<”O7á]76ÅSnokxȕ‘‰q$çLÑVrqÑðPž†”r{‡†‡2{î¸ò© }+7<”‡Â*P·6¡€Ëÿ®‘=WÅuЪÿ$ÓZu“óv-øöÝY¼ö¯–Å—ñ-mõç~;­Ê*ºŽ÷¶‹¤e³‡öO‡Ô&ø¢{Iš>K!øô5,•¬çoÃп}_D)€ªMÝNûUﲏRzïrÿjûÌ)‚ÌT2ùõY& +ASëp˜D,‡cø­t4Œ‚³c`6l°•Ÿû³ÛùæòU#LÞ¯ûp|ßÂ|¥Šˆ^ÉklPGҟÍ4»Ù™°Ýæyây²¥SÕ²½9À„O&´6>£^rº¨ÀÒ25/†×A'aÜܤÉë_ž ë¹~k[ËL¹ªþìØù_`B\mƒ*$õi²Óy"Œ‹9åhlù +ýN°ÀäY¬~óÒb“"NŒ‰àSææ䢇ZŒf?ʆbþ0ŒQpfR{ËfòÞN.—´‡+Ü{dÄÐÞ@¯{.Õ_ÔⱯB°°²?JŪúšWúo‹:]y{Ûó¯½"üæÜX»`)±ƒ2ÿþ™V„ûdù ã%—Ý—™ùä± Ÿ3 Ihþ ÙP-2=¥øóÙA ƒkÃø&ëb~IºÉ¼·p‹„=çx:“–b©äq˜¿ÿòŸ«}„p'BV4T8º-ë‰e¦nxðlÇLÙg€†y–urϼ™A7É<(±+8B§±ôÍÐæÅ +„Çvå)T§ìwvîeŠ(Œ\Ÿì3'¨°‹ð;7­6^Xéôç)«AXei÷%»z );Ä1r׀ïH¤“ Øè‹ ã †"1 …^´Èר»!  æ F׃~ä3FþNàÏ¡Ï]k¯|à·»=aˆàS;Ààú#Üý*G˜ †f(8sîiÜ]nÌ]2ž÷ÿ +*PááÐĵ^Fõeår q“ƒÐ\ ’©pG ­åp3.)ó¢“+͟õ´Ôî÷M=̧¹—{èá-0ÃÓ¯ÿb8Ó+i³&b¡Wç#Œx“ÚS.mÆgCD¹`€õúÒ¨Gd*­×W£x„g7ÃÙ ³ØöAžõŽïߞÞñ:Êëµ^Qï ;Æz󮳟œ½3í[èíkUït›_á±^ÕÛö†v¬CQ(á6ÁÕ´0»º¶ac@c°AMw·m´è4‡eN¸Q ×|ËOÑB ”¤E ’ PE„^´¢Â]^ޜshgD'+!HEBòjb=ZB*V:4 +Ä©¸e(ÌNƒÆËä¡ß³à]È×i±D1E±xò£hœù.…„“…^n I‰À¬®Š Ý»,‘+Ç·x¥Îñ÷ˆ`lPœVx¶yÀÊ&(Ù +W±¬NJ¦R2xuÓâ4ôZÌNVé ëü´0àœLEç2®C˳QœE„M@èƒJ+ +:©§µósbþ´Éϟ&\½A­Âã•7Vù(z³™ŸÓIÑw°t0y8Ïð68 H…ÏW›Þ2¦i£ïôÏ}˜}Ñ:Aí´Ë»£z„w)4p-)à+ ÿ(—‚Ñæ7:P‹A GrlöZÿ2!Èø°^Kî+ýÝto£¿[=ÚÁRͬn1çǤ©'ŽîᏧÞlSp4ÙIð1Cc{y9Ré®Ç6«Ž~ M”‘öغû‡úŸõùׅX¸µéé·î<¥ÿ2ý!£úqfl½ƒcÍ_öú†–F´³"ÖSõ‡&H*=s5JÄÀ 7”fà蠉òÙyÝ×' ünFëdG´Âk¡Û%(:äŽm–ïœFn‡u–‚›ZI:øRM‹…¦Ã4Y¿Ì‹‡D ±êñe¹$œ€T´ 2Ö +K‡â‡ëñ·«‚¨ä?Š—CõwgŠ÷ìÁéðY¯I1ƒ™ºƒ¹wÙ0”$ÜÄ5SÅèRL©Ì‘Pi.ØÅAIUÁ9BÃDð|3UuÃD€:ºr V„[n{ÊLĂ¯È5¬mAYC܊à0ÔÁà¨)6–¡“ÑՆaô²·pĐ„œ Bü͍(æÚ3öžœ ÿU+uuëO'î~ÿC°@Ü{×s.ƒ¯æ4pH¸®„AqšÈÞ×Êi81®å4œWÁÀ÷¾— щøàVlß^CM Z–hWÁ°ª¢€X@ƕÒÀn|8›«VÄÊ­ˆäÞç¡£îèŽãiLÀ–ÌMëD¸M¦b"h”ÀaH 1ՃPwHë͹÷& Ã{ñaخܨø!mãØS’òƒ<—¢S†6ü\ºRtÚÔ°§Ü¹d“çMU¢ÓæÍô=%ìϏS´Ìýé3F³*ijø]@[®èÀmïnO½³@“| ·ºŠzGÝê@ö ŒÍ)Ge7²×¤Ñv¹×ŽloÜ1HŽÇŒk®±eŒç6ôrxËe9Hi÷Îêх~Nù΋ˍþ„º…þô»€œ­´qnÞÃËð‹vúϨÅI[æèÏ*RÕ©_~u£'ÚSÌoÎIg¥rxÄf µbÍèìӌ}àÀt=9(‹€oy/Ÿ„‰*†Ð—|ÝehÚ¢H?°âÆ~!Å9RG¸Å_ ÐÅ>CÍÈÁ×UƕU¨”KÓ}‚~œjY<³Ñë9mÚ)ÿçl灤j:YÞ0zÍ ,Sm¢ó½õÌzá7¬¬=x>‹uô' ÷s0ôÐ+×'í¬›Óžz­ÁèœÁÚqQh«1Lx×í§¼#b4©ñj´cIO ]¸@9S.Réèä7Ò-R ,V’À@z܆cÜލ‚‰®ÿ%ú˜[ÐðZm=ãÀr~· @ã3ÆãÊ1h=ÏWÌìß0–ñæŠÏÐÛô梨””<”»*÷YПÖ]/ýé<¡ÝêÍ[§c& Λ÷.áú¾QŽïx‚ .d¿zÇë*Aý||nÑÀ'ÖëPàîØIlþË>ð³Î6“7}îó<3Z™µkiK7>¿ª¹JIßæ&lª{–͐2a™WŒ(ã{:—ؾùpS>9“·ë§€)6 ПrÓf€>ú½×¿´p8õlçƒÌ­?ӭλ9?s¦ÞG ÕsÞÁÓ.HÉ J~‘〼_Q“Sí:¿¢&§¢0ÕJ½_Q“S훫üŠšœŠ(~s•_ 9þï„îŸPÄx@ÿ¸[çõâP?ü,6Ý?1Ý?îtÉãénæ[ò°Xtÿï)·ý<ÿ-6§‡èƒ;ÝΖJá@nñ¹/tð%ÄÊD'=Ú‰‡ÇyžIĈ™ÜW¤°*ZÏÓÜÑO`~KJ‡ÙuöÐý:ð\}Ò;Æó¡Þá%ÛzKñè€ö) - Т¸‹Í[2ç¼½V}ìA䧉L:Ë¿e­”û¸Œ»‹éŒM¾¶Sî±E.:,ÊËFÀ\í"w  œLzküÅÏzèaR¦Þ˜ »õk*¿.ëíÍÇ8Ãø ÝúsÊßO9ó§û0 Q§4PkÓÞýËJÊgzƒ’ÒÀ«4DD¹p(~ #¢˜ª`Œ-ÓÌÁ.ƒ±d°Á0UC]È:ðˆÕÇ^(¹ œŠbïݎ´°Õ~Ïh«¡?ÕFD¹p(•ø÷/ED¹ð%ŒÂÿkQã ùW"¢\8†’þµˆ(Åb£÷ˆráP8›-"ʅCñ}s÷ˆ(…ù¿å¡PtâÑ·žÞú2°ÐBôm@ Ì/k²£·þ¬zç¦ùkF® „^´ç>%öÀæI#GÕ÷‹RhÚ;ú­éÞÉ$“ø-\2 «‡˜áu?{(:í´è„: &:û[•DbNé?ÐÒ#љu9ëý8ÇKîŸÞÉEi?Ž¨å„™–/‹Õûè¥"`ø  Єœœ¥eÚ½Rå¸K©1ÇÙ*³~ܐÇ(´`M8‚U3æk 2H ¥´QÄ0¥?{ +] <³–u¨¥8è`èÒ‰öBiò@ÓI¹ib”$Åäw¡ëE‹þ±cUE\Â,— d;w Sv·°6„Õ¸}g©¬·ü(ÀÆ›B‡ eæ;ñäg¸rÃ^¸5hÐ?eŒ9™xmƍ𐽂%ꨒí -Ç#]Ýý“èæ‘ÆÙ-ØùîuÏ|×?¸ê;gÝ Æã¥hѱ3Ú}¤>»ˆ!"qFÅŸ½T‹‹4‚ðçÐRë¸öĩȵ§:–êÙ±táD@n)šœ`8‚;VᝊXªt •õ³ÊÆäjN–4V:¡-‹ +"<Ÿn ('£“Š@*/ , ¬SåÎ7Dæ©úL²€J¦¼€ÚÜ©Éz µæºe"¨l€ÙZÑ4O¤uk +m‹lOGäd»…µ¡CÑ.ÀM-1 ïÑ©4‘iü…à®=a^²âE'¢’š0QӃ ŌíaÐ؆ß{µÙ[éWÉ_]¤Ý ÍîÓ±ùVNj‹å6N«ú]iN“…1J7sšùÛr§«§©†Qµ;¹€f!à´QÈuˊ@wº[ ä4µ0 +ÕGå}+€Iÿ…š jA(>ˆ‘KœšpT†„âŠÕSqïË ‚ö¹Ý¶"Pᕧ&uÞÈM¤è$µí‘‹A«¤ªß°GŠÉ–Wa‡„ÛƒÒEÿÉՍc0f£§ÛŽ„ÙÒngiÙqÈ bç‘f-Á ) ǧ1伉->Ï.Žš¸èT8špÁ¬èf—„ˆèüL–’øŸÅz +ÿ³ÙM#[ÕK ]“ë݆vê?ý¹¤}Ü˝§…jö£LÏP¾ˆ@ŠñSA— ?€%]ä¡¢ÂCGßApK‘‡Š +8^‘ës­Xñ‘>¬ØñU;[uQÁ«.xƶ[€f—]²ÏP1g¯Õé‡<ÚqâõÉTLE(M`b¢i­¦Xç€×Z$㚣s¼nL— ›Õg.°85Œ‹ÂÇ ¼L·ÏƟü`ހU5ÇÆޏó(E»:ú#ëëôó}¹dˆe™7'mf¡Hzs3à Ÿ}@#öÍÃ8®ÞP<Æ-Þ|ì'? û ‚?”…"¢ŸhõlÙπ`?yðè§wÄ>üAned¼˜¿f6ƒ ë V;ã1gîaÌù ªùLÖ:¤ëø§ÿf¡c£ôüäÅ_­-ýð;¿H¼IN^ûٜ=l%É|핉užþÄb B.u±îí¼©õ&^éJD2Mƒ7ñJW¢îmÞÄ+]‰(uAƒ7ñJW"r?¨ô&na(4½£%gœßÌñ`'øú |Õ^œÎ;ôJ`œY,6Õéà¸ñTa­Í؝>œr?Ÿ§ŸífzøïC}׫U»¥ÜCô~5ö`ƒ!Æà]ð½XÇpˆcÝ?ÄCþÓûĞÞÁÏuð+ì÷|þ ‚A?á"¼!ŒÏåóü`T®ˆ×FzSøCjàØá_eðé|÷ŸñP{~sxØÒý㠄œþpèAþ@ú\¥?{ý®pÈっ÷<¾°+è!ÂìôË_*æŸùYŽ?ËïÓøs»>ÿ)Ð`Gfï ‡ý4!l¶hš>SÐã +€Wà¼!8hŸÇ 80ô=Hô6þ™ý¥Ê´ÿ¦ëµö9\±~Ÿ]lM˜% DИ½èï€ßð=ì¾@ À¿¯7âòrjX±êâë4nLOßj¦YÍЛì)´…œðìyjL—‹Îaú³†{jyœþ?‹‡éf³=MO‹xô°<,Ž§íañpüÞþ~ÄþìÐ:0™þù/Vœ +endstream endobj 7 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 34 0 obj [33 0 R] endobj 48 0 obj <> endobj xref +0 49 +0000000004 65535 f +0000000016 00000 n +0000000176 00000 n +0000046465 00000 n +0000000000 00000 f +0000000000 00000 f +0000175432 00000 n +0000175365 00000 n +0000000000 00000 f +0000046516 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000175639 00000 n +0000175670 00000 n +0000175523 00000 n +0000175554 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 +0000048167 00000 n +0000175755 00000 n +0000046845 00000 n +0000048464 00000 n +0000048351 00000 n +0000047096 00000 n +0000047605 00000 n +0000047653 00000 n +0000048235 00000 n +0000048266 00000 n +0000048538 00000 n +0000048734 00000 n +0000049777 00000 n +0000070877 00000 n +0000136466 00000 n +0000175780 00000 n +trailer +<<5B95C5AE6D270C48854932B225484F55>]>> +startxref +175973 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg new file mode 100644 index 00000000..7712f662 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.ai new file mode 100644 index 00000000..dcdd0e08 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.ai @@ -0,0 +1,1467 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 6 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_blue + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T16:33:44+02:00 + 2019-06-22T16:36:14+02:00 + 2019-06-22T16:36:14+02:00 + + + + 224 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Ann5Hfmx9aWHyprs3+kqA mlXkh/vAOkDk/tD9g9+nWlev9oOxuG8+IbfxD9P6/m6Ts3XX+7nz6fqe25yDu3Yq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7aztZru6lWG2gRpJpXNFVFFSSfY ZKEDOQjEWSiUgBZ5PF/Ln5mXPnH84tOhti0WhWaXQs4Dt6jei49dxtuw6A/ZH051uq7JGl0Eid8k uG/Lcbfjm6XDrDm1IA+kXXy5vAUd0dXRirqQVYGhBG4IIztiLdC+m/yZ/NVfM1mui6tIBr9qnwSN t9aiX9sf8WKPtjv1HennvbvY/wCXl4mMfuj/ALE/q7vk9L2drvEHDL6x9r1DOcdo7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kKCzGgG5J6AYq+afzp/NY+YbptB0aX/c HbP+/mX/AI+pVPX/AIxofs+J38M9A7B7G8CPi5B+8PL+iP1/2PNdo67xDwR+kfalf5C/+TM07/jF c/8AJhsyfaP/ABOXvj97X2X/AH4+P3PPc3rrlexvrywvIb2zlaC6t3EkMyGjKymoIyvJjjOJjIXE soyMTY5h9W/lZ+ZNp5z0ekvGHW7NQL+2GwbsJo/8hj2/ZO3gT5r2x2VLSZNt8cuR/QfP73qtDrBm j/SHNnGadznYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/PH82OXr+U9 Cm+HePV7yM9ezW6Edv8Afh/2Pjnaez/Y3LPlH9Uf779Xz7nRdpa7/Jw+P6v1vC87J0T0L8hf/Jma d/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FUx8veYNU8v6vb6tpkvo3ds1VPVWU7MjDur DY5j6nTQz4zCYuJbcWWWOQlHmH1x5D88aX5w0JNSsyI50ol7aE1aGWleJ6VU9Vbv8655h2j2fPS5 OCXLoe8PWaXUxzQ4h8WR5gOS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkv51 fmuNBtn8v6JN/uauFpdXCHe2jYdAR0lYdPAb+GdP2D2N4x8XIP3Y5D+cf1Op7R13hjgj9X3ftfNp JJJJqT1Od8847Ch6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxVkHkjzpqv lHXI9TsDzT7F3ak0SaImpRutD3U9jmD2hoIarGYS+B7i5Gm1EsUuIPrjy15k0rzHo1vq2mS+pbTj cH7aOPtRuOzKev8ATPMNXpZ4MhhMbj8W9bhzRyREo8k0zGbXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwD82vzOt/J+l/VrNll1+8U/VYTuIkOxmkHgP2R3PsDm77F7JOqncv7qPPz8h+l wNfrRhjQ+s/i3yvdXVzd3MtzcytNcTMXmmclmZmNSzE9Sc9IhARAAFAPLSkSbPNSybF2KvQvyF/8 mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVZn+WH5j33kzWQ55TaPdFV1C0B7 dPVjB/bT8enuNR2t2XHV465ZB9J/QfJzdFqzhl/RPN9Y6bqNjqVhBf2My3FncoJIZkNQyn/PcZ5p lxSxyMZCpB6uExIWORRGVsnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8xPP2m+TNDa9uK S301U0+zrQyyDufBEqCx/iRmy7M7Nnq8nCNoj6j3ft7nF1eqjhjZ59A+Sda1rUta1S41TUpjPeXT l5ZD+CqOyqNgOwz07T4IYoCEBUQ8nkySnIylzKCy5rdirsVehfkL/wCTM07/AIxXP/Jhs0XtH/ic vfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV6X+Tn5pyeVr8aVqkjP5fu3FSd/q0jbeov+Qf2x9I9+e7 c7HGpjxw/vY/7Id3v7nZ9n67wjwy+g/Y+n4pYpYklidZIpFDRyKQysrCoII2IIzzsgg0eb0wNrsC XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk/m3zVpXlfRJ9W1J+MUQpFEPtyykHjGg/man0dTtmXo tHPUZBCHM/YO9pz544o8UnyN5w826r5q1ybVtRf43+GCAH4IYgfhjT2H4nfPT9DooabGIQ/tPe8l qM8ssuKSSZmNDsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdir sVdir2j8kPzY+oSReV9dm/0GQ8dNvJDtCx6QuSf7tv2f5T7dOS9oOxuMHNiHq/iHf5+/v7/v3XZu u4f3c+XR9CZwz0DsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLHStOudRvpPRs7SMyzyEE0VfYbn LMOGWSYhEXKTCcxGJkeQfJX5kfmDqHnPWzdS1h063qmn2dahEPVmp1d6VP3ds9O7K7MhpMfCN5n6 j+Ojyes1ZzSvp0Ylm0cR2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f+Jy98fvdj2X/AH4+P3PP c3rrnYq7FXYq7FXYq7FX0N+SH5sfpKKLyvrs1dRiHHTbuQ7zoo2icn/dijof2h79eF9oOxvDJzYh 6f4h3efu+77uh7N13F+7nz6PZs5N3LsVdirsVdirsVdirsVdirsVdirsVYn+bH/kudf/AOYU/wDE hmz7G/xvH/WcTXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv +/Hx+557m9dc7FXYq7FXYq7FXYquillilSWJ2jljYNHIpKsrKaggjcEHAQCKPJINPqH8nvzTi812 A0zU3CeYLRPj7C5jXb1VH8w/bH0jbp51252OdNLjh/dS/wBie79T0/Z+t8UcMvrH2vSc592TsVdi rsVdirsVdirsVdirum5xVjvljztpfmTVNYtNMPq22kvFCbsGqyyPz58KdVXhQN3+WZ+r7PnghCU9 jOzXdycfDqY5JSEeUUL+bH/kudf/AOYU/wDEhlnY3+N4/wCsw139zL3Pj/PU3kHYq7FXYq7FXYq9 C/IX/wAmZp3/ABiuf+TDZovaP/E5e+P3ux7L/vx8fuee5vXXOxV2KuxV2KuxV2KuxVE6bqV9pl/B qFhM1veWziSCZOqsv6x4g9cry4o5ImMhcSzhMxII5h9Y/ll+Ytj5z0b1fhh1a1CrqFoD0J2EiV/Y en0dPn5n2t2XLSZK5wP0n9HvD1ei1YzR/pDmzLNS5jsVdirsVdirsVdirsVeIfnj+bHoLN5U0Gf9 +wKareRn7APWBGB+0f2/Dp407D2f7G4qz5Rt/CP0/q+bpO0tdX7uHx/U7/nGH/eHzB/xltv+IyY+ 1v1Y/dL9C9i8pfB6H+bH/kudf/5hT/xIZouxv8bx/wBZ2Gu/uZe58f56m8g7FXYq7FXYq7FXoX5C /wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXYq7FXYq7FU18seZdU8t61b 6vpknp3MB3U7pIh+1G47qw/zrmNq9JDUYzjmNj+LbsOaWOQlHm+uPJPnPSvN2hRapYNxbZLu2Jq8 MoFWRvH2PcZ5f2hoJ6XIYS+B7w9ZptRHLDiCf5hOQ7FXYq7FXYq7FXlv5z/mqnluzfRNIlB166T9 5Ip/3ljYfaNOkjA/AO32vCvR9hdj/mJeJkH7sf7I/q7/AJOr7R13hjhj9Z+x8zO7u7O7FnYksxNS SdySTnoQFPNPfP8AnGH/AHh8wf8AGW2/4jJnFe1v1Y/dL9DvuxeUvg9D/Nj/AMlzr/8AzCn/AIkM 0XY3+N4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/wCTDZovaP8AxOXvj97sey/7 8fH7nnub11zsVdirsVdirsVdirsVdirsVZL5B89ap5O1xNQtCZLZ6JfWZNEmi8PZlrVW7H2qM1/a XZ8NVj4Jc+h7j+Obk6XUywyscur638v6/pev6Tb6rpkwmtLleSnoyn9pHHZlOxGeYanTTwzMJipB 63FljkiJR5FMMobHYq7FXYqwb81PzLtPJukcYSs2uXakWNsdwo3HrSD+RT0H7R28SNx2P2VLVz32 xx5n9A8/ucHXawYY7fUeX63ynfX13f3k17eStPdXDmSaZzVmZjUk56XjxxhERiKiHlZSMjZ5qGTY vff+cYf94fMH/GW2/wCIyZxPtb9WP3S/Q7/sXlL4PQ/zY/8AJc6//wAwp/4kM0XY3+N4/wCs7DXf 3Mvc+P8APU3kHYq7FXYq7FXYq9C/IX/yZmnf8Yrn/kw2aL2j/wATl74/e7Hsv+/Hx+557m9dc7FX Yq7FXYq7FXYq7FXYq7FXYqzn8q/zLu/JurcJi02h3bAX1sNyp6etGP51HX+YbeFNN2x2THVw22yR 5H9B8vuc7Q6w4Zb/AEnn+t9W2N7aX1nDeWcyz2twgkhmQ1VlYVBBzzXJjlCRjIUQ9VGQkLHJWyDJ 2Ksb8++edL8naG+o3n7yd6pZWgNGmlp070UdWbsPegzP7O7PnqsnBHl1PcHG1WpjhjxH4PkjzBr+ qa/q9xqupzetd3LVY9FUDZUQdlUbAZ6fptNDBAQgKiHk8uWWSRlLmUuzIanYq99/5xh/3h8wf8Zb b/iMmcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdi rsVdir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq9B0X8sJ/MH5 ayeYdJVpNVsbqZJ7UVJmgREb4B/OlTsPtfOmaLP2uMGr8Kf0SiKPcd/sP2Owx6I5MPHH6gXn3TN4 4DsKHYq7FXYq7FXqX5M/ms/lu8XRNXlJ0G5f93Kxr9VkY/aFTtGx+2O3XxrzfbvY3jx8TGP3g/2Q /X3fJ2vZ2u8M8MvpP2PplWV1DoQysKqw3BB6EHPPiKelbwK+UPzw1K+vPzG1OG5maSGy9OG1jP2Y 4zGrkADxZiTnpfs/ijHSRIG8rJ+bynaUycxB6MCzduA7FXYq99/5xh/3h8wf8Zbb/iMmcT7W/Vj9 0v0O/wCxeUvg9D/Nj/yXOv8A/MKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf8A yZmnf8Yrn/kw2aL2j/xOXvj97sey/wC/Hx+557m9dc7FXYq7FXYq+m/+cc//ACX8n/MfN/xCPPPP aj/Gh/UH6XpuyP7n4sU/PL8p/QabzXoUP7liX1a0jH2WPWdFH7J/b8PteNNl7P8AbN1gynf+E/o/ V8nF7S0NfvIfH9bw/OxdG7FXYq7FXYq7FXuP5Gfms0Ulv5S1uUtHIRFpF0xqVYmgt3J7E7R+H2fC nHe0PY1g58Y/rD/ffr+bvOzNdVY5fD9X6nvecU758j/nL/5MzXf+Msf/ACZTPT+wv8Tx+4/eXku0 P7+X46MLzbuE7FXYq99/5xh/3h8wf8Zbb/iMmcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JD NF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+ /Hx+557m9dc7FXYq7FXYq+m/+cc//Jfyf8x83/EI8889qP8AGh/UH6XpuyP7n4vUGVXUo4DKwoyn cEHqCM50GnaPmb85/wAqW8t3ba3pEROg3L/vI1Ffqsrn7Ow2jYn4D26eFfQewu2PzEfDyH94P9kP 19/zeZ7R0Phnij9J+x5bnSOrdirsVdirsVT3yD/ynXlz/tqWX/UQmYXaX+LZP6kv9yXI0v8Aex/r D732fnkz2T5H/OX/AMmZrv8Axlj/AOTKZ6f2F/ieP3H7y8l2h/fy/HRhebdwnYq7FXvv/OMP+8Pm D/jLbf8AEZM4n2t+rH7pfod/2Lyl8Hof5sf+S51//mFP/Ehmi7G/xvH/AFnYa7+5l7nx/nqbyDsV dirsVdirsVehfkL/AOTM07/jFc/8mGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdirsVfTf/ADjn /wCS/k/5j5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0Ub6ytL6zms7yFZ7W4QxzQuKqysKEEZPHklC QlE0QxlESFHk+UvzU/LW78m6vyhDTaHdsTY3J3KnqYZD/Oo6fzDfxp6V2P2rHV499skeY/SPL7nl ddozhlt9J5fqYNm5cF2KuxV2Kp75B/5Try5/21LL/qITMLtL/Fsn9SX+5LkaX+9j/WH3vs/PJnsn yP8AnL/5MzXf+Msf/JlM9P7C/wATx+4/eXku0P7+X46MLzbuE7FXYq99/wCcYf8AeHzB/wAZbb/i MmcT7W/Vj90v0O/7F5S+D0P82P8AyXOv/wDMKf8AiQzRdjf43j/rOw139zL3Pj/PU3kHYq7FXYq7 FXYq9C/IX/yZmnf8Yrn/AJMNmi9o/wDE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv8A5xz/APJf yf8AMfN/xCPPPPaj/Gh/UH6XpuyP7n4vUc5x2jsVS/zBoGl6/pNxpWpwia0uV4sOjKf2XQ9mU7g5 fptTPDMTgakGvLijkiYy5F8j+ffI2qeTtcfTrwGS3er2N2BRZoq9fZh0Zex9qHPT+ze0IarHxx59 R3H8cnktVppYZUeXRjebBxnYq7FU98g/8p15c/7all/1EJmF2l/i2T+pL/clyNL/AHsf6w+99n55 M9k+R/zl/wDJma7/AMZY/wDkymen9hf4nj9x+8vJdof38vx0YXm3cJ2KuxV77/zjD/vD5g/4y23/ ABGTOJ9rfqx+6X6Hf9i8pfB6H+bH/kudf/5hT/xIZouxv8bx/wBZ2Gu/uZe58f56m8g7FXYq7FXY q7FXoX5C/wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/wA45/8Akv5P +Y+b/iEeeee1H+ND+oP0vTdkf3Pxeo5zjtHYq7FUg87+TNL83aFLpd+OLfbtbkCrwygUV16V9x3G Z3Z+vnpcgnH4jvDj6nTxyw4S+RvM3lvVfLes3Gk6nH6dzAdiN1dD9mRD3Vh/nXPT9JqoZ8YnA7H8 U8lmwyxyMZc0rzJanYqnvkH/AJTry5/21LL/AKiEzC7S/wAWyf1Jf7kuRpf72P8AWH3vs/PJnsny P+cv/kzNd/4yx/8AJlM9P7C/xPH7j95eS7Q/v5fjowvNu4TsVdir33/nGH/eHzB/xltv+IyZxPtb 9WP3S/Q7/sXlL4PQ/wA2P/Jc6/8A8wp/4kM0XY3+N4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvy F/8AJmad/wAYrn/kw2aL2j/xOXvj97sey/78fH7nnub11zsVdirsVdir6b/5xz/8l/J/zHzf8Qjz zz2o/wAaH9Qfpem7I/ufi9RznHaOxV2KuxVhn5nflzY+c9G9McYdXtQzafdnsTuY3p+w/wCHX2O2 7J7UlpMl84H6h+n3uHrdIM0f6Q5Pk/UtNvtMv57C/ha3vLZzHNC4oVYf57HvnpmLLHJESibiXlJw MSQeYQ2WME98g/8AKdeXP+2pZf8AUQmYXaX+LZP6kv8AclyNL/ex/rD732fnkz2T5H/OX/yZmu/8 ZY/+TKZ6f2F/ieP3H7y8l2h/fy/HRhebdwnYq7FXvv8AzjD/ALw+YP8AjLbf8Rkzifa36sful+h3 /YvKXweh/mx/5LnX/wDmFP8AxIZouxv8bx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+ MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdirsVfTf/OOf/kv5P8AmPm/4hHnnntR/jQ/ qD9L03ZH9z8XqOc47R2KuxV2KuxV5p+cX5WR+arA6ppkar5gtE+EDYXMa7+m3+UP2D9B26dB2H2w dNLgn/dS/wBie/8AW63tDReKOKP1j7XzBLFLFK8UqNHLGxWSNgVZWU0IIO4IOeiggixyeYIpO/IP /KdeXP8AtqWX/UQmYfaX+LZP6kv9yW/S/wB7H+sPvfZ+eTPZPkf85f8AyZmu/wDGWP8A5Mpnp/YX +J4/cfvLyXaH9/L8dGF5t3CdirsVe+/84w/7w+YP+Mtt/wARkzifa36sful+h3/YvKXweh/mx/5L nX/+YU/8SGaLsb/G8f8AWdhrv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4n L3x+92PZf9+Pj9zz3N6652KuxV2KuxV9N/8AOOf/AJL+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8XqO c47R2KuxV2KuxV2KvGPzv/Kf9IRzeaNCh/0+NeWpWiD++Qf7tRQP7wfteI9+vWez/bPARhyH0/wn u8vc6btLQ8X7yHPq8X8g/wDKdeXP+2pZf9RCZ1vaX+LZP6kv9yXTaX+9j/WH3vs/PJnsnyP+cv8A 5MzXf+Msf/JlM9P7C/xPH7j95eS7Q/v5fjowvNu4TsVdir33/nGH/eHzB/xltv8AiMmcT7W/Vj90 v0O/7F5S+D0P82P/ACXOv/8AMKf+JDNF2N/jeP8ArOw139zL3Pj/AD1N5B2KuxV2KuxV2KvQvyF/ 8mZp3/GK5/5MNmi9o/8AE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/AJxz/wDJfyf8x83/ABCP PPPaj/Gh/UH6XpuyP7n4vUc5x2jsVdirsVdirsVdirxfzj+U/wCjvP8AoPmfQoP9x8mq2balaRja BzcJWVAP91t+0P2T7dOt0PbPiaXJhyn1eHLhPf6Tt7/vdNqNDw5Yzhy4hfze0ZyTuXyP+cv/AJMz Xf8AjLH/AMmUz0/sL/E8fuP3l5LtD+/l+OjC827hOxV2Kvff+cYf94fMH/GW2/4jJnE+1v1Y/dL9 Dv8AsXlL4PQ/zY/8lzr/APzCn/iQzRdjf43j/rOw139zL3Pj/PU3kHYq7FXYq7FXYq9C/IX/AMmZ p3/GK5/5MNmi9o/8Tl74/e7Hsv8Avx8fuee5vXXOxV2KuxV2Kvpv/nHP/wAl/J/zHzf8Qjzzz2o/ xof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+R/zl/8mZrv/GWP/kymen9hf4nj9x+8vJdo f38vx0YXm3cJ2KuxV77/AM4w/wC8PmD/AIy23/EZM4n2t+rH7pfod/2Lyl8Hof5sf+S51/8A5hT/ AMSGaLsb/G8f9Z2Gu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc/wDJhs0XtH/icvfH73Y9 l/34+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/AJj5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0dirsV dirsVdirsVdirsVfI/5y/wDkzNd/4yx/8mUz0/sL/E8fuP3l5LtD+/l+OjC827hOxV2Kvff+cYf9 4fMH/GW2/wCIyZxPtb9WP3S/Q7/sXlL4PQ/zY/8AJc6//wAwp/4kM0XY3+N4/wCs7DXf3Mvc+P8A PU3kHYq7FXYq7FXYq9C/IX/yZmnf8Yrn/kw2aL2j/wATl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+ m/8AnHP/AMl/J/zHzf8AEI8889qP8aH9Qfpem7I/ufi9RznHaOxV2KuxV2KuxV2KuxV2Kvkf85f/ ACZmu/8AGWP/AJMpnp/YX+J4/cfvLyXaH9/L8dGF5t3CdirsVe+/84w/7w+YP+Mtt/xGTOJ9rfqx +6X6Hf8AYvKXweh/mx/5LnX/APmFP/Ehmi7G/wAbx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL /wCTM07/AIxXP/Jhs0XtH/icvfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV9N/845/+S/k/5j5v+IR5 557Uf40P6g/S9N2R/c/F6jnOO0dirsVdirsVdirsVdirsVfI/wCcv/kzNd/4yx/8mUz0/sL/ABPH 7j95eS7Q/v5fjowvNu4TsVdir33/AJxh/wB4fMH/ABltv+IyZxPtb9WP3S/Q7/sXlL4PQ/zY/wDJ c6//AMwp/wCJDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/ AMTl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/wDnHP8A8l/J/wAx83/EI8889qP8aH9Qfpem7I/u fi9RznHaOxV2KuxV2KuxV2KuxV2Kvkf85f8AyZmu/wDGWP8A5Mpnp/YX+J4/cfvLyXaH9/L8dGF5 t3CdirsVe+/84w/7w+YP+Mtt/wARkzifa36sful+h3/YvKXweh/mx/5LnX/+YU/8SGaLsb/G8f8A Wdhrv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4nL3x+92PZf9+Pj9zz3N66 52KuxV2KuxV9N/8AOOf/AJL+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8XqOc47R2KuxV2KuxV2KuxV2 KuxV8j/nL/5MzXf+Msf/ACZTPT+wv8Tx+4/eXku0P7+X46MLzbuE7FXYq99/5xh/3h8wf8Zbb/iM mcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVd ir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/+cc//Jfyf8x8 3/EI8889qP8AGh/UH6XpuyP7n4vUc5x2jsVdirsVdirsVdirsVdir5H/ADl/8mZrv/GWP/kymen9 hf4nj9x+8vJdof38vx0YXm3cJ2KuxV77/wA4w/7w+YP+Mtt/xGTOJ9rfqx+6X6Hf9i8pfB6H+bH/ AJLnX/8AmFP/ABIZouxv8bx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz/wAmGzRe 0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45/wDkv5P+Y+b/AIhHnnntR/jQ/qD9L03Z H9z8XqOc47R2KuxV2KuxV2KuxV2KuxV8j/nL/wCTM13/AIyx/wDJlM9P7C/xPH7j95eS7Q/v5fjo wvNu4TsVdir33/nGH/eHzB/xltv+IyZxPtb9WP3S/Q7/ALF5S+D0P82P/Jc6/wD8wp/4kM0XY3+N 4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJmad/xiuf+TDZovaP/E5e+P3ux7L/AL8fH7n/ 2Q== + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:75FE812EFA94E911B987F622BD994B0C + uuid:717f5cd6-4b5f-4555-8584-c15b50a65740 + + uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:75FE812EFA94E911B987F622BD994B0C + 2019-06-22T16:33:43+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Cyan + Magenta + Mograsim Blue (7,83,235) + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + Mograsim + 1 + + + + Mograsim Blue (7,83,235) + SPOT + 100.000000 + RGB + 7 + 82 + 235 + + + Mograsim Orange (255,83,0) + SPOT + 100.000000 + RGB + 255 + 82 + 0 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 40 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 36 0 obj <>stream +H‰TM +Â0F÷sŠ¹@“ÌL~š­Q\P°.¬ ½?8‰b+L|yùˆ=´Cq¸Ûg'tF8螙ñ5=^N <‘Ðé"”P㠕gÈYǽÙg‡â{#}=ßà +g°E=ã¢÷q[$U:ã‰â*í"a—´Q/ªh¤µ4Ä;~õ‘È_½.¥Ö¯ÎVГ±¦„þKú¼ MÏ!™~òà¿ó`’œ;¥ +endstream endobj 40 0 obj <>stream +8;Z,f;%eL($q1-eQc!eB@rRu>;'_62QH[j`r(36'S"3HHo3X%<%o@Hk2!FU+O9'@A +Vh?='VDRf@#r\p&mleqUMK\/E'E9[l2>lmZC]&"^j +95"(G'%j4=D]?'P$/_8'Cjt\dhLp_Tn>uh2^311(H[bs]?mAGAP!15FM;J6P"GI-O +gBipRN)0DM8H7ZrS4'1QL/FR>IM#j!_u/>@4FEE#&mRh+s,t5QJ+tT\q=:+;q6F)l +*<>sij2C`PIB^T7."CG!'gL> +5C)unqL8tSl2I=;5M^gRs4[,`!7BdB$i~> +endstream endobj 41 0 obj [/Indexed/DeviceRGB 255 42 0 R] endobj 42 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 34 0 obj <> endobj 43 0 obj [/View/Design] endobj 44 0 obj <>>> endobj 39 0 obj <> endobj 38 0 obj [/Separation/Mograsim#20Blue#20#287,83,235#29/DeviceRGB<>] endobj 37 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_blue.ai) +%%CreationDate: 6/22/2019 4:36 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%%DocumentProcessColors: Cyan Magenta +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%DocumentCustomColors: (Mograsim Blue \(7,83,235\)) +%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) +%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%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: 1 +%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 47 0 obj <>stream +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 20907 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 +%524C4585FD6DFF7FFF0885FD6BFF5B0EFF0F08A9FD69FF850837FF080908 +%A9FD67FF8508090EFF0F080F0FFD66FFAF090F0837FF080F080F30FD64FF +%AF080F080F30FF310F0F080F31FD63FF310F08310931FF080F080F08095A +%FD61FF3009080F080F30FF310F0F08310F0F5BFD5FFF310F0F0F08310937 +%FF080F080F080F08097EFD5DFF5A09080F080F080F30FF0F08310F0F0831 +%090F85FD5BFF5B0F090F08310F0F0837FF080F080F080F080F080FA8FD59 +%FF7F09080F080F080F08090EFF0F08310F0F08310F310831FD58FFA90F08 +%310F0F08310F0F0837FF080F080F080F080F080F0831FD56FFA931080F08 +%0F080F080F080F30FF310F0F08310F0F08310F0F085BFD55FF3108310F0F +%08310F0F08310931FF080F080F080F080F080F080F085BFD53FF37080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310985FD51FF5B +%090F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F08 +%85FD4FFF5B080F080F080F080F080F080F080F30FF0F08310F0F08310F0F +%08310F0F080F09A9FD4DFF85080F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F08AFFD4BFF85080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F30FD4AFF +%AF080F0F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F +%080F080F080F080930FD49FF0E09080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F30FD47FF300F0F0F08 +%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F +%080F080F08095AFD45FF3009080F080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F7FFD43FF5B0F08 +%310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F +%080F080F080F080F080F080F85FD41FF5A0F080F080F080F080F080F080F +%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F080FA9FD3FFF850F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%37FF080F080F080F080F080F080F080F080F080F080F080F0831A9FD3DFF +%840F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310931FD3CFFA93109310831 +%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 +%0F080F080F080F080F080F080F080F0831FD3AFFA931080F080F080F080F +%080F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F0831085BFD39FF37080F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F +%080F080F080F080F080F080F085BFD37FF5B080F080F080F080F080F080F +%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F0885FD36FF310F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F08A9FD35FF5B080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08AFFD34FF310F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080908FD34FF5B080F08 +%0F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F31FD33FF +%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 +%0F30FD2DFFAFFD04FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F080F5BFD2BFF5BFD05FF300F0F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F08095AFD29FF3031FD05 +%FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30FF +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F7FFD27FF5B0F31FD05FF310F0F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F85FD25FF7F090831FD05 +%FF5B080F080F080F080F080F080F080F080F080F080F080F080F080F30FF +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F08310931A9FD23FF850F090F30FD05FF310F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F0831A8FD21FF +%A90F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310F310837FD20FFAF3108310F0F31FD05 +%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF +%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F +%080F080F080F080F085BFD1EFFA931080F080F0831FD05FF5B080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F085BFD1DFF5B08310F0F080F31FD05FF300F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F087FFD +%1BFF5B080F080F080F0831FD05FF37080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F09A9FD19FF85 +%090F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F08A9FD17FF8508 +%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F0FFD16FFA909 +%0F08310F0F08310F0F30FD05FF310F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F080F0EFD14FF +%A9080F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F +%080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F31FD13FF0E0F0F0F08310F0F08310F0F31FD05FF370F08310F0F08310F +%0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F +%080F080F080930FD11FF3009080F080F080F080F080F0831FD05FF5B080F +%080F080F080F080F080F080F080F080F080F080F080F080F30FF310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F5BFD0FFF300F0F0F08310F0F08310F0F08 +%0F31FD05FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%310931FF080F080F080F080F080F080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F08095AFD0DFF5A09080F +%080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F +%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%31080F85FD0BFF7F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F +%080F080F080F080F080F080F080F080F087F3009080F080F080F080F080F +%080F080F080F080F080F080F080F080FA9FD09FFA90F080F080F080F080F +%080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F +%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F85FF0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%31A9FD08FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 +%0F080F080F080F080F080F080F080F0885FFA9080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F0831AFFD07FFA90F080F080F080F08 +%0F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F85FFFF8508310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F0831095BFD08FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FFFFFF5B080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F085BFD06FFA90F080F080F +%080F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F +%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 +%310F0F080F85FD04FF5B08310F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F080F087FFD06FF0F0F08310F0F08310F0F08310F0F080F31FD05 +%FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF +%080F080F080F080F080F080F080F080F080F080F0885FD05FF31080F080F +%080F080F080F080F080F080F080F080F080F080F080F0885FD04FFA80F08 +%0F080F080F080F080F080F080F0831FD05FF37080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F0831 +%0F0F08310F0F080F85FD06FF37093108310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F5BFD05FF0F0F08310F0F08310F0F08310F0F080F31 +%FD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F083109 +%37FF080F080F080F080F080F080F080F080F080F080F0885FD06FFA93108 +%0F080F080F080F080F080F080F080F080F080F080F080F087FFD04FFA90F +%080F080F080F080F080F080F080F0831FD05FF5B080F080F080F080F080F +%080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F +%0F08310F0F08310F0F7FFD07FFA90F090F08310F0F08310F0F08310F0F08 +%310F0F08310F0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F +%30FD05FF310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F +%0837FF080F080F080F080F080F080F080F080F080F080F0885FD08FF7E0F +%080F080F080F080F080F080F080F080F080F080F080F087FFD04FFA90F08 +%0F080F080F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F +%080F080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F +%0F08310F0F08310F0F85FD09FF7F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F080F7FFD05FF08310F0F08310F0F08310F0F08310F0F31FD05 +%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF +%080F080F080F080F080F080F080F080F080F080F0885FD0AFF5A09080F08 +%0F080F080F080F080F080F080F080F080F0885FD04FFA90F080F080F080F +%080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F +%0F080F85FD0BFF5B0F08310F0F08310F0F08310F0F08310F0F08310F0F5B +%FD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F +%080F080F080F080F080F080F0885FD0CFF3009080F080F080F080F080F08 +%0F080F080F080F087FFD04FFA80F080F080F080F080F080F080F080F0831 +%FD05FF37080F080F080F080F080F080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD0DFF300F0F +%0F08310F0F08310F0F08310F0F08310F0F5BFD05FF0F0F08310F0F08310F +%0F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F +%0885FD0DFFAF080F080F080F080F080F080F080F080F080F087FFD04FFA9 +%0F080F080F080F080F080F080F080F0831FD05FF5B080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F7FFD0EFFA9080F0F0F08310F0F08310F0F08310F +%0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD0FFF85080F080F080F08 +%0F080F080F080F080F087FFD04FFA90F080F080F080F080F080F080F080F +%0831A9FD04FF5B080F080F080F080F080F080F080F080F080F080F080F08 +%0F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD10FF +%85090F08310F0F08310F0F08310F0F080F7FFD05FF08310F0F08310F0F08 +%310F0F08310F0F31FD05FF370F08310F0F08310F0F08310F0F08310F0F08 +%310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F080F +%0885FD11FF5B080F080F080F080F080F080F080F0885FD04FFA90F080F08 +%0F080F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F +%08310F0F080F85FD12FF5B080F08310F0F08310F0F08310F0F5BFD05FF0F +%0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F +%080F080F080F080F0885FD12FFA931080F080F080F080F080F080F087FFD +%04FFA80F080F080F080F080F080F080F080F0831FD05FF37080F080F080F +%080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F08 +%310F0F08310F0F08310F0F080F85FD13FFAF3108310F0F08310F0F08310F +%0F5BFD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F +%080F080F080F080F080F080F080F0885FD14FFA90F080F080F080F080F08 +%0F087FFD04FFA90F080F080F080F080F080F080F080F0831FD05FF5B080F +%080F080F080F080F080F080F080F080F080F080F080F080F30FF0F08310F +%0F08310F0F08310F0F08310F0F08310F0F7FFD15FF850F08310F0F08310F +%0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD16FF7E09080F080F080F +%080F087FFD04FFA90F080F080F080F080F080F080F080F0831A9FD04FF5B +%080F080F080F080F080F080F080F080F080F080F080F080F08090EFF0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F85FD17FF5B0F0F0F08310F +%0F080F7FFD05FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD18FF300F080F080F080F08 +%85FD04FFA90F080F080F080F080F080F080F080F0831FD05FF5B080F080F +%080F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F +%0F08310F0F08310F0F08310F0F080F85FD19FF300F0F0F08310F0F5BFD05 +%FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F +%080F080F080F080F080F0885FD1AFF0E0F080F080F087FFD04FFA80F080F +%080F080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F +%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F +%0F08310F0F080F85FD1BFF0F0F08310F0F5BFD05FF0F0F08310F0F08310F +%0F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F +%0885FD1BFFA9080F080F087FFD04FFA90F080F080F080F080F080F080F08 +%0F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD1CFF +%A9090F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF +%310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F080F080F0885FD1DFF85080F087FFD +%04FFA90F080F080F080F080F080F080F080F0831A9FD04FF5B080F080F08 +%0F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F85FD1EFF7F080F7FFD05FF08310F0F08 +%310F0F08310F0F08310F0F31FD05FF370F08310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F +%080F080F0885FD1FFF5B0885FD04FFA90F080F080F080F080F080F080F08 +%0F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD20FF +%315BFD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F +%080F080F080F080F080F080F080F0885FD20FFA985FD04FFA80F080F080F +%080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F +%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 +%310F0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF31 +%0F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F +%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 +%0F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F +%08310F0F7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF31 +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F +%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 +%0F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F +%080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F +%0F08310F0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF37 +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F +%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 +%0F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD26FFA80F080F080F080F +%080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F080F +%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F +%0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F +%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 +%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 +%0F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 +%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F +%080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD26FFA80F080F080F080F080F +%080F080F080F0831FD05FF37080F080F080F080F080F080F080F080F080F +%080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08 +%0F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F +%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 +%0F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F +%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 +%0F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F +%080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F +%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 +%0F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F +%85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD26FFA80F080F080F080F080F080F +%080F080F0831FD05FF37080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85 +%FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F +%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 +%0F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F08 +%0F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD +%26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F +%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 +%0F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85 +%FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F +%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 +%0F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F08 +%0F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD +%27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD26FFA80F080F080F080F080F080F080F +%080F0831FD05FF37080F080F080F080F080F080F080F080F080F080F080F +%080F080F30FF +%%EndData + +endstream endobj 48 0 obj <>stream +%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%d_²Ý#)ɬ`1¦ó(ÉÌ"‡|™}˜}±ÕïS…fîy›3] ²2Cà 0\ +=>UüÍÿñ«ß|yýÕëßÞ}®†Ý“/þæoo{ýæÇ;’w?}ñâÛ·ïހôƒ_ÿp7ÎWžºþiyjOþÓݛ·÷¯_ý˜¿» +øí-ÞÿÁá÷oîß¾»öjw{÷Rúáî?Äoÿáþ݋;ùýýóׯžþöÅ·wWÏîèMKUÇgïä÷ó¦éGÓ0.»øã0ï~õs>òìÕž½}{ÿç;´ +›Û¿þöÕW÷¯¾Þ¿þŸ?Þ¥y÷e,yñ)â÷ÿë»·=tUÒÂ'¯ŸûòîÕ»_½yýüîíÛÃë¯ß¼ýñîð'éÄϟ}-¿y&]ÿ4=½½q'Ý|ùìÝnœ8&×?§§ûoï_|õ‹o_þöNF`^FÒÃSVôo¥© ÿ&=?ýéK!ýæîÝ;ù0igè¿á ãþúeý„üüõ×ož½½¹ÛˈíþíùïJø»)¤û!Çî×?Ùw/HUWÔcåaJq‘¿—iLóòޚþÏ]÷R÷ô/ß<{õ5žŸRÂCk¹.išåÿú+™¨;¡7ÿ~÷ê¿ÿ°ŽÄ›×߀„Þî¾Lã´Ãÿûí?ܽüæ…Ì>'iJóU’éá_ýõa™>øe¯J^–Ý—s®æyJc¼eñìÆ´\-ÅÞhÓ{÷‡û»?þx÷‹×¯îlB¯ß¼û.«‡Aÿk¿úõ·/îÞüã«ûwòÑ3i‹ÎèÏ_u÷BÞhUܾxƉdÛí‰xöæë»w²_¿øö7MñVdÕüìٟî0Ù£5òËoî^ýÃëâ§~9NsØå1Èä$éÖTvKŠ»±°‘$팳·;¶ÿZí¨ +Õ&2¦îW²ú~ùæþëûW?®ß˜ŸþäÍýWmIæiWô?ìÇUéþ¿ÔÿÛçJçß½»{U¿_¶ÃáçÝâ®~þK´zóê«Ã뗘‡·Ü½wÒ¾¬ ¯¿¶ß¶ø;©âÛo¬$<•iû՛ûW¨øÉ¿Ðߕ§¿zñ­üò'o^ûÍO_ýîõ“/~ ,ìŸîž ›’¹ýj÷ËßþùAÑ/ž=ÿý×w¾»þûWwïîÞîö²o…îÏ +Oúæ‡ï©Xúûæn§¿•wù£üý;üý˜÷w¿Ò*Pêßÿ[Èñŋ»W_þ?ß¾}öîÏ/_õí ùíÍ«?ܽxýÍÝîÙ«¯vÿüìÍ7iâW/ž½zöfÇ_Ôúzw?}õîîͳwÿ‡ÝËgÒ¨<ô³û?ȋÏd|Ղ,§odÔøŸY·öÐݯÕÔ³w¿¦u÷ê«·^ûõ«¯_`¿Þ´1vDŸLõ¿ùÓËß¾~qÿö¥WÞSüߏüRÖW¿|¥ŸüæÛ·¿ßýÃë×/¼æŸ ¯¾{óÍý«·w/6_-\Dßû«jÈ>×6ÏÿMž½xq/çÙ7¿¿~®•ÿf¿ÿÝýÝÙÆ.¼ÿ¨ÕõœSu®Õß|s÷çûg/ζxúÚ_]c¶w7_Ý ï¼À|æ7|öîùïw?»ÿí›goîïÞ³[1Ù¿»õ•|èo¾½w獠38W¾¾{{÷îÏï„A {›‘n»Zõé©7ýqòå—4rÆî_õüäͳ¯îå( í'¯_|%-U·˱™wû¯ž|ñ¯O¾ºÿõq÷7O÷"þ!oÿŒ›2u%X‰Vÿ_ˌÿKóªd/eXVåº+{)+Ç®Ü ·Rãm-«OëÿL] ]‰«’´Èàï<ÎR2ÿ.]YVåzÜ{9xُG)õ§£ÔxoH;Ž·}量ŸWÿ„®Ä®¤iFyò…þ=宔i‘¢ÿ½îÊ^˓/þïósziVÃj^c7»mŽ¥Hužc7Û:»ý,)ø³[Vó¼t3-ÿ•uÎë¬ï}¾õoÌöM?ëò_ý3œóIf Ÿñ ó‹¿1Ø뙥p¶óf¦¯­¬çsŠ¿oXŽ›Ù¬ÍÎe›;«:s‹Í™Ì“Ì©Îæì`åÈrcå¥n3tg3§#g+ÚøŽëž{æ–#4qföqaŽüêѾræê¹ÆZaÛhk +!Ä0‡,ªíöRŽáV¦}Œ!ƘbŽ%.ñ:îã1ÞÄ[Î)…$jlÊiI×iŸé&É>•OeÉÆ9Íó\æe¾ž÷óa>η²(FŒ˜Sž³¨MyŸù˜oeÁŒe*±¤2—\–r]öåXnÊ­,™Ó%,q‘Š–²,Ë~9,7Ë­,Ÿñ:\Çët=_—ëåúúz/åp}¼¾á’š¤ qŸöy_ö‹üj¿?ìoö·²Ìd49èáé ŸpXׇýáp8neٍœŒxLÇù(Ÿw,Çå¸?Ž7ÇۛA¦'Üěù&ߔ›åF»9ÜÈ*¹¹¹¹ÅÒ¸•A»M·ÒÙ[ùüÛk)Òè­¼z»ùÃ98­N»éʱ+‡®ìWåº+K-Rã"Í·’»2¯JêJìJ芬F©qòÒs¶Æ•‡þãoú?ÇU9h‘!Ãßû®\weY•Ò•Ü•¹+ÂÐo’—¸*¡+SWÆ® }Ñaò…M@߁þÏ¡+{-u«®æs=‹ë¹«³¶ž©õìȌH±Ÿ‘n&Öã¿uíÍsTe¼–͘ÚH®Æp=n›ÑZŒ×z\tL®­,,ÅJ¶2³$+‘%X‘uÇÍhgªž +¾jç´±úgÏrmea)Vd³ËæχÙJ²Y‚åÉõ ¾ÚÍé çqÏy+œ§ÄyÁ\ ý#Gûšc›9š‘£7r´n8:{ŽF‘Þeö=F/öêÈ^\ó»3¿2ò«ä[dÙÜȐ„] [+ÂÞfarQ˜Ý$|^¾T–ԍ öA˜áµ°År…A&a”AΛQÎà[™ú£ Ê~¹vZ–,Œ5 ƒ rBrbßʂ8Ê`í… /E¾QXò,¬9– Lz”³ýV–ÊQ†rŸ¯…‰—œ…'aëA˜û(²À­,¢£ ï^Xÿ"G@–ƒ ɁäXgùFYÒ72Ù94®åð(r„Ì)ÉaäPE¾¸•…w”)Ùˁ³ÈÁ“ã,GP”£h’i-p#Ë㠇ԵVòrlÍ!Éä E¢¹•Åz”iÄ1‹ƒGq’£G5ÌsÊ~;؞ijõI>+L~ˆ{ +*PˆˆQ×ƅVYë¨5´÷! L+~q۝Ê)YcIÖ×(këÜʚºc„§þèI5rÃâ´JÜÖõIJ3 '–J"0ÔOÀÙèçâ,K¯œ9ƒŸŒ8¯Ñf}ßeŒ`l®r¥ŒÊ£IÉeëíT`X ã ·^³üLYðX)ØPºúsÔàú„ƒáótMÑæ&œ¬Š˜£‹O*0ª¥‚áâý42šè®Ý¬¢x½©²°¶ZW«‰õp ôý³ƒäßßO¦NäJð Ðd…dY){®™ ÑO²#¤2«ž]µeÕXVϴȶ|ôÏ0³5+{#óéØlåϲ‘÷._×Ò4¦²Ò¥²éWZÒJ3½Lj Æ ôÊü+•x­íÕÓÊuA×&XdWZäzÕ<ð÷²)eSšÆªÿšM—íK<)á¤LgŠý‘û?'ª#vg/ûùßdzEX‹¬Âƒ—½—ë e¹XJÕ0¥Æ¼)ó#KÓ^S_¤ÆÕÏnáhÿ>-áBáҐ§G–sƒ|¦H{òÑÎÚ +>éÏ竱;^GX•~«´¢r[µ…TÛH1Ý»ÚNlßË®V=½îöji[a»·«ì[÷r¿{÷¶««átïf·:ÌV’Û$š]*ô»Õ­ìSù—ÛBšml³7ëî<òhª6–Þƶ?»7÷+ËÜéî¬6œín-++_³ +UËйýê?¯l‡é¤Ä•µñò®\[®¶6Ësûö¡Ý¼Ù«ÜÕ~÷á;úÁ]ýW°?„Þ^½:U°Tj9U°ª¬2Pa¿¡D²˜‚9›L2¹zuÛI%y%•LŠu%‹*֓/Dɂš¥JÔ¬*–*YZTÑ*®hS´ jDÍÚSÑ*´aÉj¤²5r£ÜRÿ>¢ © ˆª¥ÊÔ­IÕ-*\GS¸öT¸ +.¨\`e²vLíº¥. ÅKU/(_…ÊÔ¯Hõk䶺¥ +v  +% jX–fñ¨hZ¢¢*c¢ŽÑtC…ì( +T2(ePË ˜å˜¨šA9 d]´[Óá÷Z„ƒ/”ï áeJy3^ø3RÀjœb°NH“ãTv+TÏP"9xÏ»;®ÝIa՞«÷<¹—¡(/ ¿'²‘sÖ/]I6+®¹â‘²cz™eÃíÎò¹ä‹3òÄã¸ÆEnò™wµ«¢Zz YÿgmìLk;\=s©rŒ¦Ò¶VemóK›2¯Š+Kb^Ù u¬u¹Þ”ý¶˜E³/Ǔrúçö´ÔÕ& ²?ÉÇ3e:[ÂÙR­ˆ§%](óÅâöd©1oJy°,ï)"R¬¬ÚçËþ‘…_j<<²W¤ÆS깩|t‘/ýî#ÿœ9^?º&7 ®µNæDÑ­¨=µÚW³•j]¬˜uVjTkmýSYEÛBuZ*¿­ºu•ú«¥XíƲ¾ižÒ2{©¶æâe±ríe†ga^:áXçxUó#œçN_Zù)V<é7ºÄ…zγ§=è2ïy€ç¬xŒñÚÒ.ó˜3œå}Ej|<‚ƒl8½\Î5>šSt»ÿ"Ÿx$W8åìê‡Ë_pWÙve¸Áî ¶T:Š!‹…({P¹sï…1¨Óx0·1lj®ã"‚guá@–CGȁ"+œÈrÆP­®d8“oèNV‡r€J§2þÀ±|MQÎel&u0ÃÅ ù“næ'_ÐÕ\ •Óݼött§ó R"$N8ž£| déL~qþšN胰sEײcDèŸ(üÃ) ·ô|©,{šj)X˜GÚ*ÕpWCvÏtZQ=º®Õy} sÂF¿¥{p.\ùo引ã6NkÀEÞË5{úü®®æp@¿:hö¸›ä_ó® WQöÎ. ×'<ü›'_üÍÓÇ<»{¦Î«$O¦aWÆ+ÑçËndmW㜗ìÿÅxª€ïTÊå9Mök#ÀZËt†[sŸ\“~Ï JmšÉ Û~Ƌ¢™‹êÎʖ˜†…@ôqòIãZeájNÓ}ÖgªÐ¾n„Ï¢²4)óÅ"üY+ݲh“ðYT&ӗ–Uei–þë>O…Ÿ0—S¾*!,¨ª¤¼|ê„n«;·fíã—åJøüÅ»~ +õì ¿Y!˜`™ÿòåÝ €2í_Rq¬Ìÿâ¬óÖæd¬2™›/c¼6Vxì}¶Æ梡f(bzœ  OyÈQµçávKó‡j3³kd7äpÀSáàÒC뚶­ã4¡"«gDm»j#Æi2öR]ž;IÇ©#ÐÒÅs.£Q{Ëmêì4Ž)"˜G%lÍcÙÐ ŠO0„ d7†Q8$w{>Œ½èÂ]l—~²æ†ïñÍÐÓ»sÇG?­—ê’?úÄA>3¤²R!|”ÅÀW(Aî‚Ô•dD id ”®’õŽÙ½É:ʆjh¸†2Œgƒ»4©9,›Ù+š}lFáGcS…KqOz3«‹zR<‘ሎŽº6ÄP5'C)"hàqsâtÝTK¢zƒKωôL):S’.4^SžÞS–Ù£àtKɺÉÖ +ÅÄ<ª|­v“±)e8Sᙐ³!i‹ÄKi»PÚ®òöq%so¤n“¹±*„“rw•¼e—­eo¬’Å`ŠŽ7îœ(yWˆg/y(yß@䒹WÉ;t’w6©{O©ûH©[áŸMގ¼ YÛ¥m‘ʏ”¸«¼}*q'“¸)s»¼½§ÌM‰Û™•AÞ šÜéN;ý÷ÿ{M5C2qfV6—ÝMsÞÕõ;º¾«‘ºÂŸG7[‡Á·¿ÃêïhŒºB¥“ƒãÕ$.Œq<¾‚ä³ýWéú_u{¶ÿ^¯LïGƒQWùBÅ%ó&n— €:)®T,ØG¡ÁFgקpÐÝÌÁf âÚÍÆ[svSóÈÜA™­t@f©q f>®À̗×g1Ãú¼^¥²²¹‡1¾foͶ¢Óö¾zuý.< +¹ŠeeëJžyT¶õ f§\^]Ÿumßؐ:¹®s)²²uµg[ñ3µÊ1ʓÉÛõ QGªî€îîÇœsfmöå¼Ël:1{Ÿ8œ tXƒîO‚dž„>l@ùç Nƒ ¬/5ž …Èç¼q^ˆDӞŠØE—öЈà³;iß¹[Ú^ê÷S·«N YW‹¥ö‘9Cî‡Ö/Ü£@ýFaa‰¶„K1WÒNä•/OwÖ®ÏU¡>ÊXª­e\ÇB×(èý\ãž[Ìsý’¦¨™Ö©YªT­£š[”xU…šÚÓâ—]¡é˜£¡¼ÖñÊM-9RnjýF¥ïUyÃZ¬Uùó†¦5~£Â›oø»µ¿VäתüZ™/fåÎ~Ê,¹JßÔúªØOžñdèÔûÛNÉ¿q]Îí…WÔÆ۟ÅKñҎµvH'/±©1t¥Åô«Òã®×Ѝ^ƒæ¤ +‡l á°*û“r½)çþˆ@».gví.”¤Æt¡Ä.<ژFã3”Š…8ž!¤²×A¤§ñëPÒuT|oÞYYÝóÊCÛ|´Ç•éuexUo­ûk«ÇöÚç9Û<é¸N›@Žƒ{'—M8GhÆW3¿ÞdY‹d{n…ż–™blõ`«)¶ù°×^ìæ‘)Ëʱ`õfO«€2°uØÇB©%»É6™,ï "ӏ4Ä×@ 9˜1w¢!!*1ÕÀ Q-„Î&‘£jÈ­é+ÊP•ííi¾6#p éGfSè«÷öÕ-áB?7×ó­™kNÒ7<¥â<ÜYƺÍÄ:ŸÓw“'æ3e‰¹ÎѲÄ|çÙm¾ÿêõW¯œ!æ4 —ñ”ÕËý>Óä~¥v­3ÿ8Ï8?C]࢚™¤VùŠøɼvÎs[¡#¥ô–ßN†4Ä~?OY¸¯Á…Á" ͪ7²Õ¬S¸cþ¦9ìdþ6‘Ofš%]Öº +«A-g]¶ÐT`ӓ/Ú´†5¨iLÌ$³&è 37 L8Õ<£ §É”Ÿh†š^0› +U•ª¦§Ô?¦ŒQ-«JZUÚÖÎÆ/³JÐÒ^®‹,€é¤„³%^(i]Lme~Tɗ }×çKù¸bÑà+g´ÉÓbAŸ±|_ã¥':©¢Êo³s•Ú&Jy•5s"-SFPãq“Î +²WiB)—Ì ôy2 ijA/-ÐÉ— léáM¢ÂU e oZ79Àò$¼IA–³‡… ÚwANƙ,Ôi *|Z<%zª¥š5ôÔh¬¦o3¢TÓJ3»´(šf¦·…ˆ§V™/”tRÈ¥Æùb9ã_¹PšÑªvåCʉi]¤Æ÷<ñ¡åÑ5>úÔø™ÿüïQã:ɍÅB$j!×êœòÄo³é5û.ø‰ézÂQÔ2Ô¥¹w¡åÝ:h?­ò©Â·{7ÓyŽRyJ…mŸ ™<ËU*_ÉL ©ÜåzÅYÔ¿å-¿LfÑi\&™éSNëŽÓÔ?m¹®ùÌ +<´…IUŽ£rԊë\â>Ӆ²á@côeŽô>þäEj|à·QæzU¾¯ñ/UãÆE=úσ5®AèáÄΒWÖ!³ 1'g0i©KlÙGyѤv•*7U‡ûlV-ÂUTrbØx Qº¦MëÖå§Hãtï\¿¥ü,`)“‰@! CaO¾ ;]A`-0µ«¿ †@Gz2؎úäàÇUÞ܉ž”7 GÑ?‹›ƒ§w0Gº–ºçëœVVÝb Im‹ {o;ͪלzmh­¿l¥ÛîaяgÊiÎõL–Éò¥?®ÄÇÃ)¿¿Ì-R㣟ýÏTcg&;ž¤ÞËòÍ7I¶ ré-oÚÌ|i3¥íiòšiî-3Ú^֛:×`䂉 æ-¸ÓàJS7šÆ-™ýL£RÍzFW™§—.¹†ð‰DQã“Zz›\ÚÓK·h„'_˜›«º¸ª{+XTÂèN­c›pÝå6kn,º°„GM«gk×Uu\5§UsYõ«ÐœU–Ùr<“Ùrë¦Ú:©.¸§ž|±qP]rO­œS9¦¤Æ Ž©sN©G¸¡4ì±åð˜b÷t¼¿\2hæóü¬å¿ç(ßs”ï9Ê÷åóÕø=Gùž£|ÏQ¾ç(Ÿ¯Æ•›ýÁË?þ—ôÞç)–q¡3=.™PIV!(9'uƏÂ÷ÎüƒÿœÏ9ò?kµÕ§p°1ìÒx5·[yö7¿ò7¤YùÍ<^!ÑÄ.Ä«yìÒm=ðȦ†,§iÞM¸Þ{ÉçjØ>ÒjÈù¡§:aº€G˜€GÁ3¾ÝlØÇ ûb©§Ýõñ¤>¬xM[À5þ<äù9ñRyÌ|ƒÆ ?:0þô +¯roÔY0û[ +s‡‘ëïùìïøܔ¿Úšú”MOÌØìk¶B|vÖ³¶šqævãºb7<‘߸d—ùíN]Šš–f©t –ºôJŸå™5 sQ&•Cµð¶†È|w%Ž¹í†—a:ó P¦ÏW§ÅF§aYdZ/<û€˜ã ÏjHÖ ¸TÐ}ÐÇU`­–Þ|þñùtÖyžqN›½1ç™û²2k°M^ŒK°é#À¢ù,zæº뚐Á+`lá|oÎChWý²k Ž†¿þèè{ÁŒàÇ5 â;Ü`+҂…m¼§…e®Ûh¡!§¼§tÀÄ5Ùþæ/m g÷CØîÖM›¼¿}2=Xn<×oËô›ºëù4+àž),³oÙòùΞÇ÷Úâ}]Óɦ1ÝÏD%4di¡ËmoñÚ75hð¥ÐEbà 'ÂĬñÖð? ªúÆ"¨ƒ)Ýq}|kŸWP÷ç;Úf<êsMD ÄÔ¼G}æ£.Dz Áñ›UjN©8Ÿb|aO>b|fåh²Íöø˜×õ4“‡é?Â8æ€ÐW…¿Íeîó¦ö ~È[Ÿ¼ ËùmX¶)X={`ÍØgì®ðYÛêr8É^!½ ºâ°^çÆÁÀCˆio×÷åO}g•Ÿó`.ïÀ=¶7'w°½äí\¸CõB²­¿à;½ÐŒ¡é#R·é¥Î%˜Ï$˜²äRT€šÊS£K1Ÿ5–Ô¿ÕS„ÊâH+¶t¹²«jlg œZd ·ÝÚIg[›Hyå-6V(m¯#'[Yƒ³DŸ/šG'a%7¼Øjá…Va?Êx™¯v–/™¤]\XµÐ¤Aaü Â.aò\dµ%YuÈʁ˦ö²³ðþ ›ø–‘…×¼D +«Ãï0=/Á=êzØ÷ÝØ Ûûâ궻½ÖeNõû +<´ Ü.qÀ5dÈcYÖÙTG“dZ@ïïAú‹w®V`å3w1<Àk·Ü–iáZE@q>„böþæT×a]ÎڴʶѾñWßòõ™Ö¹èa‹  Ø€ˆ§á¨Ùò:§DµÉðLðԅó#œ FÉÌ•…:{Ø醧H8 L,‚’B!ôÇ¿®¿ïûÓnûÖ ‚ ‰ýè+‚ëíÛßÝ'~ÝJe?L´<ŒÃBËÃ< ¢ä•ì™ˆ¦ âNÿђèû+#>s½&²Æab‚²4#üÉ(ÊSÍjÙ ¸J`:ó¯sž®Qçûoý¬õš±èӌÿµÎñ +Çõçs*lêµqûÝfþ¥q §h˜‹öŸWHœùÇy5á3Õø©*D<«AÄ­?€É°Œ©Ø- ·¼a¡²Nܯpki–ÀÀ5=¹§7v|3à€DÓuK=¾º Úuý…~µO±OwQšìmÑ6WW¤m.G[_ŒÖÃêח¢u×£­²{>|±ãã +îmýÀ;¶ÞWþjtá¦Ç^GšÁ(S …D«h¸÷eÉÿ2ӕì ×Xy=ê!Z:2Oû-_5Ýx„Übz¢Ñ&zÊ<â¦åЩÍk5XB²‰&jv½biìZhXƒ%wŽ mº¹íöLev¾¤³%҂s®Ì[x Øg-^£¯‘–]¯f¬—dèM±5•e¶ÿ/½¦Q‡):x +ö‰›>azÿ_üÝ'¡ºtô}lÀãb>êÏ÷5>öv¯Í Ûó j®uƅίqÞóúfȅeBH„! F^Ë<ðBfȁ½¨ÐžKR`'º$x4xʵÝúP¯P®w¾†ÔëéëmíŒþ²äþ*ùådù{*PÞ&pþrä÷^Ô~þ’ä‹—­ô¥ë5ËD/7ÐËÍm>=$®Xn +ÍLáY)¾­Èl\ÍøîÖ­•á}ß彪†÷šûª7½e Ø4ð`¸q#üѲ™îÍí9±ªY¾˜q¾þéR¾òƧ¾Ä“.”é|áí6çÊø±…×´Öòá5:У¹+z‡EuYŒ'ð +þ(ž ±Ï„!sZeAl×<&ÿá:"s»yˆPð҇­s›¥³½Þð†­K嬤ûžrpÈg+ 5nmˆÿñ‚ôwRãƒ*‰Ôxþ7ç/ 9½è ¿ð€êØ§W‡Ì'™E×ÙEǓ]U÷Ԟ·g_›Ë°ø…5ч-;ÑùüDãæЫ9pún ­Þ€ Çý­|øž~ž>?sþãéOªñ¼b/¨"¦¨Ð~½.'JÎ&×v”kj“«RÂÏkŽðz²iŽq=yT,ÒÔØï©ÀeËþ)NȀ¸5ŒòáÁ2=f—3¯£es„íPÁä°Ân80~•S%Eµª”¸g^D•)šDIòä=Hy×TP ¯¹ïí?^BúO_ãZµ³°oF¶;ɂã›úÿ6%²bŸ‚ßѵVSª³UQ-E5¯T\+Šó‰ãsòç/Tãà +Å¥ûK­P[?½öm{m[¯¹zt2˜T§¤ÆŬýÛê—v×N®]}QüþÖ½eO¬îÌÞ¡ùKó4‡eË`©×O,î®Zgd;0GÒDK.ràu¤~Çí¸ ýI5^P9.ST˜Í`]N•œµÔ)Hç. ý +{ËÓ®•¸éòÁ ž桬0—ܸ½w^]ìyè.õœèøL×z™çµe®«ÖòÉl兎Ç-ä#]I>q‡ÂüÇ ÒßIª$py|H懯¾ºÍÞU©št~£põªXSÐjֆ¦ÆÍæ¯Èír©qñ ꇕcíŨ—<4(ãl> óRˆhmÆ“û´£âãWwinŽgÐtY`oÂÍp…‘Ã᪖‚”ÌÔËn<Úåx5¦Ü;?­uª¥aZ1Æiæ=[ÂLǤy瓫²»Í>¨W%ï¦x•×_òÑU|ª#/uä¥-"÷,Fg{¤=:1pŒ'h-^gìnhF2¯uÚãzkl½áªþ·Ýtº¾+¶Édaûsw¿ëö–×­8 M¤³õ-߶úá UÓ;7Yqe:×·¥·,ü-Äíï¹í®Y<½ dé.H\ßý6ù’‹7‚4þº³}©œº ‰—Sɹ^–7²»&†cˆ´ôøÖmÒÞÛîדýB¸¬’8e{µÔ`E¼à¸ñò'ïÄóàøô=:Bá÷èøïÑñtü¼œÝ‡B>µ5>"jëòu¦0~~ÐúŒzä"|DønY·;«ŽvKs½·ªÝ\Uü檹»G«]4Ì[ºÎœÌ~×ëó£^·Ë9NnîX/ÅK|êªËç±|"‰¹AeZÝçy_÷À5+äõÅø½&ÍçÖu×B5¤u„àq­Î²‰ Ü^Qqò͗£//ìËüuµ¼äُåÚošÇºŠáÜУœjThdAC;e˜—ÅÖ¿qgßÛ Š·»è“+ûN¢ +ÿùîþÿûÿn÷›ç¿ÿã³7ƶÙPþR—Òœšô>òZš'_œ¤-®IÐkÒâ>añÑïÄ\'@¯‰Š˜ÝX’â©Cê¯# ._ÂÐ_Á°ï¢>%BâÐ]«À J²#aÅó†zrÏ­!hcÆù®¯ü91ÿ~ô¥?LTtyÍÔįÉnVÕUÓÒ]W»¥¼†l½0H¢J×7v“ï#ÒèoÒ]›QóAƒæãâRÎ\îñ±‘)ëÄÝåÛÔ Çói&µ&>æB¥ás]©Ô_å+báDf¿"ú»vëz蒠?¸&ޗ}ÝÌÝô$J4Ðvu»¸¥ŽêÖJ·b좂óÉþWiE>ŸD^åò¿`çœjçn‚ÏkŽ'5žr¼3šËÙTÖëDցõä‹OŒÁÊ…Õb°d•}t–¹Böjõ ½#åT—²N"ss>Ìwv§ÖÇXÏުŴُ¶:~±¢kŠ¿cKò'ã­Æ&úó4ÇG%ú[§ù³Ø-‘y>)zK£§ µËè-Ye¿EÄ.P³!uÑÅÞºÝ$ûÉçS}¿&¾_߯‰ï×ăkbì2fæÿúð—¿Só–Pžþâõ«_½¹õîþÕ×_~Ù«îýož|ñ‹oø» ¿ûÕ³wïîÞ¼­þúş޾}mÞþµ[–«ež¸ã<‡ÝãÕ ³³›ÆùJ׬_|­ýËñ÷·úCu þ˟ôçÿ*ÿþBý£ Åîç»ýïÃî«'|ë×x ¶T+Þ½õ¤½ÝÏVäú]?ë«8K\Wð +ÿùÑõ›wÇûçïî_¿zöæO»«QäGûׯ_ÈXüÔÆåéÍW÷ï^¿yºöüßeôžþÃý‹»§¿¾{þ¿ÃÿþãýþÛoµ–£vú—ºV&\{©ÆÐqJ\5QVK±,‘vip©÷^Æ¥ aÙýË3­k=’a¯†0»T®‚( 6PÒÏI*Ú¥åj™l'¬á +µ¥Œ+Šãn*ò¸0ƒ]JW£ìÀÝs¾Vҕlò°KÓՌ[Ñ"®â4—]\®DÀ¥ÉóÕäù®dGNõ½åjÈaÚùmfõ™ÍMå*Mp;”á*-x?_‚õµ¯DŸÙM3BŸ¥µYZ¡t&ý(‚p®]nˆ„l¯ u g'Ó^FY…s¾‘u`A®èT2¹ia +¥vn¤Ö)îâ|…+ªv“ θÈʈã•t ßaO„tý­ñJ¤ÝÑ¿|šÓ•ðɤIóœnž¯âX–ݘdfç¹¾7_-vh¿ÅGż¤ÔW"nƒNAæ‚ÑÀü=éFîËñJøF,”«Aô½]”¡f)ù’yV@®“ì=ú3fëLÖ³àÃeæcâÏ1ã»1óK¹€ Â|w¨EtѲ“F1¢Sˆ:o1] [«óÆ+ùAÖÜ,ã;Jßä}QWæÝe“|tœdf—e7Kc˜b}OVß8Í»<#0¾p(…[/xMÎ0!È^ ¢ídð²ðô¶º&ì © ±Õ»0H—Y%ʄ/;ì.fYœr>ØÌɇ]̓Œ„¬ExÅdU¡9i¦ÈëI†*ÈÂãêΓ.@}OfZ4þÌ(÷ýù39†¯¿ùÓÓ׿ã™ò“7¯¿ýÆ‘ó¯üúgïî¾z*lO›e÷ƒîþåŸ/<²RÒ<V%ÒÉB·í L-ðÄ6•§ÔŸ8Yï«·'–+á[26ØGÑÖr£"=<¾²jB a'|n.…Gá¾|¹–EnÔ…áL‹.X}O¶©V”´z',ö„¾W©ã°Ø‹ö ”q6ŠpF9Ü;Š¾ÁãVʂÖ‡¢ß攥¨\ oVªp nïu?\v'cs díÉ°dáU“Œ¯0—kªH.`i£0Ì(btei#Î$™ûÑú<Ùs{C„}y%N°¶Úˆ“:ÊÄ´Uët{cC·«ÛùSõ›½žM׶[b³Cn øÞ G ½Wr®³¥Ô˜¶(|@þ±D9ãm NrÖÊð +Íp 'c§ØÛ³€Ëá*ìjˆH+ŒK ü ǒEøâa¬ìt.Ž‘§ +˜Ú(|^”ŸÝå .r@ÊV_DØ-r^ˆøaïá°2‹09#v<Gù˜E„%Ñ]„ ¼B–'œe™êé%TÑ®ôÔ)҇ B‘œnXAç‹ ¨°–!ÄúžPã$­Ë! ,Ûí"ãÔ-qÁ{›Q9=†°iiBÚNƒ´ðrMEÇq|K‡SäbÃ2š„âÊòúóslÑÛC"›è*©kË^«T™m†×“1Èqn­U‚½§ŸÔžªßìõlº¶]|ãîú›ÏÀüFH "¬g +F6‚šdÆd¦e©^…‡CÁ’§88ÁxXRù¤=&ƒ9C"òz*Áš³÷*5_AßßµŠDîN²Z{F°÷ì«ü©úÙ^ϦwÝ šÞ¦ƒøöð( 'å‰Ü +ò°$Ìý,³$¢Ú(<_Ža~á˜'laáBYv©ìé›ÅV‡,ºX’É—•/ôՄM&[bd³Œîo’+AšÃ0·§d+‘¿‡P#ˆÔFñgÆ<ŒOÉö£½'UÉ8>„5û90BÉAD~2"ÖO¹8ê B0n”ItôW,¢5Ì/<¡ÌØ.|5;T¿ˆpÚ(úªœÈ"²—îAù̜bäI…¨£ˆö±Œ©¾ZÉd-A$40v9ÉTÉî]1Wõƒe®i9RgH2ÉW!âX’Å9Èq"³ †csÌÝ0MƒÌÕÄMÍ6,oä™flvYy/KwÎrŒ4!πÁ adLCŽÐµä8ϲÕÀ£Ë0Öý$?ÅY>Q”â š…|ªŒ¤ðÔÝ2èlëé±]„+vDS¹JE 1Sº4ƒ»eådî£ðs¤Êi_+±`jڃ“ ÂjeÇUüh†,ŒáPDŒ¬†,iÿ +~Šµ!k”¦¹Ñª!k”Õ›×®ðc.â•!k„fœ·cᨊt¬Ú±F‘Á¹¨Wv,j”Œ«KZ–#\vTµclµÓcŽAMc\Û±œZmPX‹ÉLTãÄ“+3εi.í™fSØúj%•°2.5ªÙ ¼žj¥ª­lYþEí©Ú“Z϶kkv.RT\Û²ÕLPà›aIn£!jËڔž‹ˆªî±AnõTBoZjT³@µŠÌFÕÚëMYþUþTýl¯gÓ»ÿ¥,YŸ`D0ˆ¡Cä3ÕUbdÙê3Žwqȁx­F5ƒS¥TÙPQ¢´ 6³ pÈÀ í)˜µœ< ¬Ì曀I) Ò\u0ˆÆÂm*¦|ø8;ÁüöÕh£ÁàŸ…­—b^JX´àæ£b› 3¾SŽ>aIªqP}xbÔF¥X‹¨/àðþ !vå”{JÔS#DÔâŠC¤(35²0OÑ'¢Z—éؘÀ_³ÚÇEZ˜ÅÆ>ȦíÁ nŒ®*ý¹¶è†ôEuŠADÛ]«Ê§ÐÛ«{±~˜?ØúT+;éåw(#¹â²øqãõƒÚC_Ý~x.LÀ‚W¿ܔfwà™ãOÎv‘!ñfõüòƨ¾@Û8DW¨Ž§êû£؆:ÿp¼Èá<6ïÔ‘¦|©ûʳœíSóÿ÷ñã܈³«³©U Î89; H²Daõƒ¬{ŸKóñAÅI277 0Ciž[²>CM¬Z‚ïTï†û©ƒA蜁°1÷á˜7rkŠSç„.Ê@»?p¤ÀRÉüTÝ¡Ô¸?’«œ[S猖*64 yÚ¯êqæʤ5§ -itg"½‚è¾ú}ª[Êÿ2a¹WÇ †qˆÎ«gÚ҂~V× (øÂDŒqß ðV‘–ê¹Uƒ]8elÞA¾™@©îAvÛ2ªîAÔW²TáþAXH©ï¸‡PN@ðªÉ]„Ó%S¾É}„ØåHïŸ9 a„à2]{ az¢ˆênBh¬Q}wºM/; +ñ·ÙË ¹È1ÀBuÎÁZÂ>¹Ï)kwa÷ ½]Uö³µØ» ÁD¢]šÏº1­ËޞSÖ^ÃîAÿx¯lÛË3ŽC™kù‚1m<‡0òpºnåÎcsåUÂÚuØ3Ÿ`W“S¬Éµó3 `·º ÛŒSפÖÞÃö˜¼×´íå©K˜žùí¬‘uãܤ²ˆß‹Ö‰#w0ŸÔY¨È4{“"œ‘×`µÆ±N3Ô áùæá!jÆ´²J1,¨ó±=ß Õp›„ó;C³¿šJ}UN-¶*¯&"˜h!4œtõTŸ +ÐÐ`™KCwpwäQ%ÔÃ8ìÀˈmàøÀªÓsŠ*½íAaLºc««Q†Ž 5²t„Â\«, +«˜ÆصZ)Ïë¤òëÚsµ^×IOß#}5¼K\k5ìÉ:ÝÕI ¿Âa×®^êQ„'$6njÚ¬ùju@ƒ¯è²sJHý"sr¬‹¬zª§ëú4OµS֞êö`õ@OÜ¡§„Ü­²FÆ´¦Þ73oH6]ëaºì®ž Jãbˆ—2ïink?c«Ù k§u{®ú£[]b®×<‹i"ðÊ dӞW­„µïº{Î;àum{ú¹¯Áфm”æéäªyº-²jžX&4á¬4O°Ñ&×<¡Ÿ‰Ì¹¸æ ۍn+ÕӍˆUõt[`Õ)aÏ0‚®TOè“C§ Â6YÏúóJï¬DW;a6‡©Ë•Iz'E+­¦³ñuþ _Õ:OôŒåjVãÈZëläª*ÒDûcU&ñ:ô×Z'íLÐoڃcå—^™SVZ`G6u±UVUÊÖêJ÷lŸ×ôžyeÛ¾^v†’i>&CÜÀ +õË ‰žÇXš³j$Ømħ¸}žvÖîAˆð#¶Êœb­:c1ò3…ÂX´29µ„ÍÍ]«•âÖ}s®úƒÞ¯lÛ×ïÐ7>aϓª‡v°j¢Œ,yPÆ@™c +4®Ot?äÅ»Ïr á(‹£UdµÐk;ÿ4*oqeâP—ª¼°üÃÒ®…ÂםV˜dGíݒ§+âTuœ`S€µD^Š9Vèw#W+–Ñk‰ŒOFPµàyn[3AGÝs¬}U•`Mڋ• Üjšôlm-NÝaÛ}™?ç_ïum»ù +’S¸@ƒÜ ’N>€pú8*’¡Ô‰ù"!] SuÁ`}•Æ^o¨ºÂ:¿àP_„R:S¾;q+­¶&átÇ"WìTŠ†ØUÝèdHx‡°pۃy©@ÉE›à +U Dz’!ó† N©*˜¬Pz"©ÉœC•SÍÏ']ч)›@a˜e%ig×ÀШß;×ï•h£e°®VŠóŒ¼"«±ÇŒ•Ò6¦•-½R¾Äï…" ]]lj€!Ñ©à[ÔP¼U®öF¸ó`Ú"ˆ&ê”膏 jŸ¤9ÕßTæ’Ç+š7‡IÃQ }ê’:µ*ÙM祩,òXŠfí§A‚ÕbÅÁö¦”°úÜh Hª§4ú"Ÿl±ž.ûSnƒå ܺD«ÝË YŽŸB³‹È1š=ðò-<>"{Y)¶9dÀ3k{PβÔWe?‡ÞNX‰ 7®»®¢`ºkíÅ^ôóýã½²m/;¯ ¬_úß°òy”½Ü5¡~CÏ i²œ'…ç9Å£¢’ºeóNiU™S¬UÕÈY%àVÜ»0´¶V+Å^­Ÿ×ô.xeÛ¾vã Ó³$œË¢N‹ùrMÆ;)w­še0¡°æB‡œ Ä/´ç"Ò †®.§ÔFíU'CT¢ë V@¤˜Ú¦ýlœ£~Z}ªuªVtÒÍ6°ùŠˆW8Õs¨âŽ!9+.Q„75/Q2‡Uv"k¨ãG°›ÀX_Ʉ®MóÜ*ë(Öª½êä ¢`Ùu•Á-RߪQž×¶Ïó½ VÙi_»qpIOŠÖý§ºöœ ›dxpÈažae”éon”çUzIižû ç(]eN©­º0ad3Œ´Ê„«2†Ë5‚9-êÇÕÇZ·jM'ýΌŽêÆaäÈ_ƒÝqžÍÌ;[Ñî8¦æGV…»ÃêŠ;*àª]RŽx6=eZ¼ ò>‰Ð@4Ï1ïP!K9æc¦ž× +zdz!¹É@ï4·Ä96Ô;e"FýUØ;˜nX¶°wô€,ǽÃ7qљãÊàáøº5ôÚPP%Hæ<Õ¯u<ºSžûøãdè4h{WW¥ÔF]¡2r¹¨¬Õ%mM™R`m´R\~L1ôÏy·jUÛ~^Vý? žî¹Éñ®¬¨“ +9Ç“µ´4dºSÌ"böîA¹·ªœ`MڛN–ƒ®«+›9º5š{³µœ?çŸïumûÙq;#„YË¢æV‰“Eî’Wj ˆºãh>Ͼ:Ŷ‰0œ8ÝƒÖòÒÕU µMgY¤Â¤0[« k+.}“•bâ`ý6пß+;éèwhûp¨56æ«È +s4VÖÐìžÈø,6ÊReZƒè~wðèÈHKž¦à4> =W‘ÿØÍ _)˸RŒLn ™Úc(wª^cA`²M@÷(¸úU©àL¥ÐF™a¾ðW,rÐ0•Ò¢Z"ÐÀ£œb’“E ´+øʘh”jÑp¡ËÈã1Ò5H`¢*Ì-H`£¹}o €kD s5HÍ{NEJI§ÆÔ àˆñ j/F“&€ê›ãa€NФcQ˜‡qK ÀYƒ|GU²²8h÷séâpšñ#NWï©%ºè1›#ÂN^nÈ¢ÒáRnGã³çK*P ¾^ˆîoY@W“S¬I{ÓÉcÕ§k]…M}x‚SìÕúmíAÿ~¯lÛÑNi¨èyàØâèQ¤ÜïdÀn §£¤>B¦‘a!#¸À+ƒÄ+@kÕ(öªû»- «Ì)ëVìŸç•y¶}íÆ¡"鱔rtz# sÖÅAù"_ DœWð¾Sœgä߬q­²F±VŸ×%häÑl5­²Áº×Z5Šñÿ<лP+;éë{„æÏ6°†ÄÕ¸GÄyà€CâÎ_£á:²aØ*Ì¿¢Ü<`†ó˜ö˜Et9¥G¦udƒ°µº å֚ìÁpþaþ”ºW´íã%µ¹;açæQíKN†µ"«€–Š~ÒR-=edcF1뎁)÷ + aîërŠ5Ú J–M6ў╙ˆÐµÚ íëês­µ®“žvä“4÷mê-jŠ!ê +È`/7äQƒ“`óÙ(éÄ Aõ‘B£¸±Ç43gçúʜb­>¯–B#î*KRߪQìUÿ<лà•mûڏê'è¬pWY՗”—*Í62ÌiL+ü=Žsàî©B¤Á‡•bš\M£â2B1Í]eb­Ó¯ä…"Ô¼k• %/ôz×V+ÅZ­Ÿ×¬]h•mûÚq«XL6Á…ÍórCÆ(ÊnIɒ»Œ¶ô¾®¥Q¬3€ø”©ò±¯Ì)Öª~N.3A‹µ2ØìJצþl¯ÕO«u}²j¶½ü\{s›Ì +i4pQS/7d ¾h¦À¬21/š $@ê^:JÛ`ó¸zp@œgî+sŠµê6&'SÅmuÁ4»ôm*Áف}[}¬ë•V´íf? Ÿ¢l™ª„ YPèË Àº 1å^R™ã<Ù¹)ÄWŠ)€vìûs¥Â€½®F±FÝ[mä ßkuÁÌ;¥¾M£<¯Ê³}œ?èðº¶=ýÎ),1¢‰ +¼œÕõeĨç\P¢çÌ;(#Eõ/rbûÙú%rbyÝBÄJÉ]-•`m¹æ¯TÙޑ®ûZOÖðôÖZîããý›Œêmõl{Öû~'Õ­„¹ËÓ©2dìÎZj\ VoP0µãJ0¶»¨bìKQT‘Њœ`íÙ{•Še^åaCAh÷öŒàÎbý,¬~x­hÛ¿ïjCòDLo™q•äË ²álF|TPy†I¥¡À4_)Îáæ@+¯?ˆAXúº*ÁÚtþ¦Ô¬÷®¦bQü­ÉÒå:é¾Íôï÷ʶýL¢Çv@§¤Fp +ì°Ê¾\“aсê^ÿP@Ÿh™œ`²*<|1u êÊëjª”Ú¤½éä‰ÝÙµºh- +¥k³RìÕúmíAï–W¶íèw%!ƒ§Î–Ôgt¤K£N†Ì€w0ìQã•õÒHR ¦܊–ûç°íÆ¥¯Ë)Ö¦k“F†³PV؎¥kÔö¦œ?W¿ß«Útó»Y 4ô ԛD|ÈŁØN†Y+©¦&EäzBeœ±aa£Xߘ]9öflj•9ÅZõW<)³h• E´óصZ)>úyíAï‚W¶íëg;„Y +êð øýË5µÔÔ³-$Õ Œkń‘X³-úƒ"œ!TW™S¬Q·÷(Y†ŽùñZeÓ !S­ÕJy^¿W?¯=h=hum:ÚFðsFȽ'ðí3ú7KMí¶‚vâF UEvK·‡<–ìgõ +×]«RªȁH ԝ194»ö˜nÙÂ4rƒt#k'pƎ螑ƒï͘.;6<7Œµt*W87¼#Dß­ÐÜ0€¿Ñ.—–;™O…³‡rK{ÑP‘ܳé(䞁{€¤Çqg ÕÂÒ`Üy‘MBCqSÒÓ[¸aJ6Ԙ¸GZŽ ÄM ,–k7€@Ó`yÙèk„0GÙ¼b¸OfþÄæY`'®Gp7ªՑp3——xúp‚ßÎpOÀøT©Y>±XºSVÔ=”ºQ rÝ*2Tvk¯Go·Ïªù‡[E'ý{èÓ*¢Œ.6¬ ÛN®ÐíYtäçŠÜ†Ïƒ?÷Àmx¸Á*n[¼œ›©Á¶™ˆ¬±GÀgCE¦¢¶Ó¢9û¹‚l˖_U©É;6¹¶XíГ†Ð6Èì¡A²–àª"²'¨;[<6´÷†ÅžìK*Àù°LªlMĤØþJD:þ)ÄŽVË +‚m’¯c¯‰Àø®¡×X©9. y8/xÇhâð:c†»ÆђTa×LQœÒu-Ì'Ìdl k®ùXÅ\—l„äzdþ¨UrÝg…\Ÿ.×îÞ1]+Äu£JšÉ¤:pu®f²Ú+˜RŸ?†x‚anõ4B}nTƒH·Š EÝÚëÑÖþUFlŸmõœô®õ†¾”ÒhݨmVuO#¨!o1Ö"ä2²¦A¬å|žûjœ°XWj…D׊5mÍ­ÁÕöM•Ø>Úª9é[ëv` õÇDR‡Áv +ÂܨuöŠ íÍõiÿ¨úPíI­dÓ³K>xø'æ_A*¹Â è;R.«HI9ÇK.qƒ¨„‹}œs£dëfnx«É +l£S+Ò+ª0Ioo§lßUÉíÛkU§üntšOÊúqñCÒ°ûѯ»çxÿòé¯îÞ<¿{õîé»û“Õw?úé«wgÇ_Ï~ûâN;ð³×Ï»—Ò¥—~õæî÷w|úë×|[ûà"­äÒwñNž¿¿»ÿú÷ï.M}öõ7OeLoß¼~õþ‡v÷»wÃ#]½¿{û!=¼~áÕ ºùáŽþóýWï~qfožèÝN7¯¾²—Ÿœ½ìé¿ÞÿáW=ñoªyŒ–EœoXT…( ²ª§2Ӓõ¯ÕMO7ÿПj“µ†ßZµ«69Ù?ðg}ç©ë*þ¢w>Ñ@.çÉÀ쨩AË)ã4èåÝS½¼;®“ç$ÙFîÈèÙçAEX ²Æ#°‘o&pû ì) ŽÖ‚òQrU¼{bõ¥š†`ƒÈ5¡bT5¼ZŽ +XMР{g$׀éQŽwQÍèì™ÎïÈ0UÒ»3,v=Ãq„015 …>¡\`ãk©1A%Gí#0bè”PB^”¦Ö;½i (€"mÍàízþRÏCÎe훜êK +Ìi±pfEJæÙ úóÌ<Ð"ÍjßzrœG}1ÄE)‰³’S›06 »Wj*‡z +ø\²ð¸¬ÊfŒs=¤¤ÏãÈKؒ»£HBå‹b8~+CìB,"O˜×Ù½fÍ0‹ÇÆ!HIaêš%N4­3·1•ÅZ](!!Òí1·æ ªq„Õ›†>eµ¡Œ‘ׁ8Ð HLúq‘F«Œì° ³ÅÑÁÌÆ ´ÛÕÕÔg:á $-³3À¬  ÜÀè9¤ =å6]–'XŒ…’ôGnÍb›‡”Ù?˜Â0؃‰•±¨P'Š¨‚ƒqÍ#))øUæ*¸BmaFìWàÚ%u"¾÷DbñÏ°vü͈l3¼Ÿ@SûD1Ý™ÙF>¬=dD=¶pÐ]¾ÀGL⠁ºn—IݯÖ â0§î½01åsN“Ö¯‘ƒ@)rܬ?GwËÃë=Ó3ÆžÌE¾n‰–bý(‰(Ì´Ô)d¦ŒZ c0’ž¦[±0#°‚¹OR‡À;ɸD@`ê X†"îm-yó؅‘qÐ@͊iÊR-ë!NsL:ÌÓ{:F#ÍäÔaü)3ü .p9A¨.€Xç‚Æú@Åh^)ú "Å@z‘Ù‚1ÈÕyD*âó {„€‚…g)šèl?Ï>&ƒå@5Øk¢\,ÝkX›Ñ+~^ç€ç‚F0£˜âj4 ‘9):##´=/Êí{£¶—³®Pš…–‘·xM@®Ðz„ü s<'¨Ø|30‘LægšxŽò‹PýkCŽ¬Œ9#¥5Êx(‹¿@½•ŠDc0†å¡fƔ ˆõÍ@eMãD#n(­\iÒì¥3ÐI£:iq"ÍY2Ð*ŒË™ªWrÀiÿFë‘îl@܁\Û¸}΅™äsYÍ†×pæè)!ËVËÒÂ¥ìԔ¿5BÖuˆ +¸¶'ŽêTbFZðE9©•£`ž‹LOÁ‰¼¨{¯@ȋ]±0#¡ß‚!avR;«³-ž‘~{šcâNQVe•"q2Æ?¸·Ô s,ãV1He?œ¨sP6æâÄRlM€©‘€# µÓÍ‹&&£Ž¼¹a1‡ +­˜Å‡Émõ³õ¶'¤²qJ;'«ËdTl LŒŒ8†·1ª£f,šm|žÛ}I;ƒõ nžqÙøʼnybe¤Œ€cTîéí²L¼(]žþSmâúM ‚·KÆè¡è3—‘J~A€€¯Ñä)¸ÅFå×öž0½‚³¨Øi _Ë@ìB;U0áS Ï« çn} ÷

 9PÔþŒˆLŠfp‚þ¡WuL )6 ó<̆ŽÌ•®ÚMF؉L9ꛌ§!EŠ­°‰A&Ñc‡ÑÂ@SŽ7‡}‡Ì‚°åÌÕ(^Ô3d3=×ÚÜâ¡ ñ…T,I˜eE!ÅýÕ²ÇiDì_·F x[9?¾“Z@ƒš>&*ÄíΝ&€YW W™nTãnLp?ÁúÁ«±BåÑÑòxádVVî‰ø<³paƅ©5ӊ¯MQ¶(j®Í ³,yÄðⵑA\¸ji¯Q2£ð4ámªæ,ú‘9êÉ7ŒE«˜€d)sõè1ë ¢³&6Ê0bá€o\¥R‘G˜& +œS“^½Ä©ãákI›ºpYM%”-ŸÌ­˜‰‚€©ÈªœùkzÚ íULÇh5&Þс-f0MÔ¤Ä2Ù¡9wN£fð%×Çs43ë÷"þ‘¾!).•òª½ +Lÿb²IÖìN¡Àô͘:0¿É®þ™RK lC12;i:Љט ‘>ƹwAÃKgcEx£Þ‹‚ã 2ªØTnP( UŸ +3Ϊ!Úçb¢¦©%GexèIZ·¯«Ù¶rîpú\i s°²õUá>I 4)‹ßhOõ ÊI̗M‰–!h‚"«™`Ä n“e}Gš! ÿ±Þ-Š›ÂÙ8«×åyµ¹)›*‚:¥h!ÄÕÅ Œ–‚‡–P3–AÉ´ªñÁ)©Ï9«…«f…»¹T.:ÑP­ÅÈG†B/ćᾃYÃya_°³ eËmË+3™c ¦?ºî! 2b·ÌÙm›qp̨Ѩƒ£Ëa,äYëU©MLœÐ¥Þ4™}±˜×Åd-÷9…­C®_üHƒ[¦¦Oµ,axcV牦ïDìöbÉÌgˆ +ÚUŒØÑÔ²À å1X Ì0ÕѦ+c@ÓZ3àž°:‚ù.ÌWl?—È›ãßØe3Y5j¡¹ÔK[€£*|mn«>Øc—d)DFÍ»ÃÁžNˤÕÞ!yø˜Ö0¨Ù ëšJóÂ+;çÒ$D¨œ³=ø_` u5ØwÆ9¾˜ÞF¬²HŸkú Raê€7 Ú$+²›vÃ5F˜†wÆn_1LÉí WËbNA†ˆdÙª 0&Õdƒ}‹ÄÿŒJ4 /I#ŸÇ¸(ü™»Ï¶?®o™mK¼áÀY†ïŒÉpw%c¿ýÊ4d%†ä„Ê0Hm§V58Í¢&IX–À':û÷ÄÛ;‘6Ð%ÀF§…W½ÑÀ#œH4•ÞæŽéøvFÝpª|VԐìÈÂ=¡÷“@FÆU4 ¼¤ ÂvYÎù±øýº·J´+ȑRšorhA²bF)?’a;‚ @c5Ö!Ä+\v´0èJD‘rUo÷¤h¬¯Á$ƒRG&ˆ²£);`;Uo.‚§Q$ރ['ëá6ˆ*̱9X5ª/ÊÞï'®ù)3ü/T ˜{pãÛô“ŠŽ23—TCÎS1y‰êÌMŸÜä* _ &ød{kÈô”ÑSEz¿¨U½½…i†—çHªÆÏaУ”9-z¯5ž½ › ‡AãAџôêÙý…I߄;˜¬ºð NÊúôBjfŠ@L¡?ÐL\³ês´®i‹³àá¦Yø`J‹ú|iãTJPwï}¡Í¼Bݪ´³2µÂ ª”±Uf¥¥µ +3?jv{¬BÁø“feHöI«¥‰I×<ºJ¥G/8³)ÊÅÒEÑ  8dž{÷]AÓ©b-³Fõ ëmA““ÎK= +AN´¹LFCÓ)¤N>h‚ )Ù×1 £>GÇ)¼œ’?|g§º@§'€§Çª/×d!L/‰#`Kk€À´§ÉÄ;Üö3{ž5nÖX3➄ÝÁ¤§œÔ]Â[í=žY „9´÷H) ŽvÒ,8ÄP½ª©ƒyÊæNÓan¨°ú¤ ÞI.)܂ÌToðÂ÷x}w•YÌÌK»(}˜´«+rS V‚Š H\c.\} I60 ó@ÅÞ6šÿÂpÛ(¨8ÒàÉE¢¬šéx+ö¤V +ü\׈<4ƒ¦Â<©QΞ¢gÙÿQkƒ/ 瞜ŸÄjæðA½[Iíº@à ³M +*ÂÔg˜©ˆ¦ã…!ö3´B‹J „XÓ¢xPž€€ûÙF0¨îў‚T$½E½[NÀƒii¯Ähw¸#Ê¢peÂEŸ<·i\šŸD 7hÉ÷3¼4pÜi¢ï¢CŒ»¦†þ5$ȅ©w²§È«qRœŒÌ‹¾Ö² n»€…gѵÆԐСaD%Ä'UT¢9FԒÌD€X­)$à3¡½N2âdš'ûå= àG F6é4²:[?AÈ-_ã¢þßÉܘyQÇϪQ?“ÙêñÚà3âé қ.˜q&ñ‚ršz‹mVXØۇº#VÂMµ¹AmOaRd”81*ŽÂ q$‘ž|¾ßSAdö¤ „¥{Ç:Ìëš>gPDS³é0¡ÚÎi8CôX`…SC\ä…wS©¿‰CˇžëÞ?À{p–Ñ+EK“©Y€¨¸à{ðµQ„ø’ºŒ™4¦ÃÅfõvSD½ŠjZÔá„ÕÞí GÖLª} @•Œ\˜±¯(Qµ´ö̋8rEv‡Ž¦Á¹ÁP1:ƒÊ¯éJw¢ÂòfÃa•¥¢®”`Œ ZšÔú"£ À!)Y*šüŠ*U ‹éЎT¿àÏr8 w¶:†w'°»Å—À 5x>E[RÔÑþ™§A ¶àÖlvl`ŸTwy =ÍÔN€k'w7Â(q1`#õ'ŠàÀ«ëA¡‡•±P;[uoOIgJbFʓ©"CË™Žå¬D×jèS«~$¸‚6L8zÇ™;Ï©&.Z´. +5ctf=Hà=0—.Á­¦H*Õ64*¼‚Ô2¯ã$Æt¦þxïJ¦V}ÛL/§OqêxE„xŒÒ◘0ë SèáÈ Ó O¦l3…sOL.®Â®†¬cy„‚Ñ•Ghí×IýçCðöÿ'£+%ÌêçéŽKäDì9¸Dt>»Ì0¶ XÏU\20#®+Ì="°pÑ\5+€œ×›Ü°\'ŠQôB¾t*8 2kŽtLòÀÇÔ Û®ú­×yo2pœ€BrZ!x&Ý*šÏb¡³’‡èÁ¥­ ¢Ê™…Ì´U„®Qº¼näAÔ챸Æ(&ŠM3sŠÃõŠïŽn¢Œj;+ eT 0ÒFÃhÃÚc`$#ÙÀ )BB錌Êj'„ldžÂ´£Í’9ü[8xU3µî™¨ +¹"L¶$'.Z$XD @kv^ÙSq¬ðgˆj¼/[‹üÂîUò×(uMfñê 0Œ‘0|‚Ž³çՐӒ7~Òè”}ʄ!PFK$[rtììm÷›ž (B&|‰<õqouîŒbt0qZúuƒ@@UØÍ䌚JíˆaÕ»h鈜Œ)ðZu[·×Š3t'㇠ٳ¼qjQ·¯\Gƈ² з +¯ +Ã}Œìä_Wí(Cʉ‹C´OÈ0KRÅa§DÆÀzÅo^Ôo£Ç¢¹9ʋúπeŒfS2‘)üSè,y ‚ÿa‰ax“†ûüè$,Qe@JŸ*!ÑÒ§¦f;ˆÌr§ÀVxZi,L.¡Î€f⸣lp5pCð¿Í.zá=ˆ Õ×Ó!S¢F QFÙ,‡ØšCêƒV×ÌÃ?›Yۜ'^6¹쿸•' àÄÕqèGÆt@ ½ž÷ˆåL)NcÚÀË ¨4auŠF¦l"/ÝoÚ7ޗŽÝœTà?ŽGÜî³þӏ”ÝèWþ‚ +‘P;úᶃc™ÀΨïaããH|þ + KÞÎôs0§º‰üt16eÅa¥ à6¢Ý ä0m9öèˆ îwë^Q¼ÔêˆlÄb„ @ì®lÒ<9óhk%(*g +’šG•uí½ –k¤«çiÄ&¦eõÙkn¸ÍY9€(›ÜGª%I2%g5Ñ$cc‡ªL°½TZ:çAÏL0•sÀ›“ëÄ f"¡©þãgÂy€q¦0Qžõ”ÞïÏïœUýÇÏTð BVdöÐîLÙìvÃ\T¨£oÐKÂh_H‹:LÔ4GÆlL½Ì00Ç1–„#¯CT„‰ñ°¤,̅<Üà…öÁƒ°x@ ·1€‡"·CT„ÔPO1ëýØîÏcšpÊ90 Rý«9fÅôç`¢™,‹ê]æ›5ôëPßS‘S`$Ô¼Æz1ðÂ[bFE +Ò&×ØFBa ØÌ1äjÆ ¾ysЃd‚}HaÌO®± £†¨€BŽåúžFpåø~J5ðˆd?5ã"1O¡²(®L¢}à‘K6™´S pÇug½ô|!Õ2љ­„Ñæ–X¼cjïÑϬŠQß#º`,IÈü™§±õ.h‚„’ÔþŔӰ¢äjÛóßÅaÖ0&ƒEeÆ˘ÁDm‚¼ÎT€/7ÇPàÄǃª‹Ü¢€ë¥ì>¨øÙG¥»>ž=«—q¶,v—)Ýf<ë®ψLœ&ůix|6ÇìÀ\nVo–“qǬXÇԋZÂUd Êtæ¡7©Ó¤…s0~ !ixŒsIÿ‡ò4 +õ®­1²gïÆ (;RB€®Çz€îí$·×À!ƪ½Ç&„ 0#¯¸‚ÉJ*†Õ‚˜õ®("€ô¢¬‘s@«›KÍ4O Ë܉ /HêK†Ô2µ;igâô#ûÑDM5î™ìÜÅõQ†Öy׀ÿ‡2\êބLÍP“€Öë +³‚NíÒ4¤0¢Öp À[6å{Ex2œÌ³·W „D]4z0ÍH!|ZA|H׌Š‡¨†'zü„•BÚ¦J‚ÏÄ:…6 /‚é¼D]°Ú\ Ö\Tø3…_•×'䈆3‡ˆ%>†Q¨©-Q3KPnfŸHÀÚ3c+F¸;uëÏÈ~ù‘r½½eD³¢/4™àn½¯g4û؅Ò̕&”ÑÇBRðD6dp#,Š±±÷ŒZ’ú&ú$¤z¢° tYÂõ±ø%ÆÄõ#×h@1äR……â"ÃÙ lè9쑾?àá\„ëo™G“ýwY%½)Ã5_tŸYD§ätLº#asÖ8¶:LçðíÖÍ5Žð Õ‰ûo¡ÝüP§ZCøF£ŸC˜ô-Ý9d‹zÛ}8À}CQÏ<»„ùñ”* 3~Jö ^óó‰ŠTæЉŠŸá…£žÌœñTZOlÛc G3bJ±úà$®LŨSŠ¦iªæZ‘ŒCTØÄ8ʨ¸Ì~6^ïˆ[x`‡,a¼ ¨ kts¦>q„é`xCQ$7¯!i",S3G‹‚IÁÄÐK>ÒZŒxAå­?ÄˬþîIÁˆEW )ìg(j_#¥û©÷Yç½&›H{Ê98nôNÄ4êiïÐ#ÂNè!1 ÷Æ·r1^Ó ÷í5€:oÂââÕSCBÌúœ²R¼I,Ò»@|’9S°ŠCºçe‘£¾©¦$@úÀIéÌqY®#e‰E“ÖΓ:ÜGU¦ +°Ð?gÉÄy+‡^39«Šä·B£kغšqMáýö®dfNs`Édœ=b)]`§‘g ÝÅÕůKñD>ÿüªã>e^RÏzGÐ-äa†ùõ® +Êx]~QÅ6ÕkAÌ¥o„¶j€ŽÝ©ª€_{Óöï •ZÉEYJ(¸SPSD„öcí=ÓªjõJ Ÿ¨ÉŒlŽQ ªõI㢦1FO.”·Ô$§½nž÷Ó¨ÿ~ØQ ¬­L×fà´`Î%mŒ¡ƒ >iðܗ´îv ²¤«:P§ò’Ta£j–֏@·¬i;­h¸½°ôÍÁ.žx~h2è6í+‹â-F»¶V_Øÿ¶äµ DlOàJP$¨½UÔ¼X˜ #Øɉ!ƒƒhœhóð×Ìb‰Ì‰aš“áHÑh6Ú¥­Ì;т÷¢a>š ªàýLŸÁà‚¦O¸%0‚ =Óµ01Y䬈Õh6.äf-îÆ8ؔ¾®,ÁXt]O¢d»ªx†öº]O:g3Ü1VÓÂòjÀ>À6Ž"×+ðÀتe QŠÄ¸&…‘yµ¤Úeý=]ÿ©ù²©Œ•?Ñ4f;ëšo–5Îj®é<&5¬ÅÔÉS Æ`ÔQ`^‚]éo‡¦N_¦g ¨ÄXèÃÉ£bl°ž¹Ý69ꁋȞ-\¢,Î c3.óӆ7àœž´wA‚ù)=‚Ä0 Ø䙓l`Ôd8ÜyÉÂþyÄL¹j»|VŒÒӌg¬¤¢ n^# 9Y¬¿Fä9¨~43wCRÄq™,½†½•5\%šÑH~Ô >Ñ2XKžbS7iÀeÔ¨>…c‹Æ[ÞsgÆޔ{3?|:pá£È邁@`hðí€àf5P£>¥qÑÁdð”[sdfÈQ8ÍI4Ô>ÖËÒ'C~C|oƒ²°`¹)ô5Èl™§€¢Ñ‚›# •Ìþäïñ°­„$Z–k4l ‰?wÍÙíᡚiöEDálVG ¶¹ž‹‚KM jæ˜!,õð5¶wfdNn‘¡ƒ9ü¹ ¢ÇAÀUo7¸¾Giü=š™-,„_‘>êÏ‹4gÔõ­D¥Ñd¥ÉÒ1M^V=p.¾1ç ‘ŠÆk’}3š(¾w <¿?~sQÀ‰9 @ É®ÄPBÖÃ>ÌS ‰­±Øõð£e ê4™9Ä{§wÕ,ú¹c½â}ªè«Gå˜Xú&¿ÍºÌÀÌ4%´BåÄÄVˆ«tž¨)Ðæ`1çb1¯#nWD}Ó-ëÒÒKT°ŸýÊAí»Å2{- +ë!a݆þq ˆË¢ Bd:d›º­Èþh`Ò +§!ÙréÉRââu¬³zQybåT³ƒ ŸMšËÁŽ€A{ó #™`^„t=Gõw2ñ8¦ØÊ]"0î P-=íȨ=Uz©SP;µDø½ËK§¯õv:|àÈú:gÍ7ÇNó¦KpÓ¹†QÁ +k.>Ìñ7¸ËY[² ‹FÓ¶{ƒF5ý¹¿byõà),jXþàê?hööЄ…ÅШÅB1év«‘Nƒz^T—lº&¯—ÄHgó03Ñ2~“WÙhr¡äãOá}8©%Ě®„W¯•ió±â‹ñhðN°’T⪓óŠî;l&‡ð"Ƌ;aè fN-5ë2Ì®X€¥Æ»!Wď2õâbv‚b™;H€„Uìjx ó•µì)ƒ\é ői8<ÚËc#Ø{Y‘2 ÇÇ 7H¼|V\#MÐ䞺.‘ð‰Y¸jNžÅ@ˆÌQ΋û&͊‘—ˆC*6#æŠÜjQÕ.ÛÂÂÏÔyہïÖÅÂ@5¤%ûˆŸ™r±8ÔÓÒT™À'¯fC27j>°·ñ\\lûÒã¨B¬LÅÀ/hrta!ó̀yFžbž5kqTîWìÜç{ÑLõ蔋…”û{jP±™I‡ÏAEŒËœ4³¦ÐsCc`‘(Mƒ+£Ê8™u‚ã«FC?X-EȪ-U9À +düô܁½õÓxUÌlN1Ärò&KµEÊb’¥9ál½òžzü@ý‡q¹5TQ«Éꬶ¹¯î[`'g]Y +€¥qjl¢¬‹£ÙS4НûqHŠªâN©Ù*+ÅE6%Ä„Ï&ØME‘ð¥bè*¡JKp¶¨¡‡Y=¨‰çz¬2Ìf6< 3–4´x1Ä=ҍ(λh£z).e‹—ä3 „ ·q¶é v­i' +¯?}ÄD¥Mz‰A¶˜›ªfǀý4—}D H£‹¦œ·l™Q]ºLJDž@«_<ž²ÎŸ£”‘õD“vZ¢>B–lGjÊè`у±F Ô9 ˆ{åi]lM Ã*R`T Ø´?Uüô1^ÁŒªô7ä†az$Í R4”J ƒéuÌÕ, +1jö&LÃ؍?¢vqðAQdvºÐ™ï²8o™PGˆ2ùdF™Å€F[±éðÙ³¿½˜gûcjû«É~šøø#3ŸÜ8k Ý*2v/ðç5ÿñ4k]M £23*öُâΚüWß²fË} ™¨•>õ1ôòŠg>†j‹`šø:ôžUÞc@™òÐÒãg|mÍzŒŸصÊz̗T$ Ù 5çšâ8+ÚyÙd<´àåšð¶\@ 4ßqÀ Û·Kw ì÷ƒg;F´è R¢á¶ÖɎ{*ÓøâÖV`¢=Õq –bw•é8ÖDÌ5ÓñÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc`òÓ% Ðqw.~'3Ó'à,AX +â$:>=Ón cÈA…2ç˜iø^&ça +æ‘Tþ&å˜Íœî>!ÇTÔûq 1Q&8> +MÀ1ÿoxcŸgҍq˜zŸn|Z𶳍Ñ=‰£!ÛlL#mŒ…˜+Ù84­ 6æ'×x¨dn§c­ÐÎÉ4¾àV;‘Ƙ¦ò4æl~>“gÌrµRæÚúòg±¯à‡ˆgŒâ¸ë9'ΔŒì4cxÄJÁfŒÆ@­ôÉ2¾ºbOÊîõ!F¶œýó噴'AÆÈü#S¿qŒQQz©ÿ£I¯¿ÔïÅ—kgc~ aŒã¢öÀc8[¨³ØÆ÷PF4øÅø¨Qsøbœ;¾^ !®6àÅ,ƧðbΈàäoðb͓jddÒõIx±$o¦'¼Š·b¤ñ¥v½œÉ.æßT^Þ lHÊìbÜ~v‚]ŒöSÈx¯èb\v"–RP}د‚\ÌIU6¹XÖ»'`†’‘À²Ccކ.æ{3ÁÅtq 3]veԝ[Œ•Jµ[ ÐUK–Т(Z™ Zü ü;‰Å\;½|É?·e^+¯F|[+~< ­灃¬°b¨0«ŸÁ¡ã2)iõ¸ ©øiúTTÌw_²8ŘLá"o˜bPb± Jñùˆè”âÓø“ R|Z­bÀðÃÁ(ÛZ» Q|:ª„b”<㗂PŒ¿ÑD'²™`‚OLõ|»O ¯~þJ'&¦«Ü 'ÊOšv¤5641KŒG 21¤S¨¿zwÁÇÆ%F¾"à!w©Vº bǽS‰‘0è"s„aè13‰‰¿/ñ®g4'€…A$ffúJ‰{‡xã7›#Fتӈáqøø6ùfV©öØٓR ˆß]¹õ´œ“ø]Ç"FåäGƒ°q²)%ý’µ¬bò4Xߨ€<“„Øñöc§ªŸÕħµ­A Æ/‘øo²ðYÍ[ùÃ,y&¥˜Eͳ‰>Œä9–+|Åøíz’=ŒªvÝ-eªݹƒ‡ÁPÅûeÎðÉ®ÁË_ømÐa@¦1Ks»Ò’‘üÍRՕ8Œä?ÈæW‹ªóÏ7ŒbAÌWA~­¼Hý +Ø0úv6NÖ0rîp5 ñp'³¦áƒX€ 4 ¯Îfp†1Æ0qbÌ0þc£ Ÿ<c ;8î>»€<aF~d§ð7[ÁƨÒw¸0<4òY͆–ßG …¦—d# #ÿÉAX`aH+!å ®pw_Š +LÅѓ* ̓1¢žûR–) ˆ%„læÂgk¢0 ü¸W 0Ts­× +“øyžÉÆߜíVœp}„÷ špUˆ1XÂا;I=/ñn$Œ$6\»à7 \7Œ0rwUlv¾ÄCL¤—wŽ>¦+CxeÛA=7œb„¾ íy#¿Þ^ÂFš‰ =@ïoôàC¾„»‚4ÙÁ‡²©;:ØD»$ãõÉ >8ümÔ`zHc$4êͦ^–ªÉë\,lÈ`€1o$1 ‘>&0ø§iç[û¸`õdWë·‰9U<Ô@s£V')nýî +¾4F%'xˆ ™˜àø{£‡1 ÁbÆÿ‚¿J_iAW;6±‰×οW>pŒ +'7éÀ~å68ðÃÙfÐÔ_œÒAä_PyPà>vêo© ê/UZÕ­±•Á¢në©oÔ_îÊ¢Š aò7øúõ–r‡~(©¿¤åò€†þ",ª8sP_çô—‰:}W¦þ2|$µ©¿ÏëÿÙg£þSÑÎdþ‚?YË5‘¿èNÆ݈¿°2UÀ_n6ÎÉûŁÞa¿t$ë—A/‘÷‹ ᔳã~ŸÇßDÐ~Ÿ"ˆbÂ~‘“PYÉÊúE,ò°*Œ)÷›º›IúÅßµžo ßkÎIù½í2%ä—Y“ëycü¢~ýe"~›S¸±F )«¾!~yÕõ(“ñËÇÇ2›È5E>7ÄL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK +*"Ê+Ü·P pŒ„û*0ïԆZ^Z'ît_jÃmÕTŠ€{$ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿéWÒ}•  ˜ow +ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥ÜÒM¸/»STä)UŒÂ|v¦ûò¾°`pÅûÒ +Ãx_fíì¼/ L]lx_Xƒ +ž@¦nÿ²$À8‹ïy#üŠ+QÎ$übà}MüW~õÜc'üҊ×8¿8úӄü%áN\ᗠü[ˆtãæƒð+Ãè;á¿GÞn~ù•-¿˜<Žkl|_fúÎk$ߗiÒRދêVv"~1Ü9ÏI#C¸ü >GÛù¾0ñÞچÑ}!:†“¹Â}ٕPad†òþÂhämð'F‹ì;®L(éxÎkf/: 3³±p} ɽŸ°AèȾxÞ3þ^±¾i3Ö÷öô¼^0l±¼Ý¨¾×©(undÒt0}ãïé›6}_çAÍb¢ï}¨ÿèÂó½=dÏ÷>4ôÎã¦n4_ìÄå¹i¾·µ.ó½½ÉË÷rƒ£@ù^Éd6/©®½%Ǘ xÈâÝH;l_ñÞÄ㥠†/‚â„ü®ßëprÔßË­i‚àË°x-;À™=œ{ð{ñ ¢„<ø½W4~Xñ½Àr 6Æ:©„÷Ž*aüÊî¥M”cf³±i&÷‚¦tª·]J1ÁkãLn/ò«Èˆ Û æ°Kµ—šGÔóڋŒ±ÚŠÙ{yi¹!{Ùû–¸"ö¯“؋óõ~ãõòdÀ43®wxÕ´^"Ø ‚Za½¬vÃËiV/kâ T2ªwd!õf÷Rƒz££ø‘_·9½ { ÀLï wãw¡°ÇÈ»Az!FãB'6z¸ð +B/‰bH¶­€^QŸàóâÏÁÚdñyo++6]ïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8ížáá°fߢ‡f’Wñ;«Ú~‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Õ½1€"/)¼6"/Uö]ÀWá;HE.Wy…©ÏNä¥ò‘Ú…2•ß 4‘’ §È‹¬Nɋ2+²®UÿË~S;Žʪ¡ï‘®7|ZŒãe”ª«trÂxQwMoŠiƒÆK;Z­5@4’¥'‰"s¾âZ͍—!Á“ðI×Oa‰`›q¼ f•²óxíaõ¤q¼@d=DI4ÂÚ¥ñ'Œ%T}¢x/$e®’(^ÀöﶃxakDÏH×Ïj³~'‡÷òw±ax¡²CþÁ^ü‰¾á…J õÆà½Ü¶'¼¨õL/"9ˆlÞËÁÖà︘GIþîploÃïòDL‰ñ»ÃAÃ ï’ +uíì]6‰êEèÝÁ¨Npw‡3vw˜E¿hP‚ÐOPwqêM Â't—ý«‘´3s—5êåNän·Ôk#îRð\ ÜE I„ž‚· èYßx»XâÜ.ÖhH´]ü '~ƒíBƒð~°v¡ÎBn(P»@Ãö³‹QD·³{¢¾4»Ðâ`Ž!vaDì.»Ðð n \h|Ìɛ…÷gW>$ðº§zŽ.û¼NüÞÙº(¥§Lݐá`uQUCÉö +Ö´?\ÝÓ́«‹Š ,‰7ª.ŒøŠ‚ª{zÒ ¨.ΤΗ)dÞÕ3R Î˄]ø,`*4µÏ™\/×Öêb…„÷6xº¨ª‚kÃé>Ň wf +˜.$Ëäë­0]1ìK—5EOO”.4Øö­$]ŠµÏ3AºCèÁÑÅßñCÉÑebà°`ëRÐ_S¸1º¨uìj£è¢~±·IÑ} S ˆîã8òÆÐEVB¯IIJ‹˜ó¡Å=«Ö¡Kë­&ö‚–mZždè2”÷vƒè²U:bÑżϰ_@ti@œo…è΃(èØørŠƒ¢Ë¢;6Š.\x9”1ƒçEPt3_¼Qt顱·Ò5Ë9#F÷ƒg7ƒbߣû8×µStò= fðˆˆoopMôXi´tQKp¸šêâžhñe~.öc2gÃç²r³Éÿ&=÷ n@q›cŒ}ƒçª2¢×eCôíÂ+ŸôܙhZñ¹ôá©+|.WL,4=—ÃáÒºÉÀeÜp\.p@ðnªÈ!ÅÀw优ð\ÝõSÒsiaߍžË=Xdz./Ӎé¹ù÷FÏe8ø çªžùz’žË¤K+Vz.#ðlx…ïh5è¹t—ñ„6z.-hƒž‹$ë°B`|XX¹ÑsyV­%<—Å6i<—u e7x.­üÚ Ï¥£á¹éP8±ÁséâÜž CÅWð\(°ßè¹\ž6"8˜A…õdàs9lÜÊQM|.—«¸wÏÅ[Κ…Àç*óYŸŸKPzq>WiøR’Ÿ‹$‡›ŸKZJ—`Gc%°‡ˆÛ?Wɍf“ŸKѪ½‚ŸKC/Wí±Oá{W|.|ºçÆçÈEãs±oӆυ>ƒÍíŸË< cÎO€~…C6€.ˆf̤çfp60/@y¾,@ÖNÊ(ºà/с‚.RF Am]à°v ‚. tó‚ K®A—L¤®p5gGA’’ŸË½Xö³òsËiß.ø¹( æ¢$ø¹ê¿Ñs™M+ò‡©dä9w9ꟄƐïoô\Xõc¦çBÚ“ô\ŽÙè¹°v<ð çr3ÞÓsyä"<ô¤ç"9ɱ.è¹x¾Ö>7 ?wZ ÐÅáß2n¡Šº¶ ‹¤.=µÜ¬zÝiXºi €n!( n’ºùbn]fgŸIÐeÁ5òèAÐez­ªôk +iÅÒ.ºL®a] ]fÈhÞº|í±¦%C—ÅÜHA™¡ËÅJtƒè/W: ºLªûj,àÂW¸@t‰j<Š%—>µ3ˆ.?.ç¹×N"^„!ºøs ½].–f©2¬ÌE—÷±%Á‹†CêËÇS•Ê5E—9`¦­ƒ¢ å+wŠ.¸dAÑ%áR#YRt)Cì¼Qt©mÀâ80ºpÿ”Ø Œ.^B¶Û1º0îœ]Zðh£K µyF—Gì·±ª|Ñ ÿco`taaLlÅèÒ7eŠÖ]BÄ®ÓÙ,PÉ!lµbtӘ]NW»ÛêI↱ùà†Ñ…Y¯—1º00|]n"ÙɊѥ™*0ºâ°]ëŠn Ò§¢KE ¥Aхr…ãGbt ¨nÍ>1º ³²;0ºt螅Ë€W¾bt¹ò9¦ñ±H!!ºiغÓj¬ڔD']¾‡|ó?Â*€5Zäx,]ç—èÂÙçj-ø¹C£ÍŽÏŠe$=wHMžðÜ[~ÁÎÎ}/‘r…½UäÜ;ÚU®àܛ\äeŸ‹UWA͵–u§æÞN‡˜š‹f*¢½¸ŸTu*`eæBcŽü®™¹¯!Ú0ÚjÁ×F̅>`s <îÄ增³õF˅]i)Árñ·2R‚åâoԙm¬\R‡ÑiϨ\(îñúäÙ¹IùFÊe>µhJP“³˜ÞEo >üÈN.ôC€Vi°mÿ€ä¶Á†ë+!þ’?ÈeO¾£%°A„¹wx 7þ-d:ÕmîX´‰~ã +ú-TeUxØ ¿ÅE¢%Ø·¸ üŽ E°²¨/á\ì"Â'”%“L§÷;¹·Ãȃ {;ܲ!¨·Q[ÐÛa˜ÂƼeW‹Öy›²&Þ6WuoÄ[(«X˜’B qÓكw‹¸/Ý wK@Gy’v{ºµTÀnOK07Ö-ŒˆYê¼xkAºÅ/“oÓ9ï.+Î-|.ø5¹EEXƒÜRm…·à à;2âwï×F¸…‘]S ¸!aûàÛ6'^6¾mko‹¿2Þ"È°ÑmqKà¬ܶ ë$ miÆlh[Ô@±Ne%ͪâÛ¢Æ +ŸâƵeñöWôQ ¨¶HšŽkgÚV;Á´ÅßnÒ# ½mk×â/¶Ý/x¶' 7œ-2,.)3½P„0[êîsgٞhDvô¬zÃÜ /2H¶ˆ©µšY’Y‹ŒkoÌZļŸY‹÷–í!L¬¥Þ§½k›¼œàÕVÏށ«e-ôÙwZ-t ãJV-ÖĪv¨Öä Uûz½'©öd,±¨Vëž^wP­ÄXïT‹@¥;xKér°4Xè$Õ2ÛÊjx9Dý7 éƒküí½oŒ©——ºIª…p¯P€jƒ[œZ$Ó(]1µXÙÃÅ +J-*ÆáΤöt=âƨÅõH/j–ƒµA¨Åߗþy®>N§àƒO‹Œ%Bþ§%§eôN{ºÀ3‚ÓTaD è,°*ΗM4í]25K#ÖÞ¼*ð ËûK ã%À,ç ü]”ëFÄO”UmTZDÐ1;”uA Ÿy#$óèڐ´÷­•A iÉb½¯d͂ԃycÒ"Šw$Œã–Ô5x´ñ÷†£ cÐh/ÏÃA™…KҍE )#+6ÞE‘Ü Ñæß+ˆ6ŒÁ¡%>÷~C{mlZÈh»Ð´‚0‡Ðr0hIœS߲ҢåqîðYÚð…{öv÷¥`ÏÞî&¾¡g$íOg™¯–³"3´åÙ¸³ÁL +ìì}»1PPgo‘;tœa¼ÁœÒYÈ@Îâïªõ$ÎÒXZg,ŠŒ—ÅêU;ðÜ6Üì3»Ê±ô0ß16˺—rî¬YšªRÏQÖ§BÒ ÍÞ^ î Ù[4­ÄÌ>±è Ê,+ÓÜKgj‘If«³8'VNbµ8§á´1‹$'µÊû¥*ÌÎc¬|Ù;’›ÆËÞNöL6>ù . I§Â‚ËÞEw0‘±W7nC˂¯Bê`X‘òy&W–jéëyÃʂ4°_Pe‰q92q×1«vSÈ|³pWлCþ$ʾ ªd݀²Ã1æʎ#*M]°œ†);bÊópiŠe'ÚQ–bnæÅÊm²GG¤»Bl'ÊBi¯ºje)ÏwÜ·k˜h6S™H3•æƒñèwÀ.éNÑï,ÙÓ‡DÉ"džâ ÉR¶Ä¼óJ’Eb«ŸÉraå­PTKX¥sÌ©þ@ÁTó`mr¯b%FËÅäVŠlǒ½ÔyÇaP]¹²ÝòÄ !‹.‰:s'#óÙwwæó7w˜þž ûw#Ȳ[s€uáÅü˜f +ˆ!ÊõIMË£¤aUtÕB0g¹£y;GOx²~â¶\b<¤#rdÆwÛÀöuª) áU%'>,(«¡ð”.©Ck«{ʵPPtvë:Ü\Œ‹ªzyÏÌÔE% dz«%´¿Ý ioa‘ª÷;_è8¡ÖÇxTt– SèÄßtw4½][‡ÛÈî<ÇåÞ帻êfv¡Ë*Áü^Ã[£¥äÙÂ[dWÎHÁÀ¢°~€dXê­'W’ɀϗ uÖñ)®I‘҇ы´\—6d¼Ã+ KfóÊCóÌô)jhA ±²4"-Y>ÿa–äLZîÑ]xkb7Ӑ)"Bõ{¸Wûv’¸ñœ"×⽐¼ëZo0Í,tÀï _ ŠÖ°g¯GÀ5ȸÇ6G„9ØvÚùK/n¨Žø Œ´0„$aïiá;b”ô3Šžbñè“!P *|©MÍÙ~";ì© o3úøxÙ)+¢ 6ьT᩸:Óΐièo2TðgÉ[t<¢|B“½Ÿ*Œc?T‰3œä#…\üÂð ³Î’çÂòzdqîGù_eñObÁL˜Oqg@Fãø¬ñš`ÙÞ3G3;^U«%Z8Bó±OŒ»ªÔZ¹+«*ifö[ª9.§Ûa¹Õ¢Šrã]«PllĶtX>±KðÃlæF-EYTeUd¼oJ ²,ñæàG•F%‰Ï±Ž‚03™E0;þÔ9`’!ê9ÊÍ`i9s£Ö@w™ñb¤y$®Ý8½<š°8ÏäˆMÀ{¡« &z²EŽy;J…÷–OF¨« ©«c~L„"=z-J æ»P…ðŒùåºMf·êôGÅù¸îûr¹šýŒGøœË¡c$†é*6 d)ÕeµDz(êÁÁ,ì#Ÿ@L€¢(ð։ páA٘«ÖþXË*ùé+`“¹ÂèY\)Šô9n&¾_WÚҙ¤ÜôvÍø÷éuŠ]ÖåÓÐÂGI©X´—ÝÖuµb™Ž*’ +»4èú;"ã 3Å(#pXˆâ†Â oýՓ:fB `a¥È ô×`¡ÜÄۋ]£ú• ñ¢~]Â6ꬳ?˜úàØb¿ët—ÜA[É,,ŒÊ¦˜Â7\é_ž £,íp«51c—¸ênf,ªlM’kŸðáµ™xÓ£4}³Ü5§y²5/‘A¶0ƒ¨ –ÉqªªQUt]©F²£YÅD¸z¾§ù«‹åµ/}i%ðƒâìÚ%Uó=£0‡ ¯@6¹Sî6¢Y ºÀS°Æª#vöm†¬±Dw°‹ƒ”{j¹5oy´'Wc°6Â&ö·ž 'e_êmYû«P zKÍÁþ¸¸ª%——S¾sàÒ÷|+¹M ×á×íð6«™™áj¹«.ƒˆøC¿¡êOvºÕV}Â`9çºáŠFB#†®€·^Ñ{ƒݸá¤×çXrˆý×­«÷Œð@è´Ãñ’m\½âaM…wr–àvŸ©Ôóôr¨´0éW5_‘JåaÄ~ôã%ïÉXæɦ’Ôy`v'z¦ì.ºë܎ÄËÂñýP‡»R%†úünz ïÁõy¥›à_X#‡õc¯¾o£rH÷€ÙÜÁì²\Ÿw×Ê´”bn l‹b]IÙ¹!Ú)r²¼â}<²¥íê㦴­œOÔVtûTŽàD„Ð8ù•#ýU1 +^Cd2dú0#hZ"8țܕAtsš°|êъWJDîXw­¼kxŒTÑ.™Åƒ&AÙ"å~,s7œD·—Z´¦¨{!ð +¤ž¾ƒxK`J_bŽÀ‚òGa>M?”V>¡nD^ï.FÍÓ&€h»* ‘<–¨PVwy×á1“Ú©%G¦<Ÿg‘–¦²rï™f—2ÎË(Z30%-¨ÜH[ü⇟77ô +~)“Ó"AŒ÷ ëiB7مü |ý\9çÛ 4 ¼?ÓKJ5mV£2¤Cn +K²wíœ4—òÖ Gxíè=T9á; Ê–>Y=ªêâáwÏR¯n<(& +`áÚOtŽ‚ °ÑQ§rÿV‘„ÛÉ=f¹"$Æﶻìîs¼ *Rƒ4NŸÚíÖ6KŠðÝxFlðÖb –ÈWñ´xWªØ¹kÏÀXÜp,ï—ÊLi!ϵ£ÔôaW†«Hw™ŸZQñ¡èa |ß^‡Âo£T»^nú :N.[( hl„{Y¬‰GAõËà­w‡©ˆð(XU +‰áÐá*ÁUqÇ!ÔcÇ;ò¦¿-0L½¼nvÊw‘,Uì­þ˜=Ï]U7] ›ß$úŽŒ6ÇaÁÓóx/ì¿úAw‰Þ©à1ˆ¿¢3‘Rš ƒ J–R69gÜ5Žû—839Ç荃ù¨¼1ôQ¨Å8‹)\aæžZà°òœØ‘âל'îêÒê×&P|ßË¥GÎ\J¢Uuˆ—âF4µûÉœ…ðK æ¸oµÚ›Q\`tê5 ¹²‹>}ÞLݜUE÷ÛŸ‘þgX»“cìVҔ§Òëøai0WuÞT!3ċévjÈ~!šçÅd5×­bÒ Äß"6á®å7l¯6ëV*¾3†XƒXËë¥aB¦¶{FNaUhž î,̉ÒB&J½šväsÌ=©¼ßö$œŽ¿Pü7šI7ërGúA•rJD&ð‚ãÞÖê…*®ƒC$¢°œ_tà“á­X§4^•ÙMµ%°æR‰%Ï¢‡ìfI…xˆ4»…´ÜU¾ë´Ì–p€1ú‡#òÈCO½ÒAC€ŒÔ¼Ô3D-üQv8i§& lHçC狱—Ìh”÷tÕ=›ÄTÔ!*‰ÿ W¨¢äN¸†GpíJÂ8¯«ø4k7šâGTW¦—‹®`˜ùž‰íð(çÁg„@A%Šœ—zHTËÝCr3×54#’‹Ú½ íV0ð­çPò”¹'W˜03âÈcA^ ½Xþ(䅲„†¬²9 ¿½(¡Î¨}üÊÁ~ ŸƒÎè|ëBQ4""Š"þJ <ƒ^$K®pøaT4‰dcg2¨L>…Ç¥Ì*XFísOJ¸`e°ÛU~̧ ø‡å-´d߇z¸ç}%GìR@úäç¢æ2ųŸôÚDÄ·Gä2‡eOk†O²bÕš UÛ \ãØrQ{!Y‚þʕY€ÇS:LƒÝ{n)3sO֕TºêŒÇÚIƒÅé.kþ`³g!/xxÈ40!BB1úíÎpÞ¬G©1@ëJqNíÉ2\>Îê;E‰z¦ø/ã$3Éå0\\-„•räÛN‹ÁrΏæ‹Ù[Å<–Âê7§¦âú­=k¾Clö÷ã8=Qçç,ƾ#ÄCc¨t™Õ9æ¹øâCÈ Ðq +ɀR›' kžÿб0ºk”pe‹Dðï-iݝKлh¾›¶ÚǺ/mȸve#Å»ÚR—¯Œð8Þ«ZgtºšE3YŠwZ¡ãTÙ¸Ÿ¨u”ÐñÛ@Â€ûñØÏââÊ*'E §J$X­þ¢Å­¾- åÇ è·™ýHÀ5£§u»n£RÖ\µ!ûÏpv@ Ðó‡Pž+¬'Zì@°ó¨Gõ­‰§¨Ç¾rBÁýL¯§A£†ÃP´Î.î—ç4x”ø͙;jfà*PÎÙP?wiï@¢š6XRL ³>Î["žJAzÓ±ò7éŒAr7rò†( -Š*ñªv×öT"p¿vâ`!¯Ç˜³þýˆÞª§Áþ A‘åÑ@˜å´jnÒ=ñXúbϒ¿£ö³üf— ŽŒÃ8]½w‡™¡p•Ô™0…Á¾Šˆ^åG|ºÚƒ|H춗u×뛌 +Á|³ÙΣÒKb‰9=l¢tߣ”Âܓ-ày=牔GJ¿Ê`Þ£ƒQ‹í]­…Ù-ƆœKŽd†ØAöŽ”ad>á>V žšÀn¡ …Ñé“:‚vULÃÐo7ߣY«Ø¾œˆ‰ç^`òÖTe¿™‘Æ;̓Q˜„ºZ£XŸDËüÕÓ $-5)õðI¢eNeDzá‘n¯HÓo0a[¿«™Ê®Gô°5ýc)‘8ïúd Wâ‡!”z `̽W†~9àTŠ¾_Ÿ:àm*#¿ðY¹- |ÀÂA.wUƒ¢â@œ[¸¹¹Ð‰¹Jŝ»+ ΌÂvkQÎ= +Û-«=£©$~ƒ*X”+S +ÚB±Ë8–Xª¦>Vs¹Ê…li@ήՠԃX1>óZçŽÎÌzc«Þj*O*KpO¥ë¸êÈ×é Ig.ZèDBe£¸ðáqÔÝ´kî*O0pJ”³ÛJs -ÅbF­¿ˆKc:dgl;¥7ÆçJŠãp¬%FÀ5Õ"4Ætx¥LhÞ#=»2Çiþ1Æ 8CA¨XõRkkŽ-¤ Š6TJPÓ¡ +¨[+SäJ†™± 8ÂÒï%ü¦ÄáaQ/\AHRˆ?É!–+ž”ë£@¼ŽÅË°`tŝ¨æ Í@á!f¬Š¡-ѐœb%ŠVyöîp¤Ù•–$Ùµ` ݃r¸VònXüPÔgÆ5‹ºèÆRpFîj³…^3k™‰¬„ØäŽB6Çs(ˆë”²K2a˜tÎɵéÖ°¹é°–“ÂÑîôu«”BäÂ*ìÈÖH½øS…–øTîP"ùË¡T|<”uå¢IGëjxg”ÁZX4•^Rr2©éÍÁÌ©´w_'~‚ïhïáôD–™§¼.a¾’zˆ}Ø¢ kP JÍKw©ž.½ê!@‘:¬Ÿ(G;MLàÐ ÆbïLOf‰_Ñ¿9Nʙ.WlÁ¢Î®MhËÜSz+Úb]¡î®ÕùK +Yc…95æX©¨H¾yZ…n‘ž‘þ¸Â«‡PŬ_ê­ro.θþ®5fƒ&Ÿªš<µeé3ê,a––Ç©¥pB”#¢´¡æ+8Œ»¤ù<¥ª£ð~ÛUý•yø©ÕÀ³ +ðяYÏS­º\'Z¢?ÉçXéW!ÍdQ#´ÅÔª\ªÝWh…¡Êä“.óuY…;:&QhE|“šÊǺWAÁp©•{êX2¬0IïP± žî +WŠoDß-hú8Áª–¥Ju§»üDXÈ¡] õR€˜Êl/»?6)óÓû„‘zÒǽ™˜üàI| g©ºªrW–ÃÌu&3üMlȤ§íÉUqŽ×ªø¸Üˆ,34e˜çOa=;÷BŠ6R)Ú­——]ûjvÁ„$Iqáá7pÜSŠGÕÍ»3Mq(n25ñ@ÏQär¹æ÷‘ÝÑÇxÝÑ8ö#‹]×&ñ6Iu)¬Ò?_& 3LyúUP¯j²2†‹22Ž3!j¶=õM*°T—çã‘Ẩ‹!fº÷ÌÚߊ1QOSٚ¸XÚ5Ë9àkJ=üðG»$í§:&½û­3®ù±Óô^ØëXƒ~ 󭢦'<½KËlZFwŠº‡?‹ö‹ñÉn¿MíÄaÜ>]ÀB]7«ÅÎYdú Ÿ=s"üÕC%ÞL†X™³ ‹›¡æs;ëYó¦µa$‡zß}ŽI9SA.]4.&1“0 |°BÇÍ>g@øà ¸$ÕçÉ]å±¥Êi¤Öþ}×ÃiÕbÑ-§Bñ.-*®|*êe RW ^ΖàŸ1ÃqÝÈ´JXX1J_ì)® +’r\õK®˜ª}üH/•L`Ÿ”KtQÁq¸"-§2ÜõeîJÍÈ°šœ59`±ëG›«Å8·ûB›˜†ôu¡A=¼##€1Žã4F—”õP¼Wd¥4[™'BÝ&u܄¡ŽeÏ>\ñÑôÖ?î’ ‡›nó'—èœkº¾"fÃù: Œ-Š¶šó9×슃ÎWwšBðÅ)ÓZvp¼Qž‘»Š"€&XÊÛH<_Øà€š(ñœ ‰æŽB4slEÃz×"nñÛe^.(U›ƒù œä—dOùæ–°\óonӊ›¤UuãRꪕÕz¤Ñe)ò„W(UDàä\P4f: ù¨>¥²[ÈüÛ©«+ÜƒØ Y$*¿\eôá{öӛªd•WU24Šƒ±';Š•8Ÿærö„È Eµˆd"ñ-9Ç%l4€…m1Ù2ڛ»ŠšgZXèÜ£%õIؕbKXŽ;õ¶0ÉÜ¢ó±¢} á^!ÿ«úîk(Õ¥»Ë¤ê%y»º‡‘G˜S³è Ëv.œàv\A†~´«ê*{\”%ìý“œ{¯A)À£çv¼#]éœàÇ MïyºÃS¤JbF¬‰¹øû6­ßû…5J`±n¢+v’cµ—A”¥J ‚* †rC µùÞæ†,gç²9͏I㕍,•}TÏî7—i¼vf6¼[>Å}vh}»´9Aß°T¯2çÊ(;ùÎØ÷§¨^ôÐnRãï,¿â—¥¿Œ^×a=ŸõA°p°êë臲¬ÇéÆÇXÊ­©S‘ xCòœiø¯‚$Ì®é>]„[ü™‘þÿX‘7Ë"È͘ŒÀYd!w|m=Û3¯”T4’”oÝ!ÍÂPP<%Šô~ïóB•ó§’7$ò&¬û­þRÔX +å\ëPɇ†dulЫR݈ÂQµEUÀóÈgñè÷¸)×å1¡Åp‰|Iñ·|±>}±æt0Ÿzqo?*ªš¤®Òè”g)P㥄¿'qémAü½€2”Èm²/=]afô9 Òt·8\<ë )ÔT:ûÒ@ø9”45‹ïôP[|„h˜Å +•Rc<Ãê”-Ô TW†qWJËj_4ó‘ABˆ1O‚ch¯µ‡ÂÓµ”’ÂTÚÍu¿ª€ç­UKµdr^,¤sòæuãÈR +¿Ü6.{&›J·f‰--3px<‹™êÊ{Ón˜´´éӝæá¢sHŠÔz-?¬¾ý⃅$\>¢8/ºJGٕèT-ŽÈ`²? +ևÌlBuN¶)¹f­ÝÁ®8I7ÚÉ8× ÃJŠ'­ë p~D÷R/•ù¬È¨9‘þé„ m@ä€Ø¢qî­„â7dqN-ÎüQf¤ŠiÆPȍ® +¦KeÊzz [׉lŒ+C”±€`nD¿G—W¥ðP=À³Z¯»›WPUFÃæfê’Ø”XS¹^ô÷®g¤«3èDýć{O4†q•W +bñ£LvGÃfÌÎÍs½­ŒÁ×}̇½gˆ˜èB«gbÈ¢pµ«A@ÿŸa¨ú`Ü»˜ Ë¡²7ìecÆ:A¾º– åçJ”l Vf8,z B´‚Ù›µâ]C¤3B¤»(î³ÃMøÆC¡V–jF©aŽðÌð Õ–Hw7vcªyæ‹Áÿi‡ê”jF1—2°~ÑØ0þ¼t»§Ï¦‘¿©ªEOߌŠ@ѧ‹Iõ@¯qM…äk„ Ñ 0zÙPáE O¸ºv"w%‹™(PÏ@¿Ü†¦BµZR‡2ÎxÔWmª¿¨¼£\”š—Ǽ9|YÄvø¼.“nÆ ‘SVáð÷šœDYk¹UD­$,ä±)£4-"&´­>fêpȸuÝ,9D%°Å<Ö¥ìNŽMvu¡arJuÜK“ŸQÖä¡þszNtƒ&šsºÒîÞ$¨$B¢8ÀD(®œ×l€bæ¾Q‹ØõÇø‰ÝVºW›ÜäaòýÖiÍ=¯;ˁ_P' Çd á³r™–Ùëår×(ðîJ·Ô† •îÜ-÷àgՍöô3Î½¬ðlGéC·€Î•oé@©àX†U&¨Í¢6»ˋX­Å|½³iÃÝ5rO••Â¬¶!ÐËp>“µŸ¸ˆñž—‘1PÖ¨áä(rùªÓU[X@ø™â£d-«+¶¸ápš¤»V›_ü¸Ö”2ªÌ±Á̘C N—Ê,~èÔ ^Ê[ä®ÝÛ©¤¿E_t°ÒO²XŠ<­1gÃfŒY#GuK”®*­"k»1-Ú1-U‚^Ö=—Ëðæ‘[QB ÓYË]ÙÛ"KW¥:eq©vS<Èx—½ŒÖ¯.ƒÜ‡ë!;FG¼õÔÛ§jNx°û;‘vz‹ôÁbæÄ3¾ÄV*LÀÜÝ\Å_Gq~±¿Ä)ï˜:¢¡Wý•#ŽõOLҗh Ý]wjŸªXº†¢«+çšSš!Ϊ‹#}™Þ£ M¬r{T¼NN.e2ìFøé‚ÅלÖ0O³#u‹tgnh3â+‹êN˹V«…×3ф¨¸“˜~GhÖ¼É딃‡Ö"L7µðKXQ—ä…®a÷Žz QINþgÃZC8´V¢ˆž¬cZÎÁ¬¢j¬(y ¹y +(ö /Ëèñev:sˆßnw®ZF»ªúÕÄ–CÅúc +ÔR]ÂBÀC…êJÇ×`Ö}XJü–+”™ºãrÁ*sÀ|Û £ã©né@“øŽÐXwñK<SZ-ÔèôöÙ­)Õ¦y– Ý؅NÌA‰iÊ#w7E‚E©Ð¾¬àð’z ,†“B–²_4§ª i/2éÐ93¥KLso•£ñ¥H +A‘-é !.­l¾7”XwÈEÞ ‚=ŽÝqY’¹VâÏ¥EßùÇ`a½–é“ ei±¾]{äm9Ɔ´pxÂáSâÂÛ@mˆ×Ƹ\RÚ¡h›öŽ“÷†q"¢»/Û±›8Þ H>” ‚n˞#jõ¢WØm?B)as„Å~æ­ÜÄܐ)„S ³¯‹L0ͼ`N}P«_<¹fðnV=uÍ»ßÑÍ fT\ÐBÀS¡…†g÷§ âe<}xCñî·iá¯^e±x×Ë@˜±¸FEføt53Tqx&/ôÚ>.Naä™T+bª‹NV!o¼ÑňµÏIž¡eÖ×¹ï£FMø»F*© óË&ޔŠ€GSÞQêay$ƕÚé¶æ̑™ðŒž;ò—‡%è\?õÊf© B®€o ºtD')ܬÂ*|GŠU:3“þÕbgú±[Á]»“¥êXrWWˆçžÒ ¥ÁŸÃptnØ]4YXlÃ~ØcIóV¶¿@7]Uw–"iE<Ù'¤™g¦xìdEóåÕÛãU$ëO¶ö(j‰ðXVè쐈dǞGzbD¸]ãiTªºk´ãÊ=é +ÀL±7-äo¢éVØƱå‰\x?L+zª,榯CJZ|¥…"–­s;|µ¸½,·¤O…­Ãâ!å2»67Ä샕+ƒÄ㪚a¨öqÖ´±ì¡wÝދ{ºy‹&-–¡²‰%’KaÁ­†Ù¬=oVc°W -tÆÀ:›·ÉUJ¾»ÌP2.€HuU<—’…K N‹{'^fŒ±l-«!Æ?k·÷”+ÁÃ|8ñV¨Æ\µ¹Ô‡ ,ƒË³¨Á¸c˜¬ì„¸íÂ+t„w¬ö%N—Sþ„8»ÕÜ&nRI:h’¿æ”Í ˆ¹ïۊ$䙪çl ƒ`ñ¬.)†Ïvj!š^ÝG¥û"!WÕ9NÁ—š#Š«éóŸìݬÁ¥Rz‡øô­¾Žäè!?¨åÔVÔû ZÎn|ç=™åè¬W[Ëù×Øyå´=Ïĕãõ>'­ü´Ôp‡•Ÿ=à4f•#¬¥ÎŠf•cñx™ì0!½ÌK÷2IåÔÿ••dî˜rô1jæÉcî½ì%£³ø!\øtÃ8ןÆR°Íäã2á@”_þLvBùTœ”£îòz<…"÷Bôó#:ʤg£ˆN¹hÓɃrpò«›³±ÉÑè0õž–×rˆÅiI&ÅÂ&Ç2C~ž¹ä;H–üEk‡’SìÓÌÇààO3ÉÖÇ=¨w"ù=<àaߖ<òË*ÉGþܪÑK9+í8eœÝ@ˆÕÚhäjÒåX‰bDÈ6hä°2³ÓÈK8ÞI#‡…}FNƒ¤°÷ÆÊK‘¿aäX†3„0r¬˜X_´±ÈQß،t™å|Ü.Päìg¢"ñE.3‹ê ‡E³Ë\¿#Ê^W9Ì×B"g§Š€s¯AÕù"Jµà?™³‘ÔE(”mrÌ$ ‚üñ2 äÏúº@kTxD·&M`Çéð@}Á¹úøøE'¡³~.Sð7ôøhá ßg¬B Gõ2—ówLg.ö;~>á—;žÕåuü´žÔÔqKøó¹D}9Væøa¿@ŽŸÆó&r†àUN(ò@ª&6p<ÚÁoœêLêõVÜ8"Åå¯Ô'oƒ5Ž@?S8ky(¾>‡\ímV }še0AãH[±Ò7@ãÝA¨äŒ£ô´ÆtbƑé%¤ô¯Qàá—€ã W@î3ÄÄ£±Þňq¦¢‡>3ʖYÄÈÇÂP¯ŠùâÈfª$Êxq¸v”otñ:f”¦xªK¶øÏqFl­J‡g@‰üFGЭ4-ÿ`–1WŽ‡Ð +NˆLQœ°fP«ËçØâ6RS+&})Žßã‚1@álæxœo@qd_øú„•åYò˜„½EÃá&Ž|Òˆ‰wùJ‰G::–$X9_ÃÀ†ã¬V°8|än8ø¤ˆŸÆ§%D†¨îeî +V„8Ô§9Ýbàr9•@|V~x‚&>üŒxgÐÃÏS¤~FW²`‡O> 'a¾ó0™ ·YÐB\¨ÁáXQ*edn8éˏÂĆã¬Î:¡á`p°~?˜ágwÎlC†ÃªoÓÄpŠ) ±blÒ >iá¸T3Äy)ÝÈÿ`…á$¨ÄŠ +GºXc»Iá=˜À +ï%èó+'¼‡Z'0áÈÅ5s¤k1opÈ Fx·T=á-àñ!¼…ø%áhQ«ºMÂÙ³ÖzˆÉ¯[¼ªYcÂÁ±[ÓafåÞwMç&ƒ# 4XUf0x ±òÊL F󲲸4`ßCm¼w(øҚשUt ¯®ñ¦¸Włç +ïœDðŒâÎî8pWçNxÔ1' üpzg›&9Qà}ß ‡VÞ0àôՆ8S˝½{¥èWÕgW.yc€ß y«VJðC˜±IœÎÙà!úþ7—?þ?©¾ØfûjU{²¿¹™É1J0 ™¨Ý…üíp`‚¿‡jê'÷; ö;­Aý~ê–7c‘嚝fxX¹™ýé$~OÃüNcð¾kV¾î;^ˍöýPÐ?ìk-êá‚õ}0êi¨÷”Ï⋉õ-–C¯“õ}°¹Ýo¬ïƒHLŠS ûþY?³§MûÉA“ðFû†›2ÜVC’µ½=ƒ\ñ õ;S$Aú~èãJ&…oˆ…öéór£# Þ… w²´0êéÅkÙ0ßð ”B Ì÷A8ˆ-ÛT_l”ïFä¨d|fp¿Šµ–*¨’~G|WÓ’ðݪJ3ðÁL꧕ï Q Á-÷nÕéñ {§.±ç +÷®Ñˆ0ØÞÕ­¢í C´Y A 5 ö†x`„ցúâÓ² ë _RúOiX4ëzYIäî¸?íPï´Fùô¬¯¦7¶YA>L»&Ñ»¹+Þ؂KŒ èÝ"¾@Þñéªc`rÍÖÊñV¿¥«L7~l2$oÊY𰑼ññ2¶$ol(lf¼ñà9©o$oZY_¾3š ò†”³ÇP±cꧪŠ2&ț| ±H ò¦,T$ƒ¼IGbáÊò¦™H yóI]cr¼)²axãxSXåLCCRƒËIŽ77á'»q¼afóëäxSt{ô'9ސ ¹q¼©Ù×ÔeŽw!gùz&Ço¨*†6Ž7µÚ.áÈÌ c$Æ[ )#̗>‘Y°oÈ¥B8ãMá3)?ÆfsãM©¹ÆxK;ÇjµãÍ=YUï’ÀËÀxÃÂàݎñƅ]> (í2Æo +¨X'¾R¼Ù9>+… \Þo„9Î^vŒ7Âríœï+¬rMT0z+òDW„÷c¢Y¼«éàã¼Ó»Ÿ;ž®áÝ æ1Èün\'¤ß +¨êŒð”.™ÞMòqS%S»u%è?àÝPäÜÞÓôݽ’»Ñà]m’oûZIíÆ^|o7h7‚T³›GÖ2³›½á‰;ژݼèzhWåÃððnsjBõïÈ¢ì`Û<͵pþÌَݩ%ùv`7¬¬¢ +^7Ž£¸³pÝø5•-´îBÑÄ¡5w +þlàº5Ç8I3qÝ¢ìE[Zv¶#‘âÖÁ„bW‚þ†ë†Yë¦…ô5ãºi¨ªM\7Í,Ç +\7¢'œS0“iOû´ãºØV½jàºY»!A¬›QåmeÖ¤u³^„•>ëF†~=pݼI*5]yÝ% Éëf‡vÆúƒ×Íâ Õ)¬¼n–Ð$ê[NÂå‡àuÓBjâÆ릠–¢‰àu³?—ìÆÜ¥ŠÏ Ø-‰-¥fvsCUßцÞy¤ØMׇ+š vK‹ë {³ µ›»=Ý°Ê-1°›†añYþ&AÃ;±›>ÉMìV?–[‘·ºÝ’`»¹ªRҀ"½ÜÜã€eë°p¨ÞÝ2ßQ°Ú´¡‹y…ì†Aôû ÙÍæ6IJ[ëC¼µ–nÑïdCv«û#a-Fv3¦Ghd7—9A؞Ènjυ¥1³›út}#fvÓ¢aevÓܝùUXð, ‘ÝüQVFnÈnIþ‹Jix¼•õMd·´ü‡{°&²›î#ÃíÆ};Eý0´[aÄ.'GšÝæ@wOíV¨ä4é$¡Ý%ûјٝ–dv38ÃÄçÆìƥʙ f7}E: ¹àÅäËލٍDçÉEû#¬œTKd7Qw|‘6d·"ËϘÈn¼qDü$²»œgÐqd7‹Æ¤† !9²›®¿:ˆ¬Èî’*†@vÓÂÔp »?®–Ff~ç²™È\)ORˆÊ£Âs‘=Ó7d7Ílpfd7~‚ªµDvÉoGvÃL8O"»iQvÒÈnY˜t[‘ÝøQR:ٍ)Å[AìFJQ½ W`73¢$]°ûq.-YÜY±1»¯ùa[ÑÒý1±{ô(RZÝ°Ž|qö´“Àu>…ìsI0œïIX÷ˆ±)6]í¨îáNéIê¯îpt±1´aç<´ºIº¾Ÿi½¯ ™™Ó†Ó=­ætß5Z†¿ 6–ö®˜îët>73g>!ÝiØÝÓ*D÷M Ñ ƒ¯+ ›´ò¶ºåVEœùÜ0hYñÜ؏ó~à¹ïû>üöopî+¨› µ‹4šÀS™›,æ®ï" E—Ãiå*ÆW®XnI¹ *7 Ýe +t]Sn÷dr_ÇTþ1Mz¹ÛU"¹a Îp#ryÇúÈr#ÌJy¹¯ø7uô[F·FôP7­,yØ`Ü´bNµö†Õ(î—A‘µÄ=b}`7B¿êÝfžD’È7 7µ©lóg +7òðŠÂ}y±»3¸Ù$üy&‚{D-t¸qB,9ÚÜ<-Œ›ÁßÆ­æ€ømèݯôí&|›e•ýšìíõ8½]œƒ¼}E+8Û9@làíËzµän_n‘4mUp”ߨÛ÷p@nöpµ˜ÈmÈ©õX‰Û¢‹>¸ çØnß!vÙxÛ°r8 +Þ6ê:˜ÁÜ6¨âª[iÛ¨¢á `ÛXz3ýfÖvþ½¡¶§Õ¤mÐq†[-²‚íŽhÓÆÙ~?˜m,MÝÑ;ºSÁ_Ÿ7Ì6ÌZ E\r¡3Â¥,ô¦.®˜mXj Ì6,¶$f›Ûð fs­ÂâÙ~̖JÊ6–Gjû¾B¶_©Ê—€lóÄx—²MÂHìY=§“אmRؗ Û| ·[tOÈ6+k³ ÙæûÁ!4 Û´(FºB¶Ù,4®Böãv‰!Û½§ÏéYý1!ی@2X¶A¶iVöՐmE&ë5‘ÚŒ8ªy…l3$FuS@¶ñ˜ý†l‡Éfcl㸎یí¹Lƶ¾u7ÄXÁ5úIc›^Á™Ò¡ÈíÎØ.A·IÆ6,7c›%¶·6™ˆm\©DvØÆk(,V ¶áºÔ{ElO8•x_CV"FF‰*§ ±½˜Øf“gf± ‹Tnb›Ä Ʊ]È?/*U7zˆ…9ðlˆm¼ÂVŽ±M‰¡±ç,Ð݆ØF¹éiÁØFݚ8÷.Ig÷¼O;_9¥¢Œ×†Î!%èÚx]äɯtm‘8œ^›A$uB÷B ׬+][V*’Œ×æ±Î€i«<¸zxÙðڌ‹²CIðµñÜsL¾ös}l£ž(Êu™Ì¹ƒ‘xmÖa´']m~úÂֆ”‘”`k£kÇ­´ÆŒ>^Q0dm–/v­h™À˶ì+Wë#!gt¡pÅËYªÅ,¤ƒ°Aµ/·K¦öåâµDjÈÆHÐBÔFC ŽÛÔ¦þãp0®çp°sçi‹Æ]ð´G‹†qÚ©)]=aÚìhEA’YÚ8ÎÒ‘¨Ý8ÚÃx­,D§fÑùcEqʟ­m()c ˆ6’†ü¬‚¡ÝC¸·!´É˜{¤EdlËÐ*;@z/•;pm?ë¿ŸÝC±Ñ³¡Q"˜%àÙÙÝ>Oº~ ;÷7p6J”º07û7( ÙXX±Ðvcfê"0×àClÅ]`¯!ÇýefŸ.AI^öéÌËnÄmî°ìl¸¬ìáXi¢²¡á$¾‘²qü¹eŸÑ^=8Ù¨1S««“} "0ÙgÌiAÉÆ5ã1gnS ƒ#ÁÈÆôtšMŸèt!ގȆӯp‚CF8=¾áȆ.‹Šê•zk…`G}Îh¿h:ö3œÎ^éØ02Ìpì'zš;˜™;û± $É؏ó Ɔ!~n‚±™h9¬ºcè,R!Éņ:-‚U‹}_ÑÃXì'0§AÅ~"¿B±‘êÑK42Pܧ"ÄÚ\<ÑýÛ Ø43ðPìB6qy>%›9 úÜf啂ŠMWñë Í›ÛÜ.˜¥•óˆÆbâüV`±K‰*ü ‹­uÓÓ'›9pºDÅÂh÷¥¯üE53›‰g5‹N`\Í<üÆ\l¸lp¸a±ƒ'¬u¢5û±&lGb?À“ˆ ƒ`b?F/î©Á­fFýù´S«‘9N.xj‚ ©¹¼¢¤ä¶¨7Ót'JÿŽ>Ë-1œ’xhj­ÈDÞÐÔó²åS’©»[¡%˜úr«K}:ѐXêây;¨Ô–ÐîPj•¢ØŠIMbÂóS"©oReމÔ@´°qF©o/G±ù7µõ[É¢¾¢û„QÔ5ªïvõ0°'IÔÖX&ˆšÉ‡jFf¢\·'­„Pãý(®ä›jÔÆMD¼Ü^Âè£áˆ¨åÐ$P7»W ®á'š…ýo'~õC¥¨ô¨°âë™ìéáÞ oìiË×=}2äP&yZK²^ßÈÓÒ¸\m’§¦=Ù!ÈÓÔ§aI­5±!ã0°¨b §?ºìß~Y€¡ùŠ5y §»³|IžP\‚§Ï:á•;€„ØœÆNƒ¢ŽÓ¦NŸQ»A§A¡'Ìi A”†5r†Ë[ÌÒ⧑¦¸+xÓHœF·¢©â9£ôØñzÈ`9¢š"æՑhLÖô]"ë-#q¾½MÒôS‘ØAÓ°r€ Ð4 bí:Ãæ.+Ð7Ìôc(NR¦Qž¦¡7Ã?0è³1¦o—s&cš@åûšèh>8 m„éË$Œ´W£&`: _:¬‰—¾<×'4"e®¥7¸4ÄÅ +ÙzwZzþ¹’¥Ãš`é+4AÁ•¾ººa¥!¸î›ÆDuAO6T†hƸø²Ñs&ÒWè© wN¬n@i¿k2OµVªÅ7NßÑp¿Æ ”¾O;âÁ“¦¡Ž‰“f¼ü8ßhÒñk4LúîÝLš½èÏó% @¦ÒçFICf j„ˆoÃWvtâʂ#(ÌÀHßþzwŠ4Ê·Š;—Fe!+ђ! CuÄ~"¤ŸˆðA­#xѕǑ۸ñ£Ÿµu&¾@ºǘôhd{˜ÚØàѤU·™:ÔKõ*FGß^Äîäè[|»äF?^%6š…”gÛ©Ñ䅳mž¡Ñ8)ú3úi$ïÌèÇP–DF?QÄèõ@}G¦8xÑ·“d ‡Žáa§ECÉËN˜A‹½Tà`@_ѧrcEC¨@RhX‘XP45ö×óƉF‹ñMc¢ñ7+¦L‰¾Ž(6_!ÑȏEŹ8•‡`ˆFªØ!z8¼ž„èewˆNÃƈžVC¢‡YRI(Æ +™Q§ nê£ìÁ +…^Æä¨Ø]¸¸#¢Áë:}3™”éŽÉ‡ÆŠJ W<4–eðãÕ›ê­\`Ö-{ØáЧU$ɆÕIM‹†¦¤Œ©ü‰†V{%šË<ÿ±œYgí§Ü†~\)“ KãäBsñ<®7,4ÚdÄ=ï5 †Bw+Mw&4¸]qîü`"+—Hèw×èó7w¾þïEBôü³Ç?Oÿè/~øËípÀßüö—ÿô×?þòÏøí÷?üô»_þËþ§Þ?ý£þÓï¾²9þï/ÿó_ÿ óúò›ï—ÎŸÛéÏûÃÿøõ¿ÿå_üæ÷Dë¨Þø¹óúýú‘ÿç‡_ÿ׿úÝÏC°cÛßü·_¾nÕ?ûío~úÃùá¿üîo¿5nÏëRýÃßü].ôóoþz^(ªä_ßòÿòBÿݯõ»¿úÙ'û§¯¿þñ?o¿üӟ~åi8aøåŸýæ§?½}¿{½€ß}gû?ù῾®pù—_üɟý7þÛ­û'¿ýïóWy¬ðg?üþ“ÿúTþá/ŽOÿør|ú÷¿ÿşüwüNJý>>ý‹×ý/Ûï?õOÿêÓüOǧ_½öø÷ñ‹?ùîz0ôã~œn{û…¦Ã…‰?oíôe;Ö믟ðÃÿúõ?¯‘‡™¸mB«þ«]”)\ðÒfz-/_k<üÇk´0Bˆ—+@Š‹&êlIæ)«Æ[@²—¯UÃnÄ¢áäH·Ù1”^¯ßØK7ê5¼mçF«p8ŠûÆEá¯í°Ó¸ŸÃbŸ'<»\ÚÇûð:ÂÁM¾Ð? @»×ºž›ø`z&þåݨy-¸ÛÙÂzàáö–ãÓ¿úE<Î ÈcIÁŠï1$MǹÚatMÛËHY{3ZR¡ë[ì]hŽý°ðÆ^¯Ã~6~?_µíÜþš×ÿ4^nÈ?¢ +iÇo«ÝgÂêÅ¡¼1ʛò‚|°‹y¼:>í‡%£}ÚÏÁÆïæÜò´ÿþþCot¿{5Òîf(çµÔ0ێÞñ2Ÿlµ‹ZÞëîx©›Õm¿ßï0ÔXUl§Q¼îÚNx1nW7íË­˜‡]nÚ<‡ýƒ)PÎ÷«ÐúûƒKãÛSžöå•Èî/χûð>f|Çӹčßo/Î}÷~‡3GÛÙ.ÆíÒ¦}¹ó°Ë›ç°ß^üœò}c8µõížÆ·G<íËû‡]ߜ÷᛽À§šz¾l•BüÕþ„ζ‘m1n#ÛbŸ#ÛrØ9²-簍løD!ö/HÞ;û9LûrÂó°Ë¥}¸ßÇ(Šy¦åÃ-Âîå8óÅX~q1n§·Øçµ,‡W½œÃv‹æã^7Îc=ì4îç0íË ÏÃ.—öá>|ÿÑ]!ï:?¸+aß<²s®7¦²Îòúà®`EÆa÷‚n5ŸÚ]ßݕuãéÌÃNã~‹}žð<ìriïÃ7™Lç½ßÞéT,ç0ݏålãvi‹3ïÃâÍ;¶ø Ûí]œŠeãé~,O-oxڗ÷!»¾9î÷šLç4½ßáéW,§1=å„ãvu‹3oÅâ͛¶¸ +Û^üŠeãé,.oOyڗW"»¾<îÃ7yçwoéjLJ°oŸ|s¿ÜÝx¤|7ÐÞë¸öñ¡ZC¾›6¾ëÆ󓟇Æýû<áyØåÒ>އo¿œÙïðü–—Ó˜_ýr‹q»ºe蘷byæM[>Ïí/ßò²ñüê——Æ·§<íË+‘‡]_ž÷á/göÛ;?äåæ'¿œíbÜ.m7æ}X†yǖos»½Ë‡¼läa×7çÃ}˜>jžžd³hó% |ºbó:ãæ¢,öéÏ,‡žÏr››ôñÜf¤åã +Š‡no+(ž„ÖÓÛ^Œ›k¾Ø§¿vzüíãâiûeç¿q¨÷OúÕèý[€Û7û¾G—X/^¼Ÿ³Æî_>q‹ÿŸ‡)ÛrºÅzûõb͙¦*Èh»' I½Œ/監p?—™Fv®þi;,C wý´CçLó\×ÛÆVÁo‡Æýû<áyØåÒ>އo9Ó`ƒ÷;\Œ"ÙNC@ïs?áŸ]Ý´/·bv¹ióö;,÷¦¾m\¥ÒÛ\ߞò´/¯Dv}y>܇o5Ó°Ðåýö.MÚ΁WÙÞ^àŸ]Ú´/÷av¹cóöÛ[ØG|¼mlFÕþÔÒøöˆ§}yò°ë›óá>|ËÀ4/dÛ³„< ³œöï44׫ǰ߮7#Žu­3Û»JlöÃ6é@÷shIÿN?r²±äºñ%ð~ØiÜÏaڗž‡].íÃ}ØB§èíqþ=ߎév”ýãvz‹}^ËrØyÕË9l·Ã}?o»²n?ì4îç0íË ÏÃ.—öá>|›õ|¾'s%4Mv¶W'Ší±…ñýÕY7ηa=ì4žÞܗ)}£ù°æzbšæçó[~zÞ»ý<ç^7ÎG²vϯOžç·âß„°owŠòô7£¯úý¶Æ-Ú»Ç@}b zªo1P=Àõ°Ó¸ŸÃ´/'<»\ڇûð•a¿EóÉ/ǙiùÅŸÞbŸ×²vú>Ä@õB½Å@ûû-ZŒû9LûrÂó°Ë¥}¸ßd@ §Ü>Þ^¤“ [ωg¼çÛÙ.ÆíÒû¼Ëa÷äºÏáCr}?·-¹~Ì+ä4ã—ºÚ}&ã>÷Qw1nCôbŸãùrØ9ò/ç°MÏí[ Óµgñ}‰ömÕ@'ÒéŠi´ù¾Ä×›Án¯\ìïïKŒuã¹j˜‡Æýû<áyØåÒ>އoì–_½ßÞ¹XÎa.–³]ŒÛ¥-ëŽy–e˼c‹o¿ÝÞe!°l<— ËSKãÛ#žöå}Èîo·ûð ƒÝv­÷;<×ËiÌUÃr‹q»ºeé1oŲr™7mqï·;¼¬–çªaypi|{ÊÓ¾¼yØõåùp¾Y°{Døï¾Êø0>„}ûäz«oããtçýa|`㕻íãÃo_&MïcÃÜp~ìó€Ó¸ÿúbŸ§:º\ÔÇ;ðíƒû½_ñró{_Nx1nW· óV,cNܲå³\îíòç†óK_Vߞì´/¯At}a>܁ovØoìüx—s˜Ÿùr¶‹q»´e¬˜÷ajâ~-_ãrc—77œøò¤ÒøöX§}yò ëÛòá|ÿ¿{ý7?ýô—?þð«O×{Üõïzí{÷úIÿuTr¸¿kÏÅB—Õþå͎®ÀÚ~y;ÎÏٗãüäóü6âÜíd¤xžå" £½ `ãëe<@-—ñ<žSƂ:¤Ïq„qtoÜÛýñ6Ä/~‘Çú²¾~êAåÁÎÀmÜq2èø\ªì7v–q4”7ðw_¯›g;|2ýny2¬»õ–ñúÄlD5˜®[2–ëð9¼†˜å*ít÷×þ ×¥ns2ú ¥¯·ãÁ î{W›7}Õå3¨6½–¾ñG©Ëþ¬5ѽÁ³õI]iìçˆËò?°ThË=@/o_AÏ{¾”Ž0ïÁÛsøè…2[Ø—d¯ûmûð³&™,œ"öiÙš¿Úv‰Çq¼Öþ=Ýùýt_±Dæ—ô<÷4¢£6ãŽÛûuåÆÞ´c²ÖAêüÚ̓CsX>ë×!ÆÕ[œ*ëlE;+›ÚYÂøú^lF÷XQª‡0@ŽxC+Ï#ÄÃ=ôìcãø4<š¯^Åú:½NôÖAÚ3–׉E’²£øKÚ{ÚÇïA 2ÆÈýáÈó³4ÞçC˜Üioå±½kȀÅ«~jº¢› Küȱ‰G¹ÚoTÜÇj·ñœ‡ÝÏÁ§GC|£ÐèèpXÇöîo1¡0Æ;ÿà5Ê#ø»{ÎÆBEÛož Psãûʟ«ËÖsÈÓ[¼ ­„U“½BI@;ËÓË©÷é§sv,)m<ütXÍøÁØ<3íóyØ'ÄO§•ïì@ªÙ~i, +x4Ö3ŒO¼ÞBÃW´²°ñŠŸã×ôÕsÈ{D⃛{þö××僿æ¨ë“Œv øúõjã©ŠŸ¤¸¶Ÿ1ƒ|-i,(s]&¦¯Ãúõ±­RL§ùõÍQôô×TÓ:{‹ ÄHÎñ6ÇáZ{ÎGÌå~®Ø8'ˆ·XoÝۅÿø5;ÆÛƗ;üòþCg#{ Ú²?-:@ü|#æÇ×½öþë Á´®15sú1íåòûp6=\uÏõkv^G ãu„pŒxái¯-6¾zl|ŸqØ®ïôã9Lßå’VÈsDKÇ +0§s _Â~âC½`Ïa¬ñɐþÕ#Ï{ùS—í »Ý Ž·®èe{ŽC\oNWÑÆz­ÞßÏ $¶·XÐ÷b£}á9ÿSyŅ³Ïw‡J Ÿ¾zëgAçUÓé#êìwaǚïKØí2À~ç«:Ž;ð _=rþh;ÁCóÝõŽW$ä\ßX¨~Iûѯåù >>ŒÇøôÕ#Ï+=ÁGûʕ‚²6¼:ÖÊMÆtت$i,p’d<Ö×»\§ßŸ§žq„×g÷üìê/1ŸæÜÖ„¸M¿Þ9Û¼½öšm>~ ÿál¼ùßòGÑ:ÿŒ‡ªh‚½ŸÃ^OÍ­°ßüòI‹Ï óxò2¶q=ñ¹^á!œlƒí;>ИW—«æ­É#õöo•‘#úd˜Ã•Œç(~ /w¹ÚH¤Œ=ï8ì=b%7øo6–8ßÏøP8îy„ù¥ °GtOÏ‹Íû9b„ªG Ã~ŽÀ•®ËÙc0bHÆû¬_TyêÙõµk†Í[Öùó±s9Ör{ß0-éU¼¾€ÛÆá!}„¢õfÏø›Ø:zŒÛ‡V¨0Þsï1 íèKØÇçËIԇÃoðk¶ýh<ÏZ瑽2büï‰ój£ùréqÉXJ\Y=çþ¯Û&&Ÿ"ˆœÑáo¨,¯Ã%Ë<¹Œ}^[Ϗ‡ž”ïØÝr*xÂøZ3=˖yäzÄú§\™p=ÞÑûñ£³Q„óž˜yh_ÞÑÃW‡HîS«oZBÅ°K̒€e=n{ñ©#’õø¼Ú­ÛÓáå–øvZyæ^릜ÈÏá_ßz<‹K6€9¯éçS¸÷uáåiĔp{ÎíÏ÷2Æb0SÏظٕX/^§Å£4³å Ò{÷¦£ÆIГñ/¹åÎÖÇ-º“x=u{;;8E¬§ßa|}ee1æŽ#ÐëââÚæì>Hx„à!¹zñ»ÚÇr'Ô>òX¾Q5‘¢݈[ÁH¡·œ/‰C°Ÿ¯»u]ñÂëMC³»|šˆ{ÏO~B¾¾hÝ÷\é×Ýw\[)aôÑ÷>ÁÃ,ÝÆùi=×½¹_ùiōø¹Ãy®q/GèWØÏѼñÌpQâ-Ÿ“UkcaF +c™ÛsՅ·21óåÜXæ—á™Ò'üºï_ÂÞJ ÖLçÉXϸ%ŽŒZ¼1¢ß{Ɠãpâ#¤ÚÇqÍ#‡K⪌g;sªñ qD|€£^úólQ›мyn-ç·¾Õ¤%"½0ªÏJÜ7Dhç‘ëG~äTT!ŠW›DdŒ)~s—`oZÝÁ±~âÜÐ'ÝÞ;Ü(Y _——<Ç©'RÃOÀ¸’~¬5H×ÐĈ~Í aDWèpsO¯ƒeï4·’ª»Æþ¢v9×*wºßK–œÜì«Iž>ù€S(c;âýëWƯq„\ÃÄԏ–f¹ñk,ˆ#Ìt×ý䘄¶W¬žïS1t2îün5ÔUt^‰Wj´\†Ô®ì¡? ó šçÈÍ ±¹RG¢bá¼ã-áZMÆ^îüò½]«ÿ“GèWÞ´3—"PŽŽp¡«‡´Þñ„YsºvòŒ«¸GÎ*°Ï9o𗰷zĸälS‹`¢ö¯4W_rÈ{¬8£˜g^ŸL>47ŠpQ +è=éh“‡ÝïA›üÃَ×r–[^î]À³²Ç¦DNŸ° +7†Q¨kv˜¦¾„½ä͌ùÆú:BHåHpäˆ,óëˆ3(÷ §ÜqDÆ¥üµdækŒúch± +X~©Hz‡(êgU¿hŽ+ìî1£yª…ŽèŽ3<¥RÔÆÎ,×è–^㯞}á<¿d‚*­“Ž^„ãõdò‹¿Ð±=5&v8ž%@ñܚ!ºš±ª;½çM;bœ«ÕQ0Âϟ¼ßü;_òcþ<Ã+Ç=S°qºÏ]âõŒ±›/Yáh1òÖªÀzAÍñíêa Û¯ÔÃ9¦k‰±ÛI¨ÅsãGÓ{1Oá.uCñ{Ûâç{yì{‡} -ñQœlô¢Šýy|ÂX^żKmÅwÿ‹P"Èo-' §œÄ8‡¼4ô¶Œuߘ1™cÈU’®ïµ½GNºOäÎF, XDs3Œ /⠍‰‰¹“ŒQÌ© ã|uËmo¹Pµodã™Ë+—ºôˆ&8xž³ùUñld¾c Mò˜Ž"ž t9ͬ¨Ωj0¨{ŽùÛG@vþΛvÔ8BÆIÎÑÓØsk¹(9V×êF“RO·&± šÝEÎËníåɉ©I<†eב¾ÇÆ)?»ûˆ,;ÞƃӄBcõØc¤Tmš‘d¸—Ì7ãËÊâ݆7}dHÄ¢"|Y±a€v9Â\vø„/‰X§GkcƬø€æ҉bÝJ¦§Š­a.ñșñÀn6ú¶£OYέæç)—g,k‰£?‘b¿®-–ùøñĐú[#y>1"+– -K:÷ñ¦éçžLWÇ Ã‘ o{´'2úg^ÚõœË9ÌeY>£iáˆ7M½çŒ$+]Á#p®¶ñäÆqb¼B‡>êµVcÿâÈÑ8jD&[³²(ÿX‚w, òÖ+ðYH&…¯7MfÒi<¯<ô¬l;¶6ÍWS×Ø%v¤¦-ÒGµ¦Ø’Œ÷ µÇ÷²¦Zd Éº_Ýï<ƒ¢~p­Ä» +n{ܟ>uZ/û‘Áº~¦tðÊo¼Ü#Œçt€;¯ò X2–÷%ìÓ?b±TÚgøªžËÖO*JOß»šyhqä-[H·ÒÅ¢=$°ÂÈ<%6a´6m,9 Û¯ÕþÑø3þmlþë!_FÆæð×ëç씑]ä´åyÞóçØX— Jƚ+‡f‰¶ÌPä¢ D珌öÐņñXe ˆŒ-Cù}„ PIsNjGKcNi­·60eŒ|~ »•£8U 㕏¦gÄ :òa ¯Eº9t{ÿ˜}½CÁmiÕ(Î Öï²çpUŠ® Ƶ<5§¡ÂL¹×ìS ®-oülÜGŠXhì™ñ)çóç}‡ÚŠc’5r·¢çº]Cþæ¼éy…7Dû v {ïK¤o_—žúýšâ›:rT¼GèT°éÈÑ[[$5¨è¡©å$׫o Þ1:ÐuÏã–¿†Ðîç4Ї¯l,Bê‰}„34 #‰4Ö«¤šÛ3ƒ³¥äk‡N&ŽämL5oπi –èm‘3Ål0"hcm›ãÈ=µ”8ò÷Vë¸Âx¦cËd‹P—  "‡/cI}/{V kÎfyi8ÇxCš•f·s‰¾Ý°eæ¸ûÔì߇¼"íÓC& +{*ñý:RoúÝMîÓã3{®¾Hro ()Ô|:•¾͗8ì2r·²œÙík›Z|nw¡5Œ=½åº¡çJºüÿì½év9’0:¿ëœzÎév·««D'¶Df¹«§,yiWËeåZz©ÑPTÊb›"Õ\\v=Æ÷sî9ß¹pͯÛ/sßàû9@H2IfҋDŠ½Xd €@ìpGd–ØKSòDNÆ>Œj÷å£T8óe(é2r¯‹›ÞrîÃgr[OÛÒ®9$¸ÄémÜ•&ÙÏ°Uî€Âñ—Õà1Wªà„!$0$­̉ãóÈw†¡;˜ø>(X{œI +gLJ!óŽuHópÁA¹ÕVЊ*ÚÑ¢Œ( RŠ±Ü¿.$©r))[{­ +WªÇ S’ýx¦‰qi¼Æ×Ï]ÎíB{t–¹£ˆƒa |æÓ~R +[ËEN ΢?ûÆ^ìbN ÒÂނæ${JAh¯´mË!¿¹ðÂQÊ}cÏÁTßK³ø€q -„ûӈûä AÑ·¹“4Ì]y BsëqìRQ®Iæs­¬-cIJpL;“®1Åÿ‚`Z³7i‚³,êƒYÖ^â÷ù.Á#)¤# äEó’Q +·7˺³:¡|¯pt‘˜ªYäÊ۝0³Ë£¬<´%º‘sŸ Ì7è·q|ø¶‘Ñ£¾1Eæ dI®ÃÞø¸òÀ4áš ‰³õ€›\úão®s}yõ4»µÃiâ¡­:¾0FÒg‹îy¹ò,í„ÒÀ¬çÄ•—[ ËÀ-ጘ%º‡üzW‚”"0„ò4×Wª™p}i™J.³Ä^ß䀜D Ò*3YÜn–4 +9s‘%¼¹ }Ž’ò ¥OxÄQzæÃSs"é}ø5¬ÓÜgÿE1³Òºw,t\×7åí҉u-ÙÆ‚•Ø5ےl›‰ujtª"ùˆÇL~LÀ–<¤”PR™²a͎D.þ×ÈéšÞ(Bv–‹ 1RåRz´òA_‰½pաՔT€7ñ…ã ¥Uès–RïпN­ËÒ-¤Á…’ÎO—Ø w¨iᇜâÐeF4ѯðs§­Ï!ñø•ˆO uÈÍÜÉúp“,£×å>·G(I¸s¢'±&ƒ²õl_(¢ÐÐÆ¥œqZ?’r–3Ǒذd'òe”=Šdò2Ÿá†kÑJwiBÑÅæDߔvš³‚HÂô>^å OfV{a;§,;sd0Ò#”&n§T$ð§’v.sVhPœÏ +ºa3²A5}PI¬-ÈQ$!3qÁrVC‘´~˜`¤§%ž˜ÞÛè%JXÂÐÇCRáœ{4Î~D_+™sʂ£ѐeëàšù5¯Hß ,O»9Íx‰'ˆóI>:“šçÄv•Ô”t²©QÍíz Œô3¼É0¥C%¥>ðœs6îƒO§Ä°C‚‹„x)fÏñ@zs-=—YŒYxU”;q4ã”Ó…‹Í÷M:M¹V*` $ä…Zî;¦™çü±yˆû¸óÄ r\ÐJ³LRneZ£ƒ3Rµ—?#Z{^`æѲ,Ìr°÷&. +ç!u6˜0\î"åÑy \êxçZ ;P”³Ðïá{°ƒ¤ÒïPg¸äÅ4sEҐ“ÎT„AçÄ%§}ƒ)‡gš¶-' ´üxd)“0·þÌõ +#ÀsJä¦ÔD@’h¿¹„" £–‘™‰Dפ-*šÍ·‰ Í|gt&½îÞ«¬ôR¦žòŽ€Ä†Yz³W%Öúá z¡r×ÂÛÃÀm*²’ӝò³Âk·À×L:vÉ«,¸êÀ.™{ñã(J ˜­¥Pçd2zt0„$·Ü)Ře”8ƒžöþÆ$øèÊ« Kr1Ñ÷è1;UÝX‚ÁF”‹:€»Ñ¥XÌCQ9g%ÁÆܗýXP#$•t®ØØGë µ=*¥@-ý¼ES$IÇ r²âyd×5w“ÞÚèªAx * g[JŽ^gŠ˜D.íuŒn9øª8’Ú1ôĝʇ;ÃÑÁ``Üõ¥›€!§YÖ΃>lš ›k‚@%hñDµ. ± ³…²pHÜiüÈN—ÃYH<œ +A¢Bþ„¡¸ŒœjÙÚY4fIƐÄÙôÈIÇ!é В¼+¼j +=È©ŠUFS”û¤áĖVpÑxšÄ žø‚4÷rfÜ\ ¿—] p’eu*›8–øœù–r¿RtByCI¸‚Ù'ˆidD æ€A;žzÁ'I2×8÷U ÐÛ¾·¼¼GšøsÙQŒ#E¥8y³Peõ™.žIê›æ>Ã(T¸ ÞÈm’ Dy&T‰SŒ¦§šW™¸*֋íö¨Î(~4É@ö…ÀԗÁs9`Èh˜c^/E¦Ú͝ åJ+9 ’LiŠJ©ÙÐؔD”Dç/»¨Ô‡Ò´›)dë'-ØHž„bg˅<ÇE‘+f>ÀW§¾F\ü³o\FbC„Eæ`\ó¶¥;¬SçÞw¯Só‹*¥˜fî=2ÕÓ\]>DG¶Ñ$ñaÜ҇%4q’Ò¼ âªudŽ±.y×ؗ7sE§°ª¹oÒ§’,ª|“q·5täeWšQÌ»ôÖd …pŠ–¡¢b­¯ï…f)øî]ƒ‰æQŒ»´–ÈžapË'ˆQä>WtXãkCNÁÇVÊòE9rÊ©‚JôÉÉ £l‘AÌ)à‰ç&2dlÀª#¸ Ñs}q0о§ÆÒ{lмéY:Ñcc’‘º-tæ³ ˜Ýìn»BIbB¦G”â-ÐÅÌáûê ŒEVÆĕ Þº ÚSoþ”Ú‡‡C¥Wîí”ÂÚ3—¨ÙD1g#ñìÃ.<—c‰Z¢ÏÿdÞs©œQÀ%~0á÷† <ž…“ dª€±3ð)E§Œ“«OGdîCûŸœÈ€Ûzé{38 ‰Ä9iLD®¨Td„B îO[[bƒcŽÎ[_’ ṯ–sé{,£Â eܤŒLWÂñ̽ÁËô¼öî×$³\Â]Aâ3è¸H›Ë$­éÞÁ™rƒ ¤]–…f)ÍF”sÒ©0Šœv¥½±XOÌCJ`öÕOmyKLG¢dÞÄÖä±ÀP<‡AQU0<¯­l€—–*ï©Å7ùç¥_¦XD3ªAä«,»R L¼'P ên¦u¬µ9̒ʣz0eˆ×qÙ°ìÞCÕW’TU©h-0P_‰“NʈÞ2òªE‚À½FI‚»”6OÙ¢u… èYIL_EqØ*X°ðÉíÜ)RÅ!G¹×®îm™¹SŤO&DòÚ-/¡ú"±”<†PJ äÚU•¡Il³¨Nâ  $‰(— -½XÇ£ZLŠJ¡ØâJ?¥TK“:l’yá4ñz*À…7g‰¯·%½pJe¦RÏ0B)<ÏÉ_ˆ)´‡'úÁÐsOâYèêàè”Ë€Y éÅfM‰*W~-\8Q…=¨:æ0ÄÑ¥ö’–Ôµ PÄV†õÖÚièc´@®œ“cATwàÚïUíj¡iËTÝR`Ô+w'…rµÓ=î…ÇLúÆew» Ïbæp©X$eÚ ¼[ -)ƒ+Ê7N#‰Ÿ*ïÀ4x8ãñúȽ#ŸjZoMô…Ð`nÈ5W,Ó>û0±¥SRá¢|f'žŒþñpJåNʕYl¦ÊÌ(~ÏÜӞ8©+](cƒVJE×ÀæåoB½(Gèy¸dÔ8÷1rd!`ˆêeÜC°qÒ΁¾‡•ç ê0¿AVW ‹N ¨Ÿ˜Ó¥C +-¦>žÇ?Ï¢ÍDÛ³Z%Qj⢠+Xý”û2N*¡Ò^¸È<«PXŽ†tS•QéWÃHå-Eæê((ásYƒu€ŠŒuë€áŽ m@!Y­üâuUU•µ±8»œ•T¬—ø¨„±)sÜ€¹ôsAµµQ»h)oxp™P¼½ù–ù¬°F%Y€kE6\b† sy§¦rå¡ì÷váPƒÔÀi’½zD{ω)Önnƒ½¨©]ìք,x´ØÑ8OsG}$¡t“‚К〬}Â{hÐÖM‰h8¡î6(b‘“á[z©(e¹°3…Ù%ÞQÄ­ˆ2J紂(qÚËgÍÛ6æ>+ñåX¡Ø§Eȕ÷™QM'|X¥ }‘‘“Ê>QÍM;ÎàûYr„¾®;I±ì‘¹«2’²¨¢Z–zÓ&bQ§HÀÜ_•´X×¾&–ˆL%æaÙ uê\-Ìò¥S™×½(ÍÏ6vÅASæ/A +e™1‰Ž2çòÔ»z[.(ª‚öCô22‘Zásμ+ßÉޔ¦ÿ _ež˜[îƒLa}xó;jˆ”h‰ŸŽ«ødgå +eª%÷¤øB\$«Ìúê퐫Q`(]† ÄÙrÇ+¸KÉG`T·ÔÙ è +¶q[‚"ðÒÔ`t^`ݒòsâç ¶„µN„îO ¹P®iîk²’X @A9ÅYÐÚUˆªe^tS éúr=™$ Ì|¹P-# Òïg´iZ`¨—@ŽnAL„ƒ8EÆ~b{ƒw؉G•ÖbÚó€ç¡tž]|JÅ5~•›•MŎy !{4ãƒðµ}´S… û’nXmÄc‰XLãÂaÒª›JZñÛí+/*U ÂbÅ®1£jŒÌUƒñ©¯m¨B9xw)%ÄçJÏÿ+Ó³Ö}{Ӗp ^TÁ½f3^Ì#½&¤¼SŒH©@2Þ¸«`©«éÝõü(£Æ!Y9B;3Š*úš'­DLh¼ ¸öÙޒª+Š&B`Jª2ú*CËH3O(CÚñLlLÕt8gm€~ûCã„#¦‚¹ŽùÄb!5a˜E ¶ËÂê…pRøÌs2ô’/€ÞdSœ-ÐÛ±xþÁ<[._—xR¥^WÃ|A¹ŽÔ2 +ì³ …(I'6I^M9% |þu>†Y1¯óÎÐÁ’èwßÁM›÷½ŠVV`/<܇/gNþA 7»¸ +ÊRÈQPþÂ:ÎRŽ¯£È' +fZ¢>r/ڑ +•h¯k¯S.R‚yàšû×yÝK†QÌ)òþÂÁ™””UWC + +ðF\³>ç”{`uBJE^I(‹c f.•²2}æŒìç¡"0jª^Uš:nDùôpžÃèÁ™šþA‘ûÝîBK5=°6¿úº÷"ñ±Ì§bœ’Ý’èòSŸ½RUWÄ_+8SŒÂ_+¨¼€"rPoà¡¢• ¯ ¨4DU™ ÷R°%ùôq:N,ÜW`tk©öª/qº¥u'B‘FáÂêƒ/Î}} ÆâÔÔrßãk´ÊÕöü5Z”ª pEÑ»A4÷q¨àòóu¢ušº¬Cˆ‘õu-¬ ÊEïú£‰¯×7_ñÏuo®j×Áµ)¥ì匲_`v_Ê+ÔHà>š•ùdf(Ó`%¼ÌšÁà™ÊÄ×¹MÈmqtU´$ÃF©1]”²¤ö%]"àj +8`5Ý[p=ReÏ„ó¨€.‡ª0þBÚÄ_oaOd›tãËKS‚ïBŠæ)Éâ.Û:ç‘(KEWæ{6Êt¾~ ó7ö9Ž%½šª>ø{%hV»¢ª,*Eâ/³¨zc|›óÌ#¡3¾ê2ꎡ3¾ÚÂP{a‹*«TuÆ¿4”GǺä+_ª½rîoc¾ˆ˜¿ÌpïAt=Y*ƒºÌâKJ½Š†eÏÂ%¥ŠJv!C%$Äú%Ýf=‡9¼TÚ*Uö§Ôßî«¥µ\Xxæob̼vko°Èýˆ|íÚ¥ÝÕ¼èZc_O`ê[èvj÷†=w“ÐmE®1:ø}†\ø`ʽ‡:ÞxæêKé î ‹Ê+ˆ,H7Ù*_ó, 5˜æúNi¡“‚‡ÃɅ‹{G¡k يJ…°4¬Dãí£Lm¨úH³œ.¶›ëC¼´åқ?/<œyO–úDIÓíóÈ)›•ûêõ<âðÎ܆ÕÚ³2õw_ceÀÜïM¥}f¾R§;gªðV›D1* J%Z=à‰ŠJ-† Ôà9Œîk â,– õ÷хÜAŸ cKF‹àtgt #¦ +Xü૯ÄìÏ=Õ>žLù|!`TQ#9Õ!ÔûSçÜaÂO/Iá®qph»[0­Oju±çû`yŽ0+ë‚àážfLªóA/áŠ\ ©>\€Ç’ÝhUyëög­˜û|ëÞãìøÁàt4Ÿ?ëL&Åh€PÐão‡ƒg£Þ`Ò¼ÜÛsðýâeoÿòé'ß^âo,±?}ÿèa¯oP}úÉÿ¹õ¥ùöã“Ão‡§~¾ßëNzÃAg +endstream endobj 49 0 obj <>stream +ôvÅOw[·ß\ôæÇ=ÓÁQïd:)Ɵµ¾0 ïFÙ6Ýó^ÿtT °oÝy<˜„áŸÉÛ˼Ídrë³Öï½®܃—嶯;ý©küsïtr¾¼õ sa›î¸æ_lÂÐ΋ÞËóIý±Qû«ܽÇÇ÷N^gýN÷|Rü©3˜Oz“£î9,àÁ1«=ðÞ©iºj´ÐèªFºÇLã›ú3øfC†ô¶þÞú±­ê÷ucC²69ƓÓûÅë^ºUŸ2姮jÞOúÓQ큎Šñ´ß€#Qû«ÜÑp:ê÷ú—çú̧ÁöµW÷¢°e¨æ‚QgϊGéxÜë öWÎcÔñåóqÍwÛiîsúöê_ƒ58"N¯ðŒž‹ÉꕶÁ£;Ü0Vñ§o“™D\ÐzºÃþpôåÏç½IÑà”~Û_Ѻ|›³ôM9Œû½É³No•ùbƒOc+K=u.Ï,Ò~&o¢Ê¿†W`ÃfùI1zY]7YòjÌpnÂ$}ÐÎ\ƒŽ`ŒWí~ܹ_œµî~zÝÃÒí k2´M žü½èNö‡ÓÁ©éçþp…tn›¶“qýá–ºª1CHX“¶)ømëBßvoezL¦£“i¿tëûÖíÃuIã_u%Ã[¡!F£L/žv'×E¶?se ºÔ÷0ŸtÆÅÃQñ©™ðË{汫ê`x4éMº+ŽøR4Ñë7™ÔÒCW5TؖÃZp•Bü‹š¬çz«Z[î%k´7Ç"·3Xí”ӝrºSNožrZ?R}§œ^ãÝåôlÔ1êUÿÛao¼êiý͸¹êi}kØN;Ýi§;ít§î´Óvº`í´Ó&ÿýâ|P ŽWW®)òo¢@YŸ£ÎioÚà\¦öWÅ2N{ýNƒüÈMdö7‚+>Ž.χýáËúðŽ-®ÇÓ[tã«O‰[ܱÅ[ÜN¶ø`4<í£Àx#ÆÂÌöŽ1îãŽ16`Œ;‘qûEÆcÜ1Æc¬Åu¦ÿü¯q÷¼ýPôºç¿À?ƒbôb 6‘M~ôº¢W¹åÖ-O¹ÛtïcÓéݦsã«O‰Ý¦ÛmºÕ뉩íól2´]œçFÄyþqØÿå¢3.FÓUõÇ6)Øsm]¸g£!݈€Ï]þyóÉ®Ì,ڔ©CžZwPõÅíë&In.ÙÝ.pe¢™¯#4*N›ÕàÜ4†ø¡+G_áüm+'ÜüËÎúÃá©»9á¤ß龺۲ áe§Û›¼ý2i7‘µ6é2ôÖr“f£Û°}÷–è&o»-O·x‡S{s’/nhҐ™lˆl2>ïœ>ØfF¹åÁ›ÝèT¾ªþlÍ>wU«²~ìiïìl:.š_ñ4÷àõ«å€ o<*=tUc¼×:¹%µµ'àV*çM'í~×í¼IëßuPôÍ·f®…è‘+c»¢>SêüÒ»˜6qTû®jtx×¯ç¸aÝýžÙ×æ"«û–‡lÃ=V»Û5W w“o×¼YJÄÍ:iumóýe»ûDwÚ6 +h;ùìãÈg»‹F7Æk²ýnûa½Î7,]n+< + .³\‘ØÏÎîÂÑ«ÑÆ7åÂÑs´»pô:̍íäs(ï.ݝÉ×äLÞ]~ýÏäÝ%à»3ùšœÉë©Z»sùšœËÛ~ñðîðwŒÞ¨ÙÞݾ­“ôA;³É«eë¯Üi±©wîìn„]8Üͽs§î}4,<®ç(Û¨Ãj;nºètõ«élÔñÐJÜ«>yHí±ãǼ†Ú_Õø™§Ç«ƒÆ6˜Ë¬ÁH7ŒÉ`êۓ{ôzs™›Q èF$šÞ€“}[ªçìÕ×6¥|ÎÞöÕÏyzs’Ôo‚¡qó Îly ç;ì·ÍñNs†øâ#]ï»! +Άñ’íˆi7HuÚ`é?Þrõs[7mÏ­ÅX6lÛm‹üsõãY1zØm¯ èÚ×mö'“DÙ$Ã.oÕwü!¾oh¹-=tÅÌèátÐ}¾É\h{×a[·’ÖÍZ‰v+ñZ®DvÓXâþuBý Šf¼uã³·å\ÃݱåfŸuÓL6ÉâcǸÕâþZ:͆éŸ[aöÁðÉ{ýþÇX‰›¨ž­¹_7l)ovDïêÈV^¬×ä¬ »XOî.Ö[¸Œ¿Û̋õþôÏÿ>ïû£&¡ñ×ÿ^=UnȵzM¶Þ¸Vµø–:§½iƒÍIí¯j¶O{ýNƒ +›¨…nolÏGŠ ¼æ³¶a¥ðž G—çÃþðe}Þy UÍOÜhž¸½JÛÇ Ä|ì8áUÈË[ñ}ÒôšÍa4€êºOֆñ‡ÍëÞúrõÃL7µ@Ò@ÐÝU¨8| ªlq°p“ã`SN¸­½¶h;ê¬(<sŒ†÷©\íE*MÖÝÆĬœÔŸ­ë»zÖW¶Ö`}Wã ¬ï\:8ï Eÿ¨èÝF¶ù'¯j´+ÂÈcïàÚ£òŠµû½ñe¿Ó-.ŠÁäIçr“϶-®Õêñ´æ>²ÒÇÚÃß´r='õmww6896å0¬?[¦lIÉ¡W…npÒñI}£×Æ1;lS˜FýÙº!yŸŠâ—úæè³Þª€ò™`ÃþÕMö`8¨?°N·;½˜®võÇ˟¹ªAŽ +®ëóô´7é½n2JÿÄU±ßú7¼v;ýî“aƒˆ÷艫bý#0žKê÷8–ÚZ~쪆¬V¨±«¼AÛøªÕéÿÜy[`戟tFÍdûÀ•é‰õwR¼l"¸æW¶ë«õÃJýðêFT_? /œêØúJ•¤Î wÑä¨þâCud{jÕìe[¹ÔÝE.mŽjÖ`²6̞³‹\ªsP^m¥úí¿È$ÙÝd²Ä¹©±KÝí]jr lÊ·‹]ºÖç\}x³b—š¬»‰]ênoìÒ6²¾]ìÒ.vi»´‹]úC[°tb—ºÛ»ÔääؔÃp»t½™å͈]ênoìR“¶)LãÊc—6ȅ¶‰¡XM&¸ùš½Ê ^«åu›ž&±ƒ»éùèÓ³µ÷Ùí*¸Vtd+¸ª¤¥êk¨–ϛ(©Ñ#W%ÄÜÐj§ÏzoŠþø²Wô†9lqèù¨¸® +DÞÐÐóÞà´8ë VV/iX—Egr¿I¤kôÈU tc_5Î Œ±_B”ýVÇØ×<1·&Àž5ˆÕÞEØG–«]„ý‡Y-v—'-¦Ì¿IËüÿ®ùlþÞ5?Ô¿Åí<3W§Å­¯~ݤ5}#Lâ'+Mlßæ +á&ng¿"­¨ö mbím¿à®K·¢=®`zÌ#›ñ‘Ͳ$oŵvõíg¯VŽÄ³m¯Là¯?¢^í҈äFŒhÅt–FÄ®Pw©?¢ìüÕróΨ79¿(& ŽªÍ=”›Ê¼›x$oo²ëZ‚Ç ?›7Ñ!´ÞjÞ°‰Þ¹ó+:²sçïÜùµG|­Üù 3:wîü;±˜µsçïÜù»’y;w~µ bçÎß¹ó¯‘;å[pèóän3YwçÂß¹ð¯‰gÓLa;þ΅•,ämÑï®=KýÞËó‰i°×…¼àú36ûܕÉ\õ%®ÞÙÙt\ FÞ4à(s^ÿ±Z&xÔ¬Ré¡+“YꟀÓљQ²üÔUÒ-©­=?tŒÆFLÚ ¹ŸbgUÜYwVŝUñã ±¾Äº=¦ÅÝ];Óâ52-Z-óîËQQ îi¯¸kÎÊÞËáÝ×½a¿˜Ü§w‡£Î`UìÂÎæxåò[Zß,\ôÍ·fÇè‘+ãYýv~é]L'+꒗ÎzàŠÍW÷{hœ8„Ãñ„ ™þ ²tèëMÞ ®_]#厚™æŸ¼:Q£ñp¼¹4 +Ä:à O^V°BMß&céÍ°®ÑâÚeA­oaÛY¢†;KÔε³Dí,Q;KÔÎ5/-ì,Q×ÃåìNÖåÌRhÚY¢6MÑÞY¢Þ—%êêŽÃ«öŽßûڑÓq·ÁÀv#ªÎlk‚ûM0¶¬3Æ KzފÊ3 ªšì*Ï\• TDRy¦Áí*Ï\§ƒ¹q@çÆÊýÞäY§·Ê!·Á'òº•üvgò5æ÷»3ùúhCÎä]5¸ =“×Sµ6í\ÞÞJp%~&obœEóU¼a“¼«Wёm¬wC«£uÏ Òb°»êÌS¥~•¸]åk*z|¤ÊWy0mK‘ŠúwŸ¾mAôöê_ƒ­8dJ#zsu#ž‹ ¬´QqÚlWmç¸ÁÔŠe<Åi¼ÁÚÊ;¬ã ›ê­¸%üFXöw +æ Q0™LnÕ^Ä?÷N›ü¹æWuh2Ñ`hçE£À9ßþʄŸnø0EÓ¯dX{LÕ_§ dó+Í ©õvcÍ7éÎ|³éJØÎ|³12z¶uæ›#ڙo®çؙovæ›-˜êùf«gjg¾Ù<óÍM5LŒ¢3î®°Eݠ耳Q§;éô¿ö¤ ØÇëνÙu¯q6˜^<5ÄxÝ$C>~檆˜´ëW¿:錋‡£âÓbÐm ÁÌÈo@ɲ‚ÍÖT,Û,ÛȂeíú—!N† ô¬áf¨ g£áEƒ£[ׂ>ŒhdÊ$öb::™ö ‹ÛhSê®,R…¢³)™žMTÍ2~¯•¹³970ÅmoÈ`“¡íB7ÂWð}1ú¹7:)úÓÁËã<6)l°ÁJ݌ Áº!ƒ“šBâ†ztêG4m®C'Ùyt ws=:°-?†Oç*Eè~ºÓO¯X?m´ÍvêNCÝi¨; u 4ÔúãNC½ÆºêÖGÖ/š²¹:jý1îTԝŠºSQw*êNEÝ©¨×_E½uï1KŽ N½ªŠ0 ão‡ƒg ^Ž¹çàûpO`ü˧Ÿ|{iñHûãÑۋ“aßti¿8탳¢ +)ú½âŸÿU ö 8ErÖÿçÿîžO_›>š´î}úIÒúñçO?™Òÿ~7ŠÜøSø‡µüïoáÛ7æÓß ìç–l=iýõ§¤uú)kýø~3=JÛI’ȼµ—·.Ì7ø{øé'{þƒn§Js_áð5å +?§­Ó o¥Ø0oùßèl“C+øs^†_¨9| Ÿ)>xˆé—èÅQ—MÛ3ˆ|f½€?ºÍ%5þ•¦üaWá¯ý²šïeöÝæ¯}9|€¹’-ÿˆýu/³ƒÚËì@üoÑ#™#Pf鳓tû»¬¬ÓÖËQf|ÒŸá\íå0ovæèß}3={ 6IXkŒœ·@ç\¶t.eëNjRKΪ[¦ªµß­‹s¿Nž"Nœ…ý}³¿ƒiKÚ:Z„H¨ »ªÊ3°‡SÈLDÛsT‹þúyŠfofbËB»ð°›c‡•f:êAÔ1šæE3ÇëϜAœ2íPYÌÎË«[¦|næãܯ‡“ëòÌáÄÝþ¬õã0Þ{†S%í4—Lz*ÌJ18SL™*)ƒÂÿìÌóà2¼ñŒ‰–ls)îÑ=øÌSX{îG˜bøœ›îᏠY}4? 3šEwˆ#¸ulN°Iùœ¾u|ÛPAgJäYdØØß¿Ñåχ“PÛäÖ1ð÷c×3@K¯¹o¬êXÕ¢fsè–÷–·…JY.ëöö»E¨d[µ˜ àÌɝçE§ÿ¤c0¿F­Ûæ Ï üÑhõ{Ýâ¨Ûé›×>õNÿT¼u/£Ã6jýÜ^ãÉ»ô‚ÎÝ[ÇæûÃa¿ÔôÁ sÒ/M{§NÔ¸uÌç>xs9M"Tn„~A~œ¡ªë0Ô g8é J`¸ß™L/Æ(0 +ƒÄî_”ڊ¥RÃ&5KQæ*þhÃlè„åiÕ»­“v¶@¨`‰—*ì~7¯ãõš$ Ü¥ÚÿÕn¤Z‰TÂËx*ñÓ?ÓA¡áš+UÁ[R{Úïiw>À¹`y?ý%Ö`¤žO¼û"ê |@v¢ÂߥǴZÎìÍ/ÀiU™ËfÀòø؇ZÐDµíÁ¼Ëþ*,I™ãÈ.¢¡ÂéÆ*㱯)š,ém²zÌrõ˜“•cyyÌS;Jføph?"€ÿÀ–<ÍÃÐeõÐQvH 'f¡š2²Ù¥_dFãœd¿ú13•æGî†Ä݈7úËW g!kl<¢XåfÃ.ْG+F¨Ü•!Íý]ºTq„â]ǗΌOÖ_ºb|‚V%£UÉh1ŠèÃ{\•²´*uù©*†&K‹r扊q7 îƓ¸QÐß÷»&åÂ]&í2¹p—-‘r#RnD4/ô÷}®A¹rÉE{L®ÜcUãKÜän™q·î’ð÷=.?Vš.YþAòŠQ±ÒlÍ<1?nÇÂíP;÷çý®<¶h'±E;‰-ÚIÕCQv(V¿i¹ÉpÞç’c ·[´…ØÂ-T5deø—9 ƒþâpˆÕ½—%f%€ŠyqBÕüh艹y±?Ì —˜²«IÙµ%èÏ{]b3C‘3C©Ø-3C‘«†¢ìPœ¬ë&ÃýyKìCÏIl£ˆÌžI;眱 ;Ê Ë9S`‚ÍÁZ;­fΦ˂²¶KhNØA¡º¢­ÊÚóvÂÅxç$¡Exy>7—Õ*=jó ý#nŒJ?^žT*ôÎÌoõúµýy;ÏA¤0s„ô‹yÐaí¥m‰bXÖf*Õ²•µS¥4¸ \£”Zàí¼dª¨öàQ@áæ\v*`4ÂFÀ¨¯Ka½1w|¿Ö|×ÿ< ¢1ˆˆ@xgiw°ÔºgΝè<]iÝ+ù¾NžÝáèÔð·PQ‰0R‘±v*RØm"OÒùMrpïñ#ÇG^œ Gö7Z¦fŸOŠã{ócÓç£ÉÛ~qÞ^^ÍðÚO-›âë˜ `Ó§´%,‹¥yÈ‚„5¨<õ0³Ll#ÝNñˆèîañ¢ @xׁEm>¸•çhÖYÖºGOr»B¥[9aÔÙìž/ÃüÖ" …ÐÒXS¿ÂÂÈfiT×b³d™¸sƒáœÚx ÚðÅ|8({„˜/‡XøTb^Œ,z ϒ¦ïÚ¯ó.©f^ã—Ý&¬³ ·ð ÞQªL)X¹™ŠÎÚÙÍ}@1 šc3ldŽ×”N͈UçÚ,˛ã‹+™e|’.ƒyv<Ç°g9Ö.6Ëì"6K y~9wâÖrÏÖà…z²lJüIƼ-äOøT"=/”1/lø®ý:ï’ræ57ž®pÐÏìðXµ|/Žï=I»Œ¹]–Úï,ì¼tlÙ¯zêp…‡WAòÎ>ãXýQÏzoŠþ³btVt'VA±šÐ+¯WÉv¦u‹ù? 8ìܟ¢®±+WצÝWÅ`VQ› Æ2 ]¯Lf҅ĴYšè ¼ž©NTË+ËR®«ÜœK=­,¸íD©í +ðU~Ähñ¼-†q-:F{çiøl˜¦áiªè0€o ž±Â̪q,Pæ04»›3TöÓ6Úⵀ¬­u*-COrež¬§ÚÿØFóÂsè$¿Ò«öf;³7Ûa8e*Ƶ¿ÏÒf/¦Ü^LU`Öð›>`ì‘ùb:$Œî÷gû“jªD²8¬À¦Aåä)}< ºï~À*¿‡ö|)¿)êDè݁]ÔïxL¯ƒ…Ë\+Ã1Â9©°BL"U@‡Äu;Kr4UÍ=i™” +-q$„“kšãOUâ9Z!ćóï²=ÀfÑë÷JˆÁÙÇÂËg¿—‘ò›Þ]/ÜÔ¸¯4Sžæy˜Ú9@x`/`³ßÚJŠœ@f80‡9ËrúìאùÖV\JçÄü7å»PÌ`¯>ðv˅K[2kIC Å,ÆÌ`º¦¸½Á«Îôlüsçe5‡ÿ̝™ÖBKó 9aÖæ”p¿”AP ‹Í¬[-˜„¥‘&ö}è_ –K!Ëd VZbvW–g’!“n3ŒÛ=À×[˜á-If¤1êмOq8cìwn¾cÞ-ðdÂZìl tƒRk¤#ã¹h"SË~r‚­y«Ì ›€­É à9@o‰äAh¤í4–OÀ=¡Ì‘#î\ J ®,—'˜éU +ðx̑âðؗÑwwÜرÈÐŽBßqæÜ2¬8GZ$ðÁìÄ<ÓÇ +#c¨9âkE߁ò®/âújv¤J_¾× †¦)L/=m×RiaY6ÀÁ_"2XI–$ŽsÝ0‘¦ßæÜȔ‹ +· œ¯Ìz^éÑ +Çf¹hjàB¤¾©y‡¡‰Î æ3<@m-3KSÿdê”P¼ Ï"«6ëÖ°-³–…„ø5xKæPò6×Z ô°¨ßôhˆ°Ù—€Y&BÄCñ0Øzu¼ÖÍâç™(íÙè%s؂OɨÖv›_@®Á÷p÷íÄzBËìJ#r¥á»Ä‡ê¦ƒdô‡wšìKÜ÷.*!Ú0-ßÂètij˜N@A€è-¢Ž8Ôϙ¡XÕ<¯U<<ót.ÿ”ù“™ #œôÕ¿•®_ô´ë·ÃÆeÚá1ï ‚áKèiúê±À½žv}+÷ݎgñajZq©ZʈdZ(8V¹JðXÕ*á7ãX}Øë_T§°”ŽÕú‡$:µ¨ +æ܁¿¹ 07Ÿ1ޚ`‡ >[6àž­‚EϞ9¶N’gè‚à°¸/"ئ$³(ÌQ™šƒ´DO.±âKg·Õv ¬Kâ¡ÃšF:U)†g˜sŒ%àvMáÜ4Ò¬$tUk<—¼úYmv‘9)ͳ9F¤[¿­áýif5%iä™ï5Ërfy¥Û‰€ƒ HÅÐ)ËÑÞ¨˜H²ÏrÀÌ1ê ì}øh½.3Ðû”¥MÌéƒ=~H6'æ®&¿ó¤3~5cyCïK@7¯½Ÿ6ߋxÊ©»ñŒûAùGÃÀöàg|ŽfÎ.$M™²2-c ¬4l[*DóºLLÕVhŸ-Sµ­M-<«Ú†Æ+!xRzXDɆCõ¨=5|bBú¾Æ”ôCòφa;ô1ÀSrŽbda3Ï _-¦d t‹¾Í2Úenc˜ŽdrfOÁ^a‰’æc.t´€ DcìBÀC<-0"f Llf¸Cï)â{QâDÔß'¢aNä‡Nœ(N4KµC²ïf%uQ†áX /b™ŠÈÁ€ç¨¼DIÇ\â{DI°ÊŠy!ƒ—‹,Úà%Q2J–€0Ԁž¨zQÒw7"¤Á¨-îø;QqŽZäÛy:CĆÃT‹ŠifNv&Ó2—”æ´L¸.ÑP˜!%""¡h§Ò~=ê@ °@¿Cô˜‰þõñ|7#âù±,ŒÖbŽ¿ñæ¨d‰—ž>"âÅ0aqU¤Afв4+Oہ˜vFnã:>FÓv¦R©æ@´ °@»#ô˜‰ôöˆt¾“éüHÆjÇ߉ts4rg5³^÷˜t1 ÈX8üíæeF0ÍÊ +ø¤,ÓÞ/bv LED»@´ °@»Cô˜‰þõñ¦¥nFÄócñúÑ:ÌÑw"Þ•‚§‘™¿Leº$3æF͜$âUÞ6’EDFúKŒ‹Æðœúf ×Çâ"*e©.I‹ð×ê{5øj´;¤ðýˆDEŒbxŽà1¾þ ‚JŽx$æÄÄ#˜"ÉPžNЊ‰GYL<Ûüs$Øÿ‰çañ"˜"¡öD ÷ÇÄs݌‰GCñÏyæà‰7K¥Y0&ÁüIlòD á*¦Ia1õHVó:aÎcvßcÚ("]ÙñZOzwL9êcL:ˆÐŸPGOºYÍ¥Më`ak¹c:l>'IŤ#‘+& fþAÝ"|tÞK4nà'ÂÑÍ{Š¼–¯¨ŠŠK‰^åD*Cë»‘Ì ªI^ӕV8“fÀ ÜI†¡V8”`Àk¸”*¨·”ÖU¾¦2´¾· RuçýMPei<7ïs*Ck{`Hó~'€®áyª ÚRW¹¤ÊÐúN)šsKpÇD.Í»¦ÊкÎ)м{ + k8¨*h¶\2©ð\•¡õ}Wæ¹ +ïB×ð_áss¬2´¶ ‡4çÅBhs?VÕV…ó®ÚÄÅIۑ‘)¶¹¹"™:26•¡õ]]A̎lN‘”Íš¸»*¨¶œÆ~°ÚĉÓe¯å ‹dæ2×òˆ9ºLãµ¼bT«'C—i¼–Ã,’ŸËD^Ãi¤ä2…×qœE‚s™Âk9Ï*hVOhžáëøÕ"¹Láµ|k‘T\&òZþµHRžáëøØ*èVKJ.y ÷[$!—(¼ž .ƒK^Ï Dã×pÅÍÓ«–X\"î^º —h»†§.¾%º®á­ ²p‰¨kxìæéTK.u gž—K4]á$ÝM›;õ‚ð["鎽y*Õ|K$]Ãç„ÞM×ðûѶDÓ5|AÚ-u ÿß<–uq­Â“‘­È]+#úO£â´7yÕMŠê2#³y°â»°µ ÜÇC[-‰ç¹½&k!1à{[~4§®­­`¿šoæ¦ï.>y„îç¶ZÇà üpˆUŽè×è!‹éÀV7Š^Qî€ë}"LÑHÜlÀ ÔâÀ0™³ù•YñÜýƒN +ÿ¸Ê=.v<ü¼=µgQaÛ¼ÔÁù¯>³Ü6µ¿ ¯©#~k/à¦øÒÿZŠí1*þâÄO:„®ažÊ_ëÕ‚Êìf”+xöôˆí½¸wôâÁ•’PÌT Ár»8¸‘—àí\(E0a^$®/&–À8°ÝÔno,hSÕ TWDGÚ2BðjîëX™ýcÔÂvngs…¥MPt]¤DŒ¶"@`ûÎAðÁÄV9ÄÄèg àâÛû(g±T¡Š¤r :êkæ*'UÁ“XÞz_…+‘¶f£§ƒ2H¶Nõ,j7ÓÙ:ÛL·…Ù¶P)$’3RC…Ô–ôJoH®gÃËï.K×ßVVÅo~ómT7D¤®°³•9íÅvÖDô™‡Ï{q£=‘µ5Ão{n*€œÙ$KüWã +Ÿm¼(~ÄFx~âãð4beX‰>†þ¹o”ëÂo%4=ĺ—ÒGjBBOãA„J€H=‘#® ú讧°Ÿ±>ðE†eÂZxŒ#H‚§ wŸ‰j, D£Ïîa|ðft¯¯{¹íTè‰o”ñ>ŒVX?ûæè \”?ºþø~ÆŸ8Ê"Vø† +}""ø¾‹|AàÉümvà‰Ïr —Î ½ÊW-j«Ùì%KñÎ^ç»/—«/ô)xQ&nLôh.¢Š¦.¢>Ÿ¦Ú¯†h%ÎÌNºgÑSéSz˜•—ÁüŠXV­a±iÑεáa)”ºµQ°Û__úùÑÑÒ[}? â®ª4ÅÛÐs‘Q»…þ a2ŒT®…B³S†:Ü¡ž3´—Z@ìT²4´É%Ôc!½ª‹ ]fÞ ¥ ûB,ЅŒ±ð&t1•ÉvÇ7¢{,³£ê.)¬~çÇ'‡ß=¾ßú²u»Ûuûű8þ¬…Ñ•fêÌæÇòìŠv’14™¦Z +kGIÚ"cfï{ U¹$ÇrÍÚÈg*AH&À—eÛ +ËM2 \Ó+]IÆ,Oà 4áÈ 0 >[ÙÕÐ-UðS%~ã.cΡ´NS§¢™þ° /`ÏÁÀ߂¿ZCôJŠå¶gGs0?@»ÅÍ\1ƒ"vj‰N ß0mó4O`if)ÎÜ\§aãžÌo:è¤L%è´{P¢˜:¸î[ , +n+Ò0(+p5i²õۚàæ! 3åNÌ÷sƒbP¨_´$3œîtg@¼d<ÏUv3”°¬™ÃÌÞgo%ͼ^}æ$s*˜ò‚îĽøÂIxá-¯ÙÇX‚årŸÕvì‡CÿjF’yÑ-B¡ZˆÕ™5á·ª©Û WÑ"m +ØãŒÄY»ÐJ¹ôî„z”Рé´ÕÜWzÞshð&3Dãf^=c‘dG£Ô‡„¤÷йM=NœÉ%õ24 ¥Yìn(ïMëI³’…—œTëÐÒꇩµ3Kj•[>~õē/†hÈÝ÷¥OÍHÑ`Š«æ¡øXUË4«!ÇÎÙÙ_€sV‚o—£´ÒDUq3DÕ£©9 æêäûÿ}ê@‘Îg#(ºjAY›‹—¹ÂBá™5ËBÀ™°%¸µdÖ7ɘrò*“2Ø×$çZã<ÚÈDà0¡ |%F>ÉSs€µ«Á% P+Έkš +øšÏÌÈypÁ!"ƒÀôd]ɝô¥E"Áålß +Oåà[5zžpì$¦»f¹*p2ñŒÙ.Aµ@eO:a¶>`®Ej«Qc0qÂ8L3Tê“ T•ñ“—²ª‹º´É§.2¥áClÍü¼t™ÃȺ¹¹³ákgÏYC±·zVÛ +`œ.ôÆ]+œ*„®î> !oáÁïքŒ÷ùïð Êìw.]cÂë©Ã澃‰ÞÝÈÃÕB>ÏìH€–[—)˜ú}—ð[Üg ¦Çã/ÒZ-Ð ËӀ¿¸žîÙ+y½Ajö+õn‘ö¥(ß̍@¹‘“‘K´ý Ïëcx!e¶êÑ4Ç+UfU´ïÕÙê½·òÆÓYei•\Dßý2*-²xV¬P¿zñsy]—–¼Š&»¼þ*V©,/É÷áB#ڋ +fžö²bΡ 7d/4ՕsÞà½szz­÷Vιó†áu: ż<Åøx#ÉÊN' ¸UáüdI^±LhZ.*·e®+¦*@ÑCgîU¢âUôäÅnøšÍã­E½WŸ›»ð¢"ü ²(ÜíÊoЯ/Š7““bTôºçLJ¯¦ãE¹ç¨sdiÊPÑÈ Îjè 6j†ÄTŠŒ #'þxoё +k& š?Y5\K‰|«0úo‡ôm¾V|£/c»ÓèÕÀ 3³-~þTƒsYÒá¾Ò·=úZñ¾Œßßdp…¥Êð*ËV&˜Nž%) +îª×ß_¦­‡×ÃQoR Zç½Á/Ó³þwō”Çƹ)‡KEè­ÎÈ×ð%./‚Ù‹Tnoÿ &i©¶uÀæí”eM@.ÇD“àd”É̝!xcÒ¶©àp4d˜‡ ñ‘Ü^)ÒÜ:A«ÖèÐ*Ð{¹…X5[F>˜ 4jf4u™&öžFÎlfŸ­_µQ:ˆiJ¨y1zU%hØ*4<EJN‹ +²-àwÿ.Tüã—wQ˳·TúFÊÌ\ÆÃÐ\l‘óÀtՉLæ¯ÑÄu $̋ÂpxGo+,[MŒ ÿ9N–J™²Wü [EE%2CÙØF¹æ¦?@;'v'fèÒ:™á¾MÔ4#„#g}ñZePt€Ù{MÐæJ<Ä»¸> ô÷Øê{îÂh.hK;„yxb}'8#f¡0)@Th؃åÊ ¹ÚÀ¤€cM´¦- 4'èbUB›N0aHÂìm½0Áhç aæ:…‹¤­í6® 2·¾{Beô:XÍH騜¾L‡~㽬R”ÛGX‰#†/‘ú…TÚ<ì;„X'ªß¡‚œìðlÊáÞXžÀÍ&(éb¤§ŒÆL݄…1 +ïTL9Ø7À¶bƒ©!Ó'5[D*#b+#ItÌ{PboüFÿ¾ÊÝuŽ2۔å9Çë%3–ƒ\¦S·`‹¸3ĝ·oWò20>®ÉÍÀðYÁϼ&G³Y‹§Ùôö5¸ZL—˜¯Aºägƒ”¸¦¼Íœ¨kq7óÜZüÍÍÎB›ó8|nŽËhŸ3âóZœÎkµ¹Í•‰ý&ît¦ë03Qçá+x‡ý¿î§æ›hÝ{|¼?2 º_ ŠÃމÙVÇG¦ezü°ß™ÛÁ=šN}Ü¡-˜wÑÃxÎÀÌGW—ãÿÜ—wx͗—©}¹ùŒÿ³ÿ–óÚÞ/Z¢ôöZÃßóUµçp5ú]ß l‘ëAßiсbwZ.Õ$؎˜ÿ”€âcgÑvÿÌouηÅÏÔºÅÊ_ÅÜWø/lCiŽ`m÷lHe¾qˆ#d™i¹¥E²`jsû›™Å£É[3aŸ~rçOƒáÏüíí{ý·ãqçøÑÑg­;ߚ „ãêÎ=s¿.|£;ËˡY {}3d|îà¼Ó´l ¶ž¦;®ÍpÐßù¾7î™ã‘V 9štº¯!ÙïŒ{݆ÑðUÑǟúOGîQÀ † ÃÉó¢;4Gâ)þj:j´Ø@I(¼s¿8kÝm}úIëv„ %ƒ»-|yËÈ­;Ï:£Iå(†ƒÓioRo€ËQÁØQ|)m¼„ôݸxðº<=µ•Å‘ābOýBûl~Õ·þÊÚÚyÚì'Î;…ö%t†JÚO­ËFögh:C{ߧ”¿*rÁ‘ždƒÓ "‡Ì¥™½!75ª;šærŽ·çf¹d,kj£_FË ¶ß/ÌAöÞ(vñ­±÷¢1Kežyð¦èN¡3öGDQÁ2Q{Ùnù^z2;Ãö$uÜóéÙÙ¸˜|†ó²ÅíÇýþõ«á¨]¼Kötƒ[SˆŒF¤L¦£×ÅhÜ=ï'FÐý²uh»÷àì¬xeÞqçEo²&¿ýt:•-Š»ß_ö;oí×Ï>8£÷[ßþ`éöx`;U›mîîú0§ÛYàWÆóY×>þ±· ël[GØèœj1Åe|Xõ..ûá°rÂF– H HŒø•³4RÏÖ^ÏÌ.œÔꞺÆÝC øî¤ßô»“~wÒ¿OíîF^íD€0sˆé~ˆUÏoë`8^ÿ^ŽŽÝWÅ Õ9ÄÅ >)–Ok3¡¸u¶nCtüt¼d3ìl•7ÖVù.ÛYÏj³¤l3äêÝÞÄ=Œ"V"4Dú™\%h%§`g‘PÒcöï5°ŸÛƒ3¾éuù©‰-AoêNڝÞeõ©ù䤭?u“¢þ™ ©¿*£3óùª3óæò²|ÇËv¼l+å‘kō2(V°ãF ¹Ñ~¿35#ù¶Fó‹bCœ”ׁ-aF¦à‰½ÃŠi®s—~Ò1µâpISp¶Ïåe23ñ ó2SU‘“ÉÞK»2 +©$ՐÍÛæšg)Ç|k–ä˜_ uB˜­cŒaP@(‘s–.!ÛVB¥i +×h˜5¥”f™[JÂHƒ ªÈÔ§sø´„BP y ¤³×M[r¼%ę@1åPŽ°.!ÔÄÚJ +eZˆŒaa’kª;`æbÌFäJ-¡Œ|Ÿdù F«۞"Uæ•À½¡Œ„åømaWœ¡»N¥F~Á›| ¥?èüÀ‚‹ð‡]¶v©Td9,‘¨ê¶¦=ïàVL¦S{¦€Š}‹—NºÑK‡«ÝÚi¼v¤Ì28ù8„„Û…£H0H¡;Ö¶ö¨…ëFoöºù(Ëfg Øy&šèÏßy—±3æ}XÇ.³Ê4Hx¯8ƄÉÓ6Ü·Ýb¹‘SÛ"On^DÂÒé$çVfÏóTqÛΌ¢±®çæpÈÃ^÷†rp>^l&Ÿ¼n!hËCW˜Û<¶Øôþ'÷ÀY¯¸ì ÆEÿb-J|¼ìϋ~Á‹!EAZK=þø}gÔ …xKÏÝ/.Í"?µ?)zì~Ïôé#À¢A1¶–ÿ¼üËD==ùûs³|¿lÍd·VÑúNœr —7Ꮘu՝ï½îð´hbú¼AµÉ%ÿ.YŽû¾¹ôŸÌ·zZ<‘ËS3? ՏòòÓ×Dóp—1}lÕã +  +.2Z§Îs¥ñƒJ˜ÀØS0=ƒ>êÌõ³–-C•él½Eøí‹v¿ÛlH×>_ÅO£¦‹yè³³Îi˯7 B„BåpÛGóñI" rÑï]|æf÷Òß“ËÛgw˜”xßêÃÄíKw‘ç’½*Rž¥»#c#ƒ£_ó£ەàÐ\ƒ +漪‚y’,¯anëy_çl>S_~·ˆ>þ"rwÏmôRW“µµó/²÷>ý7ÞtÔ=/ g€,әþó¿ŠA$Òl ehgA_aÿº|á„Ã>Â÷GýáÏ«Tªû£áeëè¼s:üy±UÞGB7Jl#²MÇų£Ãýþt´Ð˜Þ䮓w1¥»}§jAMBÒv/;ݲ‰ï„úJÚîI`眥¤Ô!Ám@qëÁ›ËŽaªûÅÙpT´¾78é×à|¾6<¹ßy9îžCmº]üïŽo3Ž¸ëûbÄåÍӔ_vz–¡yßëbdM|ʛBN;£WåFçÃÑ/Ÿ9DÈõºãQ÷³æ fîlÇÜßsÿ«á­³|NZY1§U² ✿ÿSåYkaQ,Aú`p ]]ÉôY§_˜h‡ñì¤~¿oÿõYg<.Ff‹ƒŸ>C +üø ®üçŸ<ëVQ R“þù_ôsƒ-¼ãçŽÙÆsu%¯ÛÏí·ž'þIÊànQ| ULf-ÒP}óGEÿÄ·O¹NÑ ”ØÐpôÏÿø–ŠéÜÞ¼Öf\ ›¤F +¼í„öËk,a{H0òíyšÛÔY¸.Û]VÇÊíŸt^å»ãain† CÕY®1˜ƒkÎ$¹ÔÒeÙ¤†d3J·a6Ûbý +.2xô•È[û_IȘ˜§S{!šä_!àj íαŽfø°èJ—ö¢ Ã.fn¨õè+žÌ"&R›Ö'=Í´M(Nf—ã ßÙ2J{ôUž”PÂã†Ô˜å¤)v6S©r‰Ésáç PB/™ù×àLbœ–BÂ}Å0-š ›XaÐK?¦fÝæ)ƞ2a&€p*è&ô{ÿ+•œR1áz%X–I‡ÌåhäþƒË ë‘q £@:Š0÷p§qf‰'0tÚ¬{aCî3*gª¡£óNŒ™ÖF©GÌæ »šòDdvÉ+—×­‰Š†n‰Êý*’ Œ8‡N¦¥–)³F6ƒKãû$!N·Ím(·iDˇ[j:” +ç%c£–aW¥êØÂ*Vòƒýfä6gJi®pIq[óÇáÂÎI˜Ž4L‡n!$\? IJ¹f'&©²3 .]‰7}ØÊ°1¾è§ÂžÑf/*Û ³¬ufç‚ѬúaÚ5î0 éGÉX„+“ÓÁò$þI¥º›aajÛ9ŸI—Îw.… ͔Œ®a$ƒHÚU }ãÏÝüpå«q¼twuª"’¦Úrà /eǜ.+¤%Œaޜgý>Gòx²€ûJ¨7Qೂ©#MeÎ2Ëñ…9ÿpMåYŽÑ4T€[Zc0ˆÂñ’ÂVgxbe<`N¹°»CË1g21ŸñtI†ƒKЙíΝÒÁ…çVÄ,…‘ØpöRiØ<®ÂlLP2»—…U§–[hlfö`颉*fÊl¢AoÉlvǍj¨£Jþˆu;Öl´ˆÌ9Â9ÐXjm™§6‡Yjw©f¸oS#O"ãÔcF›.qqI1ÒX £¦­æÜ?(ÅÑ"™<ó«?³”ý±wq¡-+‘¸†¥‡ŸŽºç½Ó¢¨ñ¸o¾ŽÈŽ†æ£¨\ň û§6¶d%*ßÔ"[¼aÀ uÛÒ=µ¬öÿìs®-·:ÓñdzÖzö²¡bftàÈÑ1ɕeiš"‡7šWΐg˜Ågƒã@´cˆÓÃâã°ª#I#Í¥euÂæÁž€lCÕ +pø?  ²(àm*©,eT<µÍA¡z†ÅÙî êÕì‡WãfAG¬Øðs]ž­7g:–Òÿ¿$À¿À%/3ò…ÄãØT®â‰VN¾ ÎÍ~ Ü90ª\æßÀ¸aæ8^©3Ë^ͱ¤ì©nDíN¸´t\ڃM‰ÙãÒ¨–È«¹Q S+d™Ù·ÊŒ¦ŽÍ~ ¤ÚžÁ(¹èÀ¿ÌѕbÈ~?(áÔíÌÿŸK"Q€ãÀü¬LªÜ^ñÀ®?#ÈëÔ©\Ô£Ù^ÖHPς¥ÍcMp½²W¨Z¢ $aªÍ¿a þPœœuF'ñtKÜ°|II ¤bE‚~^’Sá%} ˜æI4Y@pàXådM·HýÒ±BŠ:’ÚÌPK†T©p–’…Ê´Rʴ퉝Ö¦—;, îóA!µ¤Y,Æ%⮘½ªmîŠàÒ;­xjou§\ÏrO8®^¶7¼@áBãÚ +Œ¥:uÂ#¥Fb.Ñ'ËÒcÑ\>¾uÆfJSimÅÈ4S)1O³h\**Ig¹•p<‚Ö~Z´þv[‘‰/̐þö™³·½1XÒ(Ð'›‚" ½(zÃÓQgð7ÔIõ;ªšÙ·<ÛöFoUlveÒao<)Û^ç=˃!>­ªÌ3—LóiÈ?ü4¾•iކj{´æ…P,‰/Tÿb{ßéOÎúÿüßfÇÃ×ö.À“ô(ö̧-ÞLNŠÔp:~8|5ðÙðò»Ëj,àz9þ<ð€ýbrΊþé1бWµöJ?¥g;“éÅ›ÒÓ{}$Öó#$ÔÑÔ4¸ë»N{“WÑïðzмêLÏÆ?ƒ »øôˆí½¸wôâ|ûË´õ°óz8ê™ùk÷¿LÏþùß®åýѪÌ~6wK£#×Ò»Ås؝šYž˜þwð‚K€…¾Î\vyçÇ'‡ßO‹?ßmÝ~sј{fÁz'Ӊ¿|òνѨóQѼ§·DíŒàk¤Ìb0sŸ&ý ÿLÂUš·3¿îŒÆw£ïqÛ×Ãt¨1ü0^ЂÄ\;כqùëƓê¤785Ãfu(eHzTL¾EšÔ WÜü‹k1ØÁp°¨ë¥ö‡f{ŸÖ$5}Ÿ‹âÝ Á–¢Þ\÷àÛZ;£Îì^ùä7g +_¾®Ï íõXä0ήQˆ‡׀ý}Ð%ú帞m8C £©¿R?ƾ9‚›P®W¶k+Ï~¾ë{8ùî9ߚ¹—‰“Z8âŸ{§ÉYcÊ]ËkÁ¸eÊ!ã6]9<£G¾<¯Å]|Ók1@µzhoêmÔk2 =™é•Cz[kHo¯É|<áÂñœ 'F´8,Î&OG=£ÉÖÞüC×FŠ@öx4œŽºÅ>D*_1œn×¢Ťsjä«÷Йü;ó«Sg$©µæ¢ÖòçÆ~¿(Na-~!§DãƒÑðòÞ¨èØhøªvOjð}ã?ˆÿÙ°7˜à€n?Ÿö‹QiÁ‡tfLà~B‘¾fpÁšçg߂kïg³¾#MšÑXžÝ{NܕñÖüzñ¼è¿>·°=z6÷ óø3÷Jê?ÄfÅãñ½Ñäd؝Þ/Î:Ó~¬ð‡5AmDÕYJ +@\vNOÉì‹.°º|6¾Nfa~xˆ&nwzÙkÓ1K!ÔC¥lû÷¸uo:¶žwƓbÔû¥˜Åzï1c-ZQ­W£ö§“ÖËÑpz¹¼mo<ìw&Eë‚})_¿Ô:o]v.‹QkÜ»˜öCî{ؿФã(Ø2RÏyÔ`2ê Ɨ³áºoM¿z§Ÿ‡â’g ±µ¸éÝ´vۗ£ÂïꕍGÞ:’*›dQS÷aeÛ¸+‡>°TdÂ7%£ëAgðº3> +äb¥©|6*ÆÅèuÑËvëÁioÒ9éõ{ZÈ·ç÷*>çmºFùš^¶öÑ`&NZñ†áÿ0‚'ÅøܯE\­ç…YGÓhqˆ¤ôÈÓéäÒ,ÈÉ°bæ;xؼœv^­gÃK¿ª}¼þ£þð¤Ó^\Nû〰ÌU_ /g˜jôãsEãŸiy¿º÷øYgd <Œ87|ðÙhxÖë*ÞÎNH©-dR–»3òÁÅIqZå³û«!_iŠã½´ÎüLÐï ŠÖĬŒŠµSÕtŒÙ@ã¹-Îøñ‘ag°fŸ O½Z 2M<ë™éàe'Ó#³Áö‡ÃÑ£h'ð°ŒfÛþqhVÅpðÇX#PÙÂæp>>x3 ǧXØô è÷£½³)®€V¦–a=0ÙÜñ]Iº{¶Äâa[¸M›òߧ˜ÑÖañÂulg—àée§Ö°™Ÿ§3‹p¶•áa‘°9qa¶ùQ·Ó¯:‡ÒhQu“^Ë «3öÔÏ3¶¤—ûaûñÂ7--¬í^Dê݊*ÑRpêe«:PseÓhHT>Ã8ϕĝt¼LCËfñÂý¾Wül–Û&A7lÍe‹ça§[„BAËZ㶘m¾˜œØ|~iª4Âæ«'6‹H¹ŒìØ6^·™l'í$’Ë S}8í÷é„qéZæ×EÂߌ¾wTôÿؙ˜ÇMŠÑãûã’丠íáÐl8UK­ã/À +¯®<¡öQM(\P:¯± `ʟõ;ƒÂœñªZDoß3Îð¬59«T®ø5ž‹t‘ǃÓâÍÃÞh¼ª‹³ÏÝá€Ö‘ΕÙj‚¥õ),½Äý³T@âU8œì0èÏÍòŠé[Ë#숝ç9,µæ9`©9ÑáêÃ0¦Z„ ˜æ(™Ý/IVcpUÓpU’“©²$MOÌûp8˜ŒŸ笐£fän¿wi$pðм1øK³Ù½^¤õÒ##^÷^›¹ÝH›³]ôšKÎ!þã‚-ü[4«¹º¬1à—_äókë.<Ggxß\bi  9Hq~|ŸXí_Ÿ§½éE$Ûÿñ]#[F›]¦l”… P}AŠ¸RDÐOcz#ƘÏ7ŸÏKó9×ö©“uJ²n²¨Ù‹ =ÇKÛX…æÎ÷vMìÏ®‰RÛ§³K`5±XëÁ³£Ԃ֫ÈeqÖ¤—m¼š`åv (fÕ$™Ã8K3&ð¯Z½îg0yË؊¥h}'Xxïü}xÒ¾4Š&†åÍtl®¼ºÓï¯h6~Õ»<1}5Ígۍ +(ÌY@G+šv‡ý~`ÓJþìdwh2,z&r<:›Pü›áÉãÁÙ°I,«(÷~(Nî|ß;-†wž ͹óÓòÀp D]64Îu<é·O­­Gá ¹‚Dðœ{ ²ÔÖyèòôÂüÜÔï×åi}ô6X"éŒÆ˦4 ÃðÈøPªÑzkUãøPª> 9TvÏô¤FëГãžTí¬³Á¤}Ú_Ám£ËÑÙp°”B»±Ñʽ¾j¶Æf¸ÁÚ])´ŒÛ'=&—Mú¸=(^v"ø‚V݅™¹†æ\¬ÀÖg]tÅЫ9Ÿi8>ïq¾XF-hULÀlàë¹Gnô™–3ÍtÕiðæ²]6P`÷ªšF³^8ôöU5}9×tACwd–ÝNKZ§ÓŠ¦ýÞ2nbZ€·¡SÖ{´^v—ql1^6ýØâtôøÞÄpÙQѺ7=ëÿóÿO/Wè3à +ñÄhj㇠6;›ºËVmäÌ~å¬8Að¡Î`àƒªÕel¶Rûè^IJÖ탡Ñ]O[Ÿ>z~Oä­¿Ý~|ô´Åx*õÿ’'‰„T¹¥úà…‘ +cÙ±J5@¡‹ì‡ÕÈJ×½x»LCZ'ç+5t+®Ví™UgFI1©ÁÙKí+Ùh ýt\ÜvѧP­Øߣ'cÕ>6 ©àœÖ{SôŸ#¨‚3òý[Û×#ªd EòlüÀ҈ûÔ!“îìSÞ0÷Tù]ÖhÔøeö±ok Ɏ:¯‹'Fûî]ö‹{3†••v“ÿïÿþ_ÿïÿµ|Kô¯úcsêvGg£,Y›®]7r_Óô?¼jA–`<ï®Îá³û÷¾7:A礱rx9±&òm÷›áIë©ý)¶RbU§È7‹œówö{D{Ggê~£Å_å¿=ýÍ_?ÿý_ýönçÇ/¾¿yº·ÿõèÑÅù—/ÿúÍÃýâöozöø×éw|þê˯¿{ô‡'òß¾<üÛoŸ|=švõÃüIv‹Iù«$ßÿûý—_$¿þúî´÷õ￸=þ¿c^óõÝÃQ«o&û/ÿøï‡_ÿ^G½¯þнßnÿöåÜ»Oÿl^¨ï?¼õ¥þË£Éý¿ÿ´/ÿ²÷Ž‹ááØÌûäüó?¤¿š>¼/ýÃþßû¿ýÁ¼æþYòÍI%¶_ëüLÿïýÛ½íï¿5n÷åO_ÿþÕß¾þrܾøüþ·¦o?:=3¯Az=üÏã§Óûg?ý ÷û_÷üòlÿ|rp®ÿÂJùÏßÜï²Ã|ýûûí‘éôøà?^þÇÐ|úÍ?î?>}ü¯û{Ùß}ïhïWۉ;§Sóšüï·?ï>調}p.ïþþÞ-ñ›Ï÷¿ýâ??ÿúà·ß=<(¦¿ûÃ÷ßüêün·ÛyŸzŸ?8;<·¯fɝŽõ~ýŸ_öþã›Óýþ­ûíÞèó¿Mïýæ0€Ï¾¾û͹0¯Iï~ÿÓ×÷Ýß^|þՓ»wôÅß¾êi}g|&Ù篾de÷þ7ãï åôo ýƒHN¿ìÜé˜IfO¾º½÷E±ß×Ï.ìþ|xëëƒÇ¿ÿÕ¾ÈTx¼ÿø¯é¯þ †ÿñùï¿?ýë—üäW?!Þ? n™!ý!ýݯ`ZþšþþûHõ‡ýWŸ¥{n~z˜°ŸþÿÚÞk;y½ÿÖâŒÁäÐäh2M6&Ù›d0¶ÉiϞ}±Ÿæ<ù:wÿ;’:©›ŽÀ·fæ7˜nª¤R©TQe¨åܓ¸‰ÔÛûˆ& ô +@CLK~ô‡=AÆéOñ÷|…z?ëȏ)hޞ·8¸K؉¼Ã›K.ži@ïÏñØìïeˆV“1€WÏ4à­L™Â'7å¹ ߚûÑw}&7BäÎ͏I°üûJ·söÜ·»²ÏO&fc&8í4"¯OÝNºžÍ¼æ¾[¿ûÔþ3ºh2þ^{D´œõó#ý-ãï¦ëdîï}”ýý ºcß맙ý¶y ãP¨9Ûríýº’®Wm2gU(ê0´¦¶dÓÎÕ°'ß&{jJ‰`x’ŠµOévùt¾œœ€¸%˜Åèô ¨ØAõ,Œ¡åû³§…wOæò#åC|ÇÉà›ÃžÙF†Âõâ_\f1(öIþψNp68©ÊÕBzTö ¾‰Ûw±1iù®¸ÒD¼Ý÷ZÃ85>E‚çfdNZL;kö'Ø\æíUÉñ+ؽ-6­ü 2j +쮵 LÎ`Í.~òÇPì«ÓL‡úÞwá:¼Wo<à…¼Ó1ˆ-Kd9¯dšt»6³a“ˆä2ÕÞRl¼èUì½B/ô 6OÞKx þÚ%ûœ^Iëë*Fæ}¯=QÃ2unj`^_ßd>e‚Îú’=.Oñ́°æÜã-ówš­3«ÍÛ6Ýþ錊°Ë;¶/^Òä ÒÍï3øÙ§)´WhÑiÍ}›‹A0Þí%óoÝ"#цÊgÛG¦Ï](ïǹ©ÿç=Ýyú:òß3¥›íÁ*ü·rƑtãΈ†{a[&♥e÷KÆ  &êûMÛ' 8[0Ñí!¦ç¼åyÿΝ<‚§¡-§Ð pÞºx!<¶ÇJÇo ¿¿ Œç¼¤[ãr–~ISñbÖ^¿yP5e<ýó(Ý:·ýÜSô2”ià›uêð5QK†oTG=ž¬g7¡Peb ÊËN’¨Xv$øg–!*žYš(÷ž#Ô'ê5ÙŸ&Ìø >€hЏÐ×åSò, K7ýˆúÓ3I1B4\„†ú|`¼Òÿxþ²è +Í_ŽyüˆÇ ɃoðF2HàO-Cˆg¦ ‡ƒše(4Üt™·(ËYîblÜÈ©É¡iÂ?­™ýÛ¾±ÆP˜~Ê ᢱ#z!¸ õ˧zœúey9Hã€pk°Î̚# Â_î›_ Ð$ƒÏÙ³Ëãïs+ƒ"Ëü5Ǹ„!M nJÓª^,i__e?DšԎNó ‚S£ R|¿r¯ µaל›ÍM,€@¡?ZË¢nŠ,k¯œ/4¯¾À A#Aƒ0; <àö 76Ä-,4šÒ|jz#uÄA̬ëϼ?à`) +3³aeB(ºG9)Àß·—°?ƒC¬Î-nßRhÄ^ÅIË£«Øwƃ­ÎscfI˜`ÙSõ6°6¢ ¤&ö2š ؼ,C‹R‰y94,!‘<àÄ.# +04ˆÒ ·‚ýà뚶tû­²!SæyØß^ü\Š¤7àT^TÉq­%õ6×1ŸFÌZá44@OÊ-Sï†Î"û;¥ò_˽‰:31Ý%pz•6£pÇþ.cFÙr §5I隯%ëw˜òì<z3["ٟs³Ÿ«Tö|J™Ñ<ÝÜäê©Öð0ÆØÚsÆŽL–è ±ŝcr˽@=u?ZÀ~Ûå¿mw&èð:1“Õ“™.rs[¾ˆ©ríò9 ¡µ¾p›.®±»֑¹ýƒtýàgέ»ÖüHÁ9ès´4EÚ-"¤@i5Š4[DPë„ó£ vžå=\r–Qxå:éuè<-iu¬[Π͙O*ߚ¡ÔÁû4kqÚ¿`Ð #ž1ãŠÐð¨d‚f€Á:Í4R[¦ñôyB*8Q.xB"¤ÂM Äý‰`ŕ+ý…&ÊÑôOoŠ¡ßVÕvºÞ©¶ÛT8)[†"i"´±û YÍÁ)·ØPçõ\aù4û¬‡n•/ðÉq*집ˆ=æáíJØFq3šn­RvðÛÅ ñ|5“uoª£ÐfrÛ6ôZúœÞþҐýùÐGÁ G#†>]`®JfY³ëçõÛÏÌ4 +í‘afé}ÖsÏX¶'¢³õŠ€KUæYèÁ ϸØí"‡Ÿ6™ßœÇÞ§È:L1—Ãè4áÐWµœi¼¦^½ÖÞú…ê¹÷”n¼´Þ ©Ï‹àñ\ª*¼ ܆æÌ6öy +ÙÊ +½õ„õ/¤µ÷zJWzž+¡Ÿ+/³Ülq0\hyÌ}›“D.[4P$unõ 删ά÷ç@t>6ÍiR_ݙ•«ép[N‰¾tŸùÑði@9SúÔ>3´°GØË}@O€‘<ƒù©»ÿË×lü ×}„W€«j»w˜4Ü«¡¸/?ÏëÓÐXbPö|[ó_vâ#í·D@¾‡)ý€Æï3¤âɎ)WZÿ2·®+Ý°½.ÒͶ,<>C™¥gv@Ú Üž”C0Ïî\iPµA ¤‰Þ²:Þ~¸m2¶È‘ÁÔË}’eVa£#W¶X-œÊC닧%Ü7¿ÇÈcìÛØúÁÕ&««ÍcÞn ~ãç\¯Ý(3L½O'u,óB€¿ýõô&Qڊ,©›b¼úök©}»=pßÔ£ùJ*–Ùáj9=¶¸%upFÎPB§Ò¡ÏÙKî;2vçûó“I@ÒÈßÁܺÀ°—ÞþÔm~ºãFß|pÃÃJ–06J<}b\Y¦óít(ÒDúä(÷Ý8V(‘A¶ˆŽµlúsAfS‹fÑøì)¥#îeZðýJÚö—zk—&dá2DU/ÒØýû%¼åO®xš½#¤<Â_oý# 7FZJ³wh€~@iÑÍÍãChHœíBé³Y¬áÀ!ö4¥ÂÚ7žŒXãÉe*žØðMÉhGàÓ̍Á ŽŽ~0ÑñçÓg¥E†Gˆ½‚Æ9$½mÈib‡Ô#YÝä¿€Ú鲊Иµj$X‡Þkz›þ¾ÿ }%Œ@¸„aJ±ˆÖì¾AºÝ6éUmY9îhx€'°Û›4áM’ ÀZc"ÿÕ;r©ânϼìØB]/H1T¡—Z¡°&R9ìÏå>gÕ PЫJ~fV¡”Yt 5#!ÛŠŽfÔù?°sÅ}µ¢•È¬V»±ÐÎçŸã(î¹þæ§D܌+Ù4È õ ½šÌa¬ÄƒHDº¹­žrŽú~Æ(PË3;rî¼AhLù¯Çà'ä´ÖJ óáfQpÀ„öÅf™Ó±ïµÉ ü¿ _Eh5 ¿ó.1¦¡íVш½çíu³Ðpè;G˜÷5°+F€štÉ¢~OÅW¤•bhVABkÉl@°—÷ٗ|dL0‰c?ÂÉJ4¥gKÃڃæ ôª» Ñ8­î2o‘£•;fp• +uùt¸p<Á½“´”oYOg}ŒÍ£¦5˜uӊ£Nì×´z™üš_ˆÎs:<Ý-°C‰ß~cRJà–ˆ}Ÿç¡ ÞÚrn쬧qNp€&Þ"ÉÔ"µB,pnϔÙ8ˆŒcD h%Ô½{’¯¥[ŽX›…m#`Ðü×ùq”;]¡ª08Ÿ6óŒ9›ß:ŸoáP2[Ìþ fÐ +{Lža®R‰?²ñláÏbäĔOÅ>;@ 5ìPð:ö_@è÷—àþÞ¥›«À;O$Oº©£µû˜«”}Ÿé–!³“®LrÁk?ԝ7à½ìsn>Æç_({[˜I¶='¿h¦de+¦ EË´#ms¼šìÏ©Ðc%9€‘|fC­Ù6^؇NÎh¢³ÙW;êØ^3+§§]èö»°6§ çÿ£^yNÏäøóü3CÌÈxrnmÿŚ§ Z Ã;ßÁÒw,6Óőu<CX>îÐk‡g@ÃÞq3ÿé{ºÝ µù @ +F–©¿*˜üúç愔¿ƒ3kGÓDüe‡9R½2æx;gûuŽJ&v”àŠ˜~:!® +¨Ï,­ú偎•ùJ×+EÏ]ô 1¼¼15ÁY1Ä&ïÛ¿œ;ÿT³Èö7?ì"÷?ΞÈûã`§>ø£…M•üNZO±mþ+h djVëohSjØ>lÊ"h] FšWûyg/¼Èøß}NŒ~‡ŽEº;ڂûÊ$ù ,h °¾â>BŠí96.ŸsŸ¿=b7ÚöÄ!óœAk)¾Fö'5sæJ«ì»@ ¼i©dÂé×¾cËÍ_  àbâš©ü´pb’‡ºõ‰â yºgJ?‚Ü/(§ˆ“ýŒ?-?ÿ9қ¤þ•[>½pS|äÊúo |4Œ•êÅf0ÚíLÁlæ$­;†£åF™X@åÏ +0|PN~6û!5|ªÊ† +DFö|ÍÐî{©}Ì%ŠZÇ´3F:ù1²x?€¡Cß5L·¾Npˆÿ7Á%òörèÆ=•åž¥ÕêŒ +7¶'ÞÿWk©§hÖ,ÌY|͑#öÎ<™X8 ø.3™Ilû𻆗àÉeî3ï¾Nó¯Ea¸mù"Þ»<¿WnÍù°ЫÌíTéƒlå oM¬‚Ä’ûŽ¿›ÙÃì–†SdÿnŽ§9XôÍb¾y˜Î×­º<ð°y燜%/ÍáAG”_šÛ.QB­ 6ÐþÏ|3 Z8@pœ?äqЎðœ}ú@Á9îþçÿ-I~78’Àgè;ˆ~ýPüw{>í°ýÊzýððëÿãzȸJ›*r£†Ý‚Pkõÿü¿°ËɆ‚ÿFµøŸÿouú]̙Q‚ÿÏæ_Kô5”óf:_N6膽“KžáÖè¿¿;…ú +fEÈÉñô>ŸÂËT,7µE~Ù +t¹wÙ¢{£@‚exÅV’[¯}˜ìvÜewâoú%èôtƒe®¿Ãށˆœì¨›ð~ÙÚñ*Tm»Ù~Án6óÜö?êúö‹pÑrm7…Hˆº%Þ)´9Ñ7ÂAøº]ýÊÖDòƒ{嗽GªòO(êÞñd…úþ¨³ÛÍ />•›'`t°@ôWØÜT"Ä~þ¢ºTŸùq“ª$üï‹|õ Ç^èJHì61‰_ÈÞ}”ÁR8Lþ‹]ˆ-œÜr " mÚ?çõt3ù]©9¨èËDÚØ}œ*¶nç8G”hãEµÞ€ÒœÀësüâJÙíÇ]âƒîðQC€B”ÝŪ ñƒOäE¥=-r—¢üüÑf@ӎº Z¯„“%xÓAzºek#EˉXÉî jÁ¶€çY-E N¶ÓÉ œ°sö@ð«¸âÌ/?Sþê_LTQPb8é˯"Qóf‰YzÎé÷û—­(“ºÊû«Äë7Å©vq¼)r´øJ]S)Hðr+t½‘øųü_ª»„Ö/K È}wÛ(*­š„°êõ(<ýäVL5ÁO ى +D‚\1œÊêîíU’ÑwÚi¥2GMwڊ--lK›/ L +×ØÂàŠG³¬*€ +‰&¨ ÜM6l;[xqãçÏö?Å_¼ô^â½ {JLÄàŽéØ~‹‚&~ªTw?XÚÈ<ÔýƒÈ%^}gOÆ!{òmê&ÜöšÓžü9ùà'¯?ވúØ özó%Û§Lî;RX Íç Œ³%ا^ûs3ø£·úŠÏz§Û Ó­õöÄ2®·¾ô#zÇÏ/x6þvéíçhKï¨usz'Qóîçžáè³Ö†ÿè=ÖÀèrK²>Nø2a_8Ø®û(ë¹i¸§Dq4‡•*‡Câyšvì^Ê©Jä˜ãï.rÛ÷¿å}"×'{mò9ýüå±¥CÏØ°g¶&@X JM˜š’ËWÀìÔË·ªÇÃ!vl,Žáö·¨‰pc;†Éӛw¸]šˆ™ÉƒP×9¸‡OâÀÃg{¢ 7¡©Sk“[ºÜÇpÁÞÇþÀŸ…øy/ÇÇúqø¬}4ıBÃ@´4t‰b_ S€˜Ãü­žÄ±Æõ–ÃÑótÇúêùð?z£6+L±b͎šSkàÇ21÷òâXýÖ{Ü»Ÿë#9„)V†ÎnU›.Af*) ¬Aƒqs°>K`í òû¥ÅaÕ¡ªUqA7yÊ£¶(ÖBÑۖ¤°·ŸhVÀ‘Ó<]a9éá㜨BÄÖË¥µô|ƒ•Ç +°ú· U%24ÖW³Y€5XvVŒ¡)Ä£ÃçϦ-55 †H£Gë09nJa…ùœFŸ%ö!>ݸþóhø™7ű6²ÖÄÞ¸®ŠaµÇVч® Ÿ¡lÉ~ª.ŽÕßëd„xÅúH.BÆæÚ[ÊbŸŸ¤Ätƒ†§å¦–•Â:! +Žñ›8Ö‘6Ï-¡ +Љ|28’4֞Ó" ròÅÿLS8ÿ±$yXûq¢rz V›+@s|,ηÁæÄéˆC;!Wý‰Ö !´œ‘C)¬9¢fûŒ ¬ˆÓÓ-í£©¿ÃKSk+föIb­Ì[>B +:ü'ÑYŦ{|¬ç/ƒ¾Õ"ŠõͼYHbmý4ÆS„ ¹œî @¼Uvqq¬UßS‡LşűîʏbX¡„†ˆßF…Ç“‘uâ=Yɉc­%ò£aãóSëg}YBXÑys9Ý¿^`FJ`ýŸÇ•SëËßn]„}¬ B<*97’D><µìz ¬½‘ÿ]—E±†_œúÔ§•÷ÌLѽpóœG¡uê³ +6µ_ØV¯9a)òçZ%ƶhbupX!ˆÀýÛ3gÀóAˆõ¸5=ÓXOI»`®úÉÀJaÍô<%¾PtŽ„¢ˆ]—ªäDÓX³§ ¹X| RX“žŠS ;ÿ uòøŒÑlaEhhÄÆÃa2Ý@¬„ëᐞo6.ëX¿(}ò$£ —€ÂÛù¸Mi6ࠝOFAþ°ŠÓp•|ÚkxÖoROˆâøéÌ=½<€ Ι$~ÖÁdÏ2û›‡OƒaϨM?=.×Û3¸ùy슽@IÈ×RôCòiØkkŽ¥ŸþL†fŽh—/¤½¦þ—äÓª}“ôJ?Ö¿cÜS!т†úã×´(ñópÑTŒwŽÔÓoó>"ømÇþ˨­ßžÇè%Ñ:Órk#ö%ñröåAòéûÓÔ­—~ú‘‹>³Dyaü4 %Ÿþ^wEɧË7o¦Á=½$ÚzI&†R?cjÄ’OË^¢+C´§¯Í´U•ú¹Io*}Ø$ŸæÓµé\òiٛ|ôÈ-­÷­Q‰§"‘¶1³ŽZb‚§öv㘤Ÿf]ñ‹íYl ¶4÷‚ÿèw4ù6Z–˜™YZŸVðéŽ6YÉQ€’B™íñ…úėiޓZ¡Y½³é+ô¯ ÿqÁïH½#×ÌÂޑ‰ÇÚw”´ NšF +½æçW'-݁Ä×ÓŸü²¼F{šBØÎp×Â30v»g gMáwœEhpÿ>O­@P=æç±Ëɓ½˜ûÄ!F¦Ö ÚAq¬þ^_+8Sþ¶:ûr¢)à—“Œ + ºó +¾1A]÷lcDiõ´pÆæðjâӐuсåÀÓú²å»ÀŒÖ2R Óèl\sxÍIó» ˆˆêPt~ž3%ÂÃèáSF¿È Ízɵa'‰þ‘\Ff [Êkh`ghc8Ml’P¯íÈÐKýn—Ò†‡JzÉ@óØ2¤$(Ý?j؞¡WÌ©‰¿8æâÒ>öÚ©/Jz òô†¾™úÞL?R–'="š½øRÈz)…†y¾òIJ!$ÓdW$ÿQ:à4dÍ£¡‰’Bâäæ‘fCYbDŽ¼ƒú‡&Ÿg#N¾žS/)Ä%·'rà‰N®÷¨}r¼c Íϗ|kהÈ]¨˜èP„èHrvÁ¼xÇ6¯ù«ËD³À…LÍ4o[MS6€ƒ€Å×ÅèËîGœÝÇV]7'±TŽgb4Ñ èÁ•´!¤ý™aœ¡‘HšG-41Pˆôx˜Èv¹'¤Ú (¿ûàé9yìžeÔàqt<øÏÀŽ…8.xˆIK¾"¶¤høªÂÀªrìK3dEâ%ƒÔ옰Q³9Dǖ(LRÓLóSÇ}¡]. fÖì—Ë2+(igj¥Ð2 ýВ'• +m’{è8ƒ“ä1  ‹\€d)jWªD¥À¬À—Ú"ôªm¹³XfL§dYúô¬7é©ÑõÀ˜¤=fù¨ÓSÅ2FŒòچ¢EÀ[Æ͓¬¶¡a ¯kÍÐ7@kmT nOUÐøŒÖ±ÁbZOÞÈÑ2M\Û»h£Ã=‰Æ—n¶ølơÅu{J¯Ôœùñ0¢¢˜Á(¥ëŠžÙÞL÷G¯$Ó0í[|{ž’÷۞™îި͜¦"»«Y„—*Gd°k'PïѤÖ6á´N!Gö¤Vô7ˆkŒExß7ÊK•8Ê[‚‘0 }9y j$B­ó:²(l$´%m—8³Eèóh0Ý©Ø&?‰Ëò~§.Ì>• ïç5`pQ/§ÙˆJ‰R’×E¨}£zX†+E@t½÷yz’?©ÕŠ‚' +Tû¤ghVAuÚ«®Hxž¡ìùªù˜wð¯Cƒï÷`­Üɓÿ<8Á϶µŒ$Lw°~|j¹” zÉÑKýf—4‹(3 +ÐKãfçыÝìè>cdéæïô2š ³‹çʾ(À¼*)rN‡²Ð‘+Žœ#WèLY—ùú½„é¬ìÈ“Ã6Ú=*e˜éPSëáÌ(á`ÊgþI}…#0Ãދ¦D%À\,™úõœ²N"ZO“òë­Ë0NÜ»ÉI £Â;( +¾H  :†Æ„(Ï%±ã©Ù©³PÍÌ íd$´ +MRº"T³µÖÓЈžäG¤ÖáKvBf[à֚¦£±"В¯Ü7цU~rÊì^áNC½«B©)Q!<)ŽÄ?¯ÉÎS@¨§]I›‘‚Ÿñ@±{TJÍœ|Jç®æÒ³Á?ï2ãI!p^à;5!¹ûp†Î‚¹´yË/gÝm‰‚ðªêP&€&å¥sÑ҆‡”—BÓ° Å *°yš›ChåäÏ@.R¨ˆolja§Ýº)(¬ÅÉAa%´@ÚBÎ/ hÔv¬ò£ŒfJåpXøÊheÄÞ%<‘Ei®lüFn?ª8~ 4¯K{¤PB³€I£6UÔÄÓ螬 ¥Ûqi½nÇ¥0 ¨Bº‰;S²€6©ý­Ò­ÃI7ÖÄÕ¢ß ¡)K7Î/ ƒ‚Ю—nÜö,¼mï ÝÀʉI7íRÒ.Ý.½ Û¥„r‡(.$Nrd,lȍi6‚¯·hÿ«N›ÇۍÂî»Zçîå<ß5iÿ +ž[ívíÿc/v8j>ÖàÊi÷€‰kÐ-Ú?…=o8Ö í_ +gâJR{>ÊŽ”°ùØß|>òǑ0äL¡_ß%Õ Š"Ñ,/æôä¥fq©’úÁè ³,85jBxÝî-NnaŒ@»uŸcÙä +ÙÝ2DS¥ 3«‰ÐH™L`A]ªv¼L6 Hú†«ƒ×dì Æ$ÉT֐â>žTY—óâ˜ÊºÜêlO'•7ӝIfJ§ÆIùÀؼꨩb“MwLíÐ$c?œkHm?€æ3Æ*Õ»8SÑBÚô‰DG¸š#—:Ï-MbÛ÷d3})¶ÐýÃøþU K%[\l2搦61wÀ%µ¨áA¯ªÛ;.ôÎMc¤w¼ ózgÚ7„|y±Z>uÑÌíå|ø±vY˧-]]Î'_ËGIè;”óIbEµ|:ÉÒEå|òµ|:¼tñ–r>ùZ>¾:xC9Ÿ|-ŸŽWºxC9Ÿ|-ŸN¦tQS9Ÿ|-Ÿ•.Þ¡œOþ=]õ}s9ßÅæÕòq†Çå|òµ|”ž¦\ÎÇK€–©t{5“bš¸Læ½t1’ ‰FŘÄÄ9å\q›º¢-RhI_x›*Æ"NÕâAŽ¯h[>Sï^±Süšš,cj{JÇSŸtª¦¦¢WªÂ«©¬Töz‰Æ9=íÒצäk\†w +ømG4A÷š WAR“,FÃ(a=š¢:¦º¦ð¬˜y¯¡¦pªXcàù¸¤k䤋päÕl‘Ì{óóAjX)±šQé5TμW–0+𽞢k¨S[S>(ÕäÈq„ %B»[Íꁋ›HÆh¦ÌøˆÆwËÞJ4ÅÂUõÓä¤ÛuDãû‹½™nÏÉO¢* +Òùu"eêÔÜ Wñ¥Æîù¦„¯S¾tOCÀòQpH‹À{‡øÏXvŸU؃œQ¨`.ŠªíA)™WÀPºÇ¬µŽ½þC]ÕÞU«4"Tœ7Œ¢#¾=`±²7B÷¬/–ÇIØyÜ/W­'È”¡ˆœ>¦$? ³6ê4Ìèñ¢„À’;© :X‘b迒6_ˆ-E+P +µzHº,ë$zÀ_£§•Ôî}nãKëi%m¾ 銿‹ä¤«Iõ£à’ ÷EhôÞðÆijoà°¼Z<%2câïjǚ ©üjǤ¯\ž'7¦‹[F\¿1UuïMyonMƒZ²Q…÷†‰*£.Ó-ÞÜ/P¾Ý{XäRF4ÔÃ]ã½Ñ]”.Þõpï@¹U_+è×住”U©«‚Õ‚`ã©`hu)‚°I ÁW¤+œ"-“«®F‘ö%;vƒ +ŽÐÉWHî*÷ɍ@km˜ïã“‹Z”2ˆÕÔÃ]™5Ï;o`%›´/JCÛE2„N´tQ©ÄOs‚®H2,*ñS™([⇳ +Ti'Ùûµ°mŒk²é€¯—÷«ÂïTž|Ìl$“žîS™‡ÐÜ#mO¾2O&Š{ÏÊ<Ñ´ë×õ½+ón©ñÐP™'› {¿Ê<äî¾q+ª¨Ìã+ÊIˆ7TæñS­˜™ï]™§Þ¥JçÝ»2 H*f×Wæñƒ^*R:¯«Ì»°Ö¤âB°¦î…ÿðÈ»[ê%ÅO½”Ô:Õ¤^¾mU¥^*JãÒw«jE9ê.•9Y@% 5U,’Ph= ºCAÙEn„\æ½²tƒu~Ò´ËüjÖÍG"ÅÚ¼·]¤X›÷ +‹!،Ү¡îÛ-û‘«ÂÝ·îGMöQ™&¹{;µûQNU‡4×fSŠ²Û®:F€´m#qºK]fέòXS$}ß±ÔU`R‰Ý—÷+^çÆ÷f ¢¸c«ãÒå«àäo¤R4»YŸÍ·çñÚ´lÖR·&_㇆ÐF*ÊZÕÉN§j| +e‡÷)’ýØß©HºK‘,¬[»½HB¹K‘,¤î¢kÝ,š;ˆ6ŠôU°šó—¬N†øû±{ó~åIÈ´{åQu²¹B÷(Ê_›»åÝàëäMÞÄ×b{ÞP”‡ûÓ¨º¼¥(OÌýð/åIøÓTZp=9 +:ü~h¹ê«É´X5·ß ô´¬KÁnR›GAÔ9!U8ž!4éûù´j6W(kLè°RùžÊÜÍÃ@°‹åªka‰ß‡ä>³‚u©ŠÜN†­ôbéu@-@õŸÂêm2Êfç<1¦†d;ñšO¹Ofxíd¨‡Ú­çúùC*] ¶Ëٌë+›Í¸+°íBkǜOO+þ iÿ¿"L¬ú ™Qt¡Ô@º.܈¾âLÆ/»‹}Õk¸ÓÃø±=Åõ[T±Ÿ¿×•+»›¹%±d;#[ì÷Tÿ­M¤°Že°œ «°",j?ân;aٝ¿ûSe›6 +JÑ-rew—«Žß§0¶–*ö  ûàùCªìn Wý¶V(ö۶ےXMÕùÏL +ë\¡Oa£+5ÿ2(HRظñÅFRX¡r{±´`ëÒGŸhvª|/&öí~à½êÿ¨ªé·¾Rïчi5(¢¢¾°fT‚<¯„g¬œÏYE~/_¹µoèÙð¢L¯¦í}Š‹T$à +,Ò=½ö*ƄÇÖd†¥”«”ñ5…}Wúl´ö‰Y ŒÛ}jï³¹±°Őx±on/ì«êÓ][ˆ)]Ø'æƗHð¿¥°Gzór‘»ö‰Ò)\frEaßµ‡´ÆÂ>±8wzÞ­°O¬ªç¸OaŸXUŸÚ¬! …}b^zÆĽcaŸØ +Sâ»ö‰©<¼,Õûö‰Uõé$®Ö¿¡°ïrL?êÚÂ>1µí¾…}bk(–jucaŸ”ræ« +û$µÎûöi Ú-…}Pö;ö]G4ͅ}ò•^w+쓨ú¾waŸˆæ΅}bÁaæý +ûÄ…ÀĽGaŸR`åN…}*Λ{ö‰‘SÕïUاXPvŸÂ>±ª>ñ”‘â]lD'g#bDû+i»sJº§ÙeO¥ºúj¯°íyô÷o¥TŽºø]Œé„ÂD÷îâ'£r¨#ÕÉnÖD*ŽNü„KX$ª¨m¨ä^i„N¢[jX‚1© +l4JfXüØÖUcBDÃÒÔ§ZnLâ¹ÒÂF†T2}ª%ä':Öø&SÒS> +L&Ÿ1²Sè/ïÊc5Ùþ77ÿÓawt©Ôׯiþ')lxýÿ®{í›Nª L]MŸªœ …|h®ÿßmëUèítjÚìÈ:µT5ÿSvBBÚÜÜüÑläûÿÝÜüOGUá)ôÿS~ÚUîqG—/ÙñÈ/¤†ÊÝҟvNKçQ=¹g«Z.•Á¶}ŠŽJ\ + ú ‰-ï¼WUÓ§&ƒ¢Qªw”Î Q]ìÑÈ$7jHRƒ’t +Z]¿1€Ú`–4Á«`%g­»ÕJ*`Tx]_Y_ÆOµ¬¥ƒ®:Õ +€RÎOSj ©L"—ϤF‚ð>…˜·GR`¯E™[ÏP HU\1(xâXë[A¹(³×‰0+WÚ#hªª}%;_«}[›ËjßÖæŽ×BhwéûLq¯Á†f’Ôl‹QS|mpcS.kÛv†E—)Ûò»TÖöü¸¼Oa {³³võâTõ¬JëTSB +¼JG›ÕKŽ¦æޒ!<؋îfƒ‚"›>ªÐ=®1 ÝÚᛂÂlFîôÔԌHP=«XB¡-Xlµ‹ìÇ7%êœ÷7÷ýÓ1õžR­ÿ®Ø"ùÊ2í.}ÿ¤UuºõߍìF÷ýSQ|q¾*òlîÑ÷OÇ6¼}?ÊôýÓñk£ÔT§\Ó÷O'׶þÓÞ÷Oõõí°ëöjߏ=§üHš¸ª«}4eå‡5£”ª}?öWVû^bnõ6Ábǚh6/¥ÐBôÂˁݥÀ´F¨´ÖI×ç + +©XJº– +vÔR}/VHÅ ¯BYá¸ØQ‹Âb¨pƒé˜^x*k©ÔR™Ÿ‡Bk?ÖÔÔRñ§©àpå@qk#YKµ¨*Ÿ—µî¹íµ¨Ùžj +©ÌÏ¡b~µíÙÕTH%™œûJʾÚ4Æ®Ž®,¾¡ @c¹÷±Û£ÐÜ¥î6뒾 Ù7Zûôij†‰¨)£§õîw«V +áÝ©î¶'y«ÖšÍô¨©¦RA÷•u·ØFeS;t*ʱ•ënÁ˜Ô—cËÕÝÒî"¸Ր8BF'„µwÅçvnéÉfÜå÷œa^†ÞÁ\ÒÞj?oÇö øTxE¥†d÷ƒœy͉Çu!0æs¦?ñê_’M+¯2 9Þz¯¸g‹ßš.šô$*ó¬Òõ€‡ó8êHhAI a“*D Œ¡¦õSªðC+œÍ#¹óIN—(úI¬æÒÔµjMgå°ê؂2ŽÈ¯/†•_#w4‡L\‡EŸ èÒjIVbXHda'>^IàDXˆˆS¸•À4<ù_rcÌs+,ÎÉ`-ƒÒX C_ «õ y¥žB¬M¹‹•7i¬ù|‡ä'ŽÄFø‚ƒýDW…žmÏn> H¼çË’ïéðzObl‹¦U€´G·§qKrù͆7¬––7¹@áEš7”Ç)d‚RtÒý£Ž«3­3äÜÝ°Ps J‰1]ä€]ìՄהÐÈ KÚ¿¬mLPtJ§Ñ#ºÈÈ®üGÂƏ„çE:Æ\già%×{+yn‡ù{ÝDÙsê…ÂæúŠ(Y·´ê0Ñ0Ë»:®BòâÞ»«ÊîÄãßxŠ¢ª’Äë<Òü,UT’xëíºb÷Ýé$ë֔¬šËûîd $ ?E$X;!5µx6äÝ,é y!l®¡SµRš +z)7õãM#PöñéPŸBIŒ‘‘° ´+);˜WW:ƨ­ í²Ç êä«©tš*½"š®bÀÆ$¬¿™ä|Ίª:oLX…úÆö¯ÆºÄ¥QEm©¿£K¦.Q©´ÂbüYA¹TH5GÚ@ëDÛìh€¦ÔHÈ|Qò+MpÊÜH4Åj"õÓäG@o%šbK!mD«ú?$ ]T1‹© Ñ®,IT[¨T£\¨¦ªQ.%^EI¢ÚzD?´–’Dµõˆ\2ìU%‰jë)w÷Õ%‰<~‘±B/rnµ•$ª­GDD»¾$‘#©¼Ññ+½´–$ª­Gä,é«J%ÆtQÈ‹{R#ºœ×íÍ +uê›ÔÝÒ¬ŸÍ¿Ø¬ðÒýð¯4+Ô)5©»O³BºbE^m¹½Y¡îŸ'}ñîÍ +/ÝvÿJ³BÑÅû7+Ô©êïyK³Bžû+(9,šJJËÒÝå c44<”wI(gÛ©lx¨îV«›b“»Ç­VR 5æ@]ÛðP¾Û¡˜òª†‡ò.$ ƒ]{ÃCq”¿Õꊆ‡*ú åÓM8G׍  Êîä–ívȜ777<”ŸœÐËquÃCÞH.ºò|·4<”Ÿ’h2ì5 E‹#e¯oWOÕÕ»Œ?í憇ò÷–qöʞ|YêX»CÃCyo²NÓåY2 åíañ´ë+ŠUmr[ðzN4<”‡"ç~ÐÔðP +ŠÜ£á¡|<†s?ÜØðP¾˜W',’½¶á¡ˆŠu;Ä­5(5®nx(؏¿Û!®Ü^QC° •kqïÒðP¾Û!ÇÐ76<”OñƔÛÛredbÉ9S´•\\4<”§!¥ÜÞ¡á¡Ìž;.}*CßÊ å¡° +Ô­ Õ÷)¼©á! Eti.%¹hx(Sr¡œÚ;×ÚðP^͇³¹KÃC©cýM$ y]™ +]Ÿ H*íG¥†‡ò±kAZÂõ ù”×¨ê¢ å¡ày675<”‚¢¶ý®Ê†‡7^1q™¢­EáE‘ìm yñ‹n‡T`å Ùz-ÙÞ«77<”W~¤8MsÃCùn‡º›¯›¢ÞêTÙðPM-îÊw;ÔiîSxUi°Pt^6<¼¾Tëvˆ£¹©áᥠïvÈJèk÷#ÓðP>{Lx¬]ÝðP>‰J聺ºá¡ÈÚ`Ý%‰¦µáá ¾N>Ñ´^Iٞ74<䄘X·ÃëS eÙo~r[ÃCy‘6qoox(_¤ËÒ77<äOSØíðROS} ¿á¡´jDk6 +·p©lx¨N³¹¹á!¾š— ñŠ•+ʟÒIäʟ´.à9.úrº[½#žF"¼뇺Rxz‚¯¥=Âòùþ‚"JK±œÆ…Ï;¼JŸreѸ,¼3ÓµåhC¸ëó KÒžµZ…e>‡ƒ÷ø£ÇLYo¼ ww¢Þ‚U]zc-Qr–Þý5Øù}‡Ÿ2™X}F›Å¹¶š3û Q\¼¤ ûs&¨ÿ˜Ì|àÓ8õNJ¦Z}ß ì—=ØÇ#pù¿Â5²ëª¸ú@µàgšËNrÖªßÚó—ÀþÍ2ÿ6¾§­þÜßc»YYFWñîvž´lö£ÐþéÚ_ôï/I³Ñg)Ÿ¾¥’õücø·ó(#Pµi¢Ón½é]öaJï]ìßìqŸ9E™J† ¿¿ÊD!hjãˆåp ¿—Ž†apz L¯lågÛþìv¾»|ÕÈ#S€÷ç>?¶°_Ä@©ƒ"â„WòëWG‘ôWcÍn¶A&l·y{žléTµ,F/D0ᓠ­Ï¨—œ.*°´LÌóWÃ[¿0nnÒäõ/ΆÕL?ƒµ­e¦\Uvìü/0!®¶A’ú4Ùn?ÆùŒò ¼nù +ýN°Àä^³Xýç¥Å&Dœ%Á§,ÌÌõÉyµÍ~– Åüa¡ +à̸öžÍä½í\.iW¸÷Ȉ¡µ€Þö \ª¿¨Åc_†`aeo˜ŠUõ4¯ôz‹:]yÙóoÝ"üæüºrÁRbeþ'½2­÷ÉóF'J.».3óÉcA>g@“Ðü²¡Zd {J;ð糃638ÖðMÖÅü’t“yo- à {Îñt&-ÅRÉã0ÿ¬ó_Ë}„p'BV4T8ºO-ë‰e'nxðlÇLŒÙg€†y–urϼ™~'É<(±+8B§±ôÃÐæÅ +„Çvé)T'ìwvîeŠ( ]_ì3'¨°‹ð;7­6^Xé´öƒÕ ¬²´û’=Ž¯);Är׀ïH¤“ Øèó 㠆"1 …^´È÷ZwC@@Í=@¯ú‘ÏYŸÀŸŸ»ÖZúÀoÛv{Â7À§v€Áµ&ܽ*G˜1†f (ì;sîIÜ]lÌ2ž÷ÿ *PááÐÀµ^Fõeår q“ƒÐ\ ’©pG ­åp#.)ó¼+͞õ´Ôîu=h]©Ù´½ÜŠx­«‘æ¥ÞÄÏÎ~М"4[LëNÄó4O;nšç§]Â3­–¬àÓÀC3ítèE¶gÉ –l:ñ1Ÿf~ƒ^ßet"ÅüÙuÓ?_æÓÐÃg +½j‚Îræ÷çÔ;ÔûFäÈ:¨xǵý=›å:ˆö¹/ö…có¡õ;û$ë™UØÆÌH¶)5%î*–‚ùÓÀïºØ}Ñ,sž‚'eŸ&æÓÌ˽ôð&˜áéÏ1œÀ鍴Y±Ð›óF<Èqí)—6ã3Ž!¢\°Àz}iÔ% +2•Öë«Q<Âγ›álÐYlû$ÏzÇÏ_WïxæõŽZ·¨w†#½y×ނOΊޙöÍõö•¿ªwºÍoðX¯êm{Ã;Ö¡(”p›àjZ˜]]Û°1 1Ø &‹»[6ZtšÃŒ2'ܨ‚áK¾ç'h ¡ƒJÒ¢I¨"B/ZÑFá‚./oÎ9°3¢“•N¤"!ù 5±.-¡ +âTÜ2 ”f§AãåòÐoYð.äë´X¢Œ˜Œ¢‰X<ùa4Î|—BÂÉB/7¤D`ZWŅ‹î]–È•ã[¼Rçø{H0 6(N+<Û<`e”l…+ˆØ +V'%S)¼‹ºiqz+fÇËôÐuvšpN¦¢sסåÙ(΢FÂ& ôÁ¥ÔˆÓZù1{Úä‡ç/®Þ VáñÊ;«|½ÙöÔÏé¤è;غÆ? œ§¯ð68 H…ÏW›úÞ2¦i£ïôÏ=˜}Ñ Œïé\šcûæÓMùäLގŸ¦Ø @ÊM~™~úè÷ÞÖiápêÙö'™[=~¥›ís~êL½#ª漃§]’A”ü"Gy¿¢&§"$Úu~EMNEaª•z¿¢&§"Ú7Wù59Qüæ*¿"@sü¿ Ý?¡ˆ/ð€þq7Ï«ù¡~ø]ünºbºÜé’ÇÓÙ̶äa>oÏÿ÷)·ý:¯ç›ÓCôÁneK¥p 7ÿÚÎæ:øbe¢“ž í€ÄÃã<Ï$bÄLî;RX ÍçIî›è%0¿%¥ÃìÚ{è‡~x®>é£Ù@ïð’-½¥xtÀ?{”¿†Š–‹hQÜÅfÈÍ™sÞ^«¾ ö òÓDÆ팿åß3ófÊ}\ÄÝÅtÆ&ßZ)÷‰Ø"—åe#`®v‘ˆ;PN&½5þâg=ô0)So̅Ýz‡5•‚_—õöÆ㠜á |„nýå隆ù“}…¨S¨µiíþe¥å³½AIià‚U"¢\8?ȅQLU0Æiæ`—ÁX2Ø`˜ª€¡.dxÄjˆc/”\PNE±ûaGÚØjg´ÕПj#¢\8”Jüû—"¢\øFáÿµˆ(ñ„ü+Q. +CIÿZD” ‡b±ÑûGD¹p(œÍ¿å¡ø¾¹{D” ‡Âƒü_‹ˆráP(:ñˆè{Wo}é[h!zŽ¾B Ì/k²­·þ®zç¦ñkF® „^´ç%öÀæI#GÕ÷‹RhZ;ú­ÉÞÉ$“ø-\2 «‡˜áu?{(:í´è„: &:{[•DbNé?ÑÒ#љu9ëý<ÇKîßîÉEi¿Ž¨å„™–/‹Õûè¥"`ø Єœœ¥eÚ'½Rå¸K©1ŸÇé2³zܐÇ04gM8‚U3fk 2H ¥´QÄ0¥?{ + <³u¨¥8è`è‰öBiò@ÓI¹ib”$Åäw¡ãE‹þ±cUE\Â,— d;w Sv·°6„Õ¸}g©¬·ü0ÀÆB‡ eæ;ñäW¸rÃ^¸5hÐ?eŒ9™xmƍðÝ‚%ꨒí -Ç#]Ýý›èä‘ÆÙ-ØùîmÏ|×;¸ë;gÝ Æã¥hѱ3Ú}¤>»ˆ!"qFÅŸ½T‹‹4‚ðçÐRë¸öĩȵ§:–êÙ±tâD@n)š}œ`8‚;–ᝊXªt •õ³ÊÆäjN–4V:¡-‹ +"<Ÿn ('£¯'T^@YX§ÊoˆÌSõ™d•Lyµ¹S7:“õjÍuËDPÙ³µ(¢ižH'êÖÚٞŽÈÉv kC‡¢]€!šZb@ߣSi"“ø À7Xy¼dŋND%5a¢¦8>Š;Ûà± ¾=öj!³·Ò¯’»H»šÝ'#ó­œÔËmœVõ»8Ҝ& c˜"næ4óå6N#6V)NS £jw(r ÍBÀiÐ떁ît·ÈijaªÊûV“þ 5AՂP|C—85á ¨ Ū§âޗís»mE Â+OM꼑›HÑIjÛ#ƒV=HU¿a“M¯Â  ·?¤‹þ“«Ç`L‡O· ӅÝÎÒ²ãÄÎ#ÍZ‚A0R@8Ž/cÈy[|9Ÿ]5qÑ©p4á0‚YÑÍ.9Ñù•,%ñ?‹õþg£“F¶ª—@º&×» 6ìÔùsIû¨›;O +Õìg™*ž¡|㧂.8@~KºÈCE…‡Ž¾ƒà–"p6¼"ÖçZ±â"'6|X±ãªv¶ê¢‚W]ðŒm·Í.»`ŸyðRÌzi_ðÀ+¶làõ¼È¡l.(ӀH¢B_P°À ð⡍ódþÙÀƒ‰Û ÍyÀøQÚrqÔ¶T¤ð2來›‡&K´ºAÃl„àú0Gfqt bÎ^«Óy´íÄë’©˜ŠP›ÀÄDÓ.ZM±Î¯µHÆ5Gçxݘ.A6ªÏ\`#pz5Î Ÿýð"Ý:óýÙ+¬ªi{86ö~ž‡)ÚÕÑúX_§ŸïëÌ%C,˼;éh# EÒ»›Ùïøô±ïÆqõŽâ0nñîc?ù)ùØ:þìSfŠˆ~¡Õï³e?}‚ýäÁ£ŸÞ!\ìû𹥑ñbþ˜Ùôƒ¬ƒX9ìŒÇœ¹„1çO,¨æ3Y됮ŸàŸÞ»…ŽzÐ𓵶ðÃïü"Qð9~ëesö°•$óµ7&ÖyZˆù4„\êbÝ}ÚyRëM¼Ò•ˆdšo╮DÝ?Ú¼‰WºQê‚o╮Dä~PéMÜÂPh zGKÏ(¿™áÁNðõøª5?wè•À(3_ünª“ÿÎÁqãy þC€ÿÀÿ÷`@þ—xÀ/«SÝ?–Ò×vc}¨ÂZ›‘;}8å~¿N¿ÛÍäð߇(ú®[«vJ¹‡èýjìÁCŒÀ»à{+ +°ŽàGºˆ‡4ü§ûˆ=½ƒŸëàWØï øü„+ƒ~4$ÂExCþŸËç øÁ¨\¯'Œ‡×ø°ZÑ:vÿ7¸Î$èqÂa?œ¶7§êó¸‚!"§ƒ¾ §†ÞÆ?³¿T9ïÖz²Ziž¹Ççc—[fQ„ß‹þø]_ÐÃ~á rðoÆ델¼ÜŸÖ¬:ÿ>^'§5C®fèmvÚDNxú<½Nóöaò»‚»jqœü¯ùÃd³Ùž&§ù> endobj 6 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 50 0 obj <> endobj xref +0 51 +0000000004 65535 f +0000000016 00000 n +0000000176 00000 n +0000047815 00000 n +0000000000 00000 f +0000000000 00000 f +0000177312 00000 n +0000177245 00000 n +0000000000 00000 f +0000047866 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000177519 00000 n +0000177550 00000 n +0000177403 00000 n +0000177434 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 +0000049541 00000 n +0000177635 00000 n +0000048221 00000 n +0000050025 00000 n +0000049838 00000 n +0000049725 00000 n +0000048473 00000 n +0000048979 00000 n +0000049027 00000 n +0000049609 00000 n +0000049640 00000 n +0000050099 00000 n +0000050295 00000 n +0000051501 00000 n +0000072603 00000 n +0000138192 00000 n +0000177660 00000 n +trailer +<<3B853B03CD4D8C4B8BE2F2BA0FBB0695>]>> +startxref +177846 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.svg new file mode 100644 index 00000000..37653cb4 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai new file mode 100644 index 00000000..f036f2c6 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai @@ -0,0 +1,1420 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_orange-blue + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T17:16:24+02:00 + 2019-06-22T17:16:24+02:00 + 2019-06-22T17:16:24+02:00 + + + + 220 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7N+WH5gfpWFdG1ST/clC v+jzMd50HY/5aj7xv45oOx+1PFHhzPrHI9/7XqfaDsXwT42MfuzzH80/qP2PQ837yzsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLLSrCa/vZBFbQLydu58AB3 J6AZVmzRxQM5GgG/T6eeaYhAXIvFv+Vsa5/in9K1P6O/uv0bX4PRr/yc78vHb7O2cd/LeXx/E/g/ m+X6/P8AQ+gf6G8P5bwv8pz4ut/q8v07sIgmmgmjnhcxzRMHjkU0ZWU1BBHcHNNGRibHMPQzgJAg iwXvf5eeeofMdj9XuWCavbKPXTYeovT1UH/Eh2P0Z3PZXaQ1Eal/eDn5+b5p232OdLPij/dS5eXk f0MvzbOidirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i4gtoJLieRY oYlLySMaKqjcknIzkIgk7AMoQlOQjEWS8C/MDzzceZL/ANKEtHpNu3+jQ9ObdPVcfzHt4D6c4XtT tI6idD+7HL9b6b2L2RHSQs75Zcz3eQ/G/wAmJ5qnduxVE6bqV7pl9DfWUpiuYG5RuPxB8QRsRluH NLHISiaIadRghmgYTFxL6F8meb7LzLpYuIqR3kVFvLau6PTqO/Bv2Tne9n66OohY+ocx+Oj5d2r2 ZPSZOE7xP0nv/b3p/me6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVxIAJJ oBuScVeJfmb+YDaxO2kabJTSoW/fSKf791PiOqL28Tv4ZxnbHaninw4H0D7f2PofYHYvgR8XIP3h 5f0R+v8As73n+aF6d2KuxV2Kpn5d8w6hoOqRahZNR02kiJPCRD1RqdjmTpNVPBMTj/a4eu0UNTjO Of8AYe99EeXfMGn69pcWoWLVR9pIzTlG46ow8Rnf6XVQzwE4/wBj5ZrtFk02Q458/vHeEyzJcR2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvKPzU/MAky+X9KloN01G4Q9fGFSP+H+ 7xzlu2u1OeLGf6x/R+v5PbezvYvLPlH9Uf779Xz7nlOcu9o7FXYq7FXYq7FWQeTPN955a1QXEdZL OWi3ltXZ08R25L2P0Zn9n6+WnnY+k8x+Orq+1ezIavHwnaQ+k937H0Jpuo2WpWMN9ZSia2nXlG4+ 4g+BB2IzvsOWOSIlE2C+X58E8UzCYqQROWNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVeffmf5/wD0TA2j6ZLTU5l/fyr1gRh28HYHbwG/hmg7Y7T8IeHA+s8/L9r1Hs/2L458XIP3Y5D+ cf1D7fm8TJJNTuT1Occ+hOwK7FXYq7FXYq7FXYqzD8vPPUvly++r3TF9IuWHrp19Jjt6qj/iQHUZ t+yu0jp5VL+7PPy83Rdt9jjVQ4o/3seXn5fqe9QzRTwpNC4kilUPHIpqrKwqCD753MZCQsci+aTg YkgiiF+Fi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWI/mF54h8uaf6NuwfV7lT9Xj6+mvT1 WHgD0B6n6c1XanaQ08KH94eXl5u87E7IOqncv7qPPz8ngc88080k8ztJNKxeSRjVmZjUkk9znCyk ZGzzL6ZCAiAAKAWZFk7FXYq7FXYq7FXYq7FXYq9E/LD8wP0XMujanJ/uNlb/AEaZjtC7Hof8hj9x +nOg7H7U8I+HM+g8vL9jy3tB2L4w8bGP3g5j+cP1j7XtOdi+fOxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KpD5x822XlrSjdTUkupKraW1d3f8A5pX9o5g6/XR08OI/UeQ73Zdl9mz1eXhG0R9R7h+v ufPWp6le6nfzX17KZrqduUjn7gAOwA2Azgc2aWSRlI3IvqWn08MMBCAqIQuVNzsVdirsVdirsVdi rsVdirsVdir1r8rPzB9QReX9Vk+MUTT7hj1A6QsfH+U/R4Z1XYval1iyH+qf0fq+TxHtF2LV58Q2 /iH++/X83qedO8Y7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql3mDXbDQ9Lm1G9akUeyoPtO5+yi+5zH 1WpjhgZy5BytFo56jIMcOZ+wd7538x+YdQ1/VZNQvW+JvhiiH2Y4wfhRfYVzgNXqp55mcv7H1TQ6 GGmxDHD4+Z70rzFcx2KuxV2KuxV2KuxV2KuxV2KuxV2KtglSCDQjcEdQcKkPb/yz8/jWrddK1KSm rQL+7kb/AHei9/8AXH7Xj18c7PsjtTxh4cz6x9v7Xzvt/sX8vLxcY/dH/Yn9Xd8u5nub15l2KuxV 2KuxV2KuxV2KuxV2KuxV2KsE/Of/AJRBP+YuL/iL5o/aD/F/84fpel9lf8aP9Q/eHhucU+iuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxVVtrm4tbiO5t5GiniYPFIhoysNwQcnCZiQQaIYZMcZxMZCwXv vkDzxb+ZdP4TFY9VtwPrUI2DDoJEH8p7+B+jO67M7RGohR+sc/1h8y7a7IlpJ2N8cuR/QfxuyvNo 6V2KuxV2KuxV2KuxV2KuxVp3REZ3YKiglmJoABuSScIFqknlPzfpnmiDULnTKvaWV49kk9QRKY44 3Mi/5JMlB40r3zL1uinpzET+qUeKu7c7fY0YNRHKCY8gaSD85/8AlEE/5i4v+IvnL+0H+L/5w/S9 Z7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmkatfaTqEN/YyGO4haqnsR 3Vh3U9CMuwZ5YpicTRDRqdNDPjMJi4l9C+UPNdj5k0pbuCiTpRbu3r8Ub0/4if2TnfaHWx1EOIc+ o7ny3tPs6eky8Evp6HvH6+9PMzXXOxV2KuxV2KuxV2KuxV4F+eP5seu03lTQZ/3Ckpqt5GftsOsC MD9kft+PTxr23s/2Nw1nyjf+Efp/V83Q9pa6/wB3D4/qZL/zjV/ygt9/21Jf+oeDNf7Vf4zH+oP9 1JyOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYqm3ljzLqHl7VY7+zNQPhngJ+GSM9Vb+B7HMvR6ueCYnH4jvcHtDQ Q1WIwn8D3F9D6DrlhremRajYvyhlHxKftI4+0jjswzv9NqYZoCceRfLdZpJ6fIccxuPt8wmGXuK7 FXYq7FXYq7FXkH52/mv+hoJPLehzU1eZaX1yh3t42H2VI6SsD/sR7kU6nsDsbxT42Qegch3n9X3u o7S13AOCP1dfL9r5y653jzr6U/5xq/5QW+/7akv/AFDwZwHtV/jMf6g/3Uno+x/7o/1v0BPfzn/5 RBP+YuL/AIi+ee+0H+L/AOcP0vd+yv8AjR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxVknkfzld+WdTEgrJp85C3luO47Ov+Uv49M2PZ3aEtPO+cDzH46up7X7Kjq8dcpj6T+j 3F9BWN9aX9nFeWkgmtp1DxSL0IOd7jyRnESibBfL82GWOZhMVIK+Ta3Yq7FXYq88/N380YPKGm/U rFlk8wXiVt02IgjNR6zg7dR8IPU+wze9idkHVT4pf3Uefn5frdfr9aMUaH1n8W+WZ55riaSeeRpZ 5WLyyuSzMzGpZidySc9HjERFDYB5Ykk2VmSQ+lP+cav+UFvv+2pL/wBQ8Gef+1X+Mx/qD/dSek7H /uj/AFv0BPfzn/5RBP8AmLi/4i+ee+0H+L/5w/S937K/40f6h+8PDc4p9FdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirNfy48+SeX7z6lesW0e4b4+p9Fzt6i+38w+n57nsntM4JcMv7s/Z 5/ref7d7GGphxw/vY/aO79T3aORJI1kjYPG4DI6moIIqCDnbggiw+bSiQaPNdhQ7FWJfmR+YOn+T NEN1JSbUbiqafZ1oXcdWanRErU/d3zZ9ldmT1eThG0B9R/HVxNZqxhjfXo+S9X1bUNX1K41LUZmu Ly6cyTSt3J7AdAANgB0GenYcMcUBCAqIeTyZDORkeZQmWsHYq+lP+cav+UFvv+2pL/1DwZ5/7Vf4 zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCIvnnvtB/i/wDnD9L3fsr/AI0f6h+8PDc4p9FdirsV dirsVdirsVdirsVdirsVdirLrbyNPqPkmPXtPDSXUEkq3VuNy8anZkH8y9x3Hv120OzTk03iw+oE 2PJ0eTtcYtYcGTaJAo9x8/exHNS7x2KuxV2KuxV2KvSfyu/MD6jJHoWqyf6FIeNlOx2idj9hj/Ix PXt8unR9jdqcBGKZ9PQ93l7nkvaHsXxAc2IesfUO/wA/f972TOueCdir5B/NnU7+/wDzB1o3czTf VbmS2tw3RIYmIRFA6Afr3z1LsbFGGlhwirjZ95eR10zLNK+hYjm0cN2KuxV9Kf8AONX/ACgt9/21 Jf8AqHgzz/2q/wAZj/UH+6k9J2P/AHR/rfoCe/nP/wAogn/MXF/xF8899oP8X/zh+l7v2V/xo/1D 94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/5P/8AKGR/8Z5f1jO47B/xYe8vm3tP/jZ/qhiX 5o/l99Skk13Sov8AQ3PK9t1H90xP94oH7B7jsfbpqu2ey+AnLjHp6ju8/c7v2e7a8QDDlPrH0nv8 vf8Af7+fNc5x652KuxV2KuxV2KvYfyr8/NeLHoGpuWukWljO2/qIor6bH+ZQNj3Hv163sXtPjrFP 6v4T3+TwntF2N4d58Y9P8Q7vP4/jy6ZnSPIPjj8yv/JgeYf+Y+f/AImc9W7K/wAVx/1A8drP76Xv LGs2DjOxV2KvpT/nGr/lBb7/ALakv/UPBnn/ALVf4zH+oP8AdSek7H/uj/W/QE9/Of8A5RBP+YuL /iL5577Qf4v/AJw/S937K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8AJ/8A5QyP /jPL+sZ3HYP+LD3l829p/wDGz/VDNZI0kRo5FDo4KujCoIOxBBzcEAii8+CQbHN4T+Y/kJ/L939e slLaPcNRO5hc7+mx8P5T9Hz4jtbsw4JcUf7s/Z5fqfSOwu2RqY8E/wC9j/sh3/rYTmmehdirsVdi rsVZN+Wv/KcaV/xkf/k0+bLsj/GYe/8AQXUdvf4nk9w+8PofO/fLHxx+ZX/kwPMP/MfP/wATOerd lf4rj/qB47Wf30veWNZsHGdirsVfSn/ONX/KC33/AG1Jf+oeDPP/AGq/xmP9Qf7qT0nY/wDdH+t+ gJ7+c/8AyiCf8xcX/EXzz32g/wAX/wA4fpe79lf8aP8AUP3h4bnFPorsVdirsVdirsVdirsVdirs VdirsVe7/k//AMoZH/xnl/WM7jsH/Fh7y+be0/8AjZ/qhm2bl55QvrG1vrSWzu4xNbTqUljboQch kxxnExkLBbMOaWOYnE1Icnz7548m3flrUzHvJp85LWdwe47o3+Uv49c4LtHs+WnnXOB5F9Q7I7Vj q8d8pj6h+n3Fjea52zsVdirsVZN+Wv8AynGlf8ZH/wCTT5suyP8AGYe/9BdR29/ieT3D7w+h8798 sfHH5lf+TA8w/wDMfP8A8TOerdlf4rj/AKgeO1n99L3ljWbBxnYq7FX0p/zjV/ygt9/21Jf+oeDP P/ar/GY/1B/upPSdj/3R/rfoCe/nP/yiCf8AMXF/xF8899oP8X/zh+l7v2V/xo/1D94eG5xT6K7F XYq7FXYq7FXYq7FXYq7FXYq7FXu/5P8A/KGR/wDGeX9YzuOwf8WHvL5t7T/42f6oZtm5eediqA13 Q7DW9Mm06+TlDKNmH2kcfZdT2Zco1OmhmgYS5FytHq56fIMkDuPt8i+d/M/lrUPL2qyWF2Kj7UE4 FFkjrsw/iOxzgNZpJ4JmMvge8PqXZ+vhqsQnD4juKU5iOc7FXYqyb8tf+U40r/jI/wDyafNl2R/j MPf+guo7e/xPJ7h94fQ+d++WPjj8yv8AyYHmH/mPn/4mc9W7K/xXH/UDx2s/vpe8sazYOM7FXYq+ lP8AnGr/AJQW+/7akv8A1DwZ5/7Vf4zH+oP91J6Tsf8Auj/W/QE9/Of/AJRBP+YuL/iL5577Qf4v /nD9L3fsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2Kvd/yf/wCUMj/4zy/rGdx2D/iw 95fNvaf/ABs/1QzbNy887FXYqknm7ypY+ZNKa0uKJOlWtLkCrRv/AM0n9oZha7RR1EOE8+h7nY9m doz0mXjjy6jvH45PnnV9JvtJ1CawvozHcQtRh2I7Mp7qeoOcDnwSxTMJCiH1LTamGfGJwNxKDylv dirJvy1/5TjSv+Mj/wDJp82XZH+Mw9/6C6jt7/E8nuH3h9D5375Y+OPzK/8AJgeYf+Y+f/iZz1bs r/Fcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/7akv/AFDwZ5/7Vf4zH+oP91J6Tsf+6P8AW/QE 9/Of/lEE/wCYuL/iL5577Qf4v/nD9L3fsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2K vd/yf/5QyP8A4zy/rGdx2D/iw95fNvaf/Gz/AFQzbNy887FXYq7FWKef/I9v5k0/nCFj1W3BNrMd gw6+m5/lPbwP05q+0+zhqIbfWOX6nddi9ry0mSjvjlzH6R+N3gVzbXFrcSW1xG0U8TFJY3FGVhsQ RnCzgYkgiiH03HkjOIlE2CpZBmyb8tf+U40r/jI//Jp82XZH+Mw9/wCguo7e/wATye4feH0Pnfvl j44/Mr/yYHmH/mPn/wCJnPVuyv8AFcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5 /wC1X+Mx/qD/AHUnpOx/7o/1v0BPfzn/AOUQT/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKf RXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/ACf/AOUMj/4zy/rGdx2D/iw95fNvaf8Axs/1QzbNy887 FXYq7FXYqwL8zPIA1q3bVdNjpq0C/vI1/wB3ovb/AFx+z49PDNF2v2X4w8SA9Y+39r03YHbX5eXh ZD+6P+xP6u/597w8ggkEUI2IOcY+iMm/LX/lONK/4yP/AMmnzY9kf4zD3/oLqO3v8Tye4feH0Pnf vlj44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT/nGr/lBb7/tqS/8AUPBn n/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRX Yq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l829p/8bP8AVDNs3LzzsVdi rsVdirsVeWfmn+X/ADEvmDSo/jFX1C3UdR3mUeP8w+nxzmO2uy7vLjH9Yfp/W9n7O9tVWDKf6p/3 v6vkwv8ALX/lONK/4yP/AMmnzT9kf4zD3/oL0Hb3+J5PcPvD6Hzv3yx8cfmV/wCTA8w/8x8//Ezn q3ZX+K4/6geO1n99L3ljWbBxnYq7FX0p/wA41f8AKC33/bUl/wCoeDPP/ar/ABmP9Qf7qT0nY/8A dH+t+gJ7+c//ACiCf8xcX/EXzz32g/xf/OH6Xu/ZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdir sVdirsVe7/k//wAoZH/xnl/WM7jsH/Fh7y+be0/+Nn+qGbZuXnnYq7FXYq7FXYq7FXncvkD9Fefd N1nTI/8AcbLK/wBYhX/dLtG24/yGP3Hbwzn5dl+FqoZID0E7+W33PVR7a8bRTw5D+8AFH+cLH2j7 XomdA8q+OPzK/wDJgeYf+Y+f/iZz1bsr/Fcf9QPHaz++l7yxrNg4zsVdir6U/wCcav8AlBb7/tqS /wDUPBnn/tV/jMf6g/3UnpOx/wC6P9b9AT385/8AlEE/5i4v+IvnnvtB/i/+cP0vd+yv+NH+ofvD w3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3 LzzsVdirsVdirsVdirsVdir44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT /nGr/lBb7/tqS/8AUPBnn/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0 vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l82 9p/8bP8AVDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/AJj5/wDiZz1bsr/Fcf8AUDx2s/vp e8sazYOM7FXYq+lP+cav+UFvv+2pL/1DwZ5/7Vf4zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCI vnnvtB/i/wDnD9L3fsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8n/APlDI/8A jPL+sZ3HYP8Aiw95fNvaf/Gz/VDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/mPn/wCJnPVu yv8AFcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5/wC1X+Mx/qD/AHUnpOx/7o/1 v0BPfzn/AOUQT/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq 7FXYq93/ACf/AOUMj/4zy/rGdx2D/iw95fNvaf8Axs/1QzbNy887FXYq7FXYq7FXYq7FXYq+OPzK /wDJgeYf+Y+f/iZz1bsr/Fcf9QPHaz++l7yxrNg4zsVdir6U/wCcav8AlBb7/tqS/wDUPBnn/tV/ jMf6g/3UnpOx/wC6P9b9AT385/8AlEE/5i4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRXYq7FX Yq7FXYq7FXYq7FXYq7FXYq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3LzzsVdirsVdi rsVdirsVdir44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT/nGr/lBb7/tq S/8AUPBnn/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofv Dw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l829p/8bP8AVDNs 3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/AJj5/wDiZz1bsr/Fcf8AUDx2s/vpe8sazYOM7FXY q+lP+cav+UFvv+2pL/1DwZ5/7Vf4zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCIvnnvtB/i/wDn D9L3fsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8n/APlDI/8AjPL+sZ3HYP8A iw95fNvaf/Gz/VDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/mPn/wCJnPVuyv8AFcf9QPHa z++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5/wC1X+Mx/qD/AHUnpOx/7o/1v0BPfzn/AOUQ T/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FUX+iNV/5Yp/+RT/0y3wM n80/Jo/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50 fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHuH5SwTweT 445o2if15TwcFTQkdjnadhxI04BFbl879pZiWrJBscIZlm4dA7FXYq7FXYq7FXYq7FXYq+RPzG0X WJfPmvyRWFxJG99OUdYnKkFzuCBnqHZefGNNjBkPpHV5HV45HLLY8yx39Aa7/wBW66/5Eyf805n/ AJnH/Oj8w4/hT7i79Aa7/wBW66/5Eyf804/mcf8AOj8wvhT7i79Aa7/1brr/AJEyf804/mcf86Pz C+FPuL6K/wCcdLO7tfJN7HdQSQSHUpWCSqyEg28ArRgNts4T2onGWoiYm/QPvk9F2REjEb/nfoCc fnKrN5RQKCT9bi2H+q+cB2+P8H/zh+l7j2WP+FH+ofvDxD0pf5G+45xfCX0TiHe70pf5G+448JXi He70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiH e//Z + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:7AFE812EFA94E911B987F622BD994B0C + uuid:5544eaeb-e005-4a01-bdb2-9e7085444008 + + uuid:e177ff01-74ca-4810-9fb1-85109f60768b + xmp.did:76FE812EFA94E911B987F622BD994B0C + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:7AFE812EFA94E911B987F622BD994B0C + 2019-06-22T17:16:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Mograsim Orange (255,83,0) + Mograsim Blue (7,83,235) + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + Mograsim + 1 + + + + Mograsim Blue (7,83,235) + SPOT + 100.000000 + RGB + 7 + 82 + 235 + + + Mograsim Orange (255,83,0) + SPOT + 100.000000 + RGB + 255 + 82 + 0 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 8 0 obj <>stream +H‰¤‘M +1 …÷=E.0m“ôgfkW£H0 ³p™ûƒiG´ wRèËK×5çfLvûʤlaZÖé¡ÌQìmUOiX9ìƒö@N®iQ¥·¨a¹qt AŒv½îûRÏêª.:å‚Îéô'ÒÖçYå ŒMæÌQàV;ÄðEw¡‹V۞Q“—!ªÜÆ4¹á‘¨ÉÜÅXS-©Ñ¡8$™bÒ.¸·“4šÙ×m䣎þ³ë0ʼö&QZ +endstream endobj 13 0 obj <>stream +8;Z,f9+ln#$q0jV3/j2:`@\UF.%lb@!r5fTjfhE9rL3Fab$V6Oh2lOOPm2G\:+Cm\ +ds[l\O9oeHa:fQI!FKRqdT4*+TIEJ4eQ&n>2sl\[0Gl<%Isho(*Q)51i,km_,!l4n +38[j??3U,:!Rsg'+NrB$,lb(6.cm!C(OjAnM-R]#[<8Irb6tTY3!P7 +`b=946k=it;]qTj= +fmc5HMiYRW(4O[%8["`biP`l'hmR.rohT&^s%6\cs-e9/`QKp+rnH5UIpXgWq%8,I +mJ$8Q)ZJ4a5L"\hIkUi0lSAOrVV`H~> +endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 5 0 obj <> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 12 0 obj <> endobj 10 0 obj [/Separation/Mograsim#20Orange#20#28255,83,0#29/DeviceRGB<>] endobj 11 0 obj [/Separation/Mograsim#20Blue#20#287,83,235#29/DeviceRGB<>] endobj 9 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_orange-blue.ai) +%%CreationDate: 6/22/2019 5:16 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -488 456 -23 +%%HiResBoundingBox: 56 -488 456 -23.5352 +%%DocumentProcessColors: +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%DocumentCustomColors: (Mograsim Blue \(7,83,235\)) +%%+ (Mograsim Orange \(255,83,0\)) +%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) +%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%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: 1 +%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 20 0 obj <>stream +%%BoundingBox: 56 -488 456 -23 +%%HiResBoundingBox: 56 -488 456 -23.5352 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 20612 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 +%524C45CFFD6EFFC9B4CFFD6CFFCABABABAFD6BFFCABBB4B4B4BAFD69FFCA +%BBB4BABAB4BABBFD68FFC1B4BABAB4BAB4BAC1FD66FFC2B4BAB4FD04BAB4 +%BAC2FD64FFC2B4BABABAB4B4BAB4BAB4B4C3FD62FFC9B4BAB4BAB4FD04BA +%B4BAB4BAC9FD60FFCAB4BAB4BABABAB4B4BAB4BAB4BAB4BAC9FD5EFFCAB4 +%BAB4BAB4BAB4BABAB4BABABAB4BAB4BBCAFD5CFFCFBABAB4BABABAB4BABA +%B4BAB4BAB4BAB4BAB4BBCAFD5BFFB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 +%BABABAB4C1FD5AFFBBBABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4 +%C2FD58FFBBB4B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4C2FD56 +%FFBBBABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4C3FD54 +%FFC2B4B4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BAB4C9FD +%52FFC3BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4CAFD50FFC3BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABACFFD4EFFCABAB4BABABAB4BABABAB4BABABAB4BABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CFFD4CFFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4FD04BAFD4BFFCABB +%B4BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4B4BBFD49FFCFBBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04 +%BAB4BABABAB4BABABAB4BABABAB4BABABABBFD48FFC2B4BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%B4BBFD46FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD44FFC2B4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAC3FD42FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC9FD40FFCAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAC9FD3EFFCAB4B4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BAB4BBCAFD3DFFBABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BBCAFD3BFFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4 +%C1FD3AFFBBBAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD +%38FFBBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD +%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4C3FD37 +%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C9FD +%36FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%C9FD35FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4CAFD34FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABACFFD33FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BABACFFD32FFBBBAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABBFD2CFF7FFD05FFC1B4BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BBFD2AFF +%5B08FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAC1FD28FF850931FD05FFC1B4BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C2FD26FF85080F30FD +%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BAB4BAC2FD24FFAF090F0831FD05FFBBB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C3FD22FFAF +%080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BACAFD21FF0E0F0F0F0837FD05FFC1B4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BACAFD1FFF3009080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BBCFFD +%1DFF300F0F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCFFD1BFF540908 +%0F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BAB4C2FD1AFF5B0F08310F0F0831 +%0931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD18FF5A0F080F080F080F080F +%30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BAB4C3FD16FF850F08310F0F08310F0F +%0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C3FD14FF840F080F080F080F +%080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4CAFD12FFA9310931 +%08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CAFD +%10FFA931080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4FD10FF37080F08310F0F08310F0F08310931FD05FFC1B4BAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4B4B4FD0EFF37080F080F080F080F080F080F08 +%0F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABBFD0CFF5B08310F0F +%08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4C2BBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BABBFD0AFFA9080F080F080F080F080F080F080F080F30FD05FFBABA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAC2FFBBBAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD09FF850F090F08310F0F08 +%310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FFFFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4B4C2FD08FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAC2FFFFCFB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAC3FD07FF850F0F0F08310F0F +%08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4C2FFFFFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAC3FD06FFA9080F080F080F080F080F080F080F080F0EFD05FF +%BBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD04FFC9B4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4BACAFD05FF850F08310F +%0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4C2FD05FFC3B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F080F0E +%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD06FFC2B4BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4FD05FF850F0831 +%0F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4C2FD07FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F080F30FD +%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD08FFC1B4BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABACFFD04FF850F090F08 +%310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4C2FD08FFCABBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F08090EFD05FF +%BAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD09FFCABBB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABAFD05FF850F0F0F08310F0F08 +%310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FD0AFFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACA +%FD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BAC2FD0BFFC9BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4FD05FF850F08310F0F08310F0F08310F0F08310931 +%FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD0CFFC2B4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA9080F080F080F08 +%0F080F080F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BAC2FD0DFFC2BABABAB4BABABAB4BABABAB4BABABAB4FD04BAFD05FF850F +%08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4C2FD0EFFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BACAFD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAC2FD0FFFBBBABABAB4BABABAB4BA +%BABAB4BABABAB4BABACFFD04FF850F090F08310F0F08310F0F08310F0F08 +%31FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD10FFBAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F +%080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2 +%FD11FFBABAB4BABABAB4BABABAB4BABABAB4BABAFD05FF850F0F0F08310F +%0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4C2FD11FFCFB4B4B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA908 +%0F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BAC2FD12FFCFB4BAB4BABABAB4BABABAB4BABABAB4FD05FF +%850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4C2FD13FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BACA +%FD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BAC2FD14FFC9B4BABABAB4BABABAB4FD04BAFD +%05FF850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4C2FD15FFC2B4BAB4BAB4BAB4BAB4BAB4BACA +%FD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAC2FD16FFC2B4BABABAB4BABABAB4BABACF +%FD04FF850F090F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4C2FD17FFC1B4BAB4BAB4BAB4BAB4BACAFD +%04FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAC2FD18FFC1B4BAB4BABABAB4BABAFD05FF85 +%0F0F0F08310F0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4C2FD18FFCABBB4BAB4BAB4BAB4BACAFD04FFA9080F +%080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BAC2FD19FFCABBB4BAB4BABABAB4FD05FF850F08310F0F0831 +%0F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4C2FD1AFFC9BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F08 +%0F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD1B +%FFC9BAB4FD04BAFD05FF850F08310F0F08310F0F08310F0F08310931FD05 +%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD1CFFC2B4B4BAB4BA +%CAFD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAC2FD1DFFC2BAB4BABACFFD04FF850F09 +%0F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4C2FD1EFFBBB4B4BACAFD04FFA9080F080F080F080F080F +%080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2 +%FD1FFFBBBABAFD05FF850F0F0F08310F0F08310F0F08310F0F0837FD05FF +%C1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD20FFBABACAFD04FFA9 +%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BAC2FD21FFBACFFD04FF850F08310F0F08310F0F08310F +%0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD21 +%FFCACAFD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08 +%310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2 +%FD27FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAC2FD27FF850F090F08310F0F08310F0F08 +%310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27 +%FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08310F0F08310F0F08310F +%0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9 +%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08310F0F08310931 +%FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F08 +%0F080F080F080F080F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BAC2FD27FF850F08310F0F08310F0F08310F0F08310931FD05FF +%C1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F +%080F080F080F080F080F30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAC2FD27FF850F090F08310F0F08310F0F08310F0F0831FD05FFBBB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F +%080F080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAC2FD27FF850F0F0F08310F0F08310F0F08310F0F0837FD05FFC1B4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F +%080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD +%27FF850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F08 +%0F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF85 +%0F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F080F +%30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FF850F09 +%0F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F08090EFD +%05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08 +%310F0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F080F0EFD05FF +%BBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F0831 +%0F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4C2FD27FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08 +%310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2 +%FD27FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAC2FD27FF850F090F08310F0F08310F0F08 +%310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27 +%FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08310F0F08310F0F08310F +%0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9 +%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAC2FD27FF850F080F090F080F090F080F090F080F08 +%31FD05FFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BAC9FD27FFA93031 +%303730373037303730373037303730FD05FFBBBAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%%EndData + +endstream endobj 21 0 obj <>stream +%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%d_²Ý#)ɬ`1¦ó(ÉÌ"‡|™}˜}±ÕïS…fîy›3] ²2Cà 0\ +=>UüÍÿñ«ß|yýÕëßÞ}®†Ý“/þæoo{ýæÇ;’w?}ñâÛ·ïހôƒ_ÿp7ÎWžºþiyjOþÓݛ·÷¯_ý˜¿» +øí-ÞÿÁá÷oîß¾»öjw{÷Rúáî?Äoÿáþ݋;ùýýóׯž¾~óìÕ×w_þöÅ·wWÏîè_ 5Ÿ½“ÇæMӏ¦a\véÇã¼ûÕÏùȳWxööíýŸïÐl(luÿúÛW_Ý¿úzÿúþx—æݗ±”]Ä?&þþïï}÷ö¡‡®RHž<¾~þíË»Wï~õæõó»·o¯_¼~óöÇò›ëŸ¦§·÷//Ÿ½ÛGãú§ãôtÿíý‹¯~ñíËßÞIßçe$=<å»ÿøöÙ×ò¥ü7éùéO_ +é7wïÞÉ·¼ýñnè›=Ȉ¿~i­î~ðó×_¿yööþån/ƒ´û·ä¿+á戀þ퇮ÿ³{â—MyfJ O ö̯²ï*•æ®†)Ç4Ê?”â"/Әæå­u/=®å~¥i–üë¯dþîdßüûÝ«ÿþÃ:Zo^Fd÷e§þ?Øoÿáîå7/dQpî¦4_%™5þÕÿP–iâƒ_†ñªäeÙ}9Çájž©4Æ«QÖÔnLËÕRì6ëw¸¿ûãw¿xýêÎ&ýúÍ»ßèj‹qô¿ö«_ûâîÍ?¾º'=“¶è¬ÿüõWw/äVÅí‹gœl–±ýמø‡go¾¾{'‹ôõ‹oßqKoEVÖϞýé b´F~ùÍÝ«xýOüÔ/Çi»<™œ$ݚÊnIq76’¤Ù;µÝ±ý×jGU¨¨6‘1u¿’úË7÷_ß¿úqýÆüô'oî¿jË6O»¢ÿa?®J÷ÿ¥þß>W:ÿîÝÝ«úý²e?ï6Àpõó_¢Õ›W_^¿Ä<¼å¦¾“öe½xýµý¶ýÀßIß~cÝ á©LÛ¯ÞÜ¿BÅO¾ø…þ®<ýՋoå—?yóúÛo~úêw¯Ÿ|ñepÿt÷\˜˜ÌíW»_þöȦ~ñìù￾ûóÝýóß¿º{w÷v·—½-tVXÕ7?|OÅÒß7w;ý­¼ËåïßáïǼ¼ûp™VRÿþßBŽ/^ܽúòÿùöí³w~ùú«o_Èoo^ýáîÅëoîvÏ^}µûçgo¾yL¿zñìÕ³7;þ¢¶Ð×»ûé«wwožýû»û?ì^>“F塟ÝÿA^|&ãû¨d9}#£Æ—ø̺µ‡è~õ¨¦ž½û½0­»W_½õÚ¯_}ý³ø­ð¦íˆ±#úücªÿ͟^þöõ‹û·/½òžâÿ~ä—Ê°¾úå+ýä7ß¾ýýî^¿~á5ÿ\xõݛoî_½½{±ùjá"úÞ_UCþð¹F°yþ—hâðìŋ{9Ͼùýýós­ü7ûýïîïÎ6váýG­®çœªs­þ曻?ß?{q¶ÅÓ×þê³5¸»ùê^xç&ðà3¿ùã³wÏ¿ûÙýoß<{s÷žÝŠÉþÝý«¯äCóíý»;oÁ¹òõÝÛ»w~' ZØ+،¼p۽ЪOOå¸é“/¿|ø ‘3vÿªä'ož}u/G™Hq?yýâ+yøk©ºý[ŽÍ¼Ûõä‹}òÅÐýo¬ÿ‹»¿yº™ñ¿yûgܔ©+ÁJ´’øÿZfü_jœW%{)ò*×]ÙK9X9våf¸•okY}ZÿgêJèJ\•¤EÆçq–’ùwéʲ*×ãÞËÁË~ì‡Ãñp+ËnädÄc:ÎGù¼c9.Çýñp¼9ÞÞ 2=á&ÞÌ7ù¦Ü,7ÒØÍáFVÉÍÍÍ-–Æ­ Úmº•ÎÞÊçß^K‘FoåÕÛÍÎéÀiuÚMWŽ]9te¿*×]Yj‘i¾•Ü•yURWbWBWd5J“—ž³5®<ôÓÿ9®ÊA‹ þÞwåº+˪”®ä®Ì]†~“¼ÄU ]™º2veè‹û“/lúô]Ùk©[u5ŸëY\Ï]µõL­gGfDjŒýŒt3±ÿõ¨ÛhoF˜£*ãµlÆÔFr5†ëqیÖz|d¼Öã¢crmea)V²•™%Y‰,ÁŠ¬;nF;SõTð­P;§Õ?{–k+ K±"›]6>ÌV’•È¬(O®g€ðÕnNo8{Î[á<%Î æbàè9Ú×ÛÌь½‘£uÃÑÙs4Šô.³ïè1z9°WGöâšßù•‘_%ß"ËæF†ô ììZØZö6 “‹Âì&áóò¥²¤nd° ¯…-–ë, 2 £ rތrßÊÔePö˵°Ó²da¬Ilj”ûVÄQk/lx)òÂ’gaͱaÒ£œí·²TŽ2”û|-L¼ä,ì< [ÂÜG‘neex÷Âú9²I„ ÇÂ8Ë7ʒ¾‘É>È¡q-‡G‘#dNI“ ‡Ê(òÅ­,¼£LÉ^œEžg9‚¢E“HƒlY9¤®å°’o”ckI° Ù(Í­,Ö£L#ŽY¼8Š“}8ªažSöۉÀö$ž­OòYÙ`zôC܃€°P€PBDŒº6.´ÊšXG­¡½eZñ‹Ûî$PN±ÈK²¾FY[çVÖÔ#<¥ðGOª‘§Uⶮ'–Y8±äP¡~ÎF?gYzåÌÉüdĹx6ëû.c“`s•3(eÜPÎMÒH.k\o§Ão¸õšågʂÇJÁ†Òíԟ£~×Ç8  Ÿ§kŠ67ádPÄ]|RQE( ïo¤‘ÑDwífśèM•…µÕºZM¬‡¥ïŸ$ÿþ~2u"W‚…Ž +$ËJÙsÍl~x’!•Yõìª-«Æ²z¦E¶å£†™­YÙû™OÇf+–¼wùº–¦1••.•M¿Ò’V:˜éeRc0f Tæ_©Äkm¯žV® º6Á"£¸Ò"”Ы恿—M)›Ò4Vý×lºl_âI 'e:SìÔØÿ9Q±;{ÙÏÿ>ž-ÂZd¼ì½\_(ËÅRª†)5æM™Yšöšú"5®~v Gû÷i  +—†Ô8=²œä3Ej|ܓþsÖVðI>_Ýñ:úÀªô[¥ø£•Ûª-¤ÚFŠéÞÕvbû^vµêéu·W{LÛ +Û½]eߺ—ûÝ»·]]­§{7»Õa¶’Ü&ÑìR¡ß­nÍx`ŸÊ¿ÜÒlc›½Ywç‘GSµ±ô6¶ýÙ½¹_YæNwgµálwkYYùšU¨Z†ÎíWÿye;L'%®¬—wåÚrµµYžÛ·íæÍ^宾ð»ßÑî꿂=øùk¼ ôöêÕ©‚¥RË©‚Ue• +û %’ÅÌÙd’ÉÕ«ÛN*É+©dêT¬ƒ(YT±ž|!JÔ,U² f T±TÉ:ÐꤊVqE+˜¢Uë j֞ŠV¡ KV#•­‘å–ú÷MHET-U¶ nMªnQá:šÂµ§ÂU¨pAå+“µcj×-ui(^ªzAù*T¾ ~Eª_#·Õ-U°U0(aPò4‹GEÓ-PuŒö *dGQÈ ’A)ƒZÅ,ÇDÕ ÊY 먠ݚ¿×"|¡| /SʛñBÀŸ‘VãìƒuBš§²[¡z†ÉÁ{ÞÝqíN +«ö\ý»çɽ EyIøm<‘œ³®xéJ²Yq͏”ÓË,(nw–Ï= _œ‘'Ç5.r“ϼ«]ÕÒ[Èú?k£`gê\Ûáê™K•c4•¶•°*k›_ڔyUDXYóÊÆX¨c­Ëõ¦ì·Å,š}9ž”Ó?·§¥®6aýI>ž)ÓÙΖjE<-éB™/·'KySʃeyO‘beÕ>_ö,äøRãá‘åø¸"5žRÏM壋ÔxéwùçÌñúÑ5¹hp­u2'Š–hEí©Õ¾š­TûëbŬ³R£ZkëŸÊ*ÚªÓRùmÕ­«Ô_-Åj7–õMó”–ÙKµ5/‹•k/û3<ëóÒ Ç:Ç«šáááß<ùâož>æÙýÛ3u^%y2 »2^‰þ8_®pû k»ç¼D`ÿG(ÆS|§R¦(ÿÈi²_kÐZ¦«0¤Øšûäšô{QjӌHÙö3^Í\TwV¶Ä4,¢ÏˆsLïÐ* Wƒpšî³>S…öuó |•¥qH™/áÏZ™è–E˜„Ï¢2™¾´¬*Kðô_÷y*ü„¹œòU aAU%ååS't[ݹ5k¿,WÂç/.ØõS¨gløÍ +Á¼Ëüûû—/ï^”iÿ’Šc…dþg·Æ0'c•ÉÜ|Ùãµ±Âcï³56 m4CÓã\øØhxªÈCˆª=·[š?ôP›yœ]ó »!‡ž +—Z×´mÏ  9X=#jÛU1N“Á°—êò¬ØI:N–À(žûsÚ[nSg qL Ä$8*akˆNP|‚!h »1ŒÂ!¹ÛóaìE‡¼xîbë¸ô“}47|ïˆo®øƒžÞ;>úi½T—üÑ'ò™Áø •• +á£,¦¾Bù r¤®$#Ië kp t• ¬wÌîMÖQ6TCÃ5¬f<Ü-x yLÍaÙÌ^Ñ èc3 +?›ò(\Š{қ1X]ԓ≠Gttìе!†ªq82HAû›§sÜtè¦ZÕ{\zN” gJљ’t¡iôšòôžê´Ì§[JÖM¶V(&æQåk•°›ŒM)ÛÀ™ +τœ I[$^JۅÒv•·+™{#u›ÌµP!œ”»«ä-»l-{c•,ëžNÞ¡[¯7¾n°ïM÷§®ÃS÷ctÀÖiyúSÿ÷öß=-9°¿…rċ°‡Ë ˆ°úw Œ¢þ7ÞÍqÞÅÛ~ï_ûÆ혌¶lå6k÷Ä +*º?ÍmðÐ + 5H¨D$Ã{O±àš*{!;™M<¨~Ãф„µ÷ðÚ½‡™,Ì<ˆÂ¸&î¢êG<òóô`Ô£±Ž~<úYH8yLÊAùä ;*ûò?.{ çʹs:œóÉ*.™7q è¼é|ÔIq¥bÁ> + 6:»>…swåý€îf6±ˆ×n6ނ˜³›š×@æÊl¥2K[0óqf¾¼>‹Öçõ*••Ý€Ì=Œyð5{k¶íœ6°÷Õ«ëwáQÈU,+[WòÌ£²­ç`0;åòêú¬kûƆìÐyÈuK‘•­«=ۊŸ©uPŽQžLÞ®gˆ:RuÜpp8~àœ3k¾°-ç]fӉÙû$Àál Ãtô ëð$ôaÊ?qa`}©ñ\(DÞ88çûór@D šö|PÄøÀ.º´‡Ž@ŸÝIûÎÝÒöR¿Ÿº]ubȺZD( °Ìr?´~áêÿ0 + K´ „$\Š¹ +v"¯”xyº³v}® +ÕðQæyñj\Dt.fHÝV¡vžf7™¯DÒ*Ý÷|tú9a‰°Ð„¼0‡^Ç,Ê:‰¡·% +/íú‘fyuì¬vŸ\“™‚Ê3…¥Ðü%Gq -CF02é[=ËUJRJtf O­êM7¿|óü÷÷_ÝÝÁxãÿ–j¦>¢öjÉÑò5a’óÆ×ʌÑXÆg`ÊÛZdíÍ]}Q“uØ[;{É °H°1 ½…ê#Þ6 ØcßÄØÅùJçÕ4|l8ø¿AŽŽ7zûMqmà{9½JϽܦf#VãÞËoª¾epg(!U'J®÷d×nZhh ñíµ—ÎKeݦvZa¨-PW!« +`½l3H´Pwa”KÕ^Ôf°tZÌÞ$›j9· +Æ2„++¢õBÕ|Y–Tß çRKBµ&ì«üb'Fu¡¨h>ÊÜÌɪM"dÒÞ@t-KÅlZL†¨aWÉ¥%w‡WD”£d)dj ^’—ö'{)^®½ì[‘]i0µ[¨Ç©Ž«ºÂá{òEŽ^Òªœþ)›²œ)"læë“r¸PŽwnÁ0|ÁÙ>|pá‚…búålps oÎà¼o{v\ÇÖîÐ} Õƾ”¨ö„UŒ÷ÜmghþìÅbƒŽÕ-Ö½[›ìÝ:3ƒN]hK½¶•}C»Ör u9Ù*…UmÏ5yäZ¬¾ì‰+ªù±¯éǶy$t¤hõ¬v´Bó>ìh Ն6˜ -т¦~ëŽÖG3øƒ%N·› ‚ùâ64ú«iC{ÈgݼÖKg?;0à6íÃHº¿ZԔµÇz¦*ӐBÕs­úIC5$PÃqˆû‰+ÜOøYNð>+/v‡ïqd)k,OŸ·ˆS¤Î)JðÐáÏárVˆœ‹èœ•r²ŠÊ¾Œý»¤$­:ñ>ð6ðÁRm-ã:ºFA×èç÷Übžë—4E͔°NÍR¥jÕܢī*ÔԞ¿ì +M§À 嵎WnjÉi”rSë7*}¯ÊÖb­ÊŸ74¨ñޔxÃß­Õøµ"¿Vå×Ê|1+wöƒPfÉUú¦ÖWÅ~òŒ'C§ÞßvJþërn-¼¢6Þþ,^Š—v¬µC:y‰­H¡+-¦o\•w½†nô4'U8dc‡Uٟ”ëM9÷G4òØu9{°Óhw¹¸ $5¦ %~páÑÆ4Ÿ¡|T,üÃÑð !•¸"=ˆ_‡’®£âû¸xóÎÊêžWÚæ£=®L¯+ëzkÝ_[=¶×>ÏÙæIÇuÚrÜ;¹lÂ9B3¾šùõ&ËZ$Øs+,æµÌc«[M±Í‡½öb·0L)XVŽ{¨7{Z|ܐ­Ã>J-ÙM¶Édy™~¤!¾‚h(ÈÁŒ¹ë€ Q‰©†hhˆj!t6‰UƒDnM_Q†ªloOðµkØH82›âaJMUIm©ÆìŽgÂ/ Ö0“uÈ°Èz¦±-¨z)l¸•x.„؉OÿœFö]Š%;þvsSn>¦¼3FLMY[Î?Pí i(¢>$Òïbf‚ûÑØ,In7Ú8>âõ´1üã«WÏ^Þ}µûÚH»ö†3ÔÞès.Sr¥ËÂ4^ý×$·5Í€Üná¶ë k ­Âp½‚×N0:9¸v9qk6cI_ÊÇ‹\9£Mž òøŒåû/=ÑIU~›«¨Ô6QrÈ«¬™áh™2‚›tV½JJ¹di Ï“h ž ziN¸l`Ko®-kxÓ:¸Éy–'áM +²œÝ8,üHxÔ¾ r2Îd¡NQáÓ*à)yÐS-Õ¬¡¤Fc5ux›¥šVšÙ¥EÑ43͸-D<µΔx¡¤“Bî(5ÎËÿʅҌVÅ°+RN,Hë"5¾ç‰-®ñѤÆÏüçà(ÐIn,"Q ¹Vç”'~›Mç¨ÙwÁOL׎r –¡(ͽ -ïÖAûi•wW]M¾Ý»™Îs”ÊS*lûLÈäY®RùJfZHå.×+΢6ø-oiüe2‹Nã2ÉLŸrZwœ¦þiËuÍgVà¡-Lªr•£V\ç÷™.” Ú£/s¤÷ñ'/Rã¿ýˆò0×û¨ò}©?0.êѬq B'v–¼²™eˆ99ƒIK]bË>Ê‹Ö µ«T¹©:Üg³j®¢’ÃÆkˆÒ5mZ·.?E§{çú-å§`K™L + +ÓxòÝé +Âk©]ýµ1:ғá0ÀvÔ'?®ò®àNô¤¼I8Šþ9XÜ<½ƒ9ÒµÔ=_ç´2°êkHj[LØ{ÛiV½æÔkCkýe+Ýv ‹~¦Nùýe~l‘ýì¦;3Ùñ$ð^–o¾I²‘K÷hyÓfæK˜)mO“×Ls×h™Ñö²ÞÔ¹#L\0oÁWšºÑ4náÈìg­jÖ3ºÊ<½tÉ5„O$Š—ð˜ÔÒÛäҞ^ºE#<ùÂÜ\ÕÅUÝ[Á¢Fwj»Ø„ë.·Yscх%O±Œ éqɌ€J² +AÉ9©3~¾wæüç|ΑÿY«­>}„ƒa—Æ«A¸Ýʳ¿ù•¿!ÍÊoæñ +‰&v!^Íc—nëG65d©8MónÂõÞK>WÃö‘VCÎçÀ=ýÓñÓ<Ân€ØK=í®'åðaÅkÚ®ñç!Ïω—Êcæ4f0€üсñ§Wx•Óx£Î‚ÙßR˜;Œ\ÏgÇç¦üÕÖÔ§l:xbÆf_³â³³žµÕŒû3ç°×»á ŒüÆ%»ÔÈowêRÔ´4K¥K°Ô¥Wú,Ϭ™`˜‹2©®…¶5Dæ»+q Ìm7¤¸ ә\€2}¾:-6: ÓÈêD ÓzáÙÄtçhxVC²aÀ¥ ‚îƒ>®ký³ôæóÏ§³ÎóŒsú(Øì8ÏܗåYƒmòb\‚MÍ'`Ñs0× Xׄ ^û` ç{sB»ê—]u4üõG@Gß f?®ßAà[‘,lã=-|(sÝF 9å=¥&®9Èö7hc8»Âv?°nÚäýí3éÁrã¹~[¦ßÔ]ϧY÷Lid™}»øȖÏwö<¾×÷èëšN6éž¨x&*¡Ù K ]n{‹×¾1¨Aƒ/….n8&f·†ÿQÕ7A H™èŽëã[û¼‚º<ßÑ6ãQŸóh"²` Þ æ=ê3u8–ýèLŽß¬RpJ ÀùŒã {òñã3+ÿC“…l¶ÇǼ®§™¼8 HÿÆ10„¾*üm.sŸ7µoðCÞúä]XÎoòMÁêÙkþÀ>cw…ÏšØV—ÃI†ð +émЇõú;7:@L{»¾/ê;«üœsyî±½9¹ƒí%o窒mýßé…f M‘ºM/u.ÁÔx&Á”%—¢ÔTž]Šù¬±¤~ø­žú€$TGz\±¥k̕]íTc;kdàÔ"½íÖN:ÛÚô@Ê+o±±Bi{‰8ÙÊœ%ú|Ñ<: +¹áÅV /´ +ûQÆóÈ|µ³|É$í⪅¦Ð µÀ +ãgv “ç"«-ɪCV\6µ—µ˜…÷ÙÄ·Œ,¼æ%RX~‡éy îQ×þ7èÆnØÞ/ÿS·Ýíµ.sªßWà¡àv‰®y C˲Φ:š$ÓzxÒwX¼sÅ°+Ÿ¹‹á^»å¶L ׂ(ºŠó!³÷7¯ ºëìrÖ¦U¶ö—¸ú–¯7È´ÎE[lÅD< ÷è@͖×9õ ªM†g‚§.œéä0Jf–¨D(ԁ¨@ØÀN78E™a`)”´j ?þuý}ߟvÛ·^LHìG_\oßþþë>ñëVè,ûa¢åaZæaˆ%¯dτÄ@4Mwú–D¯ˆ@Ø_ñ™ë5‘5”¥y™àOFQF˜âhVËNÀUәxótµˆ:ßëg­×ŒEŸfü¯uŽW8®?ŸSaS¯ë€Ü¿è¶0ö-CX8EÃ\´ÿ¼BâÌ?Ϋ Ÿ©ÆOU!âY "nýL†…dLÅnY¸å •uâ~…[K³®éÉõ8½±ã3˜$☮[êñÕuÑ®è/ð«}ú‹}º‹Òdo‹¶¹º"ms9Úúb´V¿¾­»m•Ýóá‹WpoëÞ±õ¾ò×P£5=ö:Ò FA˜)$šxXEý§( Lþ—™®ü`½ÆÊëQAÐґyÚÿh)øªéæÀ#äÖӍ6ÑSæ7-‡N5Øh^«Á’M4Ù P³ëKc×BÃ,¹smÓÍm¯°g*³ó%-‘œseþØÂKÀ>kùð}´ìz5ë`½$CoŠ­©,³ýéè5:LÑÁS°OôØô Óûÿâï> ýÐ¥£ïcCðQ¾¯ñ±o´{mٞQp­3.txóž×7C.œ(B"„<i0òZæ2Cì¥@…ö\’;9Ð%Á£ÁS®íևz…r½ó%00¤^O_o³h·`ô—%÷WÉ/'ËßSò6ó—#¿÷¢öó—$_¼lý£/]ÿ«Y&z¹^nžhóé!qÅrShf +ÏJñðmEfãjÆw·n­ ïû.ïU5¼×ÜW½é},ŦÍᏖÍtoÆøkωUÍòŌóõO—ò•7>õ%ž”p¡Lç o·9WƏ-¼¦ý³–¯ÑÍ]Ñ;,ªËb<TðGñlˆ}&D™Ó* b»Îà1ù×™ÛÍC„‚—>Ìh˜Û„,½èõ†7l]*g%Ý÷”ƒ@>[ùk¨qkCü¤¿“TI¤Æó¿9YÈéEý…T§èÄ>½:d>É,ºÎ.:žìªº§ö¼=ûÚ\†Å/¬‰î8lىÎç'7§€^́s ÐpkÐhõ9îoåÃ÷äð³ðô©ø™ó/HRç‹xA1E…öëu9Qr6¹¶{¤\S›\•~^s„דMsŒëÉ£b‘¦>À|O.[öÇH™p¢@ą¨a”–é1¸œy-›#l‡ +&‡åvÁ€ñƒ¨œ*)ªµP¥Ä=ó"ª„HÙÐ$BH‚ÿ ïAÊ»¦‚yÍ}oÿñÒúת…}0²ÝIßÔÿ·)‘ûüŽ®µšºP­ŠjÙ(ªy¥âZéTœOŸ“?¡V(.Ý_j…ÚúéµoÛkÛz5ÈÕ£“Á¤:%5.¦`í7ØV¿„°»Fpê píê‹â÷·î-{bugö͇\š§9,[K½~bqwÕ:#ہ9’&Zªp‘¯#õ;nÿÃéOªñ‚Êq¡˜¢Âlërªä¬• NA:w…ÔèNXÙ[˜v­ÄM—fðœ0e…¹äÆ흸óêbÏCw©çDÇgºÖË<¯-s]µ–Of+/t<h!ézLòÉ°ˆ;æ?^þNj|P%ËãC2?ôxõÕmö®JÕ¤ó…«WŚ‚V³645n6En—;H‹_ðP¯x8¬|k/F½ä¡AgóY˜—BDkƒ4žÜ§¿ºKûps<ƒ¦Ë¨{n†+ŒWý‹°¤d¦\®pãÑ.Ç«1åÞ!øiõ¨S- ÓBˆù0N3ïÙf:&ÍãÃ2„yzÞ;Ç°‹ùJv÷9Ÿ\•ÝmöA½*y7Å«¼þ’®âSyé¬#/m¹g1:Û#íщcò¹¨­ñQ[—¯;0…ñóۀÖgÔ#á#rÀw˺ÝYu´[šë½Uíæªâ7WÍÝ=Zí¢aÞÒuæÌø`ö»^Ÿõº]ÎqrsÇz)^zàSW]>/ˆåIÌ *Óê>ϓøº®ÙX!¯/Æï5yh>·®»ªy$­#ˆ lu–MLàöŠŠ“o¾ xya_毫åý Ï~,×~xÓ<î,xÔU çî€åT£B# Ú(ü,¶þ;ûFØ^P¼ÝEŸ\ÙwUøÏw÷ÿßÿûw»ß<ÿýŸ½ù3¶Í†ò—º”æÔ¤÷‘×Ò<ùâ$mqM‚^“÷ ‹~'æ:zMT| ÀìƒORIpù†þ +†}=ð)‡îZFHP’ýÈ +ž7ԓ{n A3Îw}åωù÷£/ýa¢¢Ëk¦&~Mv³ª®š–îºÊØ-å5dë…AUº¾±›|‘F“îڌš4—rærLY'†è.÷ئ9žO3ñ¨5ñ1* ŸëJ¥þ(_«'z0ûÑßµ[×C—ýÁ5ñ¾Dèë4èfî¦'ùS¢¶«ãØÅ-}pÆzxöV-¦Í~´ýÐñ‹½XSü[’?o5†0џ§ù;>*Ñß:͟Ån‰ÌóIÑ[=m¨]FoÉ*ûèø-"vÒ˜ © Œ.öÖí&ÙO>Ÿèû5ñýšø~M|¿&\ë´`1ë4ÿׇ¿üš·„òô¯_ýêÍý«w÷¯¾þòË^uïóä‹_|Ãßýݯž½{w÷æ•hõ×/þôöí3hóö¯Ý²\-ó´À ç9즯™Ý4ÎW²¸fýâkýë_þˆ¿¿Õªõ_þ¤?ÿWù÷ÿêe(v?ßýëv_=á[¿Æµ¥Zñî%¨'íí~¶"×ïúY_ÅY⺂WøϏ®ß¼;Þ?wÿúÕ³7ÚýX"?Ú¿~ýBÆâ§6.Oo¾º÷úÍÓý³çÿ.£÷ôî_Ü=ýõÝów?ÜýÞø¿ðï÷ß~«µµÓ¿Ôµ2áÚK5†ŽS⪉²ZŠe‰´KƒK½÷2.eËî_ži]ë‘ ãx5„yÜ¥rDI°’~NRÑ.-W³Èd;a W¨-e\QwS‘Ç…ìRºeîžóµ’®d“‡]š®f؊q§¹ìâr%ú.Mž¯Æ ÏÇp%;rªï-WCÓ.Èo3«Ïln*Wi‚Û¡ WiÁûù*À¬¯åx%úÌnšú,­ÍҊ¥»0éG„sí‚tC$d{M¨£h8;™ö2Ê*œó•ˆ¬# BpE§’ÉMS(µsó µNqç+\Qµ›dpÆEVF¯¤Kø{"¤«èoW"íŽþåӜ®„O&Mš‡ätó|DzìÆ$3;Ïõ½ùjn´Cø->*æ%í¤¾qt +2Œ†äïI§0r_ŽWÂÏ0b¡\ ¢ïí¢ ¥0K!ȗ̳°rdïÉÐϘ˜1[g¢°ž.3Žߍ™_êÌltxæ»C-¢‹–4ŠBÔy‹éJØZ·0^ɲæfßQú&2ïæ(˜ä£ã$3»,»YÃë{²úÆiÞåñ…C)ÜzÁkr† Aöj h'ƒ—…§·Õ5aOHeˆ­Þ…Aº´È(Q&|Ùap1Ëâ”óÁfN>ìjd$d-Â+&« +ÍI3E^O2TAWwžtê{2Ó¢ñgF¹ç«Qž/sÂæVùvÏñ½ßé?ê엫‡‚W¸o^®¨²Î¥’Kg)²_d‘¡#bðŸm%É×-2qþì¥ØÕÁkC¾ÔA“e¼ÌxÄj'àÔÚ©„¶dñ5í±Ú ¯hÓ­Öñ0–+á:2–AX€,¯—kjÔdyÊ1AC9 Avã,˺lîd½‰rÚ=µåVQ%X{ö^¥NW¢ËÜyEãU”Uеg{¯~–?V?Ü+Úô¯uýoÿÿýÇ8C~úöéϟÉ1|xý͟ž¾þϔŸ¼yýí7vˆœå×wßÜ={w÷ÕSid{Ú,»üp÷/ÿ|áà‘•’恰*‘Nºmaj'Ž°©<¥þÄÉz_½8±\ ߒ±Á>Š¶–é!àñ•UJ;áss.< +÷åȵ,r£ŽØ( gZtÁê{²Mµ¢¤Õ;a±'ô½J‡Å^œp°¡Œ³Q„3ÊáÞQôÕ·zP´>8ý6§,Eå}³R…qx¯ øá²;›N kO†% ¯šd|…é¼\SErK…aF£+Kq&Éü؏ÖäɞÛ3Ê ìË+q‚µÕFœÔQ&¶ ­ZÏ »Øº]ݾȟªßìõlº¶Ý›E‚pcÀ÷9J轒smœ-¥öÀ°Eáò%ÊoKp’³V†Wn„9;Åޞ˜\WaWCDÂXaÜXb8à9–ä(Âce§ƒpqˆLŠätÃÀŠ ‚<_d@…µ !Ö÷„'i]I`ٞh§n‰ ÞیÊé1„M3HÒv¤…—k*:Žã[:œ"–Ñ$ÌW–ןŸû`‹¦ØÉ@ØDWI%X[öZ¥ÊlË0켞ŒAŽsk­ì=ý¤öTýf¯gÓµíâw×ß|æ7Ba=S0²lÔ$3&3-Kõj,< +–48èÄÁ ÆÒÊ'í1Ì‘×S ֜½W©ù +úþ®U$rw’¥ÐÚ3‚½g_åOÕÏöz6½ëÑô6ÄÏ°‡GY8)OäV‡u ¡p`îg™%ÕFáùr ó Çhjž°ay#Ï|0c³ËÊËxqXºs–Ë`  x ö #cr„®%Çy–­]†±î'ù)Îò‰¢Ñ,äSe$…§î–A?`»XOuè"\±#šÊU*jdˆ™Ò¥Ü-+‡ s…Ÿ#UN£øZ‰SÓœdæ±«Ë Ö¦½édŽ JZW—ˆ³³l£®Q£Ø«þuþ wÀ+Ûö´ Ƹp˜ø&“ú1Ï%aqW²¨Ù"Çc`Y KZQDÌ+“O“±×JÚu•Éñ«ÖªQìÕp5 «ï”h³®2§¬[u²žWæ]ØöµÙ7#Q“C‘–_®©MHØuA‡;âsD”EÝX–•à\ +Y‚ÚcsÑöŠœ`í=¯‹O©AÖ @Ø^Ñd½òöŒ`»¾~–?V?¼V´íß{$½O2pA `ªê Zà~¢P¸= ÊEî´´Æ(қ¨pkƒ$[À7h©ú!«©´ æÊz‹kƒj["LfÐ/e{Õ¢5ÒR"ÕºLÇÆþšÕ>.ÒÂÜ(6†ð‘@6mNpctUéϵE7¤/ªS "ÚîZ5PÆ8…Þ^¥Ø‹õÃüÁÖ§ZÙI/¿CÉ—åÀ¯ÔrøêöÃsa¼úý à¦4»Ïr¶‹ ‰7«ço”7FõÚ¾Àù#ºBu4:c„eÄê:‡!  ‘Føré”+¤ÀÑãL¿=ÜìŽýPΒLï}ÀƒÐÓ4ªÓ\É"û‹|JÁA e2ØA¢Ú³8¥Ê€ºfl®¢Ø×Á(1¹·q‚-€3*4ÊI><ϋºëh—‡%oZÀóDu +Áµkøöq-¾®è´Â$;jÇè–<]§ªã›¬%òṞB¿¹Z)°ŒXKd|2‚¨Ïs#ؚ Š8ꞛ`Í諪kÒ^¬Ô`xàVÓ¤gkkqêÛîËü9ÿz¯kÛÍïPœÀ äNt2ð„ÓÇQ‘ ¥nLÌ éj˜ª ë«Ì0öÂxCÕÖ)ø‡ú"”Ò™òå؉sXiµ…0 §;¹b' ÚP4Äþ¨êF'CÂ;„…ÛÌKJ.ÚW¨b8–• ™7dpJUÁd…ªÐëÙHM†l䪜j~>©èŠ>LÙ +Ã,+I;¸†FýÞ¹~¯üC-ƒuµRœgäY•8F`¬”þ°1­lé•2ð%~/íêbS ‰NÍßò †ªà­rµ4 +ÀÓA4Q§D74xlPû$Í©þ¦2—<^Ѽ9LŽíS–Ô©UɎh:/Me‘ÇR4k? +x¬+¶7¥„ÕçFAR=¥Ðùd‹õtٟr,OàöÐ%Zí^nÈrüš]DŽ‰Ðìo”oáñÙËJ±Í!žÁXۃr–¥¾*û9ôvÂJL¸qmÜuÕÀÓ]kÏ(ö¢˜?èï•m{ÙyeýÒÿ†•Ï£ì冼¨ ðzî` H–å<)<Ï)Ø•Ô=(›wJ«Êœb­ú«FÎ*·Êàޅ¡µµZ)öjý¼ö wÁ+Ûöµ™ž%á\u’X̗k2pØI¹kÕ,ƒ …å0¢8œà` ~¡=‘f0tu9¥6j¯:¢]µ2B ÅÔ6ígãõÓêS­Sµ¢“n¶!€ÍWD¼Â©žCõwäÉYq‰"¼©y‰’9¬²YC¥?‚ÝÆúJ&tmšçVYG±VíU'OË®« n‰úVò¼~°}ž?è]°ÊNûڍC€KzR´–è?ÕµçdØô ÃCó”+£t´Hs£<¯ÒKJóÜ?H8Gé*sJmՅ #›a¤U&\•1\Þ¨ÌiQ?®>ÖºUk:éèwf,pT7“ GþìŽólfÞيvÇ15'8²*ÜVPÜ!PïPè’rÄ;°é)Óâm÷I„¢|6ˆy‡€ +YÊ1ï3õ¼VÐ;ž ÉHz§¹%α¡Þ)1ê¯ÂÞÁtò…½£d9 ŒëtˆÎWÇ?¨Ð­¡ïІ‚*A +4ç©x­ãѝòÜÇ'C÷ AÛ»º*¥6ê +•‘Ë@e­.ikʔk£•âòcŠ¡λU«Úöó²êÿYpðtÏMŽwmdETÈ9–˜¬¥¥!ӝbC°wȽUåkÒÞt²üóv]]ÙÌÑ­Ñܛ­ýãü9ÿ|¯kÛώÛÁx!ÈZ5·Hœ,r—¼ŠPK@”ÐØGóy¸ðÕ)¶M„áÄyì °–—®®J¨m:Ë"&=€ÙZMX[q雬ë·ùƒþý^ÙIG¿CۇC­±±ˆ0_EP˜£±²†`÷¤@Æg±P–º(Ó@÷#¸ƒG@FZò4µð§˜h¤ñí¹Šü‡ÄnùJYƕêddr[ÈÔ#@¹Sõ “mºG ÀÕ¯ªHÿc"(…6Ê ó…¿êd‘ƒ†©”%Ё%à“œ,J =XÁÿS6ÀD£T‹† ]F¯ˆ‘®APanAÍí{k\#j˜«Aðx„lÞs*ºPJ:5¦ '@$ˆ P{ 0šÔ0TßÔt‚&‹À<ŒãXZ˜Îä;ª’•Å @»ŸK'€ÓŒqºzO-Ñ@ÙvòrC•—r;Ÿ=_ºPJðõBt{̺šœbMڛN«>]ë(lêÃœb¯Öokú÷{eێvJCEÏÇG"­à~'{v}8%õ2 Á^$vXZ«F±W Üß=h]eNY·êdÿ<¯Ì»°ík7I¥”£›ÐY˜°.Êøj ⼂÷â<‹ ÿö`h•5Šµú¼.A#f«i• Ö½ÖªQŒøçùƒÞ…ZÙI_ß#4–°5$®Æ 8"Îç‘kHœ‡8$Îcç»5$Σçᎉóø5&Î犫!kLœÇ8&ΣçÀ5&®† 8$Î 珬qî@ôNx4#âºp‚çñŽˆkç+DœG8$®F8"ÎC +V€8)¨x¸Tàp¸V°FÃÕ¸‡ÃÕÀGÃÕЂ5®Æ8®8®F¬‘p^àP8/p(œ¬ p`àP80hî÷c°†ÂÕ GÂy”#á<Ì`„ó8GÂy #áNw燭áñ×H¸Žlð5‡ö;À­F¬p(О«±­®FéiÙl^™£Üj£k4œ\÷œw ÖuÒÓõù@pþ ב ÃVaþåæÁ+0œÇ ´Ç,ª «È)=2­#„­Õe(·Öd†óó§üÓ½¢m/é¬ÍÝ ;Ÿ0j_r2¬Y´Tô“–jé)#3ŠYp L¹PXXs_—S¬Ñf˜P²l²‰ö¯ÌD„®Õ^hh_WŸk¨uô´Û Ÿ¤¹oSoQS QW@#x¹!œ›ÈFI'nª·ˆtō=¦™ùƒ8;çÐWækõyµ9hDpWY‚úVb¯úçùƒÞ¯lÛ×~T?Ag…»rȪ¾¤¼Ti¶‘aNcZàïqœwO" 8¬ÓäjŠiî*kk՘~%/¡æ]«L(y¡×»¶Z)Öjý¼ö`íB«lÛ׎[Åb² (lž—2FÙPvKJ–Üe„°¥÷u-bħLýƒ}eN±Výðsr™ Z¬•ÁfWº6õg{­~Z}¨ë“U³íåçڛÛdnTH£Óˆšz¹!ñE3íf•‰yÑd R÷ÒQÚ›ÇՃâ£#]u2d¼Ë€a¨¬—F’J0•0àV´Ü?‡m7.}]N±6]›42œ5€j´ÊÀv,]£F°7ýãü¹úý^Õ¦›ßÍ¥¡g Þ$âC.Äv2ÌZI…45)"×’(㌠sÐÅúÆìʱp0cS«Ì)Öª¿jäI™E«L(¢Ç®ÕJñ¹ÐÏkz¼²m_?Û! ÌRP‡_Àï_®©¥¦†˜ÍhÉ ©¨e\ûÐ(&ŒÄšmÑá ™ ºÊœbº½GÉ2t̏×*› ™j­VÊóú½úyíAëA«kÓÑ6‚Ÿ3Bî=oŸÑ¿Yjj·´7­*²[º=ä±4`7h<«W¸î‚X•ÒPÝ°@Ì@b îŒÉ¡ÙµÇt˶¦‘¤Y;3vD÷Œ´„x÷€îÄtÙ±á¹a¬¥S¹Â¹á!ún…æ†|¨ø-ˆv‘¸ÌÐ°Ü È|*œ=”[Úӈ†ŠäžMGq ÷ Üì$=Ž;­–ã΋lꊛ’6˜Þ +Ä S²¡Æ Ä=*Ðrl nb€`±\ƒ¸šËËF_#„9ÊæÃ}2ó'6Ï8ñp=‚»QͨŽ„›¹t¸lÄӇüv†{ƧJÍò‰Åҝ²¢Fè¡ÔjëV‘¡²[{=z»}V}Ì?Ü*:éß{@Ÿ†Pet°aÝvr…n/È¢#?Wä6|ü¹nÃà nTqÛÂàåÜL ¶Í|@d= +>*2µm̱ØØÈd[¶üÂШJ HØÁ°εÅj‡ž44€ö°Af ’ ´4W‘=AÝÙⱡ½7,öd_RÖȇeRek"&ÅöW"ÒñO!6v´ZVlCpl|{ LÆw ½ÆJÍqiÈk4Ày©Àk¬8F¯€×¹;0Ü5ˆ–¤ +»fŠâ”6¨ka>id&c]ÃpÍÇ*æºd#¬ ×#ó@­ªë¶8+äút¹žpð®ˆéZ!®ÕPÒL&Ձ«s5“­ÐÖXÁ”úü1Ä s«§zès£DºUd(êÖ^¶ö¯2bûl«ç¤w­ÿ0ô¥”6@ëF­Ðh³ª;xA y‹±!—‘5 b-çóÜWã„5ÀºR+$ºVä¨ikn ®¶oªÄöÑVÍIßZ·ã±;ˆó˵B¡±qù§£¥C´d™+T5lscéžÂÁÑË멄¾¹Q ]ë1 ´7Öéý“êCޓZɶk­×H¿Åd+(u£ø:ö°i€~R˜V"Y ¦?Õ«Ó*rBgnTƒ=·Š ÝÚëÔí³êcþáµ¢mÿZ×a‡‚Ÿ~ž®ÄŠv–ý¢y8+ Æ1æW]§…ñih¬?&¢Ð: ¶VæF5¨³Wd`ho®‡LûGՇjOj%›ž]rðÁÃ?1—ø +RÙȉ@ߑrYEJÊ9^r‰D%\ì㜵 [7sÃ[MNXaZ1^Q…Iz{+8eû®Jnß^«:íäw£Ó|R֏‹’†Ý~}÷ìÜ8Çû—Ou÷æùÝ«wOÿÛݟ¬ö¸ûÑO_½;ó8þzöÛwځŸ½~Þ½”.½ô«7w¸¿ûãÓ_¿þãÛÚÏ™h%—¾‹wòüýÝý׿wyh곯¿y*czûæõ«÷?ü³»ß½{üÓéêýÝÛéèáõ ï¨ÕÍwôŸï¿z÷û‹3{óDïvºyõ•½üäìeOÿõþw¸ê‰SÍc´,â|â*DYè”U=•1˜–¬­nz2¸ù‡ÞøT›¬ 4üÖª]½°ÉÉþ?ëë8O]Wñ½ó‰r9OfG¸H ZN§A/ïžêåÝq<'iÌ6rGFÏ>*ÂZ5 ˆ|3€Û×H`OIp´”’¨à Ü«/Õ4¼D® 렒ШáÕrTÈÀj‚žÝ;#¹Lr¼‹jFgÈt~ïD†©’ޝa±ë9Ž#„‰©a@(ô …à_H *9jq€C§„ò¢„0µÞéMA¹hko×ó—2|r.kßäT_R`N‹…#0+Rr0ÏnПg恞iVû֓ã<ê‹!.JIœ•„œÚ„±Ñ`ؽšP³P9< ÐSÀ璅ÇeU6cœëì!%}G^–4Øý@ò*_Ãñ[bby¼ÖÈî5k†Y<6AšH +S×,q¢iåà¡ólñç D†“’f⬒‰ÆYÍÀ³šº‰©}Ýۤݛ°y´A‚,ÂLR,¨ .¤öj¤&<âÞ¼h¦ô™¹!¨,ÖêB !n¼5Uµˆ ¬Þ4ô)« }à`Œ¼āN¸@bҏ‹4Zed€ýc˜-Žf6v` Ý®® >sÐ¥h i‰˜fåFÏ!Ñè)·é‚´¶<Áb,”¤?rkÛ<¤Ìþ±À†ÁL|¬ŒE…:QDŒkIIÁ¯‚(0WÑÀj 3b¿׆(©ñ}¸'‹†µóàoFd›áýšÚ/ ŠîÔÈÌ~0òaí!#ê책ƒîò&8b Ôp»Lê~°‡9u)Ÿsš´vxåˆÔJ‘ãfý9º[^Θ1žðd.òuK´èGIDa¦¥N!3E`”ÐXƒ¹ô´0݊…Ìýx’:ÞIÆ%S_À2qoÛhÉ;@˜Ç.ŒŒƒjVLS–jYqšcÒa&˜ÞÓy0i&§C°à‡Héœá_pË BuìÀ:4Ö*ö@óJѧ`)ҋÌŒA®Î#R˜Ýs Ì,Ln«Ÿ­·=!•½ˆSÚ9X]&£b[`bdÄ1¼Q5cÑlãóÜîHÚ ¬uËðŒËÆ/N$È+#e£ÂøpOo—Õ`âE©€èòôŸ˜j×h‚Ù¼]2FEŸ™¸ŒTò |&OÀ-6*¿¶÷„éœEÅNKøZbïÚ©r€ ŸJx^Õ=wëc¸ç{1Y""¤Žv+,C}mÎ8Ký¢ä!Á‹6[BþcB‡0œ@ÉƁÇÞâì 3nê~.:ƒ.Ҋ^‘p›GbT{h,òÊ Ù¬jù"’"D…áÙg}>¢šgf'¢×ʔAï ~â Ù6Ìa”õ=j:B Wå{˜¥õ¬´îÉgÉÉ –2`†@X„×Ñ:¯LgR.‚ ^r'èéƄ¨”Ôô¶ð¶b&Û’rá™J¿Š¿Ç¯Ÿ—ڝIA’åOHð=ƒ04y=ëCfçd)š‚¬q\Á” +Øà SќX‡*æs´ÓX“S1•¦ºPÉä"C!x[#Þí=9û0¸Ô'‚¡O‘| y¼%)ã £šbŸ»Q$“« yÑÄ\SÐ-E@ЬÒ#ÕAU'O V|À‹‰ÿ_ô=œ8yÐî›u+ð Ps0xŒÖ¦cĹgsˆX¢ž¡½VÙ¾²01\] xA[“ýÍSÐA"â#[*5nsèeI^%‹·½pǀOàäT˜çcM†ŒpsoZž„F›jæïãNCê¨æóF „<oÁƊõª ‰†£3jÎÂÜ× ÒMNKƒ~.Œ¸ø^rŽE2£ x5ø”¦ˆœ3RÑË8híÂhxá5f©ÿão\s²pP¹A‘„R–Ê’[Ÿö bʁ¢fæ3>5‘01 ꑇ„⣉Ä`wXÈPM1Ç3HYâ”xÛ~;µ˜Éx‹™7†`©#VNÅ6ýÙ´‰Wþ©9Õм‘ÇãîŒ +ÛÕx¦¸•Ê#ÔCIueFƒ¹ÙÔ!‡^$U}ž¢\fÀ@â¤5°2 Ž2 +&ÅáÔ¶…ªG}:ˆ°ÄK&¿àðù{Hȁʠ6ðgDœ`R4ƒô½:¨cbH±Ažåa6”pd®tÕ®h2ÂNdÊÑP—Ød< )Rl…M º0‰;Œšr¼9ì;d„-g®Fñ¢ž!Әé¹Öæeˆÿ(¤`IÂ,+ +)–=N#bÿº 4h€ÄÛÊùñÔâÔô 0Q!nwî4̺j¹Êt£pcÒ¨€û Ö^*Ž–Ç '³²rpOÄ癅 «0.L¨™V|mŠ²EQ«pm`É#†¯ âÂíPK{’…¯  ß8hS5—`яÌQO¾a,ZÅ$K™«GY_µ˜5±Q† |ã*•Š<Â4Qàœšôê%NÇ_‹HÚԅËj*¡lùì@`nÅlLLEVåÌ_ÓãÑ 0¡/Ö/’›r(q<ÎXêY…­çÕ4N¸RQ 2 8`«T?SòœT‡ôÓUw%ò|YªChxˆT®i°œëÏ®ñ:y*…œFrv¨oYFH]ò€ÊJLjv€*Vx /5ÅFðîàHс'×Ý +€ºÄ¨Eæ’O¼±V{Œ"7¡Ó/ó|U=ÙxÄr¨ÿH&­9ûíIÑ4ÙÍSéì‡ ÏiÔ$¨3Æ ”õee€:@‰¼Ú”Á¯èŒp ¦eý*¯VÐ6J4Ê¢yF¢o¶±ÄšÄ.®H ½q“yÀjçl¦~žÚÕPT²ÇIO}%Òû©Áдœ!mv ¦`]Ú(8 ¯(`7†´9ŽzÑÆ8LzòÑi¯b:F«1ñŽl1;€i¢&%–É͹kt5ƒ/¹>ž£™Y¿ñ—ˆô Iq©”WíU`ú“M²fw +¦GðhÆԁùMvõϔZjØ`Š‘ÙIӁN¼Æ‰ô1ÞȽ^:+Âõ^‘QŦrƒBi¨úT˜vT Ñ>ó5M-9*Ë @OÒ¢¸}]õȶ•s‡ÓçJ™«€•…¬¯ +ÿÓðIZ IYüF{ªoQNêØ`¾¤hN´ AÃYÍ#np›,ëû8Ò ¹XøçˆõnQÜÎÆY½.Ï«ÍMÙä¨P)Ô)E !®.e´<´„ú›± J¦UNI}ÎY-\5 (ÜÍ¥rщ†jl-F>2z!> ÷ÌþËóû‚˜-[n[^™É[0ýÑuYÛ¸eÎnیƒ;`FF ÍXc!Ïj\¯Jmz`â„.õ¦Éì‹Å¼.&kñ¸ÏÉ(lrýâGÜ25}ªe ó:O4}'b·Kf>CTЮbÀŽ† –N(Áj`†©Ž6]šÖš¯p°ð¤€ÕÌwa¾bû¹DÞ¿øƘ@(ƒ˜ÉªQ íÌ¥^ÚUáks[=ðAÀ»$K!2jØÅötZ&u×0µ¬öÉÃÀ´†AÍNX×Tš^Ù¹08—&!BåœíÁÿk¨ã¨Á¾3ÎñÅô6`•Eú„\Ó‘ +S¼iÐ&Y‘Ý´æ¨1Â4¼“0vûŠajLîÑÙ¿'Þޙˆ´.6:-¼ê¦áü@¢¨ô6wLÇÏ°3ê†Sås°¢†dGîù ½Ÿ22®¢uà%M¶Ë¢pþȏÅï§Ð½U¢]AŽ” Ð|“Ck ’3Jù‘ Û«±!^á²£…AW"Š”«z»'Ec} &‘”:2A”¥HÙÛ©xsÁ<í ˆ"!ðØ:Y·ATaŽÍÁªQ}Qö~=qÍO™‰ØàŸx¡Å|Ü€ߖ ˜|Tt„˜¹ô ržŠÉKPgnúä&Pù1Á'ƒÜ[C¦§Œž*‚ÐûE­êí-L3ü¸ÃLE4/ ´Ÿ¡úXTÚ¨X Äð˜Ńò 4èØÏ6‚Auö¤"éE(êÝrîLKx%F»ÃQ…+. +øä¹MãÒü¬ b¸AK渟᥁ãN}bÜ55ô¯!A.L½“=E^“ŠàddÖXôµÎ]pÛ,<‹®5¦†„ #*!>¹¨¢Í1¢–`¦ ÄjM!Ÿ Ÿèu’'+Ð<Ù/ï5‡Ôå±*nªÍ j{ +“"Ë@ Ä‰Qq‰#‰ôäó5ø®˜ +"k´'M` ,Ýk<Öa^×ô9ƒ"˜šM„qÕvNâÇ+œªà"/¼›JýMZÎ8ô\÷þރ³Œ^)ZšL͂DÅ߃¯"ėÔe̤1.Ö0«·›"î5PTÓ¢'¬övýl=²fRíªdäŒ}E‰ª¥µg^đ{(²;t4 Î †ŠÑT~MWº–7«,u¥cÑÒ¤ÖÇIÉRÑäWT©XlL‡vì ú–ùó°Õù3¼ <Ý-¾†©Á3ð)Úʐ¢Žö?ÈÄ8 µçp°f³cû¤ºóÈkèi¦v\;¹»F‰‹©?Q^] +=¬Œ…ÚÙ2¨{{J:CP3RžL‚\Ît,g5 ºVC/˜ZÝð#Á´aÂÑ;ÖxÈÜyN5qÑ¢uQ¨+ 3ë!@ïìù»t n5ER©¶ ¤Qᤖy…'6¤3ðÇ{W2Ý°êÛfz9}ŠSÇ+‚ Äc”¿Ä„Yo˜Ò@G^˜ix2e‹˜)œ£xbrqvÍ0dsÈ Œ®ì¦hØþpÕo%¸¶È{“ã’Ó +Á3éVÑ| •5u0ÛAd–;¶’ÀÓ"èHûkt`ar u4Ç} `ƒ«‰€‚ÿmvÑ ïAL@¨¾ž™5ñˆ2Êf9ÄÖR´ºfþÙ̒Øæ<ñ²É…`ÿŅ¨<é`'6¨ŽC?r0¦íõ$¸G,gJ‘pÓ^E¥ «Sü32ey1è~Ó¾ñ¾tìæ¤üq< +àvŸ-ðŸ~t ìF¿òTˆ$€Úї·ËvF}@âó×PµXòv¦/˜ƒ9å@€ÐM䧋±)++·í!‡iËy°GGLp¿[÷Šâ% ÞP—¨Ð@d;  $1bïpe“æəGƒXƒ°(AQ9sPÔ<ª¬kïµ\#]=¯H#61-«÷ȶXsÃmÎÊDÙä>R-H’É(9«‰&;Te‚í¥zàœÕÒ9z†`‚©œޜ\'5 Mõ?ÎŒ3…)ˆò¬§ô~o|&xç¬ê?~¦zà€O²"³‡vŸØ`Êþ`·æ¢Bxƒ^FûBZÔÐa¢¦92f³`êe†96ˆ±$¼y¢"LŒ‡%e1`.ôàá/´„Å à ¸y<¹¢"„@ Î€zÊàɪØÚÜ®:Dº|±Ñ?Pý +0_U•š,xûÑ}ã˜3%Sä:$Z½úO =ÂÆC ,-»¢.Ÿjeg*à¹Až‘î8 †{'m&uΆ40àt˜K•±ßtf"} ò€š‚Z%±ppß Ì¥Y4¼®YCrô~6X›xù­úüh–^¸dfwàú3׉JÑt). ½Ñ&`u„5ÖGñZ&¨¬ üÌp"&6{ݹp³| €ñ(sÿÃݏ~óîÍý«¯w?Øﯟ?ÿöå¯_¿{†‡·qfõ’ˆÑ,ª4¼¬dÅ)ŒC•µ²e˜  MBïY:xMpÑnc§U‚”ÙÚ ’–”ÁÂ~è`k>H½ô‰YïÇvӄS΁‘ê_¥˜È1+¦=ÍdéXTï2?ج¡_‡úžêœˆœ#¡æ5֋Þ3*RîÀ0¹Æ6 +c8¨À¦`Ž!W3æhñ͛ƒ¬ ìC +c~r5Dr,×÷4‚«(‡À÷SªG”0 û¨yp‰y +•Eàpeí\²É¤;®;ë¥ç ©–‰Îlå Œ6·Äêà½S{þxfUŒúÑÕ0cIBæÏ<­wA$”¤ö/¦œ†%WÛ6˜ø.³†1,*0^FÀ &jãäu  „x¹9†'>T]ä=\/e÷Aý0xÀÏ>*½ØõÉðìY½Œ³å`±»Lé6ãYwpxFôø`²à4)~MÃã³9fæ‚ p³ú{³œŒ;fÝÀ:¦^´Ð®"cP¦3½I&-œ˜ƒñKˆˆIÃcœKú?”§Q¨wm‘8ûx7Aّt=Ötïl'¹½1Ví…86!d€yÅLVR1¬ŽĬwE< e…Œœ +X݄Xjþ£yZh\æöN\xéDšP_2¤–®ÍØI;§ُ&jȨpÏdç.®ˆr(0´Î»ü?”áR÷&d:h†š´^T˜tj—¦!……°†ó€ܲ(ß+Âsádž½½¢X $ê¢ÑƒiF +áÓ +âCºfT„<üC5<Ñã'¬Ò6U|&Ö)´X€x9Lç%ê‚Õæb°æ¢ÂŸA(üª¨¼†81 G4 ¨˜qh’‚'²!ƒaQŒ½gԒÔ?0Ñ'!Õ=€m Ë®Å/1&®y¼FŠ!—*,üÎeCGÈaôýç: \óÈÈ<šìè¿Ë*éµH®ù¢øÌ":%§cҁ {˜³Æ¹°Õa:‡o·n®q„‡d¨†H,Ø íæ‡:ÕÂ?0ªý¤oéÎ!ƒ\ÔÛîÃîŠzæÙ $ÌŒ§Ti˜ñS²_ðšÇ˜OT¤2?€NTü (õd挧ÒzbÛ6k8šSŠÕŸ qe"(F ˜úP4åHS-0׊d¢Â~ ÆQFÅeð³ñzGÜÂ38d ã]@]X£û˜3õ‰#LÊ"¹y I‘`™š‰8ZlL +&†^ò‘ÖbÄ *oµø!ÖXfõwO +F,ºZHa?CQû)ØO½ÇÈ:·è5ÙDÚSÎÁq£w"¦QO{‡–þpBG‰a¸7¾•óˆñš½o¯ÔyרžbÖ甕âMb‘ÆØâ“Ì™‚UÒ=/‹õM5%ÒHJgŽËêp)K,š´vžÔá>ªâ0Uh„…vø9K&Î[9ôšÉYU ¿]Ã֍Ќk +ï·Çp%3sš;H&ãèKé;<[è.–à¨.~]Š'òùçW7Àð)ó’zÖ;‚n!3̬wU˜PÆë‚ô‹*¶©žX#ÐÚ`.}³ð ´UtìNU=üÚ˜¶xo°¨ÐJ.hÌRBÁ‚š""´÷hkï™VU«WýDMfdsŒbP-˜¨Oú51zr¡¼¥&9ípó¼ŸFý÷ð{ÀŽZ`meº6§s.ic \ðIƒç¾¤(p·k%]Ձ:•‡”¤êU°´~ºeMÛhEÃ텥ovñÄóC“y@·i_Yo1ÚµµúθÀüï´µ ¯Xð b{W‚"Aí­¢&àÅÂ$ÁNN œ4@{àD›‡¿fKd®H Ӝ7@ŠF³Ñ.meމ¼ óÐUÝïgúÔ°x4}Â-ÈL螬…‰É"gE¬F³q!7klq0ÆÁ¦ôåpe þÀ¢ëzB%ÛU=À3´×í‚xÒ9›áŽ±š–Wö¶q¹^ÆV-kˆR$Æ5)4ˆ„È«%Õ.ëïéúO͗M}`¬ü‰¦10ÛY×|³¬qVsMç1©¹h´`-æ™ã}Ÿj±5Ceԕ?M:Ý¥ ÷€0ªE}Ð =M½!¯-J-ÉõKj ª3N@Íc *­\“ÆP‘@QқpYý4j’7S^TÑv~ü*v.‹™,VÅxõ¡NžZð0£FˆóÌèJ;´˜0uú2ýû8c@%ƚ0€@NÖcãaÒ^7ƒ#à}aÒ>y|¨Vßl 2pïE·VFµ#{£ç=V9èçi„(Ý£´Øk1¡¦ 5zzPk(“¨€‡ã¶ËaèR«pèC ͟Mh ¦Òñ ø3€õÌí¶ÉQÔ°XDölá* epf›Ap™Ÿ6th¼çô¤½£ÌßÈHyì¤ †YÀ&Ïܘd£&ÃáÎKöÌ#Ö`²ÈUÛå³b˜fœ8+`%uó2YÈÉÂ`ý5"ÏAÕ𣙹’zäø#ŽËdé5ì­¬á*É@ЌF"ð£fð‰–Á"Xò›ºI.£FÝð)[4Þòž;3ö¦Ü›ùáӁãEN „C»@€o7«õ)‹&ƒ§Üš#3CŽÂiöHâ ¡ö±^–>òâ+xÔ…ËM¡¯Af³È<æÜi¨Œ`ö'‡m $Ð²\£aMtø¹kÎnÕìH³/" +g³:µÍõ\\jNP3?ÀaÄ¨‡w¨±½3#€tr‹ …<ÌáÏe=®zƒ¸‘Àõ=ªHãïÑ̀ÈÄha!üˆôQ&( X   8£®Gh%*&Ã(M–ŽiÒð²êsñ9gˆT4^“ì›ÑDÑð½áùýñ˜‹NÌíLv%†²öažjHôhÅ®‡-ÃØ`P§ÉÌ!Þ;½«fÑÏëïSE×0X=*ÇÄÒ7ùmÖeŽf¦)Á *'&¶B\¥óDM6‹9‹yqø"ªè›nY—–^¢‚ý´èWjß-–ÙkQX ôë6ô׈k@\Eh"Ó!ÛÔmEöï@+“Vx< ɖKO–¯cÕ‹Ê+§šl0ølÒ\v Ú˜Éó"¤ë9ª¿“‰/pÀ1ÅVîqjé1hGFí©èÐKz„Ú©%Âï=XX:%x5À¨·+ЈàGÆÐ×9k¾9vš7]‚›Î5Œ +VXsñ‘`Ž¿Á]ÎúؒmX4š¶Ý4ªéÏý…Ë«ßOaQÃò—8PÿA³·‡&,,†F-ŠI·#øX}ŒpÔãð +8ð ºdÓ5y½$F:›‡™‰–ñ›¼ÊF“ % +ïÃIE(!Öt%”¸zͨL›_ìŒ@ƒw‚•¤W%˜œWtßùcË 09„1^Ü C1sj©Y—avÅ,5Þ ¹‚ ~”©÷³ËÜA$¬bWә¯¬åØ`7HäJo(Ž|LÃáÑ^ÁÞˊ”8>½AàÅà³âi‚&÷Ôu‰„OÌÂUsò,BdŽr^Ü7iVŒ¼t@R±1WäV‹ªvÙ~¦†ÈÛ|·.&ª!-ÙGüÌ䐋EÀ¡ž–¦Ê8™x5’¹Q󁽍çâbۗÆGbe*Ö~A £ ™g̓0òó¬Y‹£r¿bç>ߋfªG·@ ÄX,¤ÜßãPƒŠÍÌH:|*b\æ¤ñ˜5…žz‹Di\U~Ä Ì¬_5zúÁ:h)Ú@Våh©Ê(nhP ã§ç쭟ƫbfsŠ!Ɛ“7Yª-R3,Í gë•÷Ôãê?ŒË­¡ŠZMVgµÍ}uß;9ëÊR,-ˆSc•`]͞¢î܏CÒPTwJÍVY)Æ(²)!þ |6Án*Š„/CWUZ‚³E =ÌêAM<×c•aÆ80³ái˜±¤¡Å‹!î‘nDqÞECàÕKq)[¼$Ÿi€ ¹³MµkM£8YXyýyì#&*mÒK ²åI‚s—ý!úšÆ:JãÔÐ2ĉ`QÁa‚!ËôÁÜT5;짹tè#j@j]4å¼eˌêÒeR"òÚXýâñ”uþ¥Œ¬'š´ÓÕð²<`;RSF‹>Œ5¥ÎY@Ü+OëbkjV‘£À ý©â§ñªfT¥¿!7ü Ó#if¢¡ä PJL¯c®†`™PˆQ³7arÆnüµCˆ€Š"³Ó…Î|—Åy˄:B”É'3Ê,4ڊM‡Ï.˜ýíÅ<ÛSÛ_MöðÓÄÇ™ñøä¾ÀYéV ±{?¯ù§Y£èjúc•™Q±Ï~upÖäǸú–5[îcÈ´@­ô©¡——P<ó1T[ÖÄÇÐÁ ÷¬ò‚Ì”‡–ö?ãkkÖcüŒÀ®UÖc¾¤"Íf¨9×ÇYÑÎË&ã1 •/ׄǰåJ ùŽfؾ]ºc`¿Ç<Û1¢EEˆ ·µNvÜS™Æ·¶í©Žc°»«LDZ&b®™Ž‘“Ÿ"IMtÍÿÿ³÷.=·$IZî¼¥ú{ƒá—ðˆ¦Ñ6M«u¸ ¡R“•Ðuԙ…ª Jüû³Þ‹™»¯o'Õ »$=©ÊÏvD¬¸º››½öØN:f¦OÀY‚°ÄI +t|z¦Ý@ǐƒ ++dÎ1Óð½LÎ1Â@VÌ1"!¨üMÊ1›9Ý}BŽ©¨÷ãb¢Lq| +š€cþ=ÞðÆ4>Ϥã0õ>'Üø´àmg£{9FC¶Ù˜F4Ú ;1'V²qhZl<ÌÿN®ñPÉÜN5ÆZ¡“i|Á­w"1Må hÌÙü|&Ϙåj¥ÌµõåÏb_ÁÏÅq×sNœ1 (ÙiÆðˆ•‚5̍Zé“e|uŞ6”1ÜëCŒl9ûçË3iO‚Œ‘ùG¦~㣢ôRÿF“^?¨ß Š1þ.×Î0Æ>,üÂÇEí Æp¶Pg±Œï¡Œhð‹ñQ£æ6ðÅ8w|!½B2\mÀ‹Y"ŒO'àŜÁÉßàŚ'Õ:ÈȤê“ðbIÞL3NxoÅHãKí>z9“]Ì¿©¼¼7ؐ”%ØŸýì»í§ñ^ÑŸì&D,¥ ú°_¹˜“8ªl6r±¬wOÀ0 4$#e‡Æ¼ ]Ì÷f‚‹éâ@fºì4ʨ;·+ ”j¶  ª–,¡EQ´2´øAùw‹¹vzù’,~n˼V^1Œø¶Wüx +Z1ÎYaÅP `V1>ƒCÇeRÒ>êqRñÓô©¨˜ï¾dqŠ1™ÂEÞ0Å Äb-”âóÑ7(ŧñ'¤ø´Z1 ŀ;à‡ƒQ ¶´v¢øtT-Å(yÆ/¡¢‰Nd!2#ÀŸ˜êùv'ž^üü•NLLW¹N<”Ÿ 41"ìHklhb–dbH§P:õKŒ|-DÁ%BîR­uÄ Ž{§#aÐE8æ.ÂÐcf_â]ÏhN ƒHÌÌ +ô•÷.ñÆ#n7GŒ°7T;¦Ãã:ññmò ̬Rí±²'¥@¿»r3êi93&ñ»ŽDŒÊȏ„!aãd RJú%kY)Ääi°¾Qy& °ãíÇNUÿ>«‰Ok[ƒ@Œ_"ñßd᳚7¶ò‡YòLJ1‹š f}És,?Vø0ŠñÛõ${Uíº[,ÊTºsƒ¡Š÷˜á“]ƒ—¿(ð۠ÀLc– +æ0þv¥%# ø›¥ª+qɐ18̯U/ æŸ+nł˜¯‚6üZy‘ú°aôíl*:¬aäÜá$j ãáNfMñh^œÍà cŒaâĘaü;ÆF>xÆ0vpÜ1|vy6Â0ŒüÈz€ÞßèÁ‡8| vi²ƒeSwt°‰vIÆ-ê“|pøÛ¨ÁôÆHh0ԛM½,U“×¹XؐÁÿbÞHb0"}L`ð#NÓÎ ¶ö;pÁ(êÉ +®Ön/rªx¨ +æF­NR0ÝúÝ|iŒJNðA21Áñ÷F c@‚ÅŒÿ•¾Ò‚®vlb¯œ¯|à0N8nҁýÊmpà‡yìžl` àÐøàrZ_ïT^¦*ÐÀW½&ø È­Ý;ß«XÖf‡Ÿ½ÖpàƒÄ¥íp`”ÃRæl`øaíJ40Ó繓”„ß`à×{ñ1¹À\·7,0Z$%©Àæ½&£+·”ŽKPÒ¹¥ °ã`àã +,RY™LàÃÀ¾@#xÓ5bV†¦+ó€1ðµá€1á`4`PX(õACµ¶³€«{x̊o¢ ¤Àßð\70ÔÎ+9ÀHv‹Ëdê© ÑJ†ãâYP€q«¥çVBIw6pÜØ!º$˜w…à’E +Q^›C©€Á1ø¿øwKWþos„-ð¿Í5îAÿEþŸ +ª¥¨ndCÌþ@€¤Y£¦¿·’áŸ` +ð/F<ÔwÓ÷D$;¯à_:ûm™÷^À¿ñ÷þM£Á¿'¦Žþ$÷÷Ý͝~0âÑŸ­Ø_5:¹Jr õCæÒsý½Äs9s‘àßí…FþÅvòø½Ô8ßîà_š‹ï£ì‘ì×ÿ–Gžõ ü ‘Æcʯ÷Äíz&÷—–»ÜoÜ_°ž„÷šû+l«©iJÐPéQÇ÷—(øv?Éýލ¼àþe{•öÆý¥™í¿‚û‹ÿ¸¯1±¿üÑÇöW´ßÖ&ö—xßÏÄþòŸŠÿi2Â*jt[ŸØ_&Áø’ö—ˆ<º û‹L•XÃÆþâ^ìÇØ_½PslØ_fèê˜Ô_bf±ê/ۏ¿‰ ý>Eńý"'¡²’•õ‹XäaUSî7u7“ô‹¿k=ß@¿7֜“ò{ÛeJÈ/³&×óÆøEýú9ÊDü26§pc>RW}CüòªëQ&㗏d6‘kŠ|nˆßG5™ü"Æ|ƒ¿øàœ•ï ªhï‹#Ð 2ݗTD”W¸o¡à ÷U`Þ© µ4¼´NÜé¾ԆÛ8ª©9÷Hº/ïôîË>‚JA÷¥1X/§hÀ +y£û*ÿÓ¯¤û*A0ßîè³Ý§ÍnA÷e• +Iƒî‹K¹¥#šp_v§¨*ÈSª…øìL÷å}aÁàŠ÷¥†ñ¾ÌÚ#Øx_˜ºØð¾°x¨Öý]6ð¾40û°â}©Ü¼Î‘x_vwÁX|_Œ&X_í|_i9Ar0ø•›±$Ô|ßR,Ù¿°rÍ€_I>µÙ¥QMZ6¾/Œô6‚ïKB„Á÷¥ ú ð‹‘\ìb~ՇA@_‚aÐ6cÐø…••Ãø-d·¶–€_0ön„_Yï' ¿<«/Mø…ôýðËX°áWe!¨iᗽa«¤“ð«fjgOÂ/úqJÂo!#STÞIø¥Ðû¹J"~K7tو_þÍ÷{EüÒÚk~¥¯Ê#6ßü¿~%/JwPI¶N +#Iø•öû¸wÂ/ý¿³jè“XMèîãu¤»íŒ_˜K3їŒ_X<}™ñKKä;'ã·dÿ #~y¬Èƒj‘Ô0xâ*g,¿œ¬éAâë/7Ä/µYœE¢­ V8j`kÂ/nÆÅÆ á"}£‹MøÅ;vŽvNÂo9½ÄÚ ¿,¢+„_ö^S¢Ø„_:ïj°~K¤á“ðKËe}<LÝþeI€qßóFøW¢œIøÅÀûšø¯ üê5¸ÇNø¥¯q~qô§ ùKÂ/ œ¸6Â/ø·+"èÆÍáW†ÑwÂ/~¼Ý üò+9Z~1y×Øø¾Ìô×H¾/Ó¤¥$¼#Ô­ìDüb¸sž“F†p? ø|Ž¶ó}a< â½µ 3<¢ûBt 's…û²+¡ÂÈ å!ý…ÑÈÛàOŒÙw\™P Óñ2œ×Ì^tffcáú’{?aƒÐ‘}ñ¼gü½b}Óf¬ïíé9x½`Øby»Q}¯SQêÜȤé`úÆß+Ò7m&ú¾Îÿ‚šÅDßûPÿхç{{Èžï}hè œ/þÆMÝh¾Ø‰ËsÓ|ok]æ{z“7–ïåGò½,’/ È l _R]{KŽ/ÿð,Ä»‘vØ(¾0⽈/þÆK _Å ù]¾×á䨾—[ÓÁ—añZv€/2{8÷à÷âD yð{¯hü°â{åm*$ŒuR ïUÂø•ÝK›(ÇÌfcÒ MîMéTo»”b‚;ÖƙÜ^äW‘¶Ì1`—6j/5¨ç5´cµ9³÷òÒrCö²÷-+pEì^'°çêýÆëåɀif\ïðª1h½D°AµÂzY톗Ӭ^ÖÄA©dTï<ÈBêÍî¥õFGñ#¿nszA÷@€˜Þ+@ïÆïBa‘wƒôBŒÆ…Nlôpá„^Ől[½¢>Á纃µÉâóÞVVlx^Ñx‰ç…ºñû ó7Œauƒó¢nâàՈ͋Õ+w¸z:þ^ɼi3˜´œAPMJâ¹`Ù°¼Y;AåŲNÍi­€ %‚+ý•Ê «Ú (&F!Êy'•—«Nÿ+•—È)6ê ?äu©¼Ü‚tÿ•Ê‹ÉŽ¡â òÂ#­â8²¬«h<üÉ‹e¼â`òòœm¥úhø·)º³`>Æ©;À î…š‡„ ÅWۙ¼ò0êL^8Ü“—6;X™¼tÓxòfòD:˜¼•ÏéÃü1™¼ Ö¡(bcòÒÊ,¢™¼ +áÕ+¼ ̱teò2îÙL0yÉÍàáÅä}ºÞ ɋKçê?¼¹ÂŒZVDØHAِ¼jŒ)O‡H^pÚ=ÇCa;EÍþ$¯âwþVµý&6"/#Xx?ƒÈËÖnAäesÉFäM×ÒD^¾5ˆ,@Ÿ‰³•È»Z«{c0D^R20xmD^ªì»€¯ÂwŠ\®$ò +RŸÈKå#µ e*¿h "/%N‘5*X’eVd]«þ—ý¦v/”UCß#]oø´ÆË(UWéä„ñ2¢2îš4ÞӍ—v´Zk€h$KOEç4|7ĵš7/C‚'ᓮŸÂ:Á6ãxÌ*eçñ"ÚÃêIãxÈzˆ ’h„µ#JãO/J¨úDñ^HÊ\%Q¼€íßmñÂֈž‘®ŸÕfýNïåïbÃðBe‡üƒ)¼ø}  •&êÁ{¹mO x/$Pë™^DrÙ¼—ƒ­Áßp1’üÝáØކß䉘ãw‡ƒ†Aß%êÚÙ»lՋлƒQàîg7ìî0?(Š~Ñ ¡Ÿ îâԛ„Oè.ûW#igæ.kÔ˝ÈÝn©×FÜ¥ ๸‹’=o ѳ¾ñv±Å'¸]¬ А*h»øNüۅ +áý`íB…ÜP v†í;g¢ˆnf÷D}i2v¡ÅÁŠ{CìˆØ]v¡áAÜ&@¹Ðø˜“7 ïÏ®|HàuOõ]öyø½³uQJO™º Ã!Á 뢪†’í¬ h~(¸º§›VAXoT]ñU÷ô¤P]œI3œ/Sȼ#ªg¤.œ— »ðYÀThjŸ38¸^®­ ÔÅ + ïmðtQU ׆Ó}Š>îÌ0]H–É×[aº0bØ –.kŠžž(]h°ì[IºkŸg‚t‡Ðƒ£‹¿ã‡’£ËÄÀaÁÖ¥ ¿¦pctQëØÕFÑEýbo“¢û¦ÝÇq䍡‹¬„^“ˆe1çC‹+zV­;C—Ö[Mì-!Ú´<ÉÐe(îíÑe«tÄ¢‹yŸa¿€èҀ8ß +ѝQЇ1ñåE—E vl]¸:ñr(cÏ +Š èf¾x£èÒCco¥k–rF +ŒîÏnž1F÷q®k§è"ä{̆aß(Þàšè±Òh'袖àp74ÕÅ=ÑâËü\ìÇdΆÏeåf“ÿMzî܀â26ÇûÏUeD¯Ë†èۅW>é¹3Ñ´âséÃSWø\®˜Xhz.#†Ã¥u“Ë¸á¸\8à€àÝTBŠ?îÈy1á¹*ºë§¤çÒ¾=—{°,Èô\^8¦ÓsóËp22ðAÏU=óõ$=—I5–V¬ô\FàÙ:ð + Þ!ÑjÐsé.ã mô\:ZÐ&=IÖa…Àø°°r£çò¬ZKx.‹mÒx.ë0Ênð\ZùµžKGÃs9Ò¡pbƒçÒ?Ĺ<†Š¯4à¹0P`¿Ñs¹;>— ôâ +|®Òð¥$?I7?—´”.ÁŽÆJ`· ~®’ Í&?—¢ T{?—†&^®ÚcŸÂ÷®ø\$øtύÏ%(ŠÆçb Þ¦ Ÿ }›Û>—y@ƜŸý< +‡l]͘IÏÍàl`^ €.ò0|Y6€.¬”QtÁ_¢]¤Œ‚Úº$Àaí]èæA—(\7‚.™H]ájΎ‚$%?—{±ìgåç–Ó¾]ðsQÌEIðsÕ~£ç2›VäSÉÈsîrÔ? !!ßßè¹°êÇLÏ-„µ'é¹4 ³ÑsaíxàAÏåf¼¦çòÈExèIÏEr’c]Ðsñ|)¬ |n6~î´ ‹Ã3¾dÜBum;@I]zj¹Yõ(ºÓ°tÓÝBPÜ$tóÅܺÌÎ>“ Ë‚käу ËôZUé×Ҋ¥]0t™\ú&ºÌ!м1tùÚcMK†.‹¹‘‚2C—ÿŠ•èÑ%^ ®t@t™,T÷ÕXÀ#4„¯pèÕx)J.}*jg]~\Îs¯D:½Ctñç@z1 º0\,ÍReX™)Š. îcK‚ ‡ԗ§*•kŠ.sÀL[EÊ;V î]«®‚šk-ëNͽ15ÍTD{q?©êTÀÊ̅Æù]3s^C´3`´Õ‚¯˜ #|Àæ"x܉ËE=f덖 =ºÒR‚åâoe¤ËÅߨ3ÛX¹¤£ÓžQ¹PÜãõɳs“ò”Ë| .`ƒsïxÜf½DÒq!G7kB`@ˆa‡ãŠ+ظÍÍ ’ÛšTY;·=ÔÉŒ‹$-¢êñÆ Î6+·?֘ŠËPÛÓŠ‹ ×È+q>‰¸¨ºÑü,%Í°`lãáÂHÁ”q¸Ø‰bhÓpKyvîi±V°pO7& îÑB…^†Ñ{ƒp!á@@,8¸ð(ñqn\„]™k3:ƒg2pQ#‹5ó†ÀEž¾öàâO8‚‹}ðnü[ÈtªÛܱhý:Çô[¨Êªð°~‹‹D1J°oqø9Š`eQ_¹ØE„O(K& ˜Nïwro‡‘öv¸eCPo£¶: ·Ã0…yË®­'ò6 dM¼m®êވ·P"V±0%…@㦳ïq_ ºŽò$íötk©€Ýž–`n¬[³Ô-xðւt‹_*&ߦsÞ]Vœ[ø\ðks‹Š°þ¹¥>Ú +3nÁAÁwdÄ-îÞ¯p #»¦p B&ÂöÁ·mN¼l|ÛÖÞ#d¼-þDa£Ûâ–ÀY ¸mÖIÚҌ9Øж¨b=œÊJšUŶE>ōkËâì¯è£@Pm‘4×δ­v‚i‹¿Ü ¤-þFz#ÚÖ®Å_m»_ ñlO@o8[dX\Rf{¡7`¶Ô1Üçβ=шìèYõ†¹^dlyBôa#Ù>,»/dÛrKŽí¥Þ;ÆöTx=)¶Åsª!¶·ôÒÃVu%¶7ßæI°½IÊx؂=Aø½ùµ·JL¯½¥zc×Jö“èÚËb“k«ë£vrío$Áµ–Å&·–"æwl-Ã}Rk5³$³×2ޘµˆy? ²ï-ÛC˜XK½O{Ö6y9Á«­ž½WËZè³ï´Zè@ƕ¬Z¬=ˆ' TíP­Éªöõ zORíÉXb P­Ö=½î Z‰)°Þ3¨Jwð–Òå`i°ÐIªe¶ÿ”ÕðþrˆúoÒ×øÛ{ßS//u“T á^¡Õ·*8µH¦Qºbj±²‡‹”ZTŒÃ HíézčQ‹ê‘^Ô,kƒP‹¿/ýó\}œNÁŸK„üOKNËè;ötg§¨ÂˆÐY`Uœ/›hÚ»dj–F¬½yTà –÷—ÆK€YÎø»(׍ˆ- ž(«Ú¨´ˆ cv (-ê‚>óFHæ!ѵ!iï[+ƒ@ҒÅz_ɚ©óƤEîHÇ-©kðhãï GÆ Ñ^ž‡ƒ2 *–¤‹ +RFVl¼‹"¹A¢Í¿WmƒCK|îý$†ö:%ÚØ(´Ñv¡i)$a¡å`В8§¾e‹yª˜-´—Õ9Á›Å«Þ´ÓŒ4á +)]àgGdO0Óg!Ûêm6ù³â5Å&âàßu$}–1ËãÜá³´á öìíîKÁž½ÝM|CÏ2Hڟ Ï2+^-gEfh˳qgƒ™ØÙûvc  ÎÞþ"wè,8Ãx‚9 ¤-²œÅßU!êIœ¥±´Î>X/‹Õ#ªvà¹m¸Ùgv•céa¾cl–u/åÜY³4U¥ž£¬O…¤Aš½½ÜA³·hZ‰™}bÑ”YV¦¹—ÎÔ"“&ÌW3fqN¬œ Ä,jqNÃi'b1HNj•÷KU˜ÇXù²w$7—½ì ˜l|ò\’N…—½‹î`"c¯n2܆–_…ÔÁ°"åóL®,ÕÒ×ó†•i„a¿ Ê=ârdâ®cVí¦ù:fá® w‡"üI”}Tɺe‡cÌ ”GTšº`9 +RvŔæá$ÒËN.´7¢,Å6Ü̋ ”ÛdŽHw…ØN”…Ò^uÕÊRžï¸!n-Ö0Ñl¦2‘f*ÍãÑï€#]ҝ¢ßY²§‰’EŽ ÄA’¥l‰yç•$‹Ä&V?’åÂÊ[¡¨–°Jç˜Sý‚©æ;ÀÚä^%ÄJŒ,–-ŠÉ­َ%{©óŽÃ ºr3d»å‰B]uæNFæ)²ïîÌçoî0ý=AöïFe·.æ1ê‹ù1Í C8”ë“š–GIê誅`ÎrFóvŽžðdýÄm¹Äx,HGþäȌï0¶ €íëTS«JN|XPVCá)\R‡ ÖV÷”k¡ x̄¢å6ËÍeOsߝnIûiä±jRÍ_Ì+e1$L£œÂ ¼ª;‘3ùäõ©[KÔÃÑ0q ovWìéxÚ%Oçb®Šr«Y”ÔA „‘`ieٕbÓâ: ÜÆk^HöO5ÁD üΦ X°Y*å XAþ¨C2¥¨xÄÐg°[qÊÀVâ*ù) Xí¥ÞÇXUŠ£ax±³=6hkÝ8‚ƒÚÐúšÄXögâò0¥\|©„®Õ%Q„VS– ÞÃã¿)§e‘íÜO,8‰jő ð‚…+%þ$û3Â2¢NN=Ś~’…T|èìÖu¸¹Uõòž™©‹J6ŽgWKhºÒÞÂ"U1"îw ¾ÐqB­ñ¨è,A§Ð‰¿éîhz»¶·‘ÜyŽË½ËqwÕÍìB—U‚ù½†·FKɳ…·È®œ‘‚Ea%üÉ +°Ô[O®$“Ÿ/êxðþ T^ïFc[È»júD[ÈEãr;Ž¦6×øÈ¢ä™-®vîv1|<¬ãS\ ’$"¥£i¹.mÈx3 †W–Ì敇æ'˜éSÔ $Ђ@cei2>DZ²|%<þÃ,É™´Ü£»ð×Än¦!+RD„ê!ö ¸ø…áAg7œ+$υåõÈâ܏ò ¾ÊâŸÄ‚™0-08žâ΀ŒÆñYã5Á²½gŽfv:¼ªVK´p.„æ b žvU©µrWVUÒÌì 4¶Ts\N·Ãr«7DåÆ»V¡ØØ +ˆmé°|b—à‡Ù̍ZŠ²¨˪Èxߔ@dYâÍÁ*5ŒþJŸcaf2‹`vü©sÀ$C Ôs”›ÁÒræF­'€î2ãÅ"HóH\»qzy4aqžÉ›€÷BW.Lô$d‹óv” +ï- žPWAR VÇü˜EzôZ”@#Ìw¡ +àÿòËu›Ì,nÕ鏊óqÜ÷år5ûð9—CÇ0H< ÒUlÈRªËj‰ôPÔ‚‚XØG?˜-DQà¬Aàƒ²1W­ý±–TòÓWÀ&s…ѳ¸R#è%rÜL| ¾2®´¥3I¹éíšñïÓ뻬˧¡…’R±h/»9¬3êjÅ2T$viÑõwDÆfŠQFà° Ä …AÞ.ú«'#t̄@ÀÂJ9Aè¯ÁBÿ¸‰·»Fõ+âEýº„ßy-Õ Xg0õÁ±Å~×é.¹!‚¶’YX•M1…o¸Ò¿<-FYÚáV'jbÆ.qÕÝÌXTٚ$×>áÃ/j3ñ§Giúf) ¸kNódk^:"ƒlaQ,,“ã6TU£ªèºR 6ŒdG³Š‰põ|NóWË-j_úÒ,JàÅÙ´Kªæ{4Ga^lr§ÜmD³t§`UGììÛ Yc‰î`)÷ÔrkÞòhO®Æ`l„Mìo=NʾÔÛ²öW¡@õ–šƒýq5pUK./§|çÀ¥ïùVr›®Ã¯Û à!mV33ÃÕrW]ñ‡~C՟ìt«¬ú„ÁrÎuÍ„F ]o½¢÷ºqÃI¯Ï±äû‡/[WïáÐi‡ã%Û¸zÅÚ +ï +ä,+À!í>5R©çéåPiaÒ¯j¾"•ÊÈüèÇKÞ’±Ì“M%©óÀìNôLÙ]t×¹‰—…ãû¡ w¥J 1ôùÝôރëóJ7Á¿°FëÇ^}ßFåî³¹ƒÙe¸>ï®!”i1(ÅÜØ'ĺ’²sC´SädyÅûxdKÛÕÇMi[9Ÿ¨­èö9¨%À‰"¡qò+Gú«b¼†È2dÈôaFдDp,7¹+ƒè"æ4aùÔ£¯”:‰Ü±îZ+x×ð©¢9\2‹+M‚²EÊýXæn8‰n/µhMQöBàH=}ñ–À”¾ÄåÂ|š~(­0| B݈.¼Þ]Œš ¦MÑvU"x,Q¡¬îò®Ãc&µ R JŽLy>Ï"-MeåÞ3Í.%dœ—Q´f`JZP¹‘¶øÅ?onèý,R&§E‚ïÖӄn² ùøú¹rηhx~¦—”4jÚ¬F/dI‡Ü–dïÚ9i.ä­ŽðÚÑ{¨rÂw@•/,}²zTÕÅÃ=^ÝxPLÀµ žèAa££Nåþ­" ·“{ÌrEHŒßmwÙÝçxT¤iœ>µÛ­m—,á‡:ñŒØà­Å@,‘¯'âiñ®T±sמ €±¸áXÞ/•™ÒBžjG©éî W‘î2?µ¢âCÑÃø¾½…ßF©v½Üôtœ\¶P@-ÐØ÷²X‚ê—Á[ïS'àQ°ªá'†CU0‚«âŽC¨ÇŽwä?L![`˜zyÝì”ï"YªØ5Zý1{ž»ªn. »@7¿Iô7lŽ‚§çñ^Øõƒî½SÁ/b1~; Dg"¤4A•,¥lþrθk÷/qfrŽÑóQxcè£PŠqS¸ÂÌ=µÀaå9±#ů9;OÜÕ¥#Ô/®M ø¾—Kœ¹"”D«<ë/?čhj÷“38 á!—Ìpßjµ7£¸ÀèÔkre}ú¼™º9« Šî· &>#ýÏ°v'ÇØ­¤)O¥×ñÃÒ`®ê0¼©BfˆÓíԐýB4ϋÉj®[Ť!ˆ¿El \ËÿnØ^mÖ­T|g =°"±–×KÄLm÷ŒœÂªÐ<Ü9X˜¥… +L”z5íÈç˜{Ry¿íI8¡øo4“nÖ äŽôƒ*唈Làǽ­Õ U\‡HDa9¿è:Á'Ã;Z±Ni¼*³›jK`Í¥KžEÙ'̒ +ñ*!iv i¹«,|×i™-á côG䑇žz¥ƒ†',©y©gˆZø£ìpÒNMؐ·Îÿb .™Ñ(ïéª?7œÑù (2օ¢hDDDü•@x½I–0\áðèh8 +ÉÆÎdP™| +K ˜U°ŒÚ瞔pÁÊ`!·«ü˜OðË[hɾõpÏûJŽØ¥€ôÉÏEÍeŠg+>é+´‰ˆoÈeËžÖ ŸdŪ4A;«¶A¸Æ±å¢öB0²ý•+³§t˜»÷ÜRf枬+©tՏµ“‹Ó]ÖüÁ2fÏ0B^ðði`B„„bôÛ)œá¼YRc€Ö•âœÚ“e¸|œÕwŠ;õMñ_ÆIf ’/Êa¸¸Z+å4È·9œƒåœ7̳·*Šy,…ÕoNLÅõ[{Ö|‡ØìïÇqz¢ÎÏY.Œ;|Gˆ‡*ÆPé2«!sÌsñŇ ‘ ã’ÿ¤6O@Ö<9þ¡bat×(áʉàßZ"Ò0º;!— wÑ|7m'´ Žu_ڐqíÊFŠwµ¥._áq¼Wµ<Îèt5‹f²ï´0BÇ©²q?Q;ê(¡ã·$…÷㱟ÅŕTNŠN•H2°ZýE‹[}[ʏÐn3û‘€kFOëvÝF¥¬¹jCöŸá6ì*€ 3æ¡^OƒF ‡¡&h]Ü/Ïið(ñ›3wÔÌÀU œ³ ~îÒÞ!„E5m°¤˜f}œ·D<•‚ô¦cåoÒƒänää Q:ZUâUí®í©D +à~#ìÄÁC^1fýû½UOƒý9‚#Ë£0ËhÕ Ý¤{â±ôÅ4ž%3FígùÍ.1† pºzï3Cá*©3` +%‚}½Êøtµù<Øm/ë ®Ö7‚ùf³G¥—0"ÄszØDé¾G)…¹'+Z0ÀózÎ3)”~•Á¼G£Û»Z+ +³[Œ 9—É8 ±ƒì)ÃÈ|Â}¬<5!ÜB +£ Ò'uíª˜†¡ßn¾G³:þV±}9Ï5¼À†e­9¨Ê~3#wš£0 uµF±>‰–ù«§!HZjRêá“D˜ʎeÃ#/Ü^;¦ß`¶ +~ V3•]èakúÇR"qÞ5ôÉ®ÄC(õ(À˜{¯ ýrÀ©|¾>uÀ5Ú&TF~á³r;[ø€…ƒ\îªy¨Vâ 7 «äLÐ/ý辔X–˜ +z®Ì_o¶–¬ø:”b§AX$Ká BÀðÅ5T*é½HtÇÐ#çŒbþ÷åî=°pÎã&×õÌ=j™«M8g(ë:ÔvDöp,K&ìê>TM3jò°%¹ ‚ óEwyŽ= ·ŠS Ÿ¹Þ“‰CêAáˆHÆ9"Ð+õ^=nÐ£ï– =•–Bôgr’Á,)!ŠÒ¨1¦úÁ"8äJéOÀ, þpͅÒp­Ï ™Kcø8ôD½ëi¥4öŒsöë@¿¢l·I!a°Ïe¾çÜîÁà% +‹úÓBPI ^Z ÓÅÄG€%ùD‹8Q¯iðÍmNÌí\÷‚g§ÂÁ´04Ÿø…iîžO—óö…SÙó^ÕʵVYë"äÁW\8cÞ¾û糆™nwfFèzx;I±ÀU"ªû¶U–ŒÒß ç2ødh3ñŒ¹ @ò ŒÀ4L¸¹zR89u.Šø->_–¤Q[À z¢ÄiÁÚ¨*†!…ÊP;4E˜6ÊeÞsa bBZÙ(ZÛ)÷ F +ӟäª5®*¡p¬žÈ*ô&e\ +i1:Ìäž +Ù1t}Ç·N +e\&¤ö¶Uý䡆ZLq0zùàºk~+‡Ã@ šLG¦`Æä‹bu°´uW76hêDÐ4%iÐZ…°Y¥˚`îPԛ£iläÍ(YÉÙG» +ÅÅ·/Õ ˜½¡´P»cE;{Å$ˆ§çP–’xœsü€…µïã™ÔŸ3÷ÑöéZ°4'`ôò®Ç*ËýuSöM¯—Þ¥Ý臔e@ ƒ®”Y®SvÔT©xÞ_ÂW)o1#;-Rºûèä†O nH7»¬â¡þ…x®sŽbâ±@î§Ñ¨¹•R3g㉬NÌü¹g3~W¬†ÇÎ)¹½ŒQ¢Ó·Éq +úyù¹\öbK‰þM«¡ºãCFl~¬ReߙÇagf³€n¡ð‚e¼Q‡iàTƒa®oGQ‹.‰uB%θl¹ ‡ÈˆÂÀ¶Î%Ãò3ƒmú"ÛR ïÎ,¨ÿa(˜A¡R‰ +Œ\ìXRsMÿ|OFæI%£dm2Êë¤Zê±’äÝfx™ŽXq ܳ]âifΛ•ý 3y0´(xZ \`ð>=h¸“T÷4½[4°¡zŠâØáï´@¡Ÿù£‡»Sõ#:F*AP¬þ>øbŸÓOûcr™åTd{Ƚþ1ÍT0ŒaƒŸÇ°ª¨9ÌÉaÉ¥.±SÏÒÇ.®¢Fà:µÄÓ;®NöÜt›&NŽsÉ ì}DŁ8·pss¡s•Š;wWœ…íÖ¢œ{¶[V{FSIüU°(W¦´…b–q,±TM}¬æ.r• ÙҀœ]«A©±b|浆O™õÆV½ÕTžT–àžJ×qՑ¯Ó’Î\´Ð‰„ÊFqáÃ=⨻i×ÜUž`à”(3f·•æ:ZŠÅ +ŒZ—Æ6tÈÎ(ØvJoŒÏ• ÆáXKŒ€kªEh$ŒéðJ™Ð¼Gzve2ŽÓüc<Œp†‚P9°ê¥ÖÖ[H8m:©” **&¦CP·V¦ȕ 3cp„¥ßKøM‰Ãâ^¸‚¤;~’C>,W.<)Ö/Fx‹—aÁèŠ;QÍAšÂCÌ2X;B![¢!9ÅJ­òìÝáH³)*-I²kÁº äp­äÝ°ø¡¨ÿΌkuЍ¥àŒÜÕf ½fÖ2Y ±É…lŽçP×)e –dÂ0霓kÓ­`sÓa-'…£ÝéêV) „È)„Uؑ­‘zñ§ +-ñ©Ü¡Dò—C©øx(ëÊE“ŽÖÕðÎ(ƒµ°h*½¤ädRӛƒ™Siï¾NüßÑÞÃé‰2,3Oy \Â|%õ û°EAÖ ”š—îR=](4zÕC€"uX?QŽvš˜Àÿ ŒÅޙž +Ì,¿¢rœ”3]®Ø‚E]›Ð–¹§ô W´ĺBÝ]«ó—²Æ +sj̱RQ‘|ó´ +Ý"=+"ýq…W¡ŠY;¾Ô[åÞ\œqý3\kÌ:M>U5+xjËÒ fÔYÂ,%>,-RKá„(GDiCÍWpwIóyJUGáý¶«ú+óðS«; €gࣳž§Z t¹N´D’ϱÒ¯BšÉ¢Fh‹©U¹T»¯Ð +C”É'] æë² +wtL¢ÐŠ +ø&5•u¯‚‚áR7*÷Ô±dXa’:ß¡b=Ý®4߈¾[Ðô):p*:ƒU-K•êNwù‰°C»ê¥þ1•Ù^vlRæ§÷ #õ¤{31ùÁ“ø,ÎRuUÿä®, †™ëLf +ø›ØIN/ړ«â¯Uñq¹YfhÊ0ϟÂzvî…m¤R´[//»öÕì‚ I’âÂÃoวŽª›wgšâPÜdj⁞£ÈårÿÌï#»£ñº£q2>ìG»®Mâl’êRX¥¾Lf˜òô« ^Õde edg0BÔl{ê›T`¨8.ÏÇ#…™CÍt¿c¢ž¦²5q±´k–sÀה,zø7àvIÚOuLz÷[g\óc§é½°×7°"ýæ[EMOxz—–Ù´Œî*uíã“Ý~›Ú‰Ã2"¸}º€…ºnV‹³ Èô>{æDø«‡2J¼™ ±2g;6C-ÌçvÖ³æMkÃH4õ¾û;’r¦*>‚\ºh:\Lb&a@ø`…Ž›}΀ðÁpIªÏ“»ÊcK•ÓH­ýû®‡ÓªÅ¢+ZN…â]ZT\ùTÔË:¤®¼œ-Á?c†ãº‘i•°°b2”¾ØS\$å¸ê)–\1Uûø‘^*™2À>)—è,£‚ãp;DZN?d ¸ë=Êܕ<2š)a59krÀb׏6W‹qn÷…61 éêBƒzxGFcÇiŒ.)ë¡x¯ÈJi¶2O…º3Lê¸ C˞}¸â£é­Ü%. 7݄!çO.Ñ9×t|EÌ:†óu[m5æs®Ù9œ ®î4…à‹S §µìàx£<#wEM°”·‘x¾°Á5Qâ1 8Í…hæ؊:†õ®#D:Ýâ·Ë¼\Pª6ó'>8É#.ɞòÍ- `¹æ;ßܦ7I+ªêÆ¥ÔU+«õH£ËRä#¯PªˆÀɹ hÌtòQ}Je·ù·SWW¸±²H,T~¹"ÊèÃ%*öì§7UÉ*¯ª,dhcOv+q?Íå(ì ‘ŠjÉDâ[rŽKØh ;Ûb²e´7w5δ°Ð¹G Jꓰ+Ŗ°wþêma0’¸EçcE1ú½BþWõÝ×PªKw—IÕKòvu#"0§fÑ–í\8Áí¸2‚* ýhWÕ3Tö:¹(K†…Y!ú'9 ö^ƒR€GÏíxGºÒ <8%ÀšÞót1†7¦H!•ÄŒ +X sñ÷mZ¿÷ k”ÀbÝDWì"$Çj/!‚(K•U å†@kó½Í Y,(ÎÎesš“Æ+Y2*û¨žÝo.ÓxíÌlx· |ŠûìÐ +úvi%r‚¾a©^eΕQvò1°ïOQ½è¡Ý$¤ÆßY~Å/#J½®Ãz>#êƒ`á`Õ×Ñe'XÓ-Œ±”[S§"ð†ä 8Óð9^I˜]-Ò}º·ø3#ýÿ±"o–E‘› 0³ÈBîø0Úz¶g^)©h$)ߺCš…¡ x4Jé5üÞç…*çO%9nHäMX÷[ý¥¨±"ʹ֡ +’ ÉêØ W¥º…£õâÞ~TT-4I]¥Ñ)ÏR Æ#2J OâÒۂø{!e(‘Ûd_zºÂÌès¤+ènq¸xÖR¨©tö¥ðsxä2«}(ijß顶øÑ.0‹*¥Æx†Õ)/Z¨¨® 㮔–Õ¾ &hæ#ƒ„c>žÇÐ_!k…§k)%…© +´›ë„UÏ[«–jÉ +ä¼XHçäÍëƑ¥~¹m\&"öL:7•nÍ[Zfàðx3Õ;•÷¦ Ü0-hiÓ3¦;ÍÃE琩/ôZ~X|ûÅ I¸|Dq^t•Ž²+Ñ©Z‘+À d¬™Ù„êœ: lSrÍZ»ƒ5\q’n´#’q®!†•OZ×àüˆî¥:_*óY‘Q=r"ýÓ ڀ(ȱEãÜ5Z ÅoÈâœZœù£ÌHӌ¡]L—Ê2”õô¶®ÙW†(cÁ܈~.#®Já¡z€gµ^w56¯ ªŒ†ÍÍÔ%±)±¦r½è'î]ÏHVgЉ ú‰÷žh â*¯ÄâG™(쎆͘›çz[ƒ¯û˜={Ïÿ0хVÏĐEájVƒ€þ?+ÂPõÁ¸w1A–Ce nØËÆŒu‚|u-Êϕ(Ù@­Ìp"Xô„h³7kÅ»†Hf:„H# vQÜg‡›ð‡B­,ՌRÃá™áª ,‘înìÆTó̃ÿÓÕ)Ռb.e`ý¢±aüyévOŸM "SU!‹*ž¾¢O“ê^ÿ>⚠+É×¢`ô²¡Â‹žpuíDî*J<3! P" ž~¹ M…jµ¤eœñ¨¯ÚT'~QyG¹(5/ysø²ˆíþ:ðy]&=܌"¦¬Âáï538‰²Ör« ‰Z HXÈ'bSFiZDLh[} ÌÔáqëºYrˆJ`‹y¬KÙœ›ìêBÃä”긗&-. +>£¬ÉCýçx¨ªëÂ%0D•H©;¼L¹ƒè½.‹{i™œ5f\b §¾˜"–n„Í<ªb'3–z³?AUYË$<$í25†–åM*Ž~Ö\­7q}ôœèM4ç.t¥Ý½?8HPI„þ&Dq€‰P\9¯ÙÅÌ}£±ëñ#º­t¯6¹ÉÃäû­Óš{^v –¿ N@É@(Âgå2-³×Ëå®Qàݕn© A*ݹ[îÁϪíég{YáÙŽÒ‡:o+ßҁRÁ9° «LP›Emv–±Z‹ùzgӆ»käž*+…Y%lC —á|& j?q)ã=/#c  +¬QÃÉQä òU¦ ª¶°€ð3ÅGÉZVWlqÃá4Iw­6¿øq­)dT™cƒ™1‡ +œ.•YüЩ¼”·È]»·SI‹¾6è`¥Ÿd±yZcΆÍ ²FŽê–(]TZ#DÖ8vcZ´+bZª½¬{*.—áÍ#·¢„@¦;²–»²·E–®J;uÊâRí¦>xñ.?z­7^]¹×CvŒŽxë©5¶O՜ð`÷-v";ì ô%èƒÅ2̉g|‰­T˜0€¹»¹Š¿Žâüb1~‰SÞ1/tDC¯"ú+FꟘ¤/Ñ@»»îÔ>U±t EWWÎ5§47BœU/Fú2½GA›Xåö¨xœ\Êd؍ð1Ò‹¯9­ažfGêé:ÎÜ.ÐfÄW՝–s­:V ?®g¢ Qq'!1ýŽÐ¬y=’×)­E˜njᗰ¢.É ]Ãîõ¢’œü)Άµ‡ph­D=YÆ´þœƒYEÕXQòr3òPìA_–ÑãË.ìtæ=¾Ýî\µ(ŒwUõ«‰=,‡ŠõǨ¥º„…€‡ +ՕŽ¯Á¬û°”ø#,W(3u Æå‚Uæ€ù¶AFÇS Ü Ò&ñ¡±îâ—x:9¦´Z¨Ð7èí³)ZSªMó&,º° &˜ƒӔGînŠ‹R¡}YÁá7$õ@X '…„-e¿h8NUÒ^dÒ¡sfJ—˜4æ>Þ!+GãK‘‚<"7ZÒB\ZÙ|o(±î‹¼{»ã²$s­ğ#J‹¿ó;ÀÂ"z,Ó'AËÒb}»0öÈÛrŒ iáð„çą·Ú¯q¹¤´CÑ 6í-&ï ãDDw_¶c7q¼|(3ݖ=GÔêE¯°Û~„RÂ,æ:‹ýÌ[¹‰¹!S§:g_ÿ>™`šyÁœú V¿xrÍ>àݬ(zêšw¿£›̨¸ …:§*þB 9 ÏîOÄËxúð†âÝ=nÓÂ_½Êbñ®—&0cqŠÌñéjf¨âðL^èµ}\œÂÈ3©VÄT¬BÞx£9ŠkŸ“®Ï=¥@Jƒ5>‡áèÜ°»h²°Ø†ý°Ç’æ­lnºªî!,EҊx²OH3ÏLñØɊæË«·Ç«HÖ žlíQÔᱬÐÙ!Ɏ=ôĈp»ÆÓ¨Tu×hǕ{Ò€™boZÈßDÓ­,°cÝy{˹ð~˜VôT2XÌM_1†”´øJ D,[çvøjq{YnIŸ + 8Z‡ÅCÊevmnˆÙ+W„‰ÇU5ÃPíã¬icÙCﺽ÷tóMZ,CeK$—‚[ ³Y{Þ¬Æ`¯Z茀u6o“«2”|w™¡d\‘ê:«x.% —œ0÷N¼ÌcÙ[VCŒÖ(n;ï)W"‚‡ùpâ­P'¸js©AY —gQƒq1Æ0!1XÙ qۅWèïXíKœ .?¦ü qv«¹Mܤ’tÐ$Í)›sß·I$È3UÏÙþÁâY]R Ÿ%ìÔB4½ºJ÷EB®ªsœ‚#.5GWÓç?Ù»YƒK¥ô3ðé[}ÉÑCxä(Ë8¶ü ÉûÜç‚úˆû¸<ô%h8ݗõ§Tõ½¹`Ÿ¿¹“÷÷Hó¿Ò< +'v¢9¢o¬7 9ç5ñå컨ʆ3os¿A3¾_G7Ì2ù™Ë•©w“#”y´K’9–{)o sb ;jŽyu¯ìĘÃÀÁgØs¿¢Jüpø+‘å·ºâ=ñwû’s„›x €9Z ßMóÈä—Gǡėw'A_Þ­šÛéåÓjxywGÕd—ÿH¦Î†. +þX¢Ë{‹fVŽßtëvt93ž†Gs(AAUÚ&—Ÿ1%¯ärHx×v0 +†®äã¼,wèÒ8%©àŒ,h`ËQ7Î|~PË©­¨÷´œÝøÎ{2ËÑY¯¶ –ó¯±óÊi{ž‰+Ç1ê}NZùi©á+?{ÀiÌ*GXKÍ*Çâñ2ÙaBz™—îe’ʇ)ÿ **ÉÜ1åècÔ̓ÇÜ{Ù7JF9fñC¸ðé†q®?¥`›ÉÇe(¿ü™ì„ò+¨8(GÝåõx +Eî…èçGt”IÏFrѦ“å:áäW7;fc“£%Ðaê=#,¯å‹Ó’L‹…LŽe†üHޔ7²àa#yããel!IÞØPØÌ yãÁsRßHÞ´²¾ xÜzÝkO’wa5îYßHÞxßc»½ã0aZ oþ}›},0|g4ä )g Ž¡bÇÔOUeL7ùb‘äMY¨H,y“ŽÄ• äM3‘@ò擺ÆäxSdÃðÆñ¦°&Ê=˜††¤—“onÂOvãxÃÌæ×Éñ¦èöèOr¼! rãxS³¯©ËïBÎòõLŽ7ÞPU mojµ]‘ ˜ÆHŒ·@SF˜/}"³`90ސK„pƛÂgR~6Œ7Ì +æƛR9rñ–vŽÕj+ƛ{²ª&0Þ%—ñ†…Á»㍠»|@QÚeŒ=0ÞP±N|¥x³ÿr|V + ,&¸¼1Þsœ½ìo„åÚ9!ÞVX嚨`ôV䉮ïÇD³$x?VÓ'ÀÇy§w?w<]ûÌc9øݸNH;¿PÔ'á)\2½›äã¦J¦„w#êJÐÀ»¡È¹½¦é»*z%w£Á»"Ú$ßöµ’ڍ½øÞnÐn©8f7#Ž¬ef7{Ãw´1»yÑõЮʇááÝ.0æԄêߑEÙÁ¶yškáü™³»S-$J>†síÀnXYE¼nGqgáºñk*%Zh݅¢‰C%jî$üÙÀukŽq’fâºEً¶´ìlG"Å­ƒ Å®ü × ³*×M ékÆuÓP-T›¸nšYŽ¸nþDO87¦`&ӞöiÇu#°­zÕÀu³vC‚X7£ÊÛʬIëf½+}׍ + ýzàºy“TjºòºK@’×ÍíŒõ¯›ÅªSXyÝ,¡IÔ·œ„Ë%Á릅Ôč×MA-EÁëf(.؍¹KŸ°[[JÍ ì憪2¾£ ½óH;±›®W4Aì–×öfAk7w{»a•[b`7 Ãâ³üM‚†wb7#|’šØ­~,·4<"!nu»%Á$vsU¥6¤E$z¹¹ÇËÖaáP½!»e¾£`µiCó +Ù ƒè÷²›Ímˆd·Ö †xk-Ý¢ßɆìV÷GÂZŒìfo˜m˜µŠ¸åBg„KYè5L]\1Û° +Ô˜mX(lIÌ6·á!Ì6æZ…ųý˜-•”m,Ôö}…l¿.R•/Ùæ‰ñ.d›„;Ø³zN'¯= Û¤ °/A@¶ù@o·èžm>VÖf²Í÷ƒCh@¶iQŒt…l³Yh\…ìÇíC¶?zOŸÓ³úcB¶d°lƒlÓ¬ì«!ۊLÖk"µqT ò +ÙfHŒê¦€lã1û7 Ù“/ÌÆØÆ=p·Ûs™Œm}ënˆ±‚kô“Æ6-¼‚3#¤C‘۝±]‚n“ŒmX$nÆ6Klom2Û¸R‰ì±×PX¬@lÃ+t©÷ŠØž>p*+𾆬DŒŒUNb{1±Í&ÏÌ<b©Ü6Ä6‰Œb»^T:«nô sàÙÛx…­1b›C5&6bÏY » ±r=Òӂ±º5qî]’ÎîyŸv¾64rJE¯ 7œCJеñºÈ“_éÚ "q8¼6ƒHê„î1„®YWº¶¬T$¯ÍcÓVypõð²áµe‡’àkã¹3æ˜|íçúØF=Q”ë2™s##ðÚ¬/*ÂhOº6Úüô…­ !(#)ÁÖF׎[i}¼¢`0ÈÚ,_ìZÑ2—mÙW®6ÖGBÎ8èBኗ³T‹XHaƒj_n1–LíËÅk‰Ô‘ …¨†@·¨MýÇá` +\Ïá`çÎӍ1ºài! ã´ RSºz´Ùъ‚$³´qœ¤="Q»q´‡ñZYˆNÍ¢óÇ Šâ2”?[)ÚPR0Æm$ ùYC»‡poCh“1÷H‹ÈØ6 – Ý/EUv€6ô^* vàÚ~Ö>»‡b£gC£D0KÀ³!²»}žtý@vîoàl”( tanö)nP@³±°b¡íÆ̆UE`®Á‡ØŠºÀ^CŽ%úË +Ì>]‚’¼ìÓ=˜—݈ÛÜaÙÙp)XÙñÒDeCÿÂI|#eã"øsÊ>£½zp²Qc¦VW+&û @E`²Ï˜Ó‚’3jÆcÎÜ<¦G‚‘éé24›>ÑéB¼‘ §_ᇌpz|Ð ]Õ+õÖ +Á8ŽúœÑ~Ñtìg8½Ò±ad˜)àØOô46v03w4öcAH’±ç!Œ CüÜc3ÑrXuÇÐY¤B’‹ uZ«&û¾¢†±ØO`NƒŠýD~…b#Õ£—hd2 ¸OEˆµ¹x¢û·A±ifà# Ø…lâò|J(6sô¹7*6ÌÊ+›®â×Aš 6·¹]0K+çÅ†Eù­Àb—Uø[릧O,6sàt‰‹- +„ÑîK_ø‹jg,6ÏjÀ>¸š3xø¹Øp9ØàpÃb?*O(6XêDk&öcM؎Ä~<€'Á Ä~Œ^ÜyجncⰟ`ZåšÑK&A76¡$Wç†àp²«kగLÞÊÃæºBDÌÃæªî‡Í¨êp]çdZ3¶J}wà°yv­M6ýóö´¯ì©œeаi?ôŠÚ–ê²›‡ÍB•ž‡ÍK¿ˆ¨7;-{ò`6>T€‡ ¬«dgÅaÃÜÔFõ +¥¨‰Ã¦×ÎGµá°éԑ]8l€.Tù'6·à£ÛpØ<¹Ö& »®”L6«`8*¯4lZ5˜†MËp +Eaŝ†M—´º.¡i)âÊ¥¤aâʌ ‡ÍÅt3÷DãK«4Ë: *”mðè„ŸÅk¥bs)ªŒÎÄaK ú´‰ÃæÙ3ñ8lÄÆTú±á°aöOv¯žÎ(†3›+V6ÌF”‡Íít7ŒÃæÁ5b­8l®È] 6ž¼D‘æaOÃÄ^Ì&bã'´ Ð5ÃP¡s_°5-\ÂÜ°ÆDìŲ±§9ˆØ\JT`"v¾»;›éñgAb@C ±™Ô¬.GœúOšù®›YM¾M‚b31ɨÄŖ(ÿz&›¥! J›Ûpí¼Q±¥¸¾Æ¤bϾdAÅfì¾Ï7*6qªêYa*6SQlÑTl~!>X»)ŸTlx “ŠÍ˜;]lTlFœØ^-°Ø´h¢›‰"V,6ƒ:=ï;£ñµ±Øˆ+¨ÐuÃb'ÖݑQå?H³”>°ØõÕmXljQ¨¡ +.6œM7ÿ0›¢]6.6Ì\À'›>¬àbÓ¢ö‹+›G¤ (¸Ø Ǩ ý‰kumÓÎŦ/Ì´yp±ÉæcÏÀàb3ƒ¡†š+{šƒ‹Í9­ƒ‹ÍÇþ fwÞq +i½‚‹Ím¨áÚ¸Ø4ó™[¨Ã«L06‘ã ‹M'+Ћ Íǚäb37TÝ©er±#'« ¸Ø¬j~VÜ5¼ŽKmW.öcIZ³¹R RÓ°A±§ÕÜ/ô?Š®å|'?¬þëÞ÷ãü´#±ïrù”Dla”Š0ûµ²¬]@—$kŠœ`bv²s¬Gt} Œur‚b=P¸A¬Ù%§i…é,ìöÄÙ\°!¬¡Aå¤k•™ð €õi¾ÐƯ&À±?ã«Ï`‚½ú )•ùÁ®Նñ¿@Wã×J²¬ëü~: +p5|:R7‚[͌úói§V#yÂÈ_@«Á âgÌêf¹ÐŽ¬nÙÈÑÄjÔ¥pj`u‹Õ¬NäSðªaÐÄèä Œ”l¸êý‚V ºGƒ€U'¬}cU£ÂNu˜.Ij–¢›T]‡?ß T]CEœê +ŠÀTÃùפºÚIH5 âŠQ]£oꆨ~yZœ&¡ºÇûe@õÉìO}rœ\ðÔ,RÿryEIÉmQo¦éN”þ}–[b8%ñ8ÐÔZ‘‰¼¡©æe˧$Sw·BK0õåV;—út¢!±ÔÅóvP©-¡Ý¡Ô*E±“šÄ„ç§DRߤʼ©haãŒRß^Ž:bóo0j뷒E}E÷ £¨kTßí(êa`O’¨­±L5“8ԌÌD¹&>nOZ ¡ÆûQ\É7!Ô¨#š"ˆ:x¹½„ÑGÃQË¡I nv¯@]ÃOþ4 û ÞNü4êÿ†JQéQa=Ä×3ÙÓýAßØӖ¯zúdÈ¡Lò´–d½¾‘§¥q¹Ú$O#L{²B§©O=’Z-j.bCÆa`QÿÄ@OtÙ¿ý²Cókò@Owgù’< ¸OŸ5tÂ+w ±9;D§M>£,vƒNƒ BO&˜Ó@ƒ( kä4 —·˜ ¤3ÄN#LqWð¦‘8nESÅsFé±ãõÁrD5EÍ«#ј¬é»DÖ[Fâ|{›¤é§("±ƒ¦aå iÄÚu† Ì]V o˜éÇPœ¤L£â×h˜ôÝ»-˜4{џçK€L¥Ï’†Ì4Ô߆¯ì éĕG:Q˜‘¾ýõîi”ow.ÊBV¢%C†êˆýDH?á ‚4(ZGð¢+#·qãG?këL|„u1éÑÈö0µ±Á£H«n3u¨—êUŒŽ¾½ˆÝÉÑ·øvɍ~¼:Kl4 )϶S£É gÛha„ 8.9V€7LÔْÌSV;Œ·€d/# +0^«†ÝˆEÃɑn³c(½^¿±–nÔkxÛÎ!Œ:Váp÷‹Â_Ûa§q?‡Å>Oxv¹´÷áu„ÿ‚›|¡€v¯u?<;6ñÁôL8ü˺Q5òZp·³„õÀÿÂí-ǧõ‹xœÇ’‚ßcHšŽsµÃ蚶—‘²þöf´¤B×·Ø»Ðûa፽^‡ýlü~¾jÛ¹ý5¯;þi¼Ü~DÒ(ŽßV»Ï„Õ‹Byc”7#äù`;òxu|ÚK:Gû´Ÿƒßÿ̹åiÿýý‡Þè~÷j¤ÝÍPÎk©ÿ`¶½ãe>Ùjµ¼×ÝñR7 "3ªÛ~¿ßa¨°ªØN£xݵðbÜ®nڗ[1»Ü´yûS œïW¡õ÷—Æ·§<íË+‘‡]_ž÷áÿ|ÌøŽ§s‰¿ß^œû8îýgŽ¶³]ŒÛ¥Mûræa—;6Ïa¿½ø8åûÆpjëÛ <oxڗ÷!»¾9îÃ7{O5õ|Ù*…ø«ý; <m#ÛbÜF¶Å>G¶å°sd[ÎaÙð#ˆBì_¼v÷s˜öå„ça—Kûp¾QóL?ʇ[„yæhoÇÁ”ÒùÉ,¿¸·Ó[ìóZ–ÃΫ^Îa»E˜/D>·ASÀ*o;ì4îç0íË ÏÃ.—öá>ä-šwoŸÖçã^¦õùb,ÓúbܦõÅ>§õå°sZ_Îa›Öçã^7Îc=ì4îç0íË ÏÃ.—öá>|å-ÚoÑ|ÜËq拱üâbÜNo±ÏkY;¯z9‡íÍǽnœ/ÆzØiÜÏaڗž‡].íÃ}øþ£»B"Þu~pW¾y dç\o>LeåõÁ]Á ŠŒÃîÝj>µ» +6¾»+ëÆÓ™‡Æýû<áyØåÒ>އo2™Î9z¿½Ó©XÎaºËÙ.ÆíÒfއÅšwlñ¶Û»8ËÆÓýXžZßñ´/ïCv}s>܇o5™Îiz¿ÃÓ¯XNcz Ë /Æíê7fފŠš7mq¶;¼øËÆÓY\ߞò´/¯Dv}y>܇oòÏïßÒÕ>Žaß>ùæ~¹»ñHø>n ½×qíãCµ†|ÿ6m|֍ç'?;û9,öyÂó°Ë¥}¼ß~9³ßáù-/§1¿úå„ãvuËÐ1oÅ2ờ¶|žÛ^¾åeãùÕ/.oOyڗW"»¾<îÃ7^Îì·w~ÈË9ÌO~9ÛŸ]Ú2nÌû° ;óŽ-ßæv{—yÙx~òËSKãÛ#žöå}Èîo·û0}Ô<=ÉfÐæK@øuÅæu,ÆÍEYìӟY;=Ÿå67éã¹ÍHËÇÝÞVP< ­=¦·½7×|±O?~9ìôøÛÇÅÓöË:ÏãPïŸþô«=Ðû· +·oö |/±^¼x?gÝ¿|<â þ?S6¶ät‹õöëŚ3MUÑvO@’z_Î7#Fá~.3ì \ýÓvX†îúi;‡0Ι湮·­‚ß;û9,öyÂó°Ë¥}¼ßr¦Áïw¸E²†€Þç~‹q»ºi_nÅ<ìrÓæ9ìwXîM}Û¸J¥·?¸4¾=åi_^‰<ìúò|¸ßj¦a¡Ëûí=\š´¯²½½À‹q»´i_îÃ<ìrÇæ9ì··°øxÛ،ªý©¥ñíOûò>äa×7çÃ}ø–3h^<ȶg y@f9íßih®Wa¿]oFëZg¶w•Øì‡mҁîçВ>þ~ädcÉuãKáý°Ó¸ŸÃ´/'<»\ڇû°…Ä@õTßb z€ëa§q?‡i_Nxv¹´÷á+Â~‹æ“_Ž3Òò‹‹q;½Å>¯e9ìõ9|ˆê…z‹ö÷[´÷s˜öå„ça—Kûp¾É€@O¹}¼½H'$¶žÏxÏ·³]ŒÛ¥-öy–ÃîÉuŸÃ‡äú~n[rý™WÈiÇ/uµûLÆ}î£îb܆èÅ>Çóå°sä_Îa›&>žÛ·.¦kÎâû#ìÛªN¤ÓÓh'ò}‰!¯7ƒÝ^¹Ø?ÞÝ{ߗëÆsÕ0;û9,öyÂó°Ë¥}¼ß,Ø-¿z¿½s!°œÃ\2,g»·K[Öó>,˖yÇß~»½ËB`Ùx.–§–Æ·G<íËû‡]ߜ÷á»íZïwx®–Ó˜«†å„ãvuËÒcފeå2oÚâÞowxY ,ÏUÃòàÒøö”§}y%ò°ëËóá>|³`÷ˆðß}•ña|ûöÉ3ôVßÆÆéÎûÃøÀÆ+wÛdžÿÞ¾LšÞdž¹áüØç§qÿõÅ>Out¹¨wàÛö{;¿âå4æ÷¾œðbÜ®n4æ­XƜ¸eËg¹ÜÛå Π痾<¬4¾=Ùi_^ƒ<èúÂ|¸ß8ì°ßØùñ.ç0?óålãviËX1ïÃ2ÔÄýZ¾ÆåÆ.nn8?ðåI¥ñí±NûòäA×·åÃøþ3öúo~úé/üáWŸ®÷¸ëß-ôÚö4îõ“þë¨äpמ‹….«ý˛]%€µýòvœŸ³/ÇùÉçùmĹÛÉIñ<ËE F{ÀÆ×/Êx€Z.ãy<§ŒuHŸããèÞ¸·ûãmˆ_ü"õe}ýԃʃÛ¸ãdÐñ¹TÙoì,ãh(oàï¾^7ÏvødúÝòdXwë-ãõ‰Ùˆj0]#*¶d,×ásx 1ËTÚéî#®ýA¯KÝæ"dôAK_oǃÜ÷®6oú:«ËgPmz- |ãR—ýYk¢{ƒg듺ÒØÏ—å`©Ð–{€^Þ¾‚ž÷|)aރ·çð9Ñ +*d¶°9.?"0È^÷ÛöágM2Y<8 :Dì?Ò²4´íãx­5ü{(ºóûéþ¾6b‰Ì/éyîiDGmÇ·öëʍ½iÇd­ƒ2Ôùµ3˜'‡æ°|Ö¯CŒ«·89TÖيvV6µ³„ñõ½Øxð¦Ä¯ÜqjMÐNهnRTÆɈÊׯžÁßæIýöE–âáFöÑâYÕ>üdº_pðçÆý×Å~ MoïëeË1‘íý±ž¨*²1Gv{†‘ý¼%¹_Ÿóød%{ÇÆ(Z²ñŽo}`ç!Œ1αeêW¯bÞUG•xk -ý1íÇ9Â^ž¸«øœ‡åSôÑÁˆâYïq_a<‹ß¶øøü3¿8ÇKíÅûórÔFÜíYë8Ô­WÆZ†%†8ûò™÷êV±´7¾No|Œî±¢Ta€:ñ† WžGˆ‡{èÙÇÆñiã°]ßéÇs˜¾Ë%­çˆ–Ž`N=æ@¾„ýŇz-À8žÃXã“! ü«Gž÷ó§.Ûÿv»o]ÑËxæÈBϖ?¯¼'à@8Âsþ!§òŠ gŸï0;•$>}õ*ÖςΫ¦ÓGÔ!Ùï>Ž5ߗ°Ûe€ýÎWuvàA¾zäüÑv‚‡æ+ºë¯*Hȹ*¾±Pý’ö£_ËòA||ñé«GžWz‚ö•+emxu¬•›Œé°?TIÒXà$Éx¬¯w¹N¿?O=ã¯Ï*6îùÙÕ#^b*>ÿ̹­q›~½s¶y{í5Û|üþÃØx;ò¿å¢uþUÑ{??†½žš[a¿ùå“Ÿæñäelãzâs½ÂC8ÙÛw| 1¯6.WÍ[“G8êíß*#G$ôÉ0‡'*ÏQü^îrµ‘0H{ÞqØ{ÄJnðßl,q¾=6žñ¡>pÜóóK`èžž5›÷sÄU†ý?€+]—³Ç`Ä ‘Œ÷Y¿þ¨òÔ³ëk× ›·¬óçcçr¬äö ¿a,Z*Ò«x}·*ÂCúEë͞ñ7#°uô·­Pa¼çÞ7bÚЗ°;Η“¨1†ßà×lûÑxžµÎ#{eÄøßçÕFóåÒ㒱”¸²zÎý_·)LL>E9 ¢ÃßPY^/†K–3xr?ú¼¶ž=)ß±»åTð„ñµfz–-óÈõˆõO¹42á2z¼£÷ã Fg£ç=1óо¼£‡¯‘Ü;¦Vß´„Ša—˜%=ÊzÜöâ%RG$ëñyµ[·§ÃË-ñí´òÌ#¼ÖM9‘ŸÃ¿¾õx—&ls^Óϧpïë<ÂËӈ)áö2œÛŸ=îeŒÅ`¦ž±q³+°^¼:O‹GhfËA¤÷îMG“ 'ã_:sË!œ­[t'ñzêövvpŠXO¿ÃøúÊÊbÌ#G> ×ÅŵÌÙ}ðÁC>rõâwµå*N¨'|ä±|£j"Eº·‚‘Bo9_‡a?_wëºâ…×›†fwù(4÷žŸ&ü„|}Ѻï¹Ò¯»ï¸¶ RÂþè£ï3|‚‡YºóÓz®{9r¿òӊñs‡=ò.\ã^ŽÐ¯°Ÿ£yã™3à¢Ä[>#&«ÖÆ<ŒÆ2·çª o8d0bæ˹±Ì/Ã3¥Oøuß¿„½•¬™Î“±žq+JyŠ’É’_ rsjùűãUkÊ0·Çé5/_# Ç]ûå#ƒæ;âóÏù2^Âîéq8 Û>y¯yßH±qu#ÑX[I_®ðq¼vGø§ä› \ØÙŽ¢+kŽãŠ[Ó8GŽóµ†šG_cè¨Óù¼JÎҘÓ~¦«ùôÒgõgœØ^ÃEŠ +¿Ä¼ª"gêï!’²ŸãåÊ'ûhÔDԜ-´ñˆÉã¸â ol­o"£_Â>GY­°yGùʵø¹×üÆG2t„øH^óHýsPP‹ÛÅ<ó:³šã +öÏìÙsj\ÁÆg,‡âÛc¯ä¹2Ì¡Ýw­¼¼‹¸;ð¾†_åçVL4sRÆCqßóêPóSÛsÜq„#‡Ø³=w!—¸¯ˆYÍhÏqnV¾„}´x'bD¾÷Œ'ÇáÄGH/´ãšG—Ä TÏvæTãâˆøG½ôçÙ¢6' yóÜZÎo1|«IKDz`TŸ•¸oˆÐÎ#×3ŽüÈ©¨B¯69ˆÈSüæ.ÁÞ´ºƒcýĹ¡Oº½w¸Q³@¾./yŽSO¤†Ÿ€q%ýXk$®¡‰ÿüš9@ˆ®Ðáæž^ËÞ3h>n=$UwýEìr®Uît¿!—,9¹ÙW’<}ò§PÆvÄûׯŒ_㹆‰©-Írã×XG˜é®ûÉ1 m®X=ߧbèd&ÜùÝj¨«è¼¯Ôh¹ ©]ÙCæA5ϑ›Abs¥ŽDÅ<ÂyÇ[µšŒ½Üù!åz»Vÿ'Ð¯¼ig.E áBWh½ã ³ætìäWqœU`Ÿs&Þà/aoõˆ5pÉÙ¦ÁDí_i6®¾ä÷XqF1ϼ>™|"hná¢VÐ{ÒÑ&»ß)‚Ü7_7#ø‡³¯å,·¼Ü»€geM‰œ>an £P×ì0M} {ɛó9Œõ=t„>Ê‘àÈ3Yæ×gPîN¹ãˆŒKùkÉ +Í×õÇÐb°ü R‘ô#PÔϪ~ÑWØ+ÜcFóT ÑgxJ¥¨X® Ð-½Æ^$<ûÂx~É<UZ5&½ÇëÉä;¡c{jL"ìpmK¸Bæ”àiLœÞÆ]!P§$û¶*0v|ĝj`ÌÞU‡*8að"Fˁ9aüqøÎ0tÇ#nƒ† q„ñǙ¢pvŒaq2v¬Ã1”[mÕ­HBF;š”…CB1±ä×å1IªR)ŠÃNY«Â™Ê҄d?™¥Ä¸R¼Æ—Ç.—î—G¬T§=Ò۽¯WØàþŽ‘'tö#±™]\áÄ»¹\ü=ÜñCͦtvdXÁ>T* |2qÎmIƜ݅“¦¶9vHy'K!Y‚`9Ö '6ՙ +±ÎÞ3¬h<%6Êa¦¡C–‚*vérP…â³™å¡P8•ÌŲã$vg3,Ü»tp[ Y› ©; ÷Oñ¾+9Ž çÍ7è·q8|ÛÈèAۄ&s²$×`6¾©˜x!<Cäl=à&W¼àÍu®mq^=ÌnîHš§¸is‡¶/Œ‘äÓ"±d^®Ycƒ©Ñ10ë9±@Ír œ2pS8#f‰î!žï:&¥(ö|y’§WšŠØµA%ad*¹Ì"{}“J1H¨<ÉâV³¢^è Ï™‹¤(áÍmèsp(JòGì%3™PŸ#åHÏá׸±fLr>ýÄÌ*ëÞ±pÐq]Û4Û¥#ëZ²…)+²ÔlI²mFÖ©yBЩŠpä#Œ™<üx[p¤„•iÖìHä⍜žÒc:+‹ 1RíŽô¤šƒ¾"{áªC›Ò¡¼‰Ïo ÍB>³”°CÃküibX–nþX\(éüt‘ *q›Zs—#Rœº¬“CJôÁ+üÜnËgHX`¿ñ ´ñÖ,¬7É +z]Îg{b­ƒtNô(ÔdP– ¶‘í EêZ$ü±eGÎ$ÍEg–3ŽãˆlX²ù2:=Šdb Ÿpùh¥»$¢Âèbs¢oB«ÍY^$öaú@V9ȓ„'«YØÎ锝Ù2é:%n§u ð'ŠV®pVhPœÏ +šaOdƒjàÛ £PZrF‘„ÌÈËY EÑü± =-bb²·Ñ)Jt` COI…sîÑðô#úZ‰ÈRÒ)8: êOÙ:x*xÎkÒ÷<ËKݘf²ÄâƒàC>i¦R*œÛÕ*¥Cwþ45ª¹]Æ Hï ¡1Û ÚTjƒÌ¥d´aø8%ž;%x/Å bÂ̤7W’¹„ÊBÌ1«¢Ò‰£™¤3]8Ù¸mÊùh"8k¥=@ü¹P@+¹a©àÞ1çÍC’ãÎ#ä2¸ •F™¤ÜÊc.HՊÜù1_ÑÚýÒ3F+2?ÊÞÞ¹(<,œû£³Þ„áÎ.Ò9:Æ U®\ tŠv¶1ò*ˆY°;H¢x…:ÃML.Q\Žƒ®µ(Ýx 9rê\0èæ±°gM¨cšä"智´ÇàwY•¨ˆÝ’™¸2 ƒ…§-:òdB„Ÿ&OœLœ§»ÅUͼÊgÃd±° 2„×9»„¹ðZÆ#kþâN¬ <¥côîT¾ŽÛàäÜÃYìƒH ˆù‰ÁÈ»œ=WŸÎw…­Š‚› ›Nž’ É !µÁBn÷sÎՇ9£Ý&5"STŸ\py@’‚‹×'Sž,ÐYÜq„rfÉ'˜÷†1ä )¾«•Ùèp»„ˆ_gt>ÆÒ{ü 4Ì3÷ÈNj¥D2é<~9¼çzV““؃#äR%äÖïlÄ¯s›H×­L?SsH¬å¦C»YÎg9œ…„áäPð¢à†â2rÊdsdAŸC"gÓ $‡¤7@Kòn̪)´ §,V Q·†#›ZÁEã¥$nȈҜå&$ l£QÄa܊CÈ"¸¥± àãªÓÀc]ò®0§7sI§0«9—ôǧ¢,È|“I·4ÒÀË®SA1É …pŠ–¡¤b-ç÷B³” |g×`”Ê Æ]ÙKdÏ1apÓHPä¾Ô´YãkCNÁÇVÊâ¤9©‚JôÉÉ £m’A¡ú)»_£Ìr t 9ˆÏX sà"müY&eM÷.´+ì¥Ô²0À,¡ÑNÆ@áœw:í{‘ÓŠ£co"Ôs$0söS›Þ#ÑaÞÈæä±@Ÿ<‡ASV0ܯ­l€—<° /µ§¿ Ð÷ãP†”0ãFé–xf£ë,GJ$%s»êw|vò`',cG1¥7óSX»¤ éÏùAf3«Ëas5§G#Þç!ÌIPè·ÕeDyp #>H焄@c· ë"Ò1uƒJæ¿~€eDüUA˂eÌ'éÄ&(™RžL<[ã1VïárO Ԃô%Ô-Ð%/@CŸ¹äÝlrÂSÜ»œ•.PÐÎg¤T鎪<¡¼‚YÊtsPÎÄ I “.i-Og +!á,Í`Êìa€)§eÃÓ3¤”¤7Ú°ºCHLEhÝ TÂyZKÿhL­eÏb’Z’»MҀ²8…GW_ SœÜ«18Gx(Õ¹n­l+ÐyèH r˜5ņآÔ6Ϟ30HBë÷Nå÷T©IDxÎGk5O5Ê{"5Åa y›”:X²èÊw½K¬…ÙÎ!ÍÇ~Vúm*O’#ÝTLhÍv@Ö¾˜=4h릃h8 î6Hb‘“á[±T”ˆ€Î2¶#…§KØQ$­ˆ:ÎiQâ´ ¦Ïðš·-,ùüVÄéX!ه¤I(5ûÌ('>¬Rˆ‰¾ÈÈIiŸ(ç¦í§÷ý¬¸"Ž9 ®ÛI1í‘í¹Ë2’ˆ £Z–°ibQ§@À³3œ•´X†§œ“ËD¦sQlÙ ñyê\-<Ä©Së^tÌÏvÉAÁ— ù´ÌxˆŽNÎå »<8`Ii´ðÌÂ)ÁSîcYûX†):ç#ۚpBQ¦´: gÈÈâ„ÐÆ|æŒ]ùNö¦s`©óã†ÁY批åd +óƒÍï¨!ÒA{<øé¸ +vÖ.Q¦^qO +'â" XgÖWo»YÊ}ê2<ÐqBœ-w¼Bº#ù ò–:;]Â6iSPx^špFç%Ö­è¼sNüÄ?WýŽÀý 4ÚÍ9'+‰ÕŒéLqæµví£j‹n$]Nד)ªŒÓ…¦*À x=£MÓ}¾rtkb"´Äé0h2öÛsR瀝‘¸ÕQj-‘2ïxîSçÙɧu˜ãW»áÑAÚTlcð§G3ÉbÎí“:UØ%§tÃl#ŒÁ„Äd$SVÝÔʊßn]±¨U5“»Â‚²1 +—= rÄ'œÛPûtðîR6éSˆ/¤žÿÌL/ZIìõL[Á†z]gÍ*f²˜z?òN1"¥ÉxàQ¨‚%.§w—1p/ƒÂþ°r€v®'”ô5Oš‰x ñšà)ŸöV”XS4R•ÑWéKšyD'¤ÏÄ”MGJÁhäå…#šŒxÌ5ŒÇ*% s½ðLí´°z!ì<‚yN†^òŐí@öˆ³²M“çŸ,b°é‚ðu :a] Sðyå:PË(°Ï(´@Eš8Ù°Hòj"e\ _Ç1ÌZ°Î;GK¢þ nÚ|È*ZY½f8‡/gNþA ›‡]\U)äÈ+þg)Ç×Qä3­P%‹väŸB%š5ã”uÊeJ°L<<•ü:Ö½”ïł"ÏÎIYw5dL|ÂHk–ÏœJVH©8WâÓâ؈y ;JYy|æ’ìç>#0jª×^•š: nDùôt žÓàÁ¹œ|‰`œójw!‰¥œ˜›ß9ï}q,3Â)‚¤ÃnQpù)Ÿ^©Ê+Â× +Î%£àk5 (qÎõî3ªQz1r~€˜RCT¥¹p/[§íÄÂ9[L·–¦¬ú§[™wÂ'iŒ]X=bàä !óKM-·í4¼F«œm¯Ñ¢£Ú×½ëEsŽC—ç‰N“ĝ:„YÎkamP.z—sŒFœ¯o1ãŸkÞBÖ®k‚§ÜS:²— :ý£q*/Ÿ#Ar4«àÃ̐¦ÁNJx'šÁà™Êœ„×¹E(mqpe´$ÃF©0]”²"÷%]"àr +8`=Zr=ReËü€Ë ®„¬0|!mÄ×[ØÙºáôÒtÀw)Eó„’dIwÚ:—(KIW[àÊtœ?Pð}Žc)Vó|Ö¾WAÓmÒlהC©Hø2‹ª7†·9ÏUñá¬Ë¨;úÆp¶ „;`ÊÂeV©j ¿Ô§GǼäk_š²rÎ7€ N"Ɨ.à= ®'K”W—ExI)«h˜öÌ_Rª)e2TBB¬_ÑmÖ ˜ýK•ÍReJøvßTY˅…g|cÆÚ­½À"çqîڕÍöÙ¼èZã4¼žÀÞCUÕ6ßìÄ® »ïF¾Ùš\c´ñs‚†<æ3Àtöè°ñÌå— Š î‘Ò+Äþ° Ýd«9çYäs0-´-ܜB§bé7'.ΎBWز5¥4òai˜‰†·–”£Lm¨r¤YNÛ-´ÁK^©åŠÍŸ× ìáÉ>(išíc%f•C­^Dìߙ۰Z»W&|÷5fÌymÆÁ±ÏŒ3åHºs¦ +gµQ#¡}· U¢Õ£é Õ¢:@át žÓà¾F/ÎbšP¾ÎŸäÓ06etìî‚naÄ£?øê+1ó¾ )Ǔi¾ÁF59’SB@Ùœ8玈mòô’î +{‡¶»Ñò¡V—{± ^VçOe]Üßӌ‡ê8èÅ_‘‹!Õ§KðX²­*oÝû¶õ˾óàivþhØ;Ï&W/:Ói1"TôüÇÑðŸ?œö‡¯Žü¸x݆¿|ýՏ7ø›ˆìg??yÜT_uŸ¿·¾7O¿<;ýqÔ+ðûà +endstream endobj 22 0 obj <>stream +~wÚ ;ãk~ú¡uïýõ`h~<2 ÷/fÓbòmë;SðÁxܙ/Ó½êzãbˆ%dëþÓáÔÿ¦n +üñžPÑ7߶îÿ4ìw üÌà¾.—}ÛÌ\áwýÞôjuéaçÚ6Íqſۅ®]ý×WÓú}£òÛê܃§ç.^—ƒN÷jZü¡3œÏúÓ³îLàṨÝñ~Ï]×[(´­žÉÃø¾þ¾ß‘.}¨ß¥Ü·uí¾mlHÕ&ÇdÚ{X¼íw Yõ)S®µ­q¿ÌƵ;:.&³AŽDå·Õ¹³ÑlÜ- n®:õ™Oƒ!ìkÏîe«:P̓Æ^O:³É¤ß¯Ç á«Ç㖯¶^îÓû°½É× G ¶ˆÞ÷ˆÑå夘®Ÿi;Ì1±ÃcÏqøv™I @À­§;ŒÆß¿»êO‹»ô‡ÁšÒåí‹oMS¨ß¯›¢;tÆ'£ádj„î]\¨¹µÞF»ûèýÍhXlÒ]_s[ÝÕõ{;_vºÅY·Óhî–jm«—@ïç³5tØ+>j¯¸mÚ¨‘æŸÚTùµ>Q~Ý¢n¬›ôiGô}Ñh >‹Æÿ¹£þpzÚÈxöÝçk͙ÛvNð²ËØ:.t|tSŒ;ÓQ}¥4¨±[öل³ËÃ~|[ú·cêÛÉèúf4Y«ñÜnR_­y×(»­YW}³Æ"Tê‘Ú‰­ÎRÄ.(Óo0ó7[äåqzu]Lûݽސ›³ô]ٌýé‹Nùb‡wc+K=wn®LÒ;¾'ï¢Ê¿W`ÇFùY1~]]wYòjÌpî }ÖÆ܂†`ŒWívÜX\¶~øú¶‡‡EûÖ¤k»6ºøkѝfÞiçñhta›²ÓIýî–*m«ÏÖ¤} +~ۻзCà[™ÓÙøb6(†Ýú¾u[¹.iøU[éÞ 1èÕpvý¼;í¼-°°ÎÖ&t;ªïa¾èLŠÇãâßffÀLï¹jÛêêpt6íO»k¶øRÕ4ÔR¥mu–å—°lSˆU“õÜnUkϽd&âîX䫃rzPNÊéÝSNëGª”Ó[Ü¡;¡œ^Ž;F½ü8êOöS=­¿wW=­o ;h§íô ´ÓƒvzÐN—¬¯ƒvÚDâX\ ‹áùšàÊ Eþ](ëSbÜéõg öe*¿-–Ñë: ÎGî"³¿\ñÙh|s5Œ^×€lq3¶˜Ø¢ë_}JØâ-Øâ~²ÅGãQ¯_Œã 3ÚÆx`ŒÆ؀1DÆýŒñÀŒ±c|ҙýíß'Ý«büǢ߽úþ ‹ñgŠ1ØE6ùÅóŠnsÉmšžò°è>Å¢K‹Îõ¯>%‹î°èÖÏ'¡÷7γI×qž;çù»Ñà×ëΤÏÖåÛ¥`Ï#±wឍºt'>iøÍ'‡T0ó\hW†yjÝNÕ·o›$¹»Läp»ÀÖD3Î#4.zÍrpîCüܙ£·8~ûÊ wÿò„ËÁhÔs7'\ :Ý7?´,htÓéö§¾ÚMd­]ºL;½·Ü¤YïvlÝ=†)ºËËnϏ[|Ä®½;‡/îhҐ™ìˆl2¹êôFïNö™QîEzðf7:•¯ƒª?Zóõ¶5+ëƒíõ//g“¢ùO o_-lxãQ©Ò¶úx7®urSjowÀ½TΛÚgÚünÛ~“Ô¿ë ˜§f®… ÊÖØn\Ÿ)u~í_Ϛ8ª¹Â¶z‡yý|Ž;&Ñ=ìãž}k.²zhyÈ>Ücu¸]sMwwùvÍ»¥DÜ ¡“f×>ß_v¸Oô  í£€vÏ¾Œ|v¸htg¼&ûÑè¾o֛ôqǎËí…G¡Áe–kö‡£s¸pt;Úø®\8Ú`ŒŽÞ¦¹±|g6åÅ£‡=ù–ìɇKÀoÿž|¸ü°'ߒ=y3Uë°/ߒ}yß/>Üþ‘QÀ;5ڇ»À÷u>kcvy¶ìý•; â#võΝÍ°K»»»wîÔ½f‡…ÇÍe;µYíÇ­B׃®~6ÚZ‘û·êCj÷¿6à5T~[ýbjO֍í0—Ù€‘î“Á£oÏj¬ÑÛÍeîF2 ;qÐôììû’=稾î°+ésŽö/Îó»sHý.w?á̞Çp~ÄzÛï87 ‹¯¾Ðõ¾;¢àì/ُ¨‘vƒ£N;,ý‡K®þÙÖ][s1–[vû"ÿÃXýrYŒ÷Çûkº5›Àmýiç¢QvÉ°+[õH…ŸZnK•¶ÌŒφݗ»Ì…öw¶ÓVÔº[3ñÉa&Þʙ(îK<¾ !B¨ŸAҌWãÎprÙග[¸:öÜì³é1“]²øØ>¿‘N³cúç^˜}0|òÁ`ð%fâ.ªg®×›Ê»Ñû™²—ë5¹kÇ.ÖS‡‹õ–NãŸvób½?üí?®Åñ¸Ihüí¿WOן§;r­^“¥w'®Õí¾¥N¯?k°8©ü¶F»×td€ÜE-tc{¾P\à-µK…÷l4¾¹ F¯ëóÎ[¨jxâNóÄý PÚ?NØ æãÀ ·!/ï]Ä÷EÓhv‡=|ÖªÛ>X;Æv?¬{ïÓÔ3ÝÕlQA÷  Nàð-È°ÇÁÂM¶ƒ]ÙáööÚ¢ýÈg°&ñdÈ1Þ§²Ý‹TšÌ»‰Y¹¨?ZÖ·}ÖW´6`}ÛñÖw.\u†ÃbpV Šn#ÛbÍmõvMyèܸ·‹5·¼­=ìOnnq] §Ï:7»¼·íq®Ÿ§µðU”¾Öîþ®¥ë¹¨o»Û¹Í°Áα+›aýÑÚ1=`OR5¸*t‡_Ô7zíÓh°Âv…iÔ­;r‘÷å¸(~­oŽ¾ì¯ (Ÿ 6lo°‡£aýŽuºÝÙõl½«?ì^Xg[(\×ïg¯×Ÿöß6é%×ØVýaÑ©Ãk·3è>5ˆxjl«‹õ·Àp,© ?b_jh¹Ú¶º¬×¨¡«¼A[x[ê Þu>Ôï˜Ù⧝q3™ÀVؚžX¿sÅë&r+¾µéX_­5PêGÛëQ}ür<ºn°«cé­*IaÿºÉVýÝçjÈþäª9Êö.r©{ˆ\ÚÕ¬Á`í˜=ç¹Tg£Ün¦úý¿È$:Üd²Â¹«±KÝý]j²!ìÊwˆ]ºÕû\}x·b—šÌ»‰]êîoìÒ>²¾CìÒ!vé»tˆ]ú ][°tb—ºû»ÔdçؕÍð»t»™å݈]êîoìR“¶+Lcë±K;äBÛÅP¬&Ü|Îns€7JByۆ§Iìàax¾øðìí}v‡ ® ÙÇ ®:jéúª%ÁË&JjPe[BÌÍvú¢ÿ¾LnúÅà¼a˜Ã‡ž‹ëѺ@ä =ï{Åe¸6ƒ|Iú):ӇM"]ƒ*Ûêè!ƾªŸ;c?¹(û½Ž±¯¹cîM€½h«}ˆ°,W‡ûÏ3[ⵄ6£–ùÿóÝ|þ`~¨‹ÛGxf¶§Åm¯~Û¤µôN˜Ä/֚ wØ(¾Ï ÜÁ>¾%­¨öíbí}¿à®K·¢=Ÿ­az;Ì#›ñ‘ݲ$ïŵvõígoÖŽ„£e·&ð×ïѯv©Gj'z´f8K=[Ô]ê÷¨;³EnÞ÷§W×Å´ÁVµ»›rS™w·äý=캑àqÇ÷æ]tm6›wl îüŠ†Üùw~íß*w~ÝwþÁ¿\Ì:¸óîüCʼƒ;¿ÚqpçÜù·Èò-8ôeôC3Y÷àÂ?¸ðo‰g×LaþÁ…¿Mò¡ FïjÒ ÿújj +uá\pý›¯·5™«¾ÄÕ¿¼œMŠ“ÑÐÈÃe¡âíï«e‚gÍR •*mMf©¿ÎƗFIlØÉr­mõÒM©½Ý?wŒÆN Ú¹Ÿâ`UKï†u&×áÔ涃%jt°D,QKÔÁu°D,Q‹ÒÂÁu;,QÎîd-QÎ,…©ƒ%j×íƒ%êSY¢¶·nÛ;~WìkgNÇÝ۝È:³¯Üe“>îØ¡ç½È<Ó «É!ó̶d ú=ڑÌ3 Æèyæ6m̍:wfSô§/:ýu¹ޑ7Íäwؓo1¿?ìÉ·¿G;²'²Áí螼™ªµkûòþf‚k,yÜñ=yã,šÏâäC¸Š†ìc¸;ší¬{eÃÃUgL•úYâ™7n©èñ…2olscڗ$õïþî}hAôa{“¯AÖl2¥½ß^F——“b +3m\ôš­ª]ã·!˜ús±Œç8ŒwX[ùˆy¼cC½·„ß ËþAÁ¼# +¦PÑ7µ'ñ»~¯IÀŸ+¾­MSÄ ºvU4 +œãò[~î¸aàó$MßJ·Ž„®?OÈæ[Íu©õagÍ7ÉÁ|³ëJØÁ|³32z¶wæ›=:˜onç8˜oæ›=êƒùf¯Gê`¾Ù=óÍ]5L¢3é®±EÝ¡è€Ëq§;í ~õ°ÕëŽ=¿ì¶ç8ޟb¼mrB>¬³­.FíúÙ¯.:“âñ¸ø·Y1ì6Ð`æªm«§ÃÑÙ´?m°|'XüUÐdLK•¶ÕÕn}Cå®i5ÝÏ^yÛGë<‰TqHYvHYvHYöYúxR–5lö&cÙ!aÙN&,k׿ q:j gvC¹®lõXº¦ôy @$ û\&±W³ñÅl`XÜN›Ri‘*]9éÙDÕÙ-ã÷F' 6禸ý lÒµCÈàNø +~.Æïúã‹b0¾>_“Ác—ÂÌÔÝlС;28­)$î¨G§~DÓî:t¢ƒGgIww×£ËòKøt¶)BôӃ~ºeý´Ñ2;h¨ õ ¡4Ô=ÐPëKŒ õwèNh¨{uX?iÊîê¨õûxPQ*êAE=¨¨õ ¢Þ~õ›OEtþhØcUa@ç?Ž†/ ¼óÈÁážÀ𗯿úñÆâQödz×£iÒqÑëÃËbЃŒƒ~ñ·/†Gœb0½üíu¯ŠçoM›¿ŽZ¾þ*jýòîë¯fôß?π"þþˆV„ÿþòž~o¾ýÕÀÞµTëYëO‰Z½¯E뗗ð›iQҎ¢Hå­£¼umžàóô믎øKÚNt*cx„ÿà1‘¿'­S o%X0oñoTËäP +>NýËðŠÃ£ÿŽH±â)~Ò/Á‹ƒ&›²—ÐÓùÌT½†´-"­RüT¦üaSáÓö‰~9òŏ2ûnói__àG©U‹«Ø_2Û©£Ìv„ ªdŽ@™¥Ïñ Ò½Ÿ†0³z­×ãŒø´‹cu”øّ£¿ÇfxŽ"èl‰Ö‘0¥ly@šKÕJs¥Z¿\—JJQ]2Ñ­ãn]œÇõpÊqâ(›Éø [ÔNƒIˆ„º¶³ª<G8žÌD´#Gµà“Ç)½¹-ør¾²c‡•F:hAÐ0æe#'돜A%£2í4P9ž9‘W—LäÂÈ-Çy\§LË#‡wïÛÖ/„þ>0œ*j'¹Ê`ГØÌó!…Ú|ÑYœøÁÿÿKg‘÷—‘íLf"n©¶T±À5zßesÏýC ßsÓ<üQ ‹ ¯æ§Ø €æѝb¾97;Ø´¼Os~ÏP!ÍtœgaãøøD—¿M}n“o΁¿Ÿ»–Zz͵cUê:[@·ºµ²ëDäªnkZ†JµuKÄôž`Lî¿,:ƒgƒù=jÝ3Qüҍ‡ùÙ ß-ꝁyí“q¿÷‡âƒ{m¶Aé—fóšLÇؤW´ï~sn^q< JE ;ƒâɬßs¢Æ7çrá£÷7£ñ4@åzÈòËtU߆®z9ÃIUÃÃÎtv=AaT!Dvý¢<ÐÖ"Q),R3U®Ã/Qj¸¢€‰<©úb—uÔΖ"b©Â®w³ñ:^Ÿ’$«4åÏÔ-ƒ4Õq¢àe2Qšx‡iŸi`œÂ.§Rë +ޒØÝþ(uûì –÷Ó'±#õ|­áÝ×Acà ²í?WnÓz5³7¿§Õe.›?Èã#`zIݶóJ,Çë°DevŽ=»º +_”ë« +û¾¡h²¢µÑú>«õ}ŽÖö9ÎË}žÙ^ +»ÉÀ—Sû%&ð±ªçIî»®ª»Ž²C-1ÕüɨËfA”~Qõs±Êqu•xn(͏ÒuIºE®ô)×uçH klÜ£PˆË%̂]Ù³U+z¨]µë!}®œªØÃøcû—ÌõOÕï_²¦1ÍJA³RÐdŒƒ/ŸpVªÒ¬LË?(]Ñ5Uš”s5*z$]‡¤ëOäzAŸŸvNª¥«L-[ejé*[Ò#íz¤]h\èóSÎAµv©ekL­]cUý‹Ü”nšI7ï"ÿù §Ÿ( —*ÿ dE¯Di´æj,vFÚ¾HەÈöÀ}|ڙ'–­$±l%‰e+©º+ÚvÅê7-7îãSN9±t ‰eKH,]BU]AVvŸÂIô‰Ý!V÷I¦˜•*ÆÅ U‹½¡ ãbXè N1mg“¶s+¦O:Å溢æºR±Z溢ÖuEÛ®8Y× †ûø„SìsIh£̞Q;—Rˆ ʋȥÐ`‚ÍÁZ;­‘$©zíXf¢‚03ëA‹bh³šÕ-*ûI[Æ©ÅkY;Mez”kS#í]|—m ^T0"{Ÿð/Ÿ.#5ä7­º^»¡q4R)Ԗ¹Ú€¯pä±Ù§¶VqN ÓÃ\d9}ç9džÚZ*%`ŸX|ÒÜ$b»õ Û-—n"i©¬¥ %´°3ƒéN˜âõ‡o:³ËÉ»Îëjÿ˜»0+¬…–,Á9ÖæIžÊ (úÉfæm S#3Líûо@"W±.“ ˜i‘Y]YžYH†Lº-0n÷_oa†·D™uPŠQ‡æ}ZÂcŸ¥y6Ƽ;Æ*Èbk±³-$ÐiJ¬‘Ž`B¦ÈE#•Xö“klÍ[UfØìhM6 õ½%ƒÐH·“ X>bm6Œqç1¢$ŠáÚry‚™V%ÐÆc¶‡Ç¾ŒžÝvcû¢| 8 +=c̾eXqŽ´ˆà‹Y‰y–ÆØWè™@}È?Õô ”wmq×V³"Ul ôã{Mg`ZÀðRm;—J˲ þ’8ƒ)eQä8§Ñ #eÚmöL»¨p Âñʬ番V€›å¢‰ÇqÂEÍ; MÒ b>}mj§*³4嚨S±–% ¯‹¬ÚÌ[öÌ\ŽįÁ[2‡R¶ešÆÈ#´›ªV€›} ˜UÇaWKÏ 纙ü2‹Kk6xÉ6ïS2ªµ]Çækð=Ò½'uâ=¡eV¥¹ÿ¬pÅ¡ºé ½ÆaÀ‚¦û÷ÜE%$5L‹K.I Óñ(¼…@Ô‡ƒÚ9׫ šú©»gjçqĵÌGfŒpÒ#¿•®]TÛµÛa÷ý2åp›wXàK¨6=2v¸·Sm׶rÛm–o¦¦”Tº¥H–ƶU©#ÜVSÉ»±­>°”¶Õú›$:µ¨ +f߁Ïܘ›ïoM°Ó_â4·lÀÕ­‚u/NK'Ê3tAH˜Ü× lSJXf«LÌFZ¢š+¬øÊÙ-TµÝBëR¸é›¦Æc€ÀèÃ3Ì>&"p»&°oé V +šš¦¸ÆRÉ꺩YEf§4usŒH·~[Ãû“ÌjJÊÈ3KÞk—åÌò:mG1œ1¸†£i"r´7jGْº0KŒz{V­×dzŸ¶±´‘Ù}°ÅÉÆãÄÜõÁä÷Ÿu&oæÌ!O‡o‹ñ´èͯ¡“AÿæÆ,ÆyøÃþV•ÿå7ðwðP˜YÅ÷ü„ëãegb“›ö‰Ö/O¬Í­xÛÇ{Å>´~ù âYp„qaøç/ ÛÅÀ?~¹ZQ@¶ ý/ æ•jaÀ¶élÐÃδó½Ym2ûú«_ž~õwýÏÿþÏ¥ÿüoø}ùÏÿùŸ_æ÷% ?ü~øýïnÃü\ýûºõõqÿ_0;;päh¿cöe žyý¸TöñbGÞz<ûõ×-à³eIâ›säÊ^ 8ÿå¿:)È%åýœ9ìˆø|¥eoXêzA"BWBè ˜—CæJ8¦þÏ3Û2ˆË]à¹ýxÐEÉä›ó*Ù$€†’ˆÇP -a¸´h”È#Ë¢â˜òÍ9*ÐÇÆ¢Š‘%7V¾9ÿqå›óX¾9ÿ‘¥nÃ+…–oÎÛd=wÖC¿\`ásûFxxð´õ`6µì’ìÿZxŸÐ¢wíùŤ¿-zçF‘8·¥&ååcÆûÁp4lå2·3~> - +ÜQœ‚ÓÊ|1j™iþ g*°XÍ64ˆšœÄYŠ±aR暴nFp Ó|f‘]™5™)¿àÄÉìQ¬<ðÔ¥P*¬j&”5 ö€mpÈP¶Œèé0N1¤Ð›/ÖÄ­ bü*„9 í”¯Êýfô[qRE3Rf8Œð(…Ó€‰òõ®ç€=xà…›`ToòÃƛ՞'YVn=˜·Àå«æm‘¦i !Üzô­/ݸ:ôÌ÷Ú⟉Š Ô"ßfœ'sD aØMm°èffg*)sIevËH¦%ƦKQ0n' +Žý2ê@ô0O¿]dÌD~}@éhäöja½î!éBvP¿ùÛÅ+Œ`š•7ð3(U¦¼?Ù%40‰څ¢‡yڅ0è"c&ðëÃEKÍ ˆÇ}áŠÜ[‡9x&â-PÉ{j™ù:KK2cnÑÌI(^åm#Yd^d¤çPb$X(0úzNèó˜€^Š‹¨”%iIZ„O«ï9Ôà«IÝ&…ï'@ *(”}="cö|ýI•ñHÌ ‰G0î"ÉPL'h…Ä#,$‰m\;ÆL€x ˆÀl 5ÞÏ53$u…ë1s`âÍSiN ‰G0î"‰ML®Bê‘Rd5®è„9ÆìžCÚ( ÙþZ¦½;¤µ1$u„+r÷ u`ÒÍÓhNø+-ZóKËmÓ~ñ9I*$‰\!éH0ãŠ$º1j„ÄcX@½fûH¨™ +ôþÒªuí,-[׿l‰¼l=À/Û9:•¥½€z’ie{Hr‘€d§€t,c¤cIŒ`,«b¤ó0Oº†ýcÔD~@:jf@9ê ¤'$⠞‰lóô)‹wÕD#ˆzOBS@5’­¢‘üE ’Ï+=c'XÂ~Vê7½8 5/ õ€@Üi‡5x&jÍÓ¥,ÏÔ"õ+ãÂö›ä¤€ZNš +ˆEH #¤ô‹AžX»EX©Ûî½­¨q­2ÏêÄ]vHƒg¢Õ¶ +ºÕ’’KDÞÀýHÈ% +oæ‚ Äà…7sÃyѸDà \q‹ôª%—ˆ»—΋Ä%Únà©ó‚o‰®xë¼,\"ê»E:ՒƒKDÝÀ™Ç2p‰¦8ô¼¤[¢is§ž~K$ÝÀ±·H¥Z‚o‰¤øü¼Ð[¢é~?/ږhºïÏK»%¢nàÿ[¤ÓJ¢.ÏUøeAdkΎnt"úã¢×Ÿ¾éŒ§Euš‘ùsŸ1ã&»°¹ Ü×S›-Iæ¹½&s! àƒ½­ ¿š]×æV°æÉìÂôìÎ`Ã7Fè¾Hi³%I ÎÀ/§˜åˆ~ *YL'6»QðŠr\Ëèa +zâ:xbf †Éäxš_›/Ý'tø{â2÷¸ØqÿóQPëȢ²y©‹|²Üµ¿¦ÇÄ¿uäqÓ|i‚Ÿ–bG‚’¿p°¦CxâZáÇ©üX/džw#]Á‹çgâèՃ³W¶”HA2P%b‘ÛÉ!¼cÕÎcmC ›©痈WÀ$°ÝÄ.oLhªh»$:ʦ‚WKÎce֏éP ˹•-5¦6AÑt‘1ڌTå»ÁŠ‘Írˆ/ÑÏÀÅ·E¶*$g±T¡Œ¤rê!iÐÖÌeNª‚ùš˜ÞZ_…+R6g#ÓM@$›§‡Z”›kle–¶c³l!SH)gT +B›Ò+¹# ¸^Œn~º)][™¿ùÍ·Aސ8q‰„ÍÌi/.°£ߥÿ~:Š³v*ðéHÁMpf6Ê"~t1®ðÝƋâW,„û'V‡ÚˆU`6&úzêÛçž2HׅO%4=ĺ—žÒW*BU¡¥a§O|&@$ÈQœ#®kúꮧ°ß1>ðã ӄµð6Gwé¾ÕDä‰Fß]e¬ x3º××½Ü6Ê·„ e²…•Ñ +Ëý°oÞ ãòW×nçi8ð‘£,b…GßUhá„tú).ò'ãÛìÀŸå@®47 tþ*_½¬l*æ/éX‰wþ:ߥx¥Z¡oHÁë2qC¢cŒP0tõ‰ø4Ô<‚™87:Ḡ:ùWöÊhþÒÜ,--uiŒ@*Æû «K§ùâe*+q×Ç-õüf4×ÁJ;â¥,a?±ü̞_áRuÃwRZÙá‚? +'Á2ú‹FôOê5&ûQý]FÀe¥Ó¤šþKq×Ç=OÿÌ éÅLãpAÙQÇ9ïÒJLó™1œOqG…ÀéºV"V~Z,YžX$øêJ\cL©O©²(OƒÅ±*ZÃdÓq;O K Õ­‚ÝÿüÒ/ÏÎVÞêû¸pU' ކžÇc·0à †‘ÊÓX£Ù)CîPÏÚK- ‹v¢DâËäÎÊX@¯êâ. 3oPʆ}!hB&„ºx”É6‡ QƒË|¯º+«ßÿåÙéOO¶¾oÝëöÇÝAqŸÛÂèJ3t¦‚ù±<ºq;ÊšL“TÅ֎µãL˜µÏ@«r)‰éšS#Ÿéu _Vm³ kL7)pc^åR2fy¥)ŎܐÓ೙] Ý ?EâW éNÌY $€N“Ä©h¦="à Øs0ð·à3M!z%ÁtÛó½9Yì ]âf¬„Av;1 +ŒB'LÚ2É#˜šY‚#w×iظ'ó[šÄè¤Lè´G¢X:¸æ[ L +i3ÒHãlJÉÖos‚›_âSnÔÉb;×0(‰úã–†óÀî胗Œç¹Îî†ö™õ/³™Ùãì­¤ëUÁ×ØìdNÅSž×$‹/’„ÙbýËV¦Ë|VÛ±_NùՂ$Ë¢1Z„B·«33¦dH„ßrȦn+@«‚>Ú°3ÜƉ³V¡•réݵ(¢NÓ7(›JÎô|äÐàMfˆû-X=dG•QêCBÒ{hߦGÎ䒰 -üEiû‰ëÊ'Óz’¬$Gá%'Õ:OUÉjg Î +}§ªä2m§t×O@³ë2-Yú]ò5Ò81ˆÂ¥a^˜vzœ„¥ê M­Z;²¤V¹éó'ôp2]î~*}jNŠS\…4ÉǪJ&Y 9žpΏþœóü'»¥•D ªÆwCT=›™ b!O>ÿ÷VÈmDF؟ è²emçè¼Ì5& +ϬYÎb›‚;UÂú&…ÐN^JEûå2MñFžÔÈDà0¡ |%F>ɳ€µ«Á% +Έk©ˆ­àk¾ #çÁ_„ˆ Ӑu•tÒWG +\Îö­P+ߪÑóŒ€c/ 1Í5ÓUƒ“IfÂ6 ²jëxJ#aóæiœØlÔ AE†0Ó•$UøÉK§ª“ºc“Ï]dJÆؚÅqè#‡‘u cgÃ׏ž©V1~‘´ÁÚ Çù1t9bÕª2?Ù±£õÍy0^5J楇ÛTùðG¸ ’ÛÇ2×þÀD¬!N"msêÛÑ$ ¯’Q-£]¼´LŽûòSè—O99á—ñÊé¶@Œ‚™±Õx´ŽdKÛyŒ×ïᕠx«¬ÌQeû‘¥Â Xðj#…ƒl´Nî8Žð¶¢(׏Á~:³‘i%UæêÈÄèk +\»6ÜfYŠ¾!Œ7³2x>±ù@í#l«8Ïa„œ¨FeJaüLË¥”)‚8”y ¬?rmoÛ1óP +\5VQ„HR —uŸX5KPÞ1YÃÆHgº3I³@¿Ìԍj„ÿ-¶‘¨pVÞ¬¸f„@Gp¿„YàäºKe[% ^èiúmCŒŠá‘&ës7!²«»c2†M¨¯©0ª6,²L©‘g°ž…Q‘â•XψN–Ig<€kÚâÜúlÌÜÒŽ8Äx€yrÕÖBȘ…žQ5zLìA0ÝáÚ‰)H¬ìL¹‹P6;Á›1Œ* Ú ÜMdo]S êµ:¶e ˲ötXB-̉jÀµ +²•à•Fþ›AxÇ· Õ9Ák3IÉh«FK( K,g–$üÈ,ŒÞIňÖð€Â¥vfÔä­w©ÂKÖ÷°%º½6ÌØð•BÜmÚRÌ«íÝYRߑà†W‹ÓÂ4¬82ß*•ûhÅÞêYm+€IºÐWmìT!t=H÷å Éx >[2Þ ÄÏPQgöY*W˜ð2 qØÜ3˜èݍ©Ï͈]xQ~‚, +w»Ê;tÅë«âýô¢ýîÕùãћÙd™Cî%êY’T42ˆ„³Zzƒš¡ð(E&c#'þò`ٖ +k>´¸³¦p-%òIÌÂÈO§ôtDOô0±31 ^ :3ËâÝ×)8—mÞþ锞Žè±â‰&Ÿn +¸ÂÒex•e+‡ #oÄéL½ +^‡Ø6àvpfg~‡Ç67âxx(}žgçû&\Ï.²ø¸y*8€7á}pš¹)÷ƒs­ üdß¾› x ¨ôޒ„½%β‡—gå™M4*X7F”†€ ¨36Ìç*¶¬Op¦¢FUO­`Šê*°€\ÅaÕ +Ò0M\è)6¤Tđ…![­˜ïçéŠ]£‚&RÀl£‹‡/³¹yÚРùA%0 ‡oV%°T½‚NXjS­ÂÙµÎꞀƒ)o)³6’ ­î©Ä×J%¿Aá Ý1'èù£á‹q85í>:rpÔóÂ_¾þêÇü-³¿½ÌÌßç5ê±ÑñÈrëx<›\µžu†×Ÿõ|Ü£ýš[öדÎ`Ð=îÜ\õ»®è+C‰û­—³a¯uԊ[/¦íû …¿m™ß«®b4ÄÊ:s¥[ƒN÷ÊTÒa3Kž ¯Jþ0º“iÿrJåzÇ*íL-ŒZ<|]PY7^x-Ž?Œ‹þ¤¸ÿm«íÈm†¨LìÏ0p½ã¹¦Ãȍ‡GHð û ÜNÍSÜzðôüxl&ô @§ý ³¬ÎOÎLÉäüñ 3=·{12ú²][2îУÇá˜@˜¯6®.ÇÿÜ¿«¼áËK“Ô¾Ü|ÇÿìÿÞrþYû÷Ç­¸ôöZÝÿÔãUµæp6òªƒ'Ã[äzHï·è_ Øý–;jâmG‚¿EàŸø’ÝY¶Ü¿å¥NÝù±xG¥[¢ü/<¿° •Ù‚S»¶`Ajó$!ŽPdF¤•–ÑRZ|†¡ÍíofϦ̀}ýÕý? Gï†øí½ƒ“IçüÉÙ·­û?š„íêþ³¿-¸Ðý“ÑõÍÈLÐÇýé2Ö;¹êô‡-[Ă­§é¾+ólô÷îOúf»D¤H֝î›FHŽ;“~·„aÅî#¾ Ö^Ð'be§LGï‹î cD,µ—]à–Ÿ¤%ó#lwRÇ=Ÿ_^NŠé·8.KQÜ{:ÌP¿ÛÅ{ȱdw7¸5…ÈhDŠát6~[Œ'Ý«~qaÝï[§†°G./‹7æ÷_õ§òð{ÏgӉQق±‡ýÉÍ óÁ>~ûÙ=/}ûƒ¥ÛÓ¡mTmv´»«ëóìnŸe‚oç/³®}ùmoæÙ¾ö°Ñ>ÕZªp³:ë_ß üf儍,‹áAdį\$z¶ñü{aVá´Vóô-nZÀ;ýa§?ìô‡þSjwŸ1òê D€¹M,ýì›XõÖñð¶NFã¡áõŸdëxÔ}S [‹±A\ Ýbõàˆ¶ˆµ´.ÃÖ=ˆŽŸMV,†ƒ­òÎÚ*?†bëYm–”í†\}Xû¸†QĊâ"ýÌ©#´’Ó°³(Hé1ÿy ìçvã oz]½kbIЛºÓv§S½kþΤ­?t†Ó¢þž GuF{æËu{æÝåeù—xÙ^Ê#·Še¬àÀ–r£ãAgfzòc1Ž;W×Ŏ8)o[™±ŒìV"•iîŽßú㘩–pI“w¶/œËfàžËLtřLñ©XÚÖ(¤£$…Ó¼m™Ê,‘xÞZD9ž¯„̝ÆsG©,ƒOBH¸8šƒ±c>akZ:oÒݞ7_dÚ,ÏDýù÷FA>„8ó>¯c§Yå18þ ð^qŒ ‰•LÚpßvKäFNmÇyt÷NAD"ÉQ‘Žrieön.'S$‰"Èõ ý­}\KNo,ŸÃfRâ9r¯7·.ÝEž+ÖjœÈ,9l›lýš_dËدÍU1È`.«2˜GÑêæ6Ÿ÷m>í çòË&їŸDîžCz;§¶ö`üãì“ÿ7u¯ +ÃY† Ëtfû÷bˆ4;h:XÐ×Ø¿n_¸á°Ïgðüd0z·N¥z8ݴή:½Ñ»åjTyý9ŽÓFۈl³Iñâìôx0/5¦7¹ëäcLé“îÀ©Z“´Ý›N·lâ» ¶’¶{1Ú1 )uHpPÜzôþ¦c˜êqq9­ŸNzÄ-؟o Ot^OºW›îÿ{àÃû̇îú©qyñ4eÁ7¾ehlâ{[Œ­‰O³)¤×¿)ºýÖ!B®×Œ»ß–0ï0sæþ‰˜ûŸ ošéÓûËڌ9­’mÇü“øŸ*»,ZK“ê` +ÒGÃ^€t}&ӝAaV íƋ‹úí¾÷§É¤_›%V ÿò-Rà—_tå¾þêE·ŠJp4éoÿN?7XRÀ;ÞuÌ2fÌՙ¼î½|rÜz9šò+¢DÀÝ¢X!ÑBe-ÒP¹ø“bpÁå™&hôJ¬/8þÛ ¹¤ino^k ©c{HÃ÷*œ|èøò«s,ay8`Äåe’Û£³p]¶»¬N”Ë?ë¼6Êw‡«ˆ$7݅®¦Yžb0‡L¥P˜ä2Uî”M’aH¶ ã6ÂÆa[¬¿‹ žü&Î[Ç¿Qړ12µ{!š’ +_ÃÕڝcÍðaҕ.íE†]:ÌÒPëÉodf0ÇI0©)ã 'YjG‘°Ó€‚ñcnl¥=ùM•PBuCj<å% 66Ӊv“ÂÏÀ£„V +ó×àŒBœ–±‚ûŠaXRۃ½ŠñÇÄÌÛ<ÁØS› œš í>þÎ=N¥EìZ‹,S™;£‘ÇðN/$,#“@Æéû±‡;3K¼C§Í¼mÈ}FéLShè"Fc†µ„QÃÑ#aÏ Åv6åQœÙ)¯Ý¹î”¨hèéœg‘Š Ç942ñ(S•kd3¸Rœ#pŸ$Ä鶥 å6…húHKM‡Rã¸dÂ`L•_UI ylak8òƒíMÏí™)JSJڜ?6NÁp$~8L‡pñı‚뇁€˜6׬Ä(Ñv¤Á¥«ð¦›6Äý´_3©Y‹Ú6ÃLë4³c!hT¹›vŽ;L±â^ +àʔÂã`y”a۔N5º›ab¦¶q|’.Yl\ ZèÔ3º† ’ "eg1´MJ¿Ü²TÇH'-Å&ÔÀÝM'i‚戚“ežø¹YM– h…ˆb•+{voîä,ßÜù"tꇗڗÔ +;ª¨yÈëÍš%ˆëRi‰H€ŠhMÄ)­ \ÀXÀ?â篖ØÃP„[m¹ÅRbйò ‚ìá*·&"X¸f€ }~hU®5¶Ä ÇÀXn‘í¹=üð*âƒî„/·”˜¶P~¹^±w©Œpnˆ’ã$ɓ£5Úfø҈ç‹Ð™A]Ïö"Ì ´ÄT¹´7ÁfpaœBtìÁ“Ò¶’Ù‹$ZæQ¸§xËl¹ÓBñ{ˆeÊNsª´…Ä8,Rø­Rf°>Í"W¿Ù•ÝôSš3 ì2@KßOCZ˜Ï®Œ€j†+\˜ml'¶éN–$³™. EÖ¢`&ù¡Ð°ŠXá +NnÛ¡4ÔB1Àß.AÃ÷rdø¼ÙÑ—6;Ã`³ƒAμpŸv0RñšÁȝÙÊâcèÆGjÎÆaðfÐ`\ՉHš¤–fx);žé²BZ$ž›cÖϧq”  ¸¿¡„Npy> c¤©ÊEf9~lö?œSy–c4 %àV–A "¿½$°ÔîX™ô˜ÛՑª1g*2ßqwI€ú+¦=Ûí;¥ ÷­€YÆFbÃÑK”aó¸¹Æf9à%³z…Ÿ°k¹‰&æF¦.Š¨b†ÌB4è-™Íª¸P u´F‰ƒ·X·bÍB Ȝ),‘=UšZ晚Í,±«4¸n#O"“ÔbA‹.rqI1Ò8FFMK͹PŠÿ®E2y æW;~æ+”ý®} ¡-k‘¸‚¥ÊÏÇÝ«~¯(jT碉àÇWˆìld^0®Ê\ŠèÉhг±%kQqQ‹lyðz€ƒÔmIWkUîÿùz®,m÷žŒ;³Étv Ñzñº¡bf7tàÈÁ6)µeI’ ‡7šW.g˜Égƒã@´_ˆÓÃä“0«I#ɕeu±=ox² mT+œÀþAdÑÀÛ´ß.§¸ai£zà®m6j Õ3,Î6/¦VÍqxS\Ì #¤+6üE-€§À—(MŸ4{:n–Šÿ/Ið¸¤çeF¾P¸=›Êuø%Jµ“/¨qó_·DŒ*—ù빃4Ìû«Ò̲W³-i»«Ñ&u;\RÚ.íƦãùíÒ¨–È«¥Q +d™Ñ·ÊLJ ›ÿBHS»£ä’zþe¶®[(@öKñ‹Žºñÿ4Y"…læ¯W°2¥s{шqþA>MœÊE-šÿ²F„zLmj‚›¥½BÕ!Cmþú%øÇââ²3¾W ›â†å+:J*V èç%)0‰Yҗ€iv‘(% .«œ,’°!-Rž:VhC± ¤6ÓÕ·%Cª$v–’¥Ê´ÖÊ´m‰Ö†W:,îóA!µ¤Y,ú‡M1k5µgWb™ÂñN+žÚ[Ýé¬g¹%goꗙ4¼@ãD“©„HÒÄ tl4s‰>YÆòÙèõ¸30SJCh+F&™NˆyšI㎢’t–[ ‡´Ž³¢õç{éwYüéҟ¿uö¶÷¦+ +yúd`SÐd!£ox>î _CuC@U¿£ª˜}ˋcood«b³+“Nû“iÙöºè)X ñuUfž…Ã4_ûó‡_‡·2-ÚPm‹6¼JDá¥ñ€êïlë;ƒéåàoÿËtã|ôÖÞøªsqZ˜őùæ¡ÅûéE1†NçGof¾ÝütS\/½Ñ»!Ž ˆÉ¹,½s c¿j•*?§ºéìz‚E©öãþ‰õò u63Ňîú®^ú¦3žâ^úÃ7ÙåäØ ±‰ÏÏÄÑ«g¯ÁÓ¿ÎZ;oG㾿ÖUøëìòoÿáJ>Ï Ëì· ·4:r­ ½›<Gݙå©i/¸$Xèáqî²Ëû¿<;ýqÔ+–üüCëÞûëÁÐ82nÜ¿˜MùòÉûÆãÎEó‰Þ”3‚¯‘2‹áÜ}šô3ü™ú«4ïýãprþ¶3žüäx˾í¦C…á‡É’‚$æʹÖLʏ;Oª‹þ°gº-êPʐô¬˜þˆ4©A®°øw·¢³ÃÑpYÓKŒÌòîÕê$ý”“âã !V¢ÞX÷áÛZ+£Îèn}ð›3…ïßÖg PövLrèg×(Ä£ë[Àþ>ëý~ÒÏ6졆Ñԟ©_bݜÁM(·«=ûµ”'—ïnÁüÞN>{Î÷fìUÄqRK{ü®ßƒ“œ5†Ü•¼Œ[%ªmþÏÖvÏ葯¯jq.z+:¨“µ]{_o¡Þ’©lýh}¨Õ¥·¤KO¸´?£©-N‹Ëéóqßh²µº·XéÖHÈÏF³q·8†HåOÆ)÷EC|ñ㩏Æםe<§DÏËþ XYº<3Ââ·bD?—:8íŒ_S#OUgòôa­n.VÚ'+Âz®1w†“›ŽÁØ­ÇËnËÌXÓËáèØ{OFƒÑ¸V/Ëv¤——/]Ó>â ߊÞÝû‡ÇøONvÝl,¯wo$ûC36ƒN·æX†ÅoÍþ½~{ú² +w™Óߊ&n¦ýëþ¯˜UãV5Ìèð·¢×Å´ÓëL;Ÿ 1ùG7æzÎTkM¥iÑ[…äxP=¸“ps2Ý<{æ¯Jà˜çV)DøáÄÿbd˜vèÞËÙ —ÄzŸ´ÓÔ<£óL¦sÿŠ7» ¯%sÛþA}yñà%éB¶ŽàoÅËbðjôÒ6À¶èÅh҇ÆãϒÕ¯$曧“ãéŨ3î=,.;³AèÖðs‚Ê !‰ªó”ŒY ¾éôzždöE×x‡N6¹MçaAŸ8mJû@ï¦ß&c Æ~²¬†|¥!×vÔºä‘4<`Э©™s§ªèϝyˆó ÂtPÑ»)À!COú•MÃÔ/%?°ZߧìM;ƒúuŒˆ65È`~>” +ÏÿZÂ(ˆ§y ADåƒÎ°x5º ¥ñer*—Ç|D¸ÎI6Ë5… ê6ܧÃ^ñþqz{àÆW©š77cWnE k™HsÝæ{j拆ì™ílYÁR$xÞN—bìƒÒ˜ ‹„êv¾¦ðtÄn´L¯E=’EºíëËÛØaŠ‡³q÷ªõj\ô/ §5”êû˜BuÕ²a‰/¾°;OÎ奮æ4®eÈF¡»fºùr “‹¡ç{ »é“þëa¨oÊU¼ãÂ<¯Ä‰%Ñ«X§`grџ^wnês¼òÀ,ö}0n_{Gá²"F÷€Tº*±ªCP”7#Ãë»ÄëSYY|Ük%rTVèðó%/ÍnÍ©zѧ\YìÆEš¬œøâ×íՓÑ¢£‡t>_l^6ƶ¶àÛ5=toÝy íb¡îpA‹œ/45O-²¤—o!ðð¦9\ÁU¸y}ý¦] ÁG²’]C± 'ç];—±¼åïÁb©Sɬ‚)$’¦Æ´¥®d‰PÖp<ÞæUuã/ÀÛ³®Pw<ºYW䬾‘!֕=nbøԚµbß îš‹Îx²jH}7  7¥¥§a¿Ö7¥êýŠCvàÉ\Kj”ö-©Q8lIÕʺNÛ½ÁŽh ݌/G‹ö·ùr£»søCÕhMLw},A¥Ð2i_ôAš\5è“ö°xÝ â —”ê. wY(hö¥álÑEÛ%u°šó™‚“«Žç‹UԂRÅŒ |'`¤8Wr®XZµ¼¿i—Íؼªbãñ|ŒÆRU}½PtIA·e–ƒzV´!=kŠú«¸‰)±²Þ»¤ä覻Šã`‰Éªáǽ™×ãûSÃeÇEëÁìrð·ÿg2¾^£Ï kÄ£©Mjl&Xìr6쮚5¶3#ðÌY³ƒ`¥ÎpÈ!¢Õê2[«}t¯CYëÞÉÈ讽ÖãçO^>ˆó֟ï=={Þ2Qé‘ü^F‘‚tK+õÁk#†²c•8j +BX« ‘-¯{ýa•†”M¯ÖjèV\­Z3ëöŒ’bRƒ³—ÊW²ÑúÙ¤x8êbÄFµbÿ€j†ª}hÒÞqñ¢ÿ¾¼(Æp“BÈ@(²ÒÚ¾žÐmhpтÎ\ik‚1éÁØÖÂàхZåwY£Qã—Ùj5ÞÖ<ü34ÂvÞόöÝ¿æ +kí&ÿßÿýþ¿ÿ×ê%ѾLÌ®Û_ŽÿmÅÜtåºAp ÿÓá›dš +ÇÝݕñâá㣟Nй(@¬„“£Rú´ß.ZÏíO¡•3ƒÖаXàn½Ü' +<8;yú4Ó è-þªþÇóüÓýoüÍ?ýÐùå»ßÇÿøüèø·ã'×Wß¿þýïÿýw÷þé¤ßiOþKòÓï%ÿðýozòߟ©ÿñýéŸÿéÙodznúø‘|–}#”ú‡(š<üëÃ×ßEÿå·?üíþíûîfòÛÉä}óšßþpú÷c*õûéñëßýÏÓßþ7Uœôóß»Ûíz½ð®ÓÞ¿˜¦ó}ú¯O¦ÿú—cõ¯Gß=øÿk{¯ítzäQôþ[‹w0“sN&Ódc“ƒÉ`ŒÉiÏöÅ~šó çêÜí;’:©›N„oÍÌo0ÝTI¥R©¢j³+ÀºŸÍQŸæB¤=ÚVòo­o4éGa"Mëþø›_½ïD=ekŠcÅß õã‘я‡N¶9my»†ìì Aô"FÃÊ%ýÓoù“ëøºúIþžS¿þ®“C‘‘.=u–ñHLß"AŸRƒÅ`>ééü,¯NZÚDْͪƒhg€&øg0O3Sï—!õë†#‰7·Îœü°ŒÌñ”¾A¤æS´YÐü†§Óñ +~Zš3?¥_µÓaûKí(´fÉõ[Lo=š¿/‰RMw€0ÆÅ_7@ã 7ûñÄvªß˜ßËa»óý¾ôûí§wâ8Í;Í«“9MNM@9¿~îo¹³Ð2eƒEv–ß VË<¹önÈ9tJoñT>¢ie,A/ì’Î÷|š¨?µ˜#ÍY/äšhúntû¦õ™4pYz¾–ïk IM®Œ>+Å ÍYÉáìkÊiû8¢#Ôæî¢ñÁ½Ð8&¯yúÃ%"Ô§H+S$ßOY2#š«ãÊn;ÌÑhÆâJÇï Ö{$<ûû ÕdF àU’^ x+Y`†Ðg‡à4¼Wá[súΫN¦‡ˆÜéù)æñu}ÓD=ýgNÿ؋‡Ìx¬×&}“ÆWðó­ÝHTRÉÏôOmyˆú¡@“ôtêC’ ]߬›:Íͤ§¨é¿Ö0µüóÙÃ?›·‘ú19 £#¿¿:Û±µÃ¦˜¨”LE"mœIêд&·dóÞöeŽ5ÇrJQ_`×ϯ‰zá|¹ž¸%èÅhÕ4¨ØA•Œ´eº³·…k‰¥Äw܍ø 2ŠiÀ#&‹9¹ øëÅ%.¾¸ôbìû=]àlpRJÙÄ°àD|1ïÃ#ÂðS´%‘z×eÔ"äH¸ñ]ªÁ9aÐ퍩__u•1—l˯`tvHØÔ23Ȩq°»6:091µø͜üái£šðw]-þ:|æÖMð×lÆj™…–%¸šSM¢^ž™°‰ÓÉRg%4^ô*ö^¶ãÿ›'ãr¸²žò5ûœ? ãç:L¤½]—9šÁ«Ù©yMˆLÚëOú¬•&’=6g®iAXÓöÑޔü;Ï6Éõ¶¹KÔÛZ£hfì3–݇‹ÐYý½DõçW~Ö×%}æÒ/%:é}ÎÆ»û%Eb¦ÙÎÑ`(öën"¾xoCy?JO<¿­Dãmz⾧KTë½uàom éƞ  û®àˆ$W†ý’ˆdLÔw«¦1Np¶`¢Ûé˜\2†÷C‹=yxO!CÎþà¼võB`dçO?@~O5Þ¤ó²î%j£BŠzLŒâ‘\Ê^5<(é’Îîe˜¨]êö)zÊ4ðÍ&~œ†tä’áÕR‰Ä*©­ß_k…U#æ(öøg–t³„£Ðy’ŸÈÆX|Óà'ø¢A?B_Îmȹ0 í(ö#òOç8Nÿ Ñ°pògð1øIýãüK¡WH4iúð#j½Zä‹3’^j@ü› =M8 Ô,I¢a§K¿E‚\ÍÒWccGNNMþiLÖ¨ßvµešÂÔS†h…Ñ Á¥©_8W"ä/ «^„€}š@`Ö,aþBWÿÑP€ÆI|ÎÎ}Ÿ]†$ùŽà®9Æ%4Ñ(µã7­êՒvÕ%šñ¸C¤X@éبáà4¿"89:À ¥ÞÏ'û +ZfÍÙÙ<Äú“¦µ$þö éÀ°öÚúA¡q©³444ˆ½ÓÀvß°cCÜÂ@£(Í¥¦+XADϺòÎù–¤0=FV „‚{”•Ü}‹q ó38ÄÒìXc÷-‰FèUœ´º +}Çc|0ØÒ<=¢—tI†=o#k#š@jb/£Ù€ÍË0´Ð(嘗EÃÉVìÒ¢Cƒ(Ms+XÐo®®iJԛÅ-×ÏëÀ¾øqáçR0±§ò¢DŒÊ¡6Ù~óI(@«V-@ô¤ô*ÞÒ4©å`ÏLWyfbº‹÷ü)nFá:Ž¹%aF™Ò «1Fꚟyã7{˜rì<‡&ÞÔ‚©ßKµ›.I|JÉáß áY3ˆÓþƒñ´—û††G1éÓ ÆIò+Þ3%¿Þúg¤‚; +Y§_€T¸ „¸?ê+ÚÒù?ÿ˜G9Šþ‰m2ts]ª'*"`{°Mùƒ³eH’F}>³²ÉµoÑãÙ¬r‹ u^IgWos°Ï¾"Э2Ÿ,çìþu šÃž.ܒˆmÑ#¬‰Ú:n¿]ç´«¸â u2“ë¦9 ×Ê#ãtpuWšÔï·:=Ò,з ۊÉUÙ ¬ŸÏ=HдGɕë]Í>cØÞšmÖ¸TŽ…îK‘Ì·Ùn~bÐ7iˆÌö2r½7’¹,Z{  ø§¥Bòë3þé2v6ÔP/·Ä×G­ M}úAëÏMqÄNçð¯.“OGio[gO•ùQ5@#„ýqÔ4[ñãñ·¡r+†0„±ð–)ÇO0•Ç€WöÉ\ÒsI:œ–ÆIÍY‡Þ  ­Ìƒºç`[&Àӌ%~|-ä“Ñâh€èjÃÊ2ۂãªJC£úN׏LÛxëˬ ýškKp ÿ»c²úʅ’³¦ GӈÇ4”ƒVg¢ä«ÌNæ@Ë}+ÙÆ._BG‰œm éëìfýŸìNÚÆØHà6Vèî'µ<-}ékèb™C +Áã¸Tx0¸_jp˜ÓÛØí̦ŠkôJÈPÆÎç9Qì8gŒ„~/~ÌÒ³MÐBs¡á5ý£9Ò©œ†$©u§ŽÚHGyfµÞ½¡ùH7§H•û´'׶ªÀ­mY]$ôÑô3ÃÁ[t¦,ÔñCr``Ž°_†û€ öiß1‚yx-2{wÉÕlüî!×u„—€«Êû{˜4ì«þˆ;3Ï *“!ÐXÂPöü3S³ã;á1¿€4lHý€ÂïÖÄ#±†.ß,{Io³mK|™>‰jÝLdß²}r圑ö·'©ÀÌ»=ï•LP©¢·€¬ŽÔ„†¨ë´5b¨ÑuÒ?€dÉu@kI F«òPºÅâm÷Íò| ÿhk¿¸ÚDaõ€cµzʘM¾ü¼ƒëµ&ñ¦ö|fP—À2/Ô¾s‰¨&½u›•}@²€^íÈ÷² +sä"qùïç'´Ô•®gIéNÎ$49Î{^s¸¿ë}³¯Ð‡4ç­¦Éÿ1 Wx€Âóq…üy¡Ex™±ìºN &½ÎDÍKô³›³Ißû#… —‘H•CsgKù—ÔIb¾v6õ‘jÆ…â%2¦rT÷€J}¨‚•Ž0µ‘b ‡ P¸µGAžrK­ƒ lÔ¢Ï÷Nr‘ôºäedj-uú§6Ú¥–¯Z/àoO%±æwKj'¯²›îƒå»î›J(SŒ‡“{\-§Æ1ďÖàJèxÂߟ}¤‚#{¦;?ëx$ þõu  :‰ÝoÅÄ㨠ÐnaôÍ7;|0¬Xc£è»Ï-Ä%ÁU"SOøƒU¤OÓ?_§")2¨Áæб–JôD*¾¨æ´ïÎ|"h_%xoQ¯$Lñf=?&"é36 —5¯ñPk¾ˆöÇ!æ"å É¸Œ&´d€—>yӝ+©ÿ±#P"ÙuycŽú³¹ø¡î0K…$ôl“9ÁÐÁà‘?]¼ùS¿`À£¾Â%m«Î¬ñÐÇß +ÓÜÁ?uß+±MQ!!fß®RrCN` Ó¯í¿óÁˆ&7¥ÐSÉU.éÜàtJ[&D&bÔ¾5GvÉM%ê½fš¯Wp¢­ºÉUØiÏ󸺝7õ#°?l+æOýQöPãGÍàœþÙm|çèƒNm"õs_o£¾ú„  T½mûoépyW¿élômôŽ ôO›Ý7Lò³4@¿¡´h§ç‘4$.f¾Àt› ƀ÷nM)û‡ö3éÖxlD÷|SÒÚø4³c0'K×mx2 ¯µøE†“½‚Æ9 \uÈiB‡Ô+QÚf¦Þ-@mµè¥Oøke¬Cç3±Kü\‰ˆ¾@ \Ã0¥Ê±•Íî^¢^שmY)îh8€‰8Î`;×· ‡+F|Ö92ÓÎћŽçöúeËêz>’¡²ø…5‘Êa~/tY«®‡‚^%¢Ÿ\ûãZdiPVŒxøM(:ª!ëOäÈÌ÷U”sFGr½Þøv>÷GqÏÍr’™8"z\ɦ@úȉõxc%Dr$ª»Ò9m©f´µº0#gÏ„F—™¾úúÓjkõ‘Ȫ9Þã?äª%dN‡6:0ðÿ|\‰§”üÎ؄˜†²oE#Üʘ+z3 áÀ*tŽÐïEË`?µ5a“D݊Gք‘dhFAçC«Il@°—©LpD0ÑS7ÈÊJ4¥w×±ÍèU·/5¡¥îÒoõݦo÷·™D {:ý•0¬Í”³±9…ç!Ý̺jÄQGJ½ŒMçW¢ó’Lö ì@â·û5Î%pçÿ\æG¾ ޙÒv쌧qŽïà ր&^#ˆø"¾F,p©ÏäÙ؇ŒcD h%”µ\@I‰”5K¬Í´å1hfzy&VÛ+dh *úxLΧí<éYÍf¾f£ß øc©\ê·7{…VØk<ò夋ÅÈ+Ïæÿ,LŒu™x¸ßê¨ÿË u—å0B¿»ÇðÏ>Q]{[‘¼lÁ{©÷ôÂë{X.ßK(¢S˜I¦!¦S2²ŠS´„¢dډ²9>uæ÷¸ÿ5’ÀHú)m¶‹d÷ځ•5AšÐl6­‡\cÓgrmuÖ³ín{ Öæœdýä+ƒÉ…õ/¿03DŒ'ëÖR÷\­¹ãX:Åd"`ÉÃÑ-y:!®ò¨O/¥úe€Ž•œ&*ÅŒç.:.Θ¾^ÁY1ï…Ç­Ý_ڞùªYp·Ì ÚÈýďµ#ðþÈרôþ(aS"¾EÆsx—™úŒÞdÙh\ú·ù/3χMZ_@(zÀÕÚnÆÚ ,’ž–ÛŠ±Àr`Y$êé“Éw(ŽcïÀ‚6ë+âä"d ˜ÞÓÐê=Ý_v4ˆÝ(Û„ÌpmÄ`¸¿R¿ñ™5_§Z<5ÀáúúÖ†b2øìZvìüyº.&–ÐLõf&õŒ—“Ô]¨OäfÈÓM;SºAä~A9E¬ì§ýi™ñèϒØÆԟÄÈÐwÁMñ.¨Ø)àÃA8_ÉU}¡vcf3'(Ý0%7 +ŽTþŒÃ7éäg²|!M_Q6”784gÊæ ؀f ØKõSfÍh Ý^ldzÚà¢uËA‡¾m¨ÿNÏpˆÿ'Ê&röÒè>c…åžùõú‚ +7vG+ÛÇôöROÁ¬Y˜³ø™&†ÌÄ)°pð]z ’4Øúq¹W KeîÓï~Žó<§Ef¸ué"λI<¿WjÕù°Ыôݟ‰£då gU¬‚Đ^ÎO/§åvö2[ÂÒp’¬óåötžƒEß.æۗÉ|¹y©íÑÕÌÇí x8?¾à,xi/`<¡üÒôn…jm/Íùñ?óí €¨àÁiþ’ÁA[^Àsæé ç´ÿ¿ÿlk»ÜâH^v3ò;ˆ~óRÿww9…ïfóòðëÿm{IÚ^òÛ4*r£†§Q{ÖÍÿýa§Ü- þŒjñÿ¿õy¹˜Ó£:ýïÿ̧+ô9”Ëv2_·°.ýt¶I3<͚ýô¸ÜËÔWÐ+BŒOçÖ|¯VT°ÜäY2èRï2E÷ +FîÆKrŠ­D·^ý8ÞïÙ«„…ßô JPéé +K_.Œ-8¼a95ޓ÷ /™Úá*Ty·ÝMaGäyz÷Ÿ-Ùð*\°Üæ¶ûDD DÞA ƒ=@Ý· Eàçn½”¬‰ä,;öⒹ5G¬ò/êZx²L}wÔ©Ýv†ŸJÍ0:X êQln +b?ÿP\ªOÿ¸JVþ÷Cºú†e/t%¤Mýº•ï’7Ëú$°dãÿb—1c 'µÜYˆH›úïe3َ—k%u™Hýº ŽÔÖmœæˆu¼¨Ö啛x}Ž_ .¹ýØ«~ÐM?JP²»Pµ!~ð \O-·§nª–ž?ڌ<Ü´£®äÖ%"‚„dºù-1Ù1µ‘‚åDŒäG÷@µà?;À󌖢D'¦ÇÝd|'ìœ9<Š®0óKϔ»úW•”Nêjë»HT}Xb恞s^þ,™Š2‘¡+¼åJ¸~S˜jWǛ,G ¯Ô=%<‰¯ÀB× _ëÏý¥²+þ=’”€Ü÷´¢Ðú H«^OüÓOŠa…Tü”œ(O$HÃñ©¬¬+‚œŒ~ÒNKʕ9ÞÔ1@hy(a‹®™¼Z` ƒwHM16**$¯.p?Þ25îL9àÕ}ê¿»ÿä–xé½È{[溱ÖÌf¶`“±³‡}‚ ´îÏêsÀìRNìlæR&ovà <Ÿ®…ƒ€m"HNDö?çÊ»sø¹øáÜðËã|º(֏Òõ´”öøªêN–/¢KÍá=Â"U3çÂ4ü9ïªÕ°€«# }šùà0³Ñë%è[§s˜"z i@?TýƒÿJ¸îÑõŽüæXsbwØÍe«9ö{vÃO.Oä+äf|1ŸÐƒ°;V?'Ó?Áì*§©¾a„3ʱ “S²¹KA˜|ýVét<†Ou€Å’wØ=5r"ìØNâÜt v+c¦s"Ôî±ï8EðÀÅͪuhêäÚ¤W6û)õá?ðgv ~ÞIs±~ûåï/a¬YÿÀÊl‚XÚè]æ!f±ú–Åì›0ֈÚp<9ߎÂX?ßžWWÈÄbhXÄ'½¥lÁêý5ŒõŒ0VñÛq-„çúJ `r›¦±_—„¦ë ’ŸVŸF»=ßE°vâç£ÆbU¡zaqVÑ9 ú ÖlÎU¥°«­VÀ‘“ w]a!ïñû-AÄÆë¥5tܽµÓ°zvW Ur$)¬Ÿz=«×»îY¬C“ˆ‡Çþï¶.‚5>öù ­Së 6ªŠa…™´Z·!ü-<݈ºÒüΫÂX¿RÆèA») a5‡×¡(‹® —¡L±n¼"ŒÕÓé8ˆ ãCë+±ðk«WE+ŠÊôû„Èt}š·Õ¶œÃ:vd-£¦0Ö¬#¡Ÿü„ áù¬±Ä(¬«Gä؇睢pæ{Ep°v#Ž’ßê„XM<¬Íé57ßùªc« öïùl\êuÇ"X}ÿjF Ä°¦eS?ˆ°"NãM7ÅÿŽUA¬µ°Þ-Šµ8¯¹BXÑAàéYµ¡ñUhº§×bnþÑë ‚X›úíBkí÷k4AXšëéö²ŽfqÆZr¿5ˆxä]ë¾ð*„Jhˆ¸9̾žEˆÜ«8Z±bZk9š¾ú}A¬ýÊ*°¢óæzºïŒÁúpôOk«0֏¿ý¦ ¸yX!„x˜·nE‰||«™Õ"X; Gf¹)b |X_Õñ¾VÍt¡ó\†þ!…uâ6ò6±[›V—>jÈqçZrŒL¡Äja±B41€ûw Ï€÷#ëi§{§°žcfÞ\Õß㞑Ěì8ó\¡h9žQ5DÛ®%Tފ¦ °¦ÎWr1÷ê#±ÆœE+O(ZöžòäqkC©"ŠÐPˆµÇãx²…X<¬Çcb¾£Ù¸ æa=yÿBÔÉ }Ùx~ÝÍGuR³í|<ôq‡•k軐èÓΗsÓ{úëȍÞ.ìÓëƒâ´Näç`tæ=°¿¹Ÿ÷ÔpëÔÓÓ*p½=}Ûß׶Р¤„ü̇¾EŸ\¦êHüéïx g‰výBÂ¥ëNEŸ–ÌۘKüé¤òfŸò‰æÓT^§“œÈÏ9].Ò8‘Oô‡ ï· ó’V[œ¯¡k¢5&…ÚVèRâ¥Í«£èÓÖÛÄ®ú½3Dxaô6ðkEŸþ?÷9ѧ«¦+ùÅ>½&ÚfEDb?cú +{EŸ\žh[‚hoÓí¤Vû¹N­Ë›DŸfåÉ\ôiÁ{uJ-¡vi!‘§Þœ#ón¢g2„yOÍõ¯SŒzš²E®¶g®>ʚì ž“ÇRåÚh)ÇLßKQ¢hô¶†O÷”ÉJ ½¤JîNä'®LsµÐ +M©­…`X¡uø ~G¨-éj +þÓB&cߑ҂B8®&i)x|uéß?­”tvWO‹jÜzðËÂíh +a;Ã^lõÀØm_€œ}Õ„?¡Æ¾|Ÿ zÍ/#›•#{0ëŒEŒL!¬> ´ƒzÂX=®(Vp¦ü9ùz>]d +‰b…gàT ë Çê©AKCøHÖ0¬3NÃbE¶ƒÕÍ£0´ ˜¹f׬Æiââˆ9D~w‰bE¶V`2Û`Àb…³áL·/ŠùäÇ +mQ¬ 4~…§QÛ¤°–ô¢X‘¢ÁbER€ƒ*uÎÒ΃4~ô‰Z cª;Û(yopÙl9R@äUŸæ0È´+²ïy)î£äFÌú;A‹Î«M<2l ª˜3'J\Ž”œÑÕâ¼½sd-ì?ѽaV§lz(ž(¿@toŒì#ÌiÿÐ8¢Ál/ „Ø8Q»Y1EáfÞ¨,å…iÇ4Vë#ó{ߓoñœU@&í¿óôóOצ)[…y9 Ñdñ  +1ÚÝøßè ®{1Ñ"µzJ8csøÔqiȸèÀˆïÛú²e‹gF kÌ󆅏ixÑ.[\ú˜ó»ñˆˆêPtö/É¢áá?ÔðI£_`†zµè áÚ0“Dÿˆ.#½†µWù5Ô034ќ&4I¨×6$è¥| wˆK)ÃC!½$ 9MÉ?B”ê%lOÓ+l½‰¿XæâÒ$e¿·S_ô@åéÒ ý0õ]Én° MzD4zq¥ñZ + 2\)ä•BH¦I®Hæ;ÄiÈ šCC)…„É7È Í†"²Èˆ, ùE>çV˜|«ZTˆ‹nOäÀœ\çõöÉqŽ54?w¬Y/ˑ;[ÔQ¡Á‘¤Í¼yqŽ5l^óO›Žb+™šhš»›¦$(l‹¯Ñ—ُ8»Œ:0ºvZd©,{çX«Ï¡AP1‚;iã?¸wæwš}p†F ahN¥Ð„@!Òãa"ÓõJ7 ôçøµ}‘\PÓÒpZà?=3â¸â & ™¢Ð’B¢á« +ÿ«Êz°¯̐‰× RùbƄ ŒœÍ9+8¶hvr›fÜ1?7ìWÚÙõ²`FaÙ|½,³¬œv¦T +­Ð-zR)Ð&ٗŽÓ;‹SÐð¸a‘³,¹Û•*A)0Ër¥¶½Ê;ö,–Ó9V?=+UjDJt=0&qE^>òôT°ŒA­´¶!kp–qû&©mÜ°†ÙÏ Šbè Õ¶ +·§"hÜæց1Áb +ZGÚȹeš¸¶÷8цÇg+Ýn؞ç³ùWÖí9zºSsæÆoÀˆrB£˜®+xf»’í_µœLôoáíyŽ½>o{&Ûímæ4Ù½ZÍŒ¸”Xê ƒývu^uJmVëä(zbNjYƒ°Æ˜ã‰á}#¿Tѓ´È ÍÐ׃‘‘ŠFÂ×:ï#‹ŒÀFBYÒf‘3k‘ƒ>ïÞ ¦;Ûäæ/±YC®þibÃ\áàSò~æ "î "ª¥4AI"²QòÒº¹oKs§(à‰N¸÷úç7é“Z©(ȳ¢@±_@|†zT§¼ê²„ç(òž¾šyÿò04Øzk¥ÏÎLÿ”ee7ÛNÐ21ÝÁøu+åR:è%E/å›]Ô,"Í(@¯7;‡^ÌfG¿pkƒ+;w§Ðl¸›]Ð8—÷Eæ}UèL‘r:øŽ\þp¤¹|gʦÀÕïELgyG.˜¶¡h¸Ù£R€™e¥Ž֌â¦pážÔw8B3\hJdÌՒ)_/Þ)+â$¢ô41¿Þ¦ãĝ‡œD0 +¼ƒ<¡ âہò)chLˆr\{Žš¿ðÕlÀ âþGZB+д!¥‹|5ûòQzћôˆ”:"ܱ†_Ïc ÜZ»éh,ò´ä;÷MèË(=9yv/²§!{ÞÜáÆÞù¡Ø”ÈžÇâƒ÷ˆ‚XãÍË×Óî¤ÍPÆ¿O{ ˜=*¦æñN>¹s Ws©Ù`‡Œwéñ¤8/ðŽÝ}8C§Àˆl·y˯gÝ® ¼ðªâP&€&æ¥rÑR†‡˜—B»a +T`ó4‡8ÐÊIŸl¤P×ؼm8t„ôèV$¡0' …‘зºý dýÐ8ÆێUn”QOªWM¡ŒØ§„'R(͕‰ßHíGÇ„æ²Ý)Ñ,`Ò¨I51Å4tàk|évZ¯¤ÛiÅ*nÂΔ Müð¨tk°Ò1qoÑïùÐä¥ë‰AAh÷K7v{f›»'H7°rBÒív)Ý.Ý®½$ Ç¥„ò„(.$N²$ LȎi6O~*5wRv6V\<–*/¯EW^uøÝ£¡\æ¼ùÑÄE’B-v|å,´«)çýmB@kªo’¸0â!&tïL¨àîê&²¸¹û=j X9^”¨°‘¤Lñ…Búl Ç³*³›ȗčá+tK …"´g8¹ÉÃÌ]É;Á×ÖG´ŒUǯÕÓãFa»¥Ôù…{9DÏÇÖMÚ¿ŒçB{\ûÿ>Ž7kpån÷€ kÐ#Ú?…98Ö í_ +kâŠRz>JŽ¤°ù><|>rÇ!?äL¢_?%Õ Š"Á,/úôä¤f±©¢úÁð(±,85-JBxíö#Nn~Œ@{tŸcØä2ÙÝDS¤ Ó«‰Ðˆ™L`AmŠv¼D6HÚÄÕÁ{2öxce 2kHvŸñOª”ÍzuL¥lve¶§‚“Ê•lÏD3ÅSãÄü`l.eÔT°É&§'¦öh¢±Ö5¤4@skÃÅÒSœ)€hþÛô‘DG¸šC›2Ï- MdÛw$3}I¶PýCûþ K![\m2ú&71{ÀE½å­ áA­ªÛ;-ÔÖí×Pmi2jkÂ=€|¡Z>yÑÌãå|ø±v]˧â-Ý]Î']ËGJè'”ó‰bEµ|*ÑÒÅËù¤kùTxéâ#å|Òµ|\uðr>éZ>§tñr>éZ>•DéâMå|Òµ|*Tºø„r>é÷TTÕ÷Ãå|W;˜SËÇ–óI×ò‘zš|9'Z¢ÒíSOiâ™÷âÅH¼$cv§åsÅMʊ¶¾%}wâmš¯ 8;ˆ{i®pÛòá‘Â4? änR…M¦åU¯2ç¾AIQÚüoޔó·ð"…RФ³¼”͐ôÊñ)ž!ÏÑ%°o”Þ~û˜«"à°¤]Rc*ÞC³¹©~O‘ØÉðòK°¬¡ÛʸÎ7å—Pùi‚)&·»›Å|ÍäÅf»·:VôäkM®ìŽ›py«+‘dh°ðzšÉ²;±°ό’+»7b¥£¸èÌH¦˜pìW9+%ë£Pq +˜•Aã&x9¯#>×A¶S™ü7YÆäö3Ž'nñT͛Š^U¨ +¯¬°RÞè%gõ´k_›œ¯qØó<*à· ÁÝ{‚^YQuL´ W øõh²ê˜âšÂ‹læý 5…Ùú ÇÇ%^#'^„#­f dÞëß5bÊ ՌŠ¯¡|æ½â´„Y–ëõ\C•ÒšÂÀQ®&GŠ#x)ñÚÓjVlÜD´0æhòŒѸnÙG‰&[¸ª|š¬t»h\±+ÙîX¹IT9^:¿J  L™š{å*¾¶Ã˜=_ñuJ—îñ`ˆX½òi#×À ÿIîóœ{5 +eìÁEN±=(à*òr÷¸€µV1×(«Ú»k•†ç ­èoXl'ïPý#éˆåq"vÞ÷KUëñr%("¥Ï€)IßÏB¯2 3tº*!0¤Ï +¨ŽVÄú/›/HÀ–¢(™Z½+$^–u<àïÑÓòJ÷>»ñÅõ´¿üm¾ ñŠ¿«ä¤»Iõ+㒠öAÜè½áŒ‰cßÀa¹nñ”HŒ‰»«k¤ò(“LJ¼|yžÔ˜®n±ñüÆdYÔ3¼7ä½y4 hÉZÞ:R(S ¤ Ùtxop¿@áqï `J¹¡îïêªtñqï ¬‡ãyoxÊ­òZAÏMÞáAAA²ê X-6ž†V–"›”8¸Št‘U¤%rՕ(ÒîXìQÀ*é +É}ñ9¹hmB_úçx€ÀäB¹ b%õpwfÍsÎXÉ&¡Œí*B%Xº(Wâws‚®@2,*ñS˜(Y⇳òTŽÓNŠ’÷kaÛ×:%Ó?¯ïW…ß)<ùèو&==§2¡yFڞtežD÷™•y‚iן›gWæ=RãqCežd2ìó*ó»ûÁ­¨ 2 ¬È'!>P™ÇMµ¢¤vežŠ—*Yœ÷ìÊ<, )˜Ý_™Ç z)H鼯2ïÊZ‹ Ášº'þÃ#ïi©—7õRTëT’zÙÜ)J½”•§•ûQÕ …r.”%\ʲȲ€B@JªXD¡Pzô„‚²«Ü©Ì{yéëüÄh×ùÕ*¬›HŠµþ`ºJ±Ödƒ·Å]Cíæ#û‘­ÂݏîGMòA™&º;{¥ûQJU‡4¿Í¦d·']uŒÝ¶„M\è)u™i»ÂcMø}ÇbW‰%v_ßw,{כ͋⎌–k—¬‚“¾‘JÖìf|6?Î×{ÓN°Y‹Ýš|B*(kUZ$;~(ñ-Ȕ>§Höûð¤"Yè)E²°níñ"Yå)E²²‹®yv³`î Ú(âWÁޜ¿d´Ò,Àݏí‡÷#¯(OD¦=»(¬#ÌzFQžðÚ<½(ï_'—hÒ&þ-¶çEy¸?¬ËûWŠò„ÜÿBQžˆ?M¡בÒq¡ Âª¾úM‹Urû=OOKÙdì&¥yd”W™RãB¿ŸïVÍæê +å[#*¬T¾£0$uó0ìBg †F¾êš_â÷-zÿ¬`\ªÇ»“a+=‹BjP Ðhå7»nŽ‡iÍì’!‚Úø€¨G?3qûY¢ówP»õt7sŒ'r¾z!•´MS©¤½Û.Ôöôùô¶æšòOq+„ªßEJõÄ à_¡OœÉ¸ewái¥Œ;­1¬Þ_Ó[D½S‰ûy:m©²»™]«ƒ¨'%‹ýÞ*ËòX ëHkÖÄ°ò+ÂBæî¶ã—ÝyÚ¿%¦i#¯íÕ Uvç´ñ°ª¸} +ñb?ŸFsð]¾ÅÊîzRÕo™b¿]½.ŠUWšÿÎÄ°Îeú~µÅ±f>zYQ +k·îðP +Tn¯–l]jâèÅî!…ޣܜW=ß%E =ÆOò=ê0-ùTÔƌŠ—5ÿŒ•ò9+Èïå*·æ-5N”éS·{Nq‘‚dX¾ƒE¼§×AÁ˜ðؚİäò`å’G(÷™íõ„Z®¨n€Qà‹’j¯w›Û®—Vœ‰)SœIÞpyCî \g=éÜAå\%ÓYOt†Wñ›´‚F+Jg¨ »‚bÂËõXáß÷@S½öMv.ޏI4µViW>ñ=…}wúln-ì²h·Ý û”Þgó`aŸñjß<^Ø'TÕ§º·S¼°Oȍ/’àÿHa‡0Ôæe#…O+쥒¹ÌäŽÂ¾{é û„â<ìéù´Â>¡ª>Ž_à9…}BU}J³†n(ìòÒÓ&î û„V˜t?µ°OHåád©>§°O¨ªO%rµþ…}×cúÕH(P÷ö ©­ˆhÏ-ìZC¡T« ûø ä;0ßUØ'ªu>·°ï¢=RØÇuaRaß}D»¹°OºÒëi…}"UßÏ.ìÑ<¹°O(ØÂϼBaŸ à™¸Ï(ì“ ¬<©°OÁyóŒÂ>!r`ªú³ +ûd ʞSØ'TÕ'œ2’{ŠhemDŒhùÛîœïivÝÓgF)®¾:Èl{ý=;1•ã.~Wc:£0ѳ»øI¨ÊHu6ëo"K'nÂ%,•Õ6ò§4B%RŽ-6,ޘ” +&%1,nlë®1!¢aÝÔ§ZjL¹âÂF‚T}ªEä':Ö¸&SÌY8ñL&·6¸—é/íÊcŽ5Éþ7ÿSawt)Ô×ïiþ'*l8ýÿîsí›J¬ LYMŸ¢œ ™|h¶ÿßcë•íìUJÚìH:µ5ÿ“wBBÚ<ÜüÖl¤ûÿ=ÜüOEVáÉôÿS~ÚŸqG—;ÖpJ/ä 5ŧ¥?틬:.”ΣxrïF¥\*&‚mûd3å¸ôA[Úy¯¨¦OI5D#Wï(ž¢¸Ø¢‘Hn¼!I HÔYÈcheýÆjž_Ò¯‚µJèV+±€Qössg}7Õ +°–LºâT+J>?Mqª€¦0‰\:“ Âçb>I½%n=§Y@! E=p… à‰cµglEåªÌ^%XÀ,_i )ªöí|Á¯ö­m¯«}kÛ'^o¡=¥ï3Éi`¼J~˜‰R³.DMáµÁM©¬mÓut^§lKìbYÛóÓê9…1ÌÍη«× JEZ§’RðàS<Ú¬\ +4njî-ƒ½èÖ1H(’é£7zÆ5$ G;|“PèÍȞž75#âUÏʖPÜ,6šöcSA …2çýÃ}ÿTt½§Xë¿;ö£@¾†¼L{Jß?qUjý÷ »Q}ÿ_<£ïŸ‚<›gôýS1 ߏ}ÿTÜÚ(%Õ)÷ôýSIõŅ­ÿnïû§øúvX‚õxµï÷U~DM\ÅÕ¾š¼òØQrվ߇;«}¯ +1½z›`±cY°N›Rè!zåå@€žR`Zv(´Öd‰×çò +©J¼– +v¼¥ú^¨Š^…²ÂrµC™ÅPàSѽðÖR))¤Ò¿øÖ*~¬)©¥âNSÆáʂb×F´–*dPT>/iݳÛ3dP²=•Réß·|ÅünÛ³}S!•hrì+)qøÞ¦1¶UTeñ]x£À½í‰æ)u·)›ø¥hȾ¹µOßMÍ05%ô´ÎónÕê!¼'ÕÝvDoÕºC³™œnj†)×@Ð~gÝ-¶Q™Ô•‚rlùº[0&ååØRu·”».FÉ/ŒÖ aí]^9SI{¡•ÖÌ Ð;˜Ž™kõ÷ÝÈ쟲Ÿ¨Ôh3—>úš&"äÆ|ÎÔ'N=àG¬ŠcåTæ4'M³ó‰{¶¸­éB©^G¤2Ï(^x¼ŒBNž„æ•:Lb…ˆ>Ö_5öÅê¿E±ÂÙ¼{·ètYM·!ŠUŸŸØb­éŒ,VSPÆùÓë°rkäNz¿Ží°èæ] ±ÞZ+@‰ÌïÄÇ) ó q +#Ÿ"X}š7ÏGz„ynùÅyC ¬Y­OköKÓªB½ð9N©'kUªÃb±)Ž5“iÜÄ1€X _°0Ÿ¨ªÐ‹éÝÎe‘÷Ü)‡è{*¼ÞÓ12… +@šC»s†=8Á¬;¾:Ê{h×÷>êS(êñ®2VãíJŠˆÁæՏ1ÞVÐvÝÇãNuÒÕTª›*½‚7]ŀ‰_3ËJùœeUuΘ° +:ôíßëWZµ¥*üŽ.‰ºD¹Ð2kˆògYùR!ÅÁk­l³s4¹FBú«’_ h¼SæA¢ÉV)Ÿ&7ú(Ñd[ +ÝF´’ç[ÚU³ÚHíΒD¥õˆrõ7ò…jŠê¥Râ”$*­GðCßR’¨´‘M†½«$Qi="éî¾»$‘Ã/VèUÎím%‰JëÑî/IdI*-ATÜJ¯[K•Ö#²–ô]%‰"cºªGäÄ=É]Ïëñf…*åMêiVˆÏæ_lVxí~øWšªäšÔ=§Y!U±"­¶<Þ¬Põϛ€¾øôf…×n»¥Y¡`Šâó›ªõ÷|¤Y!Çý‡åE%¹Šeñn‡Ò…174<”vIÈgÛ)lx¨ìV«‡b“{Æ­Vb óº·á¡t·C!'ä] ¥]H"ûí …YPúV«;*`èg4<”N7a]6<”-({’X²Û!}Þ<ÜðPzr|/ÇÝ 9#¹êvÈñu>ÒðPzJ‚É°÷4<,Ž”¼¾]9mWïÒþ´‡Jß[ÆFØlx(yò¥Ècí ¥½Éª›.ϒhx(m §]ßÑðP¨j“Ý‚÷s¯á¡4)÷ÃM ¥¡ Á3JÇcX÷à ¥‹yUü"Ù{ +(¡X·CÜZƒRã¼ýèàv;ĕÛ;ªcLÃCùZܧ4<”îvÈ2ôƒ ¥S¼1åö±†‡l™G²Î”ÛJ.®JӐTnŸÐðPbϝVn…¡où†‡ÒPêц‡Êû>Ôð"¸n.%¹jx(Qr!ŸÚ;¿µá¡´šg󔆇bÇzS y_™]Ÿ HÊíG¹†‡Ò±k^ZÂý ¹ç”÷¨ê‚ ¥¡ày65<ƒ¢´ý®Â†‡^1qr[‹Â«"ÙÇr<âWÝÉÀÊ2õZ’½Wnx(­üˆqÚÍ ¥»ª¾nŠjxø¨wPaÃC%µ¸Ohx(ÝíPusŸÂ»Jƒù¢óºááý¥úX·CÍC ¯]Ðx·CFBß»醇ÒÙcücíÒIT|ÔÝ Öëv(J´[>àëäíöÂ+1Û󁆇¬êvxŠ"¯á¡$[àÍOkx(­1R&îã ¥‹téCúᆇÜiò»^ëiŠoáâ6<W(ÍFæ.… •i67<ÄWó:$\±rGÃCé³B<‰üƆ‡Òg¥ ØŽ‹®”îVi§‘ðoÄú%o‡äŸžàkq°t¾?¯ˆ’ÃR §±áŸèû¯Ò']Y.çÌ´íXÚ8앹!éÇZ-Á2ŸãÑuúUƒc¦ 6÷>´{{å'߂U]jm9š·9 [µ}ÚÛ{ÜÇß]÷ƒ_ “Áº1꓇¤#·øHh—¤Oý=ž¹Á§QüÍçtåÊ¡ê=¬:°‡ßkóLe¢m+ڎjo)ë%««FlV+ûZ¿õù‡÷Ð4Ì´­„Ñ“þ{­W‹«Ð:ÒÞÍc†íaè?¼ã[߇ºõÓk݆¬ïí§—Ï/¿šžg÷=ÑRU›FõZSm3âj×âÐ4GÜú¸ƒH“âgZpd}ºêñ8 +Ž§@+Ò |““wÒûd*?ëæw»µes—‚¯tޟýxúÞÁ|A © +ˆNÉk¸[Ó¯=4»™™°Ýæeä|3%⥂½9À„Ï:´6n­Ztº¨ÀÒ0ÖÏ?5Ín=ªÝí„ÎåY\4ë™zk[ t¹ªúbÙ{>`B\y‹*$Õ ¢^shç3Ò/ð¹ã*ô{Þ6“ûLaõ{¬—›qB”ˆúÞR0w0Ý%æmÔb4Õ/hr™c/2DÀÉQ¹•Jf\õt:fÙ÷ˆ ¦v€š.Ù_Ôà4¯ü°°²3ˆ‡Kê#šWb³C (¶ZCs¦ÙÎÁO`Οk,%¶æÔÛ9"ÓÊa?`~ÃðLÊe»×¦§?9 Èç hâ߂?ý&T‹ dO~þ|·ÂF£ÇZï¾IÙè_v"ã*ܜܶ¼]C.ŸwZô¿›Ìtu:ìQ¿ Ž®ï4¥œáÔrlw‚ïfìÁX›zhèg)+û̕ì6bôƒ<ƒ°ˆ#´jó¿4m>Œ@xìVÎléuÌ|gf_†¡ˆìÀ6ežY1@Ù}È¿³Sj“÷Ã+6Μ¯äƒU–fw¬¡Âñ3nb†8Dîðat2}ž¤ÄP$ Ð ‚Vù>+vȨyè³áD?rkƒ›3ø³ç¶—k+7ømÝlŽj"øÔ 0Ø6{§Äf„¡ŠøºÖ´}х[}ƒˆd<¼ +Tx8|áZ/­ú2r9†¸M ÁhîIW¸#ÆBà+Èqý¼žÎÏÞՔÔh]ÉÙÔ]슸Œë¡†â¥ÎØÃÌ~ Мƒ[L*VÄóOvŠç'm‡sRÊÁ§ž“bÚÉÀ…lϼ ,Ùdì¦?Í<µ¾«*iEŠ)ø³m§~¾ê9èO'3œ 8ôJQj8«™ߞ×@íCc¯è•oÔlVÚçîdÀÏƟԯ¨$×M3#™>¤ä”ØÈX +æO[¼mcF4¥Xæámp@‘ +\H®Öu]LÓFß©ß;0û¢z†Úiƒs%FéïRøÄxw€;ßې&. £Æmtì%ƒŽÄPï2n’~Èø°^ Ü-Fê»ñÁD}·z5ƒ¥šxÝbƍI“ NÝÂ6·Lcp4™ ð1Ãçîúr ¤Ò[ lmFí#M”–æðºñ‡ú +Ÿu¸×…صi«wö ©ÿ“­úq¢­~ƒc͓å÷ú†–F´‹"V“õœz:H*5}5JPÃ7”&à蠈w›9Ý×G4h$E†¹¾íõ¯¡€Èä?’—ý•{gŠëâÄé0­”ŘAOށAŽÜµøâ1”(ÜÄՓÅèbL)ϑPiΚ…AJEÁ9↉àùz²6ꁉuteç­»ìö”˜ˆ_‘{Xۀ²†ØÁa(!‚ÁRSh" CÇB«- ÃÄëeo`‰!1)A…ø›&š#—®M˜{r¶ÜWä=Pä­?õ$³ú>oØ÷îç4\ßÍià°Ý ƒä4½+§áĸ—ÓpbÜßû"\‚D'ãŠ[±}{5 h9¢ÝèˆbwJc ³ñálîZ#»"¢{Ÿ„Š¼£‹?ŽG¤1 [R0 D´['Ân2Aƒ ¥CLˆ)„²CZ­OQ0\§†é΍ŠÒ&–=E‰!=Ñs‰':%ˆaÂÏ¥;E§I {JK&iÞT$:M®dǙÇþìŸCöO·6”*’!žùßÚr9 n›¸Np{ª­…`šä]µyjË©-£ك0B4#m¤ÝÈ\“FÙå.3²½qÇ 1Ò®¹Ïm<× —ÃiY,¢ÈAJ¹wV¯6ôsÒwæ0ØìèOh¡¨OsxÁIÎHçú¼ ?g¦þ ¬”eŽþ,!UüåO#t¦<5ÀüfݑŽÜ$ßFŽ§Å±ÑC-šp#:õ6aXð 'IÒ"àZދwa´„!tǚû$E›léFÜØÏÆYGê·ø³„z ˜g¨9øºD»²²éÒԆޠçƒ\çdðÆxN¿Ì¤ÿs²wBR}YÞкôQ,SýBç zkêK¹à7XY{tNsô'wÚí9©•ëfÆÍiAO]F_hFc­ÛH4£6àp­koKÐ8hâaGSkƒžFªpt¦\¥ÒQÉo¤]¤<*X¬¤é´kNs#|ôEž„¿?3 -à2vkjځÙcýn#€Æ­DF¤cÐx™­èÙ·0–q¥sïÐÛÔ²‘TJwóNÒ]•žV¼Ô§uÃE}ºôh·º2ÆñNƒse\ ¸¾-Òàvãd׆ìW×p]r?^ªð‘±Í8Ô»¸;vžý1<Œs`ͨ¥NÁ}†gF5¹¶-L‰ÏéO)]Ì«klÀ„IuO1R:,óŠö%Ýo—üÛ7};é“Ó¹RèÂ=/õ)=^Ò컩÷š›8•T½O¤×¯ÓDµþ­ÏL¬ñò(¡Z`Ö;xÞûHDÊ/bè•ö+ÞäT„D»Ï¯x“S‘Ÿj¥Ü¯x“S훻üŠ79Qüæ.¿"@sú?QÕ?þ Ûû‚þ±W/ëù±r\.–ۋ꟰ê{"ït6¶³qœÏëóÿ9§wÓËf¾=¿„^ì‰Z*ŸxÓóén6±PÁ?#­ÔL($çx&#&Ó?Áì*§©¾Ó?ŽNó[’:̾~€pèׁçê›Ú2œõÔQSr' ü³CúkÈh¹`€Å]Lšôü˜¼dÌåR‹·‘Ÿ&8ªgaü-ÓJΫqûi±ç]›lÖâö³c‡\:TX”“€¹Ú"î@A8ëÔÆȇ‡ñÐäLµ6°«-Æx~]P›¿^?à ?àƒtëÏH?éÌx,D™Ò@®Mmÿ/+ (Ÿè rJ¬º!"ʆCñƒœÅTmx‘ ðvŒ%ƒ †© +êlʂG¬8ölÞå4PÛßf¤}€­öwA[ ý©4"ʆCÉÄ¿)"ʆ/aþ_‹ˆ²ðhOÈ¿eá0”ô¯EDÙp(}~D” ‡ÂÙükQ6Šï›§GDÙp(<Èÿµˆ(…¢ˆ¶ÚjãG×@ ÑKè +X`~cuµq¹Žª­Û¯o(Xƒð˜Ð2puh$Ô¢½wH±6O9ÒȾ_¤BSÛSoV:™Äc`“I=D¯û9@Ñi¦D'Ôa0ÑÙÙÙÈ$}\ÝGKDgÊfAV¬«‰äíËöÙFjKKȌr€LË„êá]ôQä±|ÐhüGVÎR2­Omž”E9.@À’jLÿ4Y%ׯ[ÂiøçŒ ç`Ԍσ RF)m¤1@êÏÎlÃϬEj)*ºð@¢}š<ÐtâvJ#†)I1ùm¸Ðb€ÌXU›0ËfÃÙÎȤÝͯ a4n^ßY2ë-3ð2±Ã/¾Ã…4ó­xr(^Å0φãó:†iÊÚ<¹Ä†•î˜Vœp«µŒ…[ ÁŽ›nõiÔoImZ"^›´cœD;ëD‰‡*²d;I ÀñHW·/£ Ò »E»Óß5ôw£}YٚYë1'E‹ŠQî#™ðÙU ‰32†øî ¤:mlì  á…ÏX‡–R÷ ϵ'HE®=űT瞡Ã'rKQDèâDÃáÝA° +ìÄRÅ©ŒŸU2Ž åP³2t °R …hYáýüh@9ú<+¤rÊüÀ:Yîü@dž¬Ï (dÊ+¨Í²AP™¬×0Pk®G&‚Êè­Eíæ‰4Bö›BÛÛÓ<›amèP4óÐDSJ è{´ÊMdù`¸{kg€S£ƒ¬xÁ‰(¤&LÔt"§×l.ifz˜4¦ÞÑ}À^Í&FêUâÏihwB±ûx¨”Ó€ÚbxŒÓJ @œÓ$a ⎇9MÿkxŒÓ[£§)†Q2[d¹€fÁ㴁ßöȊ@wº]ä4¥0²¥Wù}+ €Nÿ…š bA(<ˆM˜špd†„ìŠÕSvïK ‚ò¹=¶"Pᕦ&yÞHM$g%nÛ#Wƒð•œHU`äbU—Ì ŽQ»?¤sž³­Á`Lo “…ÙÌҒãÄÞ)ÎZ¼AÐR€?Ž©Öo}ˆ-¦ÖwKM\tÊM8 _Jp³‹B@tNcùþg®Çÿüj$-ê%®ÉönCƒ XÕSO:f¶Ó—q¶”êÈâÒáÓ~*è€ä°Ä‹<Tx¨¨;)òPPágÃ)ò`|®E#þ xf‡E3þ dfª.ŠxÕÇضóÐìS æ™/ÕH —ö¼aË^?ðÀ+€LpàÀæ‚2 ˆ$2ô ÜNÊ8UáŸ_8p°ã q¿(s0~ˆ²\,婼 ¹ïËN…CcyÊýEÁl„àº1Gfnx$cÎ.£Õy´nÅëbñ°‚P“ÀDGÓ®ZM1Η1GDnŽÎqº1]ƒü*½³ ïùS;Ïö»E¢vÑ.3ÝÙ'¬ª©;Y6võ/ƒ8åêè ܌¯ÓÃõu¦c~†eZV*ú•‚"©e§7@ Ÿô¡ÛrҎ«ŠGÀ¸EËÍ|ò2áüÙ%Í(¢Õï2e?]óɉG?]&¸ØuãÒ+-íÅüóÒ³éú±|؏9³ÿðcÎ},¨æÖ+®}ðO§e b£NôüäÂ_-/<ð;@ü‹5;©´9`$ˆL¹IÇ:ϯc> ù —Ú÷G—rÞû•zït%"™vƒ7ñNW¢êŸÛ¼‰wºQê ÞÄ;]‰Èý Ð›¸ƒ¡Ð0ôŽæÎaf;Ýàë7ðUm~¾ìÑ+Þar¾XnKãÿÎÁqã|!ÿãÿÿïò€*ü¯ãÅ ¿,MTÿòÓÝÖøR‚µ6C{âxN/§çån;>þ÷%„¾k—K|ú%ôB½~1€Á8†à]ð½X‡Î{r·[ÃG5¢õ’ùŸýîx~Ay©ï^Rµš‚›ËÓr²žs'?TýãxIÀÚÿóJìáç +üÇa 8ÍüÏævy=p††ònqŸ–›—Êq¼]Ì_¾ €–€Ûâø6ÑËíÿªƒiC$Áÿ ÿ*€Oà»ÿ¼8/å—^ßñ2S‡™Ûë³y_¬ž€ü°Û<^/ûw‰ùÛå±üN'ü†ú…Ó°ùœŽö󣉂åK.Ããrñ{NwëËFl))‚*žtñ¸½n ˆ/àõù<ä,m—ßãÅèd ºœ^_#Wr}ÄòCR¹Ü^œæn·ÌÆç´yÉ! \~˜°ÛióùA8ô˜š*|ÿÌü|ñ£`ÞµÍx½¾}æ³–Óí&fèeç?ÂÅõÑ \èo¯ÇæuûœÌn? ¸--ãrm.öO +”’Ù—æ?çáçøü«dÒ¥$%G€XA{Ò +ß·Ïñb^?Ž—k(V§ñÿš¿Œ·ÛÝy|žïÁ£—Åq~:ïŽó—Óïî?ðø#æ@HU€Õøÿƒõè +endstream endobj 6 0 obj [5 0 R] endobj 23 0 obj <> endobj xref +0 24 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000046800 00000 n +0000000000 00000 f +0000048544 00000 n +0000176906 00000 n +0000046851 00000 n +0000047214 00000 n +0000049206 00000 n +0000048840 00000 n +0000049019 00000 n +0000048727 00000 n +0000047479 00000 n +0000047982 00000 n +0000048030 00000 n +0000048611 00000 n +0000048642 00000 n +0000049279 00000 n +0000049475 00000 n +0000050711 00000 n +0000071518 00000 n +0000137107 00000 n +0000176929 00000 n +trailer +<]>> +startxref +177122 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg new file mode 100644 index 00000000..88b7d364 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.ai new file mode 100644 index 00000000..948fe6a9 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.ai @@ -0,0 +1,1448 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 6 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_orange + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T16:34:14+02:00 + 2019-06-22T16:35:26+02:00 + 2019-06-22T16:35:26+02:00 + + + + 220 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7N+WH5gfpWFdG1ST/clC v+jzMd50HY/5aj7xv45oOx+1PFHhzPrHI9/7XqfaDsXwT42MfuzzH80/qP2PQ837yzsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLLSrCa/vZBFbQLydu58AB3 J6AZVmzRxQM5GgG/T6eeaYhAXIvFv+Vsa5/in9K1P6O/uv0bX4PRr/yc78vHb7O2cd/LeXx/E/g/ m+X6/P8AQ+gf6G8P5bwv8pz4ut/q8v07sIgmmgmjnhcxzRMHjkU0ZWU1BBHcHNNGRibHMPQzgJAg iwXvf5eeeofMdj9XuWCavbKPXTYeovT1UH/Eh2P0Z3PZXaQ1Eal/eDn5+b5p232OdLPij/dS5eXk f0MvzbOidirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i4gtoJLieRY oYlLySMaKqjcknIzkIgk7AMoQlOQjEWS8C/MDzzceZL/ANKEtHpNu3+jQ9ObdPVcfzHt4D6c4XtT tI6idD+7HL9b6b2L2RHSQs75Zcz3eQ/G/wAmJ5qnduxVE6bqV7pl9DfWUpiuYG5RuPxB8QRsRluH NLHISiaIadRghmgYTFxL6F8meb7LzLpYuIqR3kVFvLau6PTqO/Bv2Tne9n66OohY+ocx+Oj5d2r2 ZPSZOE7xP0nv/b3p/me6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVxIAJJ oBuScVeJfmb+YDaxO2kabJTSoW/fSKf791PiOqL28Tv4ZxnbHaninw4H0D7f2PofYHYvgR8XIP3h 5f0R+v8As73n+aF6d2KuxV2Kpn5d8w6hoOqRahZNR02kiJPCRD1RqdjmTpNVPBMTj/a4eu0UNTjO Of8AYe99EeXfMGn69pcWoWLVR9pIzTlG46ow8Rnf6XVQzwE4/wBj5ZrtFk02Q458/vHeEyzJcR2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvKPzU/MAky+X9KloN01G4Q9fGFSP+H+ 7xzlu2u1OeLGf6x/R+v5PbezvYvLPlH9Uf779Xz7nlOcu9o7FXYq7FXYq7FWQeTPN955a1QXEdZL OWi3ltXZ08R25L2P0Zn9n6+WnnY+k8x+Orq+1ezIavHwnaQ+k937H0Jpuo2WpWMN9ZSia2nXlG4+ 4g+BB2IzvsOWOSIlE2C+X58E8UzCYqQROWNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVeffmf5/wD0TA2j6ZLTU5l/fyr1gRh28HYHbwG/hmg7Y7T8IeHA+s8/L9r1Hs/2L458XIP3Y5D+ cf1D7fm8TJJNTuT1Occ+hOwK7FXYq7FXYq7FXYqzD8vPPUvly++r3TF9IuWHrp19Jjt6qj/iQHUZ t+yu0jp5VL+7PPy83Rdt9jjVQ4o/3seXn5fqe9QzRTwpNC4kilUPHIpqrKwqCD753MZCQsci+aTg YkgiiF+Fi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWI/mF54h8uaf6NuwfV7lT9Xj6+mvT1 WHgD0B6n6c1XanaQ08KH94eXl5u87E7IOqncv7qPPz8ngc88080k8ztJNKxeSRjVmZjUkk9znCyk ZGzzL6ZCAiAAKAWZFk7FXYq7FXYq7FXYq7FXYq9E/LD8wP0XMujanJ/uNlb/AEaZjtC7Hof8hj9x +nOg7H7U8I+HM+g8vL9jy3tB2L4w8bGP3g5j+cP1j7XtOdi+fOxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KpD5x822XlrSjdTUkupKraW1d3f8A5pX9o5g6/XR08OI/UeQ73Zdl9mz1eXhG0R9R7h+v ufPWp6le6nfzX17KZrqduUjn7gAOwA2Azgc2aWSRlI3IvqWn08MMBCAqIQuVNzsVdirsVdirsVdi rsVdirsVdir1r8rPzB9QReX9Vk+MUTT7hj1A6QsfH+U/R4Z1XYval1iyH+qf0fq+TxHtF2LV58Q2 /iH++/X83qedO8Y7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql3mDXbDQ9Lm1G9akUeyoPtO5+yi+5zH 1WpjhgZy5BytFo56jIMcOZ+wd7538x+YdQ1/VZNQvW+JvhiiH2Y4wfhRfYVzgNXqp55mcv7H1TQ6 GGmxDHD4+Z70rzFcx2KuxV2KuxV2KuxV2KuxV2KuxV2KtglSCDQjcEdQcKkPb/yz8/jWrddK1KSm rQL+7kb/AHei9/8AXH7Xj18c7PsjtTxh4cz6x9v7Xzvt/sX8vLxcY/dH/Yn9Xd8u5nub15l2KuxV 2KuxV2KuxV2KuxV2KuxV2KsE/Of/AJRBP+YuL/iL5o/aD/F/84fpel9lf8aP9Q/eHhucU+iuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxVVtrm4tbiO5t5GiniYPFIhoysNwQcnCZiQQaIYZMcZxMZCwXv vkDzxb+ZdP4TFY9VtwPrUI2DDoJEH8p7+B+jO67M7RGohR+sc/1h8y7a7IlpJ2N8cuR/QfxuyvNo 6V2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKsx2AA7nEmkgWlfl/zFY67Fdz2NWt7W5a1WXtIURGLr/k 1eg+/MXS6uOcSMeUZV7+Tma3Qz0xjGf1SjxV3WTt9jGfzn/5RBP+YuL/AIi+a32g/wAX/wA4fpdx 7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmkatfaTqEN/YyGO4haqnsR3 Vh3U9CMuwZ5YpicTRDRqdNDPjMJi4l9C+UPNdj5k0pbuCiTpRbu3r8Ub0/4if2TnfaHWx1EOIc+o 7ny3tPs6eky8Evp6HvH6+9PMzXXOxV2KuxV2KuxV2KuxV5J+af5g+q0ugaTL+6Wq6hcoftHvEpHb +b7vHOU7a7Uu8WM7fxH9H63uPZ3sXhrPlG/8I/T+r5p1+SX/ACit3/zHSf8AJmLM32d/uD/XP3Rd f7Wf4zH/AIWP91JW/Of/AJRBP+YuL/iL5L2g/wAX/wA4fpYeyv8AjR/qH7w8Nzin0V2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2Kpt5Y8y6h5e1WO/szUD4Z4CfhkjPVW/gexzL0erngmJx+I73B7 Q0ENViMJ/A9xfQ+g65Ya3pkWo2L8oZR8Sn7SOPtI47MM7/TamGaAnHkXy3WaSenyHHMbj7fMJhl7 iuxV2KuxV2KuxV51+aH5gfo2J9F0uX/cjKKXU6neFGH2VI6Ow+4e+c/2z2p4Y8OB9Z5nu/a9X7Pd i+KRmyj0DkP5x/V97xfOOe/e2fkl/wAord/8x0n/ACZizs/Z3+4P9c/dF899rP8AGY/8LH+6krfn P/yiCf8AMXF/xF8l7Qf4v/nD9LD2V/xo/wBQ/eHhucU+iuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2Ksk8j+crvyzqYkFZNPnIW8tx3HZ1/wApfx6Zsezu0Jaed84HmPx1dT2v2VHV465TH0n9 HuL6Csb60v7OK8tJBNbTqHikXoQc73HkjOIlE2C+X5sMsczCYqQV8m1uxV2KuxVh35iee4vLtl9V tGD6vcr+5XqIkO3qsP8AiI75qO1e0hp48Mf7w/Z5u+7D7HOqnxS/uo8/Py/W8FlllmleWVzJLISz uxJZmJqSSepOcPKRJs830qMREUNgFuRZPbPyS/5RW7/5jpP+TMWdn7O/3B/rn7ovnvtZ/jMf+Fj/ AHUlb85/+UQT/mLi/wCIvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYqzX8uPPknl+8+pXrFtHuG+PqfRc7eovt/MPp+e57J7TOCXDL+7P2ef63n+3e xhqYccP72P2ju/U92jkSSNZI2DxuAyOpqCCKgg524IIsPm0okGjzXYUOxVj3nXzhZ+WtLM70kvZq rZ21ftMOrHwVa7/dmB2hr46eFneR5B2nZXZc9Xk4RtAfUfx1L571HULzUb2a9vJDNczsXkkPcn9Q HYZwOXLLJIykbJfUcGCGKAhAVEIfK212KvbPyS/5RW7/AOY6T/kzFnZ+zv8AcH+ufui+e+1n+Mx/ 4WP91JW/Of8A5RBP+YuL/iL5L2g/xf8Azh+lh7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdi rsVdirLrbyNPqPkmPXtPDSXUEkq3VuNy8anZkH8y9x3Hv120OzTk03iw+oE2PJ0eTtcYtYcGTaJA o9x8/exHNS7x2KuxV2KuxV2KvSfyu/MD6jJHoWqyf6FIeNlOx2idj9hj/IxPXt8unR9jdqcBGKZ9 PQ93l7nkvaHsXxAc2IesfUO/z9/3vZM654J2KvnT8wb67u/N+pm4kMnoTPBCD0WONiFUDPPu1Mkp aidnka+D6r2JhjDSw4RVxBPvLHc17tXYq7FXtn5Jf8ord/8AMdJ/yZizs/Z3+4P9c/dF899rP8Zj /wALH+6krfnP/wAogn/MXF/xF8l7Qf4v/nD9LD2V/wAaP9Q/eHhucU+iuxV2KuxV2KuxV2KuxV2K uxV2KuxV7v8Ak/8A8oZH/wAZ5f1jO47B/wAWHvL5t7T/AONn+qGJfmj+X31KSTXdKi/0NzyvbdR/ dMT/AHigfsHuOx9umq7Z7L4CcuMenqO7z9zu/Z7trxAMOU+sfSe/y9/3+/nzXOceudirsVdirsVd ir2H8q/PzXix6BqblrpFpYztv6iKK+mx/mUDY9x79et7F7T46xT+r+E9/k8J7RdjeHefGPT/ABDu 8/j+PLpmdI8g+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f/ ADHSf8mYs7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf8RfJe0H+L/5w/Sw9lf8AGj/U P3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8AGeX9YzuOwf8AFh7y+be0/wDj Z/qhmskaSI0cih0cFXRhUEHYgg5uCARRefBINjm8J/MfyE/l+7+vWSltHuGoncwud/TY+H8p+j58 R2t2YcEuKP8Adn7PL9T6R2F2yNTHgn/ex/2Q7/1sJzTPQuxV2KuxV2Ksm/LX/lONK/4yP/yafNl2 R/jMPf8AoLqO3v8AE8nuH3h9D5375Y+bfO3/ACl+sf8AMXL/AMSOed9o/wCMT/rF9a7J/wAVx/1B 9ySZhOwdirsVe2fkl/yit3/zHSf8mYs7P2d/uD/XP3RfPfaz/GY/8LH+6krfnP8A8ogn/MXF/wAR fJe0H+L/AOcP0sPZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/k//wAoZH/xnl/W M7jsH/Fh7y+be0/+Nn+qGbZuXnlC+sbW+tJbO7jE1tOpSWNuhByGTHGcTGQsFsw5pY5icTUhyfPv njybd+WtTMe8mnzktZ3B7jujf5S/j1zgu0ez5aedc4HkX1DsjtWOrx3ymPqH6fcWN5rnbOxV2Kux Vk35a/8AKcaV/wAZH/5NPmy7I/xmHv8A0F1Hb3+J5PcPvD6Hzv3yx82+dv8AlL9Y/wCYuX/iRzzv tH/GJ/1i+tdk/wCK4/6g+5JMwnYOxV2KvbPyS/5RW7/5jpP+TMWdn7O/3B/rn7ovnvtZ/jMf+Fj/ AHUlb85/+UQT/mLi/wCIvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FX Yq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3LzzsVQGu6HYa3pk2nXycoZRsw+0jj7Lq ezLlGp00M0DCXIuVo9XPT5Bkgdx9vkXzv5n8tah5e1WSwuxUfagnAoskddmH8R2OcBrNJPBMxl8D 3h9S7P18NViE4fEdxSnMRznYq7FWTflr/wApxpX/ABkf/k0+bLsj/GYe/wDQXUdvf4nk9w+8PofO /fLHzb52/wCUv1j/AJi5f+JHPO+0f8Yn/WL612T/AIrj/qD7kkzCdg7FXYq9s/JL/lFbv/mOk/5M xZ2fs7/cH+ufui+e+1n+Mx/4WP8AdSVvzn/5RBP+YuL/AIi+S9oP8X/zh+lh7K/40f6h+8PDc4p9 FdirsVdirsVdirsVdirsVdirsVdir3f8n/8AlDI/+M8v6xncdg/4sPeXzb2n/wAbP9UM2zcvPOxV 2KpJ5u8qWPmTSmtLiiTpVrS5Aq0b/wDNJ/aGYWu0UdRDhPPoe52PZnaM9Jl448uo7x+OT551fSb7 SdQmsL6Mx3ELUYdiOzKe6nqDnA58EsUzCQoh9S02phnxicDcSg8pb3Yqyb8tf+U40r/jI/8AyafN l2R/jMPf+guo7e/xPJ7h94fQ+d++WPm3zt/yl+sf8xcv/EjnnfaP+MT/AKxfWuyf8Vx/1B9ySZhO wdirsVe2fkl/yit3/wAx0n/JmLOz9nf7g/1z90Xz32s/xmP/AAsf7qSt+c//ACiCf8xcX/EXyXtB /i/+cP0sPZX/ABo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/wCT/wDyhkf/ABnl/WM7 jsH/ABYe8vm3tP8A42f6oZtm5eedirsVdirFPP8A5Ht/Mmn84Qseq24JtZjsGHX03P8AKe3gfpzV 9p9nDUQ2+scv1O67F7XlpMlHfHLmP0j8bvArm2uLW4ktriNop4mKSxuKMrDYgjOFnAxJBFEPpuPJ GcRKJsFSyDNk35a/8pxpX/GR/wDk0+bLsj/GYe/9BdR29/ieT3D7w+h8798sfNvnb/lL9Y/5i5f+ JHPO+0f8Yn/WL612T/iuP+oPuSTMJ2DsVdir2z8kv+UVu/8AmOk/5MxZ2fs7/cH+ufui+e+1n+Mx /wCFj/dSVvzn/wCUQT/mLi/4i+S9oP8AF/8AOH6WHsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdi rsVdirsVdir3f8n/APlDI/8AjPL+sZ3HYP8Aiw95fNvaf/Gz/VDNs3LzzsVdirsVdirAvzM8gDWr dtV02OmrQL+8jX/d6L2/1x+z49PDNF2v2X4w8SA9Y+39r03YHbX5eXhZD+6P+xP6u/597w8ggkEU I2IOcY+iMm/LX/lONK/4yP8A8mnzY9kf4zD3/oLqO3v8Tye4feH0Pnfvlj5t87f8pfrH/MXL/wAS Oed9o/4xP+sX1rsn/Fcf9QfckmYTsHYq7FXtn5Jf8ord/wDMdJ/yZizs/Z3+4P8AXP3RfPfaz/GY /wDCx/upK35z/wDKIJ/zFxf8RfJe0H+L/wCcP0sPZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdi rsVdirsVe7/k/wD8oZH/AMZ5f1jO47B/xYe8vm3tP/jZ/qhm2bl552KuxV2KuxV2KvLPzT/L/mJf MGlR/GKvqFuo6jvMo8f5h9PjnMdtdl3eXGP6w/T+t7P2d7aqsGU/1T/vf1fJhf5a/wDKcaV/xkf/ AJNPmn7I/wAZh7/0F6Dt7/E8nuH3h9D5375Y+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/U H3JJmE7B2KuxV7Z+SX/KK3f/ADHSf8mYs7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf 8RfJe0H+L/5w/Sw9lf8AGj/UP3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8A GeX9YzuOwf8AFh7y+be0/wDjZ/qhm2bl552KuxV2KuxV2KuxV53L5A/RXn3TdZ0yP/cbLK/1iFf9 0u0bbj/IY/cdvDOfl2X4WqhkgPQTv5bfc9VHtrxtFPDkP7wAUf5wsfaPteiZ0Dyr5t87f8pfrH/M XL/xI5532j/jE/6xfWuyf8Vx/wBQfckmYTsHYq7FXtn5Jf8AKK3f/MdJ/wAmYs7P2d/uD/XP3RfP faz/ABmP/Cx/upK35z/8ogn/ADFxf8RfJe0H+L/5w/Sw9lf8aP8AUP3h4bnFPorsVdirsVdirsVd irsVdirsVdirsVe7/k//AMoZH/xnl/WM7jsH/Fh7y+be0/8AjZ/qhm2bl552KuxV2KuxV2KuxV2K uxV82+dv+Uv1j/mLl/4kc877R/xif9YvrXZP+K4/6g+5JMwnYOxV2KvbPyS/5RW7/wCY6T/kzFnZ +zv9wf65+6L577Wf4zH/AIWP91JW/Of/AJRBP+YuL/iL5L2g/wAX/wA4fpYeyv8AjR/qH7w8Nzin 0V2KuxV2KuxV2KuxV2KuxV2KuxV2Kvd/yf8A+UMj/wCM8v6xncdg/wCLD3l829p/8bP9UM2zcvPO xV2KuxV2KuxV2KuxV2Kvm3zt/wApfrH/ADFy/wDEjnnfaP8AjE/6xfWuyf8AFcf9QfckmYTsHYq7 FXtn5Jf8ord/8x0n/JmLOz9nf7g/1z90Xz32s/xmP/Cx/upK35z/APKIJ/zFxf8AEXyXtB/i/wDn D9LD2V/xo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/5P/8AKGR/8Z5f1jO47B/xYe8v m3tP/jZ/qhm2bl552KuxV2KuxV2KuxV2KuxV82+dv+Uv1j/mLl/4kc877R/xif8AWL612T/iuP8A qD7kkzCdg7FXYq9s/JL/AJRW7/5jpP8AkzFnZ+zv9wf65+6L577Wf4zH/hY/3Ulb85/+UQT/AJi4 v+IvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/ACf/AOUMj/4z y/rGdx2D/iw95fNvaf8Axs/1QzbNy887FXYq7FXYq7FXYq7FXYq+bfO3/KX6x/zFy/8AEjnnfaP+ MT/rF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f8AzHSf8mYs7P2d/uD/AFz90Xz32s/xmP8Awsf7 qSt+c/8AyiCf8xcX/EXyXtB/i/8AnD9LD2V/xo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7 FXu/5P8A/KGR/wDGeX9YzuOwf8WHvL5t7T/42f6oZtm5eedirsVdirsVdirsVdirsVfNvnb/AJS/ WP8AmLl/4kc877R/xif9YvrXZP8AiuP+oPuSTMJ2DsVdir2z8kv+UVu/+Y6T/kzFnZ+zv9wf65+6 L577Wf4zH/hY/wB1JW/Of/lEE/5i4v8AiL5L2g/xf/OH6WHsr/jR/qH7w8Nzin0V2KuxV2KuxV2K uxV2KuxV2KuxV2Kvd/yf/wCUMj/4zy/rGdx2D/iw95fNvaf/ABs/1QzbNy887FXYq7FXYq7FXYq7 FXYq+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f/ADHSf8mY s7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf8RfJe0H+L/5w/Sw9lf8AGj/UP3h4bnFP orsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8AGeX9YzuOwf8AFh7y+be0/wDjZ/qhm2bl 552KuxV2KuxV2KuxV2KuxV82+dv+Uv1j/mLl/wCJHPO+0f8AGJ/1i+tdk/4rj/qD7kkzCdg7FXYq 9s/JL/lFbv8A5jpP+TMWdn7O/wBwf65+6L577Wf4zH/hY/3Ulb85/wDlEE/5i4v+IvkvaD/F/wDO H6WHsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxVF/ojVf8Alin/AORT/wBMt8DJ/NPyaPzOL+dH5h36 I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/ AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h7h+UsE8Hk+ OOaNon9eU8HBU0JHY52nYcSNOARW5fO/aWYlqyQbHCGZZuHQOxV2KuxV2KuxV2KuxV2Kvnbznpmp SebNXeO0mdGupSrLGxBBY7ggZ5/2hhmc8yAfqPR9U7K1GMaXGDKP0DqEm/RGq/8ALFP/AMin/pmH 4GT+afk5/wCZxfzo/MO/RGq/8sU//Ip/6Y+Bk/mn5L+Zxfzo/MO/RGq/8sU//Ip/6Y+Bk/mn5L+Z xfzo/MPZfyZt7i38r3STxPE5vpCFdSpp6UQrQ52Hs/AxwGxXrP3B4H2qnGWpiYm/QP8AdSXfnKrN 5RQKCT9bi2H+q+Ht8f4P/nD9KPZY/wCFH+ofvDxD0pf5G+45xfCX0TiHe70pf5G+448JXiHe70pf 5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe//9k= + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:76FE812EFA94E911B987F622BD994B0C + uuid:7e67434c-0358-43b8-a083-32c919d418ed + + uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:76FE812EFA94E911B987F622BD994B0C + 2019-06-22T16:34:12+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Mograsim Orange (255,83,0) + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + Mograsim + 1 + + + + Mograsim Blue (7,83,235) + SPOT + 100.000000 + RGB + 7 + 82 + 235 + + + Mograsim Orange (255,83,0) + SPOT + 100.000000 + RGB + 255 + 82 + 0 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 40 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 36 0 obj <>stream +H‰¤M …÷œb.P`føëV4®ª1¡‰vaMLïŸ8Pc»7$<Þ0|ó‚¹f0C¶p8fP& ã°Œ/eÎb‹zKÁÊB`´r²³ªµYõ½È³Š ¤õb,°K:¥zžÔ]ÝVt.]òåO¤mד*ޑ8 +Íj‡6VºhµM,ošcòÒD ´3kЍ‡Ì@»T]Œmn՚ ŠC’.&í‚û:¯™}ӏ:úü4È/ã’IÅ +endstream endobj 40 0 obj <>stream +8;Z,f;%eL($q0Q6V0qA?>c.p\KFl@jR6%I"`b"&5enRg,EA4tSL@q4UW+U\jLhRhO +$!?/HJNpuMSaa;s1Mu:O%#RsUT3XVG\S.mgLV[5@nXj_deJ\:_"I?4%4s]&jBDJ\C +fW'sM)t]R&hqS7cr8-,.@%e0[.tO0S1H8uq^,@s-$biG&"I\K@?RI6iLu7[j3lh"P +?:F],:I6?OrHF3DL@U8dhD*7##3=`=kp=/?FS.:9%.i#!!QpbTR?K:N'u'dRs(a\> +^3Cadn.WrG]ghke-bK +endstream endobj 41 0 obj [/Indexed/DeviceRGB 255 42 0 R] endobj 42 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 34 0 obj <> endobj 43 0 obj [/View/Design] endobj 44 0 obj <>>> endobj 39 0 obj <> endobj 38 0 obj [/Separation/Mograsim#20Orange#20#28255,83,0#29/DeviceRGB<>] endobj 37 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_orange.ai) +%%CreationDate: 6/22/2019 4:35 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -488 456 -23 +%%HiResBoundingBox: 56 -488 456 -23.5352 +%%DocumentProcessColors: +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%DocumentCustomColors: (Mograsim Orange \(255,83,0\)) +%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) +%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%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: 1 +%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 47 0 obj <>stream +%%BoundingBox: 56 -488 456 -23 +%%HiResBoundingBox: 56 -488 456 -23.5352 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 20610 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 +%524C45CFFD6EFFC9B4CFFD6CFFCABABABAFD6BFFCABBB4B4B4BAFD69FFCA +%BBB4BABAB4BABBFD68FFC1B4BABAB4BAB4BAC1FD66FFC2B4BAB4FD04BAB4 +%BAC2FD64FFC2B4BABABAB4B4BAB4BAB4B4C3FD62FFC9B4BAB4BAB4FD04BA +%B4BAB4BAC9FD60FFCAB4BAB4BABABAB4B4BAB4BAB4BAB4BAC9FD5EFFCAB4 +%BAB4BAB4BAB4BABAB4BABABAB4BAB4BBCAFD5CFFCFBABAB4BABABAB4BABA +%B4BAB4BAB4BAB4BAB4BBCAFD5BFFB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 +%BABABAB4C1FD5AFFBBBABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4 +%C2FD58FFBBB4B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4C2FD56 +%FFBBBABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4C3FD54 +%FFC2B4B4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BAB4C9FD +%52FFC3BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4CAFD50FFC3BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABACFFD4EFFCABAB4BABABAB4BABABAB4BABABAB4BABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CFFD4CFFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4FD04BAFD4BFFCABB +%B4BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4B4BBFD49FFCFBBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04 +%BAB4BABABAB4BABABAB4BABABAB4BABABABBFD48FFC2B4BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%B4BBFD46FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD44FFC2B4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAC3FD42FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC9FD40FFCAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAC9FD3EFFCAB4B4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BAB4BBCAFD3DFFBABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BBCAFD3BFFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4 +%C1FD3AFFBBBAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD +%38FFBBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD +%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4C3FD37 +%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C9FD +%36FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%C9FD35FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4CAFD34FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABACFFD33FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BABACFFD32FFBBBAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABBFD2CFFC3FD05FFC1B4BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BBFD2AFF +%C2B4FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAC1FD28FFC9B4BBFD05FFC1B4BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C2FD26FFC9B4BABAFD +%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BAB4BAC2FD24FFCFB4BAB4BBFD05FFBBB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C3FD22FFCF +%B4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BACAFD21FFFD04BAB4C1FD05FFC1B4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BACAFD1FFFBBB4B4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BBCFFD1D +%FFBBBABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCFFD1BFFBBB4B4BA +%B4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BAB4C2FD1AFFC2BAB4BABABAB4BAB4 +%BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD18FFC2BAB4BAB4BAB4BAB4BABA +%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BAB4C3FD16FFC9BAB4BABABAB4BABABAB4 +%BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C3FD14FFC9BAB4BAB4BAB4BAB4 +%BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4CAFD12FFCABBB4BAB4 +%BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CAFD10 +%FFCABBB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4FD10FFC1B4BAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4B4B4FD0EFFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABBFD0CFFC2B4BABABAB4 +%BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4C2BBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BABBFD0AFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAC2FFBBBAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD09FFC9BAB4BAB4BABABAB4BA +%BABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%C2FFFFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%B4C2FD08FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAC2FFFFCFB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAC3FD07FFC9BABABAB4BABABAB4 +%BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FFFFFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAC3FD06FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBB +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD04FFC9B4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BAB4BACAFD05FFC9BAB4BABABA +%B4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4C2FD05FFC3B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD +%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD +%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD06FFC2B4BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4FD05FFC9BAB4BABA +%BAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4C2FD07FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05 +%FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD08FFC1B4BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABACFFD04FFC9BAB4BAB4BA +%BABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4C2FD08FFCABBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD09FFCABBB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABAFD05FFC9BABABAB4BABABAB4BA +%BABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%C2FD0AFFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD +%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BAC2FD0BFFC9BAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4FD05FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD +%05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD0CFFC2B4B4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%C2FD0DFFC2BABABAB4BABABAB4BABABAB4BABABAB4FD04BAFD05FFC9BAB4 +%BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4C2FD0EFFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAC2FD0FFFBBBABABAB4BABABAB4BABA +%BAB4BABABAB4BABACFFD04FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BB +%FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD10FFBAB4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD +%11FFBABAB4BABABAB4BABABAB4BABABAB4BABAFD05FFC9BABABAB4BABABA +%B4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4C2FD11FFCFB4B4B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFCAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BAC2FD12FFCFB4BAB4BABABAB4BABABAB4BABABAB4FD05FFC9 +%BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4C2FD13FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD +%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BAC2FD14FFC9B4BABABAB4BABABAB4FD04BAFD05 +%FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4C2FD15FFC2B4BAB4BAB4BAB4BAB4BAB4BACAFD +%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAC2FD16FFC2B4BABABAB4BABABAB4BABACFFD +%04FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4C2FD17FFC1B4BAB4BAB4BAB4BAB4BACAFD04 +%FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAC2FD18FFC1B4BAB4BABABAB4BABAFD05FFC9BA +%BABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4C2FD18FFCABBB4BAB4BAB4BAB4BACAFD04FFCAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BAC2FD19FFCABBB4BAB4BABABAB4FD05FFC9BAB4BABABAB4BABA +%BAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FD1AFFC9BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD1BFF +%C9BAB4FD04BAFD05FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FF +%C1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD1CFFC2B4B4BAB4BACA +%FD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAC2FD1DFFC2BAB4BABACFFD04FFC9BAB4BA +%B4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4C2FD1EFFBBB4B4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD +%1FFFBBBABAFD05FFC9BABABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1 +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD20FFBABACAFD04FFCAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BAC2FD21FFBACFFD04FFC9BAB4BABABAB4BABABAB4BABABA +%B4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD21FF +%CACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BA +%BABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD +%27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BA +%BABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FF +%C9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BABABAB4BABABAB4BABABA +%B4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD +%05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1 +%B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFC9B4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%C2FD27FFC9BABABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27 +%FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BA +%B4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA +%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BA +%B4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4C2FD27FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05 +%FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BA +%BABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBB +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABA +%BAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BA +%BABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD +%27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BA +%BABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FF +%C9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BABABAB4BABABAB4BABABA +%B4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAC2FD27FFC9BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BB +%FD05FFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BAC9FD27FFCABBBBBB +%C1BBC1BBC1BBC1BBC1BBC1BBC1BBFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%%EndData + +endstream endobj 48 0 obj <>stream +%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%$ûíIÉÎ +c:’Ì,rȗهÙ[ý>U(`æG±9ӕ +34ÌÃ¥ÐãSÅßü¿ú͗×_½þ·»/ÃÕ°{òÅßüÍáÍݳw¯ßüxGòî§/^|ûöݐ~ðëîÆùjÀS×?-Oíɼ{óöþõ«ówW¿½Åû?8üþÍýÛw÷Ï^ínï^ÊC?Üýà‡øíoïß½¸“ßß?ýêéë7Ï^}}wõìþ‡Þ¸Tv|öNž˜4M?š†qÙŇ´ûÕÏùȳWxööíýŸïÐb(lpÿúÛW_Ý¿úzÿúþx—æݗ±”]Ä?&þþïï}÷ö¡‡®RHž<¾~þíË»Wï~õæõó»·o¯_¼~óöÇò›ëŸ¦§·÷/î¤o/Ÿ½Ûâú§ãôtÿíý‹¯~ñíË»“nÏËHzxÊwÿáí³¯åKùoÒóӟ¾ÒoîÞ½“oyûãÝÐ7{Á~ýÒZÝýà篿~óìíýËÝ/9L»ýÁ”ÒߕðwÿþöëŸì»W¤²«aÊ1ò0¥¸ÈßË4¦yéêÚ¿ø5eÔ3…d5ýŸ»î¥ÇµÜ‘4Íòƒù•ÌΝŒÑ›¿{õßXÇâÍëo@Bw_¦qÚáÿƒýö·w/¿y!SΙ™Ò|•dNøWÿC}X&~Æ«’—e÷凫y¤Ò¯FY1»1-WK±7ڜÞýáþî?Þýâõ«;›Òë7ï~£k)ÆaÐÿÚ¯~ý틻7ÿðêþ|ôLÚ¢súó×_ݽ7Z·/žq*YÆö_{â·ÏÞ|}÷N–àëß¾ã^)ފ¬›Ÿ=ûÓ¦{´F~ùÍÝ«ß¾þG~ê—ã4‡]ƒLN’nMe·¤¸ IÒÎ8{»cû¯ÕŽªPQm"cê~%ëï—oõãúùéOÞÜÕežvEÿÃ~\•îÿKý¿}®tþÝ»»WõûeC~Þ-ïáêç¿D«7¯¾:¼~‰yxË-{'íË +zñúkûmû¿“*¾ýƺAÂS™¶_½¹…ŠŸ|ñ ý]yú«ßÊ/òæõ·ßüôÕï^?ùâʹþñî¹p'™Û¯v¿ü·ÿ!?ÿùųç¿ÿúîÏw÷ÏÿêîÝÝÛÝ^v®ÐýYaDßüð=KßÜíô·ò.”¿‡¿óþñîwÂCZJýû 9¾xq÷êËÿçÛ·ÏÞýùå믾}!¿½yõ‡»¯¿¹Û={õÕ½ùæ1MüêųWÏÞìø‹ÚB_ïÞݽyöïïîÿ°{ùL•‡~vÿyñ™Œï£ZåôŒ_â3ëÖz ûÕ£šzöî÷´î^}õÖk¿~õõ Ìâ·Â›¶#Ǝèó©þ7zùo¯_Ü¿}é•÷ÿ÷#¿T†õÕ/_é'¿ùöíïw¿}ýú…×üsáÕwo¾¹õöîÅ櫅‹è{U ùÃçÁæù_¢‰Ã³/îå<ûæ÷÷Ïϵòßì÷¿»¿;Û؅÷µºžsªÎµú›oîþ|ÿìÅÙO_û«kÌÖàîæ«{᝘ÀƒÏüæÏÞ=ÿýîg÷ÿöæٛû»÷ìVLöïî_}%ú›oïßÝy#è Ε¯ïÞÞ½ûó;aÐÂ^Áfä…Ûî…V}z*ÇMœ|ùåÍœ±ûWý#?yóì«{9ÊDFûÉë_ÉÃ_KÕíßrlæÝþ«'_ü˓/†îcý_ÜýÍÓ½H„ÿEÈÛ?ã¦L] V¢•Äÿ×2ãÿRã¼*ÙK–U¹îÊ^ÊÁʱ+7íÔx[ËêÓú?SWBWâª$-2ø;³”Ì¿KW–U¹÷^^öãQJýé(5ÇҎãm_úáãçÕ?¡+±+išQž|¡O¹+eZ¤è¯»²×òä‹ÿûüœ^šÕ°š×ØÍn›c)RcçØͶÎn?ËE +þÆì–Õæ[Y0c™J,©Ì%—¥\—}9–›r+ Gæt K\¤¢¥,˲_ËÍr+Ëg¼×ñ:]Ï×åz¹¾¾ÞK9\¯o¸¤&éBܧ}ޗý"¿Úïû›ý­,3Mz8ÄC:È'–Ãõa8Ž‡[Yv#'#Óq>ÊçËq9ãÍñöfé 7ñf¾É7åf¹‘Æn7²Jnnnn±4neÐnÓ­töV>ÿöZŠ4z+¯ÞnþpNN«ÓnºrìÊ¡+ûU¹îÊR‹Ô¸Hó­ä®Ì«’º»º"«Qjœ¼ôœ­qå¡ÿø›þÏqUZdÈð÷¾+×]YV¥t%weîŠ0ô›ä%®JèÊԕ±+C_t؟|aÐw ÿsèÊ^Kݪ«ù\Ïâzîꬭgj=;2#Rcìg¤›‰õø¯GÝF{3ÂU¯e3¦6’«1\Ûf´Öã#㵓k+ K±’­Ì,ÉJd VdÝq3ڙª§‚o…Ú9m¬þÙ³\[YXŠÙì²ùóa¶’¬D–`Eyr=„¯vszÃyÜsÞ +ç)q^0GÿÈѾæØfŽfä荭ŽÎž£Q¤w™}GÑˁ½:²×üî̯Œü*ùY672¤ag×Â֊°·Y˜\f7 Ÿ—/•%u#ƒ}fx-l±\gaIeóf”3øV¦þ(ƒ²_®…–% cMÂ`ƒœP£œØ·² Ž2X{aÃK‘o–< kŽ%“ål¿•¥r”¡Üçkaâ%gaçIØzæ>Š,p+‹è(ûֿȐå Hr 9ÆY¾Q–ôLöAk9<Š!sJr˜9TF‘/neáeJörà,rðä8Ëå(šä@d ÜÈò8È!u-‡•|£[sHr€9ÈF‘hne±eqÌâàÅQœäèÃQ óœ²ßN¶'ñl}’ÏÊӣ℅„ +"bÔµq¡UÖÄ:j í}(ӊ_Üv'rŠEÖX’õ5ÊÚ:·²¦îá)…?zRÜ°8­·u=±ì̉%‡’ õp6ú¹8ËÒ+gNÆà'#ÎÅk´Yßw#˜›«œA)ã†rÆh’FrYãz;Èxí×,?SÆá`ø<]S´¹ '+€"æèⓠ+Œ*B©`x x#Œ&ºk7«(ÞDoª,¬­ÖÕjb=(}ÿì ù÷÷“©¹<(tY!YVʞkf#hôÓì©ÌªgWmY5–Õ3-²-ý3ÌlÍÊÞÇÈ|:6[ù³lä½Ë×µ4©¬t©lú•–´ÒÁL/“ƒ1ý£2ÿJ%^k{õ´r]е ŕy „^5ü½lJٔ¦±ê¿fÓeûOJ8)әb¤ÆþωêˆÝÙË~þ÷ñlÖ"«ðàeïåúBY.–R5L©1oÊüÈÒ´×Ô©qõ³[8Ú¿OK¸P¸4¤Æé‘åÜ Ÿ)Rããž|ôŸ³¶‚OúóùjìŽ×ÑV¥ß*Å­¨ÜVm!Õ6RL÷®¶Û÷²«UO¯»½ÚcÚVØîí*ûÖ½ÜïÞ½íêjE8ݻ٭³•ä6‰f— +ýnukÆûTþ嶐fÛìͺ;<šª¥·±íÏîÍýÊ2wº;« g»[ËÊÊ׬BÕ2tn¿úÏ+Ûa:)qem¼¼+ז«­Íòܾ}h7oö*wõ…ß}øŽ~pWÿìÁÏ_ã¡·W¯N,•ZN¬*« TØo(‘,¦`Î&“L®^ÝvRI^I%S§bDÉ¢Šõä Q² f©’5k Š¥JցV'U´Š+ZÁ-¨ZQ³öT´ +mX²©lÜ(·Ô¿hB*(¢j©²ukRu‹ +×Ñ®=®B… *X™¬S»n©KCñRÕ ÊW¡òõ+Rý¹­n©‚¨‚A ƒ–¥Y<*š–¨hÊ˜¨c´ÝP!;ŠB• JÔ2(f9&ªfPÎY×@íÖtø½áà å;Hx™RތþŒ°g‡¬Òä8•Ý +Õ3”HÞóîŽkwRXµçêß=Oîe(ÊKÂoã‰läœuÅKW’ÍŠk®x¤ì˜^fAÙp»³|îùâŒ<ñ8®q‘›|æ]íª¨–ÞBÖÿY;SçÚWÏ\ª£©´­„UYÛüҦ̫"Àʒ˜W6ÆBk]®7e¿-fÑìËñ¤œþ¹=-uµ ƒìOòñL™Î–p¶T+âiIÊ|±¸=Yj̛R,Ë{Šˆ+«öù²d!Ǘ,ÇÇ©ñ”zn*]¤ÆK¿ûÈ?gŽ×®É Dƒk­“9Q´D+jO­öÕl¥Ú_+f•ÕZ[ÿTVѶP–Êo«n]¥þj)V»±¬oš§´Ì^ª­¹xY¬\{ٟáYG˜—N8Ö9^Õüç¹SǗV~ŠOºÀ.q¡žóìiºÌ{à9+c|†¶´Ë<æ gyG‘ä#à NA/—sæÝî¿È'ÉNùÀ»úáòÜÕd¶]nE°;¨-•ŽbÈb!ʁpîÆ{a ê4Ìm Çq¢ë¸ˆàYÝÇG8åÐQr È +'²œ1d«+Î亓ա …Ò©Œ?p,_ST†s›IÌp1Cþ¤›ùÉt5Håt7ï…=Ýé<ˆ”‰Žç(Y:S„_Dœ¿¦ú ìãÆ\Ñõìú' +ÿpJÃ-=_gªK瞦ƒZ +&äő¶Ê@g5ÜՐÝ3ÖET…®ku^Ȝ°ÑoéÆœ Wþ[9o帍ӏ~[¹k㪕›6>Ú¸g㚍[ö<òhjçŠ+nØxàZ&ë¹ÝšÃÉÀ/kœmÍË6ÜëŒdtʟz™ç¼\s‰ël¤’¾Hp‘÷rÇžþ¿««9Яš=î&ù×¼+ÃU”½³Ëèõ ÿæÉóô1Ïîߞ©ó*ɓiؕñJôÇùr…ÛYÛÕ8ç%û?B1ž*à;•2EùGN“ýZãð€Ö2]…!ÅÖÜ'פß3ˆR›fD2ȶŸñ¢h梺³²%¦a!}FœƒücÒx‡VY¸„ÓtŸõ™*´¯›᳨,CÊ|±ÖÊD·,ÚÀ$|•Éô¥eUY†¥ÿºÏSá'Ì唯J ª*)/Ÿ:¡ÛêέYûøe¹>qÁ®ŸB=ûcÃoVæXæßß¿|y÷ Lû—T+$ó¿8ë¼5†9«LææËƯ{Ÿ­±¹hh£Š˜çÂÇFÃSEr@Tíy¸ÝÒü¡‡ÚÌãìšÙ 9ðT8¸ôк¦mëxM¨ÈÁêQۮڈqš †½T—gÅNÒqê´ôFñܟËhÔÞr›:ûcŠH &ÁQ [óX6t‚â ¡@ٍaÉݞc/:äÅ£p[Ç¥Ÿì£¹á{G|sÅôôîÜñÑO륺ä>qÏ Æ©¬Te1ðÊ_» u%HZYƒ¥«d`½cvo²Ž²¡®a…Œ0ãÙànÁÍcjËföŠf@›QøÑؔGáRܓތÁꢞOd8¢£c‡® 1TÃɐAŠxÜߜ8;à¦C7Ւ¨ÞãàÒs¢=SŠÎ”¤ M£×”§÷T§eö(8ÝR²n²µB11*_«„ÝdlJÙÎTx&älHÚ"ñRÚ.”¶«¼}\ÉÜ©Ûdn¬… +á¤Ü]%oÙekÙ«d1X灢㍃;'JÞâÙKÞJÞ7¹dîUòäMêÞSê>RêVøg“·c'oCÖvi[¤ò#%î*oŸJÜÉ$nÊÜ.oï)sSâvfe7ƒ&w`AºÓNÿ}ãÿ^S͐Lgœ™•ÍewӜwõ_ý߀îïj¤®ðçÑÍÖÁaðíï°ú;£®Péäàx5‰ ãDÜA¯ ùlÿUcºþWݞí¿×+ÓûÑ`Ô$O œªºÁ¨ƒ™ögRÏæ¸U@¾ðށ§Ûþkû.P²Ýs\:žùcîô:÷ïõñtòÝz½ñ}tƒ}oº?užº£;¶NËӟú¿·ÿîiɁý-”#^„=\E„Õ¿aõ§¸qhônŽó.Þö{wøÚ7nÇdì°mdÛ(·™X»'VPÑý¨h6hƒ‡V`¨ABõ @ "Þ{Š×TÙ ÙÉlâAõŽ&$¬½‡×î=ÌdaæAÆ5qU?⑟§£õpôãÑÈzDÀÉcRÊ'_ØQÙ–ýqÙ9×PÎ5˜ÓáœO¾Pqɼ‰[@ç%Hç NŠ+ öQh°ÑÙõ)œ»+ït7s°ˆE„¸v³ñĜÝÔ¼2wPf+Yj܂™+0óåõYÌ°>¯W©¬ìdîã¯Ù[³­h紁½¯^]¿ B®bYÙº’g•m=ƒÙ)—W×g]Û76d‡ÎC®ë\Š¬l]íÙVüL­ƒrŒòdòv=Cԑª;à†»€ûÀñçœYÛð…m9ï2›NÌÞ'gÖ û“ Y‡'¡PþùˆÓ ëKçB!òÆÁ9oܟ—"Ñ´çƒ"ÆvÑ¥=t"øìNÚw—úýÔíªCÖÕ"Bi€}dΐû¡õ ÷(Pÿ‡QXX¢m $áRÌU€´y¥ÄËӝµësU¨†2ÏˈWã"¢s1C‚üè¶ +µó4»É|%’Vé¾ç£«Ð/È1K„…&ä…94ðò8fQÐIü ½-Qxi׏4Ë«cgµûäšÌT†8˜),…æ/9ŠKhé2*€‘I‡ØêY®RR¢3}jUhºùå›ç¿¿ÿêîÆÿ·T3õµW³Hƈ>¯ “ž5¾VfŒÆ2>SÞÖ"koîꋚ¬ÃÞÚÙKf€E‚aè-Tñ¶YÀû&Æ.ÎW"8¯¦ác+øÀÁÿ rt¼ÁÐÛ¿hŠkßËéUzî%à>05;±Â÷^|Sõ-ƒ;C ©:Qr½'»vÓBCkˆo¯½´p^*ë0­°Ó +Cmº +YUëe›A¢Õ€º £\ªö¢6ƒ¥Óbö&iÜTËA¸U0–!\Y­º¨æ˲¤úN8—Zª5a_å;1ª EEóÉPæfÎHVm!“ö¢ÓhY*fsÐb2D »J.-¹;¼"¢%K!SK𒼴?ÙKñríeߊÔxèJƒ ¬ÝB=Nu\•Ðߓ/rô’VåôOٔåLa3_Ÿ”Ã…r| ¸s †á Îöრ´(Óç(gƒ›[xsöç}Û³ã:¶¦p‡î[¨6ö¥ì@µ'¬bt¸çn;û@óg/tì¬n±îØÚd¿èþ8Й9xt²@èB[êµ­ìÚÕ°–­ËÉV)¬j{®É#×bõeO\Q͏}M?¶Í#¡ #¸@«gµ£š÷aGƒL¨6´Álh‰4õ[/îµ>šÁ,q¢¸Ý,hÌ·¡Ñ_MÚC>ëæµ^:ûف×°ißFÒýÕ¢¦¬=Ö3U™†ªžkÕO"¨!ˆFÜO\á~zÄÏr‚÷Yy±;|#{L\cyªø¼Eìœ"uNQ‚‡x—³Bä\D笔“UTöeìß%%iÐ‰ð—°–jk×±Ð5 +ºF?׸çó\¿¤)j¦„uj–*Uë¨æ%^U¡¦ö´øeWh:æh(¯u¼rSKN£”›Z¿Qé{UÞ°kUþ¼¡éDß¨ð¦Äþn­Æ¯ùµ*¿Væ‹Y¹³„2K®Ò7µ¾*ö“g<:õþ¶Sòo\—ópkáµñögñR¼´c­ÒÉKlEj ]i1}ãªô¸ë5t£× 9©Â!C8¬Êþ¤\oʹ?¢Ç®ËكF»ËÅ%©1](ñƒ 6¦Ñø å£bᎆg©ìÀuéiDü:”tßÇśwVV÷¼òÐ6íqez]^Õ[ëþÚê±½öyÎ6O:®Ó&ãàÞÉeΚñÕ̯7YÖ"Àž[a1¯e¦[=ØjŠm>ìµ»…ydJÁ²r,ØC½ÙÓ*àㆠlö±PjÉn²M&Ë{ˆÈô# ñ5DCAfÌ]„hHˆJL50DCCT ¡³Iä¨$rkúŠ2Te{{€¯Í\ÃFúÀ‘ÙSj‚¬JjK5fw<.x)`°†™¬C†EÖ3méDÕKaíÄs!ÄH|úç4²ïR,Ùð?°››ró1å}˜1bjÊÚpþjgHC­ð!‘~3$؏ÆfIr»ÑÖÀñ¯ á^½zöòî«Ý×Fڍ°7œ¡öFŸs˜’«(]¦ñrè¿&¸­ h&äv ·]çHXm €ë¼v‚ÑÉÁµË‰[³K≂U¿¾&/h}ØöbϬXG7<6ãÃÐaYÞ«úê½}uK¸ÐûjäÍõ|k暓ô d©8w–±n3±ÎçôÝä‰ùLYb®…s´,1ßyv›ï¿zýÕ+§Fˆ9 Èe®X4øãÊmò´XÇg,ß×xé‰Nª¨òÛì\E¥¶‰’C^e͜G˔Ôxܤ³‚ìUšPÊ%3H}žÌ@ñlÐK trÀe[zx“¨phYÛÖÁM΃°< oRåìÆaáG£ö]“q& uˆ +ŸVOɃžj©f ý#5«©Ãی(Õ´ÒÌ.-Š¦™iÆm!⩕p¦Ä %rG©q¾XÎøW.”f´*†]ùrbAZ©ñ=O|hytþ#5~æ?ÿ{ÔøGNrc±‰Zȵ:§<ñÛl:G; ~bºžp”µ u@iî]hy·ÚO«¼»êjªðíÞÍtž£TžRaÛgB&Ïr•ÊW2ÓB*w¹^qµÁoyKã/“Yt—Ifú”Óºã4õO[®k>³maR•ã¨µâ:—¸Ït¡l8ÐÆ}™#½?y‘øíG”‡¹ÞG•ïküKÕøqQþó`kz8±³ä•uÈ,CÌÉLZê[öQ^´©]¥ÊMÕá>›U‹p•œ6^C”®iÓºuù)Ò8Ý;×o)? XÊd"PäP˜Æ“/èNWX Líꯈ!Бž ‡¶£>9øq•ww¢'åMÂQôÏÁâæàé̑®¥îù:§•U·X@RÛbÂÞÛN³ê5§^Zë/[é¶ûcXôã™rš³F=ÓÃe²|é+ñ1ÅpÊï/óc‹Ôøègÿ3ÕؙɎ'é„÷²|óM’-ˆ\ºG˛63_ÚÀLi{š¼fš»Fˌ¶—õ¦Î5¹`â‚y î4¸Òԍ¦q Gf?Óh…T³žÑUæé¥K®!|"QÔ¸„Ǥ–Þ&—öôÒ-áÉææª.®êÞ +•0ºSëØÅ&\w¹Íš‹.,áQÓ*ÇÙÚuUWÍiÕ\V½Ã*4g•e¶Ïd¶Üº©¶Nª î©'_lT—ÜS+çÔCŽ)©ñ‚cêœSên( {l9<¦Ø=ï/— Z'…ùFè韎G˜.à&àB‡GðŒo7öqľXêiw}<)‡+^Óp?y~N¼T3ß 1ƒäŒ?½Â«œÆuÌþ–ÂÜaäú{>û;>7寶¦>eÓÁ36ûš­Ÿõ¬­fܟ9‡Ý¸®Ø O`ä7.Ù¥F~»S—¢¦¥Y*]‚¥.½ÒgyfÍÃ\”Iåp-¼°­!2ß]‰c`n»!Åe˜Îüã”éóÕi±Ñi˜FV'™Ö Ï> ¦Ã8Gó’5.tôqX럥7Ÿ|>užgœÓGÁfo Àyæ¾,‡Ìl“ãlú°h>‹žƒ¹nÀº&dð +Ø[8ߛóÚU¿ì¨£á¯?:ú^0#øq ¨ø7؊´`aïiá@™ë6ZhÈ)ï)0qÍA¶¿ùË@ÃÙý¶ûÁ€uÓ&ïoŸL–ÏõÛ2ý¦îz>Í +¸gJ#ËìÛÅG¶|¾³çñ½¶¸G_×t²iL÷DÅ3Q ÍYZèrÛ[¼öA |)t‘ØpÉ01k¼5üˆª¾±ê`@ÊDw\ßÚçÔ}àùŽ¶úœG‘ñ5ïQŸù¨ À±ìGgBpüf•€SjÎg„_ؓ‡ŸYùš,d³=>æu=ÍäÅa@ú0Ž9 ôUáos™û¼©}ƒòÖ'ïÂr~–m +VÏXóö»+|ÖĶºN2„WHoƒ®8¬×ß¹q0ðÐbÚÛõ}ùSßYåç<˜Ë;píÍÉl/y;îP½lë/øN/4chúˆÔmz©s ¦Æ3 ¦,¹ ¦òÔèRÌg%õÃoõÔ$¡²8ÒãŠ-]c®ìj§ÛY#§èm·vÒÙÖ¦R^y‹JÛëHÄÉVÖà,Ñç‹æÑIXÉ /¶Zx¡U؏2žG櫝åK&iV-4…©FP?ƒ°K˜<YmIV²r಩½¬Å,¼?È&¾edá5/‘Âêð;LÏKpºö½A7vÃÀö~øŸºín¯u™Sý¾-¨·KpÍ2ÀX–u6ÕÑ$™ÐÃû{¾Ãâ+†XùÌ] ðÚ-·eZ¸DÑPœ¡˜½¿yÕuXg—³6­²m´o¼ÄÕ·|½A¦u.zØb(6 âi¸Gj¶¼Î©Qm2<Ô+”ë/!õzúz›E»£¿,¹¿J~9Yþž +”· œ¿ù½µŸ¿$ùâeë}éú_Í2ÑË ôróD›O‰+–›B3SxVŠ‡o+2W3¾»ukexßwy¯ªá½æ¾êMïc(6 <nÜ´l¦{3Æ_{N¬j–/fœ¯º”¯¼ñ©/ñ¤„ e:_x»Í¹2~lá5ퟵ|xôhîŠÞaQ]ã ü£‚?ŠgCì3!BȜVYÛuÉ¸Î€ÈÜn"¼ôaFkÄÜ&déìE¯7¼aëR9+龧òÙÊ_C[â¼ ýÔø J"5žÿÍùËBN/:è/< :E'öéÕ!óIfÑuvÑñdWÕ=µçíÙ×æ2,~aMtÇaËNt>?Ѹ9ôjœ¾€[ƒF«7 Èq+¾'‡Ÿ…§OÅϜÿxAú“j<¯XÄ ªˆ)*´_¯Ë‰’³ÉµÝ#åšÚ䪔ðóš#¼žlšc\O‹4õðÁæ{*pÙ²?Fʄ2 .D £|x°LÙÀåÌëhÙa;T09,‡°ŒDåTIQ­…*%î™Q%Dʆ&B„üyRÞ5Èkî{û—þÓ׸Ví,ìۀ‘íN²àø¦þ¿M‰¬Ø§àwt­ÕԅêlUTËFQÍ+×J§â|âøœüù Õø°BqéþR+ÔÖO¯}Û^ÛÖ«A® &Õ)©q1k¿Á¶ú%„Ý5‚SkW_¿¿uoÙ«;³wh>äÒ<ÍaÙ2Xêõ‹»«ÖÙ̑4ÑR…‹x©ßqû.HRTŽ Åf3X—S%g­u +Ò¹ (¤F¿pÂÊÞ²À´k%nº|0ƒç„y(+Ì%7nïĝW{ºK=':>Óµ^æym™ëªµ|2[y¡ãñ@ ùH×c’O†EÜ¡0ÿñ‚ôwRãƒ* \’ù¡Ç«¯n³wUª&ß(\½*Ö´šµ¡©q³ù+r»ÜAj\ü‚‡zÅÃaåÃX{1ê% Ê8›Ï¼"Z¤ñä>í¨øøÕ]ڇ›ã4]F؛p3\aäp¸ê_„¥ %ó0år…v9^)÷ÁO«Gji˜Ḃqšyϖ0Ó1iÏ–i$ÌÐóޑ8†]ÌW°»Ïùäªìn³êUÉ»)^åõ—|tŸêÈKgyi‹È=‹ÑÙiN ã Zg‹×»š‘Ìkö¸Þ[o¸ªÿm7®ïŠm2YØþÜÝﺽåu+N@Bél}Ëw…­~8hÕôÎMV\™Îõmé- ÿE ¤qû»@n»kOïYº ×·D¿ D¾ä⍠M£¿îl_*§nƒEgâåÃTr®—å̓쮉á¢-=¾u›´÷Ã߶ûõd¿Ð.«$NÙ^-5ØcQï8îG¼üÉ;ñ<8>}Ž‡Pø=:þ{tü_?/g÷¡ÏEmˆÚº|݁)ŒŸß´>£¹‘¾[ÖíΪ£ÝÒ\ï­j7W¿¹jîîÑj ó–®3gƳßõúü¨×írŽ“›;ÖKñÒŸºêòyA,ŸHbnP™V÷yžÄ×=pÍÆ +y}1~¯ÉCó¹uݵPÍ#i!ø@\`«³lb·WTœ|óåhÀË û2]-ïyöc¹öÛæqgÁ£®b8wô(§YÐÐ@æe±õoÜÙ7Âö‚âí.úäʾ“¨Âº»ÿÿþß¿Ûýæùïÿøì͟±m6”¿Ô¥4§&½¼–æÉ'i‹kôš´¸OX|ô;1× Ðk¢âf7–¤xêúëH‚Ë—0ôW0ì»èO‰8t×*0B‚’ìGÆHXñ¼¡žÜskژq¾ë+NÌ¿}é]^35ñk²›UuÕ´t×UÆn)¯![/ ’¨ÒõÝäûˆ4ú›t×fÔ|Рù¸¸”3—{|ldÊ:1Dw¹Ç65Èñ|š‰G­‰¹Piø\W*õ×@ùŠXE8уٯˆþ®Ýºº$讉÷%B_§A7s7=ɟ ´]Ç.néƒãºµÒ­»¨à|²ÿUZ‘Ï'‘W¹ü/Xã9§Ú¹›àóšãI§ïŒær6•õ:‘µE`=ùâc°²Faµ,Ye…e®½Z=hïG9Õe£¬“ÈܜO#óÝ©õ1Öó·j1mö£í‡Ž_¬èŚâïؒüÉx«1„‰þ<ÍßñQ‰þÖiþ,vKdžOŠÞÒèiCí2zKVÙGÇo± ”ÆlH]`t±·n7É~òù”@߯‰ï×Ä÷kâû5ñàšX§û€ŒY§ù¿>üåïÔ¼%”§¿xýêWoî_½»õõ—_öª{ÿ›'_üâþ.èï~õìÝ»»7¯D«¿~ñ§·oŸA›·í–åj™§nà8Ïa7Åx5Èìì¦q¾’Å5ë_ë_ÿüGüý­þP¨ÿü'ýù¿Ê¿ÿ‡Pÿ(C±ûùî_þû°ûê ßú5¨-Պw/A=io÷³¹~×Ïú*Î×¼Â~týæÝñþù»ûׯž½ùÓîÇjùÑþõë2?µqyzóÕý»×ožîŸ=ÿw½§¿½q÷ô×wÏßýp÷wxãÿ¼ßû­ÖrÔNÿR×ʄk/Õ:N‰«&Êj)–%Ò. .õÞ˸”!,»~¦u­G2ŒãÕæq—ÊU%ÁJú9IE»´\Í"“í„5\¡¶”qEqÜMEf°Kéj”¸{Î×Jº’Mviºš`+ZÄUœæ²‹Ë•è¸4y¾ƒ<ÕìÈ©¾·\ 9L» ¿Í¬>³¹©\¥ n‡2\¥ïç«C°¾–ã•è3»iFè³´6K+"”î¤Bε Ò ‘í5¡Ž¢áìdÚË(«pÎW"²Ž€,ÁJ&7M L¡ÔÎ̓Ô:Å]œ¯pEÕn’ÁYq¼’.á;쉐®¢¿5^‰´;ú—Osº>™4i’ÓÍóU˲“Ìì<×÷æ«E¸Ñmà·ø¨˜—´“úJÄmÐ)È\0X’¿'ÂÈ}9^ ?ȅr5ˆ¾·‹2”Â,… _2Ï +Èu’½'C?cbÆl‰Âz|¸Ì|Lü9f|7f~©3°!ÐáQ˜ïµˆ.ZvÒ(Ft +Qç-¦+akuÞÂx%?Ț›e|G雼/êʼ›£L`’Ž“Ìì²ìfi S¬ïÉê§y—gÆ¥pë¯É&Ù«A4  ^žÞVׄ=!•!¶zéÒ"  D™ðe‡=ÀÅ,‹SΛ9ù°«y‘µ¯˜¬*4'Íy=ÉPYx\ÝyÒ¨ïÉL‹ÆŸåžg¬Fy¾Ì ›gHXåÛ=Ç÷~§{ü¨³_®J +^á¾y¹¢Ê:C–J.¥È~‘E†ŽLˆÁ¶•$_·ÈÄùC²—bW¬ ùRM–ñ2ã«AVœh€Sk§ڒÅ×´Çj/¼¢M·ZÇÃX®„ëÈXa²¼^®©QXå)ÇxAå,ٍ³,ëJ°¹“õ&Êi÷XԖ[E•`íÙ{•:]‰,sçWQVAמì½úYþXýp¯hÓ¿Öõ¿ýü÷>à ùéÛ§?&Çðáõ7zúúw–1ÕW+™¬%Ȃ„Æ.`#'™*ÙÀ!  #æª~°ìÃÀ5-Gê I&ù*DK²89NdvÁ°qlŽ¹¦i¹šø ©y†å<óÁŒÍ.+/ãÅaéÎY.ƒq€&à0Ø4ŒŒiȺ–çY¶xtƺŸä§8Ë'ŠRD³O•‘žº[ý€íb==Ö¡‹pŎh*W©¨‘!fJ—fp·¬‚Ì}~ŽT9âk%LM{p’A˜Ç®.'X›ö¦“e8‚(i]]"ÎβºFb¯ú×ùƒÞ¯lÛÓ6ãÂa +\àCšLêÇ<—„Å]É¢f‹d-,iE1¯L>5NÆ^+i×U&dįZ«F±WÃÕ$¬¾Pd ÍºÊœ²nÕÉþy^™waÛ×ndßpŒDMEZ~¹¦"4!a×îˆÏQbu#`YV‚s)d jÍEgØ+r‚µ÷¼.>¥Y/a{E“õÊÛ3‚íúúYþXýðZѶï‘ô>ÉÀ-t€©ª7hû‰Báö,( ¸ÓjУHo¢Â­ ZlE[Ü ¥ê‡¬¦jЂ˜+ë-® Z¨m‰0˜A ¼”íU‹ÖHK‰ð•E‹ì<±š´¤ûW0­»I „I>heѧ °T‹Øo˜d ªE‹œ3¿²h‘±Â~e-*Ã~œ;qvu6µêÄ'Çcç C–€(¬¾Ñ`cuïsi>>¨x"Iææf(ÍsKÖg`¨‰UKðêÝp_ u036†â>óRnMqê܁ðÀEh÷ŽXê ™?ª;”÷Br•skê‚ÃRņæ”#OûU]‚#Î\™´æ¤E#îL¤WÝW¿Ou Bù_&,÷êÄ0љbõ R[ZÐÏê_øˆ1îÞ*ÒR=·ªsp¢ §ŒÍ;È7(Õ=Ãn[FÕ=ˆúJ–*Ü? )õ÷Ê (^µ#¹‹pš dÊ7¹p»éý3'!Œ\¦k/!LOQÝM5Ê ïN·éeG!á6{¹!9ÆX¨Î9XKØ'wâ9eí.ì¤7°«Ê~¶{—!؂H´KóB7¦uÙÛsÊÚkØ=èï•m{yÆq(s-_0¦çF.B÷ÑM£œÃyl®¼JX»ÛcæìjrŠ5¹vb¦ìVt›qêš4ÂÚ{Øó÷š¶½üO"u Ó3¿]€5².pœ›Tñ{Ñ:qä擃: ™foR„3’â¬Ö8#Öi†º!¶á¤:n“p~'chccöWS©¯Ê©ÅVåÕ!ÀD-„†“®žêS,sièîŽ<ꡄº`‡x± ØB•bzNQ¥·=(Œ©@wlu5Êб¡F–ŽP˜k•EaÓ»V+åyT~]{®vÀë:éé{ä¡Ï⢆w‰Kbí£†=Y§»:©áW"ìÚÕK=ŠðƒÄÆMM›5_­hð]vN ©_dNŽu‘UOõ”b]Ÿæ©vÊÚSݬ艻"ô”»UÖȘÖÔû¦qæ ɦk=L—ÝÕDi\ ñrCÆá=ÍÍaíglõ";aí´nÏUt««Q¬Ñµãšg1M^„lÚój£•°ö]wÏy¼®mO¿3÷58š°²Ñ<\5O·EVÍ˄&œ•æ ö":Ãäš'ô3‘9×TôC9K2½÷BLÓ¨Ns$‹ì/ò(W5”ÉÐ(wL[ÑDÝÐà±Aí“4§ú›Ê\òxEóæ0i8 +´O]XR§V%;¢é¼4•EKѬý4(àA°Z¬8ØޔVŸ Iõ”f@_ä“-ÖÓeÊm°<ÛC—hµ{¹!ËñShv9&B³¾Q¾…ÇGd/+Å6‡ xcmÊY–úªìçÐÛ +1áƵq×UCLw­=£Ø‹þaþ ¼W¶íeç”õKÿV>²—ò¢&TÀo蹃"MX–ó¤ð<§`cTTR÷ lÞ)­*sŠµê¯9«Ü*ƒ{†ÖÖj¥Ø«õóڃÞ¯lÛ×ndz–„sYÔIb1_®É8Àa'å®U³ &–Ã\ˆâp‚s€ø…ö\DšÁÐÕå”Ú¨½êdˆJtÔʁSÛ´ŸsÔO«OµNՊNºÙ†6_ñ +§zÕCܑ#$gÅ%Šð¦æ%Jæ°ÊNd •büvë+™Ðµiž[eÅZµW"%¸!¨Þ"ÒAh7ö˜fæâìœC_™S¬ÕçÕRhä Á]e r@ê[5Š½êŸçz¼²m_ûQýîÊ!«ú’òR¥ÙF†9iE€¿ÇqÜ=Uˆ4à°RL“«iTüAF(¦¹«¬Q¬Ucú•¼P„šw­2¡ä…^ïÚj¥X«õóڃµ ­²m_;n‹É&8 °y^nÈeCÙ-)Yr—–Þ×µ4ŠuŸ2õ@>ö•9ÅZõÃÏÉe&h±V›]éÚԟíµúiõ¡®OVͶ—Ÿkon“¹Q!N#jêå† ÄÍ´˜U&æE“HÝKGilWˆóÌ}eN±VÝÆädª¸­.˜f—¾M%8;°o«u½ÒŠ¶ÝìôS´€-³S• ! +}¹!X4¦<ÐK*sœ';×#…øJ1Ў}®T°×Õ(Ö¨{«œa¸w­.˜y§Ô·i”çUy¶ó½^׶§ßÙ"…%FÔ!Q!—³º¾Œõ<ƒ Jôœye¤¨þENl?[¿DNÌ"¯ûCˆX)¹«¥¬-×ü•*Û;Òu_ëÉžÞZË}|¼“Qý£­žmÏzß鷺õ‚ wy:U†l˜ÕYKkÁê ê¦v\ ÆvUŒý1`)Š*Z‘¬={¯R±LÀ«¼"l(íޞÜY¬ŸåÕ¯mû÷]mHžÈƒé-3®’|¹!C6œ-Àh‚ +*Ï0©ô1˜æ+Å9Ühåõ1K_W%X›ÎߔšãÞÕT,Š¿5Yº\'Ý·ùƒþý^Ù¶£ŸIôØè”ÔNVٗk2,:pcC݋ã¢à +èM8“LV…‡/¦î±A]y]M•R›´7<±;»V­E¡tmVŠ½Z¿­=èÝòʶý®$dðÔْúŒŽtiÔɐð.†=j\ ²^I*ÁT€[Ñrÿ¶Ý¸ôu9ÅÚtmÒÈpÖªÑ*CÛ±tÁÞôóçê÷{U›n~7 ”†žz“ˆ¹8ÛÉ0k%ÒÔ¤ˆ\OH¢Œ36,ÌAcë³+ÇþÁÁŒM­2§X«þª‘'e­2¡ˆv»V+ÅçB?¯=è]ðʶ}ýl‡00KA~¿¹¦–šb6£%ƒ¤¢”qíC£˜0k¶EP„3d‚ê*sŠ5êö%ËÐ1?^«l4dªµZ)Ïë÷êçµ­­®MGÛ~ι÷¾}Fÿf©©ÝVÐn@Ü´ªÈnéöÇҀݠñ¬^ẠbUJCuÃ90‰º3&‡f×Ó-ÛB˜FnndíÎØÝ3ÒbâݺÓedž熱–Nå +ç†w„軚ð¡â· ÚEâ2CÃr' ó©pöPniO#*’{6ŁÜ3p°“ô8î ´ZXŒ;/²©Ch(nJÚ`z+7LɆ3÷¨@˱¸‰‚År âh,/}æ(›W ÷É̟Ø< làÄÃõîF5£:næÒá²ONðÛî Ÿ*5Ë'Kwʊ¡‡R7ªA®[E†ÊníõèíöYõ1ÿp«è¤ïq}BE”ÑÀ†tÛɺ½ ‹Žü\‘Ûðyðç¸ 7¸QÅm ƒ—s35Ø6ó‘5ö(øl¨ÈTÔvZ´1Çbc` WmÙò C£*5 9`ÃF8׫zÒÐÚÙ=4H6ÐÒ\UDöug‹Ç†öްؓ}IX#–I•­‰˜Û_‰HÇ?…Ø@ØÑjYA° ÁAB²ñuì50ß5ô+5Ç¥!¯Ñ祯±âM¼^çbìÀp× Z’*ìš)ŠSÚ ®…ù¤‘™Œ t Ã5«˜ë’°‚\Ì?µªB®Û⬐ëÓåzÂÀ»"¦k…¸nTCI3™T®ÎÕL¶B[cSêóÇO0Ì­žFè¡ÏjéV‘¡¨[{=ÚÚ¿Êˆí³­ž“ÞµþÃЗRÚ­µB£Íªîài5ä-ÆZ„\FÖ4ˆµœÏs_ÖëJ­èZ‘£¦­¹5¸Ú¾©ÛG[5'}kÝŒÇî Î/WÔ +…ÆÄ城–ђe®Pհ͍¥{ +D/¯§VøæF5t­Ç€ÒÞX§öOªyOj%Û®µ^#ý“5® Ôjàg èØæúI=`Zˆd˜þXT¯N«È =œ¹Q öÜ*2dtk¯GP·Ïªù‡×Š¶ýk]‡ +~úxº+ÚYö‹æᬀhǘ_uœƧ¡±þ˜ˆBCê0ØNXA˜Õ Î^‘¡½¹2íUª=©•lzvÉÁÿÄ\â+He#W$}GÊe))çxÉ%n•p±snԂlÝÌ o59a…mtjÅ@zE&éí­à”í»*¹}{­ê´“ߍNóIY?.~Hv?úõݳswàï_>ýÕݛçw¯Þ=ýow²ÚãîG?}õîÌãøëÙ¿½¸Óüìõóî¥té¥_½¹ûÃýÝŸþúõßÖ~¸ÈD+¹ô]¼“çïïî¿þý»ËCSŸ}ýÍSÓÛ7¯_½ÿáŸÝýîÝãŸÆðHWïïÞ~HG¯_xG5¨n~¸£ÿtÿÕ»ß_œÙ›'z·ÓÍ«¯ìå'g/{ú¯÷¸ÃUOü›j£eçU!Ê@§¬ê©ŒÁ´dýkuӓÁÍ?ôƧÚdm á·Víê…MNöüY_Çy꺊¿èO4Ëy20;jÄEjÐrÊ8 zy÷T/ïŽëä9Ic¶‘;2zöyPւ¬ñìAä› ܾF{J‚£µ |”œ@ÕoàžX}©¦áØ rM¨X•„F ¯–£BVôèÞÉ5`z”ã]T3:{D¦ó{'2L•ôî ‹]ÏÁp!LL B¡O(ØøÚ@jLPÉQûˆŒ:%”%„©õNo + €ÈE[3x»ž¿”AàósYû&§ú’sZ,€Y‘’ƒyvƒþ<3ô„H³Ú·žçQ_ qQJâ¬$äÔ&ŒÃîՄš…Êၞ>—,<.«²ã\g)éó8ò¶¤Áîè’‡Pù¢ŽßÊ»‹ÈæµFv¯Y3Ìâ±qÒDR˜ºf‰M+•˜g‹?g 2œ”4g•L4ÎjžmÔÔMLíëÞ&íÆ8؄ͣ d†`’bA]p!µW#5á÷æE3¥ÏÌm Ae±VJHt{ ä­9¨ªEÜaõ¦¡OYmècäu t“~\¤Ñ*#{ìÃlqt0³±ívuõõ™ƒÎp(EIKÄì 0+((70z)ˆFO¹M¤…°å c¡$ý‘[³Øæ!eö¦0 ö`âce,*ԉ"ªà`\óHJ +~D¹Š®P[˜û¸6DIˆïÃ=‘Xü3¬3"Û ï'ÐÔ~QÌp§Fföƒ‘kQg-t—/0Á“8h .€ÛeR÷ë„5¨8Ì©{/LLùœÓ¤µÃ+Gä PŠ7ëÏÑÝòðzÏÄtƌñ„'s‘¯[¢¥@?J" +3-u +™)£„ÖÀÂ̅¤§…éV,̬`îǓÔ!ðN2.˜ú–¡ˆ{ÛFKÞÂP±šWŠ>ƒH1^d¶` ru‘ŠøÀ<èž!`†`áYŠ&º›ÄϳÉ`9@ öš(K÷ZÖfôŠŸ×9à9‚ Ì(¦x† CdNŠÎÈmϋòpëÞ¨íå¬+”f¡eä-^+´!ÿÂÏã *6ß L$“ùف&ž£ü"TBÿڐ#+cÎHi‡2 +Åâ/ÁP¯G¥"ÑŒay¨™1eb}3PYSÄ8ÑƈJ+Wš4{é tÒ¨NZ‚HóE–ƒ€ ´ +ãrcf ê‡pÚ¿Ñz¤{ w Ç6nŸsa&ù\@c³á5œ9zJȲ²´p);5åoÐ„u¢®í‰£:•˜‘|QNjå(˜ç"ÓSp"/êÞ+òbW,ÌHè·`H˜ÔÎêl‹g¤ßžf瘸S”UFY¥HœŒñî-5èÜËøǀUL#R™Ç'ꔍ¹8±[`j$àHBítsÇ¢‰I„À¨#onXÌ¡Bc+f`ñar[ýl½í ©ìEœÒÎÉÀê2Û##ŽámŒê¨‹fŸçvß@ÒNÀ`=¨[†g\6~q"AžX)#àƇ{z»¬/JD—§ÿÄT›¸þ@Ȇàí’1z(úÌÄe¤’_0 àk4y +n±Qùµ½'L¯à,*vZÂ×2{‡ÐN•LøTÂóªè¹[Ã=܋É!u¤Œ°[aiêksÆY²èÇ%ñ^´Ù2ð:äqó + õL8À£»ŸeÅÏ|kô£òsÎZ¨™ñˆ!LSå#Í`+ƒî1ÔôáBH6<ögqS÷sÑt‘VôŠ„Û<£Ú@c‘WNÈfUË‘!* Ï>3èó°ðÕ<Ó0;‘½V¦ 2¨xoðË_8ȶa£¬ïQÓ¹*ßÃ,…¨g¥uO>KNf°”3Â"¼ŽÖye:“rlð’;AO7&D¥¤¦·…· 3Ùΐ” ÏTúUü=~ý¼ÔîLz‚,B‚ï„¡ÉëY×2;'KÑdãŠ¦TÀ‡L˜ŠæÄ:T1Ÿ£ÆšœŠ©4ՅJ& +ÁÛ:ñnïÉهÁ¥> }Šä[Ìã-I¡gÕû܍"™\eȋ&暂Þh)‚f•y¨ªòøkD8áxJ°â“^Lüÿ¢ïáÄɃvÏØܨ[…šƒ)ˆÀc °6Û&ìÈ%8›C Äõ èµÊö•…‰àêJ¸ÀÓښìož‚þ˜ÇÙR©© p›C/Kòº(Y$¸í…;|'? Â<k0d„›û{Óò$¬0ÚT3w‚TG%0Ÿ7¢!äù{ 6V¬W€L4Qs価x”ÆhrZôsaÄÅ÷’s,šˆmÀ«Á§t0E䜑‚Œ^ÆAkFà ‡¨1ÃàHýçx㚓…€ƒÊ Š´Ø0 ”š°T–Üú´S53Ÿñ©‰„‰ HPœ8$M$†»ÃB†jŠ9ž¡@ʧÄÓØöØ©ÅÔHÆ[̼1K±r*¶é϶ M¼ò‡LͩրFà<wgTØ6¨Æ3Å­T¡âHª+3Ìͦ9ô"©êóå2'ͨ•Yp”aP0) ¶-ÔP8ê+ ÐA„%^2ù‡ÏßCBTµ?#â“¢œ èÕACŠ Âð,³¡„#s¥«vE“v"SŽ†ºÄ&ãiH‘b+lbЅIôØa´0ДãÍaß!³ l9s5Šõ ™ÆLϵ6·x(Ã@üG!KfYQHq¿Dµìqû×m @$ÞVΏï¤Р¦O€‰ +q»s§ `ÖUÈU¦Õx„“FÜO°~ðj¬Pyt´<^8™••ƒ{">Ï,\X…qaêDÍ´âkS”-ŠZ…k3è¬K1¼xmdn‡ZÚk”Ì(|MøÆA›ª¹‹~dŽzò cÑ*& YÊ\=zÌú‚¨Å¬‰2ŒX8àW©T䦉çÔ¤W/qê8FøZDÒ¦.\VS eËgs+fc¢ `*²*gþš–… }±~‘Ü”C‰ãqÆRÏ*l=¯¦q•ŠêdÀؐYÀ[¥ú™’ç¤:¤Ÿ®º+‘çËRBÃC¤rM{„å\võˆ×ÉûCP)ä4’³C}Ëú3Bê’TVbR³T±Â}©É(6‚wçGŠ.„8¸îìVDÐ%F-2—|⍵ŠØc„¹ ~™ç«êÉȆÀ›0 –CýG2iÍُhOŠ¦ÉnޘJg?yN£&A1^ ¤0¨/+ÔJäÕ  ~Eg„5-ëWyµ‚¶Q¢QÍ3}›°%ք$vqEZ荛ôÈV;g3õótЮ†¢’=Nzê+‘ÞO †¦å i³ã°h0ëÒFÁaxE»Á°0ì =Èqԋ6Æaғ6H{Ó1Z‰wt`‹ÙL5)±LvhÎ]£Ó¨|ÉõñÍÌú½ˆ¿D¤oHŠK¥¼j¯Ó¿˜l’5»S(0=‚G3¦Ìo²«¦ÔRÃÛPŒÌNštâ5&H¤ñFîÝ@ÐðÒÙXÞ¨÷¢à8ˆŒ*6•JÃ@Õ§ÂÌ°£jˆö¹˜‡¨ijÉQ^Dz’ÅíëªG¶­œ;œ>WÈ\¬,d}UøŸ†OÒMÊâ7ÚS}#ˆrRÇó%E“p¢e† Èj&qƒÛdYßǑfÈÅÂ?G¬w‹â¦p6Îêuy^mnÊ&G…J N)Zqu1(£¥à¡%ÔߌeP2­j|pJêsÎjáªY@án.•‹N4Tck1ò‘¡Ð ña¸ï`Öð_žGجÀ,hÙrÛòÊLæ؂鏮{ȂŒØÆ-svÛfÜA3j4j`ÀàhÆr yVãzUjÓ't©7Mf_,æu1Y‹Ç}NFaëë?Òà–©éS-KޘÕy¢é;»½X2ó¢‚v#v4µ,pBy V3Lu´éÊÐ´Ö x€ƒ…'¬Ž`¾ óÛÏ%òæøÅ7öÀBÄLVZhg.õÒਠ+_›ÛêöØ%Y +‘QóÀ.Æp°§Ó2©»†©eµwH>¦5 jvº¦Ò¼ðÊ΅Á¹4 *çlþXÃ@G öqŽ/¦·‘«,Ò'äš>ˆT˜:àMƒ6Ɋì¦Ý0G¦á„±ÛW ScrçA;ÈÕ²˜S!"Y¶êŒI5Ù`ß"ñ?£R'MãÃÄKÒÈç1. +æî³íë[&BÛ¯B8p֟á;c²Ü]ÉØo¿2 Y‰!9¡2 RÛ©U N³¨I–%ð‰Îþ=ñöÎD¤ t °ÑiáUo40Àç@¥·¹c:~†Q7œ*Ÿƒ5$;²pÏ_èý$‘q ¨/i‚°]…€óG~,~?…î­í +r¤Ôæ›Zc¬˜Qʏd؎ ÐXuñ +—- ºQ¤\ÕÛ=)ëk0‰Ä Ô‘ ¢ì(EÊØN•À› †àiA ÷ ÀÖÉz¸ ¢ +slVê‹²÷ðë‰k~ÊLÄÿÄÀ (æãÞÜø¶}À䣢#„ ÀÌ¥ՐóTL^"€:sÓ'7¹€ +Ȉ >äÞ2=eôT¤€Þ/jUooašáÇå9’ªñsô(eN‹ÞkͅgoBÄ&èaÐxPô'½zAvaÒ7áæ«.<€“²>=€š™"ShÁ4׬ú­kÚâlxøF…i>˜Ò¢>_Ú8•ÔÝ;E_h3/€P·*mÁ¬L­0ƒ*el•Y)@i­Â ÂÏ£Z‡Ý«PA0þ¤Yم’}Òjiâ_Ò5®RéÑ ÎÆlŠr±tQ4ˆA(αá^ç}WcÐtªXcËÀ,Q=Èzg[Ðä¤óRBmn “ÑÐt +©“E„àBJöµ@L¨ÏÑ1G +/g„äßÙ©.Ðé àé±êË5YÓKâHØÁ 0íi2ñ·}ã̞g›5֌¸'aw0é)çu—ðVD{gaí½R +¨£4 1T¯jê`ž²¹Ót˜ª¬>)¨w’K +· 3Õü€ð½^ß]e3óÒ.J&mÁ*ÀŠÜÀ¨• bט WC’ ȆÈ((pHJ–Š&¿¢JÈÀbc:´cÕ/ø³ȝ‡­ÎŸá]à ìnñ%0H žOÑV†u´ÿA&Æi¨-8‡ƒ5›Ø'՝G^CO3µàÚÉݍ0J\ ØHý‰"8ðêzPèae,ÔΖAÝÛSÒ‚’˜‘òdªÈär¦c9«ѵzÁÔê† ®  ŽÞ±ÆCæÎsª‰‹­‹BÍXYxgÌߥKp«)’JµM  +¯ µÌ+Ä8É°!)€?Þ»’é†Uß6ÓËéSœ:^!£´ø%&ÌzÔz8òÂ4HÓ)[ÄLáÅ“‹«°k†!ë˜Cž¡`teçZEûuRÿù¼=ÄÿɨÁÊC ³ú¹Dºã9{.OÆ.3ŒmƒÂs— ̈…ë +s,\4—EÍ + çõ&w,׉b½/ +ˆ Àš#“<ð1µ@Ãö‡«~+ÁµEޛ ' œVžI·Šæ³Xè¬ä!zpi+¨¨2Gf!3m¡k”îoy5{,®1Š‰bÓ̜âp½â»£›(£ÚNãÊBÕŒ´Ñ0Ú°öÉH60CŠP:#c†2€Ú !™§0íhó…dÿdÕL­{&ªB®“-ɉ‹– VQКWöT+ü¢oÆ˖Åb¿°{•ü5J]“Y|@ z c$ŒŸ ãìyµFä´äŸ4:%EŸ2aT…ÑR#ɖ»{[ƽÀ¦g$Š‡ ŸF"O}Ü[];£Lœ‡ÖƄþcÝ Pv39£¦E†R;bXõ.Z:"'c +|€ÖÁAÝÖí5‚â ÝÉø¡DBö,o܆ƒZÔí+‘1¢ìô­Â«Âp_#;ù×U;JÀrââí2̒T±@Ø)‘1°^ñ›õÛèq‡hnŽò¢þ3`Y±d§YÁ”Ld +ÿã:K¨àGb˜žÄ¤á>?: KT„Ò§JH´ô©©ƒÙ"³Ü)°•žAGÚ_£ “K¨3 ™8îÃh\MÜüo³‹^xbBõõtȔ¨ˆG”Q6Ë!¶æ:À Õ5óðÏf–Ä6牗M.û/.DåI8±Auú‘ƒ1h¯'Á=b9SŠ„Ó˜6ð2(*MXâŸ‘)›È‹A÷›ö÷¥c7'xàãQ·ûlÿô£e7ú•¿ B$Ԏ¾D¸íàX&°3ê{ØøxŸ¿F€¨Å’·3}ÁÌ)„n"?]ŒMYqX)(¸h79L[΃=:b‚ûݺW/õ†ºD…"Û±X!ˆ{‡+›4OÎ<Ä„E ŠÊ™ƒ‚¤æQe]{/¨åéêyE±‰iY½G¶ÅšnsV Ê&÷‘j @’L@ÉYM4ÉØØ¡*l/Õû笖ÎyÐ3Låðæä:1¨™Hhªÿø™p`œ)LA”g=¥÷{ã3Á;gUÿñ3Õ|‚™=´ûÄSö»Ý0êhÄô’0ÚÒ¢†5͑1›S/3 ̱AŒ%áÅÈëab<,)‹s¡7x¡}ð ,hÁmÌà¡Èí!uÔSOVÅÖævÕ!Ò刍þêW€ùªªÔ`Áۏîǜ)™"×!ÑêÕí602X`iéÜåuùT+;SÏ òŒt·ÀY0Ü;¹h3©ûs6ô¤§Ã\ªÄˆý¦3ëDé•ÔÔ*‰…ƒû^H8`.Í¢áuÍ’£÷³ÁÚÄËoÕçG³°ô‚À%3»ן¹NTŠ¦K¹pYè6«{$t¨±>ŠwÐ2Aeõåïd†€1±Ùë΅›ýàKŒG™ûî~ô›woî_}½ûÁ~ýüù·/ýúÝ3<¼3«—Ü@œˆfQ¥Éàe%+Naª¬•-ÃÄhmÊzÏÒÐÁ‹h‚‹v;­¤ÌÖ‘´¤ öC[óAê¥OÌz?¶ûó˜&œr ˆTÿ*ÅDŽYñ0í9˜h&KÇ¢z—ùÁf ý:Ô÷TçDä 5¯±^ ¼ð–˜Q‘‚t†É5¶Ñ€PÃA6s ¹š1GˆoÞô`™`Ró“k,Ȩ!* c¹¾§\E9¾ŸR <¢„ÙÏ@̓øHÌS¨,Š‡+“hxä’M&íÜqÝY/=_HµLtf+a´¹%VïŘÚ{ôÇ3«bÔ÷ˆ®†K2æil½ š ¡$µ1å4¬(¹Ú¶Á¼Àwq˜5ŒÉ`Q™€ñ2f0Q‡ ¯s ÄËÍ18ññ ê"·èàz)»ê‡Á~öQéÅ®O†gÏêeœ-‹ÝeJ·ϺƒëÀ3¢Ç“§IñkŸÍ1;0d€›ÕߛådÜ1ëÖ1õ¢…–pƒ2yèMê4iáÄŒ_BDDHã\Òÿ¡<B½kkŒ¬ÀÙÇ»1ʎ” ë± {g;Éí5ð€Dˆ±j/ı !ÌÈ+®`²’Šau„ f½+Šà½(+däPÀê&ÄRóÍÓ@ã2·‡pâÂK'҄ú’!µŒpmÆNڙ8ýÈ~4Q“@F „{&;wq½@”C¡uÞ5àÿ¡ —º7!ÓA3Ô$ õú£Â¬ S»4 )Œ€(„5œ$À0à– À@ù^žƒ 'óìíÅ!QL3RŸVÒ5£"äáªá‰?a¥¶©’à3±N¡ ÀÄˁ`:/Q¬6ƒ5þ BáWEå5$À‰9¢a€@ŌCã!b‰ajjKÔ À”›ÙçR°öÌ؊QîNÝðê3²ŸE~¤\ooÑ,‡è M&¸[DïëÍã>v¡4s¥I#eô±<‘ Ü‹blì=£–¤þ‰> ©žèl]–p},~‰1qýÈã5P ¹TaᇸÈp6(:B{¤ïx8×áú›GFæÑdGÿ]VI¯EÊp͝€ÄgÑ)9“îdØÜ5΅­Ó9|»us#<$C5@bÁþ[h7?Ô©ÖþQÅèç&}Kwä¢ÞvpßPÔ3Ïn a~`<¥J̟’ý‚×<Æ|¢"•ùt¢âg8@á¨'3g<•ÖÛ¶ÁXÃь˜R¬>ø‰+@1jÀԇ¢)Gšj¹V$ãö1Ž2*.󀟍×;â˜Á!Kïê‚ÀÝßÀœ©Oa:ÞPÉÍkHšˆËÔLÄÑ¢`cR01ô’´#^`Py«Å±Æ2«¿{R0bÑÕB +ûŠÚ×HéÀ~ê=FÖ¹E¯É&ҞrŽ½1zÚ;´Äˆð‡:BH ýñ­œGŒ×4è}{  Î›°¸¸FõԐ³>§¬o‹4Æ.ŸdάâîyYä¨oª) >ð@R:s\V‡ëHYbѤµó¤÷Q‡©B#,´ÃÏY2qÞÊ¡×LΪ¢ù­Ðè¶n„f\Sx¿=†+™™ÓØA2§@XJØiäÙBw±GuñëR<‘Ï?¿*À¸†O™—Ô³Þt y˜aþc½«Â„2^D _T±MõāFÐs雅¡­ cwªêàמÀ´½À{ƒE¥€VrÑ@c– +îÔ¡½GãX{Ï´ªZ½è'j2#›cƒjÁD}Ò߸¨iŒÑ“ å-5Éiçý4꿇ßvÔk+Óµ8-˜sIcèà‚O<÷%­@»]ƒ,éªÔ©<¤$UGبڀ¥õ#Ð-kڎ@+n/,}s°‹'žšÌºMûÊ¢x‹Ñ®­Õ×pÆ槭ymĂÛ¸ jo5/&ÈvrbÈàÄ Ú'Ú<ü5³X"sEb˜æ¤@¸R4švi+óN´à½h˜„&¨êx?Ó§†ÅC0¸ én @†`BÏðd-LL9+b5š ¹Yc‹ûƒ16¥/‡+Kð]ׂ(ٮꞡ½nēÎÙ wŒÕ´°¼°°£Èõ +<0¶jYC”"1®I¡A$D^-©vYO×j¾lêcåO4Ùκæ›e³šk:IÍE£k1ÏïûT‹­*£®üiÒé&(½„Q-êƒnèiê yhQjIæ¨X"PcP‘pj«XPiåš4†ŠŠú“Þ„ËŠè§Q“¼™ò¢ŠÖ°óëàW±s±XÌd±*Æ«uòԂ‡15B˜—`FWúۡń©Ó—éßÇ*1քúp²Æ¨“öºï “öÉ£àCµúfK{/ºµ2ª-Ùó=ï±ÊA?O#Dé¥Å^{MŒ 5 ¬±ÐӃZC™D<·]C—Z…CjhþlBc0•ŽOÀŸ¬gn·MŽz †Å"²g W( „3ÃØ ‚Ëü´¡Cã 8§'íE`þFFÊc 1Ì6yæÆ$5w^²°`±“E®Ú.Ÿ〴À4ãÄY+©(¨›—ÁÈBNë¯yª†ÍÌݐÔ#Çq\&K¯aoe WI‚f45ƒO´ Á’§ØÔMp5ê†OáØ¢ñ–÷ܙ±7åÞÌŸGø(rº` Ú|; ¸Y Ô¨Oi\t0<åÖ™rN³G µõ²ôɐß_ÁÆ ,,Xn +} 2›Eæ) h´0‡àæHCe³?ù{âg&‡\,õ´4U&°ÀÉīِ̍šìm<Û¾4Æ8ª+S±ð Z€@XÈ<3`ž„‘§˜gÍZ•û;÷ù^4S=º%Æb!åþ‡TlfFÒásPã2'Ç¬)ôÜÐÃX$JÓàʨò#N`fàøªÑÃÐÖAKѲ*GKUÎ@pCƒ?=w`oý4^3›S 1†œ¼ÉRm‘²˜diN8[¯¼§?Pÿa\n UÔj²:«mî«ûØÉYW–`iAœ›¨ëâhö tç~’†¢ª¸Sj¶ÊJ1F‘M ñá³ vSQ$|©º +@¨Òœ-jèaVj⹫ 3Ɓ™ OÌ% -^ qt#Šó.Ǩ^ŠKÙâ%ùL!Èmœm:¨]kÅÉÂÊëÏc1Qi“^b-Oœ»ìÑ×4ÐQ§†–!N;ˆ + Y¦榪Ù1`?Í¥CQRãè¢)ç-[fT—.“‘'ÐÆꏧ¬óç(ed=Ѥ–¨†åۑš2:XôÁ`¬(uÎâ^yZ[SðŠ(6íO?}ŒWE0£*ý ¹á_˜I3ƒ %…RÂ`zs5˄BŒš½ “Ã0v㏨BÜ|P™.tæ»,Î[&Ô¢L>™Qf1 ÑVl:|vÁìo/æÙþ˜Úþj²‡Ÿ&>þȌÇ'÷ÎH·J€ŒÝ üyÍ<ÍEWÓè̌Š}öã°¨ƒ³&?ÆÕ·¬ÙrC¦j¥O} ½¼„♏¡Ú"˜°&>†½g•÷d¦<´´Çø_[³ãgv­²ó% h6C͹¦8Ίv^6­x¹&<†-PÍwœ0ÃöíÒû=Æàَ-:(B„€”h¸­u²ãžÊ4¾¸µ˜hOuƒ¥Ø]e:Ž5sÍtŒœüIj¢ãh¾øu¦czú4áìÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc a)ˆ“èøôL»Ž!VȜc¦á{™œc„4"¬˜cDBPù›”c6sºû„SPï7Æ1ÄD™âø(4Çü{¼ái|žI7Æaê}N¸ñiÁÛÎ6F÷$r<Œ6†l³1h´1vbN¬dãд&Øx˜ÿ\㡒¹jŒµB;'Óø‚[5îDcš>ÊИ³ùùLž1ËÕJ™kë˟Å4¾‚"ž1Šã®çœ8cP2²ÓŒá+k˜1µÒ'ËøêŠ=m(c¸×‡ÙröϗgҞ#óLýÆ1FEé¥þŒ&½þ~P¿cü]®aŒ}Xø-„1Ž‹ÚŒál¡ÎbßCÑàã£FÍmà‹qîøB6z1„d¸Ú€³DŸNÀ‹9#‚“¿Á‹5Oªu‘HÔ'ጼ™fœð*ފ‘Æ—Ú}ôr&»˜Syyo0°!)K°‹qûØ v1ÚO!ã½¢‹qÙMˆXJAõa¿6 +r1'qTÙläbYahHFˍyº˜ïÍÓŁÌtÙi”Qwn1V(Õl1@T-YB‹¢he6hñƒòï$síôò%Xüܖy­¼bñm®øñ,´bœ²ÂŠ¡À¬b|‡ŽË¤8¤}Ôã.¤â§éS P1ß!|Éâc2…‹¼aŠA‰ÅZ,(Åç#¢oPŠOãO6Hñiµb@ŠwÀ£lhí6Dñé¨ZŠQòŒ_ +B1þ>DÈBdF€ >1ÕóíN<1¼ +øù+˜˜®r'œx(?hbDؑÖØÐÄ,15ÈĐN¡þ:têÝ—ùZˆ‚K „Ü¥Zê2ˆ÷N%F ‹pÌ +\„¡ÇÌ$&þ¾Ä»žÑœ‘˜™è+$î]âGÜø&´ç üz{ @xh&N|0ô½¿Ñƒqøì +Òdʦîè`í’Œ[Ô'7øàð·Qƒé!‘Ð`¨7›zYª&¯s±°!ƒþż‘Ä`$Dú˜ÀàGœ¦líwà‚Qԓ\­#Ü&^äTñP̍Z¤`ºõ» (øÒ•œà!‚db‚ãïƀ?Š ÿ þ*}¥\íØÄ&^; 8ÿ^ùÀa <0*œpܤû•ÛàÀóØ=ÙÀ@ À¡ 4ðÁå´¾Þ©¼L%T ®zM4ðA‘[»w40¾W±¬Íþ?+z­áÀ ˆKÛáÀ(‡¥Ì%ØÀðÃڕh`¦Ïs') 1¾ÁÀ¯÷†ccr¹ooX`´H[±¿jtr•äþê‡Ì¥çú z‰çræ"Á¿Ú+ +ü‹íä ð/z©q¾ÝÁ¿43Þ%$FÙ#Ù¯þ-,<ëø"Ç”_ï‰%ÚõLî/-w¹ß¸¿8`= ï5÷WØVSӔ ¡Ò£Ž7î/Qðí~’û‹=yÁý%Êö*íûK3Û÷ÿq_cbù£7ì¯h¿­Mì//𾟉ýå?ÿÓd„UÔè¶>±¿L‚ñ% ì/ytö™*±†ýŽ:؏9°¿z æØ°¿ÌÐÕ1©¿ÄÌbÔ_¶x˜è\©¿ø…ûd›ASqJ‘AýåAûØ©¿¥V0¨¿TiU·ÆV‹º­§¾Q¹+‹*‚†ÉßàëÔ_XÊú¡¤þ’–Ëú‹°¨âÌAýe|qœoÐ_&êô]™úËð‘PÔ¦þ>¯ÿgCœú LE;“ù þd-×Dþ¢;Ot#þÂÊTY¹Ù8'ïz‡ý>nБ¬_½TDbÜ/.„SΎû}Aû}Š Š ûENBe%+ë±Èê0¦Üoên&é×z¾~o¬9'å÷¶Ë”_fM®çñ‹úõs”‰øelNáÆ1|¤®ú†øåU×£LÆ/?Èl"×ùÜ¿j2 øEŒù~ñ7À9+ß6TÑÞG dº/)¨ˆ(¯pßB5À1î«À¼Sjixi¸Ó}9¨ ·qTS)rî‘t_Þ- èݗ1|•‚îKc°^NрòF÷Uþ§_I÷U‚&`¾Ý)Ðg7º/N›Ý ‚îË*#’Ý—rKG4á¾ìNQU§T1 +;ðٙîËû‚ÁïK+< ã}™µG°;ð¾00u±á}a *ðP­û%ºlà}i`öaÅûR¹y#ñ¾ì ø¾M°¾Úù¾Òr‚ä`ð+7cI¨ù¾¥:Y²~aåš#¿’|j³K£4š´l|_émߗ„ƒïKôà#¹ØÅüªƒ€¾àm<Æ  ð ++‡ð[Ènm-¿4`ìÝ¿²ÞO~y V_šð éûá—=,°` ¯ÊBPÓ.Â/{ÃVI'áWÍÔΞ„_ô!┄ßBF¦¨¼“ðK¡÷s•Dü–n貿ü›ï÷Šø¥µ×$üJ/^•Gl¾ø#üJ ^”î ’„mF’ð+í÷qï„_úgÕÐ'±*š(ÐÝ Æ/êHwÛ¿0—f¢/¿°xú2㗖ÈwNÆoÉþFüòX‘Õ" ¨a&ð6Ä/.TÎX ~9YӃÄ/< Ö_nˆ_j³8‹D[¬pÔÀք_܌‹6Â/DúF›ð‹wì휄ßrz‰µ~Y$DW0¿ì½¦D± ¿tÞÕ2`!ü–HÃ'ᗖËúx™>ºý˒ã,¾çð+®D9“ð‹÷5ñ_AøÕkpðK+^ã üâèOò—„_8qm„_&ðo!VDÐ9Œ›¯ £ï„_üy»AøåWr´übò8®±ñ}™é;¯‘|_¦IKIx/F¨[؉øÅpç<' á~ð;0ømçûÂxÄ{kfxD÷…èNæ +÷eWB…‘ÊCú £‘·ÁŸ-6²ï¸2¡@¦ãe8¯™½è,ÌÌÆÂõ%$÷~¡#ûâyÏø{Åú¦ÍXßÛÓsðzÁ°Åòv£ú^§¢Ô¹‘IÓÁô¿W¤oÚLô}ÿ5‹‰¾÷¡þ£ Ï÷ö<ßûÐÐ8_ü›ºÑ|±—ç¦ùÞÖºÌ÷>ô&o,ßË Žå{Y$_ Ø@¾¤ºö–_þ-à!#Xˆw#í°Q|aÄ{_ü—&¾Šò»"|¯ÃÉQ#|/·¦ ‚/Ãâµì_döpîÁïÅ'ˆòà÷^ÑøaÅ÷Ë5ÚTHë¤>Þ;ª„ñ+»—6QŽ™ÍÆ>¤AšÜ šÒ©Þv)Åw¬3¹½È¯"#.l/˜cÀ.mÔ^jQÏkh/2Æjs(fïå¥å†ìeï[VàŠØ;¼N +`/ÎÔû×˓Ó̸ÞáUcÐz‰`ƒj…õ²Ú /§Y½¬‰ƒRɨÞy…Ô›ÝK ꍎâG~Ýæô‚î0½W€Þß…Â#ï配 ØèáÂ+½$Š!Ù¶zE9|‚Ï‹?k“Åç½­¬Øð¼0>¢ñÏ u?â÷AçnÃêçEÝÄÁ«›«W6îpõtü½’yÓf0/h9ƒ š”ÄsÁ²ay³v‚Ê‹ešÓZAJWú+•VµPLŒB”óN*/W+œþW*/‘SlÔ~ÈêSy¹éþ+•“CÅAå…GZÅqdY%VÑxø“Ë.xÅÁäå9ÚJõÑð/nStgÁ|ŒSw€Ý 5 )Š®¶3yåaÔ;™¼0p¸ &/ lv°2yé¦ñäÍä%ˆt0y?8*ŸÓ‡ùc2y¬CQÄÆ䥕YD3y«W"x˜c9èÊäeܲ™`ò’›ÁËÉût½’—ÎÕ ys…µ¬ˆ°‘‚²!yÕSž‘¼4à´{†‡Âš}‹šýH^Åïü­jû98LlD^F°ð~‘—1¬Ý‚ÈË æ’È›®¥‰¼|!-jY€>1g+‘wµV÷Æ`>ˆ¼¤d`ðڈ¼TÙw_…ï ¹\Iä +¤>;‘—ÊGjÊT~3ÐD^gpp½\[¨‹ÞÛà颪® §û .|ܙ)`º,“¯·ÂtaÄ°,]Ö==QºÐ`#Ø·’t)Ö>Ïé>¡GÇ%G—‰Ã‚­KAMáÆè¢Ö °«¢‹úÅÞ&E÷1L1 ºãÈCY ½&Ë.b·Wô¬Zw†.­·šØ ZB´iy’¡ËP:ÜÛ ¢ËVéˆ5Dó>Ã~Ñ¥q¾¢;6¢ câË)Š.‹ìØ(ºpuâåPÆ ž;AÑÍ|ñFÑ¥‡ÆÞJ×,äŒÝžÝ Š}cŒîã\×NÑEÈ÷0˜ Ã""¾Q¼Á5Ñc¥ÑNÐE-Áánhª‹{¢Å—ù¹ØÉœ ŸËÊÍ&ÿ›ôÜ'¸ÅelŽ1ö ž«Êˆ^— Ñ· ¯|Òsg¢iÅç҇§® ð¹\1±Ðô\F ‡Kë&—qÃq¹pÀÁ»©" #„ܑóbÂsUt×OIÏ¥…=|7z.÷`Yé¹¼pL7¦çæß=—áddàƒž«zæëIz.“j,­X鹌À³uà¼C¢Õ çÒ]ÆÚè¹t´ M z.’¬Ã +ñaaåFÏåYµ–ð\Û ¤ð\Ö-`”Ý๴òk7<—Ž6†çr¤CáÄÏ¥ˆsx. _iÀsa À~£çryÚˆà`֓Ïå°q+G5ñ¹\®âÞ>o9kŸ«Ìg}v|.AèÅø\¥áKI~.’n6~.i)]‚•À"nü\%4šM~.E¨ö +~. M¼\µÇ>…ï]ñ¹Hð鞟KP ÏżM>ú 6·|.ó€Œ9?úyÙº š1“ž›ÁÙÀ¼]äaø²l]X;)£肿D"ºH1µtI€ÃÚ5º0ÐÍ ‚. P¸n]2‘ºÂ՜IJ~.÷bÙÏÊÏ-§}»àç¢,˜‹’àçªüFÏe6­È¦’‘çÜå8¨CB¾¿ÑsaՏ™ž[jOÒsi@8f£çÂÚñÀƒžËÍxLÏ呋ðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ…*êÚv€.’ºôÔr³êPt§aè¦5º… 4¸Iè拹!t™}&A—×È£A—鵪ү)¤K»`è2¹†uM0t™!C ycèòµÇš– ]s#e†.ÿ+Ñ ¢K¼\é€è2Y¨î«±€Gh_áÑ%ªñ(R”\úTÔÎ< ºü¸œç^;‰tz†èâρôb@ta¸Xš¥Ê°2S]Üǖ/¨/OU*×]怙¶Š.”w¬Ü)ºxà’E—D„KdIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±ßƪòEƒüu¼Ñ……1±£Kߔ)Zct »N;ªÀèŠÃv¬+º‚HŸvŠ.” +EÊŽ‰Ñ%ü¡º5ûÄè2<ÌÊîÀèÒ¡{>.?^ùŠÑåÊç˜ÆÇ"…„è¦acèN«±FhStù~ðÍÿ«Öh‘ã±tUœ_  gŸ«µàç6;>w(–‘ôÜ!5yÂsoù;;÷e¼DÊôVIt’sïhW¹‚sor‘—}.V]5×Z֝š{;bj.š©ˆöâ~RÕ©€•™ 9ò»fæ"¼†hgÀh«_1Fø€ÌE,𸗋zÌÖ-zt¥¥ËÅßÊH –‹¿Qg¶±rIF§=£r¡¸Çë“gç&å)—ùxÔ¢)AMÎbz½øð#[8¹ÐZ¥Á¶=ü’Û®¯„\øHþ —=ùŽ–|\ÀæÞñ¸Íz‰¤ãBþŽ0nքÀ€ÃDž3V°q››$·5©²v4n{¨“%IZDÕãA:œm0V,n,¬1—¡¶§%A®‘W&.â}qQu£ùYJšaÁØÆő‚)ãp±ÅЦá*–òì0ÜÓb­`ážnL(Ü3&¢…„ ½ £÷áB€XppáQâãÜ0¸»2×f +.tÏdà¢Fkæ ‹<}í Àş qÿûà-Üø·éT·¹cÑ&úuŽ+è·P•Uáa'ü‰b”`ßâ&ð;r4ÁÊ¢¾„s±‹ŸP–L0ÞïäÞ#6ìípˆ ÞFmu@o‡a +ó–]-ZOämȚxÛ\Õ½o¡D¬baJ +ÆMgÞ-â¾t7Ü-åIÚíéÖR»=-ÁÜX·0"f¨[ð:à­é¿TL¾Mç¼»¬ 8·ð¹à×æaý rK}´f܂ƒ‚ïȈ[ܼ_áFvM1à„L„íƒoۜxÙø¶¬ ¼-þFÈx[ü‰ ÃF·Å-³pÛ6¬“0´¥s°¡mQÅz8••4«Šl‹+|ŠזÅØ_ÑF!€ Ú"i:®i[í Ó#¸H[ü,ôF´­]‹¿Úv¿@âٞ€Þp¶È°¸¤Ì4öBnÀl©c¸Ïe{¢Ùѳê s'¼È Ù"ò„èÃF²}Xv_&ȶ+ä–ÛK½vŒí©ðzRl‹çTCloé¥7†­êJ"lo¾Í“`{“”ñ°{‚ð{óko•,˜^{K3ôÆ®•ì'ѵ—Å:&×V×GíäÚ!ÞH‚k-‹Mn-EÌïØZ†3ú¤ÖjfIf-2®e¼1kó~d-Þ[¶‡0±–zŸö¬mòr‚W[={®–µÐgßiµÐŒ+YµX{O¨Ú¡Z“7Tíëôž¤Ú“±Ä Z­{zÝAµS`½gP-•îà-¥ËÁÒ`9 “TËlÿ)«áýåõß4¤®ñ·÷¾1¦^^ê&©Â¼Bª nUpj‘L£tÅÔbe+(µ¨‡;ÚÓõˆ£Ô#½¨Y + Ö¡_úç¹ú8‚>-2–ùž–œ–Ñw:íéÏNP…1 ³Àª8_6Ñ´wÉÔ,X{ó>¨À, ,ï7.-Œ—³œ'ðwQ®[@xUw"gòÉëS·–¨‡£aâ@ßì4®2ØÓñ´Kž:ÏÅ\9*äV=²(©ƒ@ ;#ÁÒʲ+ŦÅu0¸ Ö¼ìŸj‚‰øM° +`³TÊ°"‚üQ‡dJQñˆ¡Ï`·â” €­ÄU*òS$°ÚK½°ªG?Â,ðbg{$lÐÖºqµ¡õ5‰±ìÏÄå+`J¹øR']«K¢­¦,¼‡ÇSNË"Û¹Ÿ 1XpՊ#Aá WJüIög„eDœzŠ5ý$ ©øÐÙ­ëps1.ªêå=3S•0lÏ®–Ðþ +t3¤½…EªbDÜï@|¡ã„ZãQÑY‚N¡ÓÝÑôvmn#¸ó—{—ãم.«ó{ o–’g o‘]9#‹ÂJø’`©·ž\I&>_.Ôñàý¨¼<ߍƶwÕô‰¶‹ÆåvMm®ñ‘EÉ3[\?ìÜíbøxXǧ¸$IDJF/Òr]ڐñf ¯,,™Í+ÍO0Ó§¨AH ÆÊÒd|ˆ´dùÇ: +ÂÌdÁìøSç€I†4¨ç(7ƒ¥å̍ZOÝeƋ=Dæ‘¸vãôòhÂâ<“#66\˜èIÈ=8æí(Þ[<5¡®‚¤¬Žù1Š<ôèµ(F˜ïBÀ3þå—ë6™YܪÓçã¸ïËåjö3ás.‡Žax¤«Ø,¥T—Õ顨< °°~1Zˆ¢À X'‚À…dc®Zûc-¨ä§¯€Mæ +£gq¥(FÐK丙ø|e\iKg’rÓÛ5ãߧ×)vY—OC %¥bÑ^vsXgÔՊe:¨H*ìÒ<¢ë'Ì£ŒÀa!ˆ +ƒ¼]ôWOFè˜ €…•r ƒÐ_ƒ…þqo/vêW.ċúu ¿óZª°Îþ`êƒc‹ý®Ó \rCm%³°0*›b +ßp¥yZ$Œ²´Ã­NÔČ]⪻™±¨²5I®}‡_Ôfâ5NÒôÍR8pלæÉÖ¼tDÙ ¢&XX&Çm¨ªFUÑu¥lɎf áêù +œæ¯.–[Ô¾ô¥Y”ÀŠ³h—TÍ÷h4ŽÂ6¼ÙäN¹Ûˆf5èOÁ«ŽØÙ·²Æ ÜÁ.Rî©å6Ö¼åў\Á"Ø›Øßz6œ”}©·e=ì¯Bê-5ûãjખ\^Nù΁Kßó­ä6-\‡_·ÀCÚ¬ff†«å®º "âý†ª?Ù èV#Xõ ƒåœë†+ ºÞzEï t㆓^ŸcÉ!ö_¶®Þ3¡ÓÇK¶qõŠ‡5ÞÈYV€CÚ}j¤RÏÓË¡Ò¤_Õ|E*•‡øя—¼$c™'›JRçÙè™²»è®s;/ Ç÷CAîJ•bèó»é%¼×ç•n‚a֏½ú¾Ê!Ýfs³Ë:p}Þ]C(ÓbPŠ¹5°-Nˆu%eç†h§ÈÉòŠ÷ñȖ¶«›Ò¶r>Q[ÑísP9J€EBãäWŽôWÅ(x ‘eȐéÌ i‰àX orWÑEÌiÂò©G+^)u¹cܵVð®á1REs¸dW še‹”û±ÌÝpÝ^jњ¢ì…À+zú + â-)}‰9#Ê…ù4ýPZaø„º]x½»5L›¢íª,DðX¢BYÝå]‡ÇLj¤”™ò|žEZšÊʽgš]JÈ8/£ hÍÀ”´ r#mñ‹~ÞÜÐ+4úY¤LN‹1Þ3¬§ Ýdò'ðõsåœo/Ð0ð:üL/)iÔ´Y^È4’¹),ÉÞµsÒ\È[7áµ£÷På„ï€*_Xúdõ¨ª‹‡{Ü=K½ºñ ˜(€…k<Ñ9 +‚ÂFGÊý[En'÷˜åŠ¿Ûî²»Ïñ2¨H Ò8}j·[Û4.=X(Âtâ±Á7Z‹X"_=NÄÓâ]©bç®=cqñ¼_*3¥…<ԎRӇ]®"Ýe~jEŇ¢‡1ð}{ +¿Ríz¹é7è8¹l¡€Z ±îe±& Ô/ƒ·Þ¦"NÀ£`U)$†CO ‡ª`WŇPïȘBþ¶À0õòºÙ)ßE²T±k´úcöȊU?h‚vVmƒpcËEí…`dú+WfOé0 vï¹¥ÌÌ=YWRéª3k' §»¬ùƒe̞a„¼àá!ÓÀ„ Åè·S 8Ãy³¥Æ­+Å 8µ'Ëpù8«ï=&vê=šâ¿Œ“Ì@$_”ÃpqµVÊios8-Ë9?n˜/fnUóX +«ßœ˜Šë·ö¬ù±ÙޏãôDŸ³\wøŽUŒ¡ÒeVCæ˜çâ‹A"3@Ç)$þImž€¬yrüCÄÂè®Q•-Á¿?´D¤atwB.Aï¢ùnÚNhë¾´!ãڕïjK]¾2Âãx¯jyœÑéjÍd)Þia„ŽSeã~¢vÔQBÇoI4 +îÇc?‹‹+#¨œ=&œ*‘d`µú‹·ú¶,”/ Üfö#׌žÖíºJYsՆì?ÃmØU-@gÌBy®°žh±ÁΣÕ·&ž¢GøÊ ÷3}¼žCMÐ:»¸_žÓàQâ7g«@9g@ýÜ¥½C ‹jÚ`I11Ìú8o‰x*éMÇÊߤ3ÉÝÈÉ¢t.´(ªÄ«Ú]ÛS‰ÀýF؉ƒ5†¼c +Ìú÷#z«žûs$F–Ga–ЪAºI÷Äcé‹iø>|}ê€k´M¨ŒüÂgåv¶0ð ¹ÜU òP­ÄnVə _úÑ})±,30ô\™¿Þl-3Xñu((ÅNƒ°H–>ÂA„€á‹k¨TÒz‘莡GÎÅüïËÝ{`áœÇM®ë™{Õ2V›pÎPÖu¨íˆìáX–LØÕ}¨šf4<ÔäaKrAæ‹îò{@n§@>s½'‡ÔƒÂ‘Œ?,rD Vê;6¼zÜ Gß-z*-=„èÏä$ÿ‚YRB¥Qc8LõƒEpȕҟ€Yüᚠ¥áZŸ2—Æ*ðqè‰z×ÓJ?hìç"ìׁ~EÙn“BÂ`ŸË|Ϲ݃ÁKõ§„ ’@¼´¦‹‰.Kò‰p¢^Óà›Ûœ ˜Û¹îÏN…ƒiah>ñ ÓÜ=ž.ç7ì 3¦³ç½$ª•k­²>ÖEȃ¯¸pƼ}÷Ïg 3Ýî̌Ðõðv’b«DT÷m!ª,¥¿AÎeðÉÐfâsAäAi˜psõ¤pr.ê\ñZ|¾,I£¶€6ôD‰Ó‚µQÿT #B +•¡vhŠ0m”˼çÂĄ´²Q´¶S?ÉUk:]UBáX=‘UèMʸÒbt6˜É=²cèúŽoʸLHíl«úÉC µ˜â`õò À;t×üV‡@4?˜Ž>LÁŒÉ Åê`ië®nlÐÔ‰ iJÒ µ. +a³J–5Á:Ü¡¨7GÓØțQ²’³v>Š‹o_ª"0{C/þh¡v'ƊvöŠI OÏ¡,%ñ8çø kßÇ3©?gî9¢íÒ-´`iNÀèå]U–ûë¦ì›^/½ J»Ñ)ˀ])³\§:쨩Rñ¼¿„¯RÞbFvZ<¤t÷ÑÉ Ÿ@ݐnvYÅCý ñ\çÅÄcÜO£Qs+¥fÎÆY˜ùsÏfü®X Sr{£D9§n“ã:Vôóòs¹ìŖý›VCuLJŒØüX¥Ê¾3ÃÎÌfÝBáËx£:ÓÜ)Á©Ã\ߎ¢]ë„JœqÙr-*‘9„mK4†å!fÛôE¶¥Þ5œ+XPÿÃP0ƒB%¤¹Ø±¤æšþ;ùžŒÌ“JFÉÛd88”×I5&´Ô-b%É»Íð2±â.¸g-ºÄÓ̜7+ûf,ò`hQð´¸Àà}zÐp'©îiz·h`5BõűÃßiB?óGw§êGtŒT ‚ Xý}ðÅ>§ŸöÇä23Ê©Èö{ýcš©`Ã"8?aUQs˜“ 2’K]b§(ž¥]\;EÀuj‰§w\í¹é6;Mœç’ØûˆŠqnáææB'æ*wî®083 +Û­E9÷(l·¬öŒ¦’ø ª`Q®L)h Å,ãXb©šúXÍ]ä*²¥8»VƒRbÅøÌk Ÿ::3덭z«©<©,Á=•®ãª#_§'$œ¹h¡ •â‡{ÄQwÓ®¹«<ÁÀ)QfÌn+Í5t´‹µþ>".m萝Q°í”ÞŸ+)ŒÃ±–×T‹ ÐHÓá•2¡yôìÊd§ùÇx3à ¡r`ÕK¬­9¶2p(ÚtR)AT KÁ¹«Ízͬd&²b“; + ØÏ¡ ®SÊ,É„aÒ9'צ[Àæ¦ÃZN +G»ÓÔ­R‘S«°#[#õâOZâS¹C‰ä/‡RññP֕‹&­«áœQkaÑTz9HÉɤ¦73§ÒÞ}ø ¾£½‡Ó dXfžò¸„ùJêA öa‹‚>¬@%(5/Ý¥zºPhôª‡Eê°~¢í41ÿA'‹½3=˜Y$~Eÿ>ä8)gº\±‹:»6¡-sOéA®hˆu…º»Vç/)dæԘc¥¢"ùæiºEzVDúã +¯B³v|©·Ê½¹8ãúg¸Ö˜u š|ªjVðԖ¥̨³„YJ|X[¤– QŽˆÒ†š¯à0î’æ󔪎ÂûmWõWæá§VwÏ*ÀG?f=Oµèrh‰þ$Ÿc¤_…4“EÐS«r©v_¡†"(“OºÌ×e<îè˜D¡ðMj*ë^Ã¥nTî©cÉ°Â$u¾CÅ.Pq\žG +3'.†<6šéÞ3k+ÆD=Mekâbi×,瀯)YôðoÀ풴Ÿê˜ôî·Î¸æ7ÆNÓ{a¯o`E ú1Ì·Ššžðô.-³iÝU(êþ,Ú/Æ'»ý6µ‡eDpût uݬ;gAé3|ö̉ðWe”x3beÎ6,vl†Z˜Ïí¬g͛ֆ‘hê}÷9v$åLU|¹tÑt¸˜ÄL€ðÁ +7ûœáƒ7à’TŸ'w•Ç–*§‘Zû÷]§U‹EW´œ +Å»´¨¸ò©¨—u.H]%x9[‚Æ Çu#Ó*aaÅd(}±§¸*HÊqÕS,¹bªöñ#½T2e€}>R.ÑY4FÇávˆ´œ~Èp×{”¹+yd4S ÃjrÖä€Å®m®ãÜî mbÒ;ԅõðŽŒÆ8ŽÓ]RÖCñ^‘•Òlež< +ug˜Ôq†:–=ûpÅGÓ[ÿ¸K.,\@nº CΟ\¢s®éøŠ˜u çë$0¶(ÚjÌç\³+r8\Ýi +Á§@NkÙÁñFyFî*Šš`)o#ñ|aƒj¢Äc@p&$š; +Ṉ̃u ë]GˆtºÅo—9x¹ TmæO|0p’G\’=å›[ÀrÍw¾¹M+n’VTՍK©«VVë‘F—¥ÈG^¡T“sAјé0ä£ú”Ên!óo§®®pb3d‘X¨ürE”чKTìÙOoª’U^UYÈÐ(ƞì(Vâ4~šËQØ"/Õ"’‰Ä· ä—°Ñ<v¶ÅdËhoî*j>œia¡s”Ô'aWŠ-a9îüÕÛÂ`$#p‹ÎNJbô-„{…ü¯ê»¯¡T—î.“ª—äíêFDaNÍ¢3,Û¹p‚Ûqe<UúÑ®ªg¨ìurQ– ³BôOrì¼¥žÛñŽt¥xpJ€'4½çéb oL‘B*‰°$æâïÛ´~ïÖ(Åº‰®8ØEHŽÕ^BQ–*-ª$Ê Öæ7z›²XPœËæ4?&W6²dTöQ=»ß\¦ñڙÙðn9 ø÷Ø¡ôíÒJä}ÃR½Êœ+£ìä;c`ߟ¢zÑC»IH¿³üŠ_F”þ2z]‡õ|FÔÁÂÁª¯£ÊN°§[c)·¦NE2à Ép¦ás¼ +’0»Z¤ûtnñgFúÿcDÞ ,‹4"7`2g‘…Üña´õlϼRRÑHR¾u‡4 CAñh”(Òkø½Ï UΟJrܐț°î·úKQc)D”s­C$’ Ô±A¯Ju# +GyÔUÏ#ŸÅ£ßã¦\—Ç„Ã%:ð%AÄkÜòÅúôŚ[ÐÁ|êŽý¨¨Zh’ºJ£Sž¥@Gd”þžÄ¥·ð÷BÊP"·É¾ôt…™Ñç$HWÐÝâpñ¬/¤PSéìKáçðÈe.VûPÒÔ,¾ÓCmñ¢]`+TJñ «S^´P'P]Æ])-«}ALÐÌG !Æ|< Ž¡5¾BÖ +O×RJ +Sh7× ÿ>ªž·V-ՒÈy±Îɛ׍#K)ürÛ¸LDì™tn*ݚ%¶´ÌÀáñ,fªw*ïM¸aZÐÒ¦gLwš‡‹Î!*R_èµü°"øö‹’pùˆâ¼è*eW¢Sµ8"W€AÈþ(X2³ Õ9uئ䚵vk¸â$=ÜhG$ã\C4 +)ž8´®'ÀùÝKu¾Tæ³"£zäDú§2´Qb‹Æ¹k´ŠßÅ9µ 8óG™‘*¦C!7º*˜.•e(ë è%¬Î Aôî=ÑÄU^)ˆÅ2=PØ ›1;7Ïõ¶2_÷1{8öž!þa¢ ­ž‰!‹ÂÕ>¬ýV„¡êƒqïb‚,,‡ÊÜ°—9ëùêZ +0”Ÿ+Q²Z™áD°è5Ñ +fo֊w ‘Ìt‘F@좸Ï7á…ZYª¥†9Â3Ã/TX"ÝÝ؍©æ™/ÿ§ª7RªÅ\ÊÀúEcÃøóÒíž>›Dþ¦ªBU<|3*EŸ.&Õ½þ}Ä5’¯&D7ÀèeC…-<áêډÜU”x,fB@ D@=ýrš +ÕjIÊ8ãQ_´©Nü¢òŽrQj^óæðe9ÛýuàóºLz¸'DLY…Ãß?jfpe­åVAµ°OĦŒÒ´ˆ˜Ð¶ú˜©Ã!ãÖu³ä•ÀóX—² 896ÙՅ†É)Õq/MZ\|FY“‡úÏñPUׅ/J`ˆ*‘Rwx™rÑ{]÷ +Ò29k̸ÄN}1E,Ý›yTÅNf,õf‚ª²–IxHÚej -˛Tý¬¹Zoâûè9Ñ šhÎ]èJ»{p ’ýMˆâ¡¸r^³Š™ûF-b×ã'Ft[é^mr“‡É÷[§5÷¼ì@,~A€“P„ÏÊeZf¯—Ë]£À»+ÝR‚Tºs·ÜƒŸU7ÚÓÏ4:÷²Â³ ¥uÞ:W¾¥¥‚s`V™ 6‹Úì>,/bµóõΦ w×È=UV +³J؆@/ÃùLÔ~âR Æ{^FÆ@X£†“£Èä«LTmaágŠ’µ¬®Øâ†Ãi’îZm~ñãZSȨ2Ç3c- 8]*³ø¡S7x)o‘»vo§’þ}mÐÁJ?Éb)ò´Æœ ›1dÕ-Qº¨´Fˆ¬q ìÆ´hWÄ´T zY÷T\.ÛGnE Lwd-weo‹,]•vê”Å¥ÚM}ð ã]~ô2>Zo¼º r®‡<ìñÖSklŸª9áÁî[ìDvØAè-JЋe˜Ïø[©0aswsÅùÅbü§¼c^舆^EôWŒ8Ô?1I_¢vwÝ©}ªb銮®œkNin„8«.^Œôez‚6±ÊíQñ:9¹”É°ác¤ _sZÃ<͎Ô-Òuœ¹] Íˆ¯,ª;-çZu¬~\ÏD¢âNBbú¡Yóz$¯SZ‹0ÝÔÂ/aE]’º†Ý;ê-D%9øSœ k5áÐZ‰"z²:Œiý9³Šª °¢ä-äfä) Øƒ¾,£Ç—]ØéÌ!z|»Ý¹jQ=îªêW{Xë)PKu ª+_ƒY÷a)ñGX®PfêŒË«ÌómƒŒŽ§¸A¤Mâ;BcÝÅ/ñtrLiµP oÐÛgS´¦T›æMX&t`:M0%¦)ÜÝ ¥Bû²‚ÃoHꁰN + [Ê~Ñpœª&¤½È¤Cç̔.1i<Ì}¼=BVŽÆ—")yDn´¤'„¸´²ùÞ PbÝ!y3ö8vÇeIæZ9ˆ?G”=~çw€…EôX¦O‚–¥Åúva쑷åÒÂá ‡O‰ oµ!^ãrIi‡¢AlÚ;ZLÞƉˆî¾lÇnâx' ùPf ,º-{Ž¨Õ‹^a·ý¥„YÌu: û™·rsC¦N%tξþ},2Á4ó‚9õA­~ñäš}À»YQôÔ5ï~G7/˜QqA uOUü…ržÝŸ6ˆ—ñôá Å»{ܦ…¿z•Åâ]/M`Æâ™=âÓÕÌPÅᙼÐkû¸8…‘gR­ˆ©.:Y…¼ñFs#Ö>'y†–Y_缏5áïf©¤60Ì/›xS*ELyG©„å‘Wj§Ûš3GfÂ3zîÈ;\f– s=þÔ+›M¤‚¹¾1èÒeœ¤p³ +«ð)Vé<ÎLúW‹éÇnwíN^”ªcÉ]}\!ž{J;€”k|ÃѹawÑda± ûa%Í[ÙþÝtU ÜBXŠ¤ñdŸfž™â±“͗WoW‘¬<ÙÚ£¨$ÂcY ³C"’{é!ˆáv§Q©ê®ÑŽ+÷¤+3ÅÞ´¿‰¦[Y`Ǻóö–'ráý0­è©d°˜›¾b )iñ•ˆX¶ÎíðÕâö²Ü’>p´‹‡”ËìÚܳV®«j†¡ÚÇYÓƲ‡Þu{/îéæ,š´X†Ê&–H.…·f³ö¼YÁ^5´Ð#ëlÞ&We (ùî2Cɸ"ÕuVñ\J.%8a,îx™1Ʋ=¶¬†ÿ¬QÜvÞS®DóáÄ[¡OpÕæR‚² .Ï¢ãbŒ`Bb°²ⶠ¯ Ðޱڗ8\~LùâìVs›¸I%é IþšS6' æ¾o+’Hgªž³ý- >‚ųº¤>KØ©…hzu•î‹„\Uç8G\jŽ(®¦Ï²w³—JéfàÓ·ú:’£‡ðÈQ–'pmù’÷¹Ïõ9öqyèKÐs'ïï‘æ7¤yNìDsDßXo@sÎkâËÙwQ” gÞç~ƒf|¿Žn˜9dò37–9*Sï&G(óh5–$s,÷(RÞ@æ(ÄvÔóê^ى1‡ƒÏ†1ç~E•8 øáðW"ËouÅ{âïö$;æ71ðs´¾›æ‘É/ŽC‰/ïN‚$¾¼[5·Ó˧ÕðòÉ.þ‘L ]$ü±D—÷ͬ¿éÖ1ìèrf< æP‚0‚ª´M.?cJ^Éåð +®í`: ]É?ÆyYîÐ¥qJRÁYÐÀ–£nœùü –S[Qï7h9»ñ÷d–£³^mA,ç_cç•Óö<WŽcÔûœ´òÓRÃV~ö€Ó˜UŽ°–:+šUŽÅãe²Ã„ô2/ÝË$•SþT>T’¹cÊÑǨ™'¹÷²o”ŒrÌâ‡páÓ ã\KÁ6“Ë„Q~ù3Ù åWPqPŽºËëñŠÜ ÑϏè(“ž":å¢M'ÊuÂɯnvÌÆ&GK ÃÔ{FX^Ë!§%™< ;˜Ë ùyæ’?î XòG­JN±O3oÿƒ?Ídh$[÷ Þ‰ä÷ð€@r`4†}[òÈ/«$wùs«F/i䬴ã”4rv!Vk£‘«IH—c%Šý!Û ‘ÃBÈÌN#/áx'öý 9 ’ÂÞ+/Eþ†‘cÎFÀȱbb}ÑÆ"G}c3ÒYdZ”óq»@‘³Ÿ‰ŠÄW¹Ì,ª70EÌ.sýŽ({]Yä0_ ‰œ^(νUçˆ(uRԂCþdÎFRg¡P~´QÈ1“,òÇˀ$?wèëV9¬Qáݚ4~§Ãmôq4çê;àãO„Îú¹LÁßÐãO …ƒ<~Ÿ± +1xÕË\ÎoÜq0¹Ø ìøù„_fìxV—oÔñÓzRSÇA.áÏtäõåX™ãg„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆ—¿"P;œ¼ Ö8ýLál¬qä¡øújrµc´Y€0ôi–Á#mÅJߍw¡’3ŽrÐÓӉGF¤—Ò¿F9€?†_Ž0\¹ÏÆz#ƙŠúÌ([fc ` C½*æ‹#›©’(ãÅáÚP¾ÑÅë˜uRj˜â©.Ùâ<DZµ*ž%òYE@·Ò´üW€eXÆ\q8B7¬8!2EArÂV˜A­.Ÿc‹ÛHAnLq¬˜ô ¤8~ ƅ³™ãq¾ő}áëV–g=Êcö ‡wš8ò=J/&Þå+%Jé@êX6’8`å| Ž³ZÁâð‘»áà“"~Ÿ–q¢º—¹gD(XâPSœætSˆËåTñiXùáQšøð3âA?O vxø]ɂ<ù0œ„møÎÃd‚,ÜfA q¡‡cE©”‘¹á¤/?zŽ³:넆ƒÁÁúý`†ŸÝ9³ «¾MÃa(¦\0Ċ±I3ø¤…àRÍç¥t#ÿƒ„“ +*ébí&…÷`(¼— Ï¯œðjÀ„#×\̑®ÅT¼AÂ! /8áÝRõD„·€Ço„ð◠„£E­ê6 gÏZë!&¼>nUxðªf ÇnM‡™•sxß5› Ž€Ò`U™Áà-ÄÊ+0ÍÈÈâҀ}µñÞ¡à#Hk6\§VÑ-¼ºÆ›â^ œ+¼sÁG0Š~8k¸ãÀ];iàQǜ0ðÃIènšäDô}'^XyÀÓWzàL-wö_UŸ]¹ä~3ä­Z)!ÀaÆ&üq:g€‡è?øß\þLø7þ¤úb›í«UíÉþæf&Ç(Á€f¢v7ò·Ã þª©ŸÜï4lØï´õûq¨#XތE–ktšáaåfö§“ø= ð;Áû®Yù¸ïx-7Ú÷CQ@ÿ°o¬µ¨‡ Ö÷Á¨§¡ÞS>‹cH,&Ö·X½NÖ÷Áäv¿±¾"1)N1ìû;dý̞6í$MÂínÊp[ IÖFôö reÄ7Ô7VìL‘éû¡+™¾!Ú§7Î7ʍŽ€z$ÜÉ:Ш§¯eÃ|ÃR +10ßáü!¶hlS}I°Q¾‘£’ñi˜Áý*ÖZª BJúñ]MkHÂw«*ÍHÀ73©ŸV¾7D-·Þ»U§Çƒî œºÄž+Ü»F#Â`{W·ŠN´7 Ñfu&q4Ô,ØâZê‹OGÈ6¬7|Ié? ¤aÑü­ëe $‘»ãþ´C½Óå?Ðk°¾:˜Þ¼OöÚfQù0íšDïæ¬zc .16 w‹øb𼡒`ñxà¼q–ÐÌOÂúï2aÞíñà,ïå­(o¨è8€É…!¬ +D7˜L¼ÜäÍõI[¬#X ŠMÃFòžV“¼ÏÇqúypħ«ŽÉ5[+Ç[ý–®2AÞTø±É|¼)odÁÃFòÆÇËØB’¼±¡°™Aòƃ社‘¼ie}Að¸õº×ž$ïÂjܳ¾‘¼ñ¾=Æv{Ça´@Þüû6-úX`øÎh&ÈRÎCŎ©Ÿª*ʘ oò1Ä"1ț²P‘X ò&‰…+țf"äÍ'uÉñ¦È†9àãMaM”{0 I .'9Þ܄ŸìÆñ†™Í¯“ãMÑíџäxC2$@äÆñ¦f_S—9ޅœåë™o¼¡ªÚ8ÞÔj»„#03Œ‘o¦Œ0_úDfÁr`¼!—:á Œ7…Ϥülo˜Ì Œ7¥r äã-í«ÕVŒ7÷dUM`¼K/㠃w;Ævù€¢< ´Ë{`¼) bøJñfÿåø¬.@XLpyc¼æ8{Ù1Þ˵sB¼¬°Ê5QÁè­È]ޏ‰fIð~¬¦O€7ŽóNï~îxº†w3˜Ç sð»qœv~7* "¨O0ÂS¸dz7ÉÇM•L ïFԕ ÿ€wC‘s{#LÓw TôJîFƒwE´I¾ík%µ{ñ½Ý ÝRqÌnFYËÌnö†'îhcvó¢ë¡]•Ãû]`Ì© Õ¿#‹²ƒmó4×Âù3g;v§ZH”| çځݰ²Š*xÝ8ŽâÎÂuã×TJ´Ðº E‡JÔÜI(ø³ëÖã$ÍÄu‹²miÙَDŠ[Š\ ø®fU<®›Ò׌릡Z¨6qÝ4³+pÝü‰žpnLÁL¦=íӎëF`[õªëfí† ±nF•·•Y“ÖÍzVú®úõÀuó&©Ôtåu—€$¯›Úë^7‹7T§°òºYB“¨o9 —K‚×M ©‰¯›‚ZŠ&‚×ÍþP\°s—*>7`·$¶”šØÍ Ue|Gzç‘vb7]®h‚Ø--®7ì͂ÖnîövÃ*·ÄÀn†Ågù› ïÄnFø$4±[ýXnixD>BÜêvK‚IìæªJmHŠHôrs–­Ã¡zCvË|GÁjӆ.æ²Ñï7d7›ÛÈn­ ñÖZºE¿“ ٭µÙÍx˜¡‘Ý\æa{"»©=–ÆÌnêÓõ˜ÙM‹>†•ÙMswæWaÁK°€DvóGY¹!»%ù/*¥uàñVÖ7‘ÝÒòîÁšÈnº ´÷íõÃÐn…E\»œiFt›Ý=ý´[¡’Ó¤“„v—ìGcfwZ’ÙÍà Ÿ³—*g.˜Ýôé€ä‚“/ x7f7'폰rR9,‘ÝDÝñEڐ݊,?c"»ñÆñ“ÈîržAÇYÝ,#:<6„äTÈnºþê ²"»KªÙM SÁìþ¸jXV™ùoÈnd"Sp¥<H!* +gÌEöLߐÝ4³Á™‘Ýø ªÖÙ '¾Ù 3á<‰ì¦EÙI#»eaÒmEvãGIéLd7R¤o±)Eõ.\Ý̈’tÀîǹ´dqcdMÄÆì¾Zä‡mFK÷ÇÄîÑ£HivÃz8òÅÙÒN×=ú²Ï%Áp¾'aÝ#ƦØltµ£º‡;¥'©¼ºÃÑuÆÆІóÐê&éú~¦õ¾‚ffNw6N÷´šÓ}×hfü6ØXjØ»bº¯ÓaøÜ̜ù„t§actO«ÝW4% D7@ ¾®€nÒÊÛèF”[qæsàidÅsc?Îûç¾CftîûðÛ¿Á¹¯h ln0pÔ.Òhn_8Lmdn²˜»Bx¼‹4]§•«_¹b¹a$å2¨Ü0t—)ÐuEL9¸Ý“É}SùÇ4éånW‰ä†:ÃÈ äë#ȍ0+Yää¾âC^xÜ@Ö ÓnÝÑC9hÜ`´²äaƒqÓjˆ9ÕØOV£¸_EÖ6÷ˆõAÜýªw›yI"ß0ÜÔ¦²ÍŸ)ÜÈÃ+`÷åÅîÎàf“ðç™îµÐAàÆ ±ähpó´0n·šBà·a w¿Ò·˜ðm–Uök²·×ãLôvvqòöy¬àl籁·/ëՒ»}¹UDÒ´QTÁQ~£nßÃU¹ÙÃÕb"·!G¤Öc%n‹.úLà6 œc¸}‡ØeãmÃÊá(xÛ¨ë`#pÛ Š«6n¥m£Š† €€mcéÍô›YÛù÷†ÚžV“¶AÇnµÈ +¶;¢Mgû üT`¶±4uGïènL}Þ0Û0k%q=ʅΗ²Ðk˜º¸b¶a¨50Û°Pؒ˜mnÃC,˜m̵ +‹fû1[*)ÛX©íû +Ù~]¤*_²Íã]È6!w ±gõ œN^{@¶IA`_‚€lóÞnÑ=!Û|¬¬Í6d›ï‡Ð€lÓ¢é +Ùf³Ð¸ +؏Û&†lôž>§gõDŽl3É`ÙÙ¦YÙWC¶™¬×Dj3â¨ä²ÍÕMÙÆcöo² &_˜±{à:n3¶ç29ÛúÖÝc ×è'ŒmZxgFH‡"·;c»Ý&Û°HÜŒm–ØÞÚd"¶q¥Ùb¯¡°XØ†WèRï±=}àTVà} Y‰%ªœ6Äöb6b›Mž™yÄ6,R¹mˆm3Äv!ÿ¼¨tVÝè!æÀ³!¶ñ +[9bÄ6%†jLlÄ6ž³@wbåz¤§cukâÜ»$Ýó>í|mh䔊2^n8‡” kãu‘'¿ÒµDâpxm‘Ô Ýc-\³®tmY©H2^›Ç:¦­òàêáeÃk3.Ê%Á×ÆsgÌ1ùÚÏô°z¢(×e2çFFàµY_T„Ñžtm´ùé [BPFR‚­®·Ò3úxEÁ`µY¾Øµ¢e/Û²¯\m¬„œqЅÂ/g©°ÂÕ¾Üb,™Ú—‹×© #A Q 8nP›úÃÁ¸žÃÁΝ§ ,ctÁÓ-BÆi¤¦tõ„i³£Ifiã8 H{D¢vãhãµ²šEçÅe(¶R´¡¤`Œ1 ÚHò³ +†váކÐ&cî‘‘±m8,@»_Šªìmè½TìÀ9´ý¬ÿ|v=ÄFφF‰`–€gCdwû<éúìÜßÀÙ(QèÂÜìSÜ €fcaÅBۍ™ «ŠÀ\ƒ±t½†Kô—˜}º%yÙ§{0/»·¹Ã²³áR°²‡c¥‰Ê†þ…“øFÊÆEðç”}F{õàd£ÆL­®VLö€ŠÀdŸ1§%gԌǜ¹yL5 Ž#ÓÓeh6}¢Ó…x;"N¿Â áôø† º,*ªW>6ê­‚qõ9£ý¢éØÏp:{¥cÃÈ0SÀ±Ÿèilì`fîhìǂ$c?ÎC$†ø¹ Æf¢å°êŽ¡³H…$ê´VM,ö}E; c±ŸÀœû‰ü +ÅFªG/ÑÈd@qŸŠksñD÷oƒbÓÌÀG@± ÙÄåù”Plæ$èsoTl˜•W +*6\ůƒ4lns»8`–VÎ#‹ ‹ò[Å.%ªð7,¶ÖMOŸXlæÀé[£Ý—¾ðÕ<ÎXl&žÕ<.:}p5gððs±ár°Áá†Å~T žPl°ԉÖLìǚ°‰ýxO"6 ‚ˆý½¸ó°Y=ÜÆÄa?Á´Ê5£—L‚n4lB1H®Î ÁádW×Àa/™¼•‡Íu…:ˆ˜‡ÍUÝ5&›QÕáºÎÉ´fl•úîÀaóìZ›4lúçíi_ÙS9Ë aÓ"~èµ-Õe7+›…,*=3›—~QovZ66ö4äÁ8l|¨ '.XWÉΊÆ¹©ê"JP‡M¯jÃaÓ©#»2pØ]¨òO4lnÁG·á°yr­Mv9\)™4lVÁpT^iØ´j 0 ›–á,V<ŠÂŠ; ›.iu]BÓRĕKIÆE•›‹éfî‰Æ –Vi–uT((ÛxØ\^רwW”£yä¶RÎø§‡ÍxL1÷BK ¬¯8„›P:ŽG›  Iª Ä&”N-> ÄVŠ¦KÉ9Ø¿ðß Ä¦¡=Ô!ï4–{åa#—êç1‹e¨ÁÃÆ6ºm›Ëè]¡Ü’®ŠÔ?ÂzÝوØ$˜QGšžÁÇ "6֞z“6"6ÃÚ›ˆ ×T®I ±P mCb‹ u׉ĦŽQ_eLï°PÒ¼!±¥ m"±…›@l³ˆÍØ|àÑ ->‹×JÄæRT‰Ã–ôi‡Í³gâ)p؈©ôcÃaÃìŸì^=Q g6-W¬8l˜(›Ûén‡ÍƒkÄZqØ\‘»8lˆØ‹e%bOs±¹*”¨ÀDì|ww&6ÓãςÄ&8€‡@b3©Y]Ž8õŸ4ó] (6³š|›Åfb’Q‰ Š-QþõL(6KC” +(6·áÚy£bKq}IŞ}ɂŠÍØ}ŸoTlâTÕ³ÂTl¦¢Ø¢!¨ØüC|°v-R>©Ø0ð&›13vºØ¨ØŒ8±½Z`±iÑD',6 E¬Xl>u:{ßwFãkc±WP¡ë†Å&N¬»#£Ê*f)}`±1ê«Û°ØÔ¢PC\l8›nþa.61D»l\l˜¹€O.6-|XÁŦEíW.6HAQp±ŽQAú×êÚ¦‹M_˜ióàb“ÍǞÁÅfC 5W.ö4›s [›7Žý6.6Ìî¼ã,Òz›ÛPõq±iæ3 .¶P‡W™`l*"Ç›:OV š#Ž5ÉÅfn¨ºSËäb3FNVAp±YÕü¬¸kx—Ú ®\ìÇ8’´fs¥@¥¦aƒbO«¹_è]ËùN~X üÖ¼ïÇùiGb7Þåò)‰Øxؤh%{x8ÚyØÃá—Äa‡¦“†}Û×ØaØ·£ ´v‘ÿDaßñn$ì[½–Ý„/N öí⚃}GÂÈl¾/g +6Ô.ʏ¬ì`'4ŽuÁ•®ómlÝ4)¨ãžük&³žö†¿®#’y¦_Ãð¸K®†Ç¡¾;üšXq¬‚ľF¯*ÔòŸXK¯èkÔkÐá òu°¨’|Ý¢Qø¾†ü éÀ^SýÜÛ¤^UõìÈëv†ßiâu‹NμfŠë¸ßx×-.»Fƒ×»nƟl´ké¢캅r1`×H‹±¯÷ƺF-ÐS'éé - ü*¡â†u6ÎuLVÌ5ƒ‡O›”ëÊÔ rÔQ&â’Òõ‚p=¬Ü×˂ä[c?âo3þ·Ñ­Ï+§÷gtc ¶õé9lG[£Ýad3u‚æ溂w‹~ðœ7®5jJV +k‹@C­/£fv¦5֎ŽßӍâZ²+;@_»ñ-݀ÖådÁkŠ»µ‰³†\PSæJ³Æ÷we”‚šS|Â(aökeY»€.IÖ58ÁÄ4ì0dçXèúëäÅz pƒX³KNÓ„ ÓYØ퉳¸`CXCƒÊI1Ö*3áëÓ|¡_M€ bÆWŸÁ zõRÜ ^ + òƒ] ª のƯ•dY×ùý(tàjøt¤n·šõçÓN­Fò„‘¿€VƒÄÏ.˜ÕÍr¡Yݲ‘£‰Õ¨KàÔÀê)ª XÈ§àUà‰ÑÉA)ÙpÕ-ú­t?Ž«NXûƪF…ê0]’Ô,E7©º¾¨º†Š08Õ5©†ó1®7Huµ'’jÄ£ºFßÔ Qýò´8MBu÷ˀê“#Ø;Ÿúä8¹à©Y2¤þåòŠ’’Û¢ÞLӝ(ý;ú,·ÄpJâq ©´"yCS?Ì˖OI¦în…–`êˬv.õéDCb©‹çí R[B»C©UŠb+&5‰ ÏO‰¤¾I•y'RÑÂƤ¾½ uÄæß`ÔÖo%‹úŠîFQר¾ÛQÔÃÀž$Q[c™ j&>p¨™‰rM|ܞ´B÷£¸’oB¨QG4Euðr{ £†#¢–C“@Ýì^€º†Ÿüiö¼øiÔÿ •¢Ò£Âzˆ¯g²§‡{ƒ¾±§-_ôôɐC™äi-Éz}#OKãrµIžF˜öd„ OSŸz„%µZÔ\ƌÃÀ¢þ‰žþè²ûe†æ+Ö䁞îÎò%y:@q ž>kè„Wî4bs; vˆ:N›:}FYìA„žL0§QÖÈi.o1Hgˆ œF +˜â®àM#q݊¦ŠçŒÒcÇë!ƒåˆjŠ4šWG¢1YÓw‰¬·ŒÄùö6IÓOQDbMÃÊ6@Ó0ˆµë ˜»¬@ß0ӏ¡8I™FyšB„Þ ÿÀ ÏƘ¾]Ɍi•ïk¢£Aúà4´¦/“0Ò:\š€é4l|é°&^úò\ŸÐhˆ”¹–ÞàÒ+Ddë]ÜiLhéùçJ–k‚¥¯ÐWú +èꆕ†àºlÕu=ÙPi¢ãâËFϙ@J_¡§ +$Üu:±º¥üb¬ÉíˆOš†:&Nšñòã|£I|įÑ0é»v[0iö¢?Ï7–4™JŸ% ™i0¨"¾ _ÙA҉+ Žt¢0#}ûëÝ)Ò(ß*î\•…¬DK†4 Õû‰~"ÂiP´ŽàEWGnãƏ~Ö֙ø ëcÒ£‘íajcƒGVÝf6êP/Õ«}{»“£oñí’ýxu–ØhRžm§F“ζy†Fã¤XèÌè§I¼3£CYýDeP£×M`ô™âàEßN’%:†‡ %/;a-ô6Rƒ}EŸÊ ¡I¡aEbýY@ÑÔØ_Ï'y,Æ7‰Æ߬˜2%ú:¢Ø|…D#?çâT‚"©6`o„èáðz¢G”Ý": #zZ ‰fI%¡+dF6D4º¨²+z“£bwá⎈¯ëôÍdR §:&+*5.\ñÐX–ÁK<4Voª·rY·ìa‡CŸV‘$T'5-6š’2¦ò'zXí•dh.ó\üÇzpBfµŸrúq¥L.t,“ ÍÅó¸Þ°ÐXh“÷¼×€" +Ý­4ݙÐàvŹ󃉬\"¡ß]£ÏßÜùú¿ ý5ÒóÏÿ<>ý£¿øá/·ÀóÛ_þÓ_ÿøË?ÿá·ßÿðÓï~ù/øŸ>zÿôþùO¿ûÊæø¿¿üÏýƒÎëËo¾_v:n§?ÿíÿã×?üþ—ñ›ßÿM­£zãçÎëÿýõëGþŸ~ý_ÿêw?ÁŽmóß~ùºUÿì·¿ùéoüå‡ÿò»¿ýÖ¸=¯Kýõów¹ÐÏ¿ùëy¡¨’}ËÿË ýw¿þÕïþêgŸìŸ¾þúÇÿ¼ýòOú•w¦á„á—ö›Ÿþüõöýîõ~÷íÿä‡ÿúºÂå_~ñ'ößøo·þíŸüö¿ÿÍ_å±þÁŸýðûOþëSù‡¿8>ýã_üÉñéßÿþòßñ+öûøô/^ÿõÿ½l¿ÿÔ?ý«Oÿñ?Ÿ~õÚãßÿÅ/þä»ëÁЏÿùqþu¸ííš&þ¼ýµÓ—íX¯¿~Âÿë×ÿ¼Ffâ´ ­ú¬vQ¦pÁK˜éµ¼|­ñð¯|ÐÂ! +p\r¬).n˜¨³%™§¬voÉ^F`¼V »‹†“#ÝfÇPz½~c;,ݨ×ð¶Cu¬Âá(î…¿¶ÃNã~‹}žð<ìriïÃëÿ7ùBÿ4í^ë~xvlâƒé™pø—;t£jäµàng#ëÿ…Û[ŽOÿêñ8/ %+¾Ç4çj‡Ñ5m/#eýíÍhI…®o±w¡9öÃÂ{½û9Øøý|Õ¶sûk^wüÓx¹!üˆ*¤Q¿­vŸ «„òÆ(oFÈ òÁ.väñêø´–tŽöi?¿ÿ™sËÓþû7ú½ÑýîÕH»›¡œ×Rÿ9Àl;zÇË|²Õ.jy¯»ã¥nDÌÃ.wlžÃ~{ñ#pÊ÷áÔÖ·xßñ´/ïCv}s>܇oöŸjêù>²U +ñWûwx:ÛF¶Å¸l‹}ŽlËaçȶœÃ6²áG…Ø7¾ y?ì4îç0íË ÏÃ.—öá>|£(æ™~”·óÌÑގƒ)¥ó“Y~q1n§·Øçµ,‡W½œÃv‹01^ˆ|nƒ¦€UÞvØiÜÏaڗž‡].íÃ}È[4ïÞ>­ÏǽLëóÅX¦õŸMë‹}NëËaç´¾œÃ6­Ïǽnœ/ÆzØiÜÏaڗž‡].íÃ}øÊ[´ß¢ù¸—ãÌcùÅŸÞbŸ×²v^õrÛ-š{Ý8_Œõ°Ó¸ŸÃ´/'<»\ڇûðýGw…D¼ëü஄}ó@ÈιÞ|˜Ê:Ë냻‚‡Ý ºÕ|jwl|wW֍§2;û9,öyÂó°Ë¥}¼ßd2sô~{§S±œÃt?–³]ŒÛ¥->̼‹ 4ïØâ'l·wq*–§û±<µ4¾=âi_އ<ìúæ|¸ßj2Óô~‡§_±œÆô@–^ŒÛÕ-n̼‹4oÚâ*lwxñ+–§²<¸4¾=åi_^‰<ìúò|¸ßäžß¾¥«}¾}òÍýrwã‘"ð}Ü@{¯ãÚLJj ùþmÚø>>¬ÏO~v÷sXìó„ça—Kûx¾ýrf¿Ãó[^Nc~õË /Æíꖡcފeä™7mù<·;¼|ËËÆó«_\ߞò´/¯Dv}y>܇o¼œÙoïü—s˜Ÿür¶‹q»´eܘ÷avæ[¾Ííö.ò²ñü䗧–Æ·G<íËû‡]ߜ÷aú¨x>z’Í + Í—€ðêŠÍëXŒ›‹²Ø§?³vz>Ë9lnÒÇs›‘–+(º½­ xZ{Lo{1n®ùbŸ~ürØéñ·‹§í—užÿÆ¡Þ?ýéW{ ÷onß ìø^b½xñ~λùxÄ-ü¦llÈéëí׋5gšª £íž<€$õ2¾œoFŒÂý\fÙ ¸ú§í° %ÜõÓvaœ3Ís]o[¿v÷sXìó„ça—Kûx¾åLƒ Þïp1Šd; ½Ïý„ãvuӾ܊yØå¦ÍsØï°Ü›ú¶q•Jopi|{ÊÓ¾¼yØõåùp¾ÕLÃB—÷Û{¸4i;^e{{ãviӾ܇yØåŽÍsØooaññ¶±UûSKãÛ#žöå}Èîo·ûð-gмxmÏò€ÌrÚ¿ÓÐ\¯Ã~»ÞŒ8ÖµÎlï*±ÙÛ¤ÝÏ¡%}ü;ýÈɃëƗÂûa§q?‡i_Nxv¹´÷a yœr ·[Äù÷|;§ÚQö_\ŒÛé-öy-ËaçU/ç°Ý"8 ÷ý¼mìʺý°Ó¸ŸÃ´/'<»\ڇûðmÖóùžÌ•Ð4ÙMØ^p(¶ÇÆ÷WgÝ8߆õ°Óx~xs_¦ôæÚë‰išœÏoùéyïöóœ7zÝ8ÉzØiyžßr@ˆ_|¾Ý)^ÈÓߌ¾ê÷Û·h?ìõ9|ˆê©¾Å@õ×ÃNã~Ó¾œð<ìriîÃW„ýÍ'¿g>¤åãvz‹}^ËrØ=êsøÕ õíï·h1îç0íË ÏÃ.—öá>|“žrûx{‘N&Hl=$žñžog»·K[ìó>,‡Ý“ë>‡Éõýܶäú52¯ÓŽ_êj÷™ŒûÜGÝŸ ы}ŽçËaçÈ¿œÃ6M|<·o5\L×:œÅ÷%FØ·UH§+¦ÑNäûC^o»½r±¼»÷6¾/1֍çªav÷sXìó„ça—Kûx¾Y°[~õ~{çB`9‡¹dXÎv1n—¶¬;æ}X–-óŽ-¾ýv{—…À²ñ\2,O-oxڗ÷!»¾9îÃ7 vÛµÞïð\ ,§1W Ë /ÆíꖥǼËÊe޴Žßîð²X6ž«†åÁ¥ñí)OûòJäaחçÃ}øfÁîá¿û*ãÃøöí“gè­¾ŒÓ÷‡ñW ÿ½}™4½ sÃù±ÏNãþë‹}žê<èrQïÀ·>ì÷v~ÅËiÌï}9áŸ]Ý2hÌ[±Œ9q˖Ïr¹·ËœÎ/}yXi|{²Ó¾¼yÐõ…ùp¾qØa¿±óã]Îa~æËÙ.ÆíҖ±bއe¨‰ûµ|Ë]>ÜÜp~à˓JãÛcöåȃ®oˇ;ðýÿfìõßüôÓ_þøï>]ïq׿[èµìiÜë'ý×QÉáþ®= ]Vû—7;ºJkûåí8?g_Žó“Ïóۈs·“’ây–‹@.Œö +4€¯_”ñµ\ÆóxN ê>ÇÆѽqo÷ÇÛ¿øEëËúú©•:·qÇÉ ãs©²ßØYÆÑPÞÀß}½n6žíðÉô»åÉ°îÖ?ZÆë³Õ`ºFTlÉX®Ãçðb–#¨´Ó9ÜG\ûƒ^—º!ÌEÈ胖¾ÞŽ/¸ï]mÞôuV—Ï ÚôZøÆ¥.û³ÖD÷ÏÖ'u¥±Ÿ#.Ë7þÀR¡-÷½¼}=ïøR:¼oÏás<¢"TÈlas\~D`½î·íÃϚd²xp tˆØ¤e?hþhÛ%ÇñZkø÷Ptç÷Óý}mÄ™_ÒóÜӈŽÚ4Ž;nìו{ӎÉZe¨ókg0OÍaù¬_‡Woqr¨¬³í¬ljg ãë{±ñàM;‰_¹ãԚ ²ݤ¨Œ“•¯_=ƒ¿Í“:ûí‹,ÅÍì£Å³ª}øÉt¿ààύû<®‹ýšÞÞ×˖c"Û9úc=QUdcŽìö #û xKr¿>çð5È6JöŽQ´dãßú:ÀÏ 8BcœcËÔ¯^ż«(Ž*ñÖ@[úcڏs„½ñz? o\ÑÊÂÆ+~Ž_ÓWÏ!ï‰w lîùcØ__—þš£®O2ځàë׫§>(~’â~Ø~Æ ~𵤱 Ìu™˜¾vë×Ƕ6H1æ×7GÑÓ_SM?è<ì-‚@#9ÇÛ‡kí91”û¹b㜠ÞN`½uoþã×ìo?_îðÈûì1hËþ´èñóAŽ˜_wôþÙû¯3ÓºÆÔÌièÇ´—ËïÃÙôpÕ=ׯÙy-Œ×nÀ1Ⅷ½¶Øøê±ñ}Æa»¾Óç0}—KZ!Ï-+ÀœzÌ€$| û=ŠõZ€q<‡±Æ'CøW<ï æO]¶ÿ1ìv38Þº¢—ñÌ1… 4ž-~^yOÀxÎ<½Ü¸æx{Oc©1b{hõÏaÔô‘[‹sèñuÜð¾zóÑD븖_ü1íǜã^÷DÆñĄ¥†W܊§ÝyC½\m¯#6®éÃꕄ En¶éöõԾ䔂Žy‡ýú#?†½Åkú™6¶æoý:j£†ô™+ùªÂ^Ób‰ŽŒÝ³°oWýôÕs؝ÊøEúì9q½9]Eëµz?7ØÞbAK܋ö}p„çüCNåÎ>ßav*1H|úêU¬ŸWM§¨C²ß}„k¾/a·Ëû¯ê8"ìÀƒ|õÈù£íÍWt×;^UsU|c¡ú%íG¿–äƒøø0ãÓW<¯ôí+W +ÊÚðêX+7Óa¨’¤±ÀI’ñX_ïr~žzÆ^ŸUlÜó³«G¼ ÄT|þ™s[?â6ýzçlóöÚk¶ùø-ü‡?°ñväËEë8ü3ª¢ ö~~ {=5·Â~óË'->/ÌãÉËØÆõÄçz…‡p² ¶ïø@c^m\®š·&pÔÛ¿UFŽHè“98`OT2ž£ø1¼Üåj#a2ö¼ã°÷ˆ•Üà¿ÙXâ|{l<ãC}à¸çæ—6ÀÑ==k,6ï爪% û9~Wº.gÁˆA"ï³~ýQå¨g××®A6oYçÏÇÎåXÈ9ì@~ÃX´T¤Wñún#T„‡ôŠÖ›=ão6F`ëè1nZ¡ÂxϽoÄ4´7> /awœ/'Qb ¿Á¯Ùö£ñpÈ`Ä̗sc™_†gJŸðë¾ {+1X3'c=ãV”82ò%“%¿äæ,Ôò‹9"bǫ֔`nÓk^¾FŽ»öËGÍwÄç!Ÿóe¼„ÝÓãp@¶;|ò^ó¾5bãê$F¢±¶’¾\áã yíŽðOÉ7¸°³…EW2ÖÇ·¦qŽçk 5¾ÆÐQ§óy•œ¥1#¦ýLWóé¥/ÎêÏ8±½†‹A6~‰'xUEÎÔ5&ÞC$e?ÇʕOöѨ‰6¨9[*4hã“ÇqÅÞØZ7Þ:DF¿„}Ž²Zaó Žò•kñs¯ù?Œ:eèñ‘¼æ‘ûç  ·‹yæuf5ÇìŸÙ³çÔ¸‚ÏXÅ·Ç^Ése˜3xòÄó㉍ãN¯RSUcïŒ8,Šp|„C»ïZyyqwà} ¿Ê%ݘhæ8¤Œ‡ +þâ¾çÕ¡æ/¦¶ç¸ãG±g{î8B.q_?³ +šÑž1âܬ| ûhñNĈ|ïOŽÃ‰^hÇ5.‰¨2žíÌ©Æ/ÄñŽzéϳEmN@óæ¹µœßbøV“–ˆô:À¨>+qß¡G®gù‘SQ„(^mr‘1¦øÍ]‚½iuÇú‰sCŸt{ïp£4f|]^ò§žH ?ãJú °ÖH ]C þù5s€„]¡ÃÍ=½–½gÐ|ÜzHªîû‹Øå\«Üé~C.Yrr³¯$yúäN¡Œíˆ÷¯_¿Ær S?ZšåƯ± Ž0Ó]÷“cÚ"\±z¾OÅÐÉL¸ó»ÕPWÑy%^©ÑrR»²‡þ 4̃jž#7ƒÄ6æJ‰Šy„óŽ·„k5{¹óCÊ#ôv­þO¡_yÓÎ\Š@9:…®>ÐzÇfÍéØÉ3®â9«À>çL¼Á_ÂÞêkà’³M-‚‰Ú¿Òl\}:È!ï±âŒbžy}2ùDÐÜ(ÂE1¬ ÷¤£Mv¿S¹o¾nFðg;^ËYny¹wÏÊ?š9}Â*ÜF¡®9Øašúö’73æsë{è} •#Á‘g ²Ì¯#ΠÜ3œrÇ—òגAV4š¯1ꏡÅ*`ù¤"éF ¨ŸUý¢9®°W¸ÇŒæ©:¢;>Îð”JQ;?°\ [z#¼Hxö… ðü’yª´jL:zŽ×“É/þvBÇöԘDØáx–ÅskB„èjƪîôž4íˆq®VGÁ?ò~óï|ɏùó ¯÷LÁÆéB>w‰#Ô3Æn¾dy„£ÅÈ[«è5Ç·«‡q80l¿R瘮%Æn'! ύMc8ìqÄt~<„»Ô Åïm‹Ÿ;ìå±ïYö5´ÄG=r²9Ћ*fôçñ cyó.µßý/B‰ ¿µœ,4œpãòÒÐÛ2Ö}cÆdŽ9 WIº¾SÔö9é>‘K8S±,`ÍÍ0v& ¼ˆ74&&æN2F1§64ŒóÕ-·½åBÕ¾‘g.w®\RèÐ#šàà=zÎæWų‘qøŽU44É#`:Šxb$Ðå4³ +£:§r¨Á î9æoÙù;oÚQã'9GOcÏA¬å¢äX]«MJed<Ý~˜Ä.hv7b9/»´—''¦&ñ:”]GúO§üìî#²ìxN +Ôc‘Rµ=hF’Aâ^2ߌ/+ˆwÞxô‘!‹ŠðeÅZ„ÚåsÙá¾$b­³âšGH'Šu+™œ*¶†¹@Æ#gÆ»ÙèێFÜ4™I§ñ¼òг²eìØÚ4_M]c—Ø‘š¶H՚bK2Þ3Ôß˚Zh‘&ë~u¿ó ŠúÁµï*¸íqúÔi½ìGëú™ÒÁ+¿ñr0žÓ>î¼jȃbqÈXޗ°OÿˆÅRiŸá«z.[?©(=}ïj^ä¡Å‘·l!ÝJ‹öXXÀ +#;ð”Øx„ÑÚ´±ä$l¿VûGãkÌø·±qø¯‡|›Ã_¯ŸC°SFv‘Ó–çyϟco`]2<(k®š%rØ2C‘‹6?2ÚCÆc ”58 2¶ EdäCö2@%QdÌ9©-9¥µÞÚ< ”1òù%ìVvŒâTŒWfB]2€Š¾Œ%õ½ìY1l¬9›å¥áã iVšÝÎ%ú>jt֙ãîS³òŠt¶O™(ì©Ä÷ëxH½éw7uºOÏì¹ú"ɽ- D¤PóéTúR4_â°ËÈÝÊrf·¯mjñ¹q܅rÔ0öô–ëv„ž+éâ)ò>Ô4ŃP¡=ÿ?{oºÝFŽ$ŒÎï:§ÞsºÝíê*щ-‘Yîê)K^ÚÕrÙc¹–^j4•²Ø¦H5—]ñ½Àœ{Îwî#Ü_óëöËÜ7ø~ÎE’L’™ô"‘b/DF ;È؇QíC¢|” +gƒ Œ%]FCîuqÓ[Î}øLnëi[úÀ2‡ׂ8½»B Ò$û¶ÊP8>â²<æàªCœ0„†Ä£õ9qüqùÎ0tÇß bã3IáìÃâ0dÞ±i.8(·ÚªZ‘@CE;Z”…CJ1‚û×å‚$U.%Åak¯UáJõtJ²Ï41.×øú¹Ëy€‡í!¤ŒàtƂCÚeй=øz™ îאFžRîGj+»¸Æips¹ø{¸ã‡ºM tvdØÁ!TJG>‘û>°4óœÝ…“jÛ{ h’i(–À¼ëÐS[êLƊ˜†Ü{σ™W4®‰ú0ÓØ!KÁ¥wéú „3és2ËC¡±æž‹§è'ÂåfXxpéà±@²6(´Ë…€û§ü¹Ë}¹–‘­Ÿ «pÁ}Cŧ¢]hƒÎ2wôb q0 ”Ï|ÚOJak¹ÈiÁÃYôgß؋]Ì)AZØ[Ð܁dO)핂¶m9ä7^8J¹oì9˜ +á{i0¤…pqŸ¼!(ú6w²‘恹+/Ahn"Ž]*Ê5É|®•µe,I@ Ž)0pgÒ5¦ø_ RBkö&Mp–E}0ËÚKü>ß%x$…t¤¼Hb^2JáâöfYwV'”ïŽ.S5‹\yx³“Æ#bvy”•‡¶D· rîä‚ùý6ƒß62zÔ7¦Èœ,ÉuØ_W˜!\³€!q¶p“KœàÍu®o"¯žf·v8­S<4¢µCÇÆHúlÁ=/W^cƒ¥P˜õœX òr d¸%œ³D÷_ïJR$†@žæšâJ5®2#SÉe–Ø뛐“ˆAº@e&‹Û͒F¡¢1g.’¢„7·¡ÏQR´ô 8JÏ|xJcN¤#½¿Æƒ5#`šûì¿(fVZ÷Ž…ƒŽëú¦¼]:±®%ۘB°› f[’m3±NÍ€NU„#ñ˜ÉÏ Ø2‚‡”J*S6¬Ù‘ÈÅÿ9]ÓEÈÎÒ`±!Fª\JV>è+±®:´š’ +ð&¾p¤´ +}ÎRêAãש5bYº…´"¸PÒùéTâ5-üRœº¬Óƒ&úà~î´õ9$^`¿ñ ´ù£™;Yn’eôºÜçö% wNô$ÖdP– ¾‘í EZÂBÂØ¢”3NëGRÎræã8–ìD¾Œ²G‘LCæ3Üp-Zé.M¨1ºØœè›Ò®CsV‰C˜>ÐÇ«äIÂÌj/lç”egŽ Fz„ÒÄ픊þTÒÎeÎ + *ƒóYA7lF6¨¡*‰Õ¡9Š$d&.XÎj(’ÖŒô´ÄÓ{¢D KúxH*œsÆُèk%"sNYp” ²l\3¿æé{åi7§/ña`>ÉGgRSãœØ®’š’îB65ª¹]‘ÞABc†7¦t¨¤ÔžsîÑÆ}ð锘vHp‘/Å bÂì9Ho®¥ç2‹1 ¯Šr'Žfœrºp±ù¾Iç£I ×J $€„¼P@Ë}Ç4ó£óœ?6qwžxA.ƒ Zi–IÊ­LktpFªVâòÇBcDkÏKÌ5”A¯âtrҖÊ"=5qiøYfCjÂÖñ˜³ŒRÓàiËžíé é·ä;I"æ-#c{jü°l‚çdx'9•bÉçðI(€y€óž%Ñ|úø„kѓüIês3ÉÓË(_±÷EùTPJ`J«Ò¦, §'a”ƒŒ‹Ùc0›CÍõ!÷Jp69ðI’—%D[x…/AP óÇò8ÙЙª±d†gNIap¡ÀÈéÂüº¶;|Iyç¶ʏØû0óR[K ­Ê€AQÁ ÜÁñ–¤ŠÚ;·'×]ytéQ.&ú=fg" ªK0¸ÀˆrQp7Ú£‹y(*â¬$ؘû² j„¤’Îûh½¡Ö¢G¥¨¥Ÿ·hŠ$ âØaANV<ìºæ®cÒ[]5A¥álKÉÑël@“È¥½ŽÑ-_ÇÀCR;†žX Sùpg8: Œ»Þ¢t0ä4ËÚ¹`ЇMsasM¨-ž¨Ö4¶a¶PÖÉC‚;ىǬ÷<Æ:¾À¿®¸oÉ#ÌÊW¶À°Ù)Àw‰«p­ºU·¨…R3ª Áͯ‰n”ph=ƒ§…­¬@àuM!ƒf„H”z~âæÁ©Z‰ÖÞº q !i[kß8£jR ¬Rš¸L¼Ð†´2¥t¾Q¸LºQÈr!üJ]:`p€»ªJ”ÄnÉL\Y†ÁÂuF›Ž<™áá³ÉS'ç:b·¸«=† òÙ0Ylì‚ áuÎ.a.~/cʚq+הFï²âðu¾N¾Á3܋} ”x~âDpúSÎ&¤‰êì|×ت(x˜xÓ À5 šž!h,äN?Gá,RáP p˜3:ý`QQ'2Iϓ *pRpQ`ðϓ‹À)Oè,î8C9³„ä¬{ã1ä))¾>V+³Ñáv ¿Î(?æ2xü 4,0÷$ċi"w¿Þà×zV““؃3äJ%äÖïlÄ¯s[H×íÌ°Rs(¬å–CêO³Üçr8 ‰‡“C!HTˆÂŸ0—‘S [› ‹Æ,É’8›9é8$½Z’w…WM¡9U±ÊhŠrŸ4œØÒ +.O“¸Á_à^nŒÛC‚+á÷²‹N²l¢NeÇŸ ‚3‚ÁRîWŠN(o(‰W0ûÄ1ŒÄ0¡Qb'ÀS/ø$Iæç¾ +zÛ÷–—÷H.û!ŠÑa¤¨Ô'oª¬>ÓÅÀ3I}ÓÜg%‚ +wÁ¹M„(τÊ#qŠÑàTó*÷A¥Âz±ÝÕŏ†"Ⱦ˜úÒ#x. ísÌKÂà¥ÈT»¹”b¢\i%‡A’)MQ)5›’ˆ’èœâe•úPšv3…¬cý²ɓ0PìLb¹Çà¸(rÅÌøêÔ÷Áˆ‹öËHlˆp¢ÈŒkÞ¶t‡uêÜûîuŠb¾qQ¥Ó̽GB¦šbš«Ë‡èÈ6š$>Œ[ú²„&NCRš—B\µŽÌ1Ö%ïûòf®èV5÷-CúT’E•o2Ž¼ìJ3Šy—ޚ샡NÑ2TTÌ¢õõ½Ð,åß½k0Ñ<Šq—6ÂÙ³ nùá1ŠÜçŠk¼cÍaÈ)øØJY¾(GN9U°C‰>9t”-2ˆ9<ñÜD†Œ Xu·!z®±/zÂ÷ÔXz š7]#K'zl,P2R·…Î|³›Ý­`W( BLÈôˆR¼º˜9œc_½±Èʘ¸€Á[÷aA;`ê͟Rûðp¨ôʽRØ@{æ"›(æl$žýa؅Çàr,QKôùŸÌ{.•3 +¸Ä&üÞ”g³p„L0v>¥(ã”qr•à‰âˆÌ}hâ“p[Ï# }Ïa§!‘8§3‰È•ŠŒP(ÁýikKl0pÌÑyëK’!<÷UÃr.}eTø/¡Œ›”‘éJ8~b€¹7Ø sù€ž×Þýšd–K +ÈA|Ɲir™¤5Ý;8S®q”´Ë²0À,¥Ùˆ2c qîO:F‘ÓŽ£´7ë‰yHÉ̾ú©-o‰éH”ؚ̛< +a¢€ç0(ª +†çµ• ð’oÂÓ6ûÛÃ(0ÅaЄJ·Å3]g9Rʩؘ;P¿ó¹ÃP;õ2v"¨¼YXÂÊe<dÈóƒÊfV—Ãî*_x_€xN‚B¿}œ'T‘'2ñ‰tNHˆ4v[°.!½K78 ÷ü7L0Oˆ_£*hY0O¢õĝØ-5ÕÉÄܚ€yõ.÷´@ÅH_BMÑ]ñ4øœ(ÞíMN˜…áG—{¥ ddtò)•»t@™§TW0Ӟn.ʙ dÜ­±í)§ +ÎÒ +¦Ê¨}Y6Lœv˜¡¤$½Ñ†% Ð% 1%¡u¨„ûeÍAþ£9µ–iÌÅ$µ$w‡¤eBÄ£{^F K<¨18 {˜”ê\·V¶åè#¿ †YÌ×¾¬¦°rYÀ¤«Ã&“@2O#4T÷®’E^0æjŽIFekp6BÁÅbfeÉ©2î×Ny¾¤9 <:±°ç!ÁƒÁ.Ë]1zÍÖU'ñÝÜo ¨‘ã«ñ&ÊÊtôj1 1so¹Ï¥ßž¦1Y£lü(‚BPÖDz@å=µø&ÿ¼ôË‹hF5ˆ|•eW +€‰÷*AÝÍ´Žµ6‡YRyTïF  ñ:.V‚}À{ˆ¢úJ’ªÊ ­ê+qÒIÑ[F^µHP¸×(Ip—Òæ)[´®=+‰é«([+~"¹;åCª8ä(÷ÚÀ½-3wª˜ôɄH^»å%T_$ր’ƒÇJ‰âáo\û¢ª2#´" ’mõ!ÀI<´‚$å²£¡¥ëxT‹IQ #[\駔jiR‡-P2/œ&^O¸ð¦â,ñõ¶¤N©ÌTê™F(…ç9ù 1…öàáÄ@?˜zîI<Ë]}r0k!½Ø¬©1±Båʯ¥‘ 'ª°UǼ†8ºÔ^rÒºŠØÊ°>ÀúC; }ŒèÕsrÌ"ˆêŽ\û½ª]-4m™ª[ +Œzåî¤P®vºÇÀ½ð˜I߸ìn· AâYÌN¢#‹  A;ƒw+¡%ÅcpE9âÆi$ñSå˜/g<^¹wäSÍ#@뭉¾Ì ¹FãŠeÚg&¶´££cJ*A”ÏìēÑ?N©ÜI¹2‹ÍT™ã‚ŏãY¢‚{Ú'u¥ elÐJ©èؼ|àM¨7å}"—Œç>FŽ,D Q¡Œ;`6NÚ9Ð÷°ò|ACæ7Èê*¡âaÑ)õsbºt¨A¡ÅÔÇóøçY£™h{V«$ªBM\Ta«Ÿr_ÆI%TÚ ™g +Ëѐnª2*ýêc©¼¥ˆÃ3ªIã„«b¡/2rRÙ'ª¹iÇ|?Kî€ÂÁu')–=²#wUFRUTËRoÚÃD,*ãé˜;ã«òëáÚ×äÁÂò‘©Ä\",»$¡N+£…@¾t*óº¥ùÙÆ®8hÊü%H¡,3&ÑQæ\žz—g + –TF s ®ýubíc)¦(y˜Š~BËP|5óšHê¢êÝø%-Ú¨p©«4 萫J̡ǖrÔPJpÀÜWwz3úBÍGokÂE•BÐ~耾BF&RB+|Ιwå;ٛòÀ´óãá«ÌsË})¬o~G ‘í1ñÓqŸì¬\¡Lµäž_ˆ‹$`•Y_½rb5* ¥Ë0¡ã€8[îxw)ùŒê–:;]Á6nKP^šúŒÎK¬[R¾sNüĖ°VɐÂý 4Ê5Í}MV«((§8 Z» +QµÌ‹n +$]_®'“”™/ªe„AúýŒ6M õÈÑ­ ˆ‰Ðb§Ã ÈØOlÏaÐáλ"ñ¨£ÒZL{Þð<”γ‹O©¸Æ¯rÓ£¢²©Ø1!dfÜc¾¶vª°r_Ò «x !‹iX`T8LZuSI+~»}å%@%£ªAX¬Ø5fT‘¹êaP#>õµ U(ï.e㡄ø\éù?cezÖºObo`Úԋ*¸×¬b`Æ+€y¤×„”wŠ)HÆÛ÷b,u5½»ƒeÔ8$+GhgFq@EÿQ󤕈 ×>Û[R`EÑDLIUF_ehiæ eH;ž‰©šçÌ£MÐohœÐbÄT0×1ŸX,¤& 3£ÔvYX½N +?ƒyN†^òÅÐہlŠ³z› Ï?˜Ç`Ëáë/@ªÔëjX‚/(בZF}6¡Ð%iâdÃF É«)碄Ï¿ÎÇ0+æuÞ:Xýî;¸ió¾WÑÊ +셇ûðåÌÉ?ôæaW@Y +9 +Ê_¸CÇYÊñuùDÁLKÔGîE;òO¡í5cíuÊEJ0O\sÿ:¯{É0Š9EÞ_88“’²êjHA>ÃH‚kÖçœr¬NH©È+ eqlÄ,Ð¥RV¦Ïœ‘ý–áT S²[]~ê³WªêŠøkgŠQøk•PDîê Nlj…û +l‚n-Õ^õ%N·´îD(Ò(\X=bðÅb ¯/ÁXœšZîÛa|V¹Úž¿F‹Rµ®(z7ˆæ>\~¾N´NS—u1²¾®…µA¹è]_c4ñõúæ+þ¹îÍUíº ¸ö#¥”½œQö ÌNâKy… ÜG³2ŸÌ e좄—ùB3DZ¤WóBÕ¯‚¢mÒjWTƒE¥HüeUoŒosžy$tÆW]FÝ1tÆW›@¸j/lQe•ªÎø—†òèX—|åKµWÎý `Ìó—Îá=ˆ®'KeP—Y|I©WÑ°ìY¸¤TQÉ.d¨„„X¿¤Û¬ç0‡—J[¥Êþ”úÛ}µ´– ÏüMŒ™×ní͹‘¯]»´Û¡š]k¬ãë ì=TU} ÝNíÞ°çnº­È5F¿/А ŸL¹÷P@ÇÏ\}IÀ ½Á=aQy’é&[åkž%¡Ó\ßâÃ) !tRðp8¹pqï(tƒ![QI£–†•hüÑ¢}”© µ±@i–ÓÅvs}’—¶|@zó煇3ïáÉRŸ(iºb9e³rC½žGޙ۰Z{V¦þîk¬ ˜û½)¢´ÏÌWÊátçLžÀj“(FB…aA©D«Gº;è³alÉhœîŒnaÄT‹|õ•˜ý¹ ÚǓ)ƒ/Œ* +r$§:„€z?pêœ;LØâé%)Ü5mw &¢õI­® ö|‚,#Ïfe]<ÜӌIu>è%\‘‹!Շ ðX²­*oÝþ¬õãsŸoÝ{œ?œî¦ãógÉ¤ ªzüípðlÔLzƒ—{{¾_¼ì â_>ýäÛKü%öÇ£ï=ìõ ªO?¹ã?·¾4ß~|røíð´ÀÏ÷{ÝIo8èŒÞ®øénëö› +endstream endobj 49 0 obj <>stream +‹þÀü¸g:8êL'Åø³Ö¦á½Ñ¨3Û¦{Þ럎Š¶à­;“ð#ü3y{Yà·™Ln}ÖºóÝ ×5ð#ƒ{ð²Üöu§?uîNΗ·t.lcÓ×ü‹MÚyÑ{y>©?6jUƒ»÷øøÞÉËâ¬ßéžOŠ?u“âIorÔ=‡<8fµÞ;5MW]ÕH÷xƒi|SßlȐÞÖÒ[?¶Uý¾nlHÖ&Çxrz¿xÝë@·êS¦üÔUÍûI:ª=ÐQ1žöp$jUƒ;NGÝâ^ÿò¼SŸù4˜ÂÞ öê^4¶lÕ\0êìYñ¨3{ÁþÊyŒ:¾|>®ùn;mÀ}Nß^Ýâk0¢GÄéžó³q1Y½Ò6˜c4b‡Æ*žâôm2“胀 ZOwØŽ¾üù¼7)œÒoû+Z—gl~ešBýq]Ýi¿3:Æ#t7âܓW6Ú¤ñp¼¹Šu†ž¼ªáªú£ŽÎ:Ýâ¨Ûi´vKO]Õ(ÞO§+&hwV¼ÓYqÝ8´Q#ÍjSå—úDùå +ucÕdL¢ï³FõA4þ%è<ö“ÃFƳ/>\oŽÜ±s脗MÀVq±hàÃËbԙ ë+¥Ñ›e/àM8;ߝÇ×e|¦¾ /.‡ã•Ïõf õ՚W¢þì@Û«ZuõÏÐW+,B¥ɍъé,ˆm‚2ýª3u…¼¼3êMÎ/ŠI¯»Õrs–¾)‡q¿7yÖé­2_lðile©G£ÎåyƒEzÃÏäMTù×ð +lØ,?)F/  ë&K^ÎM˜¤ڙkÐŒñªÝ;÷‹³ÖÝO¯{xX²½áaM†¶iáaÓ¿ÝÉþp:85ýÜ®°“Î-cÓv2®?ÜÒCW5f‰kÒ6¿m]èÛ.ð­LÉtt2íƒn}ߺ}¸.iü«®dx+4ÄhTƒéÅÓî¤óºhÀvâg®lA·“úæ“θx8*þ15Þ`yÏPŒÁ&²É^Wô*·Üºå)w›î}l:½Ûtn|õ)±Ût»M·z=1µ½qžM†¶‹ó܈8Ï?û¿\tÆÅhºªþØ&{î±­ ÷l4¤ð¹+Ã?o>ٕ‚™åB›2uÈS몾¸}Ý$ÉÍe"»Û®L4óu„FÅi³œ›Æ?tåè+œ¿m儛yÂY8hg6yµlý•; â#6õΝݍ° ‡»¹wîÔ½fƒ…ÇõeuXmÇ­Bƒ®~5:Z‰ûoÕ'©=vü؀×Pû«ÿ#óôxuÐØs™5é†1L}{Rc^o.s3Š݈DÓp²oKõœ½úºÃ¦”ÏÙÛ¾ú9OoN’úM04n~Á™-á|‡ý¶9Þ)pnÀ_|¤ë}7DÁÙ0^²Q#í©N,ýÇ[®~në¦í¹µˆm»m‘ÿa®~<+F{£íµ]›CàºÍþ¤sҀ(›dØå­úŽ?¤Â÷ -·¥‡®˜=œºÏ7™ mï:lëVÒºY+ñÑn%^˕ÈnKÜ¿!B¨ŸAь£Î`|Öගk¸;¶Üì³nšÉ&Y|ì·ZÜ_K§Ù0ýs+Ì>>y¯ßÿ+qÕ³5÷ë†-å͎èý@Ùʋõš\€µaëÉÝÅz —ñw›y±ÞŸþùßçýbÔ$4þúß«§ê¯Ó ¹V¯ÉÖ»×ê±vßRç´7m°9©ýUÍöi¯ßiPrµÐííùHq×|Ö6¬ޓáèò|ؾ¬Ï;¯¡ª¹ã‰Í·7@iû8aƒ˜'¼ +yyë"¾OšÞ@³9ìáƒP]÷ÉÚ0þ°ùaÝ[_ ~˜é¦VHº»ju‡¯A5€-nrlÊ ·µ×mG=ƒ…'cŽÑð>•«½H¥ÉºÛ˜˜•“ú³µc}WÏúêÏÖ¬ïj<õKçÁ èý¢ÛÈÀ6ÿäUvEyì\{´óO^ñ±v¿7¾ìwºÅE1˜<é\nòٶŵzB=žÖÜGVúX{ø›V®ç¤¾ínãÃ'Ǧ†õgkÃô€-)9ÔàªÐ N:>©oôÚ8¦Ñ`‡m +Ó¨?[7ä"ï³QQüRß}Ö[P>lØ¿ºÉ õÖév§ÓÕ®þxxñ3W5ÈQÂuýqžžö&½×MF韸ª1ö{ƒ¢Sÿ†×n§ß}2lñ=qUC¬ÆsI}øÇR{Bˏ]ÕÕ +Õ v•7(a_Õ :ýŸ;oëÌñ“Ψ™L`¸2=±þàNŠ—Mä×üʖc}µ~Ø@©^݈ê àg£áEƒS[_©’Ôô.šÕ_|¨ŽlO­š½lë"—º»È¥ÍQÍLֆÙsv‘KuÊ«­T¿ý™$»›L– 75v©»½±KM„M9ãv±K×úœ«/oVìR“u·1±KÝí]ÚFÖ·‹]ÚÅ.íb—v±K`h+–nBìRw{c—šœ›rîb—®7³¼±KÝí]j²Ã6…i\yìÒ¹Ð61«É7_³W9Ák¡¼nÓÓ$vp7=}z¶ö>»]׊ŽlcW•´T} Ւày%5z䪄˜ZíôYïMÑ_öŠþqÃ0‡-=ÃUÈzÞœg½ÁÊ +ò% ë²èLî7‰t¹ªîbì«Æ¹1öãKˆ²ßêûš'æÖس±Ú»ûÈrµ‹°ÿ0ë±Åîò¤Å”ù7i™ÿß5ŸÍß»æ‡ú·¸½ƒgæê´¸5âÕ¯›´¦o„Iüd¥ rƒâÛ\!¼ÑÄíìãW¤՞¡M,£½íÜuéV´§ÓLoƒyd3>²Y–ä­¸Ö®¾ýìՊÀ‘xv í• üõG´Â«]‘܈­˜Î҈Øê.õGԀ¿ºBnÞõ&çŤÁQµ¹‡rS™wäíMv]Kð¸ágó&:„Ö[Í6Ñ;w~EGvîü;¿öˆ¯•;¿aFçΝ¿sç/³vîü;W2oçί6AìÜù;wþ5rç£| }žÜm&ëî\ø;þ5ñàlš)lçÂ߹𯒅¼-úýáϵg©ß{y>1 öº\ÆfŸ»2™«¾ÄÕ;;›Ž‹ƒáÀȃeîÁë?Vˏš•@*=te2Kýp::3JbÃA–ŸºªQº%µµ‡à‡ŽÑ؈I»!÷S쬊;«âΪ¸³*~¼!֗X·Ç´¸»‹cgZ¼F¦E«eÞ}9*ŠÁ]#íwÍYÙ{9¼ûº7ì“»£âôîpÔ¬Š]ØÙ¯\~K뛅‹¾ùÖÌâ=re¼3«?ÂÎ/½‹édE]òÒù@\±ùê~‡p8^ƒp!ÓT–Ýa½É¤ÁÕãË¢k¤ÜQs#Óü“W'j4îƒ7—FXg¸áÉ«Ó +V¨éÛd,½Ö5Z\»,¨õ-l;KÔpg‰ÚY¢v–¨%jg‰ÚY¢æ¥…%êzX¢œÝÉZ¢œY + R;KÔ¦)Ú;KÔû²D]ÝqxÕÞñ›b_;r:î6ØnDՙmMp¿ ƖuƸaIÏ[Qy¦AU“]噫’êhC*Ï4˜£]å™ët07èܘC¹ß›<ëôV9ä6øD^·’ßîL¾Æü~w&_ÿmș¼«·¡gòzªÖ¦ËÛ[ ®±äqÃÏäMŒ³h¾Š7l’wà*:²ànhu´£î¹AZ vWyªÔ¯·«¼qMETyã*¦m)RQÿîïÓ· "ˆÞ^Ýâk0¢‡LiDo®nDó³q1•6*N›íªMã×!˜úC±Œ§87X[y‡u¼aS½·„ßËþNÁ¼! +&“É­Ú‹øçÞi“€?×üªM& í¼h8çÛ_™ðsà ¦hú• k©ú봁l~…¢y£!5P Þn¬ù&ݙo6] ۙo6FF϶Î|Ó`D;óÍuã;óÍÎ|³S½3ßlõLíÌ7›g¾¹©f€‰QtÆݶ¨p6êt'þ·Ã^ƒtûxݹ÷/»î5ÎӋ§†¯›dÈÇÏ\Õ“výêW'qñpTücZ º 4˜™Ç®j¤ƒáѤ7i°}ÇØüE¯ßdNK]ÕP»õ •›¦Õt?hxåuŸ­]ñüRÅ®dÙ®dÙ®dÙã (YÖ@°ÙšŠe»‚eY°¬]ÿ2ÄÉ°ž5Ü äl4¼hpÔcëšBЇ1­Q€ìC™Ä^LG'Ó¾aqmJݕEªPt6%Ó³‰ª³YÆïµ2 w6禸í l2´]ÈàFø +¾/F?÷F'E:xy¼¢‚Ç&… 6X©›4Ø`@7"dpRSHÜPNýˆ¦Íuè$;Î‚án®G¶åÇðé\¥½ÓOwúé맍¶ÙNCÝi¨; u§¡n†Z_bÜi¨×x@7BCÝú¨ÃúES6WG­?ƝŠºSQw*êNEÝ©¨;õú«¨·î=fÉñƒÁ©WU¦tüípðÌ`ÁË1÷|î Œùô“o/-itNúÅ£iïԉ·Žù<Âo.‡£I„ʍÐ/ȏ3Tu†ä 'T ÷;“éņa…`Øý‹ò@[±Tjؤf)Ê\Åm¸"ƒ °<­ú`·uÒÎ,ñR…Ýïæàu¼^“$»Tû¿ÚmƒT+‘JxO¥"Þaúg:(4œ"Bs¥*xKjOû=íÎ8,刺ÄŒÔó©‚w_DÈNTø»ô˜V˙½ù8­*sÙ ø1CŸûP š¨¶=˜—bÙ_…%)³sÙE4Tø ÝXe<ö5E“%½MVY®s²rÌ"/yjGÉì!íAðز‘§yº¬:Ê ôÄ,TóOFC6¢ô‹ÌhœóìW?"f¦ÒüÈݐ¸QâÆAùªáì1dG ¢ÜÂlØ¥#[òhÅ•¡r#¤™¢¿K—*ŽP¼ëøҙñÉúãKWŒOЪd´*-F}x«R–V¥.ÿ UÅÐdiQΡčQéGÃËÓáσJ…Þ™ù­^¿¶±?oç9ˆfŽÐ‚~1:  ½´-ñC ËÚL¥Z¶²vª”7k”R  —LõÕ< +(<М+ÐNì’FØõu)Ìc£7殑ïÀšïúŸD4Fï,í–Z÷Ìy §+­{%cëηÃÉó¢;žà**æO*2ÖNE +»MäI:¿Iî=~äøȋ³áèÂþFËÔ¬âÓáIq|ïq~lú|4yÛ/ŽÃÛË«^ûã©eS|slú”¶„e±4YX°•§f–‰m¤Û)þàÝ=,^´â:°¨Í·òüÍÂ:KÃZ÷¨àInW¨tk ' €:›Ý3àe˜ßZ¢¡ZkêWXÙ,êZl–,wn0\ÀSûàï/A¾˜eóÅà ŸJÌ«X’EáYÒô]ûuÞ%ÕÌküá²Û„u6áïžÁ;J•)+7SÑY;»¹/(fAslb†ÌñšÒ©1 jà ƒ/å7E½;°Ëúéu°p‚ka8F8ç"VˆI¤Êè0€¸ngIŽ¦ª¹'-“R¡%Žä"€prmCsü© +@€LX‹í!cPjtc\#MdjÙO®@°5o•™ap" 5Ù<è-‘<ô¢fÀò ¸'”90rĝ DIÕåò3½J¡9Rû2úîŽ;:à`ÀQè;Àœ[†çH‹>˜˜gZàXad õ!G|­è;PÞõÅA\_͎”Â@é«À÷šÁÀô …饧íZ*-,Ë8øKDK"ɒÄqN£&Òôۜ™rQá„ó•YÏ+=ZòØ,M \ˆÔ75ï04ÑÄ|†§¨­efiêŸL@Š—€áYdÕfݶeÖ²¿oÉJÞæZ ä‘õ›­6û00ËDˆx([Ï Ž×ºYü<¥=½d[ð)ÕÚîcó È5øîÞ£ø£@Oh™]iD®4|—¸ãPÝtŒ^ã0àAӃ}‰ûÞE%D¦å[.M Ó (½…@Ô‡ƒú93« šçµŠ‡gžÎEâŸ223a„“¾ú·Àõ‹žvývØøL;<æD0| =M_=v¸·ÓÓ®oå¾Ûñ,>LM+.UK‘L Ç*W «Z%üf«{ý‹ê–Ò±ZÿD§UÁœ;ð7wææ3Æ[ì0‚Á¡sËܳU°èÙ3§ÓÁÖIò ]÷E۔d…9*SsV€èÉ%V|éì²ÚnÁuI²6·âuï{Ûúñ[€üÕ¯‚=Œ Ã~ÝNÿøñ|I#نöY´®d °O·°C÷;“Ηf·ñìÓO~|üÉ¿¼óþÏÿ,üÏÿßÿü?ÿóq~_ÐñÝï»ßÿå:¬Ï忯Ú_ïöà æd®€폞}h`^ß.”}‚Ø‘·Nùåm ølY’¸uŒ\9Ç?~î¤ W”?BthôsÏaï"âãy”–½q`©«‰] ±7`V™iá˜ú禮g—§ÀSûç%Bç%“[ÇU²I%‘€¡ZÂpfÑÌ (4’G –y!%#1åÖ1*0ÆÆ¢Š‘%×Vn¿‹¸rëø]–[Çï ²Ôíx¥Ðrëø¡]AÖsg=ô‹Ÿ·o„‡{[÷¦“aËnÉÞ/Eð Í{מžŒ‹ÑëâôØ(Ƕո¼}Ì|ß ­œçvÅφ¡%‘›#œVæƒQkÌJ  8S‚ÅjöoCƒ¨É©È4Ɔqž+Òº=0„Ló7KìȬáÈ,iü…NfO„ ÀC äLÊøQ³ ¬I€°GìƒC怼Í`Fg€BcH¡7¬%È÷‚ ˆùW!ÌYì Â£~Ü}Á^Tь”F¸§!0•á¹‹ Ex¦â.՛AB~Üy³Ûó4Ëʽó¢Â£y›i­E„>†øÞ`è} èæÕ¡÷Óæ{O9u7žq?(ÿh¸ÃüŒÏÑÌم¤i"SV¦e ´ƒ•†mK%"‚H`R—‰©Ú +í³%bª¶µ©…gUÛ°Àx%DOJ‹(Áp¨µ§†ïALHßט’~HþÙ0l‡>xJÎQŒ,læô«Å”ŒnÑ·YF»Ìm ӑLÎì)؋à",QÒ|̅Ž°hŒ]øcˆ§eFȁ‰Í wè=E|/Jœˆú[âD4¬À‰üЉE€À‰f©vHöݬĠ.Ê0«áE,S9ð•—(iøK|( VYQ"/dðr‘E¼!JFÀ@ɆÐ5B/"JúîF„ôc"XµÅ'*ÎQ‹|›"OgˆÃp˜Ê`Q1ÍÌÉÎdZæ’Òœ– ×% +3¤DD$íTBÚ¯Gˆ€èÃ`ˆ3ÑÀ¿>"žïfDÞ´Ô͈x~,þA?Z‡9úNě£RðÔ 2ó—©L—dÆÜ¢™“$P¼ÊÛF²È‚ÈHßc‰‘`±ÀžsB_ÀìôúX\D¥,Õ%iþZ}Ï¡_v‡¾Ÿ‘¨H XR Ï<æÀ×TPɏĜ˜xóC$ÊÁ Z1ñH ‹‰Gb›Ž;™1ñ<,"^³C$Ԟôþ˜x®›1ñh(þ9OÂ<ñf©4# ÆÄ#˜"‰Mž$\ÅÔ#),¦ÉjþA'ÌyÌî{L;E¤ ;>Bë)@ïŽ)G}ŒIGñúáêàI7K£᯴i,l-wL‡Íç$©˜t$rŤ#ÁÌ?H¢›GM€˜xQ/‚Ù1jOzi׺~–¶­LضD¿m lÛ:•¥½ˆzÜÓʎä""ÉN鼌‘ÎKbó²!ö€ˆtHÃp|5QÀ¿?"u3¢„@<ñF߉l³ô)‹wÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(æA`ÇEXiÜôâˆZÔ½ˆZ4ùA;¬Ñw¢Ö,]Êò\D-Ѹ2PØq“œQËIS±Hà" d„”¾GÄò @¬„Ã"¬4l÷ވVÔ¹ˆVY`õòCvH£ïD«Yª”¸ˆV¢a‘Èã÷£‹"Z‘ô‹$,ÿ”“À¹ŒO®gô昧«ü93àód•Oǀ×õêà£ó~pÏnηƒÐµ¼;U4\:•nŸpǏy´Êõƒàuœ?øàœû§ mà‘ͻ€¼–¨Š‚Ë ^åš7ñ™G«˜Ø*‡ø‚ý,\|[b…â,–*T‘ÔADG}Í\å¤*XxËAï+@ p%ÒÖlôtcPÉÖ類Eíf:[g›é¶0Û*…$PrFj¨’Ú’^é )ÀõlxùÝeéúÛʪøÍo¾ê†ˆÔvb¶2§½¸Àʈ>óðy/n´'²¶fømOÂM3›d‰ÿêb\᳍ŏØÏO|žF¬ «1ÑÇÃÐ?÷-ƒr]ø­„Æ¡‡ØC÷ÒCúHMèQèi<èƒP  ²'rÄuAÝõö3þȰLX oƒqIðtáî3Q%hôÙ=ŒÏތîõu/· +=ñ2ÞÂ‡Ñ +ëÇaß½‹òG×ßÏÃxâGYÄ +_ÃP¡OD„ß¡Ã÷q‘/<™¿Í<ñYäÒ¹a ³WùªEm5›½¤c)ÞÙë|âårõ…¾1/Êč‰ÍE4CÑÔEÔ'âÓTûխęىç-êÐÁû¸²—'³—æf¹°´T¥9©ï'¬n­óùËT–âÞ¯›«Ù Ìh.¢¶ç·Z´…ÃÂÞ +{vCÆ[ÕMßAigÇ~/^‹èÏÑ?MiÔXìŸ%UôwµÖi5ýâÞ¯{–þïX5ʋ™Îᆲ³Žkޕ1äXæ3ópŸÅ8 ÿK×µò± ËbÁöÄ&ÑG×â,šc*}J³ò2˜_ËÊ¡5,6-Ú¹6<,…R·6 +vûëK??:Zz«ïT<àÂU•¦xz.2Jc·0Ã$L†‘ʵPhvÊPG€;Ôs†öR 袀J–†6¹³„z, Wu1¡ËÂ̤´a_ˆº1ÞD€.¦2ÙîøFÔaevTÝ%…Õïüøäð»Ç÷[_¶nw{£n¿8ǟµ0ºÒLyÀüXž]ÑN2†&ÓTKaí(I[dÌì}´*—äX®YùL%¨Éø²l›CXa¹I&Á€+pz¥+ɘå ”¦q"¹¡¦Ág+»º¥ +~J Ä¯bÜeÌY €ÖiêT4Ó–áì9ø[ðWkˆ^I±Üöìhæh·¸™+fPÄÃN#Ñ ä¦mžæ ,Í,řۃë4lܓùM§”©vJ3C×} „EÁmEEb®&M¶~[Üü"t¦Ü©ƒù~®`P +õ‹–d†óÀî 胗Œç¹Ên†öõ/s˜Ùãì­¤™×«¢ÂœdNÅS^Н¸_8 /¼åõ/ûK°\.à³ÚŽýpè_ͨ@2O £E(T ±:3£&C"ü–C5uûô*C¤M;Ãcœ‘8ËaZ)—ޝP4}‚¶šûJÏ{ Þd†¨qÜÌ«g,’ìèa”úô:·©Ç‰3¹¤^†fá¢4‹ýÀ å½i=iV’£ð’“j§ªeµÆ³g…¾SÕr‘¶Sºë'¢ÙE™–^ú]ð1žÒñ¶y3”âB5*“†ù3=çœQ¥âæ-°ÿPDȕ½mǬCÎp×XE"I\Ö}`uÔ,EyÇ,d #éÎ$Íý°R7ªá7a#Q!WÞì¸f„@{p¿„ÙàäºKe[¦)^èeúmGŒŠ`J“õ¹cYŠ»4Ã&dŽ×TU6Ù–ÔÈ3ØÏÌÌ(Óxå>gD'˂¸3À5m"·>³¶”‚÷˜W!§‘mÅ~Rè;j£FË®áX‚”ÁÎΤ»he³¼è ÝÀÝDöÖ5 ¢.\Ë¡„­(kX–µ— ÃžÂš¨6\Ù  û¼2ÁÈ3 ïø¶¡:x cÆ©­sÃl1ia©åŒÀ’X˜™¹Ù;¨˜ÑP¸ÔÎ̃º£õ.µ“xÉúü¶@·W†#5ÄÝꖄ`^eïÎâê†7¼èœ¦cŞùT©Ü'k(öVÏj[ŒÓ…Þ¸k…S…ÐõÀ݇4$ã-<øݚñ^ ÿT™ýÎ¥kLx= uØÜw0Ñ»y¸Z§â Ðrë2S¿ï~‹ûŒÔôxüEZ«zayÐâ×Ó={%O¸7HÍ~¥Þ-Ò¾T囹(7Òàa2r‰¶?b!ây} /¤ÌV=šæx¥Ê¬ŠÖཱི:[½÷VÞx:ë¯,­’‹è»_F¥E¯ÀŠêW/~.¯ëҒWÑd—×_Å*•å%ù>\hD{QAÀÌÓ^VÌ9”á†Ìà另ºrμwNO¯õÞÊ9wÞ0¼N‡¡˜—§o#Ù@Ùéô·*œŸ,É+– MËEå¶ÌÃuÅô@(zè̽JT¼Šž¼˜Ã _³y¼ è¡÷ês3b^T„A…»]ù ºâõEñfrRŒŠ^÷üøáðÕt¼È!÷uŽ,M*DÂY­½ÁF͐˜J‘qaäÄï-:RÁ`̈́áCó'«†k)‘ObFÿ퐾íÑ׊oôelWb½tf¶Åϟjp.K:¼Ã·Cú¶G_+¾Ñ—ñû[€ ®°4B^eÙÊáBÂÓɳä#EÁ]õúûË´õ°óz8êMŠAë¼7øezöÏÿ®¸‘òãØØ  åp©(½ÕÙà¾ÄåE0{уÊíí`"Á$-Õ¶ؼ²Œâ£ ÈÀå˜hœŒ2™¹3ïcLÚ6Ž† ó°!>’Û !Eš[ç/hÕÚZz/·«f+°Ñ¨Át€F͌¦.ÓÄÞÓșÍì³õ ²6*@1-@ 5/F¯ª […†‡ H ÀiQA¶Üàî߅Šüò.jyö–JßH™™Ëxƒ‹-r^"˜R :‘Éü5š¸”„yQïèm…e £‰qá2ÇÉR)SöŠ?a«¨¨Df(Û(×ÜôhçÄî$à =£CZ'3Ü·‰šfƒpäL /^« Š0{¯ Ú<@‰‡x×'þÞC}Ï]­Àmi‡0 O¬ïgÄ,¦`"¨“ + {°\$W˜p¬)Ö´”æ„]¬JhÓ & I˜½­&í´ Ì\§p‘´5C ÝÆ5ƒAæÖwOˆÂ¢Œ^«)5ƒÓ—éÐo¼—UŠÒà`ûk"q$Àð%R¿J{‚‡}‡ëDõ;T“žM9Ü˸Ù%]̃”`â”ј©›° ¦Aᝊ)ûØVl05dú¤f‹HeDleÄ!‰ŽyJìßèßW¹»Î‘@f›²<çx½dÆrëÀt*ðlw†¸ÓÁBãö­ãJ^ÆÇ5¹>+ø€×äh¶3kñ4›Þ¾W‹éó5H—œãlה·™u-îfž[‹¿™£¹‚ÃYhs‡ÏÍq9­àsF|^‹Ó™ç*xb[ƒÛAÎÎ:üÓ6×âx˜”¾ϳë}®g7ÙZ|Ü<œÀëð>ÈfnÊý ¯uŽÿì;ÇÁw³ĄÊà-I½·ÄYöðò¬<³…F™×¥!` +êŒ-ãG 3ù–5`§f•0zôÐ +¦h¡®‚ È¥ˆ­! uêBO±# èAœY˜²yPԋÙq.95*h€1\fë ]4z™õÈÍÒ&‚FÝ*9B·*¥Ç+耥>UÐ*^]«¬î)8˜ò–4{#ÍÐê®9¾–Kþ‘ +ÙèŽ5A¿žzƒ‰é÷ޞƒ£žÿòé'ß^âo™ýíYjþ}zòw£MS–[û£éø¼õ¤3è¼,F­§£S0Ú¯ø±e=èôû½—£Îåy¯ëš¾0”¸Óz>œ¶öZ¢õlÒ¾3×ø³–éñíêGŒ†XùÌLë‡G¿Ó=7©ø³Jž ÏKüixÞ/ƓÞلڝî[بԴ3ù¥0jñàeAmÝ|Uàµ8þ4*zãâÎg­¶#·™¢2±?ÀĝîÏtf&ê<|…Ïà0°ÿÀÝ!àÔ|­{÷GfA÷ DqØ;1ÛêøàÈ´Lö;“c;¸gCÓ©;´ó#zÏ9˜ùhãêrüŸûïò¯ùòÒ"µ/7ŸñöÿÁrþA; ÂûEK”Þ^køï{¾ªö®F¿ëà›á€-r=è;-ú/PìNË¥šÛóŸðO|Ìá,ÚîŸù­NÃù¶ø™Z·Xù«˜û +ÿ…m(ͬíނ ©Ì7q„,3"-·´HÒâLmn3³x4yk&ìÓOîüi0üy€ßà ½}¯ÿv<î?:ú¬uç[3p\ݹgÎâׅotç`xq94 ôa¯o†ŒÏœwzƒ–mbÁÖÓtǵùú;ß÷Æ=s\"Ò +$G“N÷U#$ûq¯[Â0¾*š àøSÿéÈ= +XcáÐa8y^t‡æH<Å_mCGV( …wîg­»­O?iݎp¡dp·…/où uçYg4©åÁpp:íMê p9*{#Š/¥—¾^ƒ§§¶²8’8Pì©_hŸÍ¯úÖ_Y[;O›ý¤Ày§ÐÞ „ÎPIû©uÙÈþ MghïûԀòWE.8ғLbršAäù 4³7ä¦FuGÓ¼QÎñöÜ,—ŒeMmôëÑh9Áöû…9ÈÞÅî ¾5ö^4¦€bé Ì3ÞÝ)tÆþˆ(*X&j/›À-ßKOfg؞¤Ž{>=;“Ïp^¢¸ý¸ßŸ¢~5µ‹7Pcɞnpk +‘шƒÉtôº»ç½âĺ_¶ a÷œ¯Ì;î¼èMÖäᷟN'c£²Eb÷{ãË~ç­ýúÙgô~ëÛ,Ýl§j³£ÍÝ]ætû üÊxþ"ëÚÇ?ö¶amëS-¦¸Œ«£ÞÅe?VNØÈ2 ‰¿r–FêÙÚëï™Ù…“ZÝS׸{hߝô»“~wÒïNú÷©Ý}ÀÈ«°f1ýÁ±ê£ã9àm GÃëßËÑñ ûª´:'#ƒ¸Ä'ÅòÉam&·.ÃÖmˆŽŸŽ—l†­òÆÚ*߅b;ëYm–”m†\½ÛÛ¸‡QÄJ„†H?󁫭äôì,JzÌþ½ös{pÆ7½.?5±%èMÝI»Ó»¬>5€œ”¢õ§Î`RÔ?3!õWetf>_ufÞ\^–ïxَ—m¥#=cdP4(ÆÖòŸ—_b™È£§'n–ï—­™ŒâÖ*Z߉S.áò&ü±Î¢ºóݠמ BLŸ7¨6¹¤â_Â%Ëqß7—þ“YâVO‹'ryjæ'¡úqB^~úšhî2¦­z\¡¡BÁåCFëÔy®4~P { +¦gÐG¹~öòe¨2­·?¢}Ñîw€ éÚç«øiÔt1}vÖ9mùàõ&AˆP¨®óqûhx6ž I$A.ú½‹ÏÜìã^úû`rÙ`ûì“Ïá[}˜¸}é.ò\²WEʳtwd¬sdpôk~”#c»š«bPÁœWU0O’å5Ìm=ïëœíÀgêËïÑÇ_Dî^Cêj²¶¶`þEöÞ§ÿƃŽºç…á,e:ÓþW1ˆDš ´ í,è+ì_ׂ/\ƒpاSøþ¨?üy•Ju4¼lwN‡?/V£ÊûèoBèF‰mD¶é¸xvt¸ßŸŽӛÜuò.¦ôq·ïT-¨IHÚîe§[6ñP_IÛ=é윳””:$¸ (n=xsÙ1Lu¿8ŽŠÖ÷F'=âœÏ׆'÷;/ÇÝs¨M·‹ÿÝñámæÃw}_Œ¸¼yš²àËNÏ24oâ{]Œ¬‰OySÈigôªÜè|8úå3‡¹^w<ê~V¼Á̝í˜û{bî5¼u`–ÏéO++æ´J¶Aœó÷âª2k-,ªƒ%H N£¤«+™>ëô ³í0žÔï÷í¿>ëŒÇÅèÂl±bðÓgHҕøô“gÝ**AjÒ?ÿ‹~n°¥€wüÜ1ÛØc®®äuûù£ýÖóáÄ¿"IÜ-Š¤ŠÉ¬Eªoþ¨èŸøö)×)$ƒŽþùßßR1Û›×ڌ+a“4ÂH၃·Ð~y%l F¾=Os›: ×e»ËêX¹ý“ÎK£|wü#,ÍÍpa¨:Ë5sp͙Ä"—Zº,›4ÐlFé6ÌÆa[¬_ÁE¾ykÿ+©ótj/D“\â+\퀡Ý9ÖÑÌ]IàÒ^ô€aØ¥ÃÌ µ}Å3ƒY¤ÑDjÓZध™¶ ÅIÂì2 `|á;[Fi`¾Ê“Jxܐ³’4ÅÎf*U.1y.üœ!Jè%3ÿœIŒÓRH¸¯¦E3a+ z)ðÇÔ¬Û<ÅØS&ÌN݄~ï¥ò€S*&\¯Ë2鐹\Àpy!a=2dHGæî4Î,ñ†N›u/lÈ}FåL5tt#É1ÓZ¨ õˆÙ$aWSžˆÌ.yåòº5QÑÐ-Q¹_E2çÐÉ4 Ô2eÖÈfpi\#pŸ$Ä鶹 å6hùpKM‡Rá¼dÌ`Ô2ìªT@[XÅ +R~°¿ÂŒÜæL)Í.)nkþ8\Ø9 ӑ†é0ÂÍ#„„뇁€X6×ìÄ$Uv¦Á¥+ñ¦[6ƗýTØ3ÚìEe»a–µÎì\0šU?L»Æ&!ý(‹peRb:XždØ7©´Bw3,Lm;ç3éÒùÎ¥°¡™ÒÑ5,dI»Š¡oœ‡í–i%NŠ§Ò›P#w7eÒDÝaº“eø¹ÙM– (‰H„Ì¥ÍÁ›;}•ïî|aJ‡é¥þ¥µÄJêòz3ƒf ⾔Š#RF P í a‘ÒžÀ-Œü#aý*Ž]1 …¹Ý–ÛUÌ9ËÀP!8À&W¹=‘ÀÆ5ý S+s¥°'†9ÀvKìÈmò_Ä«ˆº 7¿Ý41m&Ãv3¼ +0âè4Opm°Šã"ÉÓ£5Úfútâ× S™ACÏ#öÂÌ +´Ä”9·7Áfpad!:öHi{éÙ 'ZæI|€k¼e6‹Üi£„3Ä2e§€5U:BN gá¨äìO³É%GÆoNci}Mk&…ShÆiH ë9ÝQÍ°s‰Ó va›ábI3[é"µPd-VR˜ +ç'w°Ž¸©°Si¨…b€!¾Ý‚†ïåÈðýaG'€(v†Àa“œExá>3`"â5“‘!:s”KÄçy ›®|5ƒ7ƒã®NUDÒT[n˜á¥ì˜Óe…´„1̛ó¬ßgãHOpC •â& +|V0•c¤©ÌYf9¾0箩<Ë1š† +pKˀ` Q8^RØê O¬ŒÌ)vwh™ æL&æ3ž.)ðÀpp :³Ý¹S:¸ð܊˜¥0Î^* ›ÇÃU˜í€ Jf÷²° +àÔr ÍÌ,]"QÅL™MB4è-™Í®à¸Q u”B‰Ã±nǚ‘9RX"K­-óÔæ0Kí.Õ ÷mjäIäaœzÌhÓ%..É"F dԴ՜û¥ø/Z$“Gb~µãgö²?ö.. ´e%×°ôðÓQ÷¼wZ5÷MÁ÷ÏÙÑм`T•k¸Ñ£aÿÔƖ¬Då›Zd‹ƒ×# ¤n[º§–ÕþŸ}ε¥ãñö£Qg:žLÏÀ"ÃZÏ^6TÌì9:&¹² !MSäðFóÊò ³ølpˆv¬âqzX|Vu$i¤¹´¬NØ(¤–t"‹…øDܳWµÍ]\Cz§Oí­î”ëYî ÇÕ«Ã6ã†(\h\[±T§Nx¤´ÑHÌ%údyXr,šË'×£ÎÂLi* ¡­™f*%æiKE%é,·ŽGÐÚïO‹Ößnë/2ñ…Òß>sö¶7¦Kúd`SPd!£Eox:ê ^Âã†:€ ©~GU3û–gûÁÞ譊ͮL:ì'eÛ뼧`y0ħU•yæ’i> ù‡ŸÆ·2ÍÛPmÖ¼Š%ñ¥ñ€ê_lï;ýÉYÿŸÿÛ ãxøÚÞø¢srX˜Şù Å›ÉI1‚NLJ¯¦c>^~wY\/§ÃŸ°_@LÎYÑ?=:ö + Ö^éá§ôlg2½cSzúa¯Äz~„„:ššæw}×ioòª3šà^zƒWéÙøg°AbŸ±½÷Ž^<€o™¶v^G=3­óÞà—éÙ?ÿÛµ¼?šB•ÙÏænitäZBz·xî»S3ËÓÿ^pI°ÐÃיË.ïüøäðÛái±àç»­Ûo.úÓ`Ï,¸Qïd:ñ—OÞ¹7u>*š÷ô–¨|”Y fîÓ¤ŸáŸI¸JóöoããםÑønTã=nûºc˜5†Æ B˜kçz3.ÝxRô§fج¥ IŠÉ·H“䊛q-;u½4ÐþÐlïÓZƒ¤¦ïsQ¼;!ØrBԛëÜc[kgԙÝ+ŸüæLáË×õÙ´½‹ÆÙ5 +ñðâ°¿ºD¿wÀ³ g¨a4õWêÇØ7GpÊõêÏvmåñÙÏ×`}o'Ã=ç[3÷2ñqR Güsï29kL¹ky-·LeÛü?[9<£G¾<¯Å]|Ók1@•®ڛzõš hOf«gëm­!½½&Còñ„ Çs2œÑâ°8›<õŒ&[kxó])ÙãÑp:êû©|=Äsº]‹~\“Ω‘¯ÞCgòwî̯N‘¤Öš‹Z#ȟûý¢8…µø}„œFÃË{£¢c£á«NüÙ=©Á÷ÿ þgÃÞ`‚ºý|Ú/F¥ҙ1û EúšÁýkžœ} ®½ŸÍúŽ4iFcyvï9qWÆ[{ðOèÅó¢ÿbøÜvÀöèÙp܃ÎãÏÜw*©ÿ›eÇ÷F““agtz¿8ëLû±ÂÖµABUg))üqÙ9= $³/ºÀêòeØør8™…uú=â!š¸Ýée¯MÇ,…P]”²íßãÖ½édØzÞOŠQï—bë½ÇŒµhEµ^ ŒÚ?œNZ/GÃéåò¶½ñ°ß™­ö¥|ýRë¼uÙ¹,F­qïbÚ¹ïaÿB“Ž£`Ët|H=çQƒÉ¨3_v̆ë¾5ýê|~ŠKž-ÄÖâ¦wÓÚm_Ž +¿«W6yëHªl’EMY܇•mã>¬lúÀR‘ ߔŒ®ÁëÎø(‹•¦òÙ¨£×E ,Û­§½Iç¤×ïMh!ߞ߫øœ·éåkzÙzØGg€™hD8iÅ:„ÿÞãs¿qE´žfM£Å!’Ò#O§“K³ W<$ʙïàagðrÚyY´ž /ýªöñúúÓNÿyq9íÂ2W}1¼œaªÑÏA¦åýêÞãg‘-ð0þáÜðÁg£áY¯_ü©x;;!¥¶]dHYîÎ<Ê'ÅiM”Ïî?¬†|¥)Ž÷vÒ:ó3ix@¿7(Z³2*ÖNUÓ1fç¶8ãÇG†Àš}2<õjÊ4ñ¬g¦ƒ—žLÌ?~ØG¢ÀÃ2šmûÇ¡YÃÁc@e ›ÃùøàÍ$ŸbaӃ¢ßöΤ¸JX™Z†õÀdsÇw%èîÙ‹‡má6lÊŸv`F[‡Åk×±]J€§—nXÀfL4~^œÎ,ÂÙV†G„EÂæąÙæGÝN¿êJ£EÕLz-3¬ÎØS?Ïؒ^î‡íÇS_Ü´´°´{©w+f¨DKÁuª—­ê@͕M£!ePù ã¢pAé¼Æ‚‚)Öï +sÆ«j½}{Ì8óÖä¬>R¹â×x.ÒEN‹7{£ñª.Î>sTt‡ZG:Wf« –Ö§ °ô÷ÏRmp‰Wáp²Ã 7>7Ë+¦oý-8°#vžç°Ôšç€¥æD‡ªg Øj2`š£dbt¿$YÁUMÃUTIN¤Ê’\t4=1ìÃá`2~œ³BŽš‘wºýÞ¥‘ÀÁCóÆHà/Íf÷zYÖKŒPxÝ{mzläv#mFÌvÑk.I8‡øK¶ðoѬæê²Æ€wZ\~‘ϯ­»ðpHá}s‰¥A&<4ä Åùñ}bµ}Rœö¦‘lÿSÄwAŽlmv™²Q&@õ)âHA?é`>Ü|>/Íç\Û§NÖ=*ɺɢf/‚ô/ lcš;ßÛ5±?»&JmŸÎ.ÕÄb­ώP Z¯"—ÅY“^¶ñj‚•Û- ˜mT“dã,ÍXl˜ þjõ¸ŸÁä-c+–r õ`á½ó÷áIûÒ(š–7Ó±¹vðêN¿¿¢ÙøUïòÄ ôÕ 7žm7* 0g]­hÚöûMW(ù³Ý¡É°è™Èñèl@ño†'gÃV$±¬¢xDÜû¡8¹ó}ï´Þy24çÎOËGÃ-uÙÐ8×ýñ¤ß>µ¶>…'ä +ÁsîÈR[ç¡ËÓ ósP¿_—§õÑÛ`‰ðHÕz¸¼¹vK:\HˆÏUÛםm;3ÉÚÙ¢†%/^ÞÖ 1ö.̦j÷ÍQD:G;_Ñx2ô†žL­D=Š:’%ª\zÕí­ß‡¦âþtÔ=o½½Ãi ¥zƒ–¿X6C€lPâÆó/ìΒsq«-— Æ…%èfÛÍ- +l†¶Ùìæ´÷^bó/_Æ;Nœ³j)Nl‰v¯: ;ã“Þä¢sYŸã•'f~ìýQû"˜²51Z”Acþ²AS^ß%^¯yeóÑi{8‚â~1Mµ<3§µ/³‚VÏÊf—βtaà‹_¶—/F׈ÂÆ"¹{¶Ùì@Ûʆ¯WŒtܽìwß.ac¶Qw0§Î6š]&ög,¥™²~ç²9\Ãe¸|yñª] @‹_Ê®¡ÙØVY¹–±½åïÑf©óÙ(DϪX"´5„·FUÝù°G¬jÔ /Wµ9«gdˆUí@C>µb¯Ø÷‚ú¤3/›Ò0 Ã#ãC©FëI<®UãC©ú<‚æPÙe<ӓ­COj4Ž{Rµ³Î“öiG´.GgÃÁRvíÆF+÷úªÙ›ákw¥Ð2nŸô@š\6éãö xى<â Zu:dæšsi°[ŸuÑC¬æ|¦áø¼cÄùbµ U1³¯ç¹ÑgZÎ4ÓU§Á›ËvÙ@Ý«j6ÍzáÐÛWÕôå\Ó ݑYv;-ihN+šö{˸‰iކNYï]ÐrxÙ]Æq°ÅxÙôc‹ÓiÐã{ÃeGEëÞô¬ÿÏÿg<¼\¡Ï +Ä£©k&Øìl:è.[5¶‘3#ø•³âÁ‡:ƒb¨V—±ÙJí£{ËZ·†Fw=m=|úèù=‘·þvûñÑÓã©Ô{üKž$Rå–êƒF*ŒeÇ*qÔ4….²V7"+]÷âí2 =j9œœ¯ÔЭ¸ZµgV%Ťg/µ¯d£%ôÓqqØEŸBµbžŒUûØ,¤‚sþYïMÑVŒ  +^Ì@È÷om_¨’5ɳñK#ìS‡`Lº7²OaxÃÜSåwY£Qã—ÙÇj¼­y€Bd$;ê¼.ží»wÙ/îÍVVÚMþ¿ÿûý¿ÿ×ò-ѼêÍ©Ûþ±dmºvÝÈ}MÓÿxðªY‚ñ¼»:‡Ïî?ÜûÞ蝓ÄÊáåĚ ˶Ýo†'­§ö§ØJ‰U"khÜ,rÎßÙïî<~œ©ûŒ•ÿöô7ýü÷?|õÛ»¿øFüæéÞþ×£Gç_¾üë7ÿõ‹Û¿=èuÚã_§ßýñAú«/¿þîÑžÈûòðo¿}òõhÚÕð'Ù-&寒d|ÿï÷_~‘üúë»ÿÑþÝ׿ÿârüõøOüŽyÍ×wÿuD­¾™ì¿üã¿~ý{Yô¾úC÷~»ýۗsï:<ý³y¡¾ÿð֗ú/&÷ÿþÓ¾üËÞ÷.†‡c3ï“óÏÿþjúð¾üõûïÿöóšûgÉ7'•Ø~­ó3ýý¿ÿõo÷^´¿_üָݗ?}ýûWúúËqûâóû_ܚ>¼ýèô̼éõð?ŸNïŸýôƒÞïÝÿñ˳ýóÉÁ¹þ +Qä?s¿Ëÿñõïÿí·?XD¦ÓãƒÿxùCóé7ÿ¸ÿøôñ¿îïeÿõ½£½_ l'~ìœNÍkò¿ßþ¼û «þýöÁ¹<¾ûû{·Äo>ßÿö‹ÿüüëƒß~÷ð ˜þîßó«ó»Ýnç|ê}þàìðܾš%w:zÔûõ~ÙûoN÷û·þí·{£Ïÿ6½wxô›À>ûúî7ç¼&½ûýO_ßt{ñùWOîÞÑûª§õñ™¸7ê>fŸ¿ú’y”Ýûߌ¿7”Ó¿-ô"9ý²wp§c&™=ùêöÞÅ~_?»°cøóá­¯ÿþW?<ø"WPáñþ㿦¿úƒ>þÇç¿ÿþô¯_ò“_ý„xÿ0¸e†ô‡ôw¿‚iùkúCúï Õö_}–î¹úýéaÂ~úՓûw:¿ÿÍÿ_Û{m§Ó#¢÷ßZ¼ƒ1˜šM¦ÉÆ$›`“ Æ69íÙ³/öӜg8WçîÿbGR'uÓøÖÌüÓM•T*•*ªH½½€h‚ðÁAA¯4Äô±äGØdœþÏW¨÷³Žü˜‚æíyK€ƒ»„=‘È;¼¹äâ™ôþÍþ^†h5ÙxõL€AÞʔÙ!|rCðXž›ð­¹}Ðgr#DîÜü˜ôûÁ¿¯t;÷gÏ}»+ûüdb6f‚ÓN#òúÔí¤ëÙÌkî»õ»Oí?£ €&ãïµGAûÁY??òØß2þnºNæþÞGÙß¿ ;ö½~ZÙo›Ð01…š³-‡0ÜÚ¯+ézÕV!sÖY…¢Ckj @8í\ {òm²§¦”†'©Xûô˜n—OçËÉ ˆ‹Q‚YŒîAπjTÏÂZ¾?{ZxÇñdŽ ?R>ÄñqœÌ±9ì™md(\/>qñÅeƒbŸäÏñŒègƒ“ª\-¤Ge⛸}“–ïŠ+MÄÛ}¯Õ8ŒS#áS$xnFæ¤Å´³f‚ÍeÞ^u‘¿‚}ÐÛ"aÓÊÏ £¦ÀîZ›Àä Öìâ' ž:Ít¨ï}®ÃkqõÆþXÈ;ӈزD–óJ I·k3;6‰H.Sí-ÅƋ^ÅÞ+ôBß`ó佄·à¯]²Ï镴¾®bd.Ð÷Ú…1,Sç¦æõõMæsP&謿!ÙãòßkÎ=ÞÙ2§Ù:³Ú¼mÓퟮÀ¨ØY»¼cûâ%MÎÐ Ýüþ1ƒŸ}š2A{õ‡ÖÜ·¹ãÝþP"1ÿÖ-2`¨|¶}djñ܅ò~œ›úÞӝ§¯#ÿ=SºÙ¬Â+gI7î\€h¸¶e"žYZv¿d¼à±`¢¾ß´Mp²€³ÝbzÎ[ž÷ïÜÉ#x +Úr +-À筋Âc{¬tüòûËÈxΫAº5.g駑ô8/f]à•ñUSÆÓ?Ò­sÛÏ=E/C™¾Y§_QµdøFuÔãÉzv +U&¢¼ì$‰ŠeG‚f¢â™¥‰rï9B}¢X“MðiÂ<€Ÿàˆý}]>u ÏÀ°t؏¨?=“ó'DÃÁEh¨ŸÁÖÈ+ýç/‹^¡Ðüå˜Àèq ’·",1(ò±Á_sŒK¢Ñê¦4­êŒöõU†ñøC¤Y@íØèáà4¿ 85:À ÕÁ÷+÷ +Zv͹ÙÜÄú“¡µ,áö èÀ²öÊùB£ñê 44ˆ³ÓÀnßpcCÜÂB£)ͧ¦7RGÄ̺þÌû–¢03VV „¢{”“ü}‹q û38ÄêìÐâö-…FìUœ´<ºŠ}'`|0Øê<7f–tI–=Uo#k#š@jb/£Ù€ÍË2´Ø(•˜—CÃÉNì2¢Cƒ(Íp+Xо®iK·ß*2ež·}ñíÅÏ¥HzNåE•×zQRosýói4̨N#@ô¤Ü2õnè,²¿ÃQ*ÿµÜ›¨3Ó]§Wi3 +×qìï2f”-·pZ“”®ùZ²~p‡)ÏÎ# ©7³%’ý97û¹JeŸÁ§”ÍÓÍM®žj S`Œ­=hìÈd‰¾«QÜ9&·Ü ÔS÷£u à·]þËÑvg‚¯3Y=™é"7·å‹˜*×.Ÿ#aZëû×±éâ °‹¡aY‘Ûo1@×~æܺk͏4˜>gA‹@³Q¤Ý"B +”V£H³EµN8?Ê`çYÞÃ%g…W®C‘^‡ÎӒVǺå Ҝù¤¢Añ­J¼¿A#°f§ý  2â3®ø J&h¬ÓL#5°eOŸ'¤‚å‚'$B*ÜBܟV\¹Ò_h" Mÿô¦úmUm§ë +`{°M…ƒ‘²e(’&‚A» +™Up1Øœr‹ u^Ï–Os°ÏqèVùŸ§Âîq‰Øcþ>ܪ„m7#¬éÖ*e¿]ìÏW3Y÷¦:úm&·ms@¯¥_Áéàí/ ٟ} z4bXàÓ&ìªd–5;°~^¿ýÌl A£Ðf–Þg=÷Œe{":[¯¸Tež…̐ñü‡‹Ýn!røi3ùÍyì}Š¬Ãs9Œî@}U˙ÆkêÕkí­_衞{OéÆKë šú̃÷?Í[Zž§¯DuçZŽõùA5@#†ývÔ [’©Ã᧝ÑÚ{aˆÉØ–Yâ;’-aÀë»L1ã?g£sÔóÖa0LGb'û íß»~Óàiޑ:<–‹¤Íêð4@t½ÃÊ1ۀãªI’#«þNחŠO‡›Ô{ÃnŠþØ[¿à@Œü!vÇdõ… ¥è̕¶±€ih)­Ï'¨Wٝ̃VüP³½Á´‰>yÛҗ;ÙÇù?¹,¶±‘Àm ¬Ðíwö÷øÌ};@Ëï³Ï¥ªÂˀÁmèÁaÎlcŸ§­¬Ð+QOXÿBZ{¯§t¥ç™±ú¹ò2ËÍÖŖÇÜ·9Iä²EERçVŸpQŽêÌzDçcӜ&Uñ՝Y¹š·µát‘èK'ü™ Ÿ”3e¡Oí3C {„ý°ÜdpÐøˆ)Á3h‘Ÿºû¿|ÍÉïrÐGxu¸ª¶kq‡9@ýŠûòóü°>%eÏ·5ÿe'>Ò~K¤¤á{˜Òhü>C*žì˜r¥õï xëºÒ Ûë"ÝlÛÉÂSá3”Yzf¤½ÀíI)0ÔóìΕUÔ@šè- «ã-±á‡Û&c‹L½Ü7 Yf6:re‹Õ©<´n±xZÂ}ó{Œ<ƾ­\m¢±úÁ±Ú<æí¶à7~ÞÁõڍ2ÃԛñtbQWÁ2/ôÁS•lfm—“{@±€YO”…8 ƒ=r‘¿¸ö÷ýý57j@×s¤É\¯h›`=ö¹|p¯0‡4ï­7[èå+VŠÍ‡Ö%òçE_±ß¼cÛ÷1ð¤[ò³°>ÙÌð½?JØð‰R9 Gp¶Ô~($ì²/Ù·$«ðѼDÅTúP©÷M°Ò©=¦6ÒlA¸…ßw((#PnéupZ ŸÉ}1ž[Uœ‚L¯åРÏ}·ÆÛìï£1øÛ_Oo¥­È’º)Æ«o¿v‘Ú·Û÷M=š¯¤b™®–Óc‹[Rgä %t*úœ½ä¾#cw¾??™$üÌm  {éíOÝ&ਠ0naôÍ7|0¬d c£ÄsÐ'Æ%‘e:ßN‡"M¤OŽrߍc…ô`‹èX˦?d6µhÏžR:â^¦oѯ¤m©·viBÆs'l8@.SÑ÷ù"ÞF˜‹”‡&ïµÚВ^zýLWr®”þǍB‰Vµµ=*Sû~¬Ç.’гuþC À#¦ÔÛwûŒOË眫9s¦¢/KLsÿ´ƒä&K‡„Ø}»O{«™58 y€Î¼rÿ̇c†Ü´BOS¤X?çŠÃã1瘒ù¸ÕøÔÙÛgÖõDà’iàD[ö3˘Ç$žÿ (pm7:oÚ`ßkl+–ŽŸã©¯¤†á)÷½=¸Dø6Îхºdö;é»ÜFŸ!è.C4Põ"Ý¿_ÂXþä +‰§9Ð;"AÊ#üõÖ?²pc¤¥4{‡è”ÝÜ<>„†ÄÙ.˜>›Åbï@S*ü¡}ãÉø€5ž\¦â‰ߔŒv>ÍÜ âèè>pVPdx„hÐ+hœCÒۆœ&vH=’ÕMþ+°¨.«½ÌéP«F‚u车·éï ñÑÒWÂdK T‹hÍî¤Ûm“^Ֆ•ã~€†·ØxqÛ¹½IÞ$Ù¬5&ò_½C —*îöÌˎ-Ôõ‚Cz© +k"•Ãþ\îsVݽªägfJ‘¥AZƒ0ⲝ¡èhFßñ;WÜWQ+Z‰Ìjµ í|þ9Žâžëßi~JÄ͸’Mƒ RÒ«ÉÆJ 0ˆD¤›Ûê)ç¨ïgŒµ<³#ç΄Ɣÿz ~BNk­ô2nLh_lV‘9û^›LÀÀÿ òU$VPò;ïcÚ¾aØ{Þ^7Û ‡N±s„y/Qû±b¨I—,ê÷T|EZ)†ft!´–Ì{yŸ}ÉGÆÔ“8ö#œ¬DSz¶4¬=h¾@¯ºû׍Óê.ó9Z¹ƒ@`W©Pw‘O‡ Ç Ð;IKÙù–õtÖÇØçàcÜqþø…R ±·å™dۓqò‹fJVV±bŠ‘P´L;Ò6Ç«Éþœ +=æP’Ég6ԚmㅝqèäL€&:›}µ£Þ‰í5³rzڅn¿»ksÊpþ?ꕗáôLŽ?Ï?03Ȍ'çÆÑö_¬9qš :¼ó,}ÇY`3]YQÇ9ô®Ñ©ˆåƒð྽vx4ì=×8󟾧۝P‘²¤`d™ú«‚ɯßynNHéñ;8³vÄ1MÄ_v˜#Ñ+cŽ·s¶_÷WÜÑ«dÒaG ®ˆéW âꠀúÌѪ_èX™¯t½R„ñÜEÃËSãœóAlò¾ý˹ó@5‹lóÃ.r?ñã쉼?vêƒ?ZØTÉIà¤õÛ濂Ö@¦fµþ†6¥†]àæ,‚Ðj¤pµ±Ÿwö‹ŒÿÝçÄXàwèX¤Û¹£-¸¯L’ÏÀ‚¶ë+îá#d¡ØžcÓèò9÷ùÛ3 v£mO 2ÿÁ´–‚ákdR3g®´Ê¾ ÔÂÛø0–J&œ~í;¶Üüº.&~¡™ÈOÛù'&y¨ûPŸ(ΐ§›q¦ô#Èý‚rŠ8ÙÏøÓò“ñŸ#½Iê_ɱåÓ 7ÅG®¬ÿ&°ÒÀGÃX©^l£ÝÎÌfNÒº#`8Zn”‰Tþ¬Ãåäg³‚Qçªl¨@ddÏ×ì°í°—ÚÇüW¢ uL;c¤“#‹÷X:ô]Ãtûçë‡ø\b ?a/‡nÜSYîYZ­Î¨pc{pâýµ–zŠfÍœÅ×9bï̓I…Ó€ï2ƒIdÀ¶¿kx ž\æ>óîëd1/ñ +Y†Û–/"ὛÁó{åFќ/ðKнÊÜN•>ÈV¾ðÆÑÄ*H,¹ßùñáø»™=Ì~ai8EÖùïæxšƒEß,曇éüwýÐÚ¡Ë›ðp~xÀYðÒ^tDù¥¹í%Ôº`íÿÌ73¢€ÇùCíxÏÙ§œãîþؒäwƒ#y|†¾ƒè×ÕÉ·çÓîÛ¯¬×ÿ¿þ?®‡Œë¡´É¡"G0jØ-µÖXÿÏÿ »œl(ð`T‹ÿùÿV§ßŜ%ÐñÿügþµD/PC9o¦óådƒnØ;¹äžaM€þëð»S¨¯`V„œOïó)¼üGÅrS[䗭@—{—-ºW1 +t!X†Wl%¹õڇÉnÇ]v'þ¦Q‚NOW1Xæú;lÁáx€ÈÙɎº ½¯‚a@Õ¶›íìf3Ïmÿ³¡®o¿H-·ÑvSˆ$¨[òàB›}#¯ÛÕ¯lM$o1¸±W~Ùûp¤*ÿ„¢î/@V¨á:»ÝÌðâS¹yF D_q…ÍM%Bìç/ªKõ™7©JÂÿ¾ÈWßp셮€´Án“ø…ìÝgA,…Ãä¿ØuØÂÉ-w"Ò¦ýs^O7“ß•šƒŠ¾L¤ÝÇ©bëvŽsD‰6^Të (Í ¼>Ç/®”Ý~Ü%>è5(DÙ]¬Ú?øD.PTÚÓ"w)ÊÏmF4í¨ 9À õJˆ 1P‚7¤§[¶6R´œˆ•ü辈@ üg xžÕRÔÈàô×a;œÀ ;g¿*+Îüò3å¯þÅD%†“¾|ñ*5o–˜% çœ~¿ي2‰¡«¼¿J¼~SœjǛ"G‹¯Ô5%‰/·B׉_<Ëÿ¥ºKhý²”€Üw·¢Òú I«^ÂÓOŽaÅTü”¨@$Èà ©¬îÞ^%}§–Q*sÔt§­Øòж´ùʤp}€- Þ¡x4ËÚ¨¨h‚ºÀÝdÃÖ¸³å€7~þlÿSüÅKï%ÞÛ°7 ÄD í·(hâ©Ju÷ƒ¥ÌCÝ?ˆÜøWâÕwöD`²'ߦnÂm¯9íɟ“~òú㍨}Ð`?¡1_²}Êä¾#…eÑÐ|žÀ8[‚}êµ?7ƒ?z«¯ø¬wºÍ0ÝZoO,ãzëK?¢wüü‚gão—Þ~Ž¶ôŽZ7§w5/á~îYþ€>kmøÞc Œ.·ô'ëã„/ö…ƒýຏ²N›†{JGsX©r8$ž§iÇªDŽ‰p1þî"·}ÿ[þðÑ'r}²×&ŸÓÏ_[:´¡ÑøŒ {Öik„Õ Ô„©)¹|ÕÌN½|«z<bÇ6Àâ(n‹š7¶c˜<½y‡Û¥‰˜™<uƒ{ø$Žq<|¶' +zš:µ6¹¥Ë} üá}ìüYXŸ÷r|¬‡ÏÚGCk!4 DKC—(Ö¡ñú8ˆ9¬ÁßJáIk\o9=Oq¬¯žÿ£7jã°Â+ñÑì¨9%°~,s//ŽÕoý°Ç½ ñ¹>’C˜beèìVU±éd¦’’À47ë³Öސ ¿_ZVªZeôq“§Î‰*Dl½\ZKÏ7Xy¬«{ÁPU"Cc}5›XõhÇaÅšB<:|þlÚXS“`ˆ4zD±“ã¦V˜ÏiôYbâӍë?†ŸySk#kMìëªV{lMpXáÚðʖì§êâXý½AFˆQ¬ä"dl®½u1¬(6ðùIJL7hxZnjY)¬¢à¿‰c-ióÜê!¬È'ƒ#Icí9-"'_üÏ4…óK’‡µ'ª!§bµ °4ÇÇâ|lNœ^€8´²quПH` BË9”š#j¶ÏŠ8M0ÝÒ>šú;¼4E±¶bfŸ$Öʼå#Ä°¢ƒÀ?p­‘õQlºÇÇJqþ2è[-¢Xß̛…$ÖÖOc?E±~֗%„7—Óýëf¤֏0ñy\9ű¾üíÖõHØ'À +Ñ Ä£’s#IäÃSË®—ÀÚëùßuYkøÅù¨O}:QyÏÌÝ 7ÏyÑX§>«`óXûՉ aõš–"®Ubl‹¦!V‡¢ˆÜ¿=s<„X[Ó3õ”´ æªÿ˜ ¬ÖLÏSâ EÇáØIè!€Øu)¡JN4]€5{º‹ÅÇ …5é©8Bѱó¿P'ÏÍVV„†Fl<&Ó ÄJ°éù–aã²^€õø‹Ò'O2Úp (ü¸Û”fÚùdä«Ø1 ·Qɧ½†gý&õô‡(ŽŸÎÜÓ˃âœIâç`Lö,3°¿yHð4öŒÚôÓã2|¹=ƒ›ŸÇ®Ø ”„|-E?$Ÿ†½¶æXúéÏdhæˆvùBÚkêI>­Ú7I¯ôÓiý;Æ=-h¨?~M‹?MÅxçH=ý6ï#‚ßv쿌ÚúíyŒ^­3-·6b/P/g_$Ÿ¾?MÝz駹è3K4‘ÆOÐQòéßéuW”|º|ófÜÓK¢­—db(õs0¦F, ù´ìõ'º2D{úÚL[U©Ÿ›ô¦Ò‡Mòi>]›Î%Ÿ–½ÉG ÑÒz¯Ñ•x(ùg3ë¨%&xjo7ŽIúiÖ¿ØžÅö¸`Ks/ø~G“o£e‰™y¥EÑøiŸîh“•()”Ù_¨O|™æ=¡šÕ;ˑ°BÿÚðüŽÔ;rÍ,üç™x¬}GI ᤙa¤àáÑk~~uÒÒØA|=-að™Á/Ëk´G )„í w-¼1c·{röÑ~ÇY„÷ïóÔ +Õcþp»œ<Ù{€¹Obd +I`  4Çêïõ%±‚3åÏ#ÔÓðé"SH+<¿¤°Îp¬þ´¤1Äá—L Ã:3™ Vd°X} +CۀkaÅÃjíQ&.Ž˜Gäg¯$VdH`&#° †V8Þt?%±"ýÒX¡m ‰ æÁøtãz—ÖªY+R48¬H +ðCE£Í[Úy„Á>ыaÍögk5ï Ïë O +H¼4ì‡ùn]ñ½ÀÍ}´ÜȀY¤Ñy±‰Ç–5$Psæ$Èó–3¦VJ°÷a¦¦ƒû'±³ÌÚ´MÅíHì¬ñ ҂`$"EãG"R䀛ä!j'¦hü‰üý£¶¥1 í˜ÁÀi`D`~Ï;ê-³ +ÈÀŒûgž{bÿiâÚ4íc«³/ç š>áq9Éx À ;¯àÔuÏ6†@”VO gl¯&> Y1Q<=¡ [¾ Ì(±a-#%Á°ð1ÎfÀÁ5‡×œ$0¿›Àˆ¨Eçç9SQ"<ü‡>eô‹ÌЬ—œ!\v’èÉedÖ°õ¨¼†v†6†ÓÄ& õڎ ½Ô¯áq)mx¨¤— 4-óGJ‚Òý£†ízŜšø‹c.þ!MñWác¯ú¢¤*OŸa蛩ïÍô#eyÒ#¢IЋ/…¬—Rh˜çK!Ÿ¤B2MvEò¥NCvÐ<š()$N¾ai64‘%FäÈ;¨hòy6âäë9õ’B\r{"žèäzÚ'Ç;ÖÐü|É·vM‰Ü…Š‰EˆŽ$g̋w¬a󚿺L4 \ÈÔ<@ó¶Õ4%Qa8X|]Œ¾ì~ÄÙ}l5ÑusKåØy&Fs ‚Ž\IBúàþÙڟöÁy€Ä¡yÔB…H‡‰l—pBªÝ€ò»žž“ÇîYvA GÇã€ÿ ìXˆã‚7€˜´ä+bK +‰†¯*ü¬*çÁ¾d0CV$^2H½ÁŽ 5›SAtl‰Âô(5Í1?uÜÚÙå²`FaÍ~¹,³‚’v¦V +-ÃÐ-yR©Ð&¹—Ž38ISÐðаÈH–¢v¥JT +Ì +|©-B¯Ú–;‹eÆtJ–¥OÏz“‘]ŒIZÑc–:=U,cÄ(¯m(Z¼eÜ<ÉjÖ°ðºæ@Ñ }´ÖFÅÀàöTÀh,¦¡õä-Óĵ½Û‰6:ܓh|é¦q`;Ïf:\X·§ÄñJ͙¿#*ŠŒRº®è™íÍtôJ2 Ӿŷç)ùx¿í™éîÚÌi*²{±šEq©rÔA»võMjmNë(qdOjEƒ¸ÆXˆñ}£¼T‰£¼( ÃЗƒQªF"Ô:¯#‹‚ÀFB[Òv‰3kQ„>ïӝŠmò󗸬!ïçqêÂ\áàS ò~^ ÷Põrš¨$‘Ø(%y]„Ú7ª‡e¸RD'Ü{Ÿ§'ù“Z­((q¢@µ_@z†fT§½êŠ„ç)ʞ¡šyÿJ04ø~Öʝ<ùÏc“ül;QËHÂt[àǧ–K™ —½ÔovI³ˆ2£½4nv½Ø͎~á3F–nþN/£Ùð7»¨q®ì‹Ìû¨Ò™"çt( ¹ÂáÈ9r…Δu™¯ßK˜Îʎ\09lC1, Ù£R†™5µŽΌ¦|æŸÔW8B3ì½hJTÌŒ©_/Á)+á$¢õ4)¿Þº ãĽ›œD0*¼ƒ¡ áہ +ªchLˆò\;žš: ÕlÀ ÒþGFB«Ð´!¥+B5[ ùh= èI~Dj¾d'd°n­i:+-ùÊ}mXå'§Ìîî4äΛ+ÜØ»Šð ”š“âxÀAücðQì<„zڕ´)ø÷»G¥Ô\@ Áɧt.áj.=ìðƒñ.3žç¾SÃ’»gè,‘K›·ürÖݖØñ'¯ªehR^Z1-mxHyi!4 »PÜ › ¹9āVNþ ä"…Š€øƦ¶á0v +Э[‘‚ÂZœVBk¤ý äü"ÐxFmÇ*?Êh¦T‡…¯ŒfQFì]ÂY”æÊÆoäö£ŠãBóº´G +%4 ˜4jSEML1îùǚPº—Ö év\ +À*¤›¸3% h“Úß*Ý:œtcM\-ú½š²tãü +1(ízéÆmÏÂÛöÒ ¬œ˜tÓ. íÒíÒËAº]ºA(wˆâ"@2á$GÆÂFÜ˜fÃó„á§ÒÛVÎÎÆ#âŠ‹ßÑäu£è«¿»5”Ëž7ßæ½´HR©±eÁŽ¯ŸÄv5í¼×&t´7½&‰ #RB÷ʄ +þ®~C7ß`¿Fm+'H˜’6ʀÔ)þ’P(Ÿ t{V‚"av ùʀø1|•ni±P‚v'7u8‚¢Kç#øÚy‹ö±êä±y¼Ý(쾫u~á^Éóñ]“ö¯à¹…Ðn×þ?öb‡£æc ®œv˜È±Ý¢ýcPØÃñ†c ÑþÅ p&® µç£üáH ›ýÍç#ïp CÎðõ]R (ÍòbNO^j—Ú!©Œ2˂SÓ¡&„×íÞâäÆ´[÷960‘M®Ý-C4Uš0³š”ÉÔ¥jÇ˄a³€¤o¸:xMƞ`L’lAe )î3áI•u9/Ž©¬Ë­ÎöTqRy3ݙd tjœ”_ŒÍ«Žš*6ÙôxÇÔ^M2öù†Ôæñh>c¬R½‹3-¤MïHt„«9r©óÜRÐ$¶}O6ӗb Ý?Œï_Õ°T²ÅÅ&cijs\"Pۈô: º½ãBïÜ4FzÇÛ0¯w¦}CXÁ—«åÓQÍÜ^·k—µ|:AÑÒÕå|òµ|”„¾C9Ÿ$VT˧“,]ÔXÎ'_˧ÃKo)瓯å㫃7”óÉ×òéx¥‹7”óÉ×òédJ5•óÉ×òéPéâÊùäßÓÑUß7—ó]ì`^-gxÜXÎ'_ËGéiÊå|¼h™J·W3)¦‰ËdÞK# ’hTŒIÜAœSη©+Ú"…–ôՉ·9¡b,âDPí äø€¶åÃ#…9aÈÕ¤ŠÙxL+¨^eÏ}‹š¢´ùßüMÉß"ˆÊA“ÏòR7CÊ;¨Tħz†G—ȾQOx·ö1‰VEÀaÉ;ºäÆ$V¼‡f£©~O•ØÉ òK°¬!me\'Mù%t~šhŠ‰vw³”¯™ºØìf÷VÏiŸk­)•Ýñ.µº)† «§™*»“ +ûÌ(¥²;i#V>Z‹Î¼lŠ Ï~U²Rò‚: +¯€Y4~‚—ç2â3õî 1Õɯ ©É2¦¶§”q<õI§jj*zÕ¡*¼šÊHe —X`œÓÓ.}mJ¾Æex'ð¨€ßvDt¯ z$Õ1Éb4\Ö£)ªcªk +ϊ™÷j +§Šõ7žKºFNºG^Íɼ7?ÿ¤†•«•^CåÌ{Õi ³ßë)º†:µ5…áƒRMŽGRâ!´»Õ¬¸¸‰daŒhʌ¯h|·ì­DS,\U?MNº]G4¾¿Ø›éöœü$ª¢ _'RP¦Nͽp_ÚaìžoJø:åK÷0$,‡´Œ±wèÿŒe÷yQ…=È… +öࢨÚ”p‘ y ¥{\ÀZëØë?ÔUí]µJ#BÅyÃ(:âÛÛ){#tÿÈú²ayœ„wÁýrÕz‚ÜAŠÈé3`Jò÷³0k£NÌ/J,¹“ +ªã)†þ+ió‰ØR´¥P«w!€¤Ë²N¢ü5zZIíÞç6¾´žöWÒæ ’®ø»HNºšT? +. zßXTðFï oL<ûË«ÅS"3&þ®Vq¬ÉÊ¯vL +)ñÊåyrcº¸eÄ%ðSeQ÷ðޔ‘÷æÖ48 %Uxo˜H¡B1ê2Ýâ½ÁýåÛ½7€E.eDC=Ü5ÞÝEéâíÞX'ðÞ”[õµ‚~MÞñAYEºê X-6ž +†V—"›”|EºÂ)Ò2¹êji_²c7¨à|…ä®rŸÜ´6цù> 0¹¨E)ƒXM=ܕYó¼óV²Iû¢4”±]$CèDK•Jü4'èŠ$â?•9²%~X1«@åИvR‘½_ ÛƸÖ)›øzy¿*üNåÉÇÌF2éé>•yÍ=Òöä+ód¢¸÷¬ÌM»~]ß»2ï– •y²É°÷«ÌCîî·¢ŠÊ<.°¢œ„xCe?Պù‘ùޕy:á]ªTqÞ½+󰀤òav}e?è¥"¥óºÊ¼ kM*.kêîPø¼»¥^PüÔKI­SMêåÛVUꥢ8.}·ªY”s¡.áRC‘TRSÅ" …ÖÓ ;”]äFÈeÞ+K7Xç'í@»Ì¯ÖaÝ|$R¬Í{ÛEŠµy¯°‚Í(íê¾Ý²¹ú'Üýpë~Ðd¯Á•i’û±·S»åTuHsm6¥(»ÝéªcHÛ67q »ÔeæÜ*5E@Ò÷K]&•Ø}yß±âun|o¶ Š;¶:.]^° +NþF*E³›õÙ|{¯M;Áf-ukò5~hm¤¢¬Um‘ìäqªÆ· PvxŸ"ُýŠd! »ɺµÛ‹d!”»ÉB@ê.ºØÍ¢¹ƒh£H_«9ÉêdX€¿»7ïGAQž„L»wQUG ›+t¢<ñµ¹{QÞ ¾N>ÑäM|-¶ç Ey¸?ªËûWŠòÄÜÿBQž„?M¥דÓq¡ Ã«¾ú‘L‹Usû½@O˺ì&µydT@R…ãB“¾ŸO«fsq…²ÖȄ+•ï©ŒÉÝ< »Øˆ¡Q®º–ø}H^à#<+X—ªÈqÁídØJÏ!†^Ô4Qÿ)¬Þ&£œavΓcjH¶¯ù”ûd†ÙN†z¨Ýz®Ÿ?¤ÒÅ`»œÍ¸¾²ÙŒ»Û.´vÌùô´âšöOñ+ÂĪߐEJ ¤ àè+Îdü²»ØW½†;­1¬ÛS\¿ÕIûù{]¹²»™[+A¶3²Å~OõßÚD +ëXkÁÁ° ++¢ö#Ýù»?U¶i£ íÑ"Wvçq °êø} +ck©b¿ Á°ž?¤ÊîrÕok…b¿m»-‰ÕTÿ̤°Îú6ºÒXó/ƒ‚$…_l$…*·K ¶.=qô‰f÷¨Ê÷bbïÑîÞ«þª*~ë+õ}˜Vƒ"*ê kF%ÈóJxÆÊùœUä÷ò•[û†ž /ÊôjÚÞ§¸HE2¬ÐÁ"ÝÓk¯bLxlMfXJy°JÉ#´‰{Ïözb-Wt"7À¨ðEɵ×Óæ¶äTgb*gR7\jÈTê¬'Ÿ;¨ž«:ëIÎð"~“SÑhEí UtWPMx¥+ÂÛànhª§aßæÒý˜$SkÕvåSp_SØw¥ÏFkaŸ˜•À¸íîXاö>› ûļˆûæöÂ>±ª>ݵ…˜Ò…}bn|‰ÿ[ +ûx„¡7/)¼[aŸ(Âe&Wö]{Hk,ì‹óp§çÝ +ûĪúx~ûö‰Uõ©ÍÒPØ'æ¥gLÜ;ö‰­0å ¾kaŸ˜ÊÃËR½OaŸXUŸNâjý +û.ÇôcQ ®-ìS[Ñî[Ø'¶†b©V7ö A)w`¾ª°ORë¼oaŸ¢ÝRØ'ua¿SaßuDÓ\Ø'_éu·Â>‰ªï{ö‰€hî\Ø'lfÞß¡°OLPLÜ{ö)VîTا⼹GaŸ90Uý^…}Še÷)ì«êO)ÞÅFtr6"F´¿’¶;§¤{š]öð˜Qª«¯ö +۞GÿVJ帡‹ßŘN(Ltï.~2*‡:RìfM¤âèÄO¸„E¢ŠÚ†J>à•Fè$ʱ¥†%“Z¡ÀF£d†Åm]5&D40,M}ªåÆ$ž›!-ldH%Ó§ZB~¢co2%=å£Àdò#;…Žðò®<öX“íÿwsó?vG—J}ýšæ’†×ÿïÚÉ±×¾é¤ +ÊÔÕô©Ê¹Pȇæúÿݶ^…ÞN§¦ÍŽ¬SKUó?e'$¤ÍÍÍÿÍF¾ÿßÍÍÿtTžBÿ?uá§]åwtù’üBj¨ñ¨Ü-ýiWáÔq±tՓ{¶ªåRé0lÛ§˜á¨Ä¥° šØòÎ{U5}j2¨!¥zGéÌÕŎLr£†$5H Ig¡€¡Õõ¨ faI¼ +VrÖ:±[­¤F…×õ•õeüT+ÀZ +9èªS­(åü4Õ©VšÊ$rùLj$ïSˆy{$öZ”¹õœa•€TõÀƒ‚'Žµî±”‹2{h³r¥=‚¦ªÚW²ó…°Ú·µ¹¬ömmîx½!„v—¾Ï§ñªløa&IͶ5Å×76岶m—ÑaXx™²-o°KemϏËûÆ°7;kW/.AUϪ´N5%¤àÁ«t´Y½èhjî-ƒ½ènÖ1((²é£Ýã +Э¾)(ÌfäNOM͈Õ³Š%ڂÅV»È~|SQB¡Îysß?Sï)ÕúïŠý(’¯¡,ÓîÒ÷OZU§[ÿÝÈntß?Å÷èû§"Ïæ}ÿtlÁÛ÷£Lß?¿6JMuÊ5}ÿtr}qaë?í}ÿT_ßK°n¯öýØsʏ¤‰«ºÚ@SV~X3J©Ú÷ceµïE!fàVo,v¬‰Öió¢Q*]!D/¼Ð] +Lk„JkMt}® ŠU ¤k©`A-Õ÷b…T¼ð*”Ž‹ýµ(,† +7˜Žé…§²–JM!•ùy(´VñcMM-š +W·6’µTQ‹ªòyYëžÛžQ‹ší©¦Êü¼*æW۞]M…T’ÉI°¯¤Ìá«McìêèÊâº4F‘{»= +Í]ên³.éKѐ}£µOŸ¦f˜ˆš2zZï~·jõ¨ޝên{’·j]¡ÙLšša*5t_Yw‹mT6µC§¢[¹îŒI}9¶\Ý-í.‚‹Q ‰#dtBX{W|n疞lÆ]~ÏæeèÌ%í­öóvl‚O…WTjHv?șלxÌQòc>gú¯ð%Ùıò*óš£á­÷Š{¶ø­é¢ÙAO¢2Ï*]x8£„”6©BÄ ÁjZ?¥ê?$±ÂÙ<’;Ÿät‰‚¡ß‘Äj.M] ©ÖtV«Ž-(ãˆüðbXù5rGsÈÄuXô Š.­–ä`%† Dvâã•N„…ˆ8…+ñW ¬AÓÿ%7Æ<·Â⼑ ւ1(µÐ0ôÅ°êP/¼p‘Wê)Äڔë°Xy“ÆšÏwH~â@l„/8ØOtUèÙöì泀Ä{¾,!ùž¯÷$ƶhZH{t{Ês'˜uÏ/TGÙ`ã⟧Yÿ2{ò©ÌÎt XQ8 ×lr*4U×ø³°¸Jٙ"]u™¸%9&ÄÐÒÃʪ©¯R.®:êî՘ù•Ó¨õ;åä·$—ÑlxÃjiÉq“+^¤yCyœB&(E'Ý?ê¸J8Ó:CÎÝ k5· ”ÓEØžQMxM9`Ü°¤ýËÚÆE§t=¢‹<\èÊ$lüHx^¤cÌu–^Rq½·’çv˜¿×M”=§^(l®¯ˆ’uK« ó·\±«ã*$/î½»ªìN<þ§(ª*I¼Î#ÍÏRE%‰·Þ®+vߝN²nMɪ¹¼ïNÆ@’ð§ñSQD‚µRS‹aCÞ͒žÂæÚ:Uû'µ¡© —rS?Þ؄1eŸõ)”ôÀø÷ ËðA»’"a°ƒyu¥cŒÚ +Ú.ûxÜЩN¾šJ§©Ò+¢é*lLÂú›YAÎ笨ªóƄU0¡olÿj¬K\UԖêð;ºdê•:@+¬!ȟ”K…Ts„  ´N´ÍŽhJ„Ì%¿2Ч̍DS¬&R?M~ôV¢)¶ÒF´ªÿCÚE³˜ÚÈíʒDµõˆJõ7ʅjªêåRâU”$ª­GñCk)IT[È%Ã^U’¨¶‘rw_]’Èã+ô"çV[I¢ÚzDD´ëK9’ÊK¿ÒKkI¢ÚzDΒ¾ª$QbLõˆ¼¸'5¢ËyÝÞ¬P§¾IÝ-Í +ñÙü‹Í +/ÝÿJ³BR“ºû4+¤+VäՖۛêþyÑïÞ¬ðÒm÷¯4+MQ¼³Bªþž·4+ä¹ం’⩤T±,ÝíP¾0FCÃCy—„r¶Ê†‡ênµº¹á!6¹{Üj%ÕðPcÔµ 廊9!¯jx(ïB’0ص7<gAù[­®hx¨‚¡ïÑðP>݄stÝØðP± ìN~`Ùn‡ÌyssÃCùÉ ½W7<ää¢Û!Ï×yKÃCù)‰&Ã^ÓðP´8Röúvõ´Q]½ËøÓnnx(oa¿±á¡ìɗ¥Žµ;4<”÷&ë4]ž%ÓðPÞO»¾¢á¡XÕ&·¯ç4AÃCy(rîM å¡ Á=ÊÇc8÷Í å‹yuÂ"ÙkŠ(¡X·CÜZƒRãꆇ‚ýHð»âÊíÕ1ÛðP¹÷. å»r }cÃCùoL¹½­á!WF&Ƒœ3E[ÉÅEÃCyRÊíÊì¹ãÒ§2ô­ÜðP +«@ÝÚðP}ŸÂ›²PD·‘æR’‹†‡2%Ê©½s­ åÕ|8›»4<”:ÖßD’ו‘©Ðõـ¤Ò~Tjx(»¤%\ßðOp¡Ayª.ÚðP +žgsSÃC)(jÛïªlxxã— ÚZ^ÉÞÖðç¿èvHVîÐð­×’í½zsÃCyåGŠÓ47<”ïv¨»ùº)ºáá­ÞA• ÕÔâÞ¡á¡|·Cæ>…W• EçeÃÃëKõ±n‡8š›^º ñn‡¬„¾v?2 å³Ç„ÇÚÕ 哨„¨«Š¬ ÖíP’hZÞàëäM{ᕔíyCÃCNˆ‰u;¼>EQÐðP–-ðæ'·5<”×i÷ö†‡òEºÌ!}sÃCþ4…Ý/õ4Õ·pñJ«F´f£p —ʆ‡ê4››â«y¯X¹¢á¡üY!D®±á¡üYAën‘ã¢/§»Õ;âi$±~¨Û!…§'øZÚ#,Ÿï/(¢ä±Ëi\ø'ñ¼Ã«ô)WËÂ;3][Ž6„»>²$}áY«UXæs8x?zp̔õöÁ‹‘pw—!ê-XÕ¥7Ö%aÙèÝ_ƒßwø)“‰Õg¤Ñ±Yœk«9³ÏÅÅKÚ°?g‚úÉÌ>SOp¬hªÕ÷ÍÀ~ك}™ÐÚøŒzÉé¢KËÄ<5¼õÛ ãæà&M^ÿâlXÍô3XÛZfÊUõgÇÎÿâjT!©O“íöaœÏ(¿À떯ÐïÛLî5‹Õïq^Zlr@ĉQ"|ÊÂÜÁ\ŸœwQ‹ÑìgÙPÌñªÎŒkïÙLÞÛÎå’öp…{ŒZ{èmÏÀ¥ú‹Z<öeVö†©XU@óJ¯·ˆ¡Ó•÷÷‘=ÿÖ-ÂO`ί+,%vPæ"Ð; ӊpŸ,0¿at¢ä²;à23Ÿ<äs4 mÀŸ!ªE²§´>;(ac0ƒcmpßd]Ì/I7™÷ÖÂn‘°çOgÒR,•<óÏ:ÿµÜGw"dEC…£ûôزžXöwâö€ÏvìÁĘ}h˜gY'÷̛éw’̃‹°‚#tK? m^¬@xl—žBõqÂ~gç^†¡ˆÂÐõÅ>sb€ +»(¿sÓjSà…€•NkO1X Â*K»/ÙÑáøš²±C!w øŽt@:ـ>Ï0b(ÃPè…Aë€|¯u7äÔÜôÚñ ùŒ‘õ ü9ð¹k­¥ü¶m·' q|j\kÂÝ«r„chƀ"Á¾3çžÄMÑÅÆÜ!ãyÿŸ  \ëeT_V.GÀ7Y1x͕ ™ +wÒZ7"á™2ÏÛ¹ÒìYOKí^׃֕šMÛË­ˆ×ºh^êMüìì'Í)B³Å´îD <4ÓN‡^d{–¼`ɦóiæG0èõ]6H'RLÁŸ]7ýóå€`> =ìp¦àЫ&èá,g>|{N½C½oDŽ¬ƒŠw\Û?ѳY®ƒhŸû2a_86Z¿³?A²žY… ǎdûRSâþ¡b)˜? lñ®‹ÑÍ2§!á)xRðiâa>ͼÜ{@o‚žþüà œÞH›5 ½9aăמ"pi3>Óè"Ê{¬×g@]  Si½¾Å#ì<»ÎÅ¶Oò¬wüüuõŽ·a^ï¨u‹zgØ1қwí-øä¬èiß\o_ù«z§ÛüõªÞ¶7°cŠ@ · ®¦…ÙÕµ #ƒ j‚°¸»e£E' 9Ì(sJ ¾ä{~‚Ö:X $-Zd€*"ô¢m.èòòæœ;#:Y éD*’ŸPëÒºP±Ò¡Q NÅ-Ó@‰`vtp0^ ý˜ïB¾N‹%ʈÉ(šˆÅ“FãÌw)$œ,ôrIJ¦xpU\¸èÞe‰\9¾%À+uŽ¿‡Ó`ƒâ´Â³ÍV6AÉV¸‚ˆ- `uR2•’Á»¨›§¡·bv¼LÏ]gG ‰çd*:—qZžâ,j$lBŒPZ1PÐI8­•Ÿ³§Mîpxþ2áê j¯¼³ÊGћmOýœNŠ¾ƒ k €ñ“Àyú +oƒŠTøLqµ©ï-cš6úNÿ܃ÙÍÔN;¼+1ªGx—Â+ °%…|¥Áš2q)-~£ãµ”p$Gf¯u AÆ·€õZp·Xéï&{ýÝòÑ–j`u‹?&Mm,8qt?×x<õn›€£ÉN‚ˆ^·——c •Þaázl³êè'ÒD)`­:/p¨ðY]ˆ…[›®~ëÎSúß!Ó0ªÐ§Ææ8Öüa¯oh9`D;ë!b=EPÿq`‚¤Ò3W£D ÜppCi +Žš)Ÿ×}}ÌÁïf´NvDK¬±º]‚¢CîØbéðÁiäöØyPg‰ ¸©ÅÁ ‘¤ƒ/Õ°Xh:L’õ˼xH«_–K"ÀÙè@õñ@» c­°t(~ºÿ:*˜Jþ£x9T_rw¦xÏœ_õš3˜©;0¨‘{ CIÀM\3UŒ.ŔÊ •æ‚]l”P5œ#4LÏ0SµQ7L¨£K·`E¸åටÌD,øŠ\ÃÚ”5Ä­C 1 Žšba:]n6A/{ G ™AÈ *Äß Ñˆb®5eïÉÙð_µR÷@Q·þ´3ìê÷> Ľw=§á2øjN‡„ëJ§‰ì}­œ†ãZNÉq |ïKp 8Œ nÅöí5Ô´ å`‰v «*Jˆ$`\)1ìƇ³¹jE¬ÜŠHî}n:êŽ.á8n‘ÆlIÁ,Ñ´N„Ûd*&‚AI†”S=u‡´ÞœûhÐ0¼Ç!†íʍŠÒ6Ž=%‰!?ÉsI :eˆaÃÏ¥+E§M {ʝK6yÞT%:mÞLÏSÂþüc4[¡B<ó¿9´åŠÜ6ñáöÔ;ˑ>4Éûzû—«¨wÔ­dÂьr´Qv#{Mm—{íÈöƃähĸæ^·Œñ܂^c±H )íÞY>ºÐÏ)ßaq¹ÑŸÐB·ÐŸþæð‚“¢•6ÎÍ{x~ÑNÿµ8iËýYEª:õËïNôD{j€ù͹#‰â´ÔEŽƒØŒ™¡Vl¸}š²øƒŽ‡"eð-ïÅ3ƒ0QÅú’o» M›BéVÜØ/¤8Gê·ø ¤z Øg¨9øºÊ¸² +u‚ri£OЏóB-‹g:|b=§ ;åÿœî<T 'ËF¯9aeª tÞ ·¾‚Y/ü†€•µÏW±Žþ¤á~õzåz¤us:ÐS¯51XÛ. + a5† ïªõ”wD¬C€&#ތv,éil¡ (gÊE*ü@ºÅ@ŠÁ£ƒÅ*@HÛpŒÛ;±C0Ññ¿¤CŸ3 Ú^k¿¥g˜Îï6h|Æx|L9­çْ™ý;Æ2Þ\ñz›Þ]•rý’‡rWå¾êúÓªã¥?C´[½yëdĤÁyóÞ\ßwÊàõSd߅ìWïhU%¨ŸÎMøØÚeê}Ü;ŽÍþØ~Ö90åÏfü®ÏÂ}ƒgF3³r-léׯïj®RÒ·¸€ ›êže3¤LXæãÊøžÎ¥9¶o>ݔOÎäíø)`Š ô§Üä—৏~ïm§žm’¹ÕãWºÙþ0ç§ÎÔ;ò(¡Z`Î;xÚ)DÉ/r÷+jr*B¢]çWÔäT¦Z©÷+jr*¢}s•_Q“SÅo®ò+4Çÿ›ÐýŠøèwó¼šê‡ßÅïæÁ¡û'¦ûǝ.y<ÍlKæóöüŸrÛ¯óz¾9=DÜéV¶T +ró¯ílþࠃ/!V&:é™ÐH<<ÎóL"FÌä¾#…eÑÐ|žä¾‰^ó[R:Ì®½‡pèׁçê“Þ1š ô/ÙÒ[ŠGü³Gùk¨h¹h€Å]l†Üü9çíµê»`"?MdÜ.Àø[þ=3o¦ÜÇEÜ]L÷alò­•rŸˆ-réÐaQ^6æj‰¸ádÒ[ã/~ÖC“2õÆ\Ø­wXS)øuYoo<¾À¾ÀIè֟Qþ~ʙ?هñXˆ:¥Z›Öî_VP>;Д”.X¥!"ʅCñƒ\ÅTcl‘fvŒ%ƒ †© +êBցG¬†8öBÉå4P»v¤}€­öwF[ ý©6"ʅC©Ä¿)"ʅ/aþ_‹ˆrðOÈ¿å¡0”ô¯ED¹p(½D” ‡ÂÙükQ.Šï›»GD¹p(<Èÿµˆ(…¢ˆ¾wõ֗¾…¢çè+°Àü²&Ûzëï*¡wnP°Fà1adášÐHèE{îQblž4r¤Q}¿(…¦µ£ßšìL2‰ßÂ%“°zˆ^÷³‡¢ÓN‹N¨Ã`¢³·uQI$æ”þ-=Y—Y±ÞÏs¼äþíž\”øëˆÚQNiù²X=<°‹^*€:MèÀÉYZ¦}Ò[A eQŽ °”óyœ.3«Ç éq Csք#X5c&°Æ ƒÔPJåA Sú³§Ð±À3kQ‡ZŠƒ†.üh/”&4”›Öˆ€!FIRL~:^´à;VUÄ%ÌrÙ°@¶s2ew kCX[Ðw–ÊzËlì°!t¸Pf¾A~…+1̓åÈÂx½ŒaÚ +.1½fB¥[¶…/Üê¬aáVK¤çã…[ƒýSƘ“‰×fÜÙ-xP⡎*ÙÎÐp<ÒÕÝ¿‰Ni ÝˆÝ™ïÞöÌw½ƒû·¾±sÖ b<^Š;£ÝG +᳋"gT ñÙ+Hõ¸¸Ø@#Ÿq-µîAkO,Š\{ªc©žK‡!N䖢‰Ðlj†#¸ƒ`Þ©ˆ¥JRY?«lAΡædé@c¥ +Ѳ¨ Âóéրr2úzRHå”…uªÜù†È·ÛV*¼òԤ鉝¤¶=r1ˆ`ՃTõöH1Ùô* âp{ðCºè?¹:q Ætøtۑ0]Øíì!-;™Aì<Ò¬%#„ãø2†œ7±Å—óÙÅQ +G#˜Ý쒃_ÉRÿ³XOá6:idK z ¤kr½ÛÐ`ÃNý—?—´º¹ó¤PÍ~–©âÊH1~*è€ä°¤‹ö“Ÿ­ƒàÏ>eF¡ˆèZý>[öÓ'ØO<úé²Áž[/æ_€™M?È:ˆ•ÃÎx̙ûGsþĂj>“µéú þé½[èبý?yñWk ?üÎ/oã·^6g[I2_{cb§u€˜O£AÈ¥.Öýѧ÷!µÞÄ+]‰H¦ið&^éJÔý£Í›x¥+¥.hð&^éJDî•ÞÄ- …Æ w´äñŒò›ì_?¯ZóÓy‡^ Œ2óÅï¦:ùï7žê?øüoTቇü²:Õýc)}m7և*¬µ¹Ó‡Sî÷ëô»ÝLÿ}ˆ¢ïºµj§”{ˆ>ЯÆ,`0ļ ¾·¢ëq¤û‡xHúÿØÓ;ø¹ÿ!\aO8ì Ñ€ÿ¹|ހŽÃRÛ.“ãïú¡~˜ló‡ ¦#ìsV+z¹û¿!„æÍ`ºE 0Âÿ¿ÊàÓøî?â¡ö0ø$f:ð ó‚®ÀƒÓÿ֕?àþ®²{ý®pÈãßпðø® ‡c_±?šª ræw1:ü.~N£¯íê¼V 8 2X9Ÿ/=® ­7cóy\Á˜Ñ`hTðmü3ûKðÅ·Š!¶Ö“ÕJó =>…Œ/À~„T D~/ú;àw|Aû…/D¸‚ADCÆ델¼ÜŸ4(5c¯Î¿O£×ÉéG͐«z[]†6•žFO¯“ż}˜ü®à.['ÿkþ0Ùl¶§Éi¾‡ùñ´=ÌŽ?ÛÿÀoàØ€=[FÔÿ> endobj 6 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 50 0 obj <> endobj xref +0 51 +0000000004 65535 f +0000000016 00000 n +0000000176 00000 n +0000046761 00000 n +0000000000 00000 f +0000000000 00000 f +0000175934 00000 n +0000175867 00000 n +0000000000 00000 f +0000046812 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000176141 00000 n +0000176172 00000 n +0000176025 00000 n +0000176056 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 +0000048487 00000 n +0000176257 00000 n +0000047167 00000 n +0000048963 00000 n +0000048784 00000 n +0000048671 00000 n +0000047428 00000 n +0000047925 00000 n +0000047973 00000 n +0000048555 00000 n +0000048586 00000 n +0000049037 00000 n +0000049233 00000 n +0000050430 00000 n +0000071235 00000 n +0000136824 00000 n +0000176282 00000 n +trailer +<<0F2930700671ED40AEE68045EC3FA770>]>> +startxref +176470 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.svg new file mode 100644 index 00000000..f6b73f82 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_tests.psd b/plugins/net.mograsim.plugin.branding/raw_files/icon_tests.psd new file mode 100644 index 00000000..f81e5905 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/icon_tests.psd differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_white.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_white.ai new file mode 100644 index 00000000..de2631e8 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_white.ai @@ -0,0 +1,1225 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_white + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T03:02:05+02:00 + 2019-06-22T03:02:05+02:00 + 2019-06-22T03:02:05+02:00 + + + + 224 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FX//2Q== + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:A71F418A7C94E91197BDD9C8DFBF9319 + uuid:aabf7faf-1f61-4e96-a376-801cfa691496 + + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:A71F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T03:02:03+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 10 0 obj <>stream +H‰|SÛj1}×WèVž‹®` ö6.B)Ý·úВ”?´ýèh$e×n¡]æ\4»û8ÛÝý öôn¶mý~=™ÝûÏ`Ÿ~›Ÿ’‚|h9$KÁ~»˜š_L)2½ÔÉGrHE°ì³ã\ãæÑ|ÚÞç$5ÀyĸV™"Ú)ƒÌrG3¦ ‡HËm’ÛzÈ|ÅgJI ÕYy” IN19}ÏÞ1-O!¹^‹ß݋»f6CN‹ipՓ™¾Öpy4EIÑeáÞe„åböpG?ËHËð²†$#Èþ¬±8Ãay6Á„`§èRNdûÔW%H¢Æ3;âB¦–öYƱAjŒ­l…™+Z v¶æXdp‹}i{!ô<ô¼ÓÕûQâs_ç†b¥< oä£ïRs¯ñ+t‡£õ宏 G9ɽ€+?ÅO½fîùدqYה÷¼±·Û:]ÛKÙ; +, +Þa‘>l2ÕA% øØöÔÎt-UéÆI羞þ–4¤T+4ïõÇ}Z®OZeT»§ê»O3‹ïÒ~¾ŒÿÓsC…î[>ØTàažœ¥¬†Mò¢Å{;‘X’ƒ]¾›/ûëÑA­Ã^¥tõGg©Œ¼vÙxÓ]ÇësoÕX±»´ß°á·n–æniÿùY=ý +endstream endobj 13 0 obj <>stream +8;Z]L!=]#/!5bE.$"(^o%O_;W!8uZ9(]Y: +endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 7 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 5 0 obj <> endobj 20 0 obj [22 0 R] endobj 21 0 obj <>stream +H‰\“Ûjƒ@†ï}Š½l.‚§=$ Bb*xÑMûÆS¡®²š ß¾ëþ!….(|̎ÿÇ0†EuªL7³ðÝ͙fÖvF[š†›mˆ]èڙ N˜îšùNþÝôõ„®ù¼L3õ•i‡ ËXøáŠÓlötÐÅ6Aøf5ÙÎ\ÙÓWqÞ°ð|ÇêÉÌ,byÎ4µîC/õøZ÷ÄB߶­´«wó²u=7>—‘Xâ9†L3hšÆº![›+YäNβҝ< £ÿÕS‰¶KÛ|×Ö_OÝõ(J¢ÜÓ´ ½§8• ô¥è‹9( PR ځh’ž’tZ)N}BZ Æc_Ï äIäqäIäq JAH—HçH—HçH—÷„H0 ‰IpLBb¼ž¬å O O™IÌL`f +3°V°°V°°V°°V°°V°°V°ðTÞ3Ù˜ òJx¿÷ XWÄm2{ì_s³Ö­ž_w¿së¶u†Ä8ŒÌu­Oð+ÀøJÏ +endstream endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <>stream +H‰š a{ Áÿç÷  J `Já«Øå +endstream endobj 26 0 obj <>stream +H‰\U P•×þι÷"ˆâ‚ˆŠ>|î< *QD À`•ˆ¨Ñ +¢êŽ5&ÑZ·£iâh´".5“¦:‰TLB÷b\f´©ÖFF¤1Þ{@§múîüï?÷üg»ßY.@VC!jâäç†uŽÌÙ#œSòxf–-rlŸß ž@› %³‹§íÉmø_Î.ZZP÷hÑ! Ã`dsa~K/Íý…Âð?B5²ÿ@ö} ‹-¹¸í£e²ÿ+*š?3WõɜäG±‹s—”tÎiû°[‹¼s^nqþ¿Bc}²ï+þ›Jä—=2 8Ðð?¥ëi,øY;­áeØÓ·ÊEw²,n£Ú2[¬õ 1§±$I¬¶•iIN$Âišõ}{•œ¥‚g'‚Œ1¢§·´xG°¾ÝCÞ½Tzæö³çë­–ï¶Ï¾ÖbòÙóô—!ë7­ÿ”öôY¸ŠblÆÛÂNçQ!tþU(e![ñsü ™æ[á†c/ÍQ(46:¢6­Ä^b°hÅà +ò±‰ãT„na0E©JZƒH±’íÁ±8ØøËþ8‡qœheàœšáç6Qæ;:­kMöP7è#¨ÃCê£a¿f֛]æ]´Ç÷*ÌwÆ 5Å¢• c…D°²9ž?5oJLYC9>Â9ŠÐÐtÂ+"ýKìÀÇøðîQH«é +]µà«±kÌ8“gæ#/#«åkõ£1œ£rÔauÍ÷ûŽé%¶3P†%XŽ_c*q ×q“ûsgªÃèxä OÐÜ*1U ·É¢)–i-â2­|5RÓÁ‚`j+ú›±K0݇£¨ÁE\›ß +¦ŠB)‚2i­¤×i#m£}tˆŽP£ÎWJ©_èÏt£Ý`üÍNS!~{ §ÔÆ ÉL &H>ëñ@Î7˜Üô]æv+Òí|¶=ܼdÊÍYs . Ùx$˙Ó0U¢^Š×pŸ‰n=Îã¯ø‡ ¤ÈŸ: NrÑ+4™K‡é1ù¸«ä/†‹ø_Uª^OÕG|'ì`û˜ýØ6¦ÒxÍSךßâ'I2ð*J°°5cŠŸ³¸‹oðD|8¨·ÄšJãå¼;Äþmj–ròãU|ˆŠW›T­Õ;ì—íb{‡}ÜD›4©-%ŠhY±RM™ÈÛkͽ8(™9.ÕӀGԍzQ£)”E*¤ùTB¥´œVªt‚NRݤG¬ÙÁÁ‚SÏä5¼•Op 7ð]5Ye©Rµ\mU'ÔEõ7¤Ý:J§i^ª—Y°”£«_]sHs±/Ï·ÓwÆb'Û?³×ÛÕvƒýµ 0Ÿš{p JbÌÆl‰q¥œ-6â}©ƒãŸq’óï Em©»DÜ»5oIwšD>•²©@V!ÍüWS%£Stšª©–ÎÑeºE™$ú!²FKdrœa'W²—¯ËzÂÿTý•[ SÃU‚òÈiÖ©7ä›ÿ òSu\­Tv#•zÀ—9ŽVrýŽÃ¨Z¼…©t•ÎI<L'¥Ê‹Ñ¥Í.G¸#œ» ¨§Å¿Ã‘jªî¯Úa‘ô8‡×²ûéš8U*­LÕónž¡vé-:®¡\|‚éŒÁJÜ]A©d(RÕç[,Z~ªÙ*æ@³Nß·X]–9O¬¾¤zHéÜUÐÍá’}=”÷8éÀëRùÓTÄè;jÿ„o +¯[©ZÎxE|’öH^b¤P:½«†b• +£0—·¡—p©çLüÖP°tn“ä¦/@«@ž‰«œ-Y¿Hx­’:-Æzz nòÑiÔñfŒ |õIs¨o SóCªR©¨¢&]«kY‹¥jA3J¦G¢TÈ^™™Ò™áª¿TM ,vKý¿*p:òZÁE˜C;Ô7´Ç`"òÕBKÛí'zŒ.ˆýA¦I’c”¬8+LGë–;$Aªq¶Ü1…ú¶µ¦…VWÔ÷&ۄÛ3¬öö-,tReº­—^JÅ êJÓi’6<^3•|Tß2!ԎÂqÉH‡ÙRõ5N*54I*|º£Â÷Ž^¯_׋õ +¹›šdj®ÅìÄå6ù@î­‚ãAsšÌž9rGDaž—Ó%àE™Jãä[:¦È<õȔ,À<”Êäý-¡Jn¨ñ‚ÇtÑ+À\á/”j9VIÿ¯Ã™Û±—ø ¿¯Âù >Ëe<7pC}®i +®ê7u9&£/&Qgñ¶©ëŠß{ígûÙ/ö{/þz~Žóž_b'qB$ä£ ~MHF¥ã#e6!•C@@7:R[ÚI„MPú`ÒÖ?¦}HÕ j7UzNYê„QåI¨Cýkü±ibSÖ±ªžV(+8Þ¹ÏNJ¤iÚÍËÉù¸¿{ι'÷š¾”Õ Y˘Ž!Ói-£¡»Aç•|ë¢q¡À£ý¹w@;0µ/cÚ¦²t !ën3C¯,…¿arq(óÚãVÙf ‡(T4Œ×óâÎÌãV•Òl怱¤q$gŒÀÒÀ‰£»XœÉfL|–TèNè®*û;¨ SMîyÅdµAí°ñ|B1L´ë¤:‰èóåÛ(2¬ãM5Ó²–ÚÍû‘±ëä{’®Hë-m­y^¨86ïõU®æqæàšÍâ¬î”ݵæYLiOAB˜Ê´H2쩇’ƒ=ȘînвF™ "GLv(gð}TOǛL#¯)Æ= ?]¯™ªjü=DYš'k©öUÞL¥Ì–š"Î!ˆ)`ÜjÉ]m­/Èí¯ÀpÚ¾ÊöµƒûU•ø|AGûA0gvf*²‚ö˳HoOeM’£–ÅUKàYj™Yµ¬ ÏiÉW}fLWbíóñÁÚáÃ}&þóÁŠ}t·6ºsoF6rUߎŽ¯“*öž5[•3k‡26™T9"Û,+$å¾µÎTÈp¦½>‡•Ô +Nd¥¥ÁʈÉç¶WhÖ­ªÿç Bù_t”õçËaU˜f_j½üÄ:y<ΰ`{‚ŒŽï5 ÷:ÛT Ãє#gLÊ3û5…׌y¸‚$ŒcùՈÊ çesäB6q÷A¶4˜×ð¹yŸÛ½73ÏÃsçÜxf.7C¹Ál¾l™y!ÝÒª¥J*(T@£}®Ž´¿<¯#4cYí–Â’§ Y:ת£é©èøÊB k!.¯Ó{Å¢¯ö¶ƒÎUÑÍTz7U{»ÀÂSËÜ{àJC•F«ÆÐxæñ|°™U0ÀbbÍ|U{YÍà ó[ÚI‹1Lj ô2§£YÃPàGƒù§÷d*Üoâ J­Ïš0¿iQ˜;K‹¼9³&0ö{5jHÌRQ©TôF³Ö ‡Eá0Àfá6`?ÄÀ9ÑHÞá,`î +성SƆܘ9›DX'ÕÍa$¹¾új8õ ¿Ü?Vꆿß?ƗúQº¿ÔO7vlT¡QÔCvôH±->Òô)öE„ÉäÊ#¸»ý^.;ôd3×Â&ä­u‹A‡ƒáCÁÚÀÖZfŒek/zâž½±€ÆÒºâäXi¹Ÿ/òK°\º_{{1%;ð$îÅî-›7Áÿ['\ëý"ýÏëÐâÉIÉþ_$9¯(9_x’èåßÖñݘà]š',¸¹+…K—W +×9· yâøé„qÛÊ#rªŠ¶™%lD"RÄN³¢#ä u»4àõÁu‚ HÝ¥<¶Š÷>Å»€-¸ëÐú qºDWg÷±«“$ô¡ $§þ+ÚÏN¬”Wލs ½Ž·_ºŒ·ß´aO|eТË_³}·ÕûX6ˆ%ÖփzÙü;Á~}¿Ì¾îzý!þ1{¿ÃΡ9ü[|ýþÿƒ½°!‹=ü»_Ù<[Ñ[À³ºO¸®µÛ°í–PÀWó¿§ ¥ârq µa#Ç''á-WÙÞRq¿íviŸ ’›üÜã÷ +ÓðE¦QòqæíWòyÀM+ÿÕv‡¡o¹vüî{"qk å»ÈV^žms5?ÉßT^FÉòç(¿òçsQ/ëuyÉBùâËwgë¼mtDKù®®53Qo½7.uÅ¢"ڀ“LM\óªbë#2LMdȇs¼RǛ ØáiµÒi¬È߇ؤ!£ŠŽÐ[‰ÐÐI}/ÙÀ'ÂRH +JÉ/1Ž¨\'ÇäzÙîH&š͉–„ÝááÜ˹8'Ç8l‰¸Ð #¥6¢ã”£QGmövk>UDz$Áµêh’‚†)Iµ@KF=Ն{oPÙõ€«•Òþ˜J ”c11/”ê:0IT"ó@$7­Q’ôk€bóC?[Lô¤ÛÜ@‚”«óK*äS=ŒÏª§£êÓÄÍ [C”TЭovx+o“ øººxëȅ‚ð9;A“LhqøA7o»lwNüÉÓßÝP7ì 7ú ±m|p|¨EjêýÊ÷.¥ÂM½Û/\$üh峟}û‰.õ='>Â<åãoôï9õÒï4I[¹½8ÿÒ́¸Ô€ÕEÙ¾%ëŽýœÍü¬è’ åºOp +ëòq‡lg} äÄáŸê,Ïq>þÖE¨†ˆ†à\Õë¹S”ý 伪½ÖÅIÄ•œF +‘›º|ñ˜¿FŽ¡(z߬dœïb?_*òËÖ/áx‡z_{ÛØ¿·ü›uÂÆ4iEYP7YÅI[§^˜ÕRÐM¾•X$+}ƒR¬¬üÓÏú$·K²?x¸/T+†ÃbmÈÞ±Ç! ¾ žø%x✥îΓL*£óÍ5B£=î–eÿ@œñ0ðڝ@nÔ^úpsº¸¹bìØ(ÏÃÑú³Þ*7tn÷½â=›<Ût¶ù­¦·š¯rWZØÑìâzZìÍZK,åOƚ4Îï¡ #}"ƒ_ˆ¥ ½ÉÕÔ"†ŸMYtÕ¹z¿ê[æ^B,òਤWXÖÍE +øßW(&tA½ë/Â@ã“5ä›ð 6ý=ä(jÅ?X=¨üýezN€›‹Å4¸|‰/âªgõ,¤+8m´¾A •D@ ë¨Vtª÷ëXlR=t§OW ÇÇSÙnÕª½Á@@íjèÞJº:!‹NGµ@W˚ã?|Wkp×¾ww%­´’vµ»zìZ¯•%Y’eËÆØ ‚DE8!úÙWÏ0HYüwÝì®·¨õ‚ ›¨N§–÷Á›‹#á,>ß/(eÆbû×îøFΚ®ƒýFFÓ#ˆ ”Ø“Ô°Ãá'òRÇk0{  3\ŠŒ>+¬¬j¢Ð©°¥3Ø1=âcn[„ªI5ˆŽás‚Lð3÷wÕo=síýÕ+fêQà^ÛûÒÑë×m`*î'˜d6åځ }'¾®ŽLÑ\¢"þò£·_xïÁã¢Ê°¡'EÈ® +|RŒ*p¯n-ÉáÉ!©_óGò7Ê_ÒíÕL-;ƒidg3-¬1 Þù Žï¡Â^<9œÍŸÖ-p‡o‡Y[¾ù Ã0¬ÌÈl”‰² iºÔ(µJˤ5R—Ô”úÂg¹³âU›Äak +£ +F´¶àBm¶&¶*µ²b_h0ñ™õ’å²UlaA\‡”ä€Óïò¹Ác ¡°Íá¢\‘¢Ê“@SqSiÂà6ÚmáJ葞¾²zš6eñݨ— %õf›çoÆz”ÁDE‚I¢þ„&¡0#+µ£?T_aÇv¥rOÅën[‡t!¤Ñô(XÑ`%RëaReB¯d +í$ƒ# ¼ƒyÚhµq6ʘd:J¡,~Ww¢¨4ø¬ o`–ÒVdMž²×ÆYêk½Èæ9Eõ1Í"†/¦Ä‘ïø‘’ ¥€oˆŸœPÄÂ/¡¿qÇTÞ*h"ý2¹ÞSý¹dåN¹%ÉMqÔEúŸLT|½^µ„ýÛÅÒfÎlâZ$ 2›Ìœ©•BÀ¨à™!¦Œ4/ÀÆXÍ¿Cºq€¦Á>(º3ˆvÓ¸n§_¤iZ•à×xüóÃÂåt))µiÔ3¬B›»§ ÀsöòRxvO! >ãñRܶËÔ"œ”]¹“¹“0¯("“ÏUºí¢GŹŽ"ðýn˜(ÑÆü3‡î@1TƒÕì5mô–ÓQS$P˾qÞPFè̺֧Y8¾Á™Íßԓ|è<ùKÉÅÀEíjäJ‰)ì,q};Øi*™LGZJ–ñ˔¥‘ç+x“¯ôU’iˆ àDm‡-n´ôá)NŽ{eÙçՂ¬GËgZYdƒîüÚodU Až%Pê$½ +£¶àBYØ_ µ£6¯ìï.ˆµ››Ä}¹%³?i|±PüFȽìƒÇ˜ »àéӞŒ º4OcÄLùâ<Ð¥ +y«rÇ?éÓ³¤IFÉìlð(ӆx'¤œ=MÊVh"æû¿øáΝn½sÔouõý„<sR™e薲=ü©çþÏV}Аíä|\⋽ƒcCÀÕ÷`—I·::núÁë'Þ«Kº$·›+]ä+o#rücï«¿8y)ˆø=AXW e–ýzD·/²µÛ^¶ï-é´wÙϼSp³€õÒ.ÆÞÇqSVL”€’h=GZ1¤m=@×ý)wV¾FDZ£¡‚àU©¸ÈG24‹Bâ~­ +ê0¤yDwÄE]Ü,^­¢T¾ýAðú4w4nžÂ–Daa<¡E9Öä½8Z‡ƒe4Î̯Y‘–L~­*Åãpy¼¤¼¼´D«j4²FóóÑqWVŠciF•†|ՉzV5RKz ˜èížÝüÜõ±—8ÃQäãïa÷c?“þOøÕ/IظñŒÿ¦[žU†²ÌÝ.·¿ uyφäü²"#²MR€Ÿ +˜–DžDJá'‹9>rVµ+‚™~ž­Xn£ œÊ¨“Ö5s,õ_óÉhñ¢Ž•m¯´¬R$Iû.«^ÞÞÒß°‹b̐ÆjÃÙ(.knúÞÂô?'ýkY¹«Hݑ~01aF%äÞ_!5xln‚ì=¦I¥’.-–ÖHÛ¤ïHT¶ƒ[. Kڙå6›f÷¤#"ʱ–wa8|.@:ì,.‚Õèï!jCœV«M +@ržÙcB§T.mœRmý—Ï€n:ç=Äpyö ¦…&6|i˜‡?wڇ?%˜÷EPö+6÷G=óðói¤BY3ÿ"údÒ¹hÕËÚÄ­âË"‚…}9f<¢úrLtÞ'q»5@NÕÍq ¹^ÎÂIÒôÕã…?aՏ]ñ¡G×û9^ïD©Ÿvh­"Zk/bh +ÆôZW¥«Ê9ÛUíªuÍqé®FWÃçÚ+ìgä®Bk¨pi j l£¶lTi ‰j +,¥l ºrŽá¾¡jPª«®žS§UŠ.<Ty°ˆ¿Îßå?ã­Ïñ:oáSNžw951¢Æ&4NƒZ*¨iJP‹T$ÌÉ$—„ÉT<™LĵŠ”Ž'× 5‚ÆT}c£^¯ÅÉ`nqQ~N€T¬R¯!Rd,dñ‡ÆBUVTD""ëpª^®”'<íèy˜›Tórñ8·=æ>¬#âj}n<‰ºÞº:KÔ;å›Ö㠇‚ÚÉ: ìt“ÖõµÃîLÇÉÏ&ãî'ŽZ·<Îü$2¿Ç0ÿLd( æG}k·Ú²"Qkžl¤Äzo‹)Àg÷c* ,pµ˜ ˆ ­­r ,ÁŽJXы¿þ×m›µlilA+ ð +üudyÇ+éBwc 5[Ä(ñ©s +(aƒ$S Ï$Ë̞ëÏë74´…ª¶V¯¬hnÆJ}í«Éâ¯5¤ŒÇ…%E…sé?à‹ùKÛÒ­M©TSÍüé³XÍ𘾤i]ú†ñ|¨qYNt­9˜ +HåÊ—!•W}zå-ò /‘—hx‚î"»h˪‚k¨µôZÙòšü ¿¥tƒ3ÐP^P ¬‘_Í$*"S’(ú$ŸYƒÜYf rgŠu:³XÍmÖ Žˆp8£9ÊSf!*­©"Áp—PQ’²R¨&ñ¼›eXÕ?$ —#Î(G¨I¸M!.S‰Lq¦GP¢ø_*ÏÿW‡9`£)š¤!°!ÁÉtŽY‹bF-š[ׯúØ&Î;|ïs¶ïlŸïîõù3¾;;‰“æà $Äé™ø)kÕ]VRHéPéšÐ* ƒM6ÖIãcPV í†(S骕ŒP jÆ`0Æøк…­‰U…‚(C*YaŠ¶J«íýÞ³C-ӒÜÏ÷Þ½Îïóüžçù©¾zñ­0.ЫŒ®nPÜiÅ ø9vÜÉ¢ÏÙÑcó7w=9'µÀâÃe"s³~ðÜ£+û'»Q‘+kºÚ«¢Ê~2áF]«fþ0{ë.‚€m)' á)?zÐLIŠMÁ~…9ƒÎðïÑï—|`g—Ú{Dz ½ÄÖãèázÝϊKä§ýŸÎº“áv—N‘~‚ëÓã·>M·¯i…¼T=õ$˜Õ0½Î H:kÂ6ք=}ìQv„ý½É–°ÃèʁHÐxÎkÍv÷‹…¨AtÇ +…üíP¨@(Äù±ƒ^ìÁþCù+”œ¿rÀ£ùN´µÉ+ØÎ`RÄáü¿LYˆfx ÅÁA±“Ïo˜¥Ÿ±c^‚—P,ú[1)20Ùq”à†ã\^ø&šÔ4ª&ê0ù§ ajbžš<•¦s£ÇOäþ¤ǑÜyy×®ËäBƒÇr7‘xôs7÷³‹—v¾úá%À¦r>éÞrjÍL'´$àjª‹:én÷S0a—º—£U÷-«ãÏã.Ø/8ÿ–¸Ðpýˆs™f•}³`X%bµl0Y FJcJÁ¥xéô–4#–,ºrW%Ã1€©ž¤ÎsU:Úf³SªQÎVè‚9BSk(Jç”.*í+µ•§<±y"ô“M“Ø?M[ÿ‹òþ½»ñ®A`¥«þ ^ ¨W»Ü"¨7ä?x+¿¹…8¦Ðed ÷l©IРûX±ú¯ßÌe\ÞôŽÕRÖ¸Öo\ô‘ü%&ÝԎn™ëq&2ƒ–¡º¨žöm ùç©wä3måóÊùÖ÷Û>–¯6^oûLkü´MâeV)iu¶©²Oñµ†Û6Æ^nüÀ?&?žêIõ+Sß36¤6¯ãý˜Ûl ©ô\GuU¼¢Áœžn Ýçj¡§ÔÇmuӏ‹á(F Ó§ë¢>“FM­Õ £WÌHÅ4]§ {g‹>'º(Úe¢¡Y _‰U>Ý$Šª€vš]}U¨*øÀL;ÃVp:ÿÄ÷ =G&² "ðÎCÕ£ÞìU«ù²ÙQŠ`Ü %+¶$I÷À·#œßÂ\j±Ì-ÕÜ&i‘r¹ÜßêS)#Ü¢¢f ŠÔK%P) uúý¥i𽐑N©ÓT +Ï­ØEL¸PPA-?Gÿ ¹Èáüß)þ՞¿±¿7ƒäˆ)éHj¢»ûad³’X +ôØ ÕÀPRD^¬ ´9nÇ Àí˜2òàdȦ·‰ aR&É18A£E¶q¶%¬|æ£#¿&0K^65¶Â;" M‰Š² +‹…S˜ÕdÐ ÈÀ)65oÝ Ƭúµƒí_[ôçS§Ö8|n"RÐßÞ·{×Üy¹Së9·m/S] +L}1R‚éDª¥º)]ä@|õƒKßXÞPôW@__ZŸYÙޑLjÏ¤Ÿ]C&”­à̆m+UC1ËþFîp(Lï憸ãÜ»ÜU®ä[žµž—=¿ðœäÏó¬ßìDAlh™ésØlvG y±Ó' +^QÂ%AWÕ0zÍ£FY™Ý@ˆb]zÇëmÃè—&®©q8µ +ý$ñF´È7"G#%à¨%Cè*ˆ¤­«TAÁa¶´FÉbÐ]‚ ,ò„Âχœ*Ņ]*EÂp n4Þá¢%ºÍ…£¶N~¼Ý§!€hxÚâԊþΓÍØí ¸µ÷oۻà +Ê f1iîì_Zò(j€týË"&‰&§(MÆX–±,!Š#^ –öcpN6nàaÔkò2m$Ō8(2â!ÔKÉÈiºM ÕK}Ò.é¬d“Ž A`T9ÒÁëŸVŒu÷_ëõŽ)Ò£¤·È_&L®+©«^÷Ýëêä#@9n³àVwH1i}×òî×dMt°¡žÄ£n=ŽŠÐ›1Ž¦Þý„Þ·9÷ÆW ²È u#j,Gu›¬i5T;7AØüK…i"PÄ:•ÏÛ^¬+™s_¥’ð¯eÞT^÷Ó¿Vúí¥×(?V•ß*—”œâØEïû/ãUÅq…ßìÏííýíÞþÜîžíóÞÞÚ·¾ßù8[v𶍥U Ń¹(?NH„µª•4ÅRA•Phƒ#¨”–¶4IEՒ@Š\‰ÔRhPKAj*ᤆ¤ +V‘J¢4ôLß®m~’ +uG;oæíÌìjç½o¾z‹¢ƒLPÕ]u¨&ÆQ³ZÓ¦.g–«k˜5J¯Úkô:[Év¦_ݦm3¶9O2CêÄóڋÔæeõöu’Uj¯¯;gÐÞNœ×þ‘˜ÒòáDM"Oåym—±ËùUâdb‚Pþ–xŸ¼¯}LÝH|¬Åûñ…5ëÇ6?¾°•ýxł"Š²bE5õ\ l¶i»6}Ík²ÏÙô€=lS¢½Â¦lû cÛYÇJ; xšâwò{yZàëùnžþ'O~Ïó—<áùƒ,ÏX+Â2fҏۺº‚QW—4,ÓÐG¨„fŽÞ|À-© m*,ت¢àqæ`XêF¬AŠ&¦®aÕEhSMàˆ5N&QÚ}ãm7G%“n†Bè&”íH';L¹#舤M3vèD?mQò¬ÛÏn±Õp|Ùp²XÕ¥°2’X ñ²Ñánpˆs’¼„ZE#ϸZb5嶴—)o卣\1^¦FÉKn”57¨D=­0Ï)ø›÷j±Õ3ÇÚÚË~7?ÛÅ×øWð-Î÷-.æYWJheÖU[w²{Y +Øn–bO‘w¡éŽœú¨R¹uöOOâT%)V½NU¿bˆÕJRŸž}xýŠ÷ô.Š=–ä³áëâ”רN{9|J|­~»áÙÙ¬Ìçõ{äa¡R© ~Ö÷Yç­ü¼­p_s‚Fo“"òxš£é,=Ës™*ˋdùS>zwÿØhÿ¯›¼t}Ï«¶Û<º÷‘TM²þŠGœBÕV§È9¼•RªW©ݙÇ#¨>`—0d>¯ƒ.éV>šÖZIk¼;êj7ä[a^þ’ü€ÕOúãCòµ[ÞmÅOÉ'¬ 뢳t^øÂêŒ_ƒŸX±YàvßD*Iñ’< á©h´p »k¬ÔpŠ¤Z)”£5V&߂CŽ7}¢¬¹áRssKÉʗdžòӓe–¥ˆÅH*~þhEhYÓÙJÊ¥œíyËf ™lÖÎX¹Œ%—JfÆR2+.I&$H HqÁ+ñÒ×Ô(É$"=å!½Ý‘kéÈçs1H­HQ©ÉÔ5¦—W°X‘5Ùv’½ÆXcQî„’xøÃl×à-ÅuÖû4Jkßlγs¡…æ^õÿâÿ|Wüôh.(v;É­C!=‡ÿ·Cˆ»b*€gÄ]Ú,M=:ó„‘JFÕÄ/ÂÉòUŸ\®OŠJsõêw}êVëFšUy?Ôº©WfÃ,šànüޗi²¬a4ÕT?ýe–…&83&=2ãåXDñ­»0,uñŽálÉÌÔb²¡¨š£6­Ìnmoäb¦^¿ þ±7ßÌ^Ž¥ª¯¥9—‡Å!‹a*é*Ï3`.@“¹°,E¸žl,ÖV–Ý·Nb‘X<ÜõÈÖÝRÝÓ¿ ~Zˆ„¹ø—u‰.­êl‰2υš¿9tcª8ð ?‰™Û‹J×Bíðш7']A·Ë_#«„Íd“0!°¹Qôñ £ì˜ »ÁÞ±Dª,x»G¶Ñ+ˆeۍØå Á-¡‡å!m 9`9‡Éaá89.L á<ÿWá|òOöUaʖ{øžðf~s„ÉÔ¥D°Ä&Èԅ{šÒªÊq™t]Øxފ5¦»1uS/ê+ô ú€¾O?¤ŸÓ'õ®§biš^2ã +kŸ5nÑփß×ó…Ê äE¨[as*º|RÂv¼Ž‰È©;;ñ—Ïã>Tòl#åÇsÉWªÈÆýž¤*€ÿùœÕ*—æ6C¥˜±sk8v몍¤57°räüÌô˜bær=çÞ~ùឥI¸C§†jµùÑo͜é!ã/ìY?ó¯gªdfjéR²ãҋ/\>Š¨ÙLw ¢fés—wsÝ|w¨;̸¢w%Waº¸.¾+ÔfŠb1^”Š +Sà +|!T3‡°®çêùú°)šqS2•Dc5é㐱8³Ö5©BM*U[c™Šµb—Ô-QÒzA’DÁRTÃs¶h…¤¦IKm¨5Óf ÀqH1Bш é&;É8¹DX̚bòP’J.£Uð6÷ǯ`öõ¥Íÿ–/÷P6•{÷(¦/Rñ/Ü긷³F­e(é»zϤ=}j ­m杶¶uÕêÚööT<è¡÷à­.ËáEÍÛ‚:î@àƒ§ŸX÷¹¶‡„΃|¼ëç +7zöBá{ÂMî“}̍`»<Ž÷fàøeõ îüٛÜÍuÌ ß{çE3ga›×@ëMø€„à$Lá=CÞ¡*d!¼ ûHN³p.ã“#p.ÀD‚?Ã{D&gIl‚-°ŸÈpâ°v¡~ðgµØÒ¡#ðÞ½0{aˆÐ+àëðê>ø;éĕüöÁBœñœqž‚Õp +ŽÃ8~ +ÂðÙ0>} ~}¨ÜÚð­#0MF¨N²ÇıìÄõ½7­Â•n—#8o¶œ˜+Þjó¥o®ü‡¬Ä¯ø6ì%;ü¯ö 9Iºð=~ëc¸Ò&؏÷:8 +ÿe½Üƒ«ª®0¾Ö¹ i ¤!DÒ  $\Áˆ”Jkr­`‹TD åph-A‰dìXƒ01 +-CIÐ OK•«Ž¼ ´„‰ Òœ–Øê` /iUŠ·¿µï=—K þèùf}û±öÚk}{í2D~+iPóäfó”œÖ2ÏŲ]Æ2³ +ڙN%Hº,œgþ'õ²æÒÏKh^Œå;I©7NRåër Ké+9˜a½(JÆ:ìÒc†´Àݬ»´Pc½ Œ¹Ë4ÉY/¹,ÏÓû Œ—Ïê¥ê3:^‹c+nëRNŸV»‚yš<iñ³ÚÉjÞ/3z¥“JzöåìfR‚ÕŠhgbý,cELÆbE´pRÁ 'c¯íš-µòžÌ‹´h:Ï©âi¹/v—W±Õ*©örÌA½/ÇîQñ/-ç¯ÕvW[Ïm_ÞtÿtÉ¬wž€§Ãä-fé1¿5Ú½¿Æªð™õÚÍ?OŸÐ'ä |Ãlä[ηRÔRåq)ÅwKå»Øyw‚ì¡Å6Ã"ÿ–þ‘ãò©‹ÔDZÉEé$¬a1úkô˜†ß4 C1#äHˆ¿Å2•U[¢»e¢vûu‚,‘­^W$÷Koð ½o”ùÒWÐj)­OöÀÛdpä+6‡¥Œ\K„’¯èd:ÉÇ«{¡À|Ù¤‡ñíÕÚ]6ÈZ-ÓXݝÉZm“}°ÆBâïòCž?•/å/²^ÈkrXÖ²Ê ù»Wþ#hõ_ˆœœ¥Þaìeòžƒßót-Hèw¡ëÓzŒ÷G«ù÷¥¼æ}O«ôQí«õ \ò*mÖ¤Y7 zRÿ¤Ó`¶ÏØ?Çé·5I;i?Y©çå´7RéMÑ~šÆÊ^‰¿F/à©Ðõ$„a}RÄ·:ªâ{¹®Jg¹ÉÕì†vUcy‹-»’]›`ÊO¤ù„Z«‰€&ÆÓÑï5º@›Ðüm¤~ë0 ^úÏÿ‡ Ýë4YM« ¢­×ϝžŽ,xŽÍOé/âsõ¿ÅæzM¹Zǘ8˜ÜµM¼l}u‰Ù'VjOÖ7¡ôm‹÷žpå6âÝþ'ÉÏ]¹E·¸ï_áÕö~]íb>n.›ä÷>/ë¤&A¼›YmüB~*£°ÇI|#؀%¦È­Ò‘uhM¬ÆþÚ(uR§ÿЋz‘ø.Õíú™žÒ<¯«½IÜ “<ý/§ôœþŽb…ÕŒõ>yûrDgè,4<"õè—ãiro¯åEøc‘Noƒz}QÿzÅÚq+˜§˜sœ?ˆŽErAþ¬Ÿ³^ïòÉøÞD‡UZ« úŽîƒà¹;u‘‘¥?ÖïÊåk¿F÷èot¿î‚‘8°@âûÜGm$¾Þ¨$îדXÉö w¸Qi½s$J±Ë;¢b:Øm´Ñš!¸~΀Gç8)Sio2Ͼ nµýî>t¦/ü¡Jѐ—ïån(sQdžè{c«(ºÑ²Íhk' +¯+5ÈK ږ´ŽÜv"øšˆm¯´ˆö¥#°ËgÍX”_SúlÚNg‡6JŸ-Ú+ãö„UÈ:/¸gJäP|]ے®DiŒMcëe"+'Ga;§‰"v•}º–ž‰¿%ë9/¦Ù§3õ°Î¯Ë Ç +çt_ëUð­“oqÖ °Ó×ÉŸç…þË-ôÒ½ltX*_hŠËEj\®Ò<(Cöѱ,:“¿ùN¬F˜üؾTÊv"õi†­ä<ҝh:岻ݰ`w¾Zf"º2i·Õev äN+`V˗CDÙ=Ô²LyÃI²‘|n…äs¦9#q¢HÉè“D¼vɌEäêÀxèçœ6²Ïë¤ +_‰¶µÉh`Ùfkî‰rÌ®«2PŸüì> ¢9í"9ã4ö{±ˆ^Å?Æ-%œáú» lOvž{Øíð%òKPÂò2udzM—=䒖!ïæT™†åºÇ¬W@‡Ùe–ËL‡0jæ¾åœe8†vv|‹õ°3á0ÞÎr2«’×ñ°mH˜Qç1ªÍ`§üŒÌ®ÒýIŽajüéUN“éàIÍ×þ _þÆn¨äFœÚô²—ê¥rÞêNse®7„¥ž{ˆ}ªÞöW£Ö!„§ê`}H'é]:”÷§?ììv/±S¨!Z7Q#7p³ë+ÚÙ+½Ù\­ ùü.=îÆìm½¹–œm7–Ìý4íBºI{é~O¯=ƒôždíðª&zŒîo3tG,€úñv§ŽÖ<í¡wk€•8† +ÙîŠÎA6+Èrù&{µ­uë° åDPÅ®l+õ•ÙØz''‘ýX;LÆ~†•îüSÂý |'È{q¾’¼ünǟivâ‚oc_±òY"2‡…Ô“Õ5éE~?T~B» fj­+èsVy)^Š(ÒïDyÜEn®|‹­v;Wòþ4LM$¾í· ÞílëW™´Ä÷»>œ'Jc°Yr Y¸E}ì|®…³;Øø&~DIðÝLF{/’g)ž#<;ñìm"¡ù(P»ó¤c´V­òeĞYð" áG +ð&86Ho"¸<6ˆV'ÙïÀŸb;Ié ùYàUàŸì€Jû؟Øß±æ¡oÒÛHÝX“"ºë<?FÍð *r\0Ë|ƒ~=ûT§Oÿì7¯ü>‹ž° 8y¶výŒd§Ù·ŒØÉá$…ïm~Î&Økì5ƒ%{‘îØ×Õ;ö ;C7}ÐÎÅÜÿ¯¹ˆb­' >ó³ ïÎ"ÜHG€*£&¼w¾›mÁyú)b¼"DK‹°w í­éB¼Ðê A·“¾HWa1¹°ògØ)´ÿUVϾ„_‚ñ®r«óºÑy7Ùҙá„} +»÷{DÄ_¿×g^§·P²;ønýOâ´Âc=Œ^Hëp~£?‡w‚|·ÖÁ‡È´˜RwGÝÌÙ´'ŸRþ:õ¥|nÄX©ÎÂËthfzfF•-ÇØdŸo%FY€™ŸN{tËÒa%]·¼9¤gNí]Æ^§=¹Ÿ}kú`aìÞaõ'zx‡–²z:˖Z£ Ý>ä•ÕþMÖq<“Nå|:‰¹G‰æÀ,[ÿ .þï‘÷µw`ÃIZˆ[®ày„XÙEMD‹'‰îl'ZòÑ]÷Ì¢bÌ]\%*yŒ¨´)‰å؉òÏUü‚hUÑêz¢µÙIÔîÑÐxïp÷IÖ;44444Þ/Ô½­¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ñ®Áˆò§ø£ÔBS6ô!ª¢n"þç9]”…<ŠéÛ  c‰¤JΡrLå‰åY2§EüIK΂ü¼%gC>aÉ9TÇ…š,+mgÍ·dF+³+,Ù ü쭖̡÷Zr佖œ ù˜%c<ٗè9TCÕ´–ê y¨ŸLð-¦§aŠ(M#rQȒz¡¨kP⢠’ èvàÿ8ÅTÎ7Q{¨_ÕÌCjF®Z“vCãV­‡ÐoªŸÍh}m¡vÃh3@>È>È”EÓýˆôè«©Ҋt®Ž*Õ¼h!‚ºýzяlÃGVÝVäú¡•¥Cc,='¹5à-ÇÓ§ÖBÐFä{Q"µ^µ7Î1ÙNؚ©P½ ¡Ô§æ+s}h{7þ*ÍjùÕÊ èSûт1ÉÕ ¨ÿBjm7¨ÿMUäAô)WÚ¯¨°F”ª+”>\¿Hzߙ‡,cüÃ*4Zã Xci»a>^5:i ~Õ·ý€šgß»±£çDMõÚ:áé7Ŗp(Ž˜¢1„£Þx Z#\Á èìèÇD‡3£»Lÿ‘—×löFÍÝÂ1CùÏfïpx(.‚áŸð…#ÃQùÍW׊’ÕUŠo0Ò/š½!_Ø7mk¸?$š‡ü1ٓ§?ÁÙíô…£bc 7ðyƒÂêuÂèTÄÂCQŸ Öß퍚b(ä7£".çÑâ›>337ˆ˜i +s°×ôûM¿&µÂoÆ|Ñ@DNPõá7ãÞ@0¶ÆÝÚ±±«sU#š˜Ñ6swûÖ-žÛWZ9і¦WÄ£^¿9荈pß­—øvó´;øqn¬Of×E´*Ã9$]C;mÅȾüq‹ïç{ì6W.òŒ®Îæ6‘Øä®ùžêJOiƧ ±»ŠøF5QM`TÕ5P†VÇ¡‡~úq¥'¦šZVa5e  ÛbKÁ5wóNœd;Ðâ]¼3Qc?áÚη¡é#ŠNr蘢=ŠºQ¥#J+9¬d§’–,iÕ,jWÔ&)ïà[©šóVÅÛùý´܍¼äm¼Eñ-|“⛡¿üc¨WÞÊPùä›À›‘—| Ñd¯vEïA™þ¤¾ ch˜š°HR3L—”¦t8pU“ñ&¤F$wᏴр’â¼ɉTÏëQrêÞÚÀjŽÔr 'Öʁ–ضÇA9Ü*ø:ª€v`;0íTâ¿JŒ«=TòÕTŠ¶–û¨\XÜnì¥bðbco¢ØÞàÊ5ŽR;°ˆ£ÆÑĜ›«õdÝ*À ô#À³À`.9“% ó §áänÃͳ`ÝSGâµë“ü#K“|Á’›+Ê+°Lô,—ñ± ´ +p¦svÀ€é”Ñ à

ö~ +Öø³ão¤\Å]°°ËŸ\Gî²ÎÿY0bœùà +Í°0ϹÈ]´ò|†¹±º}Ï2—xɋ0¾ëÃW¾Œ1Zôb¼-L· ãÌKÎü^ÎÊ^ÎŠä¬ 8©„CwqÔ-D%‡ª[/qŠ¯À9¶/g×ÓlYìî£:ތª]§e8 ÃiAoð;7oäùê²®÷Qo +—ÎSÇË×oÝlÅxÓhÙ¼jØzTï¾ìç]á®v„ºÎ¢u͖½Q7ëŽÑ´ý‡µædoOº¯ž¥‹&›ûkŠ`“"W­·»'Ü5‘«'rõD®šY“¹dÕCYjÈò«A¢*3PÀõ­±ìÇge5ÏÑü­Â£4ÂÐAæóaÃâºpMW¦+Âo™póëWþÖ-<®,˜G åm8Âp0xÅ#­}5¼*µ<Âvº˜(øä Ûî¡2,Wå¬ÏŠ\™ÅŠ,VíTúm$g5ì ¯-ÄNøç£DÆáî2@á‹MÔCI‡paK;ƒÂ 18! ™Øþ`‡Û7 +endstream endobj 12 0 obj <> endobj 11 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon.ai) +%%CreationDate: 6/22/2019 3:02 AM +%%Canvassize: 16383 +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%%DocumentProcessColors: +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%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: 2 +%AI9_OpenToView: -497 224 1 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 67 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 29 0 obj <>stream +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 1982 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 +%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDDFFFFF +%%EndData + +endstream endobj 30 0 obj <>stream +%AI12_CompressedDataxœì½ms$G’øfýê>¬ÙŒLDgfddDÎÉάªìRš҆íJ{2¦$!u-4zFÜ?s?æþØùó¸‡GdVˆ~áìè–²òʌȌyÜãïþ¯¾þ|ûòîOן‡³nó쳿û»ýýõÕÃÝýo6$o¾xõêÝۇ{~õ‡_oúé¬ÃUÛ/ò·vå¾¾{swû~wðí%îÿÕþ‡û›·7W·›Ëë×rѯ7¿ú5¾ýææáÕµ|óâîöìêæ×ÞªÔr~õ _MχáùÐõó&ü¦6Ûßñ’«Û?_½}{ó/×h*d¶´»{wûòæöûÝÝÿúÍ&N›Ïǜ6#þF|ÿ7¸~ûØEg9μòüîÅ»××·_Ýß½¸~ûv÷êîþíoÚo.ïnÞþf³¿{ws}ÿûë¿|õõï¾i/øýõõË뗧.Û~¿½¼yu-óúêaÓìÉíýðíîÝÍ«—¿÷úO×ÒoÓܓ¾å3üñíÕ÷רNþ&=}ûÅk!}}ýð ï$-q@þð÷»öɅÊò«þJúìZZ¼ÿ×·ÿí×¥æû»7 áîÍç±6ø¿³o¿¹~ýæ• ûkˆÓY”žâ¯öC¹X^‰~ú³œæyóù4vgÓ$Çñ¬—qÜôq>›³ÝQ{úúÏ7×ùÍæ÷w·×ÖAÛû‡¯u„DZëô_ûêï^]ßÿñö;‘6kýîîåõ+¹£VqùêŠÃÒ×íŠo®î¿¿~‰q÷êݧnöVd~{õ£ÌVyskäË7×·ßÜýg>êçãœ6Ã0nðNCÞÌQþÌl!J#ýäöõ_«õ –Rÿ”0p_ÉX~yóýÍíoʦoÿþþæeà4l²þ÷8ËÍÿsùßV^ýááú¶t‡L®ýҝýîK´zqûr÷£ð–ËèZڗùóêî{û¶~àwRÅ»7Ï>ûçgŸ…ùùÿ|w÷pýVj|u½™§çßß_ýùZæs~~ñîþnӇ®¹âOWo¯Ÿ'£ts«Ô—RÚõ«W7oÞÞHóÏ_^}ÿýõ½ý’¸¹—)òÝ«ëÿõüÍõýÃwïÞ^ݾ|þõ‹«û»ÛçßËjaݯ®¿{xþå…Ì’¨uƒ õñoéÒ¼I^Z>èWz'ԇç×·/¯Þþðüú5=ÈB¼~.üîå5ևTövÕ¨Þ|wýü坰1áG˜ÜÏÿËKYëòÆo7Ïß¾¹z!Ý1Ï_¼»¿¿¾}ñ£|˜žÿéþNVàŸ®d÷S~^®þâî͏VçýËï®_ßÜÞÜÊíix.ýóâêÕíÝÃó~|óÃõíó{Š·òj×/Ÿ¿¾zÇ’n•AzþF˜´Üùîíó‡¿Ü½}'vswÿüá‡ûëkÿtõâÝÃõó×ïd¾†ç¤½|!ãÏÚ^\¿¼yõêJj’¥èwȽ¾zûâÝ+>QÎøò¾»º—{ðçW¯¾Ó6ŒøvÓÏÃó-çƒTµÕ·Íhnµ·þö[¼ÀóíÅó½=Âó Þþü‚7K-Íí~ßzÕÚÄÍ5_ø5?<ÿ=”j¾Ô¾Ô¾lnøRŸéK¿ïõ»W7o^ýøüË·¯0'þX^èzó››ÿèwýýò›îîe¶€ãÞÊT{ûüJ¾*ïsÕÜ}¥M_y%W쎫ëç/Jw\ëí×Zûu½Yªºöûnôª½ê¦iâƯ¹–î¸Õïôò»òLwÍ wv‰ß÷òæÏ7 hg¼Ó[ßiKïÏóÎïùQ¿~`güXÈÏ>ûæByaüß~óV6†÷‡oÉh.n_Üa¯þÍæÛåz°¡þóóÕÏW7('þæ¿>cíÂÓJݛoîß]ó㛲é°áoåI¾’îàŠúý~—¿ýêÕ;ùòïïïÞ½ùâö»»gŸýJå¢ÿ|ýBdÙª^n¾üÓ—"ÝüþêÅß_ÿËõ͋n¯…ÿmvҕB÷kEÚyó럨XøýõF¿•{ùQ~‡ßO¹ÿüú;0jJý‡ÿ;¤QøÝíçÿUxéÿ¼¾{ùî•|{qûçëWwo®72[7ÿxuÿæ)M|õêêöê~Ã/J m½›/ÀV®þÇÃ͟7¯¯¤Q¹è·7²G|u%ýû¤„™¼‘^ãM¼fÙÚc4_=©©«‡6;yȗo½ö-¶6Åw·ßô_D¯Jõ_ÿøúOw¯nÞ¾öÊ[ŠÿýÄ'•n½ýòVùþÝÛ6ßÜݽòš÷›Ã››Û·×¯VO-B‘Þ÷7Ր_|¬,žÿ-šØ_‰(#lñÍ7/ŽµòŸìûïn®6vâþ'Í®ªc­~ýæú_n®^mñ𶿹ÆlndËÞy‚ ÿüñF´†Ým{ÉßßC$¸}%ùïï^½„P U׿EH›ÝKÊã]ó__þ7÷íN$Íÿ äõO¿*CS‚•ÑJäÿ¥Lø_jœ%yÉݼ(Û¦ì¤ì­œ7墻”/KY³h_ ýÙ7e§¥,ÕÅx.Gq9veԖ#µ©qlG¤‰eÿ/{Ýz{ÕÃìUé¯yէ֓‹>\öÛª·–ý#ýµì퓭•™%[IV&–hed VdÞq1ڞª»‚/…òrÚXùÙ±l­Ì,ي,vYüi?Y‰VF–`EyrÙ„¯6czÁqÜqÜ2Ç)r\0{ÿœ½½eß&öæÈÞëÙ[ì{#ËÛ%¾;ÞoÙñ­Îù[>wâSŽ|*y™6Ò¥{ag[akYØÛ$Lnf7Ÿ—'•)u!½f¸¶˜·IdFd¿ée¾”¡?—NÙÍ[a§yNÂX£0Ø ;T/;ö¥Lˆs鬝°á9Ë3 +Kž„59“îeo¿”©r.]¹K[aâ9%açQØzæދ,p)“è\ºw'¬–- ÉFeC²-ô“<£Lé ì½l[Ù<²l!SŒ²™ÙTz‘/.eâËìdÙeãIã$[Ð([Ñ R'KàB¦Ç^6©­lVòŒ²mM!Êd#ëE¢¹”Éz.Èm/¶â([¶jx”ý6"°]‰k˕¼V˜ný÷ Ì T £Ì­²&ÖQj¨÷C@üâ²Ù ”SÌ2Ǣ̯^æÖ±™54Ûw)üèNÕsÁb·Š\ÖeDz= ;–lJ"0”GÀÞèûâ$S/ÙƒïŒØ·h³Üï2F0 69ƒRÆåŒÞ$è²Æv=èÈxÝ¥×,Ÿ) ž +”.§võ ¸\Æagø8m)Ú\„ƒ@³wñIF¡T0ÜS¼¿FzÝõ5‹(^Eoª,¬­ÔUkb=ì(½ÿh'ù󷃩¹<(t™!Ifʎsf%h´Ým )̪eWuZU–Õ2-²-ïý#ÌlÉÊ~Š‘ùp¬–ò'YÈ;—¯K©S^èRÉô+-q¡ƒ™^&5cú£2ÿB%^j{e·r]е éŅ¹§„^4üžW%¯JÕXõ¯ÉtÙ¶Œ%”áH±©±ý9P±:[ÙÏŸ-ÂZdî½ì¼lO”ùdÉEÔÓªLO,U{m‘ŸÝÂQÿ>,áDáԐ‡'–c|¤HO»òÉ?Gmõóéjl¶×Þ;V¥ß"ş[Q¹­ØBŠm$›î]l'¶îeU«ž^V{±ÇÔ¥°^ÛEö-k¹]½;[ÕŊp¸v“[&+ÑmÕ.ÚÕê֌GÖ©ü嶐j[­Í²:Ϲ5KkcÛ]›»…eîpuÎzµæ…•¯Z…ŠeèØzõÏ Ûa<(ãÂÚxzU.-Wk›å±uûØj^­U®êß½ÿŠ~tUÿ ¬ÁO_ã ¡·U¯,•Z¬"«tTØ/(‘̦`N&“ ®^]6RIZH%C£bíEÉ¢Šõì3Q² f©’5«£Š¥J֞V'U´²+ZÁ-¨Z{Q³vT´2mX2©lõ\(—Ô¿ÏфTEÕRe êÖ ê®sS¸vT¸2.¨\`e2wLíº¤. ÅKU/(_™ÊÔ¯‘êWÏeuIlO JÔ°$ÍâRÑ´DE TÆD£=è‚ +Ù¹(dPÉ ”A-ƒb–ÆHÕ ÊY ëꨠ]š¿ÓLå;Hx‰Rބ~z +X•³C Ö©rœÊn™êÊHÞòî†k7RX±çêï–'·2å%á·ãläœuÁK’Í‚k.x¤¬˜VfAYq»£|îùâˆ<ñ4®q’›|âUíª¨–ÖBÖþ,‚©si‡+{.UŽÞTÚZ¢,m~qU¦E`aIL c¦Žµ,ÛUÙ­‹Y4Ûr~P.K™m ۝¼?R†£%-ŊxXâ‰2,nO–ÓªäGËüEDŠ…UûxÙ=±ãKû'–ó§©ñzl(Ÿ\¤ÆSß}àϑíõƒkrQçZë`N-£µ§ûj²R쯳³ÎJj­-?…UÔ%T†¥ðÛ¢[©¿XŠÕn,ó›æ)-“—bkÎ^f+[/»#<ë楎uŒWU?ÂqîÔ𥅟bÁ“Np£S\¨å<;ڃNóžGx΂ÇŸ¡-í49ÂY~Š£Hò‘'p§ —˹ÆsŠfõŸäOä +‡|à‘Uýxù+®ê÷2Û. ·"ØíՖJG1d±0ʁpjÆ;a ê4îÌm Çq¤ë8‹àYÜÇçp ˦£ä@‘NdÙc(ÈW2œÉt'«C9@ +¥S?p,o)*ùŒÅ¤f¸˜!ÒÍüì3ºš3¤rº›wžÎÝé܉”‰ŽçQ²t¢?‹8¿¥z/ìãÂ\ÑÝVVŒý…8¥á–ž¶‰jÁܸ§é –‚‰ y±§­2ÐY w5d÷D§uÕc¦ëZ×{2',ôKº±;ç…ÿÎ[8nå´Æc…ßîZ¹jᦕVîY¹få–-<7 µsÅ7¬M…1–C:Ë!̨*Ç4쀮«;6gíáçùLøüÉ »¼ +õìÎ+~³@0OÀ2ÿáæõëëWeÚ_RñX ™ÿÁYç¥1ÌÁXe47_2Ƹ5VxÞúlÍ†6š ˆév.|¬7<ÕÈMˆª7·Kš?tS›¸m¹‘]ÃO…K7­-m[çGЄŠ,žµíª»IgØKuyì$§Ž@‹`ýœF£¶–ÛØØhSD1 ŽJX›Ç’¡Ÿ`È. £°îö|{Ñ /ž„»X;.}gïÍ ß:â«+~¯»wãŽ}·ž‹KþÜò™Áø •åá£,¦¾Lù r¤®(=Ik/s°£t ¬wžÜ›¬½l¨†ŠkX #ÌxÖ¹[pOó˜šÃ’™½F3 ÷Õ(üdlʓp)îI¯Æ`uQŠ'2ѹc‡¶†*ÆáhÈ EuÜî/œÎ pÓ¡›jITïqpé9R‚ž(E'Jҙ¦Ñ-åéÕi= +N—”¬«l­PLŒ£Ê×*aW›R¶3ž 9’¶H¼”¶3¥í"oŸ/dî•Ôm27æBpRî.’·¬²¥ìY2¬sOÑñÂÁ%ïñl%ï=%ï ˆ\2ö*y‡FòN&uï(uŸSêVøg•·ÇFކ¬íÒ¶Hå甸‹¼}(qG“¸)s»¼½£ÌM‰Û™•AÞ šÜ€éN;üûÂÿ^R͐Lgœ™•ÍewQwå¯ö· [໩ ü¹w³up|ý¿GcÔ*¯&qaœˆ;hàñ$Ÿì_5¦ë¿êö¬ÿn¦÷sƒQƒÙ)—W×g™ÛÖeûÆC®ó\ŠÌlíÉfüD­ƒrŒòdòvÝCԑª+à‚«€ëÀñǜYëð…u9î2ÌÞG– ûƒ ™‡¡+PþñˆÃ ëKÇB!ÒÊÁ9­ÜŸ§"Ѵǃ"úGVÑ©5tDðѕ´kÜ-u-µë©YU†¬³Y„ÒûȔ ÷Cëþw½°°HÛ@ˆÂ¥`§ˆóÐÇ´PâåêÆÚõ©*TÃGž¦¹Ç­ã,¢s6C‚|t[…ÚyªÝd:I+7ÏóÁUè¤1K„…&$Ùìæ¾O¢,à%ñÞ6ÂK›÷ˆ“ÜÚ7V»®ÉLA¹ Üiþ’­8‡šŸ&¡™´‹­žù,ÆIr3ÐÇVõž¦›/ï_üpóòúÆÿ[ªڈڳI$cDÈӄA6Ï_+#Fc¯)om‘µ;7åFÍ=dwmì&3À"eP×µª¸Û,`O½}7Ng"8/†áC+xÏÎÿI‡îÑõöMqµã[9½Hϭܦ&#ãÎË/Š¾epg(!E'Š®÷$×njhh ñmµ—ÎKeݦvZ`¨5PW!« +`=m3ˆ´Pwa”KÑ^Ôf07ZÌÎ$‹b9— +Æ2„++¢õBÕ|™–Tß çRKB±&ìŠüb;Fq¡¨h>ÊÜÌѪ"dÒÞ@t-KÙlZL†(aWÑ¥%w‡D”£d)dj ^¢—ú“¼d/[/»Z¤Æ}S*L`éjqªý¢„¦°ûž}–F/qQòªÌGŠ›i{Pö'Êù#ŝ[0 Ÿp¶wï]8¡E¡>E9Ü\ۓ8ïêší—±5™+tWCµ±.eª=a£Ã5wÙت?{¶Ø óÆê6–µ[›¬]{:3;ƒŽiKÝÚ̾ ] s9кm–ª¶ãœ<ç\,¾ì3ªú±·ôcÛ8 +ÚS ´z;Z¦yv4ȄjCë̆iAS¿õì^ës3øƒ%·« ‚ùì64ú«iC{Ìg]½Ösc?Û3à6í ÃHº¿ZԔ¥Çz¢*S‘BÅs­úIEU$PÅqÀˆû¸Ÿñ3à}^ìßãÈS —Xž">¯;‡HC”à¾ÁÃå,9'Ñ9 åd•}ûwJIZ"tÆøÀSØÀGK±µôËXè]¢ŸKÜsy.OR5SÂ5K•ªeTs/ªPU{jü²+4sn(¯e¼rUK£”«Z¿Ré[UÞ°KUþ¸¡é@_©ð¦Äþn©Æ/ù¥*¿Tæ³Y¹“o„2J®ÒWµ¾(öƒg<éõþ²Qò/\—ópká¥ñú3{É^ê¶V7éèe¬Ej M©1}ý¢´¸ë%t£Õ 9¨Â!+CØ/Êî lWå؏hä±Ërtc§ÑîtqAIjŒ'Êøޅ[Óh|‚òA±ðGÃ3„TVà2ˆô0"~JºŒŠoãâÍ;+³{Zxh«ö|az]^Õ[ëþÚâ±Ýú8''í×aȱwïä¼ +çÕøjæ׋$s‘ `Ç¥0›×2QŒ-l5ÅVöҋ]Ã<¥`™9ì¡ÞìaðqA¶ û˜)µ$7ÙF“å=Ddúž†ø¢¡ {3æ.B4$D%¦¢¡!ª…ÐÙ$rT ¹4}Eª²½ À[3—°‘6pd2ÅԚ ³’ÚR‰Ù폄 ž +,a&ːa‘õLc›QõTØp-ã±b$>ü9Œì;Kvüìæª\|Hù)Ì15yi 8~A±3Ä.‹VHøH¿³™ "ìG}µ$¹Ýhmàø€ÛßÓÆðÇÛÛ«××/7ßiÓÃÞp„Ú}Že`Š®¢4Y˜úÓ¡ÿšDà²$ ™Û5Üv™#a ´U€B¶ xí£“ƒkç·f5–Œ +Vyú’¼ ¾Ãú-v̊uî揧f|x:,óÏß꽞zgO].´ý¾èys=_š¹æ }Ã#Y*ŽÃ¥¯ëH,ó9ýQ–˜­pŽš%ægÏnóËS/ŸzáÔcŠ’³I½ ÐïMîgj×:òÇqÆù êÕ¤ô$ÕÊďæµ]wœÛ +Iò×üv0¤!Öûž˜@xÊÌu .™iV½õ«fÌ«ð7Ía'àð·|2Ñ,yÞd­+ð·dPsÖ% -``A6=ûÌ¡MKX“šÁÑL2Ë`‚Ö0s1ÄSÌ3 +rLùÍPS &S¡ŠRUõ”òcÊÕ²¢¤¥mél¬ñ2‹5íå²ÈJ8ZÆ%.‹)£µLO*ét¡ïúxÉV,üiåˆ6yX,Èã–_j‘(J\ÂSRK¯“K{zéðì3ssWqo‹JèÝ©uÞÄ&l›ÜfՍE–ð¨a‘ãléº*Ž«ê´ª.«Öaª³Ê2[öG2[®ÝTk'Õ ÷Ô³ÏVªSsê1ǔÔxÂ1uÌ)õ7”=µìŸR윎Ÿ.§ Z…ùΉPQf!()EuÆ÷Â÷ŽüÁ?§cŽüOZmñé#¬›ØŸuÂížýÕW~‡4+ßLýMlÂx6õMº­G.YՐ¤â8L›¡; ܎հ¾¤ÖÒ10BKÿx<Âp0<‚g|»X°ÏW@쓥ìvÛ󃲿â5­×øyÌósà¥ò˜ù +é îÀøÃ#¼òa¼QcÁlO)L F®=ç³=ãsUþfkjS6í=1cµ¯Ù ñÑYŽÚbÄýšc؍mÁnx#?qÉ5òӝš55ÍRn,5é•>É5K&¦¬L*…Øg²­nd¾»<ö¹íº8ÎÝpäP¦OW§ÅFÇnèYdZ/<û€˜vý4žÕ¬ApΨ y «ÀZÿ$oóéûçãYçqÆ9|löœGÎËrȬÁ6y0.Á¦O‹¦°è1˜ë +¬kB€}´…ãosB»x/;êÜð×ýI0#øq ¨ø7؊´`a?ÑÂ{€2—mÔАCޓ`⒃¬¿ùë@ÃÑõÖëÁ€uÃ*ïo›L7– Ïõ[3ýÆæx>Í +¸cJ#ËìÛÄGÖ|¾“çñÝZÜ£Ïk:Ù4¦{ â©„&ƒ,Ít¹í,^û ¾šHl¸áD˜˜4ÞþDU_Xu0 e¤;®omó +ê:ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£#!8~²J ÀÉ%çBŒO¬É§CŒÌü÷M²Zr»îfrc×!ýGèûÀz«ð·)OmÞÔ¶Á÷¹ë£Wa>¾ ó:«g,ùیÝ>kb[™ ¤·BWÖë÷\8¸k1õîr¿ü”{ù9÷æò\c;sr[KÞΉ3TO$Ûú+ÞÓ +Íèš6"u^êX‚©þH‚)K.E¨ª<%ºãYbI}ó[\õI¨,Žô|Á–¶+;Ú©Äv–ÈÀ¡FzÛµx´µá‘”WÞbe…Òö2q°™Õ9Kôñ¢ytVrÁƒ­fhv½ôç9óÕNò$ƒ´‹«fšBƒÔ#(ŒŸAØ%Lž³Ì¶(³Y9pØÔNæbÞd_2²pËC¤0;ü ÓãܓŽ‡ýÉ ;a`}¾Àøoºíf­5™Sý¼-(·SpÉ2ÀX–e6ÕÞ$™ÐÂû[¾Ãâ+†XùÈY ðÚ5·eZ¸DÑP¡˜ü}Óªë°Î&gm\dÛ¨ÏxŠ«¯ùz…LëX´°Å +P¬@ÄÃpÔlyc ¢Zex&xêÄþv£dd ‰Š„Bí  +„=ìtA€ÓH8 L,‚’fB!ôǟ®=ïûãNûÖ‚ ‰ýà#‚ËéÛ¿<ÝG>ÝBd= ´<ôÝLËÃÔu#DÉ3Y3!2MÄþQ“èeÛ##>q½&²ŽÝÀeqê{&ø“^”¦8šÔ²p”Àpä¯sÎfQçÛgý¤õš±èãŒÿ¥Îþ Ûõ§s*¬êµ~íû¯-̆ïû.Ì¢nÊúþ­àÜÖ÷˜ÎsÂ<–æ”·uâN‹ƒ=÷Í¡žŸq«‡yn-s]±–f+Ït<îi!ïézŒòÈ°ˆ;æ__þYj|T%Ëã}2?´xõÅiö®J•¤ó+…«UŪ‚V²6T5n2Eª‡;H³ðPŽxØ/|K/F9ä¡B'óY˜—BDkƒ4œ§=*>~q–öþâüš. £ìM¸Ž0r8\ñ/ÂR£y˜R>ÉG›4žõ1µÁ«Gj±fBÌ»~˜xΖ0Ó>jÏ1ÌCO˜7 ç­#±›1 Ãn磫²³ÍÞë­rÚ ãYZ>ÉWñ±Ž¼xԑ׈ܣõ–öäÄÀãx€ÖYãuúæ„f$óZ¦=.§Æ–®Ê¿õ¤ÓåY±U& ëÏÍù®ëS^×â$4‘Ζ§|ØêûƒVMï\eŕá\ž–^³ðŸ´@·= ä²9fñð,¹9 qyÈ见ȓœ<¤jôÛÆö¥rê:Pt&Ø 9¥rXÞÔÉêŽ!zÐÜâ[×I{ßÿn;_OÖ ýá2KÆ!Ù­¹{Ì +à=Çý€›?z%ÇÇ_Ðñ +AÇÿ‚Žÿë ã§ùè:ò±¨­þ Q[§;0…ñÓۀ–{Ô'árÀ7ÓºžYun§4—s«êÉUÙO®ššs´êAÃ<¥ëȞñÞìw9??èv;œãàäŽåTXëÌ«˜ÀõÏ|:ðôÄ>Í_ÓûQžýT®ýø¢yÚ^𤣎ÝË®F…F&4´Pºižmþwö…°> x½Š>º²Ÿ%ªð¯oþßÿçßo¾~ñÃ_®îÿËfEùkJshÒûÀciž}v¶¸$A/I‹Û„Åç~&æ2zIT¼'Àì’ RIpú†ö†]=ð1ûæXFHP’ýÀ +ž7ԓ{® A+3ÎÏ}äρù÷ƒýa¢¢Ós¦$~v²ªÎššîºÈØ5å5dë™AEº¾°“|ŸF•îڌš4Ÿ—räpLY&†h÷X§9?žfâIsâCTê>ՑJí1P>#Nô`¶3¢=k·Ì‡& ú£s⧡/Ó ›¹›žä‰Zώó&né½ãš¹ÒÌ;¨àx²ÿEZ‘O'‘¹ü¯Xã1§Ú±“àӒãI‡ïˆær4•õ2‘µE`=ûì#c°’FaÕ,™e…e®Z=hï粫ËBY&‘¹8žFæg;SëC¬‡GOÕbÚì'Û¿XЋ%ÅßyMò'ý­Æ&úó4çOJô·Lóg±["ó|Tô–FOj—Ñ[2Ë>8~‹ˆ] 4&C꣋µu¹Jö“Ž§úeNü2'~™¿Ì‰GçÄ2-Ø{dÌ:Ìÿõþ7ÿ¬æ-¡|ûû»Û¯îonnn¿ÿüóVuo¿yöÙïßð» ß}uõðp}+ZýöՏoß^A›·¿6ó|6Oà 7ð8Ma3ŒãY'£³úéL&פO¼Õ_ÿôü~§ŠõŸ~ÔÏÿQþþïBý‹tÅæw›þoÝæå3Þõ\PZ*o^ƒzÐÞæ· ry®ß¶U%.+¸Å?Ï·÷ç7/nîn¯îÜüF"Ïwww¯¤/¾°~ùöâåÍÃÝý·»«ÿCzïÛon^]û‡ë¿Þü{Üñâï÷Nk9חþRçʀc/ÕÚ‘³f”Ù’-K¤œË¹—㜻0oþéJëZödèû³.Lý&æ³ J‚u”¼ç mâ|6‰L¶Öp†ÚbÂÅãfÈr¹0ƒMŒg½¬ÀÍ Þ–ã™,ò°‰Ãل[Ñ"ÎÆaʛq>ý‡&Og}ëÇp&+r(÷Íg] +Ã&È·‰Õ'67ä³8À퐻³8ãþt`ÖÛÒx&úÌf˜ú,­MҊ¥›0èC„sm‚¼†HÈv›P{Ñp62칗Y8¥3Y{@f„àŠN%ƒ†ËËMÔ:Œ›q:ÃU›A:§ŸefŒý™¼žÃ®ñlô»ú3‘v{òaŠgÂ'£&ÍCrºi:û7eá½p_^\Ë"7jõÂp†Y'¬Þ'ËT+ŠZ½f»Bï+Ô¾›íÆ{J?E8£lî EoÁãÊ„Ö »¬Ïæ”9«\ wªp .ë ~8oúæ€ÈܓnI«é_a:¯—T‘\ÀÒza˜£ˆÑ…¥õؓd|죽òdOõteöå•8ÁÚª=Nj/›ÑV©§ÓUìuͪ®OäW•gözV¯¶^«I‚pcÀ÷:ÙJ轒}­Ÿ,¥vÇ°YáòÇ<ÊoSp½VºWîr4vŠµ=0 ¸l®Â®º c…qcŠaƒïd[’­OÜõ…vÂű!rWSë…Ï‹ò³™Gو³l²ÔgQ#6³ì"~Ø}Ø,‚ôÇ, Döˆ wÁ^faIt!¯é‰ gž‡²{ U´+Ýu²¼Ã¡Hv7t¬‚ ÈõY:TXKÆrŸPÇAZ—MX¶'ÚE®›Ç÷­zåpÂ¢é¤ i;vÒÂë%/Ží[^8Žœl˜Fƒ0CY^>¿ðÎM±^$’°‰¦’B°¶ì¶B•Ñ–nØx= °ÈdIL,–>Ãý-Br!h‡@sè¦z•,%ò÷ÊÆ`Q€ÚmÀ¨"þL‡ò)Ùþh÷‰@•¶a;ôÐCR‘ŸŒˆõS.u!WÊ zô[,¢5Ì/Ü¡fŒØ.|5T?‹pZ)z«ìÈ"²çæByÌǑ$¢†"ÚÇÜÇrk!“µ™ÐÀø +XÈQ†JVpx…cUXÖaàœ–-u‚€$ƒ|FlK29;ÙNdtÁ°±mö©é¦¡“±x¡©y†åŽ4ñ„Å.3/áÆnnöYNƒ¾ƒ&à0Ø4Œ„aH#t-ÙΓ,5ðèÜõe=ɧq’G¥8ˆf!*=)ȦõÂnŒ¦*ý\ZtCú¬:E'¢í¦VeŒCèíŠÝXÌ/¬ïT*;x˟QFrÄeÙðǕ×j9|qûáº0 ^ü~pcœÜgŽ?ÙÛE†ÄÅó×˽úm]`ÿ]¡8žŠïBb`êüÃö"›s_½PCDšò¤î?(ϲ·ÕÿÞLJs ö®Æ¦V<€Øãd{l|€"aÈ…Õl 2ï},ÍÇO$ÉT݀ ¥y.Ér 5cÑ|¥úk¸/:€ÆCvŽy)·Æqh܁ðÀÒÑîì)°”N2 Uw(5î„ä*ûÖÐ8GtKªGP¶<}¯âì±çÊ U§ -±wg"½‚x}õû· ”ÿyÀt/ŽAtc7:S,žAjK3Þ³¸EÁþ#bŒû…·Š´Tö­âèÂÉ}õòÎJq°[§Qq¢¾œ¤ +÷ÂBJ}Ç=„²Š€WìHî"(™òLî#À.{zÿÌI#§éÒKÓETwBc¥Ó7‡Ëô´£—p™½^‘³lã,ç¬%|'wâ9eé.l.¤7°©Ê>[‹­ËlA$Ú¹ú ¡Óºìí9eé5l.ô‡÷ÊÖoyÄq(c-OÐǕçFNB÷Ñ ½ì鯮¼BXºëeæljrŠ5¹tb¤#ìZt›~hš4ÂÒ{X/ó‡÷šÖoùoDê¦g~»kd™àØ7©,â{Ñ:±åv擃: ™foR„3’â¬Ö8!Öi‚º!<„yGxˆš¤1­¬PL ê|¬Â7HuÜ&bÿŽÆÐúÆì·Æ\n•]‹­Ê­]€‰&Z ¯z¨Ohh°ÌŮٸr¯›ê‚avà¹Ç2 p|` Šé9Y•Þz¡0¦ ݱÖU)]Æ*Y^„Â\­lV1ôcÓj¡¼(ƒÊ§«×•ðºÞô'ä¡O⢆w‰Sb飆=Y‡»8©áWèFص‹—ºá ‰•›š6kÞZÐà+:íœb;ɜ<–IV<ÕCËü4OµS–žêzañ@\¡¥„Ô̲JÆ°ÆÖ7=¯‹6\Ën:í® Jã`ˆ×+26ïaªkßc‹Ù K§u½®ø£k]•b.×܋i"ðÊ dӞW-„¥ïº¹Î_ÀëZ¿éÏæ¾G¶‘Wš§“‹æé¶È¢ybšÐ„³Ð<Á^Dg\ó„~&2çìš'l4º-TO7"ÕÓmE§„U<ÁºP=¡Ov‚ +ÛdQ<Ëç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgiÄÓù…Þ}Eë<ìÐ#–«I#K­³’‹ªH;íE™Ätè/µNڙ ßÔ ûÂ/½2§,´À†lêb­¬¨”µÕ…îY¯^èo敭ßõ´3ü£Lóc4Ä ¬àðW¿^‘Á‘èy‹SsR«­ƒØã·ÏÓÎÚ\1~ÄZ™S¬Ug,Fža¦P‹V&»–°¹©iµPܺoÎU¿Ð_Á+[¿ëÏè°€§AÕÃ+XµQFæÔ)c Ì1׺òbÝ§¹…p”ÙÑ*2[è5ƒ蕷Š¸2°«sÕ ^Øþaiž¦A‡l ð™b W³A}¢¤“‰ëAWž·§®Ú·€À™{3ycµ'ˆš4ðÖ4Ã6!܇Fgô°ôX™ç0#´!òB_.r™¸ÑÇHt@?Ño7»ãCE?”½$Ñ{p!4Á8ôê4W@²Èþ"_€’qDPE™L=V¨ö| ìR¹C]WVì„ã‡`”ÜÛ8À–ßA€€å ž¦YÝu´ËÒ7Ìày¢:…àÚ5|û8 +O—uXa’íõÅè–<œ‡ªã›¬%rӘÆý®äb¥À4ê`-‘þIJ ‡ÖNXˆ'®õ›¦¢`º«íÅnôó ýá½²õ[6^A™¿ô¿aæs+{½"ÏjBü†ž;(â€i9 +ÏsŠ6zE%5Êââ¢2§X«~«‘“JÀµ2¸wah­­ŠÝZ¯^è¯à•­ßµéž9b_u’XÌ×K26pØI¹jÕ,ƒ…å0e¢8œà #~¡^7"Í`hêrJiÔnu2D%ºJe„@Š)mÚgãåÑÊUõ¥JE¯Y»6_ñ2‡z +ÅCܐGHΊKáMÍK”Ìa•È +Åøì&0Ö2¡kÃ4ÕÊŠµj·:y€(˜7MepK„ضj”åíñüB«ìð]›~pIŠÖý§¸öœ ›dxpÈn"ae”éoª”Ez‰qšÚ çÈMeN)­º0ad3ŒÔʄ«2†Ë5‚9-ÊÕËêk•š^ôg38ª›I- vÇ~61ïlA»c›š"Yî«GÈî(€w¨ +tI9âØô˜hñ6Èû BÑ@>ļC@…,å˜wô™z^ è׆è$½ÓÜ2NcE½S&bÔ_½ƒé†y {Çûå¸w˜â0®Ã.:²]<P¡[Bß¡ U‚hÎ]ðZÇ£;å…÷?v†æBƒ¶7uJiÔ*#ç3€Êj]Ò֐(–F ÅåÇ8†ö:­RÕú=O«þŸO÷Üàx×JVÔIœcŠÉ\š+2Ý)f1{s¡ÜkUN°&íN'ËÆ?uaÓԕÌ]M­ÙÚίóÇ÷ºÖïÙp;G2—EÍ-'‹Ü%·"Ô%¼lŒ½ù<;øê[&ÂpÆ©o. °–禮B(m:Ë"&=€ÙjM˜[ãÜ6Y(&–gó ýù½²ƒýmµÆÂ"Â|@aŽÆÊ€ÕŸÅ@Yj¢LKpݏàiNÃPÃœb¢‘ÆÔë +ò»ä e‘Ém!S{ŒåNÕk,HL¶ +è%W¿ª"ü Z)Ì~«“Eꆜk”@Kx”€SLr²(zaÿÉ•R,.t¹?#Fº tB…© l4Õç-Ap¨a® Àã’yÏ©èB)iԘ$œ‘ $@í%ÀhRÂP}UcÄáì=´D=F³GØÉëYT:Êíh|¾ù܄ +‚Ï¢ûëeÐÔäkÒîtr_ôéR@aCžà»µ<[½ÐŸß+[¿h£4ôà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q~ÉçD &pD\NÐ"â<žÀq5   â<¢`ˆóˆ‡Ä•ˆGÄyHÁç1W‚ +W +–h¸Wàp¸Xàh¸Z°ÕØÇ•à‡Â•è‚%Îà  +çñ…óƒÎ  +çÕý^b –P¸dàH82p$œ‡,‘pgàH84p$Üáê<â°5<þ א ¾æÐ~¸•€%Îêu%– ÖU)-0­!‚Í+s”[it‰†ó‡k®ó(u¼ér 8‰†kȆa+0ÿ‚ró`€ÎcêeUÐT䔙֐ ÂVë2”[m²ÃùƒùUþè^ÑúOé¬ÕÝ ;Ÿ0b_r2¬I´˜õ‘æbéÉ=3ŠY° ©½PXXS[—S¬Ñj˜P²,²ö¯ÌD„¦ÕVh¨OW®«/Pê:xÓf|”æ¾N½EM1Œ:Áë¹×à$Ø|D6Š:p]P½E¤ƒP)nì1ÍÌ/ÄÞ9…¶2§X«/Š¥ÐÈA#‚›Ê"ä€Ø¶j»ÕÏ/ôWðÊÖïÚöêGè¬pWvI՗˜æ"ÍV2ÌiL+ü=¶sàî©BÄ·…bš\I£â2B1NMe•b­Ó/ä™"Ô´©• %Íôz—V ÅZ-W/,¯P+[¿kíÆl² 6(,ž×+2zÙPvsŒ–Ü¥‡°¥çu͕b/ˆOÚ ïÛʜb­úæçä<´X*ƒÍ.7mêg»­Rˆ/SmÛ÷ër{]•bº·ÚÈ †‹~S낙wˆm›FyQ”g{8¿Ð_ÀëZ¿éÏ6Ia‰uHTäå,®/#ŽºŸÁ%zδ2’Uÿ"'¶Ïö^"'&‘×ý"D¬äÔÔR֖kþJ•å=Òu_êIž^[Km|¼?“Qý¡­žõ›µ¾ßAuë!@îòtªtY7©³–׌ÙÔLí¸ŒíΪûeÀRdU$´"'X{v_¡bš€WyEXPÚ½=#¸³XË/+^*Z¿ßϵ ¹#w¦·L8JòõŠ Ùp²£>*¨<Ý ÒG—aš/çpS •×/D'Ìm]…`m:SjRŒ{SS¶(þÚdnr4Ïæúó{eëýD¢ÇºC‡¨Fp +ì°Ê¾^’aсêÞØÏ +þ¡€>Є38ÁdUxøÆØ\Ö©+¯©©PJ“v§“¾Î¦ÖEkQÈM›…b·–g«úkyeëý¹$dðÔɒúôŽt©ÔÁð.†Ýk\ ²^I +ÁT€SÑR{–]?·u9ÅÚtmÒÈpÖªQ+CÛ>7Áîô‡óëÊó{U«×üy&( =õ&Rv ¶“a֊*¤©I¹žD{l˜™ƒÆ(önÌ®<¶vflª•9ÅZõ[<(³¨• E´ó±iµP|,ôñê…þ +^Ùú]?Ù& ÌRP‡_À÷¯—Ô\RCLf´dÔ¨eûP)&ŒŒ%Û¢_(Â2A5•9Åu{’¥ë˜¯V6t2U[-”åyõñê…öµ®Õ‹Öü”r?øö ý›¹¤v[@»q#Ъ »åµ»Ôç +ì{õם«’+ªȎH ԝ084»¶˜nYÂ4R…t#k'pƎ螐ƒïЙ.{¬xnkéT.pnxGˆ¾[ ¹aï +~ ¢ÝH\f¨Xîd>ÎÊ-íiDCArO¦£8{îv’ǝ€V s…q§YuÅMILoâ†)ÙPcâîhÙW71@°X.AÜ åe£¯Âeó‚á>ù›g† œx¸Á]©fTGÂ͔\6âéÃ~;Á=ãS¡&yÄléNYQ%´PêJ5Èu­ÈPÙµ½½]«\æn¼ßO8€>¡"Êè `úíäݞ‘EG>ä6|üÜ·áá7*¸mað²oÆ +Ûf> ²ÆŸ ™‚ÚŽ³6æXl¬tä²-K~fhT¡$l`ØçZcµCKê*@»[!³» +ÉZ€«‚È î¬ñØÐÞ+{°')käÃ2©²61FÅö"Òña¬ ìÑjY@° ÁAB´þuì50èß%ô35sE^£ŽK^cÆ1šx¼NÙ؁á®ÑA´$Ø5SǸB] ó‰=3è†k^V0×9a¹î™jU\×ÉY ׇÓõ€;€w®âºR %ÍdR ¸:3ÙmL©Ï/CWªA¤kE†¢®íµhk*#ÖǶzÞ®¾? }1ÆкR 4Ú¬êžFPCZc¬EÈedM…XËþ<µÕ8a °.Ô‰.9jښ[‚«í™ +±>´Usðnõµã±ˆóëµ@¡±qø§£¥ÃhÉ2¨jØæúÜ\…¢—×S |s¥ºÔc@io¬…Sû#•‹üMJ%ëW«oô[LÖ¸€RWªŸÑ¡} ›è'¶€i ¢búe£zujENhá̕j°çZ‘!£k{-‚º>V¹Ì¼T´~¿úê°CÁO¿ObA;ËzÑ<œ ãó«.€ÓÂø44Ö/Q¨‹ Û s¥ÔÙ+20´7×B¦ý¡ÊEåMJ%«7;åàƒ‡`.ñ¤²’ ¾=岂””}<§<®•p±÷SªÔŒlÝÌ o59amtjÁ@zE&éí-à”õ¹ +¹>{©êð%æ£²~œ|qóü‹Û‡#'àà×՟^]ëóüöîÅ·ÿéúGk!v›ç¸¾:vpÎùÍëo¿º¾q}ûÐÜ`ñcÓÉÛxÎÎ?Þ¼|ø¡4qê¹¾º¿þóÍõ_ä±^½=Ý3ÍÓÈóß\¿mæä忽þîá[‚Ëû»Û‡Ÿ¼ú›»7¸÷D£zô=ÿáúæûžú¢¸ûËۓ#{ñLÏvº¸}i·?;zØÓ¼ùó5ŽzâoªyŒ–Eœo˜U…È32«‡ÜӒõ×â¤'ƒ›¿ï‰O¥ÉÒ@Åo-ÚÕ›œìøÛ¶ŽãÔeÕ3Ÿh —ý¤cvÔ©AËÉýÐéáÝC9¼{\&ω³Ü‘£gŸa-ȏÀD¾@Àék$ðMIp´”œ"¨à Ü«ÏÅ4<D® k¯’P¯áÕ²UHÇj‚žÝ;!¹L²½‹jFgÈt~îD‚©’ޝn¶ã9Ž#„©a@Èô …àoëH#TrÔÞc#†N 9¤Y a¨o§' @䢭¼]÷_Ê ðyȾ¬ï&»úsZÌì€Y‘’ƒyvƒ~ž˜z@¤Yy·–õ=a‹ìŽ÷@ò*_Ãñ­t± ±ˆåYÐXl¸ {Žî2m…0Ï5\ÊvMù­š°®CTÀ±=c¯N%f¤_”Z9 +Æ9Ëðdìȳº÷2€4Û úÍèf'µ½:Ùäéé·§ÙyŒ\)Ê*G™¥HœŒþî-5èØËøǀU #R™Ç;ꔍ¹81g›`j$`KBítsY“QGÞ\7›C…ÆVÌÀâÃä¶úØzÚRً8¥/'«Ó¤Wl LŒŒ8†·qTGMŸ5Ûø4Õó¢¾ ֝ºe¸Ç%ã䁕‘2¶Qa|8§·Éj0ð T@t¹ûLµ‰ã4A€,ž.9ŽŠ>1q©ä$tøêMžK¬W~m÷ ÓË؋²í–ðµtÄÞ!´Så>•ð¢¨ºï–ËpÎ×b´DDH)#ìV˜ûr۔°—Ìú0DÉC<‚m²„ ücÀ yœÄÔé DB=N:ðèæ³Ìø‰wõ¾õB~NIë¢51^1D€iª|¤l¥Ó=†š>0ì@ÉƆǷÅÞAgÜÐ|Î:‚.Ҋ^qšGdT{hl䑲XÕòE$E†gôzXøˆjžh˜H³+“;éTÜ×ùaˆ/ìdÙ0‡QÒû¨é\•÷a”¨{¥½ž<–ìÌ`)F„Yx­óÊtå"Xà95‚ž.LˆJQMo3OÈf² )gî©ô«ø}|úi.¯3è&B´ü ¾gº*¯'cÈì-ES9Ž#"˜R 2a̚k_Ä|övìKr*¦ÒT*™ÜÈPžÖÁˆw»Oö>t.õ‰`èS$ßB`OI +Ù8C¯¦ØnXHä*]š51×ôDK4«tÏMµS•Ço# ÛS„Ÿðbâÿg½;NêôõŒÍõº¸Q¨9˜‚<ÆkÓ±nŠœƒ³9Ä@̣Vɞ231\]xA[“õÍ]Ð/AbÄ6F¶”K*œæÐʒ<.J& N{ኟÀΨ0÷ǒ á¦öÜ´4+m¨™¿+ Aª½˜ÏQ€òü¾ k,G€L4ì^sfä¾!{”ForZìôqaÄÅó’s̚ˆmÀ«Á§´3E䜐‚Œ^ÆNkFǨ1ÃàHýûx嚃…€ƒÊŠ´X0 䒰T¦Ür·C53Ÿñª„ HPì8$dïM$†»ÃD†jŠ1ž @ʧÄS ØöØ©ÙÔHÆ[L<1S±r*¶ég›Ð&^ùE¦æk@%ðD»3*lTã™âV*¡bK*3s4˜› r荤ªÏS”ËÈ8hF Ì̌­ ‚Aqøµm¡†¢ÀQ_"LñœÈ/Ø}~r 2¨ üŒˆ Šfp‚þ¡G5L )6 óÜM†™+]µ+šŒ°™r4”)6OCŠ›aƒ.L¢Ç +£…¦oë™a˙ŠQ<«gÈ4fz®µ¹ÙC:â?2©X’0ɌBŠûyTˇ±Íê4@âmåüxNjq jú˜¨·;5šF]5€Tdº^G81©WÀýëÆ +…G–Ç ;³²rpOÄ癅 ³pœ™:Q3­øÜe‹¢VæÜ :*À’è^ÜÖ3ˆ §CÍõ6Jf¾‚&|c§ Å\‚Iß3G=ù†±h,e*=f}AÔbÒÄF F,lð•«*òÓD}jУ—8tì#<-"ic.«©„’峁¹“1Q0I•3¿M·GK€Â„¾˜¿HnÊ®Äö8aª'¶ì>Ès0¸¨NŒ ™°EªŸ(yªCúy¾,Õ!4/â/é¢âR)¯Ú­ÀôÏ&›$Íî2Làь©óìèŸ!ÖÔ°Á#³£¦xŒ 飿‘{74<76V„7ê¹(ØFF›Ê +¥a êcffØ^5D{\ŒÃ¨ijÉQ^DÞ$ΊÛ×Yl[)58}Î49 XYHz«ð? Ÿ¤š”ÙO´§úF堎 æKMÂ-CP×EV3ÁˆÜËúÞ÷4CÎþÙc¾[7…³~R¯Ë‹bsS6Ù+T +uJÑBˆ£‹Aé--¡~ç˜;% ‡¨>礮’îæ\¸è@C5–# +=†ó& ÿå~„uÁ +̂–,·-ÌdŽ-˜þ躇,Ȉmœ2g§mŽ;`F0؛±ÆBîÕ8^•ÚtÇÄ MêM“Ùg‹yMÖâvŸ¢QØ:äúÙ·4¸eJúTˆ;&užhúNÄnϖÌ|‚¨ ¯Š;ê‚Z8 Ü‹¦:Út¥hZ«¼ ÀÁ̝VG0ߙùŠísyrüì »c¡b"«F-´3çrh pT™·MuöÀ{ì-…H¯y`gc8XÓqÔ]ÃÔ²úvHÞ¦Õujv¼¦Ò<óÈΙÁ¹4 *çlþXÃ@í{ ö°Ï¦·‘«,Ò'¤’>ˆT˜:àMƒ6Ɋì¤Ý0#LÃ; }³®¦ÆäΝ¾ gËlNA†ˆ$Yª30&Ådƒu‹ÄÿŒJ4ÿ’F>~Qø3WŸ-ß2Úy“~†ïŒÉpv%c¿ýÈ4d%†ä„ÊÐHm§V58ÍFM’0ρW4öwF"m K€3z£)€FØ?h*½Óñ3쌺áPø¬¨!ږ…sþBë'ŒŒ£h@íxH„í<+œù°ø~Í]y´#ȑRšoR¨A²bF)ߒa;‚ @c5æ!Ä+v43èJD‘|VN÷¤h¬·Á$2¥öLe[)RvÀvªž\ÐO;¢H<¶NÖÃe0ª0Çæ`Õ(¾(»_œóCb"6ø':¨@1çàÄ·9è&eí!df.=¨†§lòԉ‹>ºÉT@¾@ŒðÉ ÷V—è)£§Š ¼ý¬Võz†~\î#±?»N·"P¦8ë¹Öœxv'Dl‚:Åû¤ G/ÈêÏLú&ÜÁÜ`ŅpPÖ§R3Sb +-ø&âšUŸ£uM[œÌߨ0ÍÌ cœÕçK§R‚º{‡Ñ'ÚÄ Ô­J[0+S+L§J[eV +Pj«0ƒðñ¨ÖaµE¨ ЬìÂÉ>iµ4ñ/êœÇ«RéÑÎúdŠr¶tQ4ˆAÈαá^çyW}Ðtª˜csÇ,£zõ̶ ÉI§¹l… GÚÜ@&£¡éR'/4ŠÁ™”äs˜„^¯£cŽÎɾ³C] ÑÀÓÇ¢/—d!L/‰-`Kk€À´§ÑÄ;œö={š4nÖX3➄ÝÁ¤§œ¿×UÂSí>îY „)Ôû:H) ö¶ÓÌØÄP½ª©yʦFÓan¨°úÄ ÞIN)œ‚ÌToðÂ÷x|w‘YÌÌK»(}˜´«+rS ‚Š H\c.\½ I6Ð!SGÅÞ6šÿÂ¿sÛ(¨ØbçÉEF™54ÓñTìA­ø\æˆÜ4ƒ¦Â4¨Qή¢gÙÿQk…/ çžìŸÄjæðN½[Qíº@`£³&aÊ5ÌTDÓñ̐@û ­Ðû¢ÐzÅ!€Û´(”g  AÇ>[Õ=êUŠä-BVï–pÆ`œkÇ+q´3Üe‘93ᢀOžËtœ«ŸDt7hÑ÷¼4pÜi¢ï¬]Œ³¦ºö6$ȅ©w°«È«±SœŒÌ³ÞÖ²3N»€…gÖ¹ÆԐСaD%Ä'eUTFsŒ¨%˜)ˆc±¦€Ç„bœõ8É;+Ð<Éï5‡Ük0:´IÇÁÕÉÞ„Tó5Îêÿ̍™fuìq¯êõ1™­·u>ð'v#½AzÒ3ÎDPNSo¶Å + k{_¦ãˆYpSm®SÛSY%NôŠ£0HìI¤'Ÿ·ÁwÅTI£=iannã¶óº¦ÏéÀÔlúÆ!TÛ8 'ˆ3¬pj¨‚‹<ól*õ7±k9âÐsÝûxö2z¥hi25 <žv!>Ç&c&ép±†I½Ý‘p®¢šfu8a¶×3è'Ûè‘5“jP%GṈ­(Rµ´ö̋Øs |:š:ç]Áèt*¿Æ3]‰ +˛ ‡•ç‚ºR‚1‚ÑÒ¤–ËIÉbÖäWT©ØX™íØAõ ~–͹ó°ÔùÞîÀîŸC€ÔàxmeHQGûdbìÚ‚s8X³ùbßIuçžÇÐÓLí¸vRs"Œg6R¢¼ºnºY µ½¥S÷öu„ $&¤< +2¹œéXNj@t­†^0µºá#Á´aÂÑۗxÈÔxN5qѬuQ¨é  3é&@Ïìù;7 n5ER.¶ ¤Qᤖy…'é6¤3ðÇß.'ºaÕ·Íôrz‡ŽGAˆG/Í~ˆ ³Þ0¥nŽ<0 Òð`Ê1SØGqÅàâ*욡KÚç'@Èè]Yy„VÑ~ÕÞoñÒk°òPÂ,~.‘î8EнKDǓ±ËcÙ …ð\Å%3báºÂÜGΚˢdýz•»–ëH1Š^È×ND`͑ŽAîx™Z aûÃQ¿…àÚ"ÏMŽPH+ϨKEóYÌtVrÝ»´TT™Ff!3m¡k”îOë¹U{,Ž1#Ŧ‰9ÅázÅsn¢Õv:.,”£Z€‘6FÖ>F2’ Á"$äÆȘ   vBÈzæ)ŒÚ|!™Ã¿…Y5c}=U!W„Á¦äÀIˍ³ƒ(hÍÎ+[*¶~†¨Æ“ñ’e±˜Á/ì\%¿R×`¨Þ€Ã }Ç+è8{Q¬9-yâ'NQѧLU¡·ÔH²${Ç.Àޖp.°é™‰â"d§‘ÈS·VWàÎ(F硵1¡_T…Ý Ψi‘¡ÔŽV=‹–ŽÈÁ˜/ u°S·u½ 8Cw2~(’<Ë—a§u{ʙpdô(_úVæQa8¯€‘üuV·0¤99Dû„ 3GU,vJd ¬W|æYý6ºÝ!š›½<«ÿ XVLÙaR0%™Âÿ8„Æ’*øú‘&€'1h8ϏNÂ<ª BnS%DZúÔÔÁl#³Ü)°•îA{Úo£ ƒK¨3 ™ØîCoMÜüo“‹^¸bBõuwH”¨ˆG”Q2Ë!–fÀ Õ5qóOf–Ä2玗L.ûÏ.D¥A;8±Nuú‘ƒ1h¯'Á=b)QŠ„Ó˜6ðÜ)*MXâŸ‘)›È‹Nכ¾ÏKÇjŽ*ðÀÇ­n÷ÉÿéGÊ®÷#A…H¨}‰pÛÁ±L`ç¨÷aáãH|~ + fKÞÎôS0§º‰üt16&ÅaÅ à6¢Ý ä0m97öÑ\ïözYñPo¨Kh ²‹€±7¸²AóäL½A¬A˜• ¨œ)(HjêUÖµû‚Z®‘®žG¤›çÅ}d[¬¹â6'å¢lr©–$É`””ÔDí‹2Áöb9pJjéœ:ÝC0ÀTÎoŽ®ƒšˆ„¦úÏ„óãLa +¢<ëɭߏ Þ9©úÏTð BRdvWÏëLÙïìtÔU¨£¯ÓCÂh_ˆ³:LÔ4GÆdL=Ì00Ç1–„#¯Ã¨ãaQY ˜ =x8Á íƒaò€@8ncîEn‡QB Pg@=¹ódUlmªG"]¾Øè(~˜¯ŠJM¼ýx}ã˜%Sä:$Z½øO =ÂÆM,΍»¢NŸbeg*à©Bž‘î8 †{GmuN†4Ðaw˜r‘±Þtd"} rƒ‚Z%1qpÞ L¹Z4¼®ICrô|6X›xø­úüh–· pÉÌîÀõ'Ε¢éRΜz¢MÀìî ª¬â´LPY=@ùÍp &V{ݱp³_}€q/cÿëÍó¯îon¿ßüj·Û¾xñîõî®pñ:άrqb4‹*M¯ Yq +}Wd­d&zhS†Ðs–º^DÜh§±Ó*AÊdmIKJga?t°U¤úĬ÷}=?iÂ)çÀ€Hõ¯PLä˜S¯ƒ‰f°t,ªw™lÒЯ}¹OuNDN‘PóêËÁÀ3O‰é)Hw`\cë …>ìT`S0G—Š³7€øêÎN7V ö!…1?©Ä‚ô¢ +9–ë{Á••Càù)ÕÀ#J}jÆEbîByV8\™DûÀ#m0i§@àŽëÎzèùLªe¢3[9½-±:¸oc½þxfUõ>¢«a ƒ„ÄÏ܍íí‚&HÈQí_L9 +J*¶m0/ð]lfcÒYT&`¼Œ€éLÔÆ&Èã@@ñrs N<<¨:É-z¸^Êîúapï}Tz±ê£áٓz'ËÁbg™Òmƽnï:ð„èñÎdÁaPüš†Ç'sÌvÌàfõû&Ù7̺yL½h¦%\EÆ LgêZ“:MZØ1;ã—’†Ë8–ô(O£PïÚ#+°÷ñl ‚²GJÐõXн“íävx@$ÄXµâ؄fäW0YIÅ°:B³·ËŠà=++däPÀê&ÄTóæi qžêEØqá¥iB}ɐZz¸6ÇFÚ8üÈ~4P“@F „{FÛwq¼À(›CëüՀÿ‡2œËڄLÍP“€–ã2³‚õÐ4¤0¢Öpn ÀS6å}Yx2œL“·— „D]4z0ÍH&|ZA|H׌Š‡¿+†'zü„•BÚ¦J‚ÇÄ<…6 ‚é<:aµ¹1Xs£ÂŸAÈ|ªQy pb@Ž¨ P1âÐxˆXâe腒Ú5°åfò1€T¬=3¶¢×»S7¼úŒì³È”ëí.#šåïB“ ÎÑózzó¸÷M( À\qÐH½,DO$CW¬»Ï¨9ª` OBª'zË@§%\³bL\?òxõC.UXø!.2œ ʆöÃéûÎu@¸þ¦ž‘y4ÙÑ—TÒ«‘2œóY òšYtJÇ +ö0f•sa©ÃtßnY\}IW X°þfÚÍ÷e¨5„¿cT1Þ³ ƒÞ¥+‡ rVo»w¸oÈê™çk a~`<¥J̟’õ‚Û<Æ| "•øt¢â3 pԓ™3žJëë²A_Ãь˜RÌ>ø‰+@1jÀԇ¬)Gªj±V$c7*ìbeTæ?wÄ)<0ƒC–0Þԁ5º¾9SŸ8Âtн!+’›ÇT –©‰ˆ£YÁƤ``è%ïi-F¼@§òVbyR÷ `Ĭ³…¾gÈj_#¥û©÷Yçf=&›H{Ê9ØnôLÄØënïÐ#ÂNè!1 ÷ƳrÑ_C§çíU€:OÂâäêÕSC˜ô:e¥¸“X¤~lñIæHÁ*鞇Eöz§š’é$¥1Ç%u¸ö”%fMZ; êpïUq +4ÂB;|Ÿ%ç©zÌä¤* +ß +.aëF¨Æ5…÷Ûe8’™9́$“q +ôˆ97Fž,tS°W¿NÅùüÓ«Œ`ø”yI=ëA·‡æߗ³*L(ãqAú*¶©žX"ÐÚ`.}³ð ´UtìLUÝüؘ¶gxo0©ÐJ.hÌRBƙ‚š""Ôûh«÷™VUªWýDUfdsŒbP-˜¨Oúg51zr¦¼¥&9};àæy>úïá÷€5ÃÚÊtmN æ\ÒÆ:8ã‘:Ï}I+Pàj× Kºªu*)‰ÅÖ«6`iýtKš¶#Њ†Ó sÛìâ‘û‡&ó€nSŸ2+Þ¢·ckõ6ìqùßik@^±àAÄöÎE‚Ú]YMÀ³…I2‚•280h€öÀ6¿Í,–È\¦9(®ƒfG;´•y'jðÞh˜„&¨êx?Ó§†ÙC08¡é® @†`BÏð`- L9)bu4r³Ž5îÆ8ؔ>ïÎ,ÁXt™O¢d»ªx†ö²\O:%3Ü1VÓÂòJÀ>À6Ž"×#ðÀ؊e QŠÄ¸F…‘0òhIµËú}:ÿcõeSè ¢i ÌvÒ9_-kÕTÒy j.ê-X‹yæxÞ§ZlÍP9êÌn‚Rðö€0ªE½Ó= ­!/-J-ÉõKj ª3N@Íc *­\ƒÆP‘@QГpYý4j’7SÞ¨¢5ìüÚùEìœ-3Z¬Šñê}<µà¡zæ%˜Ñ•þvh1ahôeú÷±Ç€JŒ5a>œ¤1*ÆÆào] Ž€÷…AßÉ£àC±ú&Ks/š¹Ò«-Ùó=ï±ÊAO#Dé¥Å^ßn41&”4°ÆBOj eðpœvÙuMjv}(¡ù“ ÁT:^°ž©ž6Ùë†f‹Èž,\¢,Î c3.óӆ7`Ÿôí(‚ó72Rk)ˆa°Á37&Ù@¯Ép¸ò¢…ýóˆ9-rÕVù¤¤¦gœ°³‚ºyŒLäha°~‘ç jøÑÄÜ Q=rüˆí2Zz »+i¸J44£‘ü(|FË`,yŠ Ý —£FÝð*l[4Þòœ;3öÆԚùáӁãEN „C»@€o7«:êUL©6Gf†…Ãä‘ÄACíÇrXú`Èoˆ¯à }P,7…Þ™Í"óPÔ[˜Cps¤¡2‚ÙŸü>n¶%‚BËR‰† 4ÑásӜŠÙ‘f_DNfuj›ó9+¸Ô$œ f~€ ‰Q7ïPb{'F6éä +y0˜ÃŸË zlœõq#ó»W‘Æ‘‰£……ði ҏú™ €`1€&àô:¡•¨4 £4X:¦AÃˊÎÅ7æœa RÖxM²oF†ïíÏo·À\pb(hg²#1”4À° óTC¢GkÌv<|oÆ:ƒ: fñ·Ó³jf}ܾñ>t ƒÕG嘘ú&¿M:ÍÀÌ4%è´LåÄÄVˆ«tž¨)ÐÆ`6çb6¯#NWD}Ó5ëÒÜJT°Ÿf}ÊNí»Ù2{Í +ë!a]†~q ˆË¢ ÂÈtÈ6tk‘ýgÐ +À¤OC²åғ©†IÅãX'õ¢rÇJ±dë >5—ƒm¾ ̃Œd‚yÒõ4ª¿“‰/°Á1ÅVjqjé1hGFí±èЋz„Ú©%ÂïÝYX:%x4@¯§+ЈàGÆÐ×9i¾9¾4Oº7J¬°æâ#Á»œõ²9Y·h4m=7¨Wӟû )–¿®Â¤†å.q þƒfoUX˜ š-“nGð±r à4¨ÇápàAuI¦kòxIôt23-㛴ÈF“2%¿ +÷ÃIE(!æt!äqq›Q™63>Û€ÏËQ%®B09/ëºóËþ?öÞ­ç–ä8ϼÀÿ°/=4\™••UyiïÑÀžÙ–ÁG¡i¶-ê¦AÑCøß{½‡ˆÌ\ßnS’7_è†ì/vU­:fFF¼ñÄ8$“CyëÅÓp,³´>A]FØ/àõn`Áýxêš!~'xLî ÖãÖð4Àç{v?öt)K®Ô¡¸q3•Ãã÷î2 Þï–RVèøXôO€Á»t AsôÔ{ à)\Áä!’QÎÆ}UTŒ{,BZñ1âYq´ZÚÝ~±ð7Wˆìv_ëp™¬VZòñ7áÃp8ÎÄTÙaA’‰­ÙsãÊñ6΋ß/ƒ1©*ě)­ò‚.c/2ç „'äyœYó/~ç}îתÇeÁ@ñqIyîÇ[ +>fVÒátp ÖeVÕcB/=¬(MŕMþ#f`R'xô°úÁhDÌZXœÁᆊY?ݱ·N­bº“b¨1äëFmÑ2 3 ç÷•}êñ×?¬ËREæV²ÚÏ>Ò·ÐNv½YÀ2‚Xç0_bqsÇìÿüYÎößçhÿÛÐÃ?‚ÿžÄãý» +é62¾^èσ\»ªèŒ 2‰Š+ýøJpü­oyd³áÓBµ²¢±.Î'ÉÇXÚ¢˜0ÀÇXƒaݳq!A&òÐØcü³ ê1þFa×F=æNr 6Ñï@ßR;7â1¤•/ð±\H Ä;¾ 0Ãç»àŽ¡ý.íLÚ1ªE)D(HiÖmí°ãÕJŒ/º¶B¨ãv±»‘Ž[€˜ƒt &?]’7çâwÒ13}Î2„¥ NR ãË3í:†TX!sŽ™†oerŽ҈°bŽ AåoRŽÙÌéirLu@}ÞÇeˆãK Ðóïþ†7¦qŒI7ÆaêsM¸ñeÁÛÎ6F÷$r<Œ6†lódÑhc,ìĜXÉÆ¡iM°q7ÿ;¹Æ]%s;Õk…óšLãnUiŒiú(o@cÎæטZ¹’]Ì¿©¼|6X—”%ØŸýì»í§ñ^ÑŸìSˆXJAõa¿6 +r1'qTÙläbYŸ–€ahHzˍyº˜ïÍÓŁÌtÙ©—^wn1V(Õl1@T-YB‹¢he6hñ@ùw‹¹vzù’,e^+¯F|[+ž…‚VŒóÀAVX1T˜UŒÏàÐq™‡´z܅T‰'†W?¥ÓUž„wå'MŒ;Òš˜%ƽ™Ò)Ô_‡N½¹àcã#_ ‘@p‰»U«@]1ƒýÙ©ÄH4Ž9B‹Ðõ˜™ÄÄß·x×3šÀ 3³}¥€Ä­‰C¼ñˆO›#Fتӈáq]øø6ùfV©öØٓR ˆß]¹õ´œ“øSû"FåäGƒ°q±)%ý’µ¬bò4Xߨ€<“„Øñöc§ªŸÕėµ­A Æ/‘øo²ðUÍ[ùÃ,“RÌ¢f‚ÙDFòˏ>ŒbüóÉFU»î‹2ՀîÚÁÃ`¨âý2gøb×àå/ +ü6è0 Ә¥‚9Œ¿]iÉHþf©êJFòdŒó«EՋ@‚ùçŠF± æ«  ¿V^¤~l};ONÖ0rîp5 qw'³Sñh^œÍà cŒaâĘaü;ÆF¾xÆ0vpÜ1|5y6Â0ŒüÈÄáKx°+H“|(›º£ƒM´Kr0nQ›ÜàƒÃßF ¦‡Ô{Bƒ¡Þ<ÕËR5y‹…  ð/æ$#!Òúqšv^°µß FPKVpµŽp›x‘SÅC T07:ë$#Эß]@Á·Æ¨äw$o”à0$x(6`ü/ø«ô•Dpµc›xí€àü{å‡1ðÀ¨pÂq“ìWnƒæ±[²€ChàƒËi}½Sy™J¨@\ ´šhàƒ"·óÙÑÀø^Ų6ø;ü¬èµ†, .çF9,e.Á†vމf`úºv20’ã üzo86&˜ëñó Œ‰GI*ðA…y«IƨÁÀÊFÆ-¥ãTàƒtn)ì8øxƒ‹TV&ø0°/ÀޜÏNFŒ1«CӃyÀ@øÚpÀ˜p°Œ 0( ,”Šú „¡ÎsgW÷ð2 +˜ßDH€¿á¹n `è¼îä#Ù-.“¨—‚F+ŽˆgAÆ­–ž[At%ÜÙÀa ðÉÑ%À¼+—,Rxˆ¢ðÚJ ŽÁÿÅ¿XºòOGØÿ{ºÆ=è¿ÈÿSAµTàՍlˆÙ¿4kô/Âô÷Vò/üŒ@þň‡úŽ`ú^ˆ$`çüKgÿœFæ½ðoü½Óhð£äþ¾»¹ÓF<Úà³û«F'wIîo¡~È\z®¿ —·3 þ-Ð^Qhà_lG _€ÑKóíþ¥¹˜ñ.!1ÊÉ~ ðoayäUßÀ¿i S~½'–h÷˜Ü_Zžò¼qqÀzÞk­¦¦)AC¥GíoÜ_¢àÏg$÷{ž ä÷—(Û»œoÜ_šÙþ+¸¿øçîûËÿè­¿aEû=ωýå>ϘØ_þSñ?MFXEîÙ&ö—I0¾$ýå"nÃþ"S%Ö°±¿¸Wû1öW¯Ôö—ºÚ'õ—˜Y@,‚úËöƒ‰Î•ú‹_x.¶4õ§tùÔ_¸ú[j`ƒúK•Vukle°¨ÛõúË]YT4Lþ_ÿ þÂRžÐ%õ—´\ÐÐ_„Egê/ã‹ýzƒþ2Q§ïÊÔ_†„¢6õw¼þŸ q6ê/0ç•Ì_ð'k¹'òÝÉx¢ñV¦ÊøËÍú5y¿8Ð;ìw¸AG²~ôR‰q¿¸N9;îw AûEńý"'¡²’•õ‹XäaUSîu7“ô‹¿k½Þ@¿֜“òûØeJÈ/³&÷xcü¢~ýêe"~›S¸±F )»¾!~yÕõ(“ñËÇÇ2›ÈŠ|nˆß¡šL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK +*"Ê+Ü·P pô„û*0ïԆZÞZ'ît_jÝmÕTŠ€§'ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿiwÒ}•  ˜os +ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥<ÒM¸/»STä)UŒÂ|v¦ûò¾°`pÅûÒ +Ãx_fíì¼/ L]lx_Xƒ +ÜUë~‹.x_˜}Xñ¾TnÞWO¼/»»`,¾/F¬¯v¾¯´œ 9üÊÍXj¾o©N–l€_X¹æÀ¯$ŸÚìÖ(&-ßFzÁ÷¥!ÂàûҀýøÅH.v±¿êà  /Á0h1hüÂÊÊáü²[Ï3¿4`ìÝ¿²># ¿<«/Mø…ôýðËX°áWe!¨iᗽa«¤“ð«fjWKÂ/úqJÂo!#STÞIø¥Ð{Ü%¿¥ºlÄ/ÿæû½"~im5 ¿Ò‹Wå›oþß¿ˆ¥;¨$a[§¡ÂH~¥ý>žðKÿïªú$VEº;ÁøEén;ãæršèKÆ/,ž¾Ìø¥%ò“ñ[²ÿ„¿ÖºÌ÷9ô&o,ßÛ Žå{[$_ Ø@¾¤º¶39¾ü[ÀCF°ïFÚa£øˆ÷> ¾ø/M0|'äwEøއ“£FøÞnM_†ÅkÙ¾Èìá܃ߋO%äÁï½£ñÊï–« ´©0ÖI­'¼·W ãWv/m¢3›}Hƒ4¹4¥K½íRŠ îØÙ¯äö"¿ŠŒ¸°½`Ž»´Q{©yD=¯¡½È«Í¡˜½·—–²—½oY+bo÷:)€½8Pï7^/OL3ãz»WAë%‚ "¨ÖËj7¼œfõ²&J%£zçARov/5¨7:Šùu›Ó ºÀôÞz7~ +{Œ¼¤b4.tb£Á…WzIC²môŠr8‚Ï‹?;k“Åç}¬¬Øð¼0Ñx‰ç…ºñû ó7Œauƒó¢nâàՈ͋Õ+w¸z:þ^ɼi3˜´œNPMJâ¹`Ù°¼Ã¬ òbY§æ´V@Á•þJå…Uí£åz’ÊËÕ +§ÿ•ÊKäõ†r„ºÆT^nAºÿJåÅdÇPqPyá‘VqYV‰U4þÆäŲ ^q0yyN‡¶R}4ü‹ÇÝY0ãÒà„F÷BÍCB +†â€ûܙ¼ò0ê“L^8Ü“—6;X™¼tÓxòfòD:˜¼•ÏéÃü1™¼ Ö¡(bcòÒÊ,¢™¼ +áÕ;¼ ̱teò2îÙL0yÉÍàáÅäMïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8í–áî°fÛ¢‡f’Wñ;«Ú~v‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Õ½1€"/)¼6"/UöMÀWá;HE.wy…©c'òRùHíB™ÊoƒÈ‹GɅÓFäE +V§äE™Yתÿe¿©Ç eU×÷H×>-F‡€ñ2JÕT:9a¼Œ¨ô§&7Å´A㥁­Ö ÉғD‘ǹ ß q-‡æÆːàEø¤ë§°ÎD°Í8^³JÙy¼ˆö°zÒ8^ ²‘A°vDiü ãE U›(ÞI™»$Š°ýçÜA¼°DÏH×Ïj³ö$‡÷öw±ax¡²CþÁ^ü‰¾á…J õÆà½Ý¶'¼7¨õJ/"9ˆlÞÛÁÖàïv¸˜GIþnwloÃïòDL‰ñ»ÝAÃ ï’ +uïì]6‰êEèÝΨNpw»3v·›E¿hP‚ÐOPwq꧄Oè.ûW#igæ.kÔ˓ÈÝf©×FÜ¥ `Ü ÜE I„ž‚· èUßx»XâÜ.ÖhH´]ü '~ƒíBƒð~°v¡ÎBn(P»@ö³‹QD·³{¡¾4»Ðâ`Ž!vaDì.»Ðð n \h|Ìɛ…÷WS>$ðº—zŽ.û¼NüÙÙº(¥§Lݐî`uQUCÉö +Ö´?\ÝË́«‹Š ,‰7ª.ŒøŠ‚ª{yÒ ¨.Îä4œ/Sȼ#ªg¤.œ· »ðYÀT8Õ>gpp½\[¨‹ÞÛà颪® §;Šwf +˜.$Ëäë­0]1ìK—5E£%JlûV’.ÅÚו ÝázptñwüPrt™8,غô×nŒ.j»Ú(º¨_lç¤èâ;GÞºÈJè5‰Xvs>´¸¢gÕº3ti}ÔÄ^ТMËH†.Cépo7ˆ.[¥#Ö]Ìû ûD—ÄùVˆîŒ‰/§8(º,Z@°c£èÂՉ—C3xîPPE7óÅE—{+ݳ 3R`t?xv3(ö1ºÃ¹®¢‹ïa0†ED|£xƒk¢a¥ÑNÐE-Áánhª‹ÑâËü\ìÇdΆÏeåæ)ÿ›ôÜ܀â26ÇûÏUeD«Ë†èۅW>é¹3Ñ´âséÃSWø\®˜Xhz.#†Ý¥u“Ë¸a¿]8à€àsª" #„ܑóbÂsUôÔOIÏ¥…=|7z.÷`Yé¹¼pL7¦çæß=—áddàƒž«zæ{$=—I5–V¬ô\FàÙ:ð Þ!ÑjÐsé.ã mô\:ZÐ&=IÖa…Àø°°r£çò¬Î3á¹,¶AH#๬[À(»Ásiå×nx. m ÏåH‡Â‰ žKÿçð\*¾Ò€çÂ@ýFÏåòô ‚ƒTXO>—ÃÆ£ÕÄçr¹Š{ø\¼å¬Y|®2Ÿuìø\‚:Ћ+ð¹Jגü\$ 8Ülü\ÒRš;+=DÜ&ø¹J.h4›ü\Š.Píü\NñrÕû¾wÅç"Á§{n|.A,P4>[ð6mø\è3ØÜ>ð¹Ì2æ<ô3Ùº š1“ž›ÁÙÀ¼]äaø²l]X)£肿D"ºH1µtI€ÃÚ5º0ÐÍ ‚. P¸n]2‘šÂ՜IJ~.÷bÙÏÊÏ-—}»àç¢,˜‹’àçªüFÏe6­È¦’‘çÜä8¨CB¾¿ÑsaՏ™ž[:GÒsi@8f£çÂÚðÀƒžËÍxLÏ呋ðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ…*êzî]$ué©åfÕ  èNà +ÐMkt Aip“ ÐÍsCè2;;&A—×È£A—鵪ү)¤K»`è2¹†uM0t™!C ycèòµÇš– ]s#e†.ÿ+Ñ ¢K¼\é€è2Y¨î«±€Gh_áÑ%ªñ(R”ÜúTÔÎ< ºü¸œç^;‰4z†èâώôb@ta¸Xš¥Ê°2S]Üǖ/¨-OU*×]怙¶Š.”w¬Ü)ºxà’E—D„[dIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±=ƪòEƒüu¼Ñ……1±£Kߔ)Zct »/;*‰Nrîí*WpîC.ò²Ïͪ« æZ˺Ss§CLÍE3Ñ^ÜOª:°2s¡1G~×Ì\„×í mµàk#æÂ0€¹ˆOârQO€Ùz£åB®´”`¹ø[)Árñ7êÌ6V.©Ãè´gT.÷x}òìܤ|#å2Z4%¨ÉYLï¢7Ð?²…“ ý UlÏ¡Á? ¹ggÃõ• ɟä²'ßq&°A„¹w<îi½DÒq!G7kB`@ˆa‡ãŠ+ظ§›$÷<¥ÊÚѸç N–`\$iU7ép¶ÁX±¸mXXc*.CmãL(.‚\#¯L\Ä=Ú$â¢êFó³”4݂±‡ #SÆáb'Š¡MÃU,eì0ÜËb­`á^nL(Ü+&¢…„ ½ £÷áB€XppáQâãÜ0¸»2×f +.tc2pQ#‹5ó†ÀEž¾¶àâO8‚‹}ðnü[ÈtªÛܱhý:ûô[¨Êªð°~‹‹D1J°oqø9Š`eQ_¹ØE„O(K& ˜NoOro»‘ö¶»eCPo£¶: ·Ý0…yË®gKämȚx{ºª{#ÞB‰XÅ”›®¼[Ä}1èn¸[:ÊHÚíåÖR»½,ÁÜX·0"f¨[ð:à­é¿TL¾Mç¼¹¬ 8·ð¹à×æaí rK}´f܂ƒ‚ïȈ[ܼ_áFvM1à„L„íƒo{:ñ²ñmXx[ü8ñ¶øA†n‹[g5à¶g·NÂЖӘƒ m‹(Öé¬ä´ª8À¶¨±Â§¸qmYü€€ý}`ª-’¦ýޙ¶ÕB0mñ7‚›´ÅßÈBoDÛÚ´øK mó $žíÅè g‹ ‹KÊLc/á̖:†çÚY¶‘-«Þ0w‹ ’-"Oˆ>l$ÛÁ²û2A¶M!·äØÞêý°cl/…דb[<§bûH/½1lU7Paûðmžۇ¤Œ7€-Ø„ß›_û¨dÁôÚGš¡7v­d?‰®½-Ö1¹¶º>j'×vñF\kYlrk)b~ÇÖ2œÑ&µV3K2k‘q-ýY‹˜÷XµxoÙÂÄZê}Î7`í)/'xµÕ³wàjY }µV H¿“U‹µñ„ªíª5yCÕ¾žAkIª½K,ªÕº§ÕT+1Ö{Õ"PéÞRº, –:IµÌö_²Þ_QÿMCúà{ïcêí¥n’j!\À+ ÚàV§É4J@WL-Vöp±‚R‹Šq¸³©½\¸1j1@ éEÍR`°6µøûÖ?ÏÕÇå|ði‘±DÈ?ð´ä´ô¶Ói/xFp€*ŒˆVÅù²‰¦}J¦fiÄڛ÷Až`ay¿qia¼˜å<¿‹r݈Ø≲ªJ‹:fǀҢ.ˆá3o„d]’öy´2$-Y¬Ï¬Yz0ol@ZDñàŽ„±?’º6þÞp´a ííy8(³Ð bIº±h¡ edÅƧ(’$Úü{ц18´Äç>#1´÷%ÑÆF¡…Œ¶ MK!!s-ƒ–Ä9õ-[|ÈKÅlA ½­Î Þ,^õS;ÍH3®Ò~qDö3}²½®Þf“?‹ Þ©Ø$Cü»ö¤Ï2fy\;|6|aÁž}Ü})س»‰oèYIÛò,3°âÕrVd†¶Œ;̤ÀÎ>uöñ¹CgÁÆÌY m‘… ä,þ® +QOâ,åLàìÀ¢ÈxY¬QµÏmÃ͎ÙUŽ¥o„ùö°YÖ½”kgÍÐT•zŽ²>’iöñjpÍ>¢i%fvÄ¢'(³¬Ls/©E&M˜®fÌâœX9ˆYÔâ\†ÓNÄ,bœÔ*40;±òeŸHn/û8Ù0Ùøä7¸,$ +;.ûÝÁDÆÞÍd¸ - ¾ +©ƒaEÊgL®,ÕÒ÷xÃʂ4°_Pe‰q92q÷1«vSÈ|³pWлCþ$ʾ ªd݀²Ý1æÊö#*M]°œ†);bÊvópiŠe'ÚQ–bnæÅÊm²GG¤¹Bl'ÊBi¯ºje)ÏwÜ·k˜h6S™H3•Óãџ€#]Ҝ¢ßY²—‰’EŽ ÄA’¥l‰yç•$‹Ä&V?’åÂÊ[¡¨–°Jç˜Sý‚©Ów€µÉ­Jˆ•Y,[“[)² KöRç‡AuåfÈ6Ë7„,º$ê̝ŒÌSdßݙÏßÜaú‚ìߍ Ën]Ìbԅócš)@ †°+×'59,CIê誅`ÎrFóqŽžðdýÄc¹D¤#rdÆ·ÛÀö}©) áU%'>,(«¡ð”.©Ck«{ʝ¡ fBÑò˜ å沧¹ïŠNŸIû9%ÈcÕ¤š8¾˜WÊbHþ˜F% 9…/<>xUw"gòÉëS·–¨‡£aâ@?ì4®2ØËñ´Kž:ÏÅ\9*äV Y”ÔA „‘`9˲+ŦÅu0¸ Ö¼ì_j‚‰ø“M° +`³TÊ°"‚|¨C2¥¨xÄÐg°[qÊÀVâ*ù) Xí¥ÞÇXvUŠ£ax±³=6hk}ríµ¡õ5‰±ìÏÄå+`J¹øR']«K¢­¦,¼‡á¿)§e‘íÜO,8‰jő ð‚…+%þ$û3ÂÒ£NN=ÅNý$ ©øÐÙ­ëps1.ªêí=3S•0lÏ®–Ðþ +tÓ¥½…EªbDܟ@|¡ã„ZãQÑY‚N¡ÓÜÑôqmn#¸ó·{—ãٍ.«ó{ o–’g o‘]9#‹ÂJø’`©ž\I&>_.Ôñàý¨¼UÓ'ÚB.—Çq4µ¹ÆG%Ïlq=Ø¹Û Äðñ°ŽOq-H’ˆ”>Œ^¤å¾µ!ãÍ0 ^YX2›WšŸ`¦OQƒ@ •¥ÉøiÉòy”ð ø³$dÒræÂ{\»™†¬Hª‡ØóÀ½’Ø·“čq‰\‹÷Bò®{½Á4³Ðs¼7|(ZÃ:œ½× ãÛæ`ÛujçoE¼¸¡::à706ÒÂR„½k¤…ŸˆQÒÏ(zFˆÅ£O†Z@1`¨ð¥žjþÈöÙaOmø˜ÑÇÇËNAXe°‰f„  +NŠЙv†LC“¡‚?KÞ¢cˆòUMö~ª0ŽýP%Îp’ü}<pñ ÃÎn 8WHž Ëë‘Åy†ò ¾ÊâŸÄ‚™0-08Fqg@Fãø¬ñš`ÙÞ2G3;ÞU«%Z8Bó±OŒ»«ÔZ¹+«*ifö[ª9n§ÛayÔ¢Šrã]«PllĶtX>±KðÃlæF-EYTeUd¼oJ ²,ñáàG•F%‰¯¾Ž‚03™E0;þÔ9`’!ê9ÊÍ`9sæF­'€î2ãÅî"HóH\»qzš°8ÏäˆMÀ{¡« &z²EŽù8J…÷–OF¨« ©«c~L„"w=z-J æ»P…ðŒûåzLf·êòGÅù¸îûv¹šýŒ!|ÎíÐ1 Ât›²”ê¶Z"=õ€àƒ‡`ö‘ÀO &@ QxëD¸ð €lÌUkÖò€J~ù +Ød®0zWŠb½DŽ›‰/ÁWƕ¶t&)7}\3þ}zb—5ù4´ðQR*íe7‡uF]­X¦ãŠ¤Â.Í=ºþöÈxÂL1J¢¸¡0Èۅ@õd„΁™XX)2ý5XèŸâíÅ®QýʅxQ¿.áw^KuÖÙL}pl±ßu¹Knˆ ­dFeSLáîô//‹„Q–v¸Õ‰š˜±K\u73Už§$×>áÃ/êiâ5NÒôÍR8pלæÉÖ¼uDÙ ¢&XX&Çm¨ªFUÑ}§¬Ɏf áêù +\æ¯.–GÔ¾ô¥Y”ÀŠ³h—TÍ·h4ŽÂ6¼ÙäI¹[f5èOÁ«ŽØÙ÷4d%¸ƒM¤ÜSËm¬yËО\Á"Ø›Ø?z6œ”}©e=ì¯Bê#5ûãjખ\ÞNù΁Kßó£ä6-\‡ßÀCÚ¬ff†«å®º "âý†ª?Ù èQ#Xõ ƒåšë†; õºÞzGï t㺓^ŸcÉ!ö_¶¦Þ3¡ÓÇK¶qõŠ‡5ÞÈYV€CÚ}i¤RÏÓÛ¡Ò¤_Õ|E*•‡øя—¼$c™'›JRçÙhLÙ]t×y‰—…ãû¡ w¥J 1ôùÝ´ރëóJ3Á¿°FëÇV}ßzåîót³Û:p}ÞMC(ÓbPŠ¹5°-Nˆ5%eç†h§ÈÉòŽ÷ñȖ¶«›Ò¶r¨­hö9¨%À‰"¡qò+Gú«b¼†È2dÈôaFдDp,7¹+ƒè"æœÂò©G+^)uybÜ´Vð®á1REs¸dW še‹”û±ÌÝpÝ^jÑNEØ W õôÄGSúsF”? +óeú¡´Âð1u#ºð~w1j6˜6DÛUYˆà±D…²ºË»v™Ô.H%(92åù<‹´œ*+÷živ)!㼌‚ 5SЂʍ´Å/~øysC¯Ðèg‘29-ÄxÏ°^&t“]ȟÀ×ϕs¾½@ÃÀëð3½¥¤QÓf5z!ÓH:äSaI ð®]“&à@޺A•¾ª|ai“Õ£ª.n¸{–zuãA1Q ×.x¢s…Ž:•ûŠ$ÜNn˜åŠ¿Ûæ²»Ïñ2¨H Ò8}j[ۜ\z°P„èÄ3bƒo´±D¾NÄÓâ]©bç®-cqñ¼Ý*3¥…<ԎRӇ]®"Ýe~jEŇ¢‡1ðýx +¿Ríz»é7è8¹l¡€Z ±îe±& Ô/ƒ·Þ¦"NÀ£`U)$†CO ‡ª`WŇPïȘBþsaêåu³S¾‹d©b×hõÇìy ¸€ì}úM¢ïȸáéx ,xzï…ýW?è&Ñ;µü":ãBt&r@J3aTÉRÊæ/犻Æqÿg&ç½q0U€7†> + ‡`1å€+ÌÜS Vž;Rüš³óÄS]:BýâÚŠï{¹õș+BI´Ê#°ñòC܈Sí~rg!<ä҂¹î[­öfzOC®ì¢OŸ7S7g•AÑý¶ÂÄÑÓÿ ksrŒÝJNå©ô:~XÌÕCí†7UÈ ñbº²_ˆæy1YÍu«˜4Äñ·ˆM8kùß Û«§u+ßC¬ˆA¬åõÒ0!SÏgFNaUhž î,̉ÒB&J½NíÈç˜{Ry¿íI8¡øo4“>­ÈéUÊ)™À Ž{[«ª¸‘ˆÂr~Ñu‚O†w´bròªÌnªgkn•Xò,ZÈ>a–TˆWÉi·–§ÊÂw–Ù0FÿpD¹ë©W:hp‚‘š—z…¨…?Ê'ç¥ÉÒùÐùâ_¬Ã%3å=]õ‡GÏ&1µ@ˆJâ?Ȫ(¹®a®]IçuŸfmFS@üˆªóÊôrÑÌ3ß3±†r|FT¢Èy©‡Då°<-$0s]C3"é°¨Ý Úî@`ßz%£Ì=¹Â„™G ò +XèÅòG!/”%4d•ÍY ømE uFíÛð+Gû-|n8£óPd¬ Eшˆ(ˆø+ð z$YÂp‡Ã£¢á(H$8“Neò%<.-`VÁÒk›{RÂ+ƒ…Ü®òc¾LÀ?,o¡%û>ÔÃ=ï+9b·Ò?5—)ž­ø¤ïÐ&"¾Ý#—A8,{Z3| +«~ÐíªÚáǖ‹Ú ÁÈ:ôW®Ì Oé0uvïy¤ÌÌ=YWRéª3k' §»¬ùƒ¥Ïža„¼àá!ÓÀ„ Åè·S 8Ãy³¥Æ­+Å ¸´'Ëpù8«ï=&vê=NÅ'™H¾(‡áâj!¬”S'ßæpZ –k~Ü0ßÌ<ª(æ±V8=0×íYób³¼Çåˆ:?g¹0îð!ªC¥Ë¬†Ì1ÏÅ‚Df€ŽKHü“Ú<Y3rüCÄÂè®Q•-Á¿?´D¤¡7wB.Aï¢ù9µÐ.8ÖskCƵ+)>Ֆº|e„Çñ^Õ2œÑijÍd)Þia„ŽKeã~¢vÔQBÇoI4 +žá±ŸÅŕTNŠ.•H2°ZýE‹[ýXʏÐn3û‘€kFOëqÝF¥¬¹jCöŸá6ì*€ 3æ¡©=hWÅ4 ýfwó=šÕñ·Šíˉ˜x®î6,kÍAUö›i¼Ó<…ÙH¨«5ŠõI´Ì_½ Ñ@ÒR“R Ÿ$ZæTv,ëyáöځ4ý†°Uðk°š©ìzD[Ó?–‰ó®¡OÆp%~B©GÑÆÜ{eè—N¥øàûðõ©®Ñ6¡2ò Ÿ•ÛÙÂÀ,ärW5ÈCµ_¸nX%g‚vëG÷¥Ä²ÌÀTÐreþz³µÌ`Åס ; Â"Yz†/î®RIèE¢;†9gó¿ows7¹ï1÷<ªe¬6ᜡ¬kPÛÙþ,™°«ûPšÑðP“‡-Él˜/šËsì¹UœùÌõ^LR +GD2þ°ÈX©ïØðnqƒ†¾[&ôTZzџÉIþ³¤„(J£Æ°›ê‹à+¥?³0øÝ5JÝmnÈ\«Àû¡'ê]/+ý ±gœ‹°_úe{L + ƒ}.ó=çvƒ—4(,êOA%xi5L]–ä- +àD½§Á7÷t2`nçº<;¦…¡ùÄ/Lsó|x¹œß°/̘ +Ì^ϒ¨V®µÊ:¬‹_qáŒùøî_c 3=î̌Ðu÷v’b«DT÷c!ª,¥@ÎeðÉÐfâsAäAi˜psõ¤pr.ê\ñZ|¾,I£¶€6ôD‰Ó‚õ¤þ©F„*CíÐaÚ(·yυ%ˆ ie£hm§Ü/)L’«vêtU …cµDV¡7)ãRH‹ÑÙ`&÷RȎ¡ë'¾uR(ã2!µw°­ê'5ÔbŠƒ ÔÛ/ïÐSó[9Ñü`:ú03&/X«ƒå\wucƒSý‘š¦$ Zë¢6«ô`Y¬ÝŠÚéhy3JBröÑ®ÂGqñíKuBfoèÅ-ÔnãÄXÑÎ^1 $âé9”¥$ç?`aí{“úsåž=Ú ÝÂA –Ó ½¼ë±ÊrÝÔ}Óë­·Ai7ú!eP +e–ëR‡5ÕA*ž÷—ðUÊ[ÌÈN‹‡”æ>:¹áÔ éf·U<Ô¿ÏuÍQL<Èý4n¥tš³1"«3îy¿+VðsJn/c”(GàôÃmrCNJvÝ~.·½ØR¢Ój¨îø‘›‡Uªì;3vf6 è +/XÆÕy˜æ.é.5æú¶µè’X'TâŒË–{‘PqˆŒÈ! lë\¢!0,ƒ˜lÓٖZx×p®`AýCÁ +•JT`äbǐš{úïä{22O*%kl“áàP^'՘ÐP·ˆ•$ï6ÃËtĊ»hàžÑ%žfæ¼YÙÏ0c‘C‹‚§ÅÀïӃ†;IuÏ©w‹Vc TOQ;ü](´+ôpwªvD'ÀH"ŠÕß_ìsúiL.3£œŠlw¹×?¦™ +†Þ-‚cðóèVs²AFXr©Kìųô±‹k§¨¸/-ñô΀«S£=7ÀÓN'ǹäö>¢â@\[¸ùt¡s•Š;7W\…mÖ¢\{¶YV{ESIüU°(W¦ô Å,ýXb©šúXÍ]ä*²¥¸šVƒRbÅ8浆O™õÆV½ÕTžT–à^J×qՑ¯ÓIg.ZèDBe£¸ðáqÔݜ÷ÜUž`à”(3f·•Ó5t´‹µþ>".'ÛÐ!;£`Û%½1>WR4‡c-1®©A ‘0¦Ã+eBó†ôìÊd—ùÇx3à ¡r`ÕK¬­9¶2p(ÚtQ)ATE.Eg°ªei£RÝé. 9´‹¡^êS™íe÷ÇSÊüô>a¤žt¸7“<‰€Áâ,USõOîʲ`˜¹Îd¦€¿‰ ™ôàô¢=¹*ÎñZ·‘e†¦tóü)¬gç^HÑz*å@{ôò²k_Í.˜$).ÜýögJ਺yw¦)ÅM¦&è9Š\n÷Ïü>²;úï''ãòØu=%Á&©.…UúçÛ$a†)/¿ +êUMVFwQFÆqæ#DÍ6°—¾IöŠãò¼)̜¸èòØh¦{Ϭý£õ4•­‰‹¥]³œ¾¦dÑÝ¿´IÒ~©cÒ»ß:ãšß;M¾A0èÇ0?*jáéÝZfÓқ«PÔ=|,Ú/Æ'›ý6µ‡¥Gpûr uݬ»fAé3|ö̉ðWe”x3beÎ6,vlºZ˜Ïí¬g͛ֆ‘hìê}÷9v$åLU|¹4Ñt¸˜ÄL€ðÁ +7ûœáƒ7à–TŸ'w—aK•ÓH­ýû®‡ÓªÅ¢+Z.…â]ZT\ùTÔË:¤®¼-Á?c†ãº‘i•°°b2”¾ØS\$å¸ê)–\1U;üHo•L`Ÿ”KtQÁq¸"-—2ÜõéeîJÍÈ°šœ59`±ëGOW‹qn÷…žbÒ;ԅõð‰ŒÆ8ŽÓ]RÖCñ^‘•Òlež< +5g˜Ôq†Ú—=[wÅÇ©·~¸K.,\@nº CΟ\¢s®iøŠ˜u çë$0¶(ÚjÌç\³+r8\Ýi +Á§@.kÙÁñFyFî*Šš`)o#ñ|aƒj¢Äc@p&$Nw¢™c+êÖ»é4‹ßnsðrA©Ú̟ø8`à$¸${ʟnIË=ßùÓmZq“´¢ªn\J]µ²ZC]–"Ax…RENÎEc¦ÃCõ)•ÝBæßN]ÝáÄfÈ"±PùåŠ(£—¨Ø³ŸÞT%«¼ª²¡QŒ=ÙQ¬Äiü2—£°'D^(ªE$‰oÈ9.a£y,ìl‹É–ÑÞÜUÔ|8ÓÂBç-(©O®[Âr<ù«…ÁHFà]Êbô-„{…ü¯ê»ï®T—î.“ª·äíêFDaN§EgX¶sá·ãÎxª0ô£MUÏPÙëä¢,f…èŸä4Ø"x J=·ãiJ7ðà”'4½çåb oL‘B*‰°$æâïÇ´~ïÖ(Åº‰®8ØEHŽÕVBQ–*-ª$Ê Öæ7ú˜²XPœËæ4“Æ+Y2*;TÏî7—i¼óÊlx³ |ŠûìÐ +úqi%r‚¾a©^eΕQvò1°ïOQ½è¡Ý$¤ÆßY~Å/#J½®Ýz>#êƒ`á`ÕÖÑe'XÓ-Œ±”GS§"ð†ä 8Óð9^I˜]-Ò}º·ø3#ýX‘7Ë"È§ 0³ÈBîx7Úz¶1¯”T4’”Ý!ÍÂPP Ez ¿÷y¡ÊùSIŽyÖýV)j,…ˆr®u¨‚äCC²:6èU©nDá(zFUÀòY<ú 7åº=&œ1\¢ƒ_D¼ú#_¬M_ìt :˜/½¸U §¤®Ò蔱¨ñˆŒRÂߓ¸ô± þ^H@Jä6ٗž®03úœé +º[.žõ…j*}k ü¹ÌÅjJšN‹ïôPÏøÑ.0‹*¥Æx†Õ)/Z¨¨® 㮔–Õ¶ &hæ#ƒ„c>žÇÐ_!kƒÂÓµ”’ÂTÚÍu¿÷ª€ç£UKµdr^,¤sòæuãÈR +¿Ü6.{&›J·Ó[Zfàð‹™êÊ{s +Ü0-hiÓ2¦;ÍÝE琩/ôZ~X|ûÅ I¸|Dq^t•Ž²+Ñ¥Z‘+À d¬™Ù„êœ: lSrÍZ›ƒ5\q’n´#’q®!ꆕOZ×à]Lªzýûˆk*$_#Lˆn€Ñˆ +/ZxÂÕµ¹«(ñX̄€@‰€zúå14ªÕ’:”~Å£¾hSøEåå¢Ô¼ óæðe9ÛüuàóºMzx'DLY…Ãß?jfpe­åQAµ°OĦŒÒ´ˆ˜pnõ10S‡CÆ­ëfÉ!*-æ±neprl²© “Sªã^š´¸(øŠ²&õŸã¡ª® _”ÀU"¥æð2å ¢·º,î¤er֘q‰1œúbŠXº6󨊝ÌXêÃþUe-“ð´ÛÔZ–7©8ú XsµÞÄ5öÑs¢4q:w¡+mîýÁA‚J"ô7!ŠL„âÊyÍ(fnµˆ]ŒŸèÑm¥yµÉM“ïNkîy؁Xü‚: “P„ÏÊeZf¯—Û]£À»+ÍR‚Tšs·ÜƒŸU3ÚÓÏ4:÷²Âó8Jj¼t®|K;JçÀÒ­2AmµÙ­[^Äj-æëMë{ª¬f•°u^ºó™4¨ýÄ­@Œ÷¼Œ*°F 'G‘+ÈW-˜.¨ÚÂÂÏ%kY]±Å »Ó$͵Úüâû½¦<QeŽ fÆÎP€àt©Ìâ‡NÝà­¼EîÚ¼JúÏèkƒVúIK‘§Õçlx#AÖÈQÝ¥éJk„ÈÇÀfL‹vELK• ·uOÅå2¼yäV”È4GÖrWö¶ÈÒUi§.Y\ª}ªd¼ËÞƇ@ëW—AîÃõ‡£#ÞzjíSNx°û;‘vÚ%èÅ2̉g|‰­T˜0€¹¹¹Š¿Žâüb1~‰SÞ1/´GC¯"ú+FꟘ¤/Ñ@»¹îÔ>U±t EWwÎ5—47BœU/Fú2½GA›Xå6T¼NN.e2ìF8ŒtÁâkNk˜§Ù‘úŒtgnh3â+‹êN˵V«…×3ф¨¸“˜~GhÖ¼É딃‡Ö"L7á—°¢.É MÃîõ¢’\ü)Άµ‡ph­D½XÆ´þœƒYEu +°¢ä-äfä) Øƒ¾,£Ç·]ØéÌ!zü¸Ý¹jQ=nªêW{Xë÷)PKu ª+_ƒY÷a)ñGX®PfêŒÛ«ÌómƒŒŽ§¸A¤Mâ;BcÝÄ/ñtrLiµP oÐÛgS´S©6͛°LèÀ.tš`JÌ©” ‚n˞=jõ¢WØc?B)as]„Å~æ£ÜÄܐ)„K «­‹L0ͼ`N}P«ß<¹Ó>àsZQ4êšw¢›̨¸ …:Q¡…†±ûÓñ2žÞ½¡xwÃmZø«wY,Þõ6Ðf,®Q‘Ù">]Í UžÉ ½¶ÃÅ)Œ<“jELuÑÉ*ä7š£±ö9É3´Ìú:wàjԄ¿OÃH%µa~ÙěR01å¥>–!1®ÔN5gŽÌ„g4žÈ;Üf– s ê•Í&RA„\ßtéˆ2NR¸Y…UøŽ«t†3“þÕbgzØ­à®ÍɋRu,¹«Ã⹧´Hi°Æç06MÛ°v_Ò¼•í/ÐMWÕÀM@ „¥HZOv„43ð̏]¬h¾½z^E²Nðbk¢veu€Î‰HvìÒC#ÂíNžF¥ª»F;®Ü“®Ì{ÓBþ&šnemëÉÛ[FäÂÛaZѨd°˜›¾b )iñ•ˆX¶ÎíðÕâö²Ü’>p´‹‡”ÛìÚܳV®«j†®ÚÇYÓƲ‡Öt{oîéæ,š´X†Ê&–H.…f³öü´ƒ½jh¡3FÖuz›\• ä»Ë %ãˆT×YÅs+Y¸”à„±¸wâmÆËöزbü«FqÛõL¹<̇o…j<ÁUO—ú”Å`p‹Œ‹1€ ‰ÁÊNˆÛ&¼‚@GxÇj[ràdpù1åOˆ³[Ímâ&•¤ƒSòל²91÷ýX‘D‚ÿÅÞÍ\*¥w˜/ßêûHŽÂ#GYžÀuh´åOHÞç>ÔGäØÇå¡/AóÀå¾l¬?¥ªïÍûü͝¼@šÿݐæQ8±Í}c½AÍ8¯‰/gßEP6œù9œû š9ðý:ºaæpÉÏÜXæ¨L}N9r@™G«±$™c¹G‘ò2G!–°£æ˜W÷ÊNŒ9 |6Œ9÷+ªÄaÀ‡¿Yþ¨+ވ¿Øì ˜#ÜÄÀkÌÑZø95L~ytJ|ys$ñåͪ¹^>­†—7wTMv9ðdêlèr ¡à%º¼ÑÌÊñ›fÎ.gÆÓðh%#¨JÛäò+¦ä•\ ¯àÚ¦SÁДücœ—åM§$\‘ l9êƙÏj9µõyƒ–³ßõLf9:ëÕ3ˆåü«ï¼rÚƘ¸r£>פ•_–î°ò«œÆ¬r„µÔYѬr,o“&¤—yéV&©¼›òŸ ò®’ÌSŽ>F§yò˜{oûFÉ(Ç,~>Ý0Îõ—±l39\&ˆò۟ÉN(¿ƒŠ€rÔ]ÞÃS(r/D?ÑQ&=EtÊE›N”ë„“ßÍ옍MŽ–@‡©÷Œ°¼–C,NK2y,v09–òóÌ%î Xò!ŠÖ%§Øç4oÿƒÓdh$[‡{PïDò§{À 90ݾ-yä·U’;Ž|<ªÑK9+í8eœÝ@ˆÕÚhäjÒäX‰bDÈ6hä°2³ÓÈK8ÞI#‡…}FNƒ¤°ÏÆÊK‘¿aäX†3„0r¬˜X_´±ÈQßxé,2-Êù¸] ÈÙÏDEâ+Š\fÕ‹"f·¹~G”½®,r˜ï…DÎN/ç^ªó D”:)jÁ!™³‘ÔE(”mrÌ$ ‚|xòñ„¾nÃÑ­IXàÇq:<ÐFGcp®¾>>¢è$tÖã6C@ yü¹bbð8ª—¹œß¸ã`:s±Øñk„_fìxV—oÔñËzRSÇA.áÏtäõåX™ãW„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆ—¿"P۝¼ Ö8ýLál¬qä¡øújrµ£Ÿ³aèË,ƒ Gڊ•¾oB%g堗5¦3ŽŒH+!¥rt¿`¸rŸ!&õ.FŒ3Ýõ™Q¶Ì" Æ@À8†zUÌG6S%QƋõ# |£‹×>ë¤Ô0ÅS]²Å?xŽ3bkU:<Jä7²8Š€¥iù¯Ë°Œ!¸âp8„nXqBdŠ‚ä„­0ƒZ]>Ç·‘‚ܘâX1èHqüŒ +g3ÇãzŠ#ûÂ×'¬,ÏÊcö ‡wš8ò=J/&Þä+%Jé@êX6’8`å| Ž³ZÁâð‘›áà“"~Ÿ–q¢º—¹gD(XâPS\ætSˆËåTñiXùáQšøð+âA¿. vxø]ɂˆÄ¤8Å°ïïõ3{Ú´o4 o´o¸)Ým5$YëÑÛ3ȕßPßX±3E¤ïAW2)|C ,œŸÞ8ß(7:ê]p'ë@ £ž^¼– ó J)ÄÀ|„ó‡Øâd›ê[B€ò}9*Ÿ†ܯb­¥ +*¤¤ßßÕ´†$|ŸU¥ øÆ`&õÓÊ÷†¨…à–À{ŸÕéñ {§.±ç +÷®Ñˆ0ØÞÕ­¢í C´Y A 5 ö†x ‡Öúâ˲ ë _RúOiX4ÿèzYIän>íPï´Fùô¬¯¦7¶YA>ÌyO¢÷é¬zc .16 ÷ñÅàyC%ÁâñÀyã,¡™5ž„õ?e¼ÏáÁ#XÞ)Ê[QÞPÑq ’7 +CX ˆn0™x¹ɛë“s±ö`-(6 É{ZMò¾†ãôòþàˆOW“k¶VŽ·ú-Ýe‚¼©ðc“ù ySÞȂ‡ä—±…$ycCa3ƒäÏI}#yÓÊú‚àqëu¯-IޅոW}#yã}Æv{Çn´@Þüû1-úX`øÎh&ÈRÎCŎ©Ÿª*ʘ oò1Ä"1ț²P‘X ò&‰…+țf"äÍ'u÷Éñ¦È†9àãMaM”{0 I .'9Þ܄ŸìÆñ†™Í¯“ãMÑíÑFr¼! rãxS³¯©ËïBÎò=&Ço¨*†6Ž7µÚ.áÈÌ c$Æ[ )#̗>‘Y°oÈ¥B8ãMá3)?ÆfsãM©¹ÆxK;ÇjµãÍ=YUï’ÀËÀxÃÂàݎñƅÝ> (í2Æo +¨X'¾R¼Ù9>+… \Þo„9®VvŒ7Ârç5!Þ+¬rOT0z+òDW„÷0Ñ, ÞÃjúxã8ïôîñÄÓ5¼›Á<™ƒßëà„´ó»QA}‚F à’éÝ$ŸªdJx7¢®ý¼ŠœÇaš~Î@E¯än4xWD›dàǾVR»±ßÛ Ú€ ÁìfđµÌÁìfoxâŽ6f7/ºÚUù0<¼ÇƜšPýÛ³(;Ø6ãt-œ?s¶cwª…DÉa8×솕UTÁëÆqw®¿¦R¢…Ö](š8T¢æNBÁŸ \·æ'i&®[”½hKËÎv$R<:˜P,àJpÀßpÝ0«â1pÝ´¾f\7 ÕBµ‰ë¦™åXëæO´„sc +f2mœŸv\7ÛªW \7k7!ˆu3ª¼­Ìš´n֋°Ò'pݨÀЯ®›7I¥¦+¯» yÝìÐÎXðºY¼¡:…•×ÍšD}ËI¸]â¼nZHMÜxÝÔR4¼nö‡â20€Ý˜»Tñ¹»%±¥ÔÌÀnn¨*ã'ÚÐ;´»éúpEÄniq½a;-hmænO`7¬rK 즡[|–¿IÐðNìf„OòA»Õå‘†Gä#Ä­·$˜Än®ªÔ†4 ˆD/ŸîqÀ²uX8ToÈn™Ÿ(X=µ¡‹y…ì†Aôû ÙÍæ6IJ[ëC¼µ–>£ßɆìV÷GÂZŒìf‘ÝxãˆøIdw¹® ã,ÈnH Br*d7]uY‘Ý%U ì¦…©á@v\5,+ +ŒÌüÎ7d72‘)¸Rž¤•G…3æ"{¦oÈnšÙàÌÈnüUk‰ì†…ߎ솙pžDvӢ중ݲ0é¶"»ñ£¤t&²)RŠ·‚؍”¢z®ÀnfDIº`÷p.-YÜY±1»ï3òö£¥ûcbwoQ¤´»a=ùâìi'ëîm +Ù璠;ߓ°îcSlÖ ºÚQÝÝÒ“Ô ^Ýáè:cchÃÎyhu“týŒi}™Ó†Ó=­æt?5Z†¿ 6–ö®˜îûr>73g>!ÝiØÝÓ*D÷M Ñ ƒ¯+ ›´òst#Ê­Š8ó¹aÐ4²â¹±çýÀs?!3 +:÷søíßàÜw4P 678ji47€/¦627YÌM!<ÞEŠ.‡ÓÊ]Œ¯\±Ü0’rTnšËèº"¦ÜîÉ侏©ücšôv·«DrÃ@áFäòŽõ‘äF˜•,òrßñ!/nÑ=!Û|¬¬Í6d›ï‡Ð€lÓ¢é +Ùf³Ð¸ +؏Ç&†lôž>§gõDŽl3É`ÙÙ¦YÙWC¶™¬÷Dj3â¨ä²ÍÕMÙÆcöo² &_˜±{à:n3¶ç29ÛúÖÝc ×è'ŒmZxWFH»"·;c»Ý&Û°HÜŒm–Ø>Úd"¶q¥Ùb¯¡°XØ†WèRï±=}àTVà} Y‰%ªœ6Äöb6b›Mž™yÄ6,R¹mˆm3Äv!ÿ¼¨tVÝè!æÀ³!¶ñ +[9bÄ6%†jLlÄ6ž³@wbåz¤§cukâÜ»$Ýó>í|mh䔊2^n8‡” kãu‘'¿ÒµDâpxm‘Ô Ýc-\³®tmY©H2^›Çº¦­òàêáeÃk3.Ê%Á×ÆsgÌ1ùÚã úØF=Q”ë2™ó##ðÚ¬/*ÂhOº6Úü´…­ !(#)ÁÖF׎Gi}¼£`0ÈÚ,_lZÑ2—mÙW®6ÖGBÎ8èBኗ³T‹XHaƒjßn1–LíÛÅk‰Ô‘ …¨†@·¨MýÇá` +\Ïî`çÎӍ1ºài÷3BÆi¤¦tõ„i³£Ifiã8 H»G¢vãhwãµ²šEçÅe(¶R´¡¤`Œ1 ÚHò³ +†v áކÐ&cnH‹ÈØ6 – ÝnEUv€6ô^* vàÚ~Ö>»…b£gC£D0KÀ³!²{|žtý@vnoàl”( tanö%nP@³±°b¡íÆ̆UE`®Á‡ØŠºÀ^CŽ%úË +̾\‚’¼ìË=˜—݈ÛÜaÙÙp)XÙݱÒDeCÿÂI|#eã"øsʾ¢½zp²Qc¦VW+&û +@E`²¯˜Ó‚’3:Çœ¹yL5 Ž#ÓÓmh6}¢Ë…x;"N¿Â áôø† º,*ªW>6ê­‚qu\Ñ~ÑtìѝÎ^éØ02Ìpì=̓Ì̍=,I2öp"ÁØ0ÄÏM06-‡Uw E*$¹ØP§E°jb±Ÿ;Úa‹=sTìøŠT^¢žÉ€â>!Öæâ‰îßŦ™€b²‰Ëø”Plæ$èsoTl˜•W +*6\ůƒ4lnó¸8`–VÎ#‹ ‹ò[Å.%ªð7,¶ÖM£M,6sàt‰‹- +„ÑîK_ø‹jg,6ÏjÀ>¸š3xø¹Øp9ØàpÃbƒ'¬u¢5{X¶#±‡ð$bà X ØÃèŝ‡Íêá³Oö¦uP®½dt£aŠArun'»º{Éä­q،ªv×uN¦5c«Ôw›gwž“†MÿüçWöTÎ2hØ´ˆzGmKuÙ͊Ãf!‹JόÃæ¥ßDÔ‡– ‡= y0*À‰Ã† ÖT²³â°a>ÕFõ¥¨‰Ã¦×ÎGµá°éԑ]8l€.Tù'6·à£ÛpØ<¹óœ4ìr¸R2iج‚ᨼҰiÕ@`6-Ý 0X¬x…w6]Ò꺄SKW.% Ufl8l.¦OsO4N°4°J³¬ÓÀ BAÙÆÃæòºF½»¢§GŽàa+åŒÚx،Çs/´ÔÀúŠCH± ¥ãx´± +’¤Ú@lBéÔâÃ@l¥hš”œˆMñ ÿÝ@lN㯻:ä]Ær¯f±±öԛ´±ÖØDl¸¦rM‰h„m[©§N$6uŒú*cz‡…’æ ‰-mh?'[X± Ä措8[ØŒÍÐâ«x­@l.E•Ñ™8l‰AÇ9qØ<{&ž‡Ø˜J?66ÌþÉæÕÓÅpÆaÓ"pŊÆوá°¹î†qØ<¸F¬‡Íµ¹+ÃƓ—(Ò<ìi؀؋ÙDlü„‚6ºf*tî ¶æ —07¬1Æ{±¬Dìi"6W…˜ˆïîÎÄfz|,Hl‚(p$6“šÕåˆSÿI3ߕ€b3«É·IPl&&•Ø ØåßcB±Y T@±¹ ×Î[Šë»O*öìKTlFÀžçz£b§ªž¦b3Å AÅæ×⃵k‘âðIņ·0©ØŒ™±ÓÅFÅfĉíÕ‹M‹&:a±i(bÅbó1¨ÓÙ|ߍ¯ÅF\A…®›8±æŽŒ*ÿAª˜¥ôÅÆ ¨¯nÃbS‹B Up±álºù‡¹Ø Äí²q±aæ>¹Ø´ða›µ_\¹Ø<"EÁÅf8Fé#®ÕµM;›¾0ÓæÁÅ&›=ƒ‹Í †j®\ìi.6ç@¶ .6oû/l\l˜ÝyÇ (X¤õ +.6·¡†kãbÓÌg\l¡ï2ÁØTDö7,6už¬@,64Gk’‹ÍÜPu§–ÉÅfŒœ¬‚àb³ªy¬¸kx·Ú ®\ìaIZ³¹R RÓ°A±§ÕÜ/ô?Š®å|'?¬þëÞ÷ãú´#±OÞåò)‰Øxؤh%»{8ÚyØÝá—Äaw‡¦“†ýØ×Øa؏£ ´v‘ÿDa?ñn$ìG½–Ý„/N öã⚃ýDÂÈl¾/W +6Ô.ʏ¬ì`'4ŽuÁ•®ómlÝ4)¨ã™ük&³Æù†¿®=’y¦_Ã0Ü%WÃcW߁~M¬8VAb_£× jyŽ#ÖÒ+úõtø‚|,ª$_ŸÑ(|_Cþ…€t`¯©~nç¤^U5väõy…ßiâõœxÍ×ñ¼ñ®Ï¸îE ^îú4þd£]ÃH5`×g(v´ûzo¬kԍ:I×HohaàW 7쬳q®Û0Y=0× ŽsR®{(S7È5RGmLÄ5$3¤ëáº[¸®»É·Æ~ ÄÞfüo£[_w#Eµ«ù¼j41:9#%®úŒþA«ݏ£AÀªÖ¾±ªQa§:L—$–¢›T]»?ß T]CEœê +ŠÀTÃùè÷¤ºÚIH5 âŠQ]£oꆨ~yZœ&¡ºÅûe@õÅìO}qœ\ðÔ,éRÿryEIÉcQo¦é.”þm–[b8%ñ8ÐÔZ‘‰¼¡©ó²åS’©›[¡%˜úv«K}9ѐXêây;¨Ô–ÐîPj•¢ØŠIMbÂëS"©ReމÔ@´°qF©/G±ù7µõ[É¢¾£û„QÔ5ªïvu7°'IÔÖX&ˆšÉ‡jFf¢\·'­„Pãý(®ä›jÔÆMD¼Ü^Âè£áˆ¨åÐ$PŸv¯@]ÃOþ4 û ÞNü4êÿºJQéQa=Ä×3ÙÓݽAßØӖ¯zúbÈ¡Lò´–d­¾‘§¥q¹ÏIžF˜öb„ OSŸz„%µZÔ\ƌÃÀ¢þ‰žþè²ûe†æ;Ö䁞nÎò%y:@q ž¾jè„Wî4bs; vˆ:N›:}EYìA„žL0§QÖÈino1HWˆ œF +˜â®àM#q݊¦ŠçŠÒcÇë!ƒåˆjŠ4šWG¢1YÓO‰¬·ŒÄù¶s’¦GQDbMÃÊ6@Ó0ˆµë ˜»¬@ß0ÓÃPœ¤L£â×h˜ôÓ»-˜4{Ñ_×K€L¥Ï’†Ì4Ô?†¯ì éĕG:Q˜‘~üõîi”ow.ÊBV¢%C†êˆýDHˆðA­#xѕǑ۸ñ£ÇÚ:_ aݽOz4²=LmlðhÒªÛÌFê­z££/bwrô#¾]r£‡Wg‰f!åuîÔhòÂÙ6ÏÐhœ }ƒ=N ’wfô0”%‘Ñ#*ƒ‚½h£ŸÈ/úq’,áÐ1<ì´h(yÙ 3hÑ ·‘ + è;úTn¬hH + +ëcESc7N4òXŒo¿Y1eJô}D±ù +‰F~,*ÎÅ©<  D4Rm,ÀÞÑÝáõ$D÷(» Dt6Fô´Ý͒JB1VȌ:mˆht;PeV(ô +0&GÅæÂÅ ^×å›É¤NµO>4VTj\¸â¡±,ƒ—xh¬ÞToå³fÙǾ¬"I64¨NjZl44%eLåO4t·Ú+ÉÐ\æ¹øõà„Ì:k?å6ôãJ™\èX'š‹ç~¿a¡±Ð& îy«E0ºYiº3¡ÁíŠsçY¹DB¿»FŸ¿¹óõ¿/úk¤çŸ=~ûôÿùO¿[Ãýæ·ü¿¿üÿþúý̗ß|ÿËÿ÷‡ÿî_¸ŽOÿø/~øË¿þÊnÿׯüåŸÿðÛïøéwË…á¯×öçvûW¿~ýÒ¿ýõ¯~÷Wñ?w^þÛþÿ_ÿðû×iýõßü<{9›×ùÿú‡¿YOæg7ÿòÃúÝ/_wöÿþío~úÝÜú_ýæ¿~Ø8*Oþ§×ùÏ~øõþ«ßým/ô/~óû¿ùÙ'û§¯¿þÉ??ù§?ýÊ»ÓpÁðË?ûÍOþzû~÷z¿ûÎöúÃ~óò/¿ø“?û¯ü·GÿöOûßþæ¯òXÿèÏ~øý'ÿõ©ü¿8>ý“_üÉñéßýþòßð+öûøôÿ¼þ뿼l¿ÿÔ>ý‹Oÿá?Ÿ~õÚãßýÅ/þä»{`èÇÿü8ÿ:Üöö M‡ ÞþÚéËv¬×_?á‡ÿåë^#3qڄVýV»(S¸á¥ÌôZ^¾Öxø×Þia„ 8.9V€7LÔْÌSV;Œ€d/# +0^«†ÝˆEÃőn³c(½_¿±–nÔkxÛÎ!Œ:Váp÷‹Â_Ûa§q?‡Å>Oxv¹´÷áu„ÿ„›|£€v¯u?<;6ñÁôL8üËzP5òZpŸ×Iրÿ…Û[ŽOÿâñ8o %+¾Ç4×j‡Ñ5m/#eýç›Ñ’ +]ßboBs쇅7özös°ñûùªmçö×¼îø§þrCüˆ*¤Qÿ\í>V/„òz/oFÈ òÁ.väñjÿ´–tŽóÓ~6~ÿ3疧ýoôz£ÛÓª‘vC9¯¥þ8Àl;ZÃË|±Õ.jyï§á¥>5ˆx̨nûý~‡¡Àªb;âu×v‹q»ºi_nÅ<ìrÓæ9ìwLr½o\…Öß\ߞò´/¯Dv}y>܇ÿõ1ã;žÎ-nü~{qîýxös8œ9ÚÎv1n—6íË}˜‡]îØ<‡ýöâGà”ïé­o/ð4¾=âi_އ<ìúæ|¸ßì¾ÔÔó}d«â¯öï4ð t¶l‹qÙûٖÃΑm9‡mdÏ +±o|C@ò~ØiÜÏaڗž‡].íÃ}ø>FQÌ3í(næ™ã|;¦”ÆOfùÅŸÞbŸ×²v^õrÛ-ÂÄx#ò¹m šVyÛa§q?‡i_Nxv¹´÷!oѼ{û´>÷2­Ïc™Öã6­/ö9­/‡ÓúrÛ´>÷ºq¾ëa§q?‡i_Nxv¹´÷á+oÑ~‹æã^Ž3_Œåãvz‹}^ËrØyÕË9l·h>îuã|1ÖÃNã~Ó¾œð<ìriîÃ÷Ýñî냻öÍ!;ç~óa*ë,ïî +fPdv/èQó©ÝU°ñÝ]Y7žÈ<ì4îç°Øç ÏÃ.—öñ>|“ÉtÎÑûíNÅrÓýXÎv1n—¶ø0ó>,.мc‹Ÿ°ÝÞÅ©X6žîÇòÔÒøöˆ§}yò°ë›óá>|«ÉtNÓûž~ÅrÓYNx1nW·¸1óV,^мi‹«°ÝáůX6žÈòàÒøö”§}y%ò°ëËóá>|“x~ø–îóãøöí“?Ý/w7)ßÇ ´÷:î}|¨Öïߦïãúñüäça§q?‡Å>Oxv¹´÷áÛ/gö;<¿åå4æW¿œðbÜ®n:æ­XFžyӖÏs»ÃË·¼l<¿úåÁ¥ñí)OûòJäaחçÃ}øÆ˙ýöÎy9‡ùÉ/g»·K[ƍy–agÞ±åÛÜnïò!/ÏO~yji|{ÄÓ¾¼yØõÍùp¦€€ñѓ<­Ú| _ ®Ø¼ŽÅ¸¹(‹}ú3Ëa§ç³œÃæ&}<·iù¸‚â¡Ï·OBkém/ÆÍ5_ìӏ_;=þóãâiûeç¿v¨÷OúÕèý[€Ïoö |/±^¼x?gÝ¿|<â þ_SžlÈéëí׋5gšª £íž<€$õ2¾\oFŒÂíZfÙ ¸Û§í° %<õÓvaœ3͸﷍­‚ß;û9,öyÂó°Ë¥}¼ßr¦Áïw¸E²†€Þ×~‹q»ºi_nÅ<ìrÓæ9ìwXîM}Û¸J¥·?¸4¾=åi_^‰<ìúò|¸ßj¦a¡Ëûí=\š´¯ò|{ãviӾ܇yØåŽÍsØooañþ¶±UûSKãÛ#žöå}Èîo·ûð-gмx=Çò€ÌrÚ¿ÓÐ\ïÃþy¿q¬{ œÙÞTb³ö”t?‡3éãßéG.6–\7¾%Þ;û9LûrÂó°Ë¥}¸[Èã’½Ý"ο×Ûq8Õö²ÿâbÜNo±ÏkY;¯z9‡íÁaxžñ¶±+ëöÃNã~Ó¾œð<ìriî÷YÏç{2WBÓd7a{u¡Ø[ß_uã|ÖÃNãõáÍ}™Ò7šk®'¦ip>¿å§ç½ÛÏsÞèuã|$ëa§ñúðúäy~Ë!~ñ}@ûv§x!£½}Õï·5nÑ~Ø=êsøÕS}‹ê®‡Æý¦}9áyØåÒ>܇¯ û-šO~9Î|HË/.Æíôû¼–å°{ Ôçð!ªê-ÚÞoÑbÜÏaڗž‡].íÃ}ø&=åóãíE:™ ±õxÆ{¾íbÜ.m±Ïû°vO®û>$×÷sےëwϼBN8~©«Ýgҟkuã6D/ö9ž/‡#ÿrÛ4ññܾÕp1]ëpߗaßV t"®˜F;‘ïK y½ìöÊÅþñîÞÛø¾ÄX7ž«†yØiÜÏa±Ïž‡].íã}øfÁnùÕûí åæ’a9ÛŸ]Ú²î˜÷aY¶Ì;¶øöÛí]ËÆsÉ°<µ4¾=âi_އ<ìúæ|¸ß0Øm×z¿Ãs-°œÆ\5,'¼·«[–óV,+—yÓ÷~»ÃËZ`Ùx®–—Æ·§<íË+‘‡]_ž÷á›»{„ÿž»ôãCØ·Ož¡·ú6>0Nw=Æ6^yÎ}|`øïíˤé}l˜Ώ}p÷__ìóTçA—‹úx¾}ða¿·ó+^Nc~ïË /Æíê–Acފẻ[¶|–˽]¾àÜp~éËÃJãۓöå5ȃ®/̇;ðÃûïró3_Îv1n—¶Œó>,CMܯåk\nìòáæ†ó_žTßë´/ï@t}[>܁ïÿž±×ýÓOùã¿út¿Ç]ÿn¡×v°§q«Ÿô_G%‡û»sÜ,tYí_Þìè*¬í—·ãüœ}9ÎO>Ïo#ÎÝNHŠ1–‹@.Œö +4€¯_”ñµ\Æë—ŒuHŸãýhÞ¸ÏÇÛ¿øEëËúú©ÊƒÏþÄÉ ãs©²?ØYÆ~¢¼¿ûzÝl¼ÎÃ'Ӟ3O†u·þÑÒ_Ÿ˜¨Ó5¢bKÆr>‡×³á@¥Îá9âÚz]ê†0!£ZÚz;^pß»zzÓ×YÝ>ƒjÓkIà”ºìÏZÝ<[ŸÔÆvõ¸,ßøK…s¹èåí+hyÀ—Òæ=x{Ÿã= ¡Bæ` ›ãö#ƒìu¿mï~Ö$“ŃÓ` CÄþ=-ûAó÷@Û.ñ8Ž×Zÿ‡¢;¿Ÿîïk#–Èü’Æx¦µiìOÜØï;7ö¦ “µÊPç×Î`žšÃòY¿ÑïvÆÉ¡²ÎV´³²é¼J_ߋoÚEüʧv +Ú){×MŠÊ8QùúÕ3øÛ<©«=¾ÈR<ÜÈÞÏxVµu?™æü¹þüÇu³ß©·÷õ²å˜ÈvŽþX/T٘#»=ÃÈ~ޒܯÏy| ²ƒ‡}bc-ÙøÄ·¾Ž°ÇÀsŽÆçØ2õ«W1ï*Š£J¼5Жþ˜öãêa/#î*>çîG9Š>:QÂä~LûY†íMCŒ(^õSÓ=lXâG†ˆM<ÊÕþ â>ŽP›×<ì~>=Jç…FG‡Ã:¶7 Œ …1Þù×(àïn\' mx&—ŸÎÕ°¤´ñðÓa5ããé™ùk¿˜È`Ÿ?³´x`RÍö[ciWÀû£±^añz„º7®heaã?ǯé«ç÷ +ˆÄ' 6÷ü1쯯ËÍQ÷'í@ðõkÕÆK?Iq?l¿b?øZÒXPæºLL_;‡õëc[ ¤˜Nó뛣è審¦töA ˆ‘œãmŽÃµ¶œ Ž˜ Ê3îØ8'ˆ·XoÝۅÿø5;ÆÛƗ;üïóþCg#{ Ú²3:@ü|#æÇ×}~öþë Á´®15sú1íåöûpz¸êžë×캏3Œ÷nÀÑㅧ½ž±ñÝbãçŠÃ6}§Ïaú.·´Bž#Ît¬sj1w’ð%ìO/>ÔkÆñÆŸ ià_=ò¼'˜ºlÿcØífp |tE/ã•c Ah¼Î<øuç=b\yz¹qÍñö™ÆRcÄöÐêŸÃ¨é#ŸgœC‹¯ã'ðÕ«˜ˆ&Zǽüâi?æ÷º'2ö +—6Þq+Æùävõrµ½öظ¦«W6¹Ù¦ÛÿÕSû’S +:æöwèüör¯eègÚxžþÖ0jhAŸ¹’¯*ì5<)–èÈØ<{ûv×O_=‡Ý©Œ_¤ÏžãכÓU´±Þ«÷÷s‰íg,h‰{±Ñ¾Ž0®?äTÞqáìóÆn§ƒÄ§¯^ÅúYÐyÕt:D’ýi=ìXó} »]؟|Uûaä«GÎ=/ðÐ|EO}âU 9WŪ_Ò~´{y@>ˆãÑ?}õÈóJ/ðѾr¥ ¬u¯Žµr“1öA•$N’ŒÇúz—ûòû3êGx}V±qËÏ®ñ2SñùgÎmý@ˆÛô띳ÍÛk¯Ùæã·ðïÿÀÆۑÿ ­ãðÏx¨Š&Øûù1ìõÒÜ +ûÃ/Ÿ´ø¼0'/ãÙïŸëÂÅ6ؾãyµq¹kޚ<ÂQÿVé9"¡Ofç€Ù=QÉxõâÇðr—«„AÊØòŽÃÞ"Vò€ÿfc‰#ðí±ñŠuÀqÏ#Ì/­ƒ=¢{zÕXl>㈪% û9~wº.W‹ÁˆA"Ÿ«~ýQå¨g××®A6oYçÏÇÎåXÈ9ì@~ÃX´T¤Wñú#T„‡ôŠÖ›-ão6F`ëh1nZ¡Âø̽Ä4´7> /aïOœ/'Q¢w¿Á¯Ùö£ñºjGöʈñ¿çuöӗKKÆRâÊê5÷ݦx01ùAä4ˆvCey½.YÎ`ä2¾·ym-?zR¾cϙSÁãkÍ4–-óÈõˆõO¹52á2Z¼£Ïð£³Q„óFÌ<´/ïèá«C$÷‰©Õ7-¡bØ%fI@²·½x‰ÔÉ>¯óÑíiðrK|;gó¯uSNäW÷Ưo=žÅ­ Àœ×ôó)Üû:ðò4bJx¼ çöW‹{c1˜©Wl|ڕX/^qÆ£4óÌA¤µæM{“ 'ã_ºrË.œ­[t'ñzêö6vpŠXO{ÂøúÊÊbÌ#G> ×ÅŵÌÙ|ðÁC>rõâwµõå*.¨'|ä¾|½j"Eº·‚‘Bo9_‡a¿^wë¾ã…×›†fwù(4·–Ÿ&ü„|}ѺoÜé×=O\[)aúèÛ Ÿàa–fãü´Æý,Gnw~Zq#~î°Gޅ»?ËÚö«ŸÞxæ ¸(ñ–£Çduž}aF +c™ÛrՅ·21óåÜXæ—á™Ò'üºï_Â~–¬™Î“±^q+JyŠ’É’_ rs:ó‹9"bǫ֔`n‹Ó;½|!Œ<2Om· šoÏC>çËx »§Çá0€lOøä­æ};AŠ«“‰Æz–ôå +ÉkO„J¾ÙÀ…]gØQt%cÍq\qkçÈq½ÖPóák` íu:ŸwÉY3bÚ¯t5G+mqVƉm5\¤¢°ñK<Á»*r¦®1ñ")û9ŽPî|²C£&Ú æl©Ð GLÇoøÉÖºñÖ!2ú%ìs”Õ +›qp”¯Ü?÷šÿÃ8Ô)CGˆä5ÔØ?‡µ¸]Ì3¯3«9®`ÿ̞Kã +6¾b9ß{%ϕaÎàÉÏ#ôǓ^¥¦ª“½3â°(Âñm¾kåå]Ä݁÷Õý*—8·b¢™ã2*ø‹ûžW‡š¿˜ÚÆñÄŽb¯sBz¡­÷47ŠpQ +è=éh“‡ÝïAn›¯›üÃَ×r–[Þî]À³²Ç¦DNŸ° +7†Q¨kv˜¦¾„½ä͌ùÆú:BHåHpäˆ,óëˆ3(Ï §²óOÞ´£Æ2Nrõ–Æ–ƒØ™‹’cu­4)•‘ñtûa» Ù]QäºífÐ^FNL§ÄcèPvé{Œ0NùÙÓzd Øñ6œ& ¨Ç#¥jhF’AâV2ߌ/+ˆÏÙ½qo=C"áˊµ´Ëæ²Ã'|KÄ:=Z3fÅ4NëV258Ul'揜ìf£o;ñ”åÜj~ž‘r}YKmDŠý¾·XBæãûˆ!õ5¶Fòþÿƒ½7[rãHEçYfú˜]Ó5in˜±åÒ²~`E6§K"ÉVkNŸ¶2ÅBÔÁBŠú™y™o8Oó¦:sÃ=Â="Ä’àR@1{aŽHϏ߃8²³%¸–‚…{Ziîu»«©Ã ȑ´ª‚<ú†‡–&êCPËxŽR-Li¥¹½Â“EÁ„1˜ØЖܘ-Nh¯phƒŒšA´c@Þ rL%Y&•ò‘ PʟTp Šcðñ +8.L +g+āKfXh4÷î¬Tl;ö±pù*Ç5jìˆ1mä>’’ƒ-±Æ;›Úi¿Ä®Eh¬u‹ßŒ¢~┠µ +uۉ>:ÄiYxÂÆ:m8t0ã=.ò”€&ÀIΣ†ð RіwNð a²ÃùJš¨uÁ¥ÆÓNò §ù–ŠB·XÄB8)$>€€x Æ)}lZù$<<‹á«@Ë3~¦Æ$¿&N–q@åÍ_öu`ìt@¼Eε4&¯Ã»ÝA‚r@ɚƒò!rВM‘Ql ÜüÁÖ±˜D†2ˆ*6E°åÃÁS +tNä3I%Š|¤)­TÀ ehù<'¸ìH…w8`ÆA "%&šòdÀ½,æh¨nï_æe½ÄO\K5 += ýÝÁ™] áÆÀ`µ4îLƒË‚3Èßuàà!ܵÌáµDG bA f0ŸyNÑVȓ|Œ\î¬çŽÚ±ü.çeɋ¤!„s¡ö½yæʟûq¹YÏíù@{*a®˜§§MSæÐÚI¥у Ҝ–ž0 xw@ѝñ +A- Õ¾q8têG–FOì1ŠIɜˆ@©IK’skØ8+/;¸É„Í‘HFŽæÕl0%f w[0cÆ`6‚ѐx­ +|$±”€ÙPcÍlU¦ ¶èlñdät–C ߋwV¤(ù4ã¡Ai…(i–{_¢§£ãnВ}Ü:Äì牓Š\o Ma¢çH|¿½é×.Ç隶Y‘é($7÷”`)tçiˆôÅ yAh#έDԳ܏-Äâcc¢‚H$5K˲‚A³&-ü™'îÒτƒ*È؇QíŒ!1¥"cP”Q`´Ïh(X·½•’Ãg +WOÛÑ®9'x¦ˆÓ»¸+šŒd?ËV¥*ÏG|Vc®:TÁ CH`H-æÄñÇEä;ÃÐL¸Ä ÆçšÂÙ1†ÅcÈÙ±i>8¨pÚª:‘ ƒŠv´(# +†”b,”ä׊$U©5Åag¬UáJe YJ²ŸÌ3b\^ãËsWÈÛCiÁ錇´Ï ±r{ðõ +ܟAyJ¹©«ìâ§ÁÍåãïáŽê6%LÐۑa‡P©,òɨ‚û Ҝ9»'Í\wÜ1ñI–A±Ár¬@O]©3+bäÞ3¬h<#6Êa¦±C–6‚jvérP…æ܀ÜñPhœIæâ)Ùq¢|n†ƒ—+4 k“"ó¹pÿŸ»’ãÈ3Ùú…r +Ü7”S|*څN0è,÷G/"Ã@ùœÓ~R +[+TA ΢çÆ,v ¯eÊ݂æ$wJAh¯V´m«!¿…bá(•Ü˜9˜ á{i0¤…H>$'o(Š¾-¼l”ÉÀÜ K™tNÏ. åšäœkålP‚c + ܹö)þƒ”ÐÚ½IœçQì²f‰Ÿó]‚GRiOȋ$楣.én–õguBù^áè"15‘+ovòÀpDÌ®ˆ²òЖèD!9A.˜oÐoã1pø¶•Ñ£¾ Cæ dI¾Ãl|Ò00 Bx&†ÄÛzÀM®ù8Á›ë|ßTQ?Í~íHZ§xhDk‡Ž/Œ‘äl%™—ÖØ`i'”æ<'hXn,¿„sb–èâõn)E*`äi‘Q\i&”ïƒNãÈTr™%îú&”$b.P›Éâw³¦Q˜h̹¤¨à-\ès””-9áGÉÌG¦4æD{Òsø5¬9ӂ³ÿ¢˜YíÜ;:®ï›a»tâ\K®1…`%.A͵$Ûf✚g„ªG>˜ÉÏ Ø:‚‡”J*3.¬Ù“ÈÇÿZ9=£7ª•Å†©ñ)=™á ¯Ä]¸êÑf”T€7ñ…ã ¥UÈ9K);4‚ÆŸ¥ÎˆåèҊàBIï§K\P‰?Ô2ÅCNHq +è²N# ѯðó§-琰À~%âhâ£YzYn’ôº‚s{”Ñ„Az'zk2(KPßÈö…" + -!al]ʙ¤õ£)g9ç8ŽÄ…%{‘/§ìQ$cÈ9à ע“î҄£‹Í‹¾)í:4g‘8„é}Xå OfV³°]P–=2é&#ngL$ð§šv®ðVhP¼Ï +ºá2²A5}0I¬­ÉQ$!3ñÁrNCÑ´~„¤§%LLö6zE‰–0ôñœT8Ñ×JD–’²à(A4dÙzx&xÍÒ÷ËËüœæ²ÂT„Ap’O–ëŒÄvÎ(é.dS£šÛg ‚ôs¼É0¥C%¥>ÈBJF÷Ó)1ìœà*!^ŠAĄ™9Ho¾%s Ç˜«¢Ò‹£¹¤œ.\lÜ7í}4 äZ™€ +h%w,<:æü±yHrÜy‚\´Ò,“”[›Öèá‚T­Ä珅ƈ֝—˜3Z‘‡YöÞÄGáaã"¤Î†Ï]¤<:Æ uï\ôŠñ¶1ò.P,؃$Õ¼C½áF‘KÓÌ aHCNº0†¬ .‘xíL92ÏhÛJJEËOF–2 sËg.+Œ/(‘›RI’ñæR†€‚ZFf&]“®ªi¶Ú&z04ãÎd¹f5Ü¿×8é¥J=΀ąY²ÙŒ‚«gý`ƒ^¨\ 3Å6ÁpH—ŠläÇô§¼Çœá3†; àk¦»áŠÄU\u`—,X¼Á8J†Òvke˜d²zt0„$·Â+Ř甐xƒ^ÆþÆ$ø<]Û4œ~Éd¤ÞaV²&3¬,ˆIvCîÔŸ|'Èêëc í§&‹}!¼ÎÛ ̅÷2¦¬qø‹ÏXAxFiô>+_Ç}ðò žá,öA$PÂüċàäSÎ%¤©úì|ßØ©(x˜°éà šÌ2,äO?Oáa(.£ @®6AY“1$ñ6=JÒqHz´$ï*VM¡U±ÊiŠ +NN\i—‘¸!.Hp–›0ãöœàFñ^ö1ÀIB–MÔ©\âX "8ó!(,å¼R²„ò†’8p³OÓȈ@ƒ%vLF»™BÖ±~ق­äI(v&q\ˆ1x.Š\1çß,å>Xqñß¹q‰ N ™ƒqÍ»–þ°N½{ß¿ÎPÌ7.ª”bš%{$tšQLs}ù,²& ‡qk!Khâ2HJc ÄUg‘9ƹä}c.oæ‹NaUsnÒ§’<ª|“K¿5²ÈËn2A1É …pŠ–¡¢b-×÷B³”|g×`’É(Æ]»Kdϊ0øå‡$(r_:¬ñŽ5¡ àc'eqQŽ‚rª`‡} +2èWds +dÂÜD‡Œ Xuw!z¾1=ágj¬ÙcƒæMŸÀ È҉ԂÔm•åœ!Üf÷+ØJ‚2=¢ï€>f瘫7Y_"0°u´¦lþÔ‡‡C¥WÉvJåí…OTˆl¢˜³‘0ûð Æàs,QKäüOÁžKã>ñC(ÞŠòLdN‚©ÆÎÀ§ eœ +I®ã€´ CžT6sºv×py4â}œ…~÷¸L¨"Nd‰t^Hˆ4vW°.!½K7x dþ&X&įQt,X&Ñz’^l‚–ÕÉÄܚ€A°z—{: ¤/¡¦è€¾x8çŠw³É ³0xt+]( {  “ÏJ©Ò§ê"¥º‚yÆtóPÞÄ`H “¾hkO9…Pp–V0Uö°ÀŒË²aâ´Ç %%é.,> ‰© ­Ï@%œ—µùæÔY¦1“Ô’Â’”+ þy1D,upNð Æà$œ`RªwÝ:ÙVz ÷Бä1Š Ê'QWgÏ$¡ g§gª4$"¼àÔZÃKêžHCqHG>&¥‰¶,ºòýèRgavkÈpÚoÊJ¿+å‰ÙÄR°* 3—EfKª°#3Ê0wë•3š%W«LBZ+g:C4çxJÐl³bia¤%/”„òÀEP¢4þ$2'¨Äí%‰ÈÔ7㫎)ö*šÂí?ë3¼0Ü8'íÚY)\!¶s`àcÈò‚;ì_§8G3èt>b\?œéêÄ{ƒ -MBƒ¤BÊÕ¨ôÛ@Ðë|øŽŽ‹ï@ ‡0ъ9…Ò‘‚JbAí +˜©¯‘–Fµ81ÇcN#c$ .Poà/sFåhSòŽ88ób }ô}Ë\„º‹rzž‚üwšf_ Ì59/Aލ¶©'‚U’øm{É +åÈB5’P\Û§Ž+ÞɔÄ„cÏwCYä¡´ÿ½D¬@Ž–aò\¡ËæsòÛ`ø‘à ðŒËj*'çАLû:l: „ ó4BCu_å{ Eä¾æ˜T¶g#|Q,†NFђ +)ã>ð=”çKÚ‘Ç £“ {ž<ìò£ k¶¾: t ÞP#‡«ñ&ÆÉtdµ˜ +XŒ[î ÍÛÓ6&k”‹EPªÀúXhØS‹oâç5/S,¢Õ â*˾(öEÝͳ,ÖÚÅ´uS"N¨¿ ŠXdøÖ,¥"¢³Tn¦0»„E҉© tN'ˆ§M±|Fм]cÉù[ —c…b’¡4ì3£š4^øpJ!ú"#'•}¢š›nœÁ÷³á¥¸®?I±ì‘¹¯2’Š¨¢Zž²i±¨ŒS¤?`î Wå-–á×äÁÂò‘©Ä\¢»$¡N/£…@\:U°îEi~®±/š +¾)”eÆ$:ʜ+Rvy¦`Ie´0gáœà1Kœ},Ã%SÑOhŠ¯æ¬‰¤>ªÞ_Ó¢ +—úJÃ`€¹Ê¡Äzl)G ¥,¸¸×›Ñÿj>²­ U +Aû¡r…Œ\¥„Vqλò½ìMy`™÷ãÁU批d +ëƒÍï¨!R¢=&~z®ÂÉÎÆÊ4îIáB\$›Üùêݐ§QY`(]† gÄÙ +Ï+¤OÉG`T·ÔÛ è ¶IW‚"ðҔ 0z/ °nMùÎñs[ÂZ 'B +÷'Ð\ß´àš¬$VPQNq´v¢j‹n$].דkêœË…f: y?£MÓC½rtb"´Äé12öÛó²pç€[‘xÔQi-‘1ïxJç¹ÅgL\ã×øé1QÙTìcÙ£¹d Škûd^¶@É%Ý°Úc‰XLãÂaÚ©›F;ñÛï+–Žªa±bßXP5F᫇Aø”kšPÞ_Ê&C ñ•ÒóÿŽ•éE牽ik8Poêà¬YÅÀ\֋H¯ )ï#R)Œ·žÄ*Xêkz÷2j’•#´K£8£¢ÿ¨yÒJĄÆ‚gœí­© +°¡h"¦¤*£¯2´Œ4ó„2¤=ÏÄÆTMGJÁhÓäíZŒ˜ +æ;ƉÅJg„aia€™[N/„“‚g°(ÈÐK¾²È¥8; Û±xþÙ*W._—°iRÖÕ°_P®#µŒû\B¡jÒÄɆ@’WS)Uƒ\}Ç0Á:ï‰þõ¯pÓæ#VѪ +ì Ã9|9÷òÙ<ìã*¨+!GAù wèxK9¾Ž"Ÿ(˜iƒú(Y´#ÿ*Ѭg¬S®S‚eà™ä×±î¥Ã(Vy¾pp)%eÛՐŠ8ÃHƒk–sN%ëRjòJBY± ô©”µé3Wd?QS½ ðºÒÔitƒ ʧçkðœG—.ÕôàKUÁ»Ý‡$Vjz`m~äº÷*áXf„S1IÉnItù)g¯ÔÕák—ŠQ𵂆Up@½…‡ŠjT^ €\@Qiˆº2þ¥`Kâôq:Nœ+°)ºµ4c՗8Ýƺ¡H£òaõˆ‹3Ä@®/!DœšZíÛy|VµÚ_£E©Ú7½DsŽC—׉ÎÒÔgBŒ,×µp6(½Ë5F®×·ZñÏwo¥j× Á3)¥ì‚²_`v.åj$HŽfœÌ eÜ¢„—q¡ ž©íÁY|í‘ß„ÒEG·QEK2lTÓE)j_Ò%¾¦€¦Qӓ5×#Õö,L¸Œ +èJ¨ +ÃÒ&|½…;‘]Ò ——¦ßµ-R*’%}¶u!#Q–Š®¬ö l"”é¸~ àû<ÇÒ +endstream endobj 31 0 obj <>stream +¬æ…ª|¯‚¡mÒj7TCD¥Hø2‹º7Æ·9/=:ÃU—Qw áj÷ÀŒ…-ª¬R×~i(ŽuÉ·¾4cåœo\DŒ/3\Á{]O–ê .‹ø’RVÑ°ìY¸¤ÔPÉ.d¨„„X¿¦Û¬W0‡—jW¥Êý”òí¾™v– Ïù&Ɯµ[w3€CÎ#âÚµ»ªyѵÆY|=»‡ª®o¡Û©ÛîÜMB· ¹Æèàç …â`ʽ‡:l<óõ%ƒfƒ{"¢ò +*$ ÒM¶†kž%¡ÓJßâÃ) !tZÉp8ùpqvúÆÁm¨¤QKÃJ4|´deêBm#Í +ºØn¥AòÊÐlþ¼a¸`Ožr¢¤ívˆy””Í*9†z½Š8¼³paµî¬Lùîk¬ XðÞTQÚgΕr$Ý9S‡'°Ú$Š‘0aXP*ÑéÑOLTj1 Îp¾Ïyt_cg±L(ßGr9ƕŒVÁé.èFLpøÁW_‹™Ï=Í8žÌð ¾0j(ȑœêÊ~àÔ;w„rÅÓ+R¸oÚþLDËI­¾ öj‚¬#ÏfeÝ<ÜӌIuô®ÈŐêó5xÙ­VUt¾ý®óËßV>óði~ñÃxp:]Ì®Ÿ÷æór:F¨èÅO“ñóép<Ž_Ÿœxøiùz8Žùú«Ÿnñ7‘¸_þüäñpdQ}ýÕþÜù£ýöˏç?M%~~4ìχ“qoú~ËOßw¾ýõf4¶?žØN‡—‹y9û®óÛðátÚ[nÓ¿ŽÓrŒ-dçÁÓñ<üÿÌßߖøã·B'ß|×yð×ñ°oá/-îñëjÛ·½ÑÂ7~7̯7·÷n\cÛßüÇ0´ërøúz¾ûبý] îD6ÜûÝÇõþH†ôëîCúõî†ôðéÅÃË×åը׿ž—éçåÃùËþ5°™ñ…Øy¸Ãmºm Ðè» çÐØÐËÉbÚ/Žn¯{»Ód¼ûŽïn\Žӝ5-g‹Q>Díïjpzç‘ÍæƒGåÛaºµûøªOí¸º× ElJýþŠpU>é-f³ao|ºuF£!lž™Ÿ´A>;¸CFÛ`D ÃÁž†¸Æ±°ÂÉÕÕ¬œoß>‡!Þ%«x†#=f&1´žþd4™þñÝõp^6`öïG[ZW¹<6¿3M!Ù}`·e1êMøõv2.Ç æê“w6ÜÆ£=›ŒgóÞ>£ OÞÕhÍî£]L¯zýòe¿×híVžj‹8(XDÏ[VÝç;+CŸˆÄþç¾YL“1‡àD6š¨ßvÔow.è<Ÿ ÇóóFƳ?|ºÞ¼ôÇι^ŽYÛÏ&"›°vyw{bÛ jr[N{óÉî*wôı]í‘|PêÛÙäæv2Ûªñ6Ù]ÎӀk¼¹C¦±ûúfËà+#G1¢-6®Êˆô1h—oTƒ©ãáyÇs÷¦ÃùõM9öïõaì$©'ÓÞíuƒ‘ˑ<Ο÷†ÛŒ3홼όڑ¾‡}e|—³üc9}]]Yòj¼%¿„Iú¤9€Ž`Œ×Îýxð¨¼ê|ÿõ¡‡‡%÷7<¬ÉЎ-<ìÞ‡ÝËÐ00í}¢ °»‘N.ÿYö秓Åx`ûx:Ù2+ÌÓ¶ÏvŸ½ÊC;žˆ‡Æ`ç‹éåbTŽû»ûÖÝû‰_u'ÃO^·óþ–S¡8Í_ Geƒ…PyèÎ8T7ÙÝÕ|ٛ•§åÿ^ؙoÀ€—»«¡n1oDã/nžõç½·Mf3~æ®FÛò¾ëÓ¯vd=‡­j5š©ã±ÌÝs÷Øg³ÈÁªUN[å´UN[åô0”ÓÝãê[åôþ)§WӞÄG?M†³V==zõtwCÓqk§»ó¬V;mµÓš©V;mµÓV;ÝޏãÐN­ ý¨¼—ã‹-an_PšÿöÃEƒc™ÚßË G½ù‘-W×õ>|6«":h Þá:¸ßÕ_ÚÛ¾tIòИÈd‡ÒçGÈFÚKvQ{i§ªù4-ÍÊÁiì÷ñ_žp5šLþæ„ËQ¯ÿæûŽMn{ýáüý“n“³í˜.SÀAß;îßlTGºïÃ=æm7»î &ïÎîå +ü€c M,9ÏoCÞØ +(Ê(ïEyðÁðêjÑ ±÷Xåîy®žÍo7ZyððÇêvNû*ÝÕ›ÝèUw$gò~zV{.Ô¹ü9îå=ŽµGòÎ3rh'ú7^Îw9Ûí]à÷u’>igŽyµ´Wî,îx¯Üùr.„mâs¬wîìç$;éq×»vŽ_~¼· +Ýô,ºÝ˙Óñ :‰ÿoÝ'†ì~¹*§‡Óƒ1ÚìÏ{— fþ˜ »²³»©ðsCËmå¡;fFãþ‹cæB÷wv³NÒù²Vâ“v%äJ_K<=„!ÔÏ DÈ«io<»jp[ÎîŽ}MZ‹ÏAX|ö‰IÞwëó$þÖì³aÊ0|òáht(“uhôÙsI·½ؙèȽ¼X¯ÉmfGv±ž¾Ïë5ܑ\¬gvÑÑÜ«÷—ßÿëzTžN›Äò·×êU‡z®Õkà‹?–¢jÝŽ³Þ`¸h0ãÔþ®Æ6Žz jZ£ÞyŸC;ï}°Ò“éíõd4y½ûÉ~€ªfƒ°‚–'¶<ñøƱpÂ{juO8áîÙLÇ +›±IÄ÷ý ƒk°îŽ”?X÷½/Ð óX˜ßTá i òw…ƒÝciµÀA1äXN¸ÏÝ}—'Üý¨gp¹¥à[¢?coÆÙuo<.G/ËQÙo¤3¯>yW£}¸»7jïÑ®>yW£Ý}µîÈ_9Óïøޟ²ØÑDÝÇcm÷x¤ÇÚ£áìvÔë—7åxþcïö˜Ï¶{\«çrw+ϱÛ¡ÄPg壨|ÜyèÇV¨‰0v, s÷…z¤ 󞔺Ü]Í>ŽÒ„IËvÚ}–Ž.iºÑî³¥LÚ.½š–åo»›£¯†Ûʗâ½FÇ0ÿWÓÉMƒQaë»Õîûu>i |NîPNÛ"PÅvçòuÆê›ßÕÀz£w½÷»ÎòËyoڌÁºîl-î>¸AƒJ®ñ] j÷à ÷á'Æ®]z쮆<ŽËÞî×D÷{£þ“)%Ñw5Äi‰FˆÝ't0·o›Ì%?qWcOÆ Øï/nÛ#Á*CŒž¹S%©7Þ4éù>UGîO­šþ=Œ\ÊÛÈ¥ƒW@¬»#µç´‘K;ÌÕÝZ¿ûmäÒQG.µ—³¬ôXc—š"ÇrƵ±KGqÎõÛØ¥6véxb—vWoŽ+v©‰4v4±K÷ñXkc—Žçl»Ç±Ký/ vI|q±KM„±ca˜mìÒq0Ëþý‹]jÂ$e;µ±KíuûÏÌ13æ;ô.'x¯"”‡6=MâYÛéùìÓóIK¾Ýì|ÒÎ@GîcׇO/ž-G³Ûa9ºhŽqÈ¢§I:fw=ÕÍí‹&ªjôÈ]±­¤Ù˜dÓòf²-ÀîHCχãAy5o­ _ÑPnËÞüQ“0Ù葻h»Íúå‘Ån‹Sw<ÁÛ;÷&r{v ±Ûmäv¹Ý(rûn8NG|/“Ž0öߤcÿÿ½ýlÿ~oØý·pcܝ·G¼ú¡Ik—[sGh¿Ïµ³MرÙdzÖ>~|,¤½àj7;Ž„Kö骷g‹-ìï>8çïÁµv»ÛEß4àoîmìn}³e𕉣і¨„ʈôê.»hKØReDêØDßc9Š{Óáüú¦œ73ŽñHÞëô:Æ£ùÞ'‰~ì³ùBûMxëÎÿÀÎ@Gî¿;¿a‚ñ!ÍZw~ëί!YëÎoÝùë׺ó[w~óQ}iîü¶[ëÎ?w>ŠàЗÉ÷ÍDÂօ œÖ…ç°Ö…-[þÁ°ÁðêjÑ ܱp‘Ý͍žg“±•øÇ öÛʃ‡?VÇ"^6+Syè®Æø¾&ïvèhøúznœô!}÷±.?wg²Øî¼t1½²âwÃ9­>uÇᱜñM9ê'öoځÓZ[«bkU¼3Qá^ÞðÐä´oM‹­i±5-މôþýëiYŽ¿·R_ù½=+‡¯'ß¿NFåüûi9ø~2퍷Å.´6Ç;—ßD¾»]¸÷Ûðf1ßR±¼²V遻Z¨éîƒ+Gö[3 VôÈ›¯ Ñfqç„ Ùþ Òtîò£Þ t÷Û²o9óô‡_oí)ÐÄö´úäI”»ïêtsSÛê“w'’l1€Þ##T“•ÜZ¡Ë +E;怲 Q·–¨ÖÕZ¢ZKTk‰j-Q­%ê ±Dy»“³Dy³¤ZKÔ±)Ú£íƋc \iík®ik_ûˆýyéÕÁû``»ß‰î÷¼æÌ>v‰Öærï³Û½ªÉ‘TžiPÕ¤­¨s¹ñÉulGr[®á™|ŒqÍ'»­÷9€ŽÜÓ +p/û×i9¾O×¹µµÑöԘÛ"GW¤b÷²m‘ŠƒÙm»ßt>Øý–zl{WË°ÁˆÞ7Ñû#áÇ +'WW³rÛgZšqû#UXžáˆ¿`må¦üKP[mº>›ëâèfªU0OÁ:ùfçEün8hûç›ßÕQ*Tƒ¡]—ç¸ý] îD˜Ý×@ »Cy®ÑHÝw(tÇæ›{T¾¿5ß´æ›/Å|“¶æ›ã“Ñó{g¾i0¢Ö|ӚoZóÍ1Lù—`8´éjÍ7­ùæþ˜o@Áœ[ÙqÖßb—iÕË{­^^M{ýyoôÓdØ +Â=¾+™øew2À~CóÉ®¼ú—ùxòr>œ7ظ3lþj8j’û_y讆štw/ìuٛ•§åÿ^”ã~Ufé±»iƒâtãÅÍ3»iß6™Íø™;ۊŸ4¬òйK[²lËܖ,;¸’e ¸ïÕtrÓ`±õݍk÷  æ“’ÎäîÆtï«°ÝË"l d–¶Û®ãlk°ÝÇlwgÛ£Ù§2‰½ZL/#Ë,î)µ-‹t”™žM *ÇeüÞ+²µ970qÜߐÁ&C;¶ÁC;Ž€Á:špÁŸËé»áô²-Ư/¶T~h}:›,KGïәï($©Gç‹r$_Šÿc÷8µcuÀ¶<oA«Ÿ¶úé=ÕOm³VCm5ÔVCm5ÔÚQµê§ÓPwk[ õþi¨÷>êð‹ÒQw¯sÜ*êîãlUÔVEmUÔVEmUÔ#TQ¿yøT$?Œ¬ª"Ìèâ§Éø¹Å‚gžxø)Ü¿ÿòõW?Ý:<ÚýøòýÍådd»tZ†åøª  ¾ÃhXþþåøJ=ŒæW£ßÿ³]>{kûüuÒyøõWIç—w_µ ÿýë(òàÏàÑIð¿¿¼‡oÿf?ýÓÂÞutçÇÎßÿ‘t_‹Î//à7Û£´›$‰.:'EçÆ~ƒ¿ç_u²nj2©à+ü¾¦Òàç´sfþžÁ6´‚?çáeø…šÃ×ð‘âƒçø—~‰^uÙ¶½‚ØÁçöÑø“uEbt†µm?äØUøëÆD¿œ„æ'¹{·ýë^àGit‡q¿žänP'¹ÿ=’{åŽ>§—0Ißþu +kÐy=íÁŒÏ;ê;œ«“æÍÍý{j§ç$Á&‰èœ‹QÊNd…ԝ¬ÐºóËM¥¥õ-SÓ9íïŠót7œ2Eœ8 §§v1þ¦-éfÑ"DBݸUUœ‚@f"ډ§Zô—ç)š½¥‰­þ íÂÃ~Ž=Všé¨QÇhš×͜Ü}æ,*™Tig€ÊjyæDQß2•+3·çén8eV9œ¸o¿ëüò7ïCË©’nZè&=Uv¥Ø?Raì“«TÀáÿ¿ôVypÙÍe.TGw¥V÷è |–)¬=ÿ#L1|.l÷ðG,‚>ڟ”@-£;Ç|saO°yõœþæâ[K…,7ªÈ#SÁééC |1™‡ß\¿ð=´ôš›ðƺŽÕ j¶‚nsoeW™Tz×Þþu*3ìI£žCµ éø‡_o'Óù+:$¿¹H:N'“QµÑ¸w9*Ÿ,†/|s!VQ½°G×l>ÅEu×t„¢à,„/ÊÞèǞίШ‚¨x9ö˗ýÞȎõÉt8øKù¾:B^Ÿc¨æ0†ä /Ô zóÅÍ †I`¸ý‹ò@׈Tg°IíRԅ‰?$™åŠ6t"Š´îƒÛÖI7_#Tˆ„¥ +·ßíÁëy}F’îҌÿf~X¤™Q©†—ÉTⶶƒ*ƒSDeҘޒºÓþ$óçœ Ž÷Ó_b VêùÚÀ»o¢ÎÀd'&üÝxL›ÍÌÞþœÖT¹lüX O€}˜5ML×̱œnÒTÙ9Žì&*|Ð~¬:ûž¢É†Þ&ÛǬ·9Ù:fUTǼp£çîƒ"ð±iäi†®ë‡Ž²C=± Õþ“Ӑ톨ü¢sçê#§õ¨¥©´?J?$éG”øqÐ_¹m8'¹Tãł„ª¶°vãÈ6|ÄU©+«2«þ MÍÐteQ.=Q3"é$ýx? +úûqפ^»Ëôº]¦×î²5#2~DƏˆæ…þ~Ì5¨·î1½né­{¬n|‰_‚Ò/3é×]þ~Äå'*Ó¥«?hY3*Q™­¥'V#ÝX¤JâFàÿ|ܕ'Öí$±n'‰u;©~(Æ Åé7?þÏÇ\rbí붐X»…ꆂ¬ìÿ +/aÐ_±º²ÄœP3/^¨Z =±2/Áà3n5·¶ýù¨Kli(zi(5»ei(zÛPŒŠ—uýdø?q‰}ê9‰m‘Ù3éR +‘cÇ@y…LP 98k§“o‚lÁ[,ˆ‰‚4@‹'ÛM8ÉødüWúö`ôò&Ð^:AOõÈ+F¨«ÜÔè*¤Ä¬›‚l‹ò±tˆ¬*(gn ­;(T×´5ywÕN¸ïŠ$´¯,Væò€TzÔæúG݅J?Ü&ïƵ +½7ó;½~ocÑ- +)ì¡ýft@'iW㇖w…I3ÝÉ»©1¸ |£”Zà í¼dª¨NàQ@Á@{®@;°Ha#`Ô׍0ÆFo,|#îÀšïû_D4Fï2íÎ6Z÷ìy%Y‘nµîUü?Mæ/Êþd:°<Á¯}T"ìŸT墛ªv›*’tu½ž=|úÄó‘WW“éû–©]σÉeyñðiqaûürþ~T^„·WW3¼ö—cSrslú”¶„c±4yX°S¤ ³ËÄ5ʺ)þÀ€ˆî ‹m£¸jûÁ¯<^ yXgiXëŒ +ž”n…j¿ +¨óå=^†Õ­E  +¡¥±¦¼ÂÂȖi´«ÅfÃ2ñç†À85x ºðÅ~P8(w„Ø/‡ZûTb_%’üµ=/§Weî§\½ag%M||¿kžeÁðú?Ÿ_][ôߔãeEm)Ë.$t½ +kÓi’åàõL³Ää°¼ò<•Y›s£§U·›“¢]¾Ëo„RYtU"0®%K”ÕÞe>[¦iùDšft@Bv•ÌEa vՃ8–({ÚÝ-*ûiWªÌáu€¼›e©v =)Œ}B‰n‘f.øÇ5Z…žs/ùU^u²Ü™“åÃ)S3®“xèø}™6'1åNbª³†ïÒöcìÛ!eu¿w?Ù¡¦™HØ4¨œ2¥g4@ÿQ ö{hÁ—ꛢN„ޝ¹å@ýŽÇô6X¸,Á3a8V8—*UNˆI´)è<€dÖ͓MU+O:&eBKÉMá了öø35€xŽÖAñùê»\°Yôú“ +€ 8ûDxùò÷*RK~Û[ ëŸÿ•f*ƒ§e¦v8 ØÜ·®Ñª Ìa!ò‚>ó²ßºFj-àœXýf¸KÅöðê3¶[–N¤w´%¿n¹íþçæí? Çoz‹«Ù»Þëzÿ˜»°;¬ƒ–,Á 9Îæ”H^Ê (†Åf×m¦„†¥‘[&ö}è_ Qh¥ËäVZbwW^ä’#“î +ŒÛ=Ã×;˜å-Iî”aÔ¡}Ÿ‘pƸïÒ~·ƾ[á#ȕ³Ø¹è<¥ÎHG0!3䢉Nû) ¶ö­:·lN´&[€ç½#ƒÐH¯ºi,Ÿ€'ÊØ£@܅B”@1Ü8.O0Û«:Àxì‘âñ¸—Ñwܸ±èÐŽBßqöܲ¬¸@Z$ðÁîÄ"ÏŽF&PòÄÏ }Êû¾xˆï«ÝZY(}Uø^;ؤ0½ô´[K•…å؀‰ÊaI$y’xÎiuÃDÛ~Ûs#7>*܁p¾rçy¥Gk@ŒÍqÑÔ•J¹©}‡¥I–CÌgx:€º™ÎMùÉÔ)edžEVm×­å v-+ ñkð–Ü£”]™e +y$â~Ó£5 Âæ^f(…a°õ,êx­ÛÅ/sUÙ³ÑKV°Ÿ’U­Ý>¶¿€\ƒï‘þ=™ è »+­È•†ïwª›’Ók<Ü!hzp/ñßû¨„d–iq «Ó¥©e:¢·ˆ:âqP?—†âTû|fâáÙ§ •ðSöOn'ŒpÒW~+|¿èißo=ŒË¶ÃcÞC”À—ÐÓô•±À¿žö}«öݍçÀSÛ5©MÇX90SŽUiŽnêSX*Çêî‡$:µ¨ +ö܁¿…0·Ÿ1ޚ`ç >¨¬plÀ?[‹ž½ò:l¤ÈÑ!aqßD0°MiáPØ£2µi ˆžÜ`Å×Þn¡ëíX—ÆCG<4­0®'tjR Ï°ç˜HÀíšÂ¹i¥0Xièj–ᨤ–õÏfvٓÒ>[`DºóÛZޟæNSÒVžYó^Û¹¼0`–7Y7Qcp©Y* +´7¡’|ͳ0KŒz{>º[—è}ÆÅÒ&öôÁ?&s·“?ø±7{³dy:~[Nçå`y“ž†··v_,à g°e©ý/‚ð&…Ù=Pþ‘¿áþxћ¹d² Û?Ñù剳¹•o‡x¯ØûÎ/?äï¼ +N0. ÿùèv +¶ò/×È5tÿË£u¥;°€}ú;ô¨7ïýÑî6™ýÕ/O¿ú—þÏÿýïµÿù¿ðûúŸÿû¿?Ïïk:ÞþÞþþ/‡°>7ÿ¾m}Ø€/ؓ¸r´?3û²ÐÀ¼~ZÇU#3pÑy¼øí·÷à³UI⛠äÊA ¸øåÿó‰¿]"Btnõsæ°ß#â‹U”Ž½I`©Û‰] ±7`YYjá™ú¿.\Ï .NgîÏk„®J&ß\ÔÉ&4–D†zhÕC³* DÐH±XV…”ŒÄ”o.@P16U¬Ü»¿°òÍ҈+ß\|ˆÀòÍň,»v¼Vhùæâ±[AÎsç<ôëÎÛ·ÂÃ睇‹ù¤ã¶äð·2ø„V½kÏ.gåôm9¸°2ý…k5«n;ßǓq§…[ñËahIäæHTN+ûÁjv¥…œ©Ábµü·¡A ÔäTåƆIYÒº˜@B¦ý›'näÎpd—4þB€3/³'Jà¹J¡uü¨]PÎ$@Ø#öÁ#ó@Ù0£çK@•aH¡·œ%ˆ{AÄ&øUó7¨ð(›ÑGìÅYÍH™á0“ ²Sž»Y:ôà&î‚U½$äǝ·»½Hó¼Ú{0o!*FÓnnRmæ@´ °@»#dÌDz{D:îdD: ÁÂXâø;‘n…Fþ¬Îë“.†á…‡¿Û¼Â +¦yõ@?ƒÖUÚÁûUÌ.¡ƒ©ŠhˆvhÃ`ˆŒ™hÀ¯7-u3"…äÑzÌÑw"Þ +•‚§‘Ù¿ÂäYEf,¬ š{IÅ«¢k%‹<ˆŒô=–  Œá9/ôÌ@¯ÅETÊÒ¬"-Â_§ïyÔà«Éü!…ï'@$*(–ÃsDÆøú³*y⑘`BË wǔ£>Ƥ£ðƒ<|B˜tË4Zþ*›ÖÃÂÖòÇtØ|^’ŠIG"WL:ÌøAÝ5bâ1,¢^sc$ÔLze×ú~V¶­LضDÞ¶¶íªÒ^D=É´r#$¹ˆH@²SD:–±"Ò±$F0–Õ1"ÒX ] Ãñ1j¢¿?"u3¢„@2ñF߉lËô©ŠwÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(Æ @°„ã"¬4nzqD-ê^D-xÐkô¨µL—ª<Q‹@4®œ +7n’“"jyi*" \"ŒÒ÷ˆX +Ċ@8,ÂJÃöïhE‹h•V ²G}'Z-S¥*ÀE´" ‹Dޏ^,ŠhEÒSD,’°ø)/1Vÿ="ƒ±"3*{¬4nzq¼}÷"jÑø)4a ߉ZËt9ß’øiý³‰7âT?mÒÁþёVKÖøi¹€\C÷ï.~Ú<Óì¦õ®$ú߇ïúã¿TÿGŸÚÿ´ÿáÿÔ¬¡ù8«oýûþ§u†Ö;C´ÖI³ÞÝMã=—ËŽÞÇUãž\qÖ,›¸kàÑU‡ñ^.›:"Ʊ;¢È'—áÉõŒÞût?g ÜÀ£cŸ¬óéXð¾^|tÕ¯³nàÙÁÁ­øvº—w§Ž†g Öí³nâø±Ö¹~¼ó\qÿT¡ @8²U‚÷rÕQp3Áë¼CKà&þ!ûh‡ÁûùˆðÑU/ѸŸG·ê)Bð^¾¢:*n$z© +Ýݍd_PçHðž®$x´Æ™´nàN² µÆ¡ÞÃ¥TC½´®ó5U¡»{› kvÕߏöñ8Ás«>§*tg¯ iÕïÐ=Ð¥ªY¨R¾ˆŽve„àՒëXÙýcÔÁv~gKƒ¥MPt]¤DŒ®"@`û®@ðÁÄU9ÄÄè— àãÛ÷(gqT¡Š¤r YÔ×ÜWNªƒ…'±¼ô¾ +W¢]ÍF¦›€2H®Nõ,j·ÔكÝfYWY^•B¨s£3¨’º:béç/Àõ|rû×ÛÊõ·µUñ›ß|Õ Q©/ì$\eNwq›5}–áóIÜèDåÝLà· —@Îl’'üÕǸÂg/Š±žŸø8<XVc¢ç¡þ[åºð[G±‡þ¥çô‘šÐ£ÐÓxÐg¡ äDˆë†>úë)Üg,†|•c™°Þ㠒àé"ýg¢šHÑ賟¼9Ýëë_î:zrÙÁ‡Ñ +ËãpoŽÞ Uõ£ï÷ó<žøÄS±Â×0TèáŒ;tþ1.ò'çÛìÀŸ@®¬° tù*_³®m&–/é؈wù:ßµx¥Þ~¡oLÁ›*qc¢GsÍP4uõ‰ø4Õ¼¢•¸4;ñ¼E:ûWöÊdùÒܼPŽ–¦2G ãý„õ­³bõ2•¸OwÇ-Íòf47ÑN;á­má°°OÂÊ^ސñVõÓwVÙÙñ†?‰Á:ú‹FôOS5ûIý}EÀu­³´žþkqŸîŽ{™þX5ʋÙÎá†r³Žkޗ1”Xæ3g8gq'…ÀÿÒu­2F¬Ã²X³=±IôÑ·¸Šæ˜JŸÒ⺠VWĦrhÇPlZu‹Ì2ÎêëºÐÛÏ*½xùrã­¾ŸPñ€ WMšâmè…Ê)ÝÁ,Ð@+•gÊ Ù)GîP/ÚK vªEÚÞÊX@¯êcB—ƒÙ7hí¾ t!"¼‰}LerÝáFÔaƲ<ªþ†Âê~ùñü¯OuþØù¶?œöG兺ø®ƒÑ•vêìöÇêìªn’ 4™¦™VΎ’tU.ìÞg S¹´Är͙•ÏL‚:N€/ë®=„ –› ¸ +§Wû’Œy‘ÀAi'ʓ +`Z|®²«¥[jà§Jü!}ƜBè,M½Šfû#r¼€½þfD¯¤Xn{y4g«t[ÜΕ°(âa§V—Ðèâ†iW¦EK3OqæNà: ÷dËR…NÊTƒN{%Š…¥ƒï¾¢®"€"± +WSF¶~WÜþ¢t¦Ú©³Õ~naPw£…Áíª£…åñhð&3Dã¬ž‰H²£‡QêCBÒ{èܦ'Þ䒲 -ÂEiû™ÊGÓzÒ¼"Gá%'õ:O]Ëzg Î}§®å:m§r×OD³›*-Yú]ó1žÊ<1OˆÂ•i^YnyœÅ ¥î-­Q˜Z7³¤Vùåë'žôx1DCî,}jIŠS\4ÅÇêZ¦ùr<á\žý58—%ø£–Wu'M@TUŸÿ XØb¥N>ÿï3¬PڊŒpTZAÑW Ê»Rè¼,  +ϝYΔ+Áiá|“B/¯ +­ˆ}M +™ex#Ofe"pƒÐ¾+Ÿ©= ,ÀÙÕà’¨gŵL('øÚÏÂÊypÁ!"‹Àöd]-½ô•©DƒËÙ½ž*À·jõ<+ภHlwír5àd’¹p]‚jÆ9ž²D¸ú€E¦RW#€!¨H"ÀÆcZ¢Òˆd ºŒŸ¢’ýS_üЧM>ó‘) 'bkVç  {ÌF̝֭ _k<{ö±šùȤ=fÐ=.Ï¡¯ùØxk¨†ØP•ù«›7[ß\DóõA³”c]z±Ít„ z ¸½’… Ê@œDÖåÒÿn © ¯’Ñ­¢]¼rü’Çò×Ø/ŸqqÂÏã•3]þ˜»”ÓxŒId˺…Âë÷ðʼUV¨²ÀýÈRã,xµ‘ÆI¶ZŒ'·R ÞV”à…±ØÀOg2£¥Îý32µúš×® w†U–¡›ãíªŒ¾Ÿ¹ú öHvµ* +˜¡ªU™2˜?Ûs)U + mßûE„¸Ûvì:”wS!’ÔÀeÝgNGÍS”wìB6°€1ҙîŒ@Ò¬Ðï +u£~S.rå펁kFt÷KØ N®k°Tvušâ…NP¦ßuÄªØ ¦49Ÿ»…‘§ø¸O“±lBxM…Uµa“aI"‡ý,쌊 ¯œÀç¬èäXôƸ¦MÎgcז1â ðû*ä4ºk„Š'…¾£6jõ@°ÜáÚ‰%Hìì\û‹P6;Û1¬* Ú ÜMä.@Ó êµF¹Š²–e9{ :,á)¬‰êÀ +rÁ+Œü·“ ðŽoªs†×0撊ÑzW1̖Ж:Î,I„™Y™½³šÝÁ +—ÚÙYPwt·Kí4^²¾z†’noì `›Î Ø7ëhˆ 6îÂ.i>pëÞåyi;ZžØOµÊ}²‡bïô¬®À$]荻VyU]Ò8CC2Þƒߝ ïâïð ÉÝw©}cÂˀÔcóßÁDïoä‘f-ŸŠ¿çîN$@+ËLýÜ%ü÷¨éÉø‹vV ôÂÊ4 Å/¾§'îJžpoYþJ½[§}™Ê·ð#0~¤ÁÃdå’Ìýˆ…ˆWõ1¼2ßöhZà•*Ë*Zƒ÷.ël»½·öÆÓeee•ÜDßyUY¼kV(¯^ü\]ו%o¢É®®¿šUª«Kòc¸Ðˆöª†€9Ó^×Ì9”á†Ìà͏¦Yíœ7x¾Ó{kçÜ{Ãðfb^‘b|¼¬de§Ðüªð~²¤¨Y&4-7µÛ²×Ó5 è¡+ÿ*Uó*zòf7|ÍWñր¢‡Žßçfe=¼¨ÿ‚ w»Ê»¹âõUùëü²œ–ÃþõÅãɛÅlCîêyš +T4rˆ„sZzƒ­š¡1•"—Êʉ¿<\w¤‚ÁZ(ˇVOÖ ®¥D>‰UùÛ9};¡¯5ßèËÌ­Ä4z50èÜn‹w_gà\Ötx‡oçô턾Ö|£/³#_€îÍ´BޟÙ)àÄsØóäóGÁýÏEçqïíd:œ—ãÎõpüÛâê÷ÿª¹‘òóØØ  •p©¨½ÕÙà¾ÄçEwу)Üí`"Á$-ÓuØ¢›Šœâ£ (Àå˜d$8Ye2÷gÞǘt]*8 9æaC¨¢tBª´pÎ_Ъ3ôh è½ÒAœšmÀFcLÐ5³šºNwO£.³ÏÕ/È»¨Å´%Ô¾½ª4lžƒ"¥§CÙpƒ;¿ ÿøå}ÔòÜ-•ÜÈؙËeš€‹- +Y!˜R :‘Éþµšx( ób0ÞÓÛ ËFãÃ?t“eRaÜÊUQ1‰ÎQ6vQ®…íÐ΋ÝIŽzV‡tNf¸o5ÍáȹB_|fr(: ܽ&hó%â]|Ÿú{Ï\ õ½ða´ +´£€<2q¾œ»P„‰T N4ìÁr\maZÁ c@ZË 2'ècUB—N0eI"Üm½0Áhç aç:…‹¤í6¾ ²p¾{Beô:XÍH騄" ýÆ{Yµª ¶r&O _"õ ©t¢dØwqNTÞ¡Šœìðl*áÞX™ÀÍ&(éb¤§ŽÆL݄…1 ïTL%Ø7À¶â‚©!Ó'µ[D+b+itÌ3(q7~£ßþ:GÙm*ŠBâõ’¹(@®Ó©Â[°UÜâNgkÛß\Ôò20>îÉÍÀðYÃϼ'GsÙ‹§¹ôö=¸ZL—˜¯Aºä +gƒ”¸¦¼Í¯{q7ûÜ^üÍÊ5ÎA›ó8|n…ËYh Ÿ³’ì^œÎ>WÃëÛÜÒgöáw˜¶¹Çäô}xž[ïûp=·Éöâ{àæ©á|އ÷A6sSîy­+üÄо›=x &ToIÊÞoÙÃ˳ŠÜ¬#JKÀÔWƏ@v† ­kÀ ÎLÔÂèÑs'˜¢…º, Ð*~´„4ÌRzŠ©EâÌ”­‚¢^,ó|éQC“Œ)à3[—è Ñ˜Gn™64ê~@P ŒÈºU ¬<^C§¬ô©†Vñê:H«{ +^­¢£í†Ls´ºgÇ*µüä¬ zñÓdü|:Ï-Š“G=/þåë¯~ºÅßr÷ÛóÑÂþûìòŸV=¶š ¦,wN§‹ÙuçÇÞ¸÷ºœvžM`´ßòcÇýz֍†¯§½Ûëaß7}e)ý ób1tN:ªó|Þ}°Òø»Žíñ·õX ±ö™¥ÖŽQ¯m2ñ3v•<_WøËäzTÎæë9µœ:بҴ7ÿ­´jñøuImýÌÕàu8þ2-‡³òÁw®'·¢*±?ÁÄ N—º3u¾Bgp¸ÿ+àîûi¿©Îç§S»¾G%¢8^ÚmuqöÒ¶L/zó 7¸çÛ©Ï;´5ó#zÏ9„ýèâê +üŸÿïæïùòÊ"u/·ŸñîÿÁrþI; ÂûUGUÞ¾Óð?ö|Õí9\¼ëà›eÖr=d:ô_ ØƒŽO5 ¶#ÁŸðO|Îá¬ÛîßñV§áüT¾£ÖQýªV¾Âaj{gnoÁ†4ö›„8B‘[‘V:Z$kiñ ¦¶p¿ÙY|9o'ìë¯üe¨mM¦ÝòW(±ä7¸4…Èh%Šñ|1}[NgýëayiåÜ?vÎ-aO~¸º*ßØw`Ý@ (‰u/)”gJ僓"£²–`>&ÈnDiÌÊèI–Ob$¼»í©R£0jÚ(¼ÐªH8ŽßUnÅYºg©ÎßCì¦Ü@éOº?±àbüéD—{»€Lªò‰J”@õ[ӝwp)¦ÈRw¦‚‚}ë—NzÔKGšví4^;Zç9œ|"ÂÝÂ1$¤P‡Ë ;;ÕÚu“÷ºù,˦µ´ž‰&úó¿Y¹ÍƒhyÇ1Ë©6 ²4^Ž1!JË´ ×jwDaåÑ®*’// "i +sRH'›Ej¤íæV¡NXì¹ù8äù° C9»žNnŽ“OZÚæ¼Ð-æö5­7½ÿÅ?p5,o‡ãY9ú°XËjÆnçÁ_ÇÃþdP6¼|Ñ ã†2x‰Ô¢ÀÝÐ\&~ðäÙå?_؟ÿØYжÙyçhÂmOø#b-rU<¿ÌÆ{/`Ë™s`?ÚyÂ5仢ðø£òÖîäÙ³qþöso: 5Ž+½(G=ؘ¯&•ßè=k°rïê1óÏk'ìÕ§Dóð×"}nÕã î²ZgV&Ã& +cRÁô ú¨7×/Ø´áLžåûm·Ïh_t»×`C¶öõG A|~Õt8x½I"•4ùçx~‹´Ð´gnFÄ@)s¸ðÇÃ'W³yƒíÓ&$dûÛ-7¬`•Ê<=Ö#C¶GÆg92$ú5?ˑqœ ÍU1(T.ë +•'ÉæRå®l÷1f;È¥òòí"út‹È_1w/א¹›¬­#š•¶éÿâA/û×¥å,cz‹ßÿ£GÂÛZ†Z úûWëó +å¾?MÞ}}²ºþ—RÙ>:ååh<¨Z“.G ¯@a@R(o{ýïÖ°áFW¡|ˆ ~Ö¹žñu ‹Yùüåù)õX¤¤’ Á]@qç‡_o{–©ž–W“iÙùÙjà¤) Oõ^Ïú×Pš®ÿmùð}æϦ“ÛÎËëÞàã1âêæÙ5·Ø3«þlêx+›ï®'ÓßSfSÇ 7}Smô¶œÎ«Üð¶7dþØ2÷–¹{æþwË[Çvý þ±µbN§bÅ9ý(ž¶Ú!‹ÎÚ¢:Xô‡ñ ª?º½éóÞ¨´;Ð ãùåîýþöïÏ{³Y9½±{¬ÿã;¤À/¿éª?|ýÕó~• 5é÷ÿ Ÿlàïzv³3æú +_ß¾xrÚy1™ó+’TÀ-Ÿø@j„Î;¤¹ró'åè’Û§2KÑ ”ÛÐpúû¹¥Yáî@ë +i”KÒ#…ÎÞ÷BûÍ5–°=$q{™.¥nËöwՉjû{¯­RÞãGDZØáÂP³¼È0ÈCfRh,~™iŸe“æ’-(ÝF¸8l‡õOpÁ“?©¢sú'mûtêîCÓRã+Ü쀡ÝÖ×,cIàÎ^ô€aØ¥Ç,-µžüIæ³J£‰Ìlk…“žæ™K4Ná–ã+îl¥…=ùS‘TPÂã–Ԙ吤)v67©ñ Ë+áç PB/…ý×âLbœŽJÃuÅ0-™P.±Â¢× +Líº-RŒ=ÊNá4ÐMè÷éŸLpj#”ï•y®=2Ÿ£Q(ø./$,#“@F…tTaîáJãÜOaè´]÷ʅÜçTæ4ƒŽ®b81vZ+ ¤ —ƒ¤Üj*•»%o|¾wFT´tKLÁ«H'0â:™”™N…3²Y\®¸Nât»Ò…rÛF´|¤£¦Gip^ra1f:ìªTÁµ9°Š ¤ü`•¹Ë™2™4¸¤¤«äqaç4LG¦Ã7R.b5]»“Ô¸™—®Æ‹>\ÅØ_ô3aÏdv/× »¬³Üͅ Yåaº5î1)Í£"•ké`E’cß´É º›aaf®sœI—®v.… -L]ÃÂI‘v«ú&eØnyfÒÉÈT³ 5rwS&MÔ¡ ;yˆ_ØÝ䘀Ñ؉DéB»Ü¼¸“‹|'på‹0Y˜^ê_jQk¨¦î!¯·3h· îKm$"”•ÐžP)í ÜÀXÀoÖ¯‘ØËP„ßm…[ÅRbй ‚\r•ß l\;Aп0µº0{bIP`àl·ÄÜ%ÿE¼Šø Ïpãí–Ó:l7Ë«#Ž.“ ® ‘@±c\$Eš`´F×N_–ðz&·È`èEÄ^„]Ž˜ºî"Ø®î€,DÏ)]/™½H¢e‘Äx†—Ì&p;m”p†8¦ á°¦*GˆÂi‘"•2‡ýi7¹–Èøíi¬Ý¡ŸÑšIá”Z†qZÒÂzÎqgDT³ì\ãÆ´h•[Øv@¸XÒÜUÀHY‹†•¦ÂÀù)”ÆœEÜT¹©´ÔB1ÀßmAË÷ +dø|ØÑ  *‡åpØÁ$ç^¸Î ˜hxídäˆÎåñ1ôó# Wé°xsè0îêÔD$M3Ç s¼sºœ–ysÌú9GËx²€û[J˜7Qà³J˜#Pu!rÇñ•=ÿpMyÑ4T˜[;c°ˆÂñ’ÂVxbå2`N¥r»#Ó bÎub?ãé’ —¢3۟;•ƒ Ï­ˆY*+±áì¥Ú²y<\•Ý˜ dw¯«N-¿ÐÄÒìÁÒE U씹$D‹Þ‘Ùî +‰ÕRÇ”8øˆõ;Ön´ˆÌÂ9ÐXg™cž™=ÌR·K3û6µò$ò0I=´é—ä#2jÚjÞ-„Rü:$“Gb~½Chù +²?on ´e+ß°òð³iÿz8(Ë禉à§×ˆìåľ`º*ßp-¢'“ÑÀEÑlEÅM²õAí ^w-ýS›®X~η¥ãñÛ'ÓÞb6_\EFtž¿n¨˜¹8rtLJãBš¦Èá­æUävñ¹à8íDÍâô°ø$¬êHÒH íXryð–' Û0VµÂþOB#ˆ,x› ÇEjT†–±ªžÚö ÆP=Ëâ\÷õjùƒÇ›áf!‹X±åç(º<>$Y†ø¤=Óñ°ÔüÿŠTÿ— ¼Ìʏ`S…‰?$™ñòunùá–ȁQå²ÿî -3Çñê,wìÕKƝêV´Éü —VŽKw°µ|\ZÕyµ´Šaê„,;ûN™É¨cËiæÎ`”\²À¿ìѕbÈ~~0Ê«Û9ÿŸK¢Q€ãÀþ¬\›Â]ý ®?+Èg©W¹¨GËXÖHPς¥-cMp¿rX¨Z¢ ¤aªí¿a þ­¼¼êM/ã藸eùš’@IŊý¢"¦Š%} ˜öI2²€à†A±ÊË Ò!å¥ã„6 ²Hj³CUx,YR¥Ê[JÖ*ÓÆÔ(Ó®'nZ ˜^鱸΅ԊNä°H—Š»b÷jærZ”Ì ½Ó‰§îRwÊõ¬öDâêÍÂ6“–\h2s‚i–zá‘ÒF#1—è“aÉ Â÷ü4ØßØÊÖì¡óál^µE®ZÎ7|]W©f%¹ä됏÷u|IѪMÑõhÏû‘Dß¡¨þÅõ¾7š_~ÿO;Œ‹É[w5Þ«Þåyi[”'öS€–¿Î/Ë)Ô4ºxøåÇóŸ&ƒrÍÏßw¾ýõf4¶ N삛/s¾ëñÁÃé´÷YÑ|¤·Dí¬ h¥®rì[‘‹Ÿ~†æáÎÊoÿßñìâmo:û>ªy·}Û-¸1ü0[Ó‚©|;ߛYõëѓj<—»Pi4±+~°™¨éb€—ÃñÀvXì2H»f^–óŸp4; 4nþ1ŇEl&Ên¤µ±;íŒ]fúÎBs¦ðÇ·»³h{ ÆÙ· +âäæØß']¢œõÀÓ g¨Ý‡»¯Ôϱo^ÂÍ ‡ÕŸûµ•gWï`}'ŸÁ Ü÷fîµÝ<Ï8Vhí°ß Þ¸Ã¼û–Á½[GfõÈ××;qnzc;1Iºupïw×û’ëƒT[Gõën è@FÅqjkÇs9™[ùâ¼¼š?›­:»ÓðV:QyäËÉbÚ/O!|÷0d {ÄD?nÊyo`…¬Ð™âƒ;óÿ ¼¥d§5µFGžŽÊrkñç9eçžM'·§eυˆ×ûË{2‡0þƒøŸO†ã9èÛ‹Q9­,øAŒùÛ?Rü«ÜÿÄBàcoä‚«à—“¾#m“OŠç_ðñ!;'ðOèŋrôjòÂuÀõèùd6„Îãϒ;•ìþXfOg§óËIo:xT^õ£ªRL“AmDÕeJ*>#n{ƒA ™{Ñ –\¯Âf·“ù2¬7ÉˆÛ n‡]âÛ <ñ¡¹®O;óIçEo6/§ÃßÊe¬ŸÚã™VTçÍxÒ3YÌ;¯§“Åíæ¶ÃÙdԛ—Kˆ€¥týJë¢sÛ»-§Ùðf1 +)ßaÿB“ž§`Çv|B=—Qƒù´7žÝöì†ë¿·ý,>‡‘Zæk±u¤íÝb綯§%ïꭍ§lJM²®©ˆû°µm܇­CDªrÅMÉòzÖ¿íÍ^r‰ÊT>Ÿ–³rú¶ì€y»óÃ`8ï]GÃ9-äoW÷*>dž]«-n;G谍çxC‡ xÁåìš×"®ˆÎ‹Ò®£E´8TRyäÙb~k䖇tX1«<ï_/z¯ËÎóÉm´ª­ð–¬ð¶çåtv["“|b×Ú•Jx<šL¦?÷ÆÃÙµ%>à¡+W"ݎ $×ç£Þ¸<+G£~W˜8vý#Վ³órޛ}s¨ˆ”A Óî/5¹­ôP``Õî(NQî©`I3‹P턥–’Yav¤$œr ά§ãAùë˲?>ôx8m{.” 3¶î9҇N4#Ú{žÃê4g™Øqš R3Ë1J:W̪´¶.x5qe¡»I7‰dÅ7Ÿ>^ŒFÄõ|^ý•8ªÌÒlƒy:9ÑiýIVÛöNá ¨møì¶×‡Ž6?îõËP9gSsX€+­óµ]ùyX¾³Ô´ììXa¶7ã­ºuíŽÚÆA­¨2ç†^îBKTê«+3żÌÛï,zÀ¬;çå[!¬²’úò·l{ i][8Ûάê>gÚoÞG•sP­m h#‘pV A©\O®?O¬p6ÿ9¶Îi“gë"^YA'òâ¥ÕÎ@Èýq2ØÆÑ­º2ŽËÎ Stg5«¯®õ܊¼µ|ߋ'•uýlÕøGž¼'£‰=€^”·‹Ñ¬¢è¸^Xý¼7u°fÏ=†¤jË/*â6­ëJÛn.ËÁóéäj8*ÿR¾ßˆÚCt¶ªhUšýíÚjä«(ƒØ]iýrqiëã‰=Ž_‡ O|íC6åÒ¹’mzsnÏmRœŸ>¢cíï?–ƒáâ&’íÿq°,:V›Ý¤lT9¨¾Àj« úi¼ŒãHg^"xQ‘VÚ>ó«çåÚµViö*,²X†Á6N¡yð³^N—…—JÛgËÑvb‰ÎÏ_6 ´ÞF.‡sGz¹ÆÛ Vm·†b®ÑŽ$ó—i&bÃÄxÄÌÎpŒ!˜ƒje½š¥hý XxüsrÙ½µŠæÔ*œË[i¯îF[šÍÞ o/í@ß,1‰åvÓªU–ÐÅ閦ýÉh‹%ù²;4=y½Í(þo“˧ã«I'k·Qc1lO¬¦6Ûá0ÁfW‹qÓªq¼WΖêÇÄP¯.c³­ÚGÿ&–µ¾=›XÝuÐyüìɋ‡ªèü¯oŸ¾|Ö2Õىü£Lý¿¾Û¢ÞX©0–ëÄQÛºŠ×ª®9­ú7ï7ièQËÉüz«†îÄÕº=³į́(&;pöJûZ6ZA¿˜•&}4„Ö+öéÉXµÍB&8çŸ-GÏË)”†‹ùþíë •}†Êq.~`cĀ{êŒI§î) oXyªú.g4jü2÷ØoÛ'@ÁSmÅ2îmos=y÷çá`Õ:V,¿û¶7æst» &ª±xWªûöKýüÑã Za6 L34}5íÝÞnk) %zNƒh·¦ؖM‡;´uAwÍö9jû¸7›ÿ­¼O#›†å¬cAÇ®»QÔòÙ¼´¤¿.ǝËrxÓyy‹qtÓqÇþXN;ñD<²\j³Ž}Ëɣɜß.X|WŽÅK‹Ü¾`Vv~ˆQÿ¡cç_;Ïìö÷ÿ„Ýá8~IÇÎ.Âàõ7vžŸ,斏¾žönn:ïìÓ¿u;§ÝÎÓñ#Ô÷m¯!›SMo~ÿ?õ;v8àÿ¶W¯ÿ¯Ñ|øº¤^ÚÍ~{Wöß`וÅø²|cÏ6«».¦nIØ×÷§ÃÛml³2/¶È·a91ðát“ +I­_”¯!r£2QéÆǐ·7µQI¢¦Ï-_ùÿ»û®ìÖufÍ÷³–æ°%Ëʁ¤rŽT–eåd+˒­|ÿû¿ô zýÒéÑô03ERTØ}{õÚgùH"ˆ +…BU¡> ¯ì'1E‡Õ¿Å2¬@lfDUukKœ{"iwޖÛ!Û.*] æTüžè=.¨vÞ·›¶h™Ö–·¿Û)„§ƒ¥î_¿ërñPâ8½ÒófÌ­›ï¨ »Õ\ éö秠"”[Àë„Ì‹×wF%­Võ¡°_ôÈø¿¶‡uòšÀ¼ –Îó6 é]qeG}~Ÿ´g!PîwŽ–ÔpWlj˜Òø ²)äˆ\ Ïm\æM·bOak¹væa0:1Ù²î+ϦóYMêå=±ÔV#o±÷^:žÜðY¯È (o·¹ÊT°+þPÙÀS¾Qð4–ÚÓj±bíûۄ@ý*$d™pª„Œv•àڅü¸UM™áR¡ÓÃv2>ëa~¸Oq‹žrGE*ᢧ7ðÅrÂ4ÁsU´àº ï^­ÖæÅ@¤B`|›DœIrMOKk:ÅU‘KAY ªI©ë?âuó8GNdC~—·§)ž5x5 €\æeãëü3ù¯6GjJ´ºñØ&Ó@Ō7E{ÚI†v/GO¥¸Ö¨`÷¿ßTïCóÌf`¡ŒÕ¹iâ7+ß}ºóÊ>ƒØDmÏoQ–’ò^s:C-V)ÖGe<áäŠñ‚õT>ï÷¤ç°Gè©;V1ô­ávÄwl—¡bOÆٟ¯àòW[Èhm&cj5võÞfŽô¾ãÍl´ìŽKÆrüpžú2$Qö¿ân÷ †Óßé¥ ÓÇC‡%¶íŽñc‘p2ñPI{`JNÉe®ZŠ‡Ýózj‰NÓ‡qyA«4낾tæ5èëeOéïϤ»g·%~¶¥c"_?}Y£Þ—s&íÖ·“ßcI/°ÂD²6½/°ðµªýD#åhÉSå— ~ÆÃëÌgÁÞðYU(eÃŽä&l݅FÓ¢èH`áF0ëaª%BŽxϵÀ_qü‚ÖÍV4í2àÏ,‰ñY+t#êõÀ«Ocæü@2è%ôsáÔáKP‡©å½D}ÅÇqæ+$ÃՋÈP¯ÁæÀ;ýÿN¡"™ï4S¼D·£Ô® +ZҏòŸšþÉt6‡WÕ,I‘áºË”¢ª\ÏÒmãZNuu~5'ëô»=}™á0ý”e¢ESGüBõ2Ü/œ*aêͺŸàW„*7{+ ƒ@¯9Æ ú…žñ ’¡+'ù}Æw$¿<7",3(ö±!sž”0L£ԉß4ªCÚӖÁ6‘µm£›ÃçùéÖ)õï\46ì˜s½yHPUè+ÃkE2âéAñíý&Ch³ ÔԈ>3ÓÀnÞpmCÒÂÖFsZÈM"PAÄôº|EL€¥8Ìô†Õˆ ä崀pÞò¤„} 6±4;Ô¹yK‘‘*Êg­€¯R¿‰4¶4O˜!]ò´+žª§‘H´O 7y…QoÀäeZª•×„—#Ã2éNí2ª€Gqš‘V0 B[Ӓh´Š¿™¸qÞþłà¯KÄ/X•—¥Ì¨Ü f´Ç6ŸýŒYa×2ÀNJ¯ãí—æ2µ ãät½7Pk&ÏvñœÞåÝ(¾cm+¸Q–ôÒnŽQ¶æ{ÞüÁ-¦?{‰·Œ¦@êë\륋Å}’ߥäpž¨ý¦+ñúà0ÎØ~AƊ\–ආí£Ì–+@=uêÌ}à·väÔÖp&½6ÂÎsYñäd™ž[ÈϔkÎŽ1€ mõ}ø+¼îò-àCÇ:°ÉlRu€ +:nðš}ë,×>°avà xzœG=‚›¢Û="d@ÝêÝìA«örØž÷`ÍyFþã£Ç¡ùº¦Í±N!‰,g!«èª„Þ e>ß¡y3HÒþ‚CƒœxƍË}@Ç£˜ôó$Y÷-Éêëç ™àX!‹û$XÅwôG½EG:ÿí‹8Gó?ñ›ƒÝڔ‰J³ÄLSqcä|Š¥Q¯×Â΃lrã]öE>gÜòš:¯¤³ë×9˜gÕ0 «LÁ'Û)»ÓMkÈý&¬·$ㅍˆj¢¾‰[Á»Ë= ƒOk± +oj´›Ü°Ì¿Öî+A¢·~I}}hƒ ÑÃ!#ŸÐaG1¹.[÷ó¾p3½ Bd\-÷Œ{,8ûÙ`p¨ +ݛ̄É;Ý|™Á§å%CþžGÄkàÇO —Mïì2~ß´THVßãûóF7õÜ}MTßê-èê3Úß.Z"¶Ì·>OÞ±ÒαÉ+óƒ2i@FŠú㤱Ìć¯& BËí¢Âb¡t,SØ"Êó*¯ì’¹¤ûœÄp[ó¨ŒC„ŠvöAýw¬à)i‹t…\Æb¶¹ ºÚÀ±²Í~ÁrUËd†fíì®+ž ~ãíªÕü²ÖW`A |#qçéê‹JΞ.,#‘ÐÐZ4ZKF©¢ìLԖûP3 oÂ@/‰‚i é˙ìââŸÜL–šÆ¼–Ài ¼Ðí"µ:®¼é…½l1rŸBõ Bª*¢ ¼z«Z°˜3Ó؅gSÅ *ÄýÚ·Œ¹û~J»øŒÕБâÛ,=û Ø)4éÒ c K§r/Kí[mÔA"¨5«ñç#ÜfUîݙÜ8j8¨·þËÙ"Á·¦ÿ“^ûT0e©ï“»„}±Òt°Wÿ +˜ÈÃ5hINœ½•Ð²Aú»Bô^Z©*ïêÜbÈpE}a9'•ÉX,!¨{frjÅ>nS  +´aÛOÙ4}×K<kÒùŸU?éiu‰ªå}™¨5¬™ìköӗ\ã³²^àô¤ j‰8Óù~É-*tu¸.Õ|à¯g†/†nzX–Üøõ¶tÁd6q&m[,_×pÞ¬Ž]h¡¯ñÍ&šª,«µ#iµxüõŽ×n˜Ä[úӉ%]üÔzO¥L-éi8ìÜJŒZ,ßφé:Ø%ŋËߋEpe¬–­gKdÒݜEªs‚rkèsÛÿàŠ0‹´ TËâ{›†*¢ŠBóyâyÁ·ehEÚ¶=¨Iž¨{2ŸÙŸ“ÅË}SÊF(H”ÉñrkKù‹²IbÞN6õ–jÅXƒ–%jOå í“z_#ßóÌFZ,0àp{‡6eDÆ-=0Q‹^o$³Ï…Ó›’‡3é±¼hӋúh›Zéô ßîJâ7šßJ ©“¼Êvº ”NΛJ,ÆCÉß,§Û6ÅöÀjèxÂ÷9{K/#'ٛŸ "–¾Æ°ÝÄö«bÉ ´˜°0úåƒk>hV,Ï£hÄ뒒’À:A6¾@ ٓÃô¢z,R*ƒnl-k©Äç2“Š/k9}Ï'ÎuBTŠ.’°|Ç[ü8NŸxÍzùE¶ç˸wòB¤2$a¶ !²ôþ%ê®l_)ûk ¬%œÝ”¬Q_6ß÷B]v¨†žýG¸uP2òmˆ·3¯ò¨·pN;j3{<øö½æYîàOëËü¦è-!vÞîD)ùCÁÆ + gÜ8¿æƒÃnÚ §9’«œÓ¹Áñ˜¶M2dجm‰ìî“?•¨çRhª:°¢­{Éu7ç~\É֛ÆøƒØâ‡7óÇÏQö5£-Æ/ƒSz±=8$ä6ÖÑ¥n:u2©EÌu9>}0&\€d é•Ñw¾WáY¥³Ñ×9°;^*"³-çÖDÆ@NuÞO(iõö!ýµœhñísµr§C‹ƒ8øß^¡‰$² +Ê@“)¡¡ýÖеIkÅh<Ø¥Ö¦\´ æcQHgŠ¤Ûñð&c¦š5ÐŵÕ& ˜ËûÔQ LôØ pºu)bªš»Ð}Quçê%¦Í]¦Tf¸qzÂônâ¾Î’Lø³ÇÜ ·gL{+…7Ž¡yÐðz]3óIG÷?´y›Î/Tç9áŸì–¼E©ß^uœFà -ÎóƒXo-i'ï 6Rƒ$Ç»Çu`‰×3™ø2¾A"pnÌ®‹±9LjÐK(1jÀH —u[ŒÍÒò+PrzÖ ~»C˜Š^‘õéwžt¯g3o«ùÙòûb©\ê«?ÓA/LW]ƒt±Ö±ûÙâ×B™±Œ‡>›ÀõU­Ð lû)Pú½5X†»Dmãi Tò¸?š;ºt±àúLÔ_’;)íÊ$¼÷|áù”KEÒKW¶?VP D÷¸I–}&œ™ÒBÉê*VM1ŠÖiGÚçx7X#qŸ.’@K>S¾úlÎîô;ç‚2ÁÙlÚcË{rcÇÙN¯ó Ææ”äâT‘·Áäœ}ž¿`fˆ9Oö_[Ã}1æØiŒFØðö6ú¦ ŠÀïdydU ÊñƒVE^>ˆ Þ°kgÀÃî+PqÕ³ði;Ñhúˆ}P ëøw tþ§-sBNÚ`ÍÚaÇ~Ûñ©ˆ_Ic¸‘¶¬œÓ°­[L&ü¶<ÃJdòÍA÷™¢M?ØXÉi¢RÌÁýÜe2ƒ´©ªkż··ßi'ù L³ÀvE:(üԏ½+Q~ämVúß´²)e>d+ϘO¡-9õš=ɲټòýæ«VQ ›òªÀ(gŒ@ªõ=ÒÞõ/“î¶Ë΁ÕÀ¶L4ÒG‹w_Ç"Àƒ6ï+Œ ²µX"¡IpI®º/HÜhߓWrÿÁô#W‡«šúŠÏìéü&Õ™QýxɘŠIâ½gÛrýÙ|5±‚nª‡œ4H§&¤{ОÈÍP¤› ¦ô(ü‚rŠ8ÝÏÄÓÈñèۖøiß3#Ó''ÅGº ]`¼ҕ¡|%Wó;Í èÍUeCyC+Y¶À´ÚÀ\jÉi4jkvú@“ìëËö4,úŽA¢ñ5=Á&þ·¨†Åðè ?ï9B”ИÁ”øÝÜùÇ¢b¼üSSb¶ÌNªµ=,Ǔ9<é`K7Ưƒ—y %'•Ý¹ú]oŽ'ǔwœŸéÿÏÿþ¿þ‡r²$ýÚqzXö"Àeþwý^ÎÇGZòÖªÿc^>oN«Ýfž¸8Œé²Õ! {é¢è&?HºâB™‡šPŽ%ÿ'élIkÔ3òYc­‰sZËvkìë䂟w¸t±ªì'ô äŠ5NI`Ue×¹—Zd ý¢(û”°FjÞ/­É>6kí…ÀÑڈ ©µ;>­uê¨kÍoÝ­ÖìÊþ8\¥€ÖÍj î£K_EôݱÊ(ŠåF…lŸ2™ç‡ä™´–Kít1¯­3OÓk‡óèÉF,Ôâd;9¯ÅÇe8øù^¤{éØW(†ûI󏡞úÌoÒddãÀêúõhSæ*Mõ†Î¡¸ìŸq×Økm_ß9Ø%ÐÃᬻYךrGüÚ¥;Ù½r‹îÌáhyá‡î渖t˜êҞ›úî¢Ôpž:ú3¿ Âè걙G©pŒ?|—~@Ú¦ùJËL½þ¬«zY€¯Ù x·›†dèޗŽ‡CèØ;|†Þ+˜Ó]7ñQÍâîÎWÉ&Iõs™ÌÉR…f ñíÔr„…T'‡Óږ¦ú–4¿4w›’ÕãËÀ›ä¨ÂÈ»€p.Zõý¶¤©ºÍkhZ)KQ=œGA“å5¬IQE 9 Ët×û¢÷‡ªÝ,ÓHV%ûªË삯•U¹†¨2"ÂXöe[’¥j,”Üe97S¢©šET0Bº¶ëÕs2‚7Ýۋ¡ ê£4Õw£Q4´î†/»ATÁ¬šBªŸ‡ÏÖ¤†¨"I TpèiΖNIª{ãM–ªÏ¹¨¥¨2‡CXk>ƒÖ£Twþw߀ã ªGc´‹ËPõ|™ÉyQ…ûoâîºÍŸÖpè§&IU—{^öÞsYŠ*–)V“RT4´¯¿'&Ídwwˆe¶†4Õ¬>b(Í¿š’T³U QEÊæ‚É9ƒ]ëø¢¨’ë ŸjXg>ã6ÄaËÕÜðdz·ì0@Õ·ã¨2ª+åß>éîví&‘û<GOšª»—ÄJ?UŸ4Õ¼îì/u§~8=…„)ª•Í<'KµèØïl2TûV¬^ڟET!ŠpÑ5(e21­$ÕF~•—¥Z/{#9ªi¬… ŒdwKö—Ælh IRm "GYª-Ó|¸QEdhÂe¬m%e¨’ÖvÜHIRíÙYªßºF)I-kRÝýðbŸã‘Ušê[sµ¾¾Ù$©¡ˆ*E†&¼ÇLK9ªelD–ÒÒT3M\×9UóRT‡7; ‰Ó„'.³hòXÒEQëNYÁäÑgW +ƒTmT+Ó~@vâ€j䀨Âe%l n»6šê:`Q}]ôuÔòN$»x^¨(jùÖÏBªöËUö f¯è]¡w@8u3™$¿՘‰´‰ô¢qf¥Õ“KL…JqnøßúªQÕ ŒGØûª‹ts9@µ QÕÉÊM5Xuˆúú½kŠj¬Y* 9üŠ‚ï¯-Zhqõžâ N?Z"ø;‘yz6h]³ŸôS·Lž¨gŽž"-pQà$¢¼’y½ûŽ‘á +I=½°z¬wè)§ìyÓ³ÃJµ˜[T€}šÀJ³¢Wîi ++kÛ~¹§(±2Í×ä + ±zj}’yÚ·aõ֋Vî©kÄË&†i¿6¹§lÐ ¹X¦]ˆcCï0 óúð€;,EÌÓ± Œˆ²<Ó&/xÒ0Èȼ>©ãŪ® ótºÅßÖÄJæé šƒx÷»h.àü6BáSOú)q|×ͅ7ô”0FM9áӄ֑‹G¦](Bâ´Ñ†Ý…oêuô4e·Ôø>šiÖ°&·Ç7JQœÛVƒê) ¤ožDZ(Èé¿;ç<bøkÜy2¦2˜¯›îeºt ;ÀoX&•tLS©¤³håûw£× lŽ‹"È#ýâ2"oi<@ºB}N:Ëþ_#æŒtÎpŽô®\„YwöŹŠLÌ`.éÈ£¿|(ýƒŽ0FÞíԚý ¡Æ'ìù‚®ÐVšª»Û‘§ªË̜²T‘\!žÒçSV/p…ÆrTG +T³ö€ÐN› /aä°T]"&Cß ÄPÍn֙øTÝu=G®7çîàuWHù2T½/Ð7ø¦êîòƕ6õ&ÿ²T‘o Kú3)ªhõtwç²Ý wµ#O²†VƐg§‰»[½ڗ ¦>ÑâTY.DÙi׋º?Jêʙߩr”Þ J^žêd‚`¼Iœ9—ÜØOqÁdÜQz†a.7÷㸭‰ÛØ?}¾OOPµ;A°Ìú ë¨ñ"vÑwÃ6šêõ8šA<úÏë+ú‡´Í·ŽA¥B«´( Ýà *% +VEÙæ;øjx¥ÿŒ;PÕBluÞŖ+ +€i ϓî¥×¬SôˆV@õÎ#ÚÛä/ñc6vÔ,.Zôú`Lª§ þ€:íóø+‘Ó$rå;/k‹hþy½©Y M§—ÛU_Ò¸¹—š*øÎ#UpS\@¶‡'«Q™ëвQÉx΀Pùà›ùÂè`̔>á–äwæ =<~œŽ`֛+ž‘Œë<¢ìÇ^…”¢Eú:¿TNvY·ˆu£ ¿nœì~Ñ ý†C4Ó©Õó§ œì2ÎùÕX”KÔéTSƒ?WP)+L‰áTDáZ0åz t§&'ÐwDT~ +®X«QV¡ÉUÉ¥ì±GƒD@¦ ”‹^¨î’x••QI +q=0T…³PÁß$d o<·…Kdb;ÙØ΅@sJT’šÙ±àûIdf»bÍWÉø#ªžÖÐW,m†Ó»â16ÎN£Z„+K„¼•,d_Q´. + ¨[—Æ]‘³’˜7±fÄü ¸ïŠh5dö=ï cC{]+\%»„È(I<” ÷£ª H‘®€÷ñF´ò CiÑâ'cæB W¾«ëcæ2všpñ3Ò/FÞ¦.ø”¿™~®÷Zrö‰Ãúû(n/Zþ¤¶WՆ·`mQZ©-Ïñ‹Ò‚ÚÔÎB% çþ¨È‘3›dkì^¯Èrgsø;ì¨"ëSúeÕ"ÐзTd¿i!äòÓ¤ks<°¬òvi[À|évvO۞èPvšÐ3»{ù “Ù5RÜ)”åæÌ@8o2L‘†¾ôã9í\Y¤ÝÀoÁíMÚM>˜Òi>C»µ.·¾UÛ÷’µ)j7a\àšvkmïÔnÂé9?®]k¸¯/VJwiË„Šk͑Žr ŠÔ¨“ëÍq*/Žœ²ÁuöGÖNjÅ1h²q‹#G&hºÑɐI4L–ôO¢©Í_=©Y\j‡œ}&ï² +¸IMÏ+[xÀ—¸3È-±G€j{`ž‹&šä*²»˜æU;šŒê”u™À€¶Ô»³2jºCºZ²N‘ŠŒ=Q›$łhóL´RÉN×.Z¦.’1TÄ¡eWª®’'§mû’`ß6É Ó)ÇçIm6¬Jr€U6·lÿÀÚT˲ +¦uu†[ì¹DÇN—èwÕ1L™i?9*eúV -ÀI†Šf)F“å'‘Þñ§Ç<Ô&3””jzn/ZùÊnZãaúev&3}|iDßI–yœO˧‘-ÝçSÆòÁm¢§Àù”±|€Ìsà|ÊX>ºx7œOËÉ<׌åÓ\@ï„ó)cù4ð˜gÀù$¨VEÐÅgÀù”Ë!2πó)cù„ŽÇp¾K ËÇÙiWá|ÂhžD͕Ì{y0Òþ¦6ɈA³®åŠ—·ª@[ë@^èIߝxÛO cq›n +¿oÊ_WØ)짅©ûYu ó¹Le8e + 4U)B…Ú®ey]í!mܪñ©î¡”€ŠæjÆ•«â6É¢" ðJ K¡MbðR½ ¿§Ní H.ÚH{Ò÷Á¸*b¿\6¿„Ñr)&äs6ø¨4¸ùpx tîãE¶sütž«°;aÂå-¡DN !ìîH3 »“ ÉH¸Q×`w÷䗈U'àBŠ ß½ê¥Àªk ÜV›G1!¶¢Q„Y˜Ú{›þšgµž1›Ô'‹{높©š7^5,¦P¢RE †- Q7vš(Ö¦"֍`›0¢’…Œ!Eƽ›^³¬ÂRw F£<Y<šÿtÍƸS88ß xNÞ¬x“PSháǸä1rsYŽ¼™-¼Ï*eÞWj"̨òªÈ¼W)¼r‚æ&L¡(ê©^"¦ k»‚ð¹¥a;Õvýƒ[j“ßû¸‡iÄó˜æziÂx1uॠ‰j™ã y L•™›“…‹æˆ‘ºŸÇåI™ë”-ÀY˜2 ӛb_Šg@)`õ$<,ëÒî¸×NûۘûÜħ4´<«TÏ[e¨ØErÒý¬í ä@ÂýÔÈÁuŒžL›4bœtþÖèR›X‘R¹¬)°JUôæzJ¼xžB›.N‰œÄÑ‹zFôæ˜ñpº˜K4镣7üBe¯¢ðHôFø)<½s›RFÔãánŽÞh¤ ‹…óÃцãí§‹¢ê·aÕGoä÷ VP ¤¸—µûB†´óҐÞ‘!}%W]!]T‘:¯¹Ž V_¯©‚«~¶sŚ>ãà çw™¥+Z¤UááÌ·§á]¬7E•ÉW!~‚d·vÄï+“ !~j­Ê?nÑã2ºîM;8?ùóµø-7“Eé€@aŹòà·+V> ‘/›ôô82É³y8mO™we÷YÈ<¹´ë'#óL†U‹Ì»š ûd­¡oK;–kŽ|*#ãªD©ß‹Ì»LµbŒÐ§"ó4Rg©‚ÚžŒÌÓ¨9Æàqdž`løiƒÏEæIzkrûBÙÖöÀ¸ä]$ªN½Uá*­N©— 6ñ–Ð})ñ–D]Ŧ—2^ª©>áòJEŠyÈê7‹QEBû†æðì4TÑÃG Z.ve3ï¯j7åŽEùÕܾ§â|$?¢ñ|$?RÊ<äMF ïz*IÄÙS`Y/üðh*´q/?ƒdušl*´qÀõÂTO)gK¨Ç/>å¨cT‘Â|Tí⢊‚Z>öª–µëÉïÎË&›Øݺ8çÚqn¼ª4GO‚N^$,Áß®œH¥ävk Ù±®&{>³Z¶Ÿ +’m?$Û~HIÚ@²¸Îþ,¨è9 YXÑãÚÖò,„Ñ©;蚣“Í„Eá(Øó—(Ëfx¸œÃÃ#󑛌”§ Óž ÊC:íz®°›·{÷òcóTPœžjüAy·úžw‚òÄÁûN節òdÂÏå)ÄÓTzp“£‚Žb”‚F|>´úJ˜sqËé÷—vÚÅÁÉw «ÚëU!Užam§+ö‘z˦+>Bù– ®7œNŐÒÉÃP±;Ek ˆÌuÔµ¨M¢ läĂR•Z.8ï:‰Î ‘ (¸F¾¦÷ÁkÖëZ`F•´v¿}¨µC¸Þ*Ÿ®µµ¶Ö ¯[oh-„~z‡ESZ{qèÁœµ6#Û5¿ÑL|J»3‰CtÊ»{wb|N pG£~Ë¿&V»3Môµµ úÍü¡Qûé2»,U,“ôVd¨z_Ø, °ß@ v§õÈSÍf]–ªÈ(àÂÚO…kåªñªè +½Ð¦ùÆQÕ\ÞSo[vrP´®ìn‰ÉR… Aæ3'ö{];[9ªcªY,(´:ÅØÆeáE–ªöãÅ۔ã°Mì§Ëä ¢¡…S׎è£OÌ癪r•—¹¨½‘QTW‰hUTy8×üca¯/LT0ƒ7 +¼n3‰ÖX¥˜óõüÞKãöÝð#ÎÏÇaïí®æu^XäïôŠ+ŸE}‘Ñ%߬«WÔ(%ð\Üg]¯'u·žFæ˜ë±(ÙëõnÛ½uÏgj¨.•ÎKå*ݬw5wð©R¸YO¶‡’û7ð.¼k­¨íáÅipw3^EÆ&“ {½YW²Ño˜7Ø¢äþPÅ*þ¾…š[ùTˆoöݳ¹ Ø'å%ðÃvOöI¡úD6ô3€}RQDÉyó°O +Õ§yˆ) ì“ +ã+$øß ì“Bõ w +Ÿ쓪Jsý0“[}2™ÏöIíóVÏçû¤P}+û¤B2ÑÙvOöIEéù.}R& ~°O +Õw‘¥ú8°Oj§ÄOöIµIsypó£À>©1䖵§û¤ÆP&Õê`ŸDU±-ð`Ÿ2båiÀ¾™v/°O¢*â©Ls=È´›€}R.cÜ>Ø'µèk(Ô÷3}RÐé£ÏöIm¶HdÞ? +ì“Bõ]º¸û¤`l⍕'û¤P}—ëÍÃÀ>)vˆLõgû¤|ċüǁ}R¨>ù”جÇ}ÄàùˆB¦A€Òs€j¢;<¥Ü(µè+µzƒ19ž{‹ŸT›®˜÷ÜâwÅäPǪ«w D•á#iV}É/ê7ɍÐÈñ%›%Ѧ«¸zQ‚¿Ò•{½­›ÛĤŒÀfÝ4±•Út™›¡¬lXå½I²ËšÐerék§Ðe*ˆ]¦ËÄnùPž`Y“½ÿï&ðœT +†(ÏF¥½~óåJʆ»ÿï‘Ρ+¾'}'¦ïG„nJx”í$sýþ¿‡/ÿS„|øò?¾e#ÿŸ*¼”Ò匲Q¾ÿOõöX&^¤zͦÁ©Æˆ=ã±+>)ý tîh¢¢ªü ¥Ó0}ÊŽj¤Œºëjð^¦ïZ¦1sõÚ>ùÌÕð8tcߕ:uIjA>u­â¾1 +v iªË®|¹S­d6Œ`Tÿ|ÙeªhªûJTYmªòž–j…Î&x\ÒÏUΫ@Ì'줠ZdN=çD@eE÷­âÄ1XуS‘®Eàç +¶WoCÚSµ]Eû*^^/Fû~ÏMhßïù•Ý(.z¦¹v¼!¬MÕýȊ¬²µYT)6Þb&ËÍú¯ˆ›²cÃw6•6§€w™²Ýç+}¨ª¬í‹|”;1Íç]îؔpØ6e!·iÖöN…F Ä´>lc Z”ÓGo©è ÇP=zÃ7uSŸøÉ/#MEÅí›ÅÀ&»œà7E…úàýC÷þñÂÒWÿÝ7Å÷þ©Òißû§hªCž?çÞ?†ÌÃ)CšÔ¹¸ßûÇ.krWÿÝÞ/©Ô@QÌF-:åÖ{ÿ4WïŽëÞ?ÕÇ·g?öOÁ—)"VnDûâº+ø\Aîà5´/®»÷~yˆ9W>:Lóz±¥²¢ƒ_’QTÑãhß6—DuÍ[»^‘üÙv¼”q }‘µsã-‚\â‹¥ºÌځ­¦òŠv% Æ)Ð{X*•@ªŽh¯J¼¬]ÃR]"Ó&W¢} þF –ÊùR‘“(ïÝ ¦'¨m­bzªRuD.þC¾çð H¥ao`–=:ß,F ’U‰¥Rg1NŽ"‹‘"~~î6ٙ¥—Îå¸w›r¨IåŸy¯€L{ΩZ Ӟ†»¥@·wZ6)‡dHS6ž©Q¾uq¨þÌ'™‰ÚEk F%û:î´Iñ”Õ¸[nG=å_I‚ô(•Ž‡qÒÓhÁB^‡¡† ø'®µN1L!œ¡ÃU +èÙñ5ˆH`äGüõÀŸ¨ | ¡®¦ÓÁ€Ìý:ƒ,2ïp9äñ€Ö0±¬ +5´èj:ù[Ýݞ +ñ—¢ +ç D\¼Õ¥ºK]M‡†S9ª3<à[².Œr1rǗ¯¹2ϟ‹îõ?l_EÈ<³$ΚÉÞM|˜ø¾ö&CÕû¢¯ý9< …}äÛiB âÑ-O5kµd©ç&ߗˆª†½ /¬u(ÁKFYª‡c3ª•¥ªÚ‚Ä1@x`š€>уaNõf?jÊ Î?¿Rå4½Êõ¾ìd§rµJÏ-}ô !: ‘9ÊDoL?‰[°2çƒüšÅ®|*³3MLo;Jýôµ+ÔÔÞ.ön̈6½®e#)\(Lܒm¾PhÖ ‰[²{eÔôÌ(Ÿ!¤v—+-›µ%ŽÜªˆ;õÓ²‰[²ÃÇw šuSâ–ÍòíúÆ åP›×Ó®oºðð1D¾ê UÝSøø…‡Ê· +’ȹðPÌ«‘ÉÞsᡌJßv(Îå¸ûÂC‰D;Þm‡¼¨{Ñ1 õ:=~á¡òm‡Œõð…‡Ê)Þ"ãöþ …02q¯5gtÝuá¡2لËG/<¼ªžsá¡òF³æ¦{ +ï>o„·'ý؅‡‚Z.,ü{ $—Ê@.Ô¥öÞtᡲ™OGn¿ðP +rÁì.6$ï½ðð*hI=JéÂCå½ëË´„;/<«ðé{Mõ‹ •káº$*zøüú¶C…$òÛ.<|—ÞpE¡Höþ •o;ä6V¼ð'd·Þ£Ó$/il˜‡7»Uª»t_ÝæŽ5ì2ƱL²˜Ä2‹iËVÞ~Ž/ï‚iµ4Á螴Füo}̙j!B²Š‘-ߐA÷bÎÊÜ&šXÂi$¸Êpdúᢴ¼Îq«Ÿ'¸‹«5‡ßÜZ»Ó؂Hà4ÄýV´ú´??‘ZkU—¤°À֍»Ä–+i-ûÐ×ñÞO‹væ 59a…JT[Rx(µ;qØ/؛x¨¤= ʐDÙ>Õw¸m¹Œ‚O­=rÿ1çZç@¯»ôŸ†™NôjHýé{noäÌԅ¦ ãÞ +¿ZÑW86Àb±Ã_ìt’›®èƒ9]ï˜Ó“Ç?ÛÒ1Ql·?±Ü$ßÉ Íý"nÃ~GL;‹kÚözΘrùÙáOU;?@¬*Æmªƒ*5õ¦øC iø4WA_éz§½>N\7cu–ëkxÚ°¡§„ÙdÓp°d0³Þ›ú+i ˜ñÖÒóãt@‚)ùFîÑ¥éËêå†Sª>$iwW‰ñªÄ/Ç°µ:x£M÷[Â÷93!­M˜{u- Cm·O°#2réÃá’%Â|ž­™Þ·mœXé\ÄsP\J÷ò8P"=­xèO›&>ÁíÕô¹?@ëAšÇCú±„ãÛöPu {qXeρ.Û"†`ü£Š†ç]ùÈÜùbšÓ#xÍ…fß¼éÙs[ÉV'{3áõfÔÖ¦à<¹bS-¹q,-‰÷颔.æµu΍Ę{HSl˜ÄÀí¥ð£I×ë9?g¨~:QG\¢é¦€!Ô÷ПÒã[ÎE—ký$ÄÍ©¤Ÿ™ôF7…ó¦Öø0’{¼ ì„RàOϑÓÎK) ë:•¹{µµç ÎofÌA´G½¯©sº—™wÒ/³3™ú,¼äÈC?<ôl&±-yøl3}sž˜VG%²Ü·À²ž,A€~‰[Ö¡*0Ò²é)ü°ûž@…š)µ:֐°2¥€êŽRb$2L] Yu®¢ù(VøþuáSý1NíIG1WÒÙ.Â͘5F^|RʛÁÌÜtáP¨((ò¹’þÏÒíEèä$Ÿ|iŠÑæj0ó'Îu»W ÃÓ¯Êë…E]‚;ü—‚a¿äß¼é5ÔeyxyÇ2\0"Ý:ü*F–¤×YöŸ¢ød¹Äœ«÷ }# ‘þIV¨B§ÏùÂY—á°íÀà‚`yíÇ sÞU¡6P@>ƲÙûá'ׅ§$ (_àjG46ÂRC„cóׄ®žRoÞ+ "ëÒn‚ž78ƒè€rœE)mŒ>I„².}êŸè –ªM®9.ƒÖ[t®²M] u%žçrE„L{†ýÂ.ñހ½a»FõK囷¼Æ +´ø%ª÷ôï@¸˜šYF´;¯Ã­ë|Šêð07Cg°8fWJC¿8Ð: å€òCNÜÖÒ§ ÒÕ®R”ÅûÐN—ÛepÅÞ@cû¨KüxvÐIQýD¨˜9Ì°é¢$Y€m³¹’ó;>í¿•è—–ƒð…áØ$Â.”•Ó°Bg‚1/UËðæpXè¿IÀi/É#sËk¨7„ÍëzYÀ›£F@ø&Î0賆ZÉ'xÃkȲ¹|“ƒƒ] 4ÐP…E½„ùǕsFŸ!Ȫ¼s5ÙU°ÂñÔ¥ÝéH×Í9»¸%9KSñjèø ˆÓ/1aZöãx¶¹Ä±Eê;ō'7· Jƒ;õc`ñÁH(ñazð3A óZÀ‚ÉÀÅéĪ˜"̯Ú"¿°9-wA_W1©ÂPT—×ï +Àœø„A½Æá- –ö5*—Cõ›8Ýõù&jÖM¿fi7Øþg€Dä<ìk9WÒ`ŒqL»õÍ[xÍú7R‚ª¬e gæ F.2z00ŸÒNÂÜO­±3´@)å2¼å€É±ðE€òšsà*l1teA¢#†³ €É`Ì`…lÄ*R0F¤0—¨”Ú"|†óÊÅÊhõ¤ÙUQž76t—ô ¾b¡‡”î×|·\¹íÍË×xˆ–5FTh Ê m`ôã~¬ˆÏ Ê˜å€©ñi-© JوGŸKI^¤?1º8½!µzràaB´Ç*wPµõMMíàgÿ™*o˜ú‹"[‹h#…»ÃvjOùԄ)Ðuqî}MêÓLSAèUtò*À3,΅۩²æL(‚ lÂ&‰b’Ε-E1Iæ·Öžù­{p®*¿V.⊵ފ __7lÀ÷Åu5ô€Öpè§ÆDuÍøì… 27ßø›(r +»„ÝcOm³Äۖ1ðQ­ðw v¢fS¬¿¤ÄS£ŠÆÁ嫬éCïˆ3©êhªÓJF“u‡ÿ1ç!¦u´['I…ÛÉ./€‚íž/ÓD_û²ïÎR-â;/èhŠ^|ÇÈ2¡ÇghÇD#Bñ!îâñá5¬1|p;9>Àæ¬yWš£}WE&PÀ˜õ/ÃË«v–4Uî,DUL@ ¼Ú ïa-Ç­ûØ7¨êª3$ßIs‘eBîÓ¡ûn2LpØ4è MZøøˆãÚÌ02ˆË]‡d ãÞÂI$%ª„’_®³ÞÔ@梎 ÉöXGR»hj1LSߑfЩvD䦧-p²<"ÚpÂ*U £–p£Â~­#ãðW«¿Áý‚­oܶKa’QÉM§ÃQG]6—´²GYZú×^È´lro¦‹Â³WÙ¢¯î·ôèô˜¤Q·*="i%·CT¤¤)Ö1ˆcKšñËô˜¤a¿f9IS]GÉj»*%ü +8Np’6ð‰z7QÐX¶”v}½ŽlIw}Þ*TÉd›¦ÛáE#in²€ëòˆd—î«s_¹» r<éHNwªMf#_²#9{æŽ9¯À[¢Å´»æH.V#®4âuâüE:ç>9ša^“ÁëcKÂdiµrà/ҒínÄ¿"Z¢F2âvLõ>ûCb1µG"n2LS±4ÑuxSò“]¥êœÆò1þ×\%ÎÿZm&è-nB¶¦(Ço×NÝé˜uØIŸÇÙRê³l<:kí¨ÑWìÅ*Ìâ{0ÀÔÚ?ȶÖÚ3U´6slª5D*=fÖGmW„Ë_•#ÍÕ¢¹¸R6ko…^ z5 dÁÜzÞÁ®—‚ô'jÿ;»¦_€s™ˆd×JÞ@:§6Þö¬¸îZæìVè5õ{›‘`*Ñ4„~™Íúúñг™Ì é^¦‹ ¸­WyˆTcÂ;F¸Í,‹¡¢¶êéÍI>½Û+Ɨ<”'ÝÝñ³f<#ß«‰t7¨î%>l›þd¢·úL³&ë]£Ý銷:×G¸UŸì¹r|oãX%‰ ¡ù‹@ hÓyo€¾ cÑJ sËU†w)Fz¥vžŒ‘Φé´ùÙ£m¥Ëq9·iñ¦(2Ñì§T°ŒÓ©y—ï2Ùvª^ﬡ̵öŒüÖ¨7M 6¦å8Zþæ_ƒVç›' †}—|ØPöƒ}!†³°_;b¾z<áJ”CzäP’Ly3cE¼Ÿ±FÏNø»²+Öt»±ùº™ Ñ L¿`o¨®­Îè@©“±ØÝ1±‚úN0yE½ñØeHœ.ƒÅB‚A˜c(ÉQï¬[èBKW"TóÁLW UDÈÃÒn—>p¢ï¦އ ÔfÅà‚Aw]úYàï¸,IPs> +¯Y÷!¦Íôà—I>‰6à¦}ÔqôBñü¸¯æ,†-L57xÀlõf€ õ0Ž•u®l¸Ÿ•wSÐל‰Ë+ ÷=íί…; ÷á@ËÖt'…F¸YÅÏ«¤µËå~*w¤òŸ6Œk­ç`оš-º1WÏG›Ÿ½ÖÖÔÁSã»Ö0^0q­Óû:ðÓüԃJ´¡µûí-øµE%¸éR —§¡N²¦È1âéó¯¿È¦l\¾­&;ýO=D»“=_¡0Ir*ÉPŠ‚ѼTRH,d€^UÃ!•¡\þ›™0éÞ2Q­q×4P—yèÓ¾ƒÖhÒ{´†Qà¤âNp£Ô9(PÝœÉÙkc@,«w¤ó•ì· ÒrF¶‡´ Ón’üÍOfm¡ËQ¶Œ“2ÑA¤+ƒ³^¬KçhUž7† hã/¦ðÀ´Q{T:"‡ID!v§0¥éF0jLà òe=< ½ŸFÐt%ö9Ò0Ðæ*ø*½˜óáSN¨’xv¯wÓúx¨cÒ®Ek@(YkåEø2bDÆÒøôU›cÕižu¨S§”ÉÁjԙ±G0è´²_u™±ŠRâìë̲ý¬ÌLßû¸Î 44Ô.]!ojU6ÌÙg¡äÛ+EQR#=ƒ„ëâ·1ey¢ƒd†¹Y ++q˜áÍïž Ìö†Zêb–,1œf¼€Lٍ´+Üqñ‚üp &`ëàÖ?n™u' ²²8ÜÃ׃ÎÝô†¤Öe(/}@{{ 0!-@|ž^ƒèM¨¦#t‘P?7|ÌY!GxÄۄ0ë;1¬húÉSÛÖ¯ÓÔ®MXì9çj2@Ø(аœ¿#¸ý5V§Ô:Œ*_ˆ,¥ÛSÐÀ® ·¥*@–¾,eF±»Œlò•3ÒÌñW•3«l î¼Mk茵B˵AåYE<ÔÚö»Ì%ŽÁ¯M­m8íi­Ù}TkO¸&P%'èߦŽ}õP¹óÁ©i ˆù<5}ЊÔô-dPÓì²öwÕ4µSÈÛ!BjšxXMS)ö¬šf<•jÚ|©¦%’G€‘$«¡‡ÞVXçCðlt ih¬PùhÞ¢¡qè–$ўÈbV§¡aL–JºÏàihÆæ}‚Á›ÝÁÄ·`²Ž´ÀÖ…ÁÅÁe³ºD•qwœ”ëLe˜2é˜ÊQ°4#ZxÊfÀ'¥fæ<ÂÅ¡ƒ®wÜâù>9@T¿ (bBµ¶Ó³P»{í<¯0ÉÙCYñ=ÌZ#ŒA†~"P‘ YÏPßûàW„µÑÂOA@áõì2˜+>àDB"…ÍKg‚ºÏ6wn´‹k!KP]'a^v€ÒÕÙT)A-ØÉÑnL— ›ƒ0@@ +$bƒZۋgK¥0´L†JÏCI‰€Û,Ÿ…/Q·‰šÁW”³à(€·‹{Š½OC< ì`{‚i •¾“Òß6"Sgv~mð6ÒÕ¶¯U^7„O߀M¨ë\¦0ŒÜ +/‰»X.øÛÁék}{˜<Ü<½Ÿ²šY½…Në²,ðŽòx«•—ÄMíØÖé ys,b¥:é9½ëçÙÏÞ¦Ä'7þ?|ýni f Š`½ój ÖÜYôŸxÀ/zRtª|X¾MO”D²o ­dd@M+Rl<ˆB2æ왋ª“I$˜[ܒê÷`=îËübz•g¢ƒ‚¹ÿÞåÅl³›¤Ö áCij…MÈãŒEø*y-«6.!¥ìÑB@é{‘:kùù*‘ÊÒäiCÐL50ÅS+¥ ÆE¤ì¹îž’偞f‡¶D%Ώu 'gO!žµ§œ`íõԉ-Òú¼DÌFǙ²hA)ŠhZ³¢5èógXà¢~(æû…Jƒ{+F°èÖìaÄRfõä)›ÅИ‚ŠûpŠƒL4"ˆ4.´‰C”Á @ËÙ ˜ûu†›=Râ•á§lhÿ+2a¾h„)߂ošÎP%®Fhð[Ôß CUïÙt HÁìõ_t%F_*`]TÌ s¦ÐEQßÄeÌbx’ÕòPÅ× @E°Âø‹«xæd“ +"θ5֓³|)¾@Tuš3Û.O»FqЬçi'l»ÏJ’ÄúÓ$I4ÒÉQyšM’.[Ýp¿›­ϱŠYç•lDøò”ø{"ƒxL9"¬Dæ‰a^8ØèêL{bDùƒÜPQ‹ôa«rDXf¢LDؽ¿†éj2aÆ:]ö£Œu +m‘Ï#ŠÜJ¨òª3S/-”ê´™J6 ?_laScè˜JG«ÿf'¦ þ-Å\å쬙‹Ã43¥0秱Kd"S–ÍCV2êœSÙD¦D€³’Í÷ZÉôútǜ«G*@GšZ¤ë;xdjÿÂ,ª–ÑÆeJM¢ f¤&á³™¹0^ì…ÈK\6TLÅ¡éh±+q(±Ep—å…Še­çj¨ØŒáÖ5XIHó8̨ÎJ’>eù¿RuƋÁp.Ч†@k´€®ôGé^ê§_4É<ÙNžÚ‰œwôf ¸Êcw#ךÔëê€Â§Oúç§BaùbVOlÇ]pl@•î][fغ(«œ8Åz òâïòµŸÆ4£°ß(¸,ÜawrÄã½Màƒ‡Ü* ‰ÒdhWœÁiÓ8陡àD VÛy’vsÁ_ ø³™D5ÕGØNðz$w8D#ÐÍz#3Ízب¬2|ì ÔÿÊV#sTÔÓÀÙ`ÕÚu6" +'4UäT/‡u¬ËÚè +:Ø Ç4~Æó›èÄ +ÃÃS6ïº.çfÅ'´[8¥†14õ:- 'SWBJQp‰Ôaðé§È€/`|"A0 ‘Òçƒv æ«FŒÐسDºowÑ÷K&ÏÍ"µÂÝÏÕü”Q%t»)ŒG܏–fx¬ÿù ÐìÆH—FÚ';C%¶ÓZ‹PÓðê ÇΙP$‘9®-toиÎFï® ¯) çì›<86ÿ쇨›e• óÓØ3%DÀè)ûÀÎ0ð±hú"Gð Ë2Á¬àcPp͛lÄÂýÌ?¸#›²ñŒõ©ó °ïÃJÙ?ßg𠆣œ"˜!ӉªÔ!põD­œ,­7UzÉ*1H«i[yKAñ¦ö4¯ªNúŠX2¨ŠÓoT›¨^x{ø­_вzeOK0ÛÝиmðx#Œñ¨=¼àUø‡çC 2¹Lø‰Uæj)" +C2ÙϞ™¨Ÿõ+²7{DŽ çˆø<âôˆt.F–nþa1+/m;}âD53ºÚN$ó”Õ 7 &Ÿ02ßƹm£ut ?¹ØOnª2ôô—§GW ìT8,=vÞô0ö.h´²Ç9ô\üƒ(Òk=홭¿=LozޛN Ñ°(<îø”OÞ!-PéB¾~‚?Ý6ÌôøÄÙO¿\y醿¹E)#t‹ª™Q«›J[ýæL†,·üôtúñï'èE @ÒC§ˆœbúxŠH—:èèù„‰2n_, /;M•wá¡ nTúê`5¯^°¶‡‘f+­ˆÁ\â–ÓÝ" ‘‘0ƵŸpl ^„ª žön¢Î;W“ƒr¢Å€"f äPHŒv/™3"è?HMÓPD}p!àŽn cWш•÷ÛX—Þu4…Îc02YS§;´*_+—­3ÑQ:èh:@ìƒ[]Ôá'Ð=‚Öï²Â7·—nùØR¹©ôÙ +†t_uf› ö@¯ª{û߀óá ¸<Ðgí¼™*‡ÕrõûǦù'¤ùǙÈãxów¶ÍæóÆü?Oéíôü3ÿ=ý þq&ê©|ÞïIϧÛÙüu¾ gÄI…!Ú½uÉÅ»)‘^²ëÜK-2N/°nT´_©5î{¸Í/ՂqÿWÌîSÑ~Sîhƒ_»Z…‹þ\M€ŒcËKz~HžIk¹Ôi;ä~F,4”€£5¯ÅÇeؙKôŠÈ‹;Oؖñ/€k*Ž«U{£OûpS#.À-æ7ØÃ7ø w,fp'9wÓqU¢³ªÇüÙÇU‰ÎªB¶²ŠãªÆ§³ ûÌüÅõA4­¸•Ì-Á4v3Æ<Ë;ùG«(Ù *Œ sz•J»šr±¦|}s•ÑQ§à· 2Ô,Œ»š^ІŸží~ ;*`|ß+NèÌØÐёàkÕk¡ÈùÞw±‡TYy… +언³µF¯¸™–vŽÃv ÿûê®}"3·ëÃ÷GW)UÐR]%ã |÷¸qÞHçgíe^@ƒ.ÆæÍð…9Çjìf{?æ Ù¤‚Ô±Öؓ¦“–þICg+€O}œ^˜&"È`¼&cÚ¢¾Ìܨz|×5T¥@ ¾v˜Ã™Ö}Œù4àdnÂ% 3ïÁ@ë2Ë1*ï™S¹Ö?^žÛ8˜©/o¦BoéÉåVp¨uË­8uüy3¥Eæ4À d.Ácœù4ã›Òїӷû¢9žS+c1GC¾–]WΌʯƺt†GVÈZá_Ÿ^.ÒÁS˜RP2>¶ÂÞ(Z ,Ÿ(Tš¤­5 †lw´æ·ž‰V¢çà;T°9*‹Ç¼ÚDµößêT¬á&¯¼ñ‚&ú[Æ ³ú—¾Nû‹Æ ²\¨ðÜ_5^˜Ç©óQ¹ƒSiaÊHr*áé:’\Ý/ø7‘ä,á¯"É5Ô °É¿Œ$§“)´I®¹@Bþ$¹⡓ݾõï"ÉÙ使‹$g’÷þ2’\Ûû7‘ä>Úîï!É5m§þxƒ;‘äHü“‘äšû ñ·"É%¦çß@’kn*߉$×Ê IÈ 0ù_F’ËIړ‘äò’öT$¹”¤ý$9+iI.’´¿…$×ÜpøÂHr ‰ÿ»Hr ‰ÿ›HrH‚Éÿ2’\sÿ$¹†ƒÄÿM$9‘þ‹HrÊN»†hIÎh¿Œ$×È@⟌$—PIÎe9ˆ‘ä“JÝun]ûŒÐ70ngù—‹§qHÀ±Þ8¨=z÷³‹.k Â;Œ_N{퇑ù„›Ð¾íóΒ†°'b£œs¶_S浌“uñ!–¿yiübc®[¡ìƒŠÈìRKöÎ{ì¥}ãù”-{äÿ›ÿ`éfµ‡8µ) U•R œoô–¥p+ô‘}PJ Um…>²J…Tî[Þ¿ªùGõVè#û l¬óúV¨õ}P ð¿¾úÈ>èÅÆãÕ îÚ¥$MÕVè#û ÌVÚh❡D¤Ónˆ&ÞJÔüs[4ñÎP"?5DM4ñÎP"•rÃVhFGó8>$güÍNðó+ø©>?w¨ˆg˜œ/W¿¥ñ¿ç`¹ÁÿPÿ0ðþŸðÀ UøöÇ,M4ÿ˜òÓí¯ùO &z ‰Ã)½šžVÛßñáß‚è·N¹Ô̧ÿÿÐECL 1Ø”¿›Ñë6q¨ùû“€:ÿ‚Ôá_Œ¦~û7üVŸ¾ÁoÿúƒcÊúŸØŸ™<¬iþ!ܘ#àýc'|¸#@ø|€Oãö<J ™oæ?M¬o¶»ùð°Z~dZjÂ~Ûåó˜ÿ8ë§ÃêwùǔL&¦€¥µíi +ö ÿ“Ìñ¸„ÛE€æ¿÷ÃÖ^ÜáóxýàGð ÷x]·7u3_ȶÔ~_Sþ'vðsþÁX!Ã2ÖüãòøþØÝ~ŠÇ/õ¹D&Ü¿ÇáwTwù^ó³?Ѕ*:™\-©ÑN·›óÏñ¡ÚïrA¢€£¿ßø샭rᯠ@Ê躨4ÿ3û¦Ê&ÖƛÍ͍Ä].–ƒ<2üó}}²ãqyqö—sx½H®Q5pÜ×Ø[Ò3|Ÿ¾Ô4¹”¤•ÐHEØíZãi LVk$~i <þù0¥*oõF­™jä+of•Ú„WÅpøŸ„ȯüªÐ5Œ–QRԏöÇ sC`Ž| }ÿÌó¿³ùÒ?ÔOÛÿÙ`kዝÈMZ 'ìÌ åž üZ⾺@r½hLQiñwºø/3N+Pùœ©íïbõ &=_ØBâö.ñ{Z7«ñê*FŽÛ,§@[g ALæ?ð®â›8…+qŠ <¯Çõ"îwàn1Çá“ÑDßÔ&ê+æò ´¥Ï>Џ„Ëëp{=P…b~‡ i Q+Å én2ŠÒ¸MQ>Ñ··à±1!”ÆÄíñ807+•HåÐ2†>óä)*ñÓÿãRéR亃{€üx] N©Õ:ì Œ€úw9<­Ö„s`@·÷Ñë ÆóBƹ˜Ïƒdõ²VE¡ü/—Éÿ»"éV Sà1îÁ©éN¯š.æð`žÅs ‚ìonÁoÔ{nÄñ‹ºGØ>Ìðþ—Â­ xl<ŠÊÚçBv‡êW?Žá”qåBS˜”îõÝM™!nÀè€à7ô"æ§tÉEmÿŸ„´ýôú>^·ñj­§åqüó?cÊ´™ïÀ£?ËÃü†dþçøµýü¾Ä¾<¸JFóÏÿëHM +endstream endobj 8 0 obj [6 0 R 7 0 R] endobj 32 0 obj <> endobj xref +0 33 +0000000000 65535 f +0000000016 00000 n +0000000161 00000 n +0000036442 00000 n +0000000000 00000 f +0000038583 00000 n +0000038260 00000 n +0000038193 00000 n +0000172001 00000 n +0000036493 00000 n +0000036872 00000 n +0000059600 00000 n +0000059487 00000 n +0000037450 00000 n +0000037631 00000 n +0000037679 00000 n +0000038467 00000 n +0000038498 00000 n +0000038351 00000 n +0000038382 00000 n +0000038718 00000 n +0000038743 00000 n +0000039206 00000 n +0000039476 00000 n +0000039545 00000 n +0000039817 00000 n +0000039920 00000 n +0000059674 00000 n +0000059870 00000 n +0000060879 00000 n +0000063054 00000 n +0000128643 00000 n +0000172030 00000 n +trailer +<<79573FB5A12BB140AA20EB4EA35A55DA>]>> +startxref +172217 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai new file mode 100644 index 00000000..8ea0a6ef --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai @@ -0,0 +1,1213 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + logo_blue-orange + + + + + Adobe Illustrator CS6 (Windows) + 2019-07-16T17:01:17+02:00 + 2019-07-16T17:01:17+02:00 + 2019-07-16T17:01:17+02:00 + + + + 256 + 68 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4ql2ia/petQTTafN6g tp5LW4Q7NHLCxVlYdulR4jL9Rpp4iBIcwCPcWvHljMWOmyY5Q2OxV2KpfJr2lx65BoZmDanPC9yI F3KxRkKWf+Wpai+O/hl400zjOSvQDV+bWcseLh/i5phlDY7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+UtK8+6l5N/MjWL23rLYzX9wmoWdaCWMTP08HWtVP 8Cc9Kzdmw1WkhE7SEBwnuND7O95WGqlhzSI5WbHxfT+ia1put6Xb6ppswns7lQ8bj8VYdmU7Edjn neowTwzMJipB6fHkjOIlHkUdlLNiv5i+ftP8maE17NSW+n5R6daV3kkA6ncHglRyP8SM2XZfZs9X k4RtEfUe4fr7nF1eqGGNnn0eN/kZrGo6z+ad5qepTNPeXNnO8sjf68YAA7Ko2A7DOr9ocEMWijCA qIkP0um7MySnnMpcyC+js4J6N2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvDPzgvNWf zVJbXLOLGJI2so9+BUoOTgdCefIE/RnE9vZMhzmMvpFV+Pe+j+zGLENMJR+sk8Xfz5fKnoX5UXuq 3flKOTUWeQpM6WsslSzQqFoanrRuSj5Zv+xMmSenufft7nlvaPFihqiMdDYXXf8A2UWY5t3QuxV2 KuxV2KuxV2Kvinzd/wApXrX/ADH3X/J5s9c0X9xD+pH7ni8/95L3llH5TfmdceTtU+r3bNLoF4w+ twjcxuaATxjxFPiHce4Ga7tnskaqFx/vY8vPyLlaHWnDKj9B/FvpfWPNWjaZof6aknWWzkQNamJg 3rFxVBGeh5fq3zy3W5xpok5NiOnW+57TQaSeqyCGPe+vQDvfPf5w67e67oPlvUryglluNTCov2UQ G2CqPkM6n/ge6mWfFlnLmSP986/200cNNmhjhyEfnyd/zjn/AOTAk/5gJv8AicedD7Uf4qP64/S8 /wBkf33wfSeoahZadZTX19MlvaW6l5ppDRVUdznn+PFKchGIuReknMRFnYPE/M3/ADkqI7h4fLem LLEuy3l6WAY16iFCp4+FXr7DOv0nspYvNKj3R/Wf1Olzdsb1AfE/qS3S/wDnJnzAk4/Suk2k9uSK i1MkDgb1/vGnB/DMjN7J4iPROQPnR+6mqHbM79UR8PwXsvkzz35e836ebvSZiZI6C5tJBxmiJ6B1 3FD2YEjOT1/Z2XSy4Zj3HoXc6fVQzC4shZgoLMaKNyT0AzBch415z/5yL0/T7uSy8t2iak0dVe/m YrByG37tV+KRa/tcl9vHOs0HsvKceLMeDyHP4932um1HawiagL8+jHNL/wCcmPMaXIOq6VZz2xI5 La+rDIB3IMjzA/KmZ2b2TxEeicgfOj9wDjw7ZnfqiK8vwUw82f8AORt9De2x8sQWs9hNbJJML2KX 1o5y7h424SouwC9K/PKdF7LxMT4xkJCX8JFEbb7hsz9rkEcFVXX+16d5C81ah5h8hWnmG9jhjvZ0 uGeOEMsQMM0ka0DM7dIxX4s53tHRwwak4ok8Irnz3AP6XZ6XOcmITPPd5T5Z/wCci9futbt4dct9 PttKpI93NDHMJAqRs4CcpmHIlQAKb50ur9l8UcZOMzM9qsiuf9V1WHtaZkBIREfj+tMfLf58+ZPM Xnaw0ix0q1j068n9Pi5ka4WIVZ35qwSqoOVOH05RqvZzFg08skpy44jyq+75+bZh7UnkyiIAo/N6 X548/wCgeTtPW61Ny881RaWcVDLKy9aA9FFRVj0zn+z+zcuqnww5DmegdlqdVDCLl8njF9/zkx5q ectYaVYwQdo5/Wnfr/Ojwjp/k51mP2UwgeqcifKh+guml2zkvYD8fJPdN/5yRgudIvlvLFLLWYoJ JLFqtLayyqKqjAFXSvz+kZhZfZYxyR4ZcWMkX0kB9x/GzfDtcGJsVKtu5Z+Xn55ebPMnnHTtFvrS wjtbxpBK8EcyyDhE8g4lpnXqnhku0/Z7Bg08skTPijXMjvA7kaTtLJkyCJAo+/8AW9V82+btO8s6 eLq7BlllJW2tkIDSMNzueijuc4HXa6GmhxS3J5Dvet7N7MyavJwx2A5nueaSfnf5hM/KOxtFt6j9 2wlZ6dxzDqP+FznD7RZb2jGvj+v9D10fZLBw7znxfCvlX6Wc+SvzF03zKTaun1PU1HI25PJXUdWj agrTuDv883fZ/asNR6fpn3fqec7W7DyaT1A8WPv7vex38zvOl1putx6YdN0+/tlhSZPrsBmKu5YG nxqBsvhmu7Y7QljyCHDCQq/UL/S7X2f7KjlwnJx5ISsj0yru8mZeRtauda8sWmo3McUMsnqKY4FK xgRyMihQSxGy+Objs3UHNhjMgAm+XLY06DtfSR0+oljiSQK589xbzu+/OTzNb6ncWq21l6UMzxBm SWvFXK1J9WnTOfydv5ozMahQPn+t6rD7LaeWMS4p2Yg8x3f1Ux8xfnVHBcPBodqlwqGn1u45BGP+ TGvFqe5IzI1ftCImsQvzP6nF0PsoZREs0uH+iOfzUNB/Oyd7pItbs4kgdqG4teY4A9yjFyw8aH6M hpvaImVZYiu8fq3bNZ7JgRvDI8XdKt/iKZF5w/NHStDdbWzQahfMquQrUiRXAZSzCtSQagDNhr+2 YYfTH1S+x1XZfs9l1A4pngh9p+DD7b879fWcG5sLWSCu6R+pG9K/zM0g6f5OaiHtFlv1RjXx/WXf ZPZLAY+mcxLzo/ZQ+96j5a8yad5h0xL+xY8a8ZYm+3G46q1M6bSauGeHHH+x43X6DJpcnBP4HvCa 5lOE+KfN3/KV61/zH3X/ACebPXNF/cQ/qR+54vP/AHkveXp/53/lP+jJZfM+hw006VuWo2iDaB2P 96gH+62J3H7J9unO+z/bPiAYch9Y+k9/l7/vdn2loeH1w5dfJJvLt5dz/lcsE0rSRWusFLdGNQit b8yq+A5MTTOL/wCCZjiJYyBuef2vbf8AA6kTPID0H6Qg/wAwf+UM8q/8Z9T/AF22bT/gZ/4tk94/ 3zrv+CD/AI3H+r+pMf8AnHP/AMmBJ/zATf8AE486n2o/xUf1x+l5Xsj+++Cb/wDOR/m26l1e18sw OUs7aNbm7UHaSaSvAN7IgqPc/LMX2W0URjOY/UTQ937f0N3a+cmQgOQa/KL8ldN13SY/MHmIu9pO x+p2EbGPmiMVLyuKNRiCAFI8a49t9vTwzOLF9Q5n9S6Ds6M48c+XQMy8zf8AOPfku90+QaHG+lag qkwP6ss0TMAaLIsrSNQ+Knb36ZqtJ7TaiE/3h44+4A/CqczN2VjkPT6S8L8n+YdS8l+cYbw8ontJ jb6jB15RBuM0ZA60pt7gHOy12mhq9OY8+IXE+fQui0+WWHJfdze9/n75nn0nyOLazk4zavKLYyKd /Q4l5KEfzABfkTnFezekGXU3LlAX8en63fdqZjDFQ/ieMflR+WzeddXmW4la30qxCteSx05sXJ4R oSCAW4nc9M6ztntX8pjFC5y5frdNodH40t/pHN7hP+Qf5aSWZgSwmglK0F3HcTGUGn2qOzx1/wBh TOPj7R6wSviBHdQr9f2u8PZeAiq+188+f/Jt15Q8yz6PPJ60YVZrW4px9SF68Wp2IIKn3Gd12bro 6rCMg26Edxee1WnOGfCX0N+T3/kntO/4xXv/AFEzZwvbn+Py98f9zF6Hs/8AxcfH7y+XLO1lu7yC 0h3luJEijB/mdgo/E56NkmIxMjyAeXjGzT608oflP5Q8r3FrfWNu7apbwtFJevI5MhcAMxQsUX24 gZ5lre2c+oBjI+gm6obfpes0+hx4iCB6u983/mZ5ku/MfnXUbp2Z4o5mtbKPrxhiYqgUD+b7R9zn e9k6WODTxiOdWfeXnNZmOTKT8A9m8mf84+eWLbS4pfMsb6hqUyBpoRK8UMRO/FfSKMxXoSWp7Zym v9pc0pkYTwwHkCT83c6fsqAj695JH+af5GaNp2h3Ou+WvUg+ooZbrT3ZpUaJd2eNnJcFBuak1A8e uZ2P7Q5MmQYs2/Fyly38/e0a3syMYmcOnRgX5Kf+TP0P/Xn/AOoaTN12/wD4nP4f7oOB2d/fx+P3 F69+d+m3rNp2oope0jV4ZGG4R2IK1/1v4Z4T7R4ZHhn/AA8n2H2S1EAJ4z9Ro+/+xI/JVp+W+oaY bHW2e11d2YLdPIyJQn4eBr6YoP5xmD2fj0eSHDl2yd9/d0+bsu1svaGLJx4aliHSr+fX5PQPI35d af5emlvnmW+u5CRbT0oqQnpx6/Ew6n6B777s3smGAmRPFLofJ5ftftyeqAgBwRHMd5/UGAfnN/yl 6f8AMJF/xJ80XtB/jH+aP0vT+yv+K/55/Q9E/Kj/AJQWw/1p/wDk8+dB2J/isfj95eV9o/8AHZ/5 v+5Dw3W/+Ozf/wDMTN/ycOcTqP7yX9Y/e+jaT+5h/VH3PXvLP5R+Xo9JhfWYWur+ZA8v7x0WMsK8 VEZWtO9a51mj7DwjGPEHFI+Z2+Tw2v8AaXOcpGI8MAe4G/m8089eW4/L3mKawhZntiqy27P9rg/Y /JgRnOdpaQYMxgOXMPW9j686rAJn6uR94ZN+Wf5eafrlpJqurcpLUSGKC2VigcqByZmWjU3oKEZs uyOyoZonJk+m6AdR2/23k08hixbSqyW/zR8g6Rodlb6npKNBC8ogmtyzOoLKWVlLlm/YNanHtnsz HhiJ49hdUvs92zl1Ezjy7mrB5fd70V+Rk8gvNVt6/u2jikp/lKzD/jbLfZuR4pjpQafa+A4Mcutk fc9czq3hnxT5u/5SvWv+Y+6/5PNnrmi/uIf1I/c8Xn/vJe8vtSWKKaJ4pUEkUilJEYVVlYUIIPUE Z5JEkGxzezIt4r558j2PlLy7Lb6e5Njfar9at4DWsINuVMfIk8gCux8M1vtl2hLU4sZl9Udj5893 o/YnTDFnyAcjG/tDz/8AMH/lDPKv/GfU/wBdtnV/8DP/ABbJ7x/vnQ/8EH/G4/1f1Jj/AM45/wDk wJP+YCb/AInHnU+1H+Kj+uP0vK9kf33wU/8AnIXTri2/MF7p1Po31tDJC/Y+mPSYV8QU/HD7M5RL S8I5xkf1o7WgRmvvD1z8jvM+m6r5HstPilUX+loYLq2r8YAY8Hp14spG/jUZzHtBpJ49TKRHpnuC 7fs3NGeIDrFnOq6rp+lafPqGoTrb2dupeWVzQADsPEnoANyc0+HDLJIQgLkXNnMQFnYB8aanNL5j 83Xc1pGRLrF/I9vEevK6mJVdq/z56tiiMGACR2hAX/mh46Z8TISP4pfeXuP/ADkfpcw8o6PPGC8V jc+jKwHQSREBj4bpT6c4/wBlsw8eYPOUb+39ru+14Hw4nuLH/wDnG/zRp1jqGpaHdyLDNqPpS2TO ac5I+StHU/tEMCo+eZ3tTpJzjHJEWI3f62jsjMIkwPXk+hM4Z6B8sfnv5m07XfO/+4+RZ7fTrdLQ zoeSPIru78SOoUycfoz0j2d0k8Om9YoyN18h+h5btPMJ5dugp7J+T3/kntO/4xXv/UTNnKduf4/L 3x/3MXc9n/4uPj95fN/ksA+cdBBFQdRtAQf+M6Z32v8A8Xyf1JfcXnNP/eR/rD732nnkj2b4r123 uNF83X0Mqfv7C+kqrV+L05SQfk1K563p5DLgiRylH9DxeUGGQg9C+w/L3mDS/MGkW+q6ZMJrW4UE UPxI1PiRx2ZehGeWarTTwZDCYoh7DFljkiJR5Me/NrzPpuh+SNTW6kX6zqFvLZ2duSOcjzIYyQvg gbk39uZ3Yuknm1MaG0SCT7t/tcfX5owxG+ZFB8+fkp/5M/Q/9ef/AKhpM7jt/wDxOfw/3Qef7O/v 4/H7i+qNaudIt9OlbV3iWwekcvr0KHkaAEHrnleonjjA+JXD5vaaXHllkAxXx8xXN555l/J7T54H vvL0/pEr6iWsjc4nFK/BJWq17VqPlmg1nYMJDiwmvLp8C9ToPajJGQhnF9L6j3hj35W+b9Rsdbtt HllaXTbxvSWJjX05G+yyV6VOxHTNf2Lr5wyjGTcJfZ7nae0XZmPJhllArJDe+8ebX5zf8pen/MJF /wASfH2g/wAY/wA0fpT7K/4r/nn9D0T8qP8AlBbD/Wn/AOTz50HYn+Kx+P3l5X2j/wAdn/m/7kPD 9WAOvXgO4N1JUf8APQ5xef8AvZf1j976Lpv7iP8AUH3Pp7PSXx54l+dgA812tO9jGT/yOlzjPaL+ /H9QfeX0P2T/AMWl/XP+5iz78p1A8jWJHVnnJ/5HMP4ZvexB/g0fj95eZ9pD/hkv83/chB/nN/yi Cf8AMXF/xF8p9oP8X/zh+lv9lf8AGv8AMP6GNfkb/wAdTVP+MEf/ABM5rvZz65+4O39rv7vH/WP3 PYM614R8e+avKvmeXzPrEsWj3rxve3LI620pVlMrEEELuDnqej1mEYYAzj9Mf4h3PIZ8EzOXpPM9 H2Fnlj17z/8AOWxvbzQrJLS3kuHW65MsSM5A9NhUhQc0Pb+OU8UREE+rp7np/ZbNCGaRkRH09TXU PI/Pfl3zBP5R8sxQ6ZdyyxT6iZY0gkZkDm34lgFqOVDSudr/AMDqccOnyDIeA2Pq2/nd7znt2fF1 UTD1Dh6b93cmH5AaDrth56knvtOurWE2UyiWeGSNeReOg5MoFds6X2k1OOemqMok8Q5EHveZ7KxS jlsgjZ6/+ZP5e2PnTRBaSOLfULYmSwu6V4OaclYDqj0FfoPbOX7K7TlpMnEN4n6h+OodvrNIM0a6 jk+ZdY8peePJ2oGS5tbqwlgNYtQty4joDQMk8e3h3qO4GehYNbptVGgYyB/hPP5F5nJgy4TuCPP9 qFE/nXzVMluZdR1yVCAkbPNdcSa06l+Pf8cs4dPphdQxj4RY3lymvVL5l7f+T35M3GhXSeYfMSr+ klH+hWIIYQFhQySEVBenQD7Pz6cf2526M0fCxfR1Pf5Dy+/7932f2cYHjn9XQdz1LzDoOn6/o13p GoJztLtCj06qequv+UrAMPfOc02onhyDJD6ou0y4hkiYnkXyr51/KrzZ5WvJA9rJeaaCTBqNujPG UG45hamNvEN9BOek6DtjBqYiiIz/AJp/R3vLanQ5MR5WO9LLXWPPmsoNJtb/AFTUI3HH6jHNcTKV O1PTBYU38MyJ4NNi9cowj50B9rVHJln6QZHy3UfNPlXU/LN7b2Gp8UvZbdLmWBSGMXqMwCMRtyoo Jp45PR6yGoiZQ+kGr72OfBLGQJc6fSX5Qoyfk/poYUJhvG+hriYj8DnAdtm9fL3x/wBzF6TQD/Bx 8fvL5t8lf8ploP8A20bT/k+md9r/APF8n9SX3F5zTf3kf6w+99p55K9m8h/OX8n7jzBMfMGgIp1U IFvLOoX6wEFFdSdvUA2oeo9xv1HYXbYwDwsv0dD3fsdR2hoDkPHD6uvm8IS482eWLp4o5b/Rbp9p EVprV2APehQnO0McGojZEMg+EnRXkxHrE/JNY/J3nrXrG+8wX8dy1pZW73E2o37SVdYwWCxtJVnJ 9th3zGOu02GUcUTHika4Y19tcm0afLkBmboDmUX+Sn/kz9D/ANef/qGkyrt//E5/D/dBn2d/fx+P 3F7b+bfljzLqq291p5a7srZTz0+MfGrn/diqN5KjanUdupzxDtzR5stSh6oj+H9Pm+sezXaGnw3H J6Zy/iPKu7y/S8pTUNetom0xLm6gif4Xsg8iKS29DHUDevhnLDLliOC5Ad2/3PanDgmfEMYk/wA6 h97Ofyx8has+r2+tahA9rZ2p9SBZQVeWSnw0U78RWte/bN32P2ZkOQZJjhjHl5vOe0HbOIYjhxkS nLY1yA/Wgvzm/wCUvT/mEi/4k+U+0H+Mf5o/S5Hsr/iv+ef0PRPyo/5QWw/1p/8Ak8+dB2J/isfj 95eV9o/8dn/m/wC5DxDVf+O/ef8AMXJ/ycOcXn/vZf1j976Jpv7iP9Qfc+nc9JfH3if52/8AKVWn /MDH/wAnpc432i/vx/UH3yfQvZP/ABaX/DD/ALmLPvyo/wCUFsP9af8A5PPm97E/xWPx+8vM+0f+ Oz/zf9yEF+c3/KIJ/wAxcX/EXyj2g/xf/OH6XI9lf8a/zD+hjX5G/wDHU1T/AIwR/wDEzmu9nPrn 7g7f2u/u8f8AWP3PYM614R2KuxV2KuxV2KuxV2KuxV2KsS/M4+dIfLT3vlG5aHUbRvVlgWKKZpoa EOqrKj/Ev2hTr0zadk/lzm4c4uMvMij8HE1viiF4zuHhWj/85AfmHZXnqX9xFqkFOLW00MUVPdWg WNgfnUe2dln9mtLONRBge8En77dFj7VzRO54vx5Mnuv+cn7poGW18upFOfsSS3RlQH3RYoif+CGa 6HslG/Vksf1a/SXKl20a2j9v7HllxP5l88+aubBr3V9SkCqiCiqOgAH7MaL9w3OdJGOHR4a+mEB+ PiXVkzz5O+RfXnlrRYtD8v6fpEbclsbeOEv05MqgM3+yapzy7V5zmyyyH+IkvXYcfBAR7gmWY7Y7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWHeZvyj8ie Yrh7u9sPRvZCTJdWrGF2JB3YD4GPepWubXSdtanAOGMrj3Hf9rh5tBiyGyN/JjUX/ON3kNJFdrvU pVU1MbzQhW9jxhVvuObCXtVqSOUB8D/xTjDsfF3y+z9TOfK/kfyt5XhaPRbBLZ3AWW4NXmcD+aRy WpXenT2zT6ztDNqDeSV+XT5Odg02PEPSKT3MJvdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdir//Z + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:541D098FDAA7E911B425F35AB770E4C7 + uuid:486615b2-1b6e-4323-a473-deb008ef2504 + + uuid:004ce5b9-fc7c-4b0d-93ee-bf4717f6614d + xmp.did:73FE812EFA94E911B987F622BD994B0C + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:541D098FDAA7E911B425F35AB770E4C7 + 2019-07-16T17:01:15+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 2883.999023 + 736.000000 + Pixels + + + + + CenturyGothic-Bold + Century Gothic + Bold + Open Type + Version 2.35 + False + GOTHICB.TTF + + + + + + Cyan + Magenta + Yellow + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 2884.0 736.0]/Type/Page>> endobj 9 0 obj <>stream +H‰„’MKA †ïó+rÜ=Ìì$™Ïkk„"Åâ¡Ô¶ +®ÒöпofZµ¢ ›¼CòäÍ2Ãí†ùÔÂäj +j§,D@)±É9ƒ®j¿V÷ð¦&EYc)‚5L^¾™ö[5\ßYØÔPŠ„²QZ꘠¬àœ!X õœ"†eTݼׄÆuï½F2¡ÛöšƒÄ}oMì–ýc¹Qø9°«hÏ蚁 ¢Ô@yàáE†»±µÎŠZH=F=û¶\  =#„ºÇZmþ^o؜#pέc‚Õ¨êå¨D[x­Á2HY„vÉpªù³p?w¸ ÆÑ[61|cu@ùùb(±@š’~)¢Æ¿§ÿXÇè[×16ï56óE!1“qÁ•3̾ &Mô_cgsy5 ƒ¤uù +endstream endobj 12 0 obj <>stream +8;Z\t8Wpt6$q9pW3/fMoQ#<;]1kUN9.WJ^e=`dXojY-s54H#9A^MR+*mmk-_WT'j] +#;[)cme0 +ikIVjo,=N%.V<]^S'sc,N,q(P*kMSl:N&aJ(itp:R0j0tZ+13jBBUqkNNYX="IScK +4d/o^m'k=:3]imh[j,Uk?rG;/,@H\QKP(l2#/8HW1!N["X\"E5d<=2d:jpA"k*##= +#5DeQPgh0-VC/3:da4A$CbSR5HH%479J[eU@N%num.l*9@u7ZGXgj7+R/D\0B.pVi +=$8!LdZ]i%[4K:;p+hhbIK\1)2-fhHUeWS1A@^6gVNApWK0)E\"4IK*8Fc&3D_5&O +CoUIBUS^`J'E'fc)#sp`Y0?~> +endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 6 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 5 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream +H‰|VXWþÏ̼G…ˆ ˆóγ¡ ¸¢Y-ŠÝØEªRD ¢‚"E±aÛ{H4j4QWEÅ^bb,ë{ŶîFŒ®1 +ÌЏ/»‰¹÷»ß-çÜ;ÿ¹óÿg 1R!bhàOïø–ÓšñŠ‰Ûèàè Øk.Û§ä hý‚ä#%™½‹X@:=¬Ò¦1`ÃvétxTrXèì%=»—ì“r¢iôYÀ9…ÏëÁ ºîÖx~€ç­#¢’Öè_Øóü`œì¸ûš®ÑAI±ÚVÕ@ÛDö—gE‡¢5<ÏÄ'±13Ô~Z~–ÇÂ:{l|hìãÁcy^Xn‰w…£`ÍF{¤¿í{„ ö‚$4²ê‹ÄkKñ›28pH dÈo-jGã¾E’ÏÊn֛P}ïÈ·Æ#jÎM‹w‹Ü õ>ÿ[Ø(J­…¥•u#›ÆMlítöŽMš9»4oáÚÒ­•¬7¸·VŒmÚ¶kßÁ£c'O¯ÎÞ>]þÒµ[÷¾ôìå×Û?àÿöéûQ¿þúxðÀ¡Ã†9jô˜OƎ?aâ¤ÉS‚058$4,³|#¨jŸÏø_ gÿ-ƟÆø—‹…IM¤aÒ$)×-ÕígÙAn&Ëõø½å ø ‡¼>·¿Žñ»ÜÞáŸb©Ç/¿ÿÐü¹J¾²»ÿÆ‹ñû6à5FVáސªª÷ÕQ]Ôê€êüZÇZ‡ZûZ]MYMi¹ÆTStïؽáo©Yž^žWaUž^Aw­Ë“ʏóÊúr]ùå*º”E–%W´,V¶¯,¿4¯tKiPº£nW™¾4®t2ϼʆ””y›GšG˜šû™û˜Ì~ænf/s;³Álkª6ýjziznªªÛeºnºlºd*ö߉40 5š¼M^&O+ß®³æx½ŽÖ -ñmûã"DQœ߭ÎxŸ½ud]F¿› ÿ3ßÿÛÙ^ðh·ýC§wƒ"" éÂäá–`9²ð)va+ìÉÙa1Vãg_#¸ +qâI§yKX±b[ðS|áÏŒeÅd!›µ¼™UZˆí¬Ò ¬»̸—Ì»Zæt+êIýië%‘Šoa¬°FØ.ΏZ„¨›øùm/b$ë2†O\Ã'íD1óí>+§+u£€zýeP.¢úžîSµ&¬¶ %âXI«iYó¸öµ½úH}‰ïĆYÄÿ*s_ ÂxÆÆ7Ï:ŸÍ*_̙(‹3Ðf¾³­œSö0›2îsœAnã9ߏÀUÃՒÑëX‰N\}GwŽ$€‘Œg…Oe¥&³†rh'í%3= Gôšqµú Ó¹óWþž(‰n¢;×þâzq“¸KÜ#>‘œ¥Ž’·ä#­Ð,Óúks´§´O-jª—Ô&×^Ruj:GÐNpC+®mÑýÈ| áÂë³ØLÎYs97-æ{_Ëïë¿|W}pÇßÝûÐ×Ù:ù˒±ï|X$Ù`óaŸ±d,ƒí–dã/(-6e2 3IÌ&!™†I'M +-MR’ÒP*&mâ™Òvš ӆþ¦Ó¤ã¶Ó ‚6Ånl©ïN6i§º»ÕÛ}ïî~ooß¾ûÄTv‡ŸÃ껳vÓX¥£¿A¦½ ¹ð ØþtŠ +Tàu¸²T 2ÑA@ÿ<>…ãøb%%p,"‹Iˆ ’“„’áø+¹ËXà(eÖ1f'svû b¹ÈüŠ™O +À6Øù;Øö[ì{œ¥ì öâ6rm\w”û%w“›á-|?ʟ4 ¦«f§Y±|bàq|iuý™¼±ó*þòO Äð·!ƒ¼€‹H=ªAMlŠ[ˆï0 +oG¥Ì{hpq?6[Ø?`D['¬¬ZÈIã‚e += ‘W1? {Çä±\:ðgÀ–²W¬sÌÁ¾‚/›^Ä#hš8 BNH6ÂÜVÃʺ;Ô),¥¿Î~âå×i½ËæBþ ˜7¤oð ô#rC¯mÕG¬©­Y½¢ºjù²Ê +¿Ï»tIùbOÙ"¥T–JŠ¹]…΂ùy¹9ў%ج³‰çX†`ä )1‰zb”õ(MM~½¯ôÀ@Ï1*ÁPãÃ6TŠfÒÖ*X|ÉRÍXª÷-±(PÀï“BŠDß *Rok€|"¨D%š4äVCf=F' :² wH!çPP¢8&…hã£CZ(„çÅmÖ¥¡ßê÷¡¸Õ¢ $Ú¨ ÇqãZl¤1´&N9 PÑf%¢a%¨C LY¨§¶µGBA·,Gý>Šv*½)ë¨Ýk˜ ã5”o &ã5Ò.Ýt\Šû&´ñ„ˆzc^¡OéëéŠP¦'ª¿Ãá¥ë• ]`Òé÷%ð+›#ÔҐÀhsä +jNÆãÁ`T[NCdìAs7£…œ»$½«ic=ÝyP+ëm4 +õûZ:"2 VBã’îFGÄðŠ•RÓÝÌ8ܯ„ô‘Øn‰Z”uʐ¶;d¹4Š:“/¸šÕ+éPsHÒ6G™Ö¹•hO°(ž‡´ŽÇ.†U)ü°ÆŽÌLdzís‚õ Ð_gH†¹.êù©Æ:"% !B¥ ‰(””ÕèM Òvրü¢ftÌ_L×èDpePŸkSAIÞzx¤gn„/§.êár?ä@?/S¯—.]ªGŠ©¨dkþJ¿ïQÚ¢ ‹m)Cm¸)º¦¦\–u–'TÔ :ÚÉô%Ô뾀ÔJo”’˜®™˜×äoÑ5£óšû·ÇçKFiO͞û§]\ZCñ‚ÿ£îÏèaù„¤8˕imOvÜí‰iãQ ¦–¢¦5*R£ÓzéÑ^E-ÞÒ¢ ‡bó.%Ò±ãnzz<:„aRiuf6hnC„q“hF"n¤–¯*-íÛ"5s¤Q¶ ÎpŸêÛ!4Ú»ø‚³g\6YixZÖíH™x]yr^.Ey"Å6¦(—b >L™‚PúÑ…̍;h[œcØwñ¦7±„ñßÊ0ÈÊs ì½Ì0¤Ùb ï%ŒÂæĬ §w£x7Ð:Ø(NZÅ©ª ˆ³©ˆË—ÉÙQ †ímFb&fT +S‰€ +ùñ÷ þÐ-Õz͊°tÍÄ°R"=¤Ž‹YÂV‹å‚óÁ¬‰ç#›ÇAö4™ÍÏF—ÍPž «‰À®Ë`Œˆ`³Y,f3Ïsfd°Åʘ T ӒišL«Öi‰«6 ßÞþ$pv¡D¨vìá'ÂûÂY]šáU÷Ⱦ†È…÷Œ»£®ÂÖY—svÖU˜¬­Í©­u-r‚³sGF*¨ã*¼c¯ŽU8ÿûÏëõ._†e –se*uF†B'>+¢8û³Ô§/§~óïÔµ3©;ÜÛ÷R,ù¢ž93³C¿ E‘ô$ûÛuXjS+ØFDŽÎ,âkA§Éæ:Œ˜(!b1ÆÍÅ׋qÞà¨õº•Xà ·í7ÜiMŽIû€¥ÙÀ$ªKÖÕÕ%µŽœZ“C^™•R´rª®ZPÀ•òùy ª«V­\áaÎc1õ¶3ÛŸú-^z£÷pêãC¯½~ðð¹s¬zoâ›ðúÍàuÍÍCÇO\¾øìÓðnKm5ð– /Ú£–,ZµˆäxòKduú¤Î"îéÌ·r¶lĖÀW~–ÝÉÛsJ/Ià°jÃÍ~eÐö́oMôÖÙ»^Éd7ТfcÔ՝HbpÁexµ¸ìM¼\ZËŸºj-žóL\½ê¹¶÷ùÔ§?<µûËßú§V7½Üw3õ»ÓϾ³ýÕÍ©¿~í#‡~ø +«Ît¥n¡m/î­¨ îy¢©>ÅÌKO‡6}íÇG?§;§³´û, –³£5ûsîsáÕ¢âÚ4ùqª¢†ÐÇo·nrìpæMRˆ²…ªŠ•µÛG…“Q…6!ÂiIX&0BXüþþù¸48'ÅÉn,v‹·G¼ºë¹UPnðJ©gåŠU P:Õ48°><8PsR·y4ÔÜÕÒ4ÖÄ1„L6`ȃžT—3ʗ:¹üN›jÊÜn—ËaEåxGù¡rRR.•»˜ãˆŠ âºì.t¹£.Õ".‹z<"ÔÝ*|Ɍ"î$|(^<<6vvV_ FÛÝ=‚2Ë¥þ’b˜êråüµXgHo‹q>䎥4;#Uà9ñÎi|½àlUý/†÷ÓÖT²««qïªTÒ»õ+Á½«S·Yõ`놾X¬oÏù«³GHù•£m'¾›Ê'ö玪íϽ”*ÒyÚ«é]ð=¹P•ê^-b{'úûÕTÕu…×ÙçÜs®€.pÅ@à(¢AD. +Q|Dʼn†«ÜÊSyƒv,ÑH `T«F‘IӈAœN43Ó45c;­?j;m£3&?ÂhRk3v¦rú­}ÏeÎô‘N§¼{¾»ÖُuÖþöZkßkD–8ƒ£ª´¼WÕ®`%87zýŽ@êpøÝ⤹…lñ*³5Wd„ÐdÂÌ}"|TH‰Îne‘£Ã÷~øùð¹ó½×žëïÛµëTŸVÚ=|ïh÷ðÝW”üÛÖ©ƒÃÖ[{öŸ9»wïiœD\: s{GÎ4§ÇõXF±ÃØg¨ª'$,ãœz.Xôª½ÁÂ*” §1ô Aëíœ ðˆŒ ý#4È´Þω’aä¹V¹¥oºÐÐÕ°œ¶þgþcàS¸é]úYB&ÿVRv müYãU’¼Iásä L4@»91lrÞçÓv.OÿV±'.»Dþ³–Ó¹¦(f(ªçfúð2XO³nªóàw<ý)'mMxÌs N[èZ“¿A)p=aÜåq—ƒ¯EßtE‡ ¥,¡1á¨8¢¥(Ùø»5(¢sRV©Õõ9µKu¬”ª:SÍTÅx5F¿U?Q¿P-Ôö’Ɇî á¼f~Ž{µ»ÌÝèÞåv,p+ñî9n!Üánñ¾û²ûºûK·æ. ¦öIUãóº½*¶¯Ë¥¬rmt WîÔA%ù-ÿÉz½ùwoyåá¢$Þ÷6555ßôŽ(|ÖMLŽŸ‘wœ‚Àä›>—k ÍU†¬Ý€èñm ¤_£ÑF«shd +lÑ.)s0vœÇCÖ=â®<} •Ó|ðš?}Ž:ÌÏ#àsջ”Œ±ïê‡èuô“Hn€ÿ”¬'Ð\g/­Ã^6óùsìÉX(§5x^™¢}J‚¯I ¼{ct„+ðãl£ °QÀççä3¼Jǁ×0cåûR˜w>{e™ ÛAà)š¡=NšDM·ãò¯Ê¢D‹‰ôš-e,b¼LdYßΗekðk5p^6`¿V+ ïÃÞrpö2d1Öwaï‡pþEŽn%òGöœDÄMŒÛä b”ã12Éñ%Í法±Û+㨏cÍΝƒâ á@,|xÆÆ4Ø$™7ˆ]~¯m;Mæb 9–˜?qJ$†KòËñÝààCHø!c“}±¥AáëRÎEì7œ¥è :)/RDZŒÁ€L°.Ù<sžr®@þTtY§þqÞrîHù Å1—2m9ÂM@æ#ï7Q™Q »Ë°ŸE°½òSȵ4EoƒÄþPÃvƒû§´vªïQþ¸ê3ÆÓ õ‰ØZ{GÇÈ# ㊲Y{›Ú%ßWè€øvèg!Å|Zàj,·£øêýoö¹Œ•\ãä^›h +$ê±µyÌq# ¯áùEÈ x®ßY\ Qš¹rMbøϺà\_ë·àýþý¼ÇÚ¼cù+¹–ÊzfÇ#×ÁÀþ¹pN˚€¼VKvçüÒ>²zô«G\·z Åêq‡4­ø›¨ýêâ{ˆVȜÃ3'ì3×~Þ§c‰@Ýמ¤z¹æ y¡©¨Øû¦_§|®ùúz^¿J圳ÜÏ~ªí´–¹ïՐõ2þÿP«µ¨˜ÇÕßÀŽÙ,*–¹ìç7 }/ð<—ùSI™ŽyT¯†þÖQ&ÛÔËÀ1j¾ýT`×ãz»þÊ>Á{F̔ñYð>ÙW>[ãöz|´Q„vr2Mâ½J®öa¿6_z…°-£bµ%åxs€¯ñeóàŠcTޑ°©;É#¹"ŒÝ¦™D‘2—.Y·ùÝè/æºÁw3s,"­~}>ÞùsöÁº-}ðŸ['8íS›hO †ÇÊ@Lë\³è ­Íú˜ïCç ™C뵈òÐwÔ_‡E,îKÅ1€÷}¥\p ˆÝ¬?(ÇBùÐ?ƒ1zì?íÿ&¿Çý¼Eê¸/¸¾ñoKcHñf@boÏӜIÊçeÐX‹Ú»÷÷ZªÔ#ò÷ïP&âñQ')qŠj°f#LfýÛïþ½¦ÌÕúÐîû›hCû€›«^xض‡íaûÿ6R𠰛îP&e“ƒ…R<Í'Rëœ'HåQ +¡ÃRòg'à×Uš„'¿®AÅÖuègl݀¥_±mžþ®¶®Ðl¡Úº GDº­«è_dëô­¶®Cï³uƒž׊¶7VTú6U˜ýfQu…™ßPßЊ.sQCscC³¯µ¦¡Þl¬Ý4Ë\ìkõý‹IfŠÉæ̆ڭÜ×bæÖcejF†'9#Õ\P[kÔTU·¶˜-ÍÛ*ʋ—®.\Ÿ´¨¢¾ukóö¥ ­Õ5›’6Ô~ƒ»Çôw™5-¦Ïlmö•WÔùš·˜ •ÿ|{TDÛ©‘*¨’|´ Ò¤~ ˆª¥žO T´Ú³LZ„§fèüíCœa¢§ëgA[,û}ÿ¥%“RäêÀìBŒÖÒ֑y-è˅ô¿3•2Ð<”ŒïTô– ·D2îb:Ð)_ï£þ“|‘|™-§/*øªÙ˜b(Ä>ô)'Þ Îp7` ™5Âö§ôÊþٛɛ võE€³ÏP+­}¨Ië%Ô¯KËF½AZ¦÷$²çΞà7±gÎêy3 œêm2ºŒ·€Fý;ÀÙ*ÞbtÒR¢4E| m'®S7aÈ9âK`SŒ¯aÛ×Y7øìãÇÃ*Ÿ•=¨]€c=µxµ°Ž£>)­S\¼v{x•1‡ªY5q% 4ñÝ… +Š¶»D¡©ÏŒE}ás®½ðù ®^ðµ ^®Qeñ8ž~C½b|L—`UÓ¡‚£káF*R/¾;4*àúb´ylDL¥̦k…õvÑÞP=ê/8s5¬r³ºà܂feÁi×Â5´¢"ô³} Y +âE{W£ú ́Ðì^xfí) BµF½¥^=çÓÎZŸ,h?ۿèíRO:ªvÂY¨}}˜zÕ|Ҙ¥~)¸%ø R±K}Çöª¾/îTw¡]Wܬ¾j{3»êcêN{GƒºÝö| ‹)õEʇ´u"åFö—©)Û£t±]MÚ+ßP-¦T*d´p¹xìbúñcیÈûÌô=Šë¥Ò{̤.—Jû`=ˆ×€J{‹æ¯:–b2ÍÚz„eäð®¢ùE3ÜõF5ü¿eµ_L.hgÌRM õ'SDg߬þ(˜_™;µý¦ÇCF`™º7£kof,m2³Y{΁b·º%#÷祌Wõ–ü¼éUÕaÉÏ Äƒº{±/äQ͊~wF(BnC‚%VF‚î=í Oa½îÝí ·ºçÑdžèËå[(Ù,þ²ë˕“•YdO’„SÜ'‹/·Ø°Çc±a×ؚrõPԝ)ñŠ£-]OÎ w¼æ +endstream endobj 11 0 obj <> endobj 10 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_blue-orange.ai) +%%CreationDate: 7/16/2019 5:01 PM +%%Canvassize: 16383 +%%BoundingBox: -43 -681 2789 33 +%%HiResBoundingBox: -42.999 -680.9844 2788.8838 33 +%%DocumentProcessColors: Cyan Magenta Yellow +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: -42.999 -665 2841 71 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: 983.0205 -584.8799 1783.6602 -8.87988 +%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: 1 +%AI9_OpenToView: -2911 1691 0.25 1586 946 26 0 0 51 123 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 21 0 obj <>stream +%%BoundingBox: -43 -681 2789 33 +%%HiResBoundingBox: -42.999 -680.9844 2788.8838 33 +%AI7_Thumbnail: 128 32 8 +%%BeginData: 5449 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 +%524C45FDFCFFFD08FFA9FD11FFAFFD6DFF305BFD0FFF5B30FD4BFFCACAFD +%20FF5B0885FD0DFF85085BFD4AFFC3BAB4C1FD1FFF5A090885FD0BFF8508 +%095AFD49FFCABAB4BAB4C3FD1EFF5B080F08A9FD09FFA9080F085BFD4AFF +%BABAB4B4C3FD1EFF5409080F08A9FD08FF080908095AFD4AFFCABABAC2FD +%1FFF5B090F080F0FAFFD05FFCFCA310831095BFD20FFAFFD13FFAFFD17FF +%CAFD20FF5A0F080F080F08AFFFFFFFCFB4CA0F0F080F5AFD06FF85300F08 +%0F307FA9FD08FFAF3031080F307FFF85080F08FFFFAF080F08AF5A310885 +%FFFFFFA93031080F0E7FFF5B080F08FD04FFC9BBBAB4BABBFD04FFC2B4BA +%B4FFFFFFBBBAB4BBFFCABBBAB4BBC2FFFFFFC9C1B4BABAC2CAFD07FF5B08 +%31090F080F0FFFFFFFBABAC931090F085BFD04FFA931080F090F080F080F +%7FFD06FF85080F090F080F0831300F0931FFFFA90F08315B0F080FA9FFFF +%85090F08310F0F0831310F0831AFFFFFC9B4BAB4BAB4BAB4CAFFFFC2BAB4 +%BACAFFFFC2B4BABAC2B4BAB4BAB4BABBFFC2BAB4BAB4BAB4BACAFD06FF5A +%0908313009080F0EFFC1B4B4CA0F0F080954FFFFFF840F080F0809080908 +%0F08095AFD04FF85080F080F0809080F080F080F08FFFFAF080F080F0809 +%0EFFFF85080F080908090809080F080F08FFFFCAB4BAB4B4B4BAB4B4BAFF +%FFC2B4BAB4CFFFFFBBB4B4BAFD05B4BAB4BABABAFD05B4BAB4BBFD06FF5B +%080F31FF310F0F0F5BC8B4BAC937090F085BFFFFFF31090F085B85FFA95B +%090F080FA9FFFFFF0F0F080F31A9A9AF5B0F08310931FFFFA9310831095B +%A9AFFFFF080F0F0F31A9A9AF5B0F09310831AFFFC9BAB4BAC3FFC2BABAFF +%FFFFC2BAB4BACAFFFFC2B4BABABAC2CFCAC2B4BABABAB4C2CAFFC2BABABA +%B4FD06FF5A090831FFFF0E0F085BC2BAB4CA0F0F08095AFFFF7F080F085B +%FD05FFA9080F085BFFFF5A09080930FD05FF850F080F0EFFFFAF080F0831 +%FD04FF5B09080F5AFD05FF840F080F08FFFFCAB4BAB4C9FFFFC9CFFFFFFF +%C2B4BAB4FFFFFFBBB4B4BAC2FD04FFBBB4BAB4C1FD04FFBBBAB4BAC9FD05 +%FF5B080F0EFFFFFF0E0F5BC2B4BACA310831085BFFFF310F0831FD07FF5B +%080F08FFFF5B080F0FFD07FF5B0F0831FFFFA931090F30FD04FF5B090F0E +%FD07FF5B0F0931A9FFFFC9B4BAB4BBC3FD05FFC2BAB4BBCFFFFFC2B4BAB4 +%FD05FFC2BAB4BAC9FD04FFC9B4BAB4CAFD05FF5409080FA9FFFFA9085BC2 +%B4B4CA0F0F08095AFFFF31080930FD07FF5A09080FA8FF30090837FD07FF +%85080F08FFFFA9080F085BFD04FF300F0837FD07FF85080F08FD04FFC9FD +%05B4C9FFFFFFC2B4BAB4FFFFFFBBB4B4BACAFD04FFC2B4BAB4CFFD04FFC3 +%B4B4BAC9FD05FF5B090F0EFD04FFA95BC2B4BACA310831095BFFFF310F08 +%5BFD07FF85090F08FFFF5B080F31FD07FF7F0F0831FFFFA931090F5BFD04 +%FF5B090F31FD07FF5B0F0931A9FD05FFC2BBB4BAB4C3FFFFC2BAB4BBCFFF +%FFC2B4BABAFD05FFC2BAB4BBCFFD04FFC9B4BAB4CAFD05FF5A0F080FA9FD +%05FFC2B4B4CA0F0F080F5AFFFF5B080F08AFFD06FF0E0F0831FFFF5A0908 +%0F85FD06FF31080F08FFFFAF080F085BFD04FF300F080F85FD06FF31080F +%08FD08FFC2B4BAB4CAFFC2B4BAB4FFFFFFBBBAB4BBCFFD04FFC9B4BAB4FD +%05FFC3B4B4BAC9FD05FF5B080F0FFD06FFC2B4BAC931090F085BFFFF850F +%0F0F0EAFFD04FF310F080F5BFFFFA9080F083185FD04FF5B08310931FFFF +%A90F080F5BFD04FFA90831093185FFFFFFA95B090F0831AFFFFFCFBBCAFF +%FFCFBAB4BAC9FFC2BAB4BACAFFFFC2B4BABAFD05FFC2BAB4BACAFD04FFC9 +%B4BAB4CFFD05FF5A090831A9FD05FFBBB4B4CA0F0F080954FFFFFF300908 +%0F08313031080F08090EFD04FF37080F080F305B300F080F080F08FFFFAF +%080F085BFD05FF37080F0809305B300F080F080F08FFFFCAB4B4B4BBBBBB +%B4BAB4CAFFC2B4BAB4CFFFFFBBB4B4BBFD05FFC3B4BAB4CFFD04FFC3BAB4 +%BAC9FD05FF5B080F0FFD06FFC2B4BAC937090F085BFD04FF310F0831090F +%08310F0F0EFD06FF3108310F0F080F090F0E310931FFFFA931080F5BFD06 +%FF37090F080F090F080F0F0F0831AFFFC2BAB4BAB4BAB4BAB4C1FFFFC2BA +%B4BACAFFFFC2B4BABBFD05FFC2BAB4BACAFD04FFCAB4BAB4CFFD05FF5A09 +%080FAFFD05FFBBB4B4CA090F080930FD05FF5B0F080F0809080F5AFD08FF +%5B080F0809080F5B5B080F0EFFFFAF0809085BFD07FF5B0809080F080F5A +%5B080908FFFFFFC3BAB4B4B4BAB4BBCAFFFFC2B4B4B4CFFFFFBBB4B4BAFD +%05FFC2B4B4B4CFFD04FFC3B4B4B4C9FD06FFA9A9A9FD07FFC9CFFFAFA9AF +%A9FD08FFA95B5B5BA9A9FD0BFF7F5B5B85A9FF370F0837FFFFA97F5B5B85 +%FD09FF7F5B5B85AFFF855B5B5BAFFD04FFCAC2C2C2CFFD04FFC9C2C2C3FF +%FFFFC9C2C2C2FD05FFC9C2C2C3FD05FFCFC2C2C2FD2CFF7F7F5A7FA9FD05 +%FF7E0F080954FD07FFA9FD1FFFCFFD0FFFCAFD39FF85080F090F31855B7F +%310F0F0F08AFFD72FF5B080F080F0809080F080F085BFD74FF85080F080F +%080F080F0885FD77FF7E5B3031305B7EFDFCFFFDFCFFFD52FFFF +%%EndData + +endstream endobj 22 0 obj <>stream +%AI12_CompressedDataxœì½ms%¹‘ú}"ú?ØÉáaW +”®ãFð’Ú±%̈́4ò®½×ÑA±93ôv“m6[ò쟹?æþ±›Ï“‰ªÎ9löËheï4¤éfTá%‘/O&þîß}ó‡/O_ÞýéúËpÒmž}ñw·»¿¾|¸»ÿՆäÍW¯^½{ûpÒ/~ÿËM?t¨uúU~a5ÿËõýۛ»Û_ñw'¿½Àó¿ØýpóöáæòvsqýZ*ýró‹_â·ßÞ<¼º–ßß\ÝݾøÓ«w×_ÞÝ_Þ~}ryóKiñìòAª¥çýô|èúyÕõ›o~Ë*—·¾|ûöæ_®ÑmÈìu{÷îöåÍí÷Û»ÿõ«Í—cØ|9å~3¤ÿÃÕåýÝíóïeó°íW×ß=<ÿú\VJÔ¶AöøoÒ¼KV-?è¯þôN¨ϯo_^¾ýáùõkþõ ûòú¹p̗×Ø.ÒØÛU§úðÝõó—wÂ…‹É:˜Ÿÿח7×÷òÅo7Ïß¾¹¼’á˜ÆçWïîï¯o¯~”¦çº¿“ ù§KÙÓý”Ÿ—úϯîÞühmÞ¿üîúõÍíÍ­<ž†ç2þ7W—¯nïžÿðã›®oŸßËT¼•O»~ùüõå^K†U&éùaóòä»·Ïþr÷ö ÚÍÝýó‡ý§Ë«w×Ï_¿Ûô9<'íå•Ì?[»º~yóêÕ¥´$Ûџz}ùöêÝ+¾QÎøåÿ|wy/ÏàŸ?\¾úNû0âÛM?ÏO¹¤©Síñ´™ÍSßSÿúS|ÀóÓóç;{…çç|üù9–VΛÇÏý¹¯´ÖWÚÅWM¯¼ÎùÃÏÇ¥™¯õ¯õ¯›¾Öwúڟ{ýîÕÃ͛W?>ÿúí+¬‰?–ú£>üÇæá?úSÿUùíw÷²ZÀ€oe©½}~©_–ï¹lž¾Ô®/½‘KÇåõó«2×úøµ¶~]–¦®ý¹­u£µnš.n¼Îµ Ç­vx§ÕïÊ;Ý5ÜYîå͟o@ÐÁx§¾ÓžÞ-Þç?ó£þúƒñc!?ûâÛse…ñ?½øö­ ÿ/ÈhÎo¯îpÀÿjóbÿP=xÎþÓó5ŸxXó·ÿí{WúÚ|{ÿîúÛߔƒˆ/òBÞ왎î°ß½áïò‹o^½“_þúþîݛ¯n¿»{öÅ/TÒú/×W"MÉñõróõŸþ‡ü òÒï.¯~øþú_®o®~¸½~¸ÙÊÐ +ÝëŠÌôæ—ïiXúýõF+ÏòGùû;üý”çÏ®¿ù£6 Ô¿ÿB…ÿÝ~ù߄·>üË뻗ï^ÉoÏoÿ|ýêîÍõFVïæ.ïß<¥‹o^]Þ^Þoø‹ÒCÛîæ+°™Ë~¸ùóæõ¥t*•~s#gÆ7—2¾OêA˜Ë5>Ä:ËÞ«ÐüêI]]>ü°ÙÊK¾|뭟⨓Y|'rîzÄø!Zÿ)ÍÿáÇ׺{uóöµ7ÞRüßO|SÖÛ¯oõ•ïß½ýaóíÝÝ+où·ïpX¼¹¹}{ýjõÖ"(ésSyåC`óüoÑÅîRDa“o„óêå?Ûï¿»¹>Øّ矴º®8U‡zýÛë¹¹|u°ÇýÇþæ:³5¸@xç&ðh?üåòáê‡Íonþt/Çìõ{v+&û»›Û—ò¢xwópíàc 8ýöúá_„A {›‘.šjógM{œ|ùåãM?m¶·m•_ßCD¸}µû×r’AH¦ë¿E/H›íKÊç]ó¿¾üoÜü݋­HžÿQÈë?ýª M VF+‘ÿ/eÂÿ¥ÅiQ’—Ü͋rڔ­”•³¦œwÒâE)‹Wkÿ M M%j‘1Àß©Ÿ¤$þ›2/Êi¿õ²ó²íϤ”ŸÎ¤Å³þœ´³þ¢-íðñõʟД±)q˜Pž}¡©)y˜¥èO›²Õòì‹ÿûðœ›Õ°˜×±™Ý:ÇR¤Å2Ïc3Û:»í,g)ø³›ó<73-ÿ•uÎˬo}¾õoÌöy;ëò_ýÓœóAf ñ ó‹¿1Øë‰%s¶Ój¦O­,çsŠ¿ÏYÎV³Yº œË:w(:Weæf›3™'™S+ÌÙÎÊ˹• ”²Íð9«9í9[£æ¸n¹g.8BG`â7Îüž3¾uoo9qõœb­°oô5„Æ0…r˜ÃVÊY¸iïÇ0ŽcӘÇy<·ãÙx>^Èp1Ä1N1Å9žÆmÜÅó(ûT^©—%;Nqš¦<ÍÓ鴝vÓÙt!‹BTØ4¦˜¦”Óœ¶i—Î҅,˜>yÌ1O9å9Ÿæm>ËçùBŽÌéæq–†æ<ÏóvÞÍçó…,Ÿþ4œŽ§ñt:ͧóéééVÊîôìôœKjO·q›¶y;˯¶ÛÝö|{!ËLF“ƒvã.îävóît·Ýívg» Yv='c<‹gә¼ÞY>›Ï¶g»³ó³‹óN¦'œçÓy:Ïçó¹tv¾;—Ur~~~¥q!ƒv/äc/äõ/N¥H§òèÅêç´ã´:í¼)gMÙ5e»(§M™K‘g龖ԔiQbSƦ„¦Èj”/-g«\¹k_þ¼ýs¶(;-2dø{۔Ӧ̋’›’š25Eúyô2.JhÊД¾)][t؟}aÐ~@ûgה­–²Uó¹œÅåܕY[ÎÔrvdF¤Å±‘f&–ã¿uíÕsTe¼æ՘ÚH.Æp9n«ÑZŽŒ×r\tLN­Ì,ÙJ²2±D+#K°"뎛ÑÎT=|+”ÓÎʟ-Ë©•™%[‘Í.›?í&+ÑÊȬ(O.g€ðÕfNÏ9[Î[æFæÓ±Úʟe#o]¾.¥jLy¡K%Ó¯´Ä…fz™´Œè•ù*ñRÛ+§•ë‚®M°È(.´È%ô¢yàïyUòªTUÿ5™.ۖq¯„½2(öGZlÿ쩎؝­ìçŸ,ÂZdî¼l½œ)óђ‹†)-¦U™žXªöÛ"-.~v Gý÷~ G +—†´8<±äEZ|ZÍ'ÿ9h+ø¤?Ÿ¯Åæxí}`Uú-Rü™•ÛŠ-¤ØF²éÞÅvbû^vµêée·{LÝ +ë½]dß²—ÛÝ»µ]]¬û{7¹Õa²Ý&QíR¡Ý­nÍxdŸÊ¿ÜRmc«½Yv珦bcimlۃ{s»°ÌíïÎbÃYïÖ¼°òU«P± Ú¯þóÂv÷ʸ°6ߕKËÕÚfyhß>¶›W{•»úÈï>|G?º«ÿöàçoñˆÐÛªWû +–J-û +V‘U:*ìç”HfS0'“IW¯.©$-¤’¡Q±v¢dQÅzö…(YP³TɂšÕQÅR%kG«“*ZÙ­`ŠT­¨Y[*Z™6,YT¶zn” êßgèBÈ¢j©²ukPu‹ +י)\[*\™ +T.°2Y;¦v]P—†â¥ª”¯Lå ê×Hõ«ç¶º  +¶£ +% jX’nQU4-QÑ•1QÇh:§Bv& +T2(ePË ˜¥1R5ƒrȺ:*h¦Ãoµ#Dù^¢”7၀?=¬ÊÙ!ë„T9Ne·Lõ e$oywõ)¬Øsõï–'·2å%á·ãžläœuÁK’Í‚k.x¤ì˜VfAYq»ƒ|îùâ€<ñ4®q”›|æ]íª¨–ÖBÖþYSçÒWÎ\ª½©´µ„EYÚüâªL‹"À’˜6ÆLkYNWe».fÑlËÙ^Ùÿs±_Êjٞäý2,á`)VÄý”éhq{²´˜V%?Zæ÷)VíÃeûÄBŽ/-îžXΞV¤Å}ê¡©|r‘ýî#ÿ8^?º%7u®µæDÑ2ZQ{j±¯&+Åþ:[1무¨ÖÚò§°Šº…Ê´~[të"õK±Úe}Ó<¥eòRlÍÙËlåÔËöÏ:ƒyicâUՏp˜;5|iá§Xð¤#Üèj9ϖö ã¼çž³à1ÆghK;Îcp–÷qiñQ>ò²âôr9×øhNÑìþ£|â‰\aŸ<²«/Å]ýAfۅáV»ÚRé(†,Fك"NÃx+ŒAÆ¹á8Žtg<‹ûø d9tԁ(²Â‰,g ÙâJ†3ùœîdu(H¡t*ã˧•á\ÆfR3\̐?éf~ö]ÍR9ÝÍ[aOgîtîDJ„Ä Çó(/Y:Q„ŸEœ?¥z'ìãÜ\ÑÝ©ìú +ÿpJÃ-=&ªs㞦ƒZ +&䪶Ê@g5ÜՐݝÖYT™®ku^ïȜ°Ñ/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïåO=ý?~Ws8 _MìI¿ä_Ó&w'£ìM +ˆÃPùϾø»O©»}{ Í“(5c·Éý‰èÓñ×ÙÚI?¥yDMÅx(-1ça”¤8د‡>Nó´•á$tq¬Ý}rKú>(µq’jlû Šf.ª;›ÇØ͌´N9F„ýàï¾i,œtÂiš×úL ÚÛMðY4û.&>˜…?kc¢[fí`>‹Ædúâ¼h,vÝܾÝçiðærH'9„Må˜æOÐus‡Ö¬½ü<ŸŸ?º`—µÐÎö¬â7 ó,óïo^¿¾~P¦ýK $ó?:ë¼0†9«ŒææKÆOžµ>[cs£¡&(bzœ ë O5ò¢jËÃí‚æ=Ô&g§<ÈÎÉဧÂÁ¥‡Ö)m[gЄŠ,žµíª§IgØKuyì$§Ž@‹`ý9ŽFm-·±±?Ð8¦ˆb•°6%C'(>Á +4FaÝíù8ö¢A^< w±v\úÉޛ¾uÄWWüNOïÆ?úi=—ü™Oä3ƒñA*ËÂGYL|™òä.H]QF’ÖNÖ`Gé*Xï,¹7YGÙP ×°@F˜ñ¬s·àŽæ15‡%3{f@ï«QøÉؔ'áRܓ^Áê¢Od8¢3ǝb¨‡£!ƒÔñ¸?ßs:7ÀM‡nª%Q½ÇÁ¥çH z¢(IgšFO)Oo©NËìQpº d]ek…bbU¾V »Êؔ² œ©ðLÈِ´E⥴)myûl!s¯¤n“¹± +„“rw‘¼e—-eo¬’Ù`;ŠŽçî(yˆg+yï(yŸC䒹WÉ;4’w2©{K©ûŒR·Â?«¼=6ò6dm—¶E*?£Ä]äí}‰;šÄM™Ûåí-enJÜά òfÐä,HwÚþ¿ÏýßKª’éŒ3³²¹ìΫó®ü«ýÛÐ-ð]ÔþÜ»Ù:8 ¾þÆ¨ T::8^MâÂ8wÐÀã H>Ù՘®ÿU·gýïéÂô~f0ê’'ŽNÕH]aÔÁLû“©'sܪ  ßw +xoÀÓuÿÕ}(Yï9.OΡcnÿ:ôïåñ´÷ Ýz­ñ½wƒ}kºßwî»Gw¬–û?µ¯ÿÝÒ¢ûk(Çxöpÿ„Q”ŸÆ•C£usvñÖß»Ã×Þq=&}〭#[G¹ÎÄÒ=±€Šn@E“D+<´C ªÇ äðÞR,8¥ÊžÉN&Šß°7!aé=ꤸR°`…ë]ïù›ò~@w5›XDˆS7¯AÌÉMÍK se¶Ò™¥Å5˜ùlf>¾>³Ö§å*••]Ì-Œ¹ó5{a¶ý8í`ë«W×ïÌ£«XV¶®ä‰Ge]ÏÁ`vÊåÕõYÖö¹ Ù®ñë:—"+[W{²?Që £<™¼]Ïu¤ê8ç.à>püÀ!gÖ:|a]»Ì†=³÷^€ÃÁ@‡%è~/èAÖá^èà +”8b?ÂÀúÒâ¡Pˆ´rpN+÷çñ€ˆ@4í᠈þ‘]tl|p'mwKÝKí~jv՞!ëd¡4À>2%ÈýÐú…{d¨ÿ]/,,Ò6¢p)Ø)â<ô1-”x©ÝX»>WƒjøÈӄT0ÝÉ8‹èœÍ ?º­Bí<Õn2ˆ¤•›÷ùè&ô Ò„%ÂB’œ +öpß'Qð‘ø¾6ÂK›ïˆ“<Ú7V»OnÉLA¹ ƒÜiþ’£8‡š¯&¡™tˆ­ù$Æés3Ч6õ¦›¯ï¯~¸yy} ãÿ[šڈړI$cDÈۄAÏ_+3FcëÀ”·¶Èړ›ò æ#²§6ö`eXE|i-Tñ´YÀžú$ÆnœNDp^LÃÇ6ðƒÿ$!ºÇÐÛ¿hŠ«ßÊéEzn%à6059±À·^|^ô-ƒ;C ):Qt½'¹vSCCKˆo«½Ôp^*ë0-°ÓC­º +YUëq›A¤Õ€º £\Šö¢6ƒ¹Ñb¶&iœËA¸P0–!\Ù­º¨æ˲¤úN8—ZŠ5a[ä;1Š EEóÁPæfΈÖl!“ö¢ÓhYÊfsÐb2D »Š.-¹;¼ ¢%K!SKð½Ô?ÉKörêe[‹´¸kJ… ,ÝB-Nµ_”Ðß³/Òè%.ÊþŸ¼*ó"Âf:Ý+»#åì‘âÎ-†8Û».\ТP Ÿ£ n®áÍÉœ·uÏöËؚ̺­¡Úؗ²՞°ˆÑុhì՟=[lÐYcuË^­Mö‹î™‡AG „δ¥žÚÊ>§] k9кm•Âª¶åš<ãZ,¾ì+ªú±OéǶy$´§hõ,v´Ló>ìh Ն֙ -҂¦~ëÙ½ÖgfðK(nW óÙmhôWӆö˜Ïºz­çÆ~¶cÀ5lÚ熑tµ¨)KõDU¦"…ŠçZõ“ŠªH Šâ„÷3.p?-âgÞÃû,¼Ø ¾Ç‘=¦@.±ÎÉÀ–a3¥–ä&Ûh²¼€ˆLßÓ_A4dgÆÜe@ˆ†„¨ÄTC44Dµ:›DŽ*A"¦¯(CU¶·¥øԌÀ%l¤ ™Lñ0¥y©-•˜Ýþ@¸à±€Áf² YÏ4¶¹U… ×2 +!ö@âý?û‘}ÇbÉ€ÿÝ\•ó)ïÌS“—–€ÃŠ!vY´B‡DúÍLa?ê«%ÉíFkÇG<þ6†?ÞÞ^¾¾~¹ùÞH›ö†ÔÖès(St¥ÉÂÔý×$%̀ܮá¶Ë K ­Âpº€×0:9¸vÞskVcɸ§`•·/É ê7¬¿bˬXgnþxjƇG Ã²þü«>è­·öÖ5áB;7×ó…™köÒ7<’¥â0ÜYƺÎÄ2ŸÓO“'æ3e‰9ÎQ³ÄüäÙm~~ëå[/œaL±C²ö!©—ú}¢ÉýDíZþq˜q~†¶ÀE5G=Iµññ“ym×æ¶BGÎü5¿ iˆý¾#&ž2s_ƒ ‚EfšUÏeÿªY'sÇ*üMsØÉ8üm ŸL4Kž5Yë +ü­ԜuÉB XP€MϾphÓÖd ¦E0A4“Ì2˜ 5̜Ï0á󌂜S~F3Ԕð‚ÉT¨¢TU=¥ü1eŒjYQҊҶt6Öx™E€šörYd {%,ã‘—Å”ÑZ¦'•t¼Ðw}¸ä+ þ´r@›Ü/äñËÏ-«ÑHE~›œ«¨Ô6PrH‹¬™áh‰2‚«t–‘½JJ¹di Í“h ž ziN¸¬`Ko®-KxÓ2¸Éy–{áM +²œÜ8,üHxÔ¶ r2Îd¡NQáÃ"à)zÐS)Ŭ¡¤Ec5ex«¥˜VªÙ¥FÑT3M¿.D<Õ”ñH‰{…ÜQZœŽ–þ•#¥­²aW>¤ìY–EZ|O-OnñɤÅÏüçÿŒá(ÐIÎ-"R 9Uç”'~›Lç(ÙwÁOL׎²£–¡(ͽ -ïÂAûq‘wW]M¾Ýº™s”ÂS +lû@ÈäA®RøJbZHå.§ ΢6ø5o©üe0‹Nå2ÑLŸrZ7œ¦ü©ËuÉgà¡5Lªp•£\ç÷Ž”Z£s¤÷ñ'/Òâ#¿ýˆò8×û¨òs‹­?0.êÉmq B{v–´°™eˆ99ƒIKMbË6Ê‹Ö µ«¹©8Ü'³j®¢’ÃÆKˆÒ)mZ.?4N·Îõ ÊOÁ–™9¦ñì ºÓ„ÖS»úkbt¤GÃa€í¨O~\å]ÁèQy“pý³³¸9xz;s¤k){¾Ìia`Å-VÔ¶˜°÷¢Ñ¬ZͩՆ–úËZºmþýì@ÙÏY£žéîÑ2X¾ô§•ñ)ÅpÊï/ÓS‹´øäºÿ–ZlÌdg{鄷²|Óy”-ˆ\ºg–7mb¾´Ž™Ò¶4yM4wõ–m+ëMk0rÁÄóÜip¥©MãΘýL£bÉzFW™§—Ω„ð‰DQâž’Zz\ÚÓK×h„g_˜›«¸¸Š{+XTBïN­³&6á´ÉmVÝXta 9Ζ®«â¸ªN«ê²jV¡:«,³e ³åÚMµvRqO=ûbå :æžZ8§sLI‹GS‡œROpCiØSËî)Åîéx9fÐÚ+ÌçùYËÿ-þÌQ~æ(?s”Ÿ9ÊçkñgŽò3Gù™£üÌQ>_‹ 7û£—~ü/é½OØû™ÎôqNŒ€Š² +AI)ª3¾ï¾wàüçtȑÿY›->}„ƒõaû“N¸Ý³¿ú•?!ÝÊo¦þ‰&6a<™ú&ÝÖ#UV-$i8ÓfèNÂ0§C-¬«ÔR:Fh韎GŽààBƒGðŒoç+öÙ +ˆ}´”Óîôl¯ì>¬xKkÀ5þ<æùÙóRyÌ|…Æt?s`üþ^y?Þ¨±`¶·¦#×ÞóÙÞñ¹*³-µ)›vž˜±Ú×l…øì,gm1ã^çvã´`7<‘߸d—ùíNMŠššf)7 –šôJŸ¥Î’ †)+“J!ö™l«™ï.}`n».Žs7øÇ(ÓçkÓb£c7ôlN2mž}@L»~ ÏjHÖ 8g4мÐÇ5`½–¯ùüãóé¬ó0ã> +6{nÎ÷e9dÖ`›¼—`Ó'€EÓXôÌuÖ5!ƒWÀ>ÚÃá¯9 ¡]|—]ufø돀Ž¾Ì~\*~‚À ö"=XØÆ{zøP沏²Ï{rL\rõoþ:ÐÆpp?„õ~0`Ý°ÊûÛf ӃåÜsýÖL¿±¹žO³n™ÒÈ2û6ñ‘5Ÿïäy|O-îÑ×5lÓ=PñŒTB“A–fºÜ¶¯}nPƒ +_ +M$6Üp"LLo ÿ¢ªÏ-‚:2Ò×Æ·¶yux¾£uÆ£6çÑ@dAG¼AÉ{Ôf>jp,ûс¿Y¥àä€ó!ÆGöäÓ!ÆVþ‡& Ymy\O3y°ëþ#ô}`}Tø۔§6ojÛá‡<õÉ»0ކy‚Õ³–ümÆîŸ5±­,‡½ áÒ[¡+ëõgÎ Ü5€˜úty^þ”gù9wæòÜc[srÛKÞϑ;T$Ûú+>Ó +Íš6"u^êP‚©þ@‚)K.E¨ª<%ºóYbIýð[Ôú€$TGz¶`K§˜+»Ú©Äv–ÈÀ¡FzßµŸx°·á‘”WÞce…Ò÷2q°•Õ9Kôù¢ytVr΋­f^h¶½ŒçóÕNò&ƒô‹ «fšBƒ´#(ŒŸAØ%Lž³¬¶(«Y9pÙÔVÖbÞd_0²ð”—Hauø¦‡%¸']ûÞ »a`}¿Àøoºïf¯5™Sý¾-(·cpÉ2ÀX–e6ÕÞ$™ÐÂû[¾Ãâ+†XùÀ] ðÚ5·eZ¸DÑP¡˜ü{Óªë°Î&gm\dÛ¨ïxŒ«¯ùz…Lë\´°Å +P¬@ÄýpÔlyc ¢Zex&xêÈù÷N£df ‰Š„Bí +„=ìtN€ÓH8 L,‚’fB!ôÇß®½ïûÓnûÖ ‚ ‰ýè+‚ËíÛ?¿Ý'¾ÝBd? ´<ôÝLËÃÔu#DÉÙ3!2MÄíÿ£&ÑË"¶WF|ævMd» ÊâÔ÷Lð'£(#Lq4©e'à*áÀ?¼Íi8™Eoßõ³¶kÆ¢O3þ—6ûןϩ°j×ƵCî_|¶0~[ì»0sŠº)ë÷ó +‰ÿ8¬&|¦?U…jãÚÀdXHƔ햅 Þ°PX'îW¸°4K`àšž\Ós;>ƒp@"Žé´¦_\0Úuí…~µO{±OsQšìmÑ6W¤­.G[^ŒÖÂꗗ¢5×£-²{>~±ãÓ +îmýÀ;¶ÞWþZtá¦Ç^FšÁ(S …D‹h¸õeÉÿӕïì ×Xy=ê!Z:2Oû?Z +¾bºÙñ¹0Äô@£Íè)󈛖C§l4¯Ug Éšl(Ùõ²¥±«¡a–Ü8‚ÖéæÖWØ3•Ùá–‘œCeúØÂKÀ>kùð}Ôìz%ë`¹$CoŠ-©,“ýnè%:LÑÁS°ôØ´ ÓÛÿâï6 }פ£ocžCðQ~nñ©OÔ{m:ٞ;Qp­3.tîxó–×7C.(B"„<ipäµÌ/d†ØJ +í9&6r K‚gO9µ[ÊÊåΗÀÀr=}¹Í¢Þ‚Ñ^–Ü^%?ï-OÊÛ_ŽüދÚ_’|ô²õ¾týof™èåz¹y¤Í§…ÄeËM¡™)<+Åã·™«ßݺµ0¼o›¼WÅð^r_µ¦÷>w›: çn„?³l¦[3ƟzN¬b–Ïfœ/š”¯¼ñ©-ã^ GÊp¸ðv›C¥ÿØÂkÚ?kùðèQݭâ¸,ú=øGdφØfB„9,² Öë ž’ÿp™‘¹Ýd?sþõéOjñ°b1QELQ¡ýzYö”œU®í)WÕ&W¥„Ÿ—áådÓãzò¨X¤©‡w0ßRK–ýq¤L8P âBÔ0ʇ;Ëô˜ \μŽ–Í¶C“Ãr»aGÀøNTN•ÕZ¨Râ–yUB¤lh!$AȐ÷ åRA¼æ¾·} éß|‹KÕξ Yï$ Žojÿ[•È‚} +~G×RM©ÎE5¯Õ´Pq­4*Î'ŽÏޟ¿R‹+Çî/µBm}ÿÚ·õµm­äêÑÞ`R’gS°¶+l«_BØ\#84¸zõEöû[·–=±¸3[‡æc.Íý–5ƒ¥^?1»»j™‘mÇI-U¸È×‘ú·ÿê‚ô'µxDå8RLQa6ƒeÙWr–JP£ º€BZô '¬l- L½Vâ¼ÉÓyN˜Ç²Âsã¶NÜiq±ç®¹Ôs ã3žêež§–¹®X˳•g:w´÷t=FyeXÄ +ó¯/Hÿ$->ª’Àåñ!™Z¼úâ6{W¥JÒù•ÂÕªbUA+Yª7™¿"ÕˤÅÙ/x(W<ì>Œ¥£\òP¡Œ“ù,ÌK!¢µA÷îÓ¿¸K{w~vM—„Qö&Ü W9®øa)ˆÑ¿Wå¡éкnz(摸Œ|$.°¶™W1ë+*öÞùx4àñ…}œ¿.–÷£<û©\ûñMó´³àIW1ºº—S +,hh tÓ<Ûú7îìa}Añz}rc?ITá?\ßüÿïØüáꇿ\Þÿ ¶ÍŠò׺”fߤ÷‘×Ò<ûb/mqI‚^’· ‹ÏüNÌeô’¨xG€Ù¹%)¤þ2’àø% í Û&zàS"$v͵ +Œ $û‘1V!þ*ݵ55h>-.åÀ噲L Ñ\î±N rv8ÍēÖÄÇ\¨Ô}®+•Úk |E,"œèÁlWD{×nYMôG×Äû¡/Ó ›¹›žäO‰Z¯Ž³&néƒãšµÒ¬»¨àp²ÿEZ‘Ï'‘¹ü¯Øâ!§Ú¡›àӒãI‹ûï€ær0•õ2‘µE`=ûâc°’FaÕ,Ye…e®­Z=hïgrªËFY&‘9?œFæ'»Sëc¬‡oÕbÚì'Û¿XЋ%ÅßYMò'ã­Æ&úó4gOJô·Lóg±["ó|Rô–FOj—Ñ[²Ê>:~‹ˆ] 4&C꣋½u±Jö“§úyMü¼&~^?¯‰G×Ä2-ØdÌÚÏÿõáÿ¤æ-¡¼øÝÝí7÷7·7·ßùe«º·¿yöÅïÞðwA÷ÍåÃÃõý­hõ§¯~|ûöÚ¼ýk3Ï'ó4ÌpÓ6Ã8žt2;›¡ŸNdqMúƧú×?þ¿ÓŠõԟÿ“üûõ/2›ßnþé¿w›—ÏøÔïQ¡ôTÞ¼u¯¿Íoäò^¿i›8H\6p‹ÿ ¢$Ø@ÉwÒÐ&Î'“Èda 'h-&\Qð[¼Ô˜æ¸‘öòˆÛ c¹`4°0$N> +#÷e"ü #òI'úÞf”¡f)y“iV@®í9ú Ó'û˜QXό—™#Þ3?—™ Øøà^˜ï­ˆ.š7Ò)Ft£ÎÛO„­•y ý‰ü kn’ñíåÛäyQW¦Í4ÊFyéq™çÍ$aŠõ9Y}ý0m҄ÀøÌ¡n=ã19Ä {5ˆ´‘ÁKÂÓëê°'¤1ÄVoB'Ÿ4ËÈ£Lø¼Áàb–Å)çƒÍœ¼ØÉÔÉHÈZ„WLVº“n²<e¨‚,<®î4èÔçd¦EãOŒrOV£ÔÏSÄæé"VùzÏñ¹ïtŸéì瓟ב± Âdy½^RG]`A–§ã#r('!ÈnœdY‚͝¬7QN›j£ö\*ëϞ+ÔáDô`™;o¨?e4ýÁž+¯åÕʋ{C«ï«Ÿþïÿˆÿþñΐ¯Þ¾øí¥û»7?¾¸ûŽgʯïïÞ½±Cäð#¿¿~s}ùpýò…t²>mæÍ/~¹ùÇ8rðÈJ‰SGX•H'3ݶ0µÀGØTb{â$½¯ÞNœ1Ÿߒ±Á>m-W*ÒCÀã+«&ä6Âç¦,\¸îËȵ,r£ŽX/ g˜uÁês²Mµ¡¨Í;a¶ú\¡öÝl8؃PúÉ(Âåpo(úè·¨( Z+vYßÍ)sV¹@Ÿ,Tá@ÜþÕüpÞìÍ'µ'҄W 2¾Ât^/©"¹€¥õÂ0G£ Këq&Éü؏öȓ=Õ:Ê ìËq‚õUGœÔ^&6£¯ÒN§»Ø;ëš]]ßÈk•wövVŸ¶Þ«E‚pcÀ÷:9J轒s­Ÿ,¥vÇ°Yáòy”3ޖà g­ ¯0Üähì{{`p9\…]u#Æ +ãÆÃßɱ$GÞ¸ë ;턋ã@ä©¦Ö Ÿåg3rg9 e«Ï¢Flf9/Dü°çpXYˆœž‚½¼Ì,’è.B^!ËÎ<åôªhWzêdù†B‘œnXAúYTXKÆòœPÇAz—CXö'ÚE©›ÇÏ­FeÿÂ¦é¤ é;vÒÃë%Žã[>8Ž\lXFƒ0C\Y^~¾òÁM±VÉ@ØDÓH!X_öX¡ÊlË0l¼„A§Ú[!ØsúJµVygogõiëÅ×oNß|æ×Ca=Q0²¬Ô(3&3-Kõ¤Ï<2–48èÄÁ ÆâÊ'µš æ‰ÈÛ)ëΞ+Ôt}S¹;ÊR¨ýÁž³·òZåµ½Õ×5ƒhz›âgØý,œ˜r+ÈÃ:P80÷“Ì’ˆj½ð|9†ù†}°…… %Ù¥²§gl[²èf`Q&_V¾Ð'6™l‰©“ÍÒg¸¿EH.hÝTkÉV"¡ F¨=Œ*âτyè!Ÿ’íöœT9áøÖìç@=$ùɈØ>åâQg‚q¥ ² GÔÉ"ZÃüÂjƁíÂW³A󳧕¢Ê‰,"{n*Êk¦8Ž< ©5Ñ>æ>–G ™¬%Ȃ„ÆOÀFŽ2U²;€CÀ'ô˜«ò²×´©$™ä“0âX’ÅÙÉq"³ †c³OÍ0 ÌÕÀŠ¦æ –'ÒĊ ›]V^ƒÝܜ³\}MÀ3`°;h ӐFèZrœ'ÙjàѹëË~’ŸÆI^Q”â š…¼ªŒ¤ðÔÍÜé ¬ëþ±]„+¶GW©HE• 1S>iwKÊ!ÈÜ{áçH•S)¾Vƌ©©„©oÚr‚õiO:Y†#ˆ’Ö´%âì$Û¨éÔ(ö¨¿WôðÆÖ_Z£Ÿ9L ¼‹ƒIý˜ç±¸ YÔl‘ã1°¬…9.("æåÁ§ÆÉØk9nšÆdƒôøUíÕ(öh8„Õ·å@Ú¬iÌ)Ë^ì¯çù'¬¿µÙ7#Q“C–ž_/©MˆØuA‡{Äëˆ(ыº°, Á¹²ÕjSÖö†œ`ý]•Å§Ô ë loh°¯òþŒ`»¾¼–W+/^Zß{$½O2pA í`ªj Zà~¢P¸= ÊEî´´úQ¤7Qá–-H¶"€ÍnÐRõCVS1hA̕õ6. Zhma"0ƒx)û+­ž–á! ‹Ù)xb1iÉçŸÀ´î&-y¡…E«FH€¹X´À~à cP,Z䌘ù…E‹Œö+3háPé¦ivƒV©ÐسÀQÇ'¥½·º0ñônÏêÙ yž–ö,PS–¡Ø³\v(ö,l;€–ö,°fœ´dgÁ ïö,ì4¨' s–lȈY)Ö,a yâI@c–üF¼skË£]5fI!¾œ;qv56µâÄ'Çcã C–€(¬¾Ñ`cuïsi>>¨x"I¦êf(ÝsK–:0ԌEKðêŸá¾@ê`g l Ù}8æ ¤ÜÇ¡qÂ7Ê@»?°§ÀRÉüTÝ¡Ô¸?’«œ[Cã1,El¨A9òô»ŠK°Ç™+“V‚´hÄޝ‰ô +âóÕïS܂Pþç˽81ŒÝèL±x©-ÍøÎâ_øˆ1îÞ*ÒR9·Šsp  '÷Õ;È'#(Å=Ãn]FÅ=ˆör’&Ü? )õ÷Ê (^±#¹‹p dÊ;¹p»ìéý3'!Œ\¦K/!LOQÝMu”AßìoÓãŽBTá6{½"g9ÆX(Î9XKøMîÄsÊÒ]ØT¤7°iÊ~¶[—!؂H´sõB7¦uÙûsÊÒkØTô—÷ÆÖ_yÀq(s-oÐǕçF.B÷Ñ ½œÃ©¯®¼BXºk5ó 6-9ź\:1Óvm ºM?4]aé=¬Õüå½¥õWþ‘º„é™ß.ÀY8ÎM*‹ø½h8r;óÉA…ŠL³7)ÂIq V[œë4AÝž?¼#֊ð R·‰8¿£1´>‚1û£1—GåÔb¯òh`"‚‰BÃÞ§îëS,s±kî†Ü롄¶`‡xî± ØB…bzNV¥·VƔ¡;Ö¶*¥kØP%ˇP˜«Â*†~lz-”«2©|»Z¯|€·µ÷¥ï‘‡>‹‹Þ%.‰¥ödî⤆_¡a×.^ê^„'$VnjÚ¬ùhq@ƒ¯è²sJˆí"sòXYñTq,ëÓ<ÕNYzªkÅ⁸+BK ©Ye•Œi­og^mº–ÃtÜ]=@”ÆůWdÞÃTÖ~Æ/²–NëZ¯ø£k[•b.×<‹i"ðÆ dӞW:-„¥ïº©çàm­¿ô's_ƒ£ ÛÈ+ÍÓÉEót[dÑ<±LhÂYhž`/¢3 ®yB?™svͶ ݪ§‹êé¶À¢SÂ*ž`]¨žÐ'»FA…m ²(žåç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgiÄÛyE¾¢uîèËդƑ¥ÖYÉEU¤ˆöÇ¢Lâtè/µNڙ ßԊ}á—Þ˜SZ`C6u±6VTÊÚëB÷¬¯W+ú—ycëo=î ÿ$Óü q+8üÕ¯Wdp$zÇâԜT#Ánë ö8Åíó´³6!ÀXsŠõêŒÅÈ3Ì +cÑÆäÔ675½Š[÷͹êý¼±õ·þ„¾ñxT=찃U edN2ÊC q} û! /Ø}J[G™­"«…^3Øù‡^y«ˆ+‡:wPÍà…à–îitÈƟ)Žp5ûÄÑ'J:™¸^tå}{ꪍq œ¹×9“/V{‚¨IM3lÂ}htÆˈ•u3B@"/ôðåÒ)—I}ŒDôýöp³;>TôC9K½÷¡ Æ¡W§¹’Eöù”Œ+‚*Êd걃Dµçgà”Êښ°¹²B`'\?£ÄàÞƶų̈Ð(yñ4Íꮣ]–¼aÏÕ)×®áÛǵPx»¬Ó +“l¯F·äþŠØWØ`-‘‡Æ4èw%+–Qk‰ŒOBPµàiª[3AGM½֌¶©B°.íÁB †®- z¶Ö‡æ°mÞÌëùÛ{[ëÏü É!Ü@ AjI'@8ýØ+’!—‰ù"!žtCqÁ`}å Æ^o¨ºÂ:¿`W„R:Q¾ìq+­¶&átÇ"WìTŠ†ØEÝhdHx‡°pkÅ4 ä¬]p…*†c^ȐiE§TLV¨ +½N‘TeÈJN¡È©æ瓆NèÔM 0̼´“k`hÔ÷ÊûÊ?´ÓÜÙ§ŠóŒ´ «±ÇŒ•ò=ìL›[¥ |‰ï E@?u¶©†D§¦ƒo¹SCUð^¹Ú;à΃i‹ šQ§D74xlPû$Í©þ¤2—ԟм٠ŽíS–´©MɎ¨:/Me#¥Ñ¬ý4( "X-VloJ ‹× Iõ”f@_äƒ-Öýe¿Ïm°<ÛÃ'Ñj÷zE–ã'Óì"rÌÍøFy#¿²PlsȀ'0ÖZQβØ6e?‡ÖNXˆ7®õ›¦¢`º«ýÅôóŠþòÞØú+¯ ¬_úß°òy”½^‘g5¡~CÏ qÀ²œ…ç9Ž¢’šŠ²y‡¸hÌ)Ö«?jä¤pm î]Zk¯…b–׫ý¼±õ·6ã Ó3GœË¢N‹ùzIÆ;)w­še0¡°¦L‡œtÄ/Ôz#Ò †¦-§”NíQ'CT¢ë 4@¤˜Ò§ýlœ£¼Z©U?ª4´÷™u`ó/sª§P<Ä y„䬸DÞÔ¼DÉVف¬¡PŒÁnc}!º6LSm¬¡X¯ö¨“ˆ‚yÓ4·Dˆm¯F¹*/l¯çý¬±ýomÆ!À%=(ZKôŸâÚs2lzáÁ!»iˆ„•Qº +Z¤¿©R®Šôã4µ çÈMcN)½º0ad3ŒÔƄ«2†Ë;5‚9-Ê˕jõ³JK{ú“ ՍÃ$ȑ¿»ã<›˜w¶ ÝqLMŽ¬w‡Õ#dwÀ;Tº¤ñlzL´xä}¡h Ÿ bÞ! B–rÌ;ÆL=¯ôŽº!ºÉ@ï4·ŒÓXQõW`ï`ºa^ÃÞñ}d9ŒkˆWÇ?¨Ð-¡ïІ‚*A +4ç©x­ãѝrå㏓¡©hÐö¦­B)ºBeä|PYmKú¥ÀÒi¡¸üÇÐÖóÏ*M­¿ó¸êÿYpðtÏ Žw­dEÈ9–˜¬¥¹"ӝbC°7 ä^›r‚uiO:Yþ© ›¦­dæèÚijÍÖþr^Ï_ßÛZgÃí`<!ÈZ5·Hœ,r—<ŠPK@”ð °1öæóìpá«Sl›Ã§¾©`-ÏM[…Pút–E*Lz³Õ–°¶Æ¹í²PL,ïæýý½±½ý mµÆÆ"Â|@aŽÆʀݟÅ@Yj¢LKpݏàiNÃPÃœb¢‘ÆÔzù‰Ý ò…2÷ ÕÉÈ䶐©=F€r§ê5$&[t€«_U‘þÇDP +­” æ ÔÉ"uCÎ5J % 7¡…àë…èþZÍš–œb]ړNî‹>]Ú(lhÃœb–w«ýý½±õ‡6JCAÏÇ6öEZÀýNöìúpJl#d*2‚ ¼1Hì°Ô^b¸¿©hMcNYöêd=oÌ?aý­Í8$=–R݄^ÉÂ܀uqP¾ÈÀ'ç¼ïçYù׊% 6V)ÖëUY‚FîÍVSëìój¯F1à¯çýJc{ßú¡ù³„ ,!q%nÀq8à8XBâ•àìÀÞ­Tk¾JZf; Ÿ¢¬™ª„ YPèëÀº 1å^R™ã4ع>Rˆ/SíØ÷z¹À€½­J±NÝ[mäÃE¿©mÁÌ;ĶO£\åÙ^Î+úx[ë/ýÉ),1¢‰ +¼œÅõeÄQÏ3¸ Dϙ6PF²ê_äÄö³}—ȉIäu¯„ˆ•œšV +ÁúrÍ_©²½GºîK;IÃÓko©÷w2ª¿´µ³þ²Ö÷;¨n=#È]žN•!ë&uÖR㚱zƒz€©‚±ÝYc¯,EVEBr‚õgÏ*– x•7„ ¡Ýû3‚;‹õµ¼ZyñÒÐúû~ª ɹ3½eÂU’¯WdȆ“ ðQAåé•>º Ó|¡8‡›­¼^ƒ0·m‚õéüM©I1îMKÙ¢øk—¹ÉuÒ¼›Wô÷÷ÆÖú™Dõ€QàØa•}½$â76Ô½±ŸüC}  gp‚ɪðð±©Ö©+¯i©PJ—ö¤“~Φ¶EkQÈMŸ…b–w«ý³¼±õ‡þT2xêdI}zGºTê`È x—Ãî5.PY/$…`*aÀ­h©­‡m×Ïm[N±>]›42œ5€jÔƐÀ¶ÏM§F°'ýå¼^yojõ™?Í¥¡§£Þ$âCÊÄv2ÌZQ…45)"×’(㌠3sОÙ•Ç¶bgƦژS¬WÔȃ2‹Ú˜PD;›^ ÅçB_¯VôOðÆÖßúÙa`–‚:ü~ÿzIÍ%5ÄdFKIjPƵ•bÂÈX²-zEΐ ªiÌ)Ö©Û{”,CÇüxµ±¡Ó©Úk¡\•÷Õ׫í j[«­#ø9#äÞøöý›¹¤v[@»q#Ъ »å³»Ôç +ìgõם«’+ªȎH ԝ094»¶˜nÙÂ4R…t#k'pƎ螐ƒïЙ.{¬xnkéT.pnxGˆ¾[ ¹aï +~ ¢ÝH\f¨Xîd>ÎÊ-ýiDCArO¦£8{îv’ǝ€V s…q§Y6uÅMILoâ†)ÙPcâîhÙW71@°X.AÜ åe£¯Âeó‚áޛù=›g† œx¸Á]©fTGÂ͔\6âéÃ~;Á=ãS¡&yÅléNÙP%´PêJ5ÈumÈPÙµ¿½]_«Tó·†ö¾ï= OC¨ˆ2:Ø°€n;¹@·gdёŸ r>þÜ·áá7*¸maðrnÆ +Ûf> ²ÆŸ ™‚ÚŽ³væXlì ä²-[~fhT¡$l`ØçZcµCKê*@»[!³» +ÉZ€«‚È î¬ñØÐÞ+{°7)käÃ2©²v1FÅö"Òña¬ ìÑZY@° ÁAB´ñuì50ß%ô+5sE^£ÎK^cÅ1šx¼NÙ؁á®1@´$Ø5SǸB] ó‰=3è†kV+˜ëœŒ°€\÷Ì?µª@®ëâ,ëýåºÇÀ»FL×q]©†’f2©\Š™l¶Æ +¦ÔçÕOÐMµJh¡Ï•jéڐ¡¨k-ÚÚßʈõµ­½¯«ßC_Œq´®Ô6«ºƒ§ԐÖkrYS!Ör>Om3NX¬ µ@¢KCŽš¶î–àj{§B¬/mÍì}[ýìÀxìâüzA-PhlA\þéhé0Z²Ìª¶¹>7µpðAôòv +ao®TÃA—v (흵pj¥RÉ¿¤4²þ´úÕH¿Åd (u¥øÚ·°i€~b ˜V"Z ¦WÕ«SrB g®Tƒ=׆ ]ûkÔõµJ5ñÒÐúûê§Ã?ý<]ˆí,ûEóp@4Œc̯ºN ãÓÐX¯&¢P ¶æJ5¨³7d`hﮅLûK•JåKJ#«/;æàƒ‡`.ñ¤²’ ¾=岂””s<§<®•p±÷SªÔŒlÝÌ o-9amtjÁ@zC&éý-à”õ½ +¹¾{ijÿ#æ“²~}‘qóü«Û‡7àà¯Ë?½ºÖ÷ùÍÝՋÿ|ý£õ»Íóß__º8çìæõ‹o®ï¯®oš,~l:úïÙù‡›—?”.Ž½×7÷×¾¹þ‹¼Ö«·ÇG¦yyÿ›ë·íË­þ›ëï^È\ÜßÝ>¼·ö·woö*¸÷D£zô;ÿþúæûžú¡¿¿ûËÛ£3{þLïv:¿}i?;xÙÓºùó5®zâßTó-‹8ß0« +‘g:eU¹¦%ë_‹›ž nþ¡7>•.K¿µèW/lr²¿àoÚ6S—MüUï|¢\ÎÙQG\¤-'÷C§—wåòîq™<'jÌ6rGŽž}T„µ k<;@ùf·¯‘À/%ÁÑZP>rŠ j€7pOl>Óð l¹&T¬JB½†WËQ!« ztï„ä0=Êñ.ª="Óù½ ¦JzwºÙ®ç`8Ž¦†!Ó'‚ l|¬#uŒPÉÑzŒ:%äf%„¡~Þ4@‘‹¶fðv=)ƒÀç!ç²~›œês Ìi1sfEJæÙ úóÄ<Ð"ÍÊ·µäqêõÁ0ÎJ‰œ•ˆœÚ„±Ñ`Ø<ѲP9< ÐSÀzÑÂã’*›ã8•ÙCJúÔ÷¼„-j°;¾ÉC¨|Q Çoeˆ]ˆEä óZ#»×¤fQ­ï‚t¦®YâDÓJÁC%¦Éâψ '%ÍÄI%³š€gë5uSûº·I?£ïl¦Þ ²C0I± .¸ê£#5á÷æfJŸ˜Û‚Êl½Î”éöÈ[SPU‹¸ÂêMC’ÚÐ;FÏë@è„ $}¹‘F«„ì°t“ÅÑÁÌÆèh·+«¨Ït†CÎHšGÌN³‚‚r£ç‚¨÷”ÛtAZ[`1JÔ¹5³mR&Y` +Cg#«å>«P'Š¨‚ƒqÍ#)1øUæ*¸BéaBìWàÚ%u ¾÷DbñO°vîüÉÙfx?¦ö ˆb†;udf?ù°öuòØÂNwù 1‰ê¸u¿XƒŠÃšçÂÀ”Ï)Ú:¼rDj¥Èq“þ<º[^Î1a<áɜåíæÑR à;r$ +3Îe +™)£„ÞÀÂ̅¤§™éV,̬`jǓÔ.ðN2.˜ú–¡÷¶õ–¼„©oÂÈ8h &Å4%i–í§ÙGf‚é=£‘&rêÐ ~)3ü .p9A¨.€ØǍõŠÝѼ’µ "Ù@z#³c‹óˆTĦN÷3 Ϝ5ÑØ$~ž|L:ˁj°ÇD¹˜›Ç2°6½7|Uæ€ç‚F0£˜â j4 ‘)*:#!´=ÍÊÃíózí/%]¡4 Í=oñ€\¡õùæÐyOP±ù&`"™ÌÏ4!ðå¡!ÚǺ4²1挔Þx(£RÈ .€v=*‰Æ` K]Ɍ)뛁ʚ"`ÚqCiáJƒf/€NêÕI‹Ci¾Èr^a\®Ì T½âNû7zéHÄíHÀű•Û§”™I>åYÐØlx gŽž²l…0Ï5\ÊNMù[#4a]‡¨€k{Æ^JÌH ¾('µrÌs–éÉ8‘guïei¶+&$ô›1$ÌNjgu²ÅÓÓoO³ó¹S”UŽ²J‘8ãÜ[jй –ñ«˜F¤2NÔ)(sqbζ&ÀÔHÀ‘„Öéæ³&&£Ž¼»n6‡ +­˜Å‡Émõµõ¶'¤²qJ?NV—I¯Ø˜q o㨎š>k¶ñiª÷ Dý¬;uËðŒKÆ/ö$È=+#e£ÂøpOo“Õ`àE©€èòô˜j×h‚Ù¼]r=}bâ2RÉ/Hèð՛<·X¯üڞ¦—qe;-ák鈽Ch§Ê&|*᪨zî–j¸ç{1Z""¤Žv+,]ylJ8Kf}¢ä!Á‹6YBþcÀyœÄÔé +DB=N:ðèægYñŸêýè…üœ’¶Ejb¼0bˆÓTùH3ØÊ { 5}`8’_‹³ƒÎ¸¡ù9ë ºH+zEÄm‘Qí ±‘WNÈfUË‘aTž½fÐú°ðÕ<Ñ0;f½V&w2¨x®óË_Øɶa£¤ÏQÓ¹*ŸÃ,…QÏJûgÐC„hù"|Ï tU^OºÆÙ9ZŠ¦ kWD0¥68d˜5'Ö®ˆùíؗäTL¥©.T2¹‘¡¼­ƒïöœœ}\êÁЧH¾…À<ޒ²q†^M±WnXHä*]š51×ôFK4«tÏCµS•Ç# ÇS„Ÿðbâÿg}'NêôóŒÍõºxP¨9˜‚<ÆkÓ±aŽœƒ³9Ä@Ì£ž¡½VÉÞ231\]xA{“ýÍSЫ‰ 1â#[Ê%nsheI^%‹·½pǀOàäT˜çcI†ŒpS{oZ„Ž6ÕÌßǝ† Õ^ Ìç(@yþ܌5–«‚@@&ŽN¯93r_ƒ=J£79-vúº0ââ}É9fMDȌ6àÕàS:˜"rNHAF/c§­ £á…CԘap¤þs¼rÍÁBÀAåEZ lrIX*Knyڃˆ)Šš™ÏXk a`´#' ÙG‰!À¡šbŽ'(²Ä)ñT¶ývj65’ño ÁRG¬œŠmú³-h¯¼’©9ÅP ¼‘ÇãîŒ +ÛÕx¦¸•ÆG¨‡8’ÊÊ æfS‡z#©êóå22šQ+3ã(à`R>@m[¨¡(pÔW@ ƒK<'ò Ÿ?‡„h jFÄ &E38AÿЫƒ&†„áYî&C Ì•®ÚMF؉L9ÊŒ§!EŠ­°A&Ñc‡ÑÂ@SŽw‡}‡Ì‚°åLÅ(žÕ3d3=×ÚÝì¡ ñ™T,I˜dE!Åý<ªeÓˆØ¿fõ ñ¶r~¼'µ8€5}LTˆÛM³®@*2]¯Æ#ܘÔ+à~€õƒWc…£GËㅓYY9¸'âóÌ…U8ÎL¨™V|mŠ²EQ+sm`ÉG /ëąۡæú%3 +_A¾qІb.Á¢ï™£ž|ÃX´Š H–2³¾ j1ib£#øÊU +y„i¢À95èÕKœ:ŽÞ‘´± —ÕTBÉòفÀ܊ɘ(˜Š¤Ê™?¦Ç£%@aB_¬_$7åPâxœ°Ô“ +[öä9\T'ƆÌØ"ÕO”<Õ!ýtÕ]‰<_–ê"•KÚ#,çò³«G¼NÞ+A¥ÓHÎõ-ëÏ©‹PYˆQÍPÅ2ô¹$£X ލ)º âdຳ[AµÈ\ò‘7Ö*bRä&tú%ž¯ª'#o€Xõɤ5g?¢=)šF»ycȍýä)öšuÂxC§¾¬P(#¯¶¥ó+:G8Pã¼|”W+hy4ʬyFFß&ìcKB»¸"ÎôÆ z䫝’™úy:视¬’=Nzê+#½Ÿ MËÒfÝ¬ÁlK;‡áü †Å€aý‚4özÑFß zòÑib:zk1òŽl1;€i¢&ẽšSÓéÐk_r}Ô£™Yßñ—ˆô Qq©”WíQ`úg“M’fw +¦GðhÆԁù võÏkjØ`Š‘ÙQӁ¼Æ‰ô1ÞȽž+Âõ^#£ŠMå…Ò0Põ133l¯¢½.æaÔ4µä¨ /"€_gÅíëªG¶­”œ>WÈ\l,$}TøŸ†OÒMÊì7ÚS}#ˆrPÇó%&጖!¨ë‚"«™`Ä nƒe}ï{š!g ÿì±Þ-Š›ÂY?©×åªØܔMö +•AR´âêbPzKÁCK¨?9æNÉ´ª±âÕçœÔÂU²€Âݜ h¨ÆÖbä#C¡gâÃpßÁ¤á¿<°/؀YВå¶å•™Ì±Ó]÷±[æì¶Í±s̨£Q{3–ÃXȳ׫R›î˜8¡I½i2ûl1¯³ÉZ<îS4 +{‡\?û‘·LIŸjYÂðĤÎM߉Øíْ™OôS1`G]PË'”Ç`10ÃTG›®ŒMkՀ—8˜yRÀêæ;3_±ýœGÞ?ûÆî˜@(˜ÈªÑ +í̹\ÚUæcS]=ðAÀ;GK!ÒkØÙötœu×0µ¬~’‡w€iuš°®©4ϼ²sfp.MB„Ê9ۃÿÖ0Pû^ƒ}'œã³ém$À*‹ô ©¤"¦xÓ M²!»i7L£ÆÓðNBßì+†©1¹s§ÈÕ2›S!"I¶ê ŒI1Ù`ß"ñ?£RMã?†—¤‘Ïc\þÌÝgÛ×· „¶E^„pà¤?ÃwÆd¸»’±ß~e²CrBc +¤¶S«œf£&I˜çÀý{à흑Hè`£ÃÌ«Þh +`€Î$JosÇtü ;£n8>+jˆvdឿÐúI #ã*P;^Òa;Ï +ç|Yü~ÍSy´+ȑRšoR¨A²bF)?’a;‚ @c5Ö!Ä+\v43èJD‘|Rn÷¤h¬Á$2¥öLeG)RvÀvªÞ\ÐO;¢H¼¶N¶Ãm0ª0Çî`Õ(¾({¿¸æ‡ÄDlðOt¼Pb>î ÀosÐ +&e!df.=¨†œ§lòԉ›>ºÉT@¾@ŒðÉ ÷V—è)£§Š |ý¬Võú¦~\ž#±?»N"P¦8ë½Ö\xö$Dl‚:Å÷¤ W/ÈîÏLú&ÜÁÜ`ŅpPÖ§R3Sb +-ø&âšUŸ£uM{œÌߨ0Í̊1Îêó¥S)AݽÃè mâêV¥-˜©¦S¥Œ½2+(µW˜AøzTë°ÛÇ"TŒ?hVvadŸ´ZšøuÍãS©ôèg}2E9[º(Ä dçØp¯ó¾«>h:U¬±¹c–ÀQ=Èzg[Ðä¤Ó\ŽB#mn “ÑÐt +©“"Bp&%ùZ &¡×zt̑ÂË!ùÃw¶¯ 4zxúXôå’,„é%q¤l‰` ˜ö4šx‡Û¾qfO“ÆÍkFܓ°;˜ô”ó÷ºKx+¢=Ç3 „0…ú\)ÔÞNš‡šW5µ3OÙÔh:Ì UVŸÔ;É%…[™ê ~@ø^¯ï.2‹™yi¥“¶``En` +ÔBP±‰k̅«Õd2uTìàm£ù)ü;·‚ŠÓ!vž\d”UC3oÅÔJŸË:‘‡r0ÐT˜5ÊY-zöý­VørîÉùIÜ©fïÔ»Õ® d:ûÑÄ¡ "L©ÃLE4Ï ´Ÿ¡úXZ¯X Äð˜Ńò 4èØÏ6‚AuZ R‘|EÈêÝrîŒsx%Žv‡;¢,2W&\ðÉs›Žsõ³‚ˆá-šã~‚—Ž;Môuˆq×T×>†¹0õV‹¼'ÁÉȬ1ëc!;㶠Xxf]kL FTB|RVEe4LjZ€™‚0k + xM(ÆY¯“q²͓üòPpȽ£ƒ@›t Yì;AH5_ã¬þßÁܘiVÇϪ^_“ÙêñXç3b7Ò¤7]0ãLäå4õfÛ¬°°·we9ŽX7Õî:µ=…A‘e PâĨ8 +ƒÄžDzòù|WL‘4ړ&0ææ1ë0¯kúœNLͦ?Â8„f§áÑc†N Up‘gÞM¥þ&-gz®{ÿïÁYF¯-M¦fA¢â‚÷Áێ"ÄçØd̤1.Ö0©·›"î5PTÓ¬'¬özýd=²fRíªäȅ9¶ Eª–ÖŸy{ŸCGSçÜ +Nå×x¢;Qay“á°ò\PWJ0F0ZšÔR ‘QPà”,fM~E•*•éЎT¿àÏr8 w¶:†w'°»ÅçÀ 5xÖ¢­ )êhÿƒLŒÓ P[pk6?¬ã7©îÜózš©×Njn„QâlÀFêOÁW׃B+c¡v¶têޢΔĄ”'CA† —3ËI ˆ®ÕÐ ¦V7üHpm˜pôö%25žSM\4k[júèLzÀ;{`þÎM‚[M‘”‹miTx©e^!ÆI† éLüñ¯Ë‰nXõm3½œÖâÔñŠ ñ¥Ù/1aÖ¦4ÐѦALÙ"f +ç(j .®Â®º¤cy„ŒÑ•Ghí×Qýç]ðþÿ'£+%ÌâçéŽKdOìÙ¹Dt8»Ì0¶ XÏU\20#®+Ì}D`ᬹ,JV9¯W¹+`¹Ž£è…|íTp@dÖé˜äŽÕÔ Û®ú-×yo2pœ€BrZ!xFÝ*šÏb¦³’‡èÎ¥­ ¢Ê42 ™i«]£tx \σ¨ÚcqÑ)6MÌ)×+Þ{t娶Óqa¡ÕŒ´Ñ0Ú°õ10’‘l`†!!7FÆe­BÖ3OaÜÐæ Éþ-<Ȫë癨 +¹" ¶$.Z$XD @kv^ÙRq¬ðgˆj¼/Y‹üÂîUòÇ(u fñê 0Œ‘Ðw¬AÇÙU±Fä´äŸ4:EEŸ2aT…ÞR#ɖì»{[½À¦g$ŠJȄO#‘§>n­®ÀQŒ&ÎCkcBÿ¾l¨ +»œQÓ"C©1¬z-‘ƒ1V u°S·u}Œ 8Cw2~(’<Ë·a§u{˙pdŒ(?úVæUa¸¯€‘üë¤%`H)rqˆö fŽªX ì”ÈX¯øγúmô¸C47GyVÿ°¬X²Ã¤`J&2…ÿq%Tð?Œ#1LObÒpŸ„yT„ܦJˆ´ô©©ƒÙFf¹S`+ <-‚Ž´?F&—Pg@3q܇Þ6¸š¸!øß&½ðÄ„êëé(Q#(£d–ClÍ.6€AkkâáŸÌ,‰mÎ/™\öŸ]ˆJƒpbê8ô#c: Ð^O‚{ÄR¢ §1mà¹STš°:Å?#S6‘î7ý6ޗŽÝUà?ŽGÜî“þӏ”]ïWþ‚ +‘P;úᶃc™ÀÎQŸÃÆGH|þ + fKÞÎôS0§º‰üt16&ÅaÅ à6¢Ý ä0m9öÑÜïöyYñPo¨Kh ²‹€±7¸²AóäL½A¬A˜• ¨œ)(HjêUÖµç‚Z®‘®žW¤›çÅsd[l¹â6'å¢lr©–$É`””ÔDíŠ2Áþb¹pJjéœ:=C0ÁTÎoŽ®ƒšˆ„¦úŸ çƙÂDy¶“[¿7^¼sRõ?S=pÀ'I‘Ù]½O¬3e¿³Û SV¡ŽF¼N/ £}!Îjè0QÓ“Y0õ2ÃÀÄX^Œ¼£"LŒ‡Ee1`.ôàá/ô„Å à ¸¹<¹FE@íäΓU±·©^uˆtùb£ ø`¾**5XðöãócN”L‘ëhõâ?ö,°87îrHˆº|Š•©€§ +yFº[à,î]´Ôý9zÒ@‡ÓaÊEbÄ~әu"ˆô €Êjj•ÄÂÁ}/$0åjÑð¶& ÉÑûÙ`mâå·êó£YX¾‚À%3»ן¸NTŠ¦K9sYè6«»'t¨²>ŠwÐ2Aeóåïh†€=1±Úë…›ýâKŒ{™û_nžÿááþæöûÍ/¶ÛÓ««w¯÷p‰Êë8³rÉ Ä‰Ñ,ª4¼.dÅ)ô]‘µ’e˜è  MBïYêxMp£ÝÆN«)“õA$-)…ýÐÁV}zé³Þ÷õþ<¦ §œ"Õ¿B1‘cRP‘J|:Qñ3 pԓ™3žJÛë¶ÁXÃь˜R¬>ø‰+@1jÀԇ¬)Gªj¹V$c7*ìbeT\æ?¯wÄ-<0ƒC–0Þԁ5º¿9SŸ8Ât0¼!+’›×T –©‰ˆ£YÁƤ`bè%ïi-F¼@§òVb‹yR÷ `Ĭ«…~gÈj_#¥û©÷Yçf½&›H{Ê98nôNÄØëiïÐ#ÂNè!1 ÷Æ»r1^C§÷íU€:oÂââêÕSC˜´ž²Rÿüªã>e^RÏzGÐ-äa†ù÷å® +Êx]~£Šmª'–4‚6˜Kß,<mÕ»SU¿ö¦íÞ,*´’‹³”q§ ¦ˆõ9Çês¦U•æ•@?Q•Ù£T &ê“þÆYMcŒžœ)o©IN¿¸yÞO£þ{ø=`GÍ°¶2]›Ó‚9—´3†Îx¥Îs_Ò +¸Û5Ȓ®ê@ÊCJbq„õª XZ?ݒ¦í´¢áöÂÜv»xäù¡É< ÛԷ̊·èíÚZ} g\`þwÚZ×N,x±=+A‘ öTVðla€Œ`'G†   =p ÍÃ3‹%2WD†i +„ë E£ÛÑ.meމ¼7æ¡ ªºÞÏô©aö .hú„k!˜Ð3¹öG’ŠRB¼Óax궛­Äæã<ÇC Áž`Ï-+ öó}w¹Ù8$“CyëÅÓp,³´>A]FØ/àõn`Áýxʚ!~'xLî ÖãÖð4Àç{v?ör)K®Ô¡¸r3•Ãã÷ú9 Þ¯K)+t|,zƒ'ÀÆàMºF† 9zê½ð‰®`ò ‹É(gã¾"*F‹‡V|ŒxV­†–vÝ/þæ +‘Ýòk.€ÕJK^#þ&r¸Ǚ˜*;,H2±5`n\ù ÞÆyqøóe0&U…x3¥5@^ÐrLáE朁ð$‚<3kþÅS£ßãyŸûU‡êqY0Ðc|\RžûñVʏ™•t8ˆu™Eõ˜ÐË@k`JSqe•ÿˆ˜Ô Þ_=¬~ðѳG#g°@¸¡¢@ÖO·Eì­Sc«˜æ¤j ùðŠQ[´ HÆLÂù}eŸzüÁõër£TQ‡éJVûÙGúÚɦ7KXFË&ÂàK<OQ¡;¿ÇãV)ªÜ'h•añ@ѽÉ ‘³¹Ü©¨R¾ôX]!Ô3gCR=¸ï1­²Ìf·ž†Ä’©¬¸nD:ïG%p¬ê¥»Ô]/Ém¦ EngóãàêZÅâ²òøû\+&ÂVÔÄ ›“„ä.¯‡êk ˜(­eªe¨ÁÄC&}Mt ÄOû³¨¸Rpt9oZfUJ—P"Ž Œ±fãñ»ëù¥JÔA; ªá&ò í¸çbôpõÁá¡*u>Ô½r¶~üNÇV)pJ(€a«?-ü´[E¨Ê|CŸúâ‘DyTJ ½„Ãë:².“P¨Qóž9çrÿQµC‰„R‘yva2?}qv™P"Dƒüí Ì°ÐèÝmúòͳÿñ9Ûÿ˜£ýwCÿ >þG?õ l*¤ÛÈøz¡?þqiª¢ ü1‚Ê$*®ôãk(Áðc´¾å‘Í>†O Õʊ>ƺü¹ž$ci‹bÂc †uÏÆ=†™ÈCcñ7Î6¨Çø…]õ˜;É%`Ø Gî8îR;7â1¤•/ð±\H Ä;¾!0Ãç»àŽ¡ý>땴cT‹RˆPR­ÛÚaÇ«•_tm…&:QÇõ2bw#×1éL~º$:®ÎÅï¤cfúœe KAœ¤@Ç·gÚ t 9¨°Bæ3 _ÏÉ9FH#Š9F$•¿I9f3§§NÈ1ÕåycC @”I ŽoBpÌ¿ÛޘÆ1&݇)Ï=áÆ·o;ÛݓÈñ0ڲ͋iD£±°sb%‡¦5ÁÆÍüïä7•ÌíTc¬®{2;ܪö$ÒÓôq¾9›ßcòŒY®vžsmÝýYì@ãüñŒQ×Ç=qÆ0 dd§Ã#V +Ö0c4ºÎ:Yƽ*ö´¡Œá^bdËÙ¿_žÉ5dŒÌ?2õÇ¥]ýMzý=P¿cü}öaŒ}Xø-„1Ž‹ÚŒál¡Îb?MÑàã£FÍmà‹qîøB6z1„d¸Ú€³DŸNÀ‹9#‚“¿Á‹5Oªu‘H”‘ðbIÞL3Nxo§‘Æ]í>êy'»˜Syùl0°&)K°‹qûØ v1ÚO!ã½¢‹qٗ±”‚êÃ~mäbN⨲ÙÈŲ>5Ã0А´–ó6t1ߛ .¦‹™é²S;[Ù¹ÅXI T;°Å]Pµd -Š •Ù ÅåßI,æÚéåK°x<–y­¼bñm®xx +Z1ÎYaÅP `V1>ƒCÇeRÒ>êqRñ¸ô©¨˜ï¾dqŠ1™ÂEÞ0Å Äb-”â{ˆè”âÛø“ R|[­bÀðÃÁ(ÛZ» Q|;ª„b”<㗂PŒ¿ÑD'²™`‚OLõüõ$ž^üü•NLL×ù$œ¸)?hbDؑÖØÐÄ,1n%ÈĐN¡þ:têÕ—ùZˆ‚K „\W­uÄ ¶g§#aPE8æ.BÓcfwñ®g4'€…A$ffúJ‰k‡xã_7GŒ°7T;¦Ããºññmò ̬Rí±²'¥@¿»r3êi93&ñ§´DŒÊȏ„!aãf RJú%kY)Ääi°¾Qy& °ãíÇNEÿ>«‰ok[ƒ@Œ_"ñßdỘ7¶ò‡Y2&¥˜Eͳ‰>Œä9–+|ÅøWÉFU»î‹2ՀîÞÁÃ`¨âý2gøf×àå/ +ü6è0 Ә¥‚9Œ¿]iÉHþf©êJFòdŒó«EՋ@‚ùçŠF± æ«  ¿V^¤~l};/NÖ0rîp5 qs'³Kñh^œÍà cŒaâĘaü;ÆF¾xÆ0vpÜ1|Wy6Â0ŒüÈ×½“„Ñóï¶AÂHbõ Žðeë†FÍΗ¸‰)tàöòÎÑÇte7£ l;¨ç†Sl‚ðÁ7áoá×ÛK؈ÂM3q⃡¨õ|ˆÃ—ð`W&;øP6uG›h—ä`Ü¢:¹Á‡¿L©µ„C½y©—¥jò* 2à_ÌI FB¤¶ â4í¼`k¿Œ" š¬àbá6ñ"§Š‡¨`nt•I +F [¿»€‚»Æ¨ä7$o”à0$x(6`ü/ø«ô•Dp±c›xí€àü{å‡1ðÀ¨pÂq“ìWnƒæ±k²€ChàƒËi}½Sy™J¨@\ Ԓhàƒ"·ëÙÑÀø^Ų6ø;ü¬èµ†, >¯ŒrXÊ\‚ ?ìê‰f`ú¾w20’ã üzo86&˜ëñë Œ‰Ç™Tàƒ +óZ’ +ŒQƒ• +Œ[JÇ%¨ÀéÜRØq0ðñ©ìœLàÃÀ¾@#xs=;1jĬ MV4æc4ákÃcÂÁ22hÀ 0°P*ꃆº®\ÜÃË(`V|m þ†çº€q ëîÉF²[\& PoV +07ςŒ[-=·‚èJ"¸³1€Ãà‹¢ÏDó®\²Há!ŠÂk`(08ÿÿN`éÊÿ½a üïå÷ ÿ"ÿOÕRGT7²!fÿ @Ҭѿ@ +Óß[É¿ðO0ø#ê;‚é{#’€Wð/ýk™÷^À¿ñ÷þM£Á¿7¦Ž:’ûûîæN?ñhƒÏV쯝ô3¹¿'õCæÒsý½ÄèÎ\$ø÷„öŠB£ÿb;ùü‹^jœowð/ͧï£ì‘ì×ÿž,¼Ëø"aʯ÷Ä­Éý¥å9Ÿ7î/XnÂ{Íý¶ÕÔ4%h¨ô(íûKüõŒäþbϋ¼àþeÛÏëûK3Û÷ÿñô6±¿üVÛöW´ßëšØ_^àóŒ‰ýå?þ§É+¨Ñ½êÄþ2 Ɨ$°¿|@äÑmØ_dªÄ6ö÷ê`?æÀþꀚcÃþ2CWÚ¤þ3 ˆEPÙ>`0ѹRñ ÏÍ6ƒ¦þâ”"ÿ‚ú˃÷±SÏXÁ þR¥UÜ[,ê¶Fy£þrWU “¿Á×?¨¿°œO臒úKZ.hè/¢Š3õ—ñÅv¿A™¨Óweê/ÃGBQ›ú;^ÿφ8õ˜ŠëNæ/ø“åìù‹îd<эø +Seüåfힼ_èö;Ü #Y¿ z©ˆÄ¸_\§œ÷;†¿‰ ýŽSńý"'¡²’•õ‹XäaUSîu7“ô‹¿K¹ß@¿֜“òûØeJÈ/³&}¼1~Q¿~·s"~›S¸±D )^Þ¿¼êrœ“ñËÇÇ2›È]Š|nˆß¡šL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK +*"Ê+Ü÷¤àh ÷U`Þ© µ4ìZ'ît_jÍmÕTŠ€§%ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿ©=é¾JÐÌ·:…úìF÷Åi³DÐ}Ye„BÒ ûâRéˆ&ܗÝ)Š +ò”*Fa>;Ó}y_X0¸â}i…‡a¼/³övÞ¦.6¼/¬Anªuï¢ËޗfV¼/•›ýn‰÷ewŒÁ÷Åh‚õÕÎ÷•–$ƒ_¹KBÍ÷=‹“%àV®9ð+ɧ6ë¥Ñ¤eãûÂHo#ø¾4 D|_° ß¿ÉÅ.6àW}ô%mã1m€_XY9€ß“ìÖëJÀ/ {7¯¬ÏHÂ/ÄêK~a }#ü²‡¬AøUYjÚEøeoØ"ià$üª™Ú]“ð‹>DœÒƒð{’‘)*ï$üRè=ú™ˆß³ºlÄ/ÿæû½"~i­% ¿Ò‹å›¯þß¿ˆŸJwPI¶NC…‘$üJû}<;á—þß]4ôI¬Š& +tw‚ñ‹:ÒÝvÆ/Ìçe¢/¿°xú2㗖ÈwNÆï™ý'Œøå±"ªEPÃLàmˆ_\¨œ±@ür²¦ˆ_x@¬¿Ü¿Ôfq‰¶&Xᨁ­ ¿¸6Â/DúF›ð‹wìn×= ¿çí%ÖNøe‘]Á ü²÷šÅ&üÒyWˀ…ð{F> ¿´tëã dúìö/KŒ³øž7¯¸睄_ ¼¯‰¿áW¯ÁÓvÂ/­xƒð‹£KÈ_~aàĵ~™À„XAç0n>¿2´º~ñ{äíá—_Éq%à“ÇÑÛÆ÷e¦ïî-ù¾L“žgÂ{1B= +ÀNÄ/†;ç9ia÷À߆Áç¸v¾/Œ‡A¼¶a†Gt_ˆŽád®p_v%T™¡<¤¿0yü‰Ñb#û¶ž 2»á¼fö¢³03 חÜg„ BGöÅóžñ÷ŠõM›±¾§çàõ‚a‹åíFõí·¢Ô¹‘IÓÁô¿W¤oÚLô}‡šÅDßçPÿхçûxÈžïshè œ/þÆMÝh¾Ø‰ËsÓ|k]æûz“7–owƒ£@ùv‹€ƒä 2ȗT×z%Ǘ xÈâÝH;l_ñÞÄ㥠†/‚â„ü®ß~89j„owkš ø2,^Îà‹ÌÎ=ø½øQBüލV|/°\M M…„±Nª-á½­H¿²{iå˜ÙlìC¤É½ )Ýêm—RLpÇ®v'·ùUdąís Ø¥ÚKÍ#êy íEÆXmÅìí^ZnÈ^ö¾e®ˆ½Íë¤öâ<@½ßx½<0͌ëm^5­—6ˆ VX/«ÝðršÕ˚8(•ŒêYH½Ù½Ô Þè(~ä×mN/èpÓÛônü.öy7H/Äh\èÄFƒ ¯ ô’(†dÛ +èåpŸ6Ö&‹ÏûXY±áya¢ñÏ u?â÷AçnÃêçEÝÄÁ«›«W6îpõtü½’yÓf0/h9 š”ÄsÁ²ay‡Y;AåŲNÍi­€ %‚+ý•Ê «Ú (&F!Êý$•—«Nÿ+•—È)6ê ?äu©¼Ü‚tÿ•Ê‹ÉŽ¡â òÂ#-â8²¬«h<üÉ‹e¼â`òòœm¥úhø)º³`>Æ­;À î…š‡„ Åýڙ¼ò0ʓL^8Ü“—6;X™¼tÓxòfòD:˜¼Ÿ•/éÃü1™¼ Ö¡(bcòÒÊ,¢™¼ +ᕞ^æXº2ywl&˜¼äfððbòŽªwcCòâÒ¹ú$o®0£–6RP6$¯cÊÓ!’—œvÍðaSX³nÑC³?É«ø€¿Em?‡‰ÈËÞÏ ò2ƀµ[y$Á\²yÓµ4‘—/¤E " Ð'Fâl%ò®ÖâÞ À‘—” ^‘—*û*à«ð¤"Ÿ=‰¼B”±y©|¤váœÊoƒÈ‹GɅÓFäE +V§äE™Yתÿe¿©Ç eUÓ÷H×>-F‡€ñ2JUU:9a¼Œ¨´§$7Å´A㥁­Ö ÉғD‘ǹ ß q-‡æÆːàMø¤ë§°ÎD°Í8^³Îsçñ"ÚÃêIãxÈDI4ÂÚ¥ñ'Œ%Tu¢x;’2ýL/`ûϵƒxa»ˆž‘®ŸÕfõIo÷w±ax¡²CþÁ^ü‰¾á…J õÆàínÛގj¹“À‹Hb#€·;ØüÝó8“¿ÛÛÛð»€<SbünsÐ0軤Bõ½Ë&1P½½ÛÕ îns¦qÃî6óƒ¢è Jú ê.NýRƒð Ýeÿj$íÌÜeúù$r·Zêµw)=»h!‰ÐSðv½Ëo«Q|âÛŚ ©‚¶‹¿áÄo°]¨`ÞÖ.ÔYÈ jhغsvQ Šèv`voԗ&cZ¬¸7Ä.ŒˆÝaÄm” 9y³ðþ®Ê‡^÷VÏÑeŸ×‰?;[¥ô”©Ò ².ªj(Ù^Áº€và‡‚«{»9p`uQ„%ñFՅ_QPuoO:Õř\†óe +‚wDõŒÔE‚³›° ŸL…Kís&×˵µºX!á½ ž.ªjàÚpºãtÂáÂáÎLӅd™|½¦ #†Ý`鲦hÔDéBƒ`ßJÒ¥Xû¾¤;BŽ.þŽJŽ.‡[]AMáÆè¢Ö °«¢‹úÅzMŠî0L1 ºÃq䍡‹¬„^“ˆeŸb·Wô¬Rv†.­šØ ZB´é9’¡ËP:ÜÛ ¢ËVéˆ5Dó>Ã~Ñ¥q¾¢;Ö¢ câË)Š.‹ìØ(ºpuâåPÆ ž;AÑÍ|ñFÑ¥‡ÆÞJ}–rF +Œî'Ïnž1Fw8×µStò= fðˆˆoopM4¬4Ú º¨%8Ü Muq#Z|™Ÿ‹ý˜ÌÙð¹¬Ü¼ä“ž;P\Ææcß๪Œ¨eÙ}»ðÊ'=w&šV|.}xê +ŸË‹MÏeÄ°¹´n2p7l݅>—*2BH1ðç9/&ËØñ¹u Wàs•†?Ïäç"IÀáfã璖R%ØÑX ì!â6ÁÏUrA£ÙäçRtj¯àçÒp‰—«öØ·ð½+> >Ýsãs +d¢ñ¹Ø‚·iÃçBŸÁæöÏe1ç Ÿ¡pÈÐь™ôÜ ÎæÅè"×eèÂZI%@ü%:AÐEʈ!¨ KÖ®AЅn^ti€Âu#蒉T®æì(HRòs¹Ë~V~îyÛ· ~.ʂ¹( ~®úÁoô\fÓNùÃT2òœ«õOBcHÈ÷7z.¬ú1ÓsOB®‘ô\ŽÙè¹°V<ð çr3ÞÓsyäSxèIÏEr’c]Ðsñ|)¬ |n6~î´ ‹Ã3¾dܓ*êrí]$ué©åfÅ  èNà +ÐMktO‚Òà& ›/æ†ÐevvL‚. ®‘G‚.ÓkE¥_S8H+–vÁÐer ëš`è2C†@óÆÐåk5-º,æF +Ê ]þ+V¢D—x1¸ÒÑe²PÝWcÐ¾Â¢KTãqJQÒõ©¨y@tùq9Ͻv©ô" Ñş éŀèÂÐXš¥Ê°2S]Üǖ/¨.OQ*×]怙¶Š.”w¬Ü)ºxà’E—D„®F²¤èR††Yy£èRۀÅq`táþ)±]¼„l¶cta&Ü91º´àÑ$F—jó6Œ.XcUù¢AþÇ:ÞÀè˜؊ѥoÊ­1º„ˆõÛÙ,PÉ!lµbtӘ]NWÃÝmõ$qÃØ|pÃè¬×Ë]>HŒ.7‘ìdÅèÒÌG]qغÁº¢[ ˆô±St©¤T (ºP®püHŒ.áÅ­Ù'F—áaVvF—ÝXø¸üxå+F—+Ÿc‡E + ÑMÃÆНVcÐ¦$:éò=üä›ÿV¬Ñ"Çc!èª8ÿL€.œ}®Ö‚ŸÛ4ÚìøܦXFÒs›Ôä Ï}äììܗ±‹”+裒è$ç>Ñ®rç>ä"/ûtV]5×Z֝šû8bj.š©ˆöâ~RÅ©€•™ 9ò»fæ"¼†hgÀh‹_1Fø€ÌE,ðx—‹zÌÖ-zt¥¥ËÅßÊH –‹¿Qg¶±rIF§=£r¡¸Çë“gç&å)—ùxÔ¢)AMÎbz½8ø‘-œ\臭Ò`{ þɽ®¯„\øHþ —=ùŽ+ù¸€ "̽ãq/ë%’Ž ù;¸YB ;VÌXÁƽܼ Ù¸×%U֎ƽu²ã"I‹¨z¼1H‡³ ƊŭÃÂSqjWBqàyeâ"îQ'U7šŸ¥¤iŒm<\)˜2;Q m®b)c‡áÞk ÷vcÂ@áÞ1-$\èe½7à ç†ÁEؕ¹6Sp¡3“‹Y¬™7.òô¥&‚Äü[샷pãßB¦SÜæŽE›è×ÙzÐo¡*+ÂÃNø-.Å(Á¾ÅMàwäh(‚•§úÎÅ."|BY2YÀtz}’{ی<Ø°·Í-‚zµÕ½m†)lÌ[vµ¸j"o³@ÖÄÛËUÝñJÄ"¦¤hÜt×àÝ"î‹AwÃÝÐqŽ¤ÝÞn-°ÛÛ̍u #bº¯ÞZnñK§É·éœW—ç>üšÀÜ¢"¬¾An©€¶ÂŒ[pPðq‹»€÷k#ÜÂÈ®)܂‰°}ðm/'^6¾mko‹¿2Þ"È°ÑmqKà¬ÜöjÖIÚrs°¡mQÅz8••\VØ5Vø7®-‹°ïÑF!€ Ú"iÚúδ-v‚i‹¿Ü ¤-þFz#ږªÅ_m«_ ñlo@o8[dX\RfûInÀl©cxîe{£ÙQ³ê s'¼È Ù"ò„èÃF²,»?'ȶ*ä–Û®Þ;ÆöVx=)¶§çTClé¥7†­êÎDØ>|›'Áö!)ã ` öá÷æ×>*Y0½ö‘fè]+ÙO¢k»Å:&××GíäÚ&ÞH‚k-‹Mn-EÌïØZ†3ê¤ÖjfIf-2®g{cÖ"æ=d-Þ[¶‡0±–zŸë X{ÉË ^mñì¸ZÖBßu§ÕBÒz²j±ö ž0PµMµ&o¨Ú×3¨5Iµ7c‰g€jµî©eÕJLõžAµTºƒ·”.Kƒå€NR-³ý·¬†÷Ÿ‡¨ÿ¦!}r¿½÷1µ{©›¤Zð +¨6¸UÁ©E2ÐS‹•=\¬ Ô¢bîl@jo×#nŒZ PCzQ³¬ B-þîúç¹ú¸‚>-2–ùž–œ–Vw:ííÏNP…1 ³Àª8_6Ѵϙ©Y±öæ}P'X@XÞo\Z»³œ'ð÷©\7"¶€x¢¬j£Ò"‚ŽÙ1 ´¨ bøÌ!™‡D׆¤}­ IKëӓ5 Ræ H‹(ܑ0¶GR×àÑÆߎ6ŒA£íž‡ƒ2 *–¤‹ +RFVl|NErƒD›¯ Ú0‡–øÜg$†¶ßmlZÈh«Ð´‚0‡Ðr0hIœS߲Ň¼UÌÚnuNðfñª_ÚiFšp…”.ð³ˆ#²'˜é³í5õ6›üYñ.Å&âàߥ%}–1ËãÞá³´á öìãîKÁž}ÜM|CÏ2HZGg™¯–³"3´çظ³ÁL +ììó¸1PPg‘;tœa¼ÁœÒYÈ@Îâï¢õ$ÎÒx^ œX/‹Õ#ªvà¹m¸Ù1»Ê±ô0ßÖ6˺—óÞY³4¥ž£¬O…¤Aš}¼ÜA³hZ‰™±è Ê,+ÓÜKgj‘If«³8'VNbµ8·á´1‹$'µÂû¥*ÌÎc¬|Ù'’›ÆË>NöL6>ù . I§Â‚Ë>§î`"c{5nC˂¯Bê`X‘ò“+KµtoXYFö ª,Ñ#.G&Ρ³j7…Ìý˜…»‚ÞŠð'QöeP%ë”mŽ1'P¶Qiê‚å4¬HÙiS¶™‡“HS,;¹Ðވ²Ûp3/&Pn=:"Õb;QJ{ÕU(Ky¾ã†¸µXÃD °™ÊDšé¼|0ý 8¢Ñ%Õ)ú%{[à(YäØP@$Yʖ˜w^I²Hlbõ Y.¬¼Šj «tŽ9Õ(˜º|X›\‹„X‰‘ŲE1¹•"[±d?˼ã0¨®Ü Ùjy←E—D¹€‘y +‚ì»;óå›;LÿDý‡dÙ­‹9@Œºðb~J3Ä6åú¤&‡e(iX]µÌY®Àh>ÎÑž¬Ÿx,—hÂtäOŽÌø6c›ØÒ^uæće1žòÀ%uÈ`mqO¹+ÃL(Zsá±Ü\ö4÷]Ñé+i?—y¬šTóÇóJY ɟÓè HÎÉ ¼Š;‘3ùäõ©[K”ÃÑ0q vWìíxÚ%Oçb.ŠäV Y”ÔA „‘`¹ÎeWŠMO×YÀà6&XóB²« &bàO6eÀ*€ÍR)gÀŠð¡ɔ¢âCŸÁnÅ)[‰«Tä§H$`µ—z;`ÙT)Ž~„YàÅÎöHØ ­õÅ´ԆÖ×$Ʋ?—¯€)åâK}œ t-.‰"´š²\ð†ÿ¦œ–E¶s?Ab°à$ªG‚ ®”ø“ìÏK‹:9õ»ô“,¤âCg·®ÃÍŸ¨*Ý{f¦.*aØ8ž]-¡ýè¦I{ ‹Tň¸?øBÇ µ>Æ£¢³B%þ¦º£éãÚ:ÜF>pç9º{—ãYG—U‚ù½†·F˙g o‘]9#‹ÂJø’`)žÜ™L|¾\¨ãÁû7Pyy\|7.¶…|Š¦O´…\4.ãhjs,JžÙâz°s·ˆáãaŸâZ$)}½HKïڐñf /,,™Í+ÍO0Ó§(AH ÆÂÒd|ˆ´dùfôññ²SVDl¢!¨“ §Ó Йv†LC“¡‚?ϼEÇåë$4Ùû©Â8öC•8ÃI>òñXXÀÅ/ :»à\!y>Y^,Î3”_ðUžþI,˜ Óƒcœî ÈhŸ5^,Ûkæaf§Ã^´Z¢…s!4o[ðÄx°^¤ÖÊ]YUI3³7ÐØRÍѝn‡åQoˆ"ʍw-B±±ÛÒaùÄ. À³™´œÊ¢z,+" à}S‘e‰?ªÔ0ú+I|·u„™É,‚Ùñ§Î“ i4PÏQn˕37j=t—/vAšGâڍÓËЄÅy&GlÞOºÚpa¢'![ôà˜£TxoIðÔh„º +’j°:æÇD(rÓ£×¢a¾ ExÏøÝ/×c2³¸U·?*ÎÇ5pßÝåjö3†ð9Ý¡c$†é*6 d)U·Z"=õ€àƒ‡`ö‘ÀO &@ QxËD¸ðà٘«Ö:¬å•üö°ÉÜÉèY\)Šô9n&¾_WÚҙ¤ÜôqÍøéuŠ]VåÓÐÂGI©X´—ÝÖuµb™Ž*’NvinÑõ·EÆfŠQZà° Ä …AÞ.ú«'#t̄@ÀÂJ9Aè¯ÁBÿøo/vêW.ÄOõë~çµT'`ýÁÔÇû]·¸ä†ÚJfaaT6ž¡§y[$Œ²´Ã­NÔČ]⊻™±¨òº$¹ö ~Q/¯qz”¦o–“ƒwÍižlÍ®#20Èf5ÁÂ29nCU5ªŠzO%X3’Í(&ÂÕó¸Í_],¨}éK³(gÐ.©š¯Ñh…9lx²É“r·ÍjО‚5V±³ïeÈK4p«8H¹§–ÛXóžC{r5‹`#lbÿèÙpRö¥>–õ°¿ +ªÔ쏫«Xrٝò—¾çGÉmZ¸ïÀCÚ¬ff†«å®º "âý†ª?Ù èQ#Xõ ƒåžë†„Z ]oíÑ{ƒݸæ¤×—Xrˆý×­ª÷Œð@è´Ãñ’m\½âaM…wr–àvß©Ôó´;Tz2éW4_‘JåaÄ~ôã%ïÉXæɦ’Ôy`v'SvÝuGâeáø~(ˆÃ]©C }~7õ ïÁõyg5Áÿd֏µø¾µÂ!ÝæåfÝ:p}ÞUC(ÓbPŠ¹5°-NˆU%eç†h§ÈɲÇûxdKÛÕÇMiÛy¨­¨ö9¨%À‰"¡qò+Gú«`¼†È2dÈôaFÐôŒàX orWÑE̹„åSV¼Rê$òĸj­à]Ãc¤ŠæpÉ,®4 Ê)÷c™»á$º½Ô¢]Š:°¯@êéÄGSúsF”? +ómú¡´Âð1u#º°¿»%L›¢íŠ,DðX¢BYÝå]›ÇLj¤”™ò|žEZ.••{Ï4»”q^FAК)hAåFÚâ?ü¼¹¡Whô³H™œ b¼gXoºÉ.äOàëçÊ9ß^ aàuø™v)iÔ´Y^È4’ùRX’¼k÷¤ ¸·®9ÂkGoPå„ï€*_Xêdõ¨ª‹‡^ÝxPLÀµ žèAa££Nåþ£" ·“f¹"$ÆﶺìîK¼ *Rƒ4NŸÚãÖ6—,á‡:ñŒØà-§X"_ 'âiñ®T±sך €±¸áX^»ÊLi!ϵ£ÔôaW†«Hw™ŸÚ©âCÑÃø~¼…ßF©vénú :N.[( h¬…{yZ‚ê—Á[¯S'àQ°¨á'†CU0‚«âŽC¨ÇŽwä?L!ÿµÀ0õòºÙ)ßE²T±k´úcöÚ³ä;Äfx?ŽÛ#u~ÎraÜá;B<Ôi •.³2Ç<_|™:n!ðOjódÍÈñ OFw.l‘þý¡%" ­ºòô.šŸKÛ í‚c=]2®]ØHñ)¶”å+#<Ž÷ªœÃªfÑL–âFè¸U6î'jG%tü6D£0àûY\\Aå¤è1áV‰$«Å_´¸Õe¡üx=à6³ ¸fô´×mʚ‹6dÿnîh:cþÊs…5¢Å;C=ªM<§zá+'ÜÏtx= 5†’ uvqïžÓàQâ7gîè2WrÎ>€ú¹K{…Õ´Á’bb˜õq>ñ +Ò/+“Î$w-'oˆÒ¹Ð¢¨¯jumO!R÷a'ÖòjŒ)0ëߏè­zìϑY†Â, Uƒô%ݏ¥/æâYò7cÔËoV¹àȈ1L€ÓÕ{w˜ +WI9S8#ØWÑ+üˆoW{Ƀ=ö²îàa}“Q!˜6Û*½„!&˜ÓÃ&J÷ ¥枬hÁÏë¹ïH¤ )ý +ƒyC£Û»Z+ +³[Œ59—É8 ±ƒì)ÃÈ|Â},<5!ÜB +£ Ò'¥íê4 C¿ÙÜ|fuü-bûr"&ž«y ËZsP”ýfFï4Fa6êjb}-óWoC4´Ô¤TÃ'‰–9…˚G^¸½v M¿Á„!lü¬f +»ÑÃÖô¥Dâ¼Kè“1\‰†Pêqjcî½0ô˧P|ðCøúÔ—h›Pù…ÏÊílaàr¹«ä¡Z‰/\3¬’3AíúÑ})±,30Ô\™¿Þl-3Xñu((ÅNƒ°H–ÞÂA„€á‹ÞT*éý”莡GΧùßÝÝ{`áœÇMzsÏ£XfÀjÎʺ¶µ‘=l˒ »ºÕ¥ 5yؒ\PÁ†ù¢º<ǐ[Å)Ï\ïÍÄ!õ pD$ã‹h•úŽ {4ôÝ2¡§ÒÒCˆþLNò/˜%%DQ5†ÍT?X'€\)ý ˜…Áo®¹PîªsCæÒXÞ=Qïz[é=ã\„ý:Я(ÛcRHìs™ï9·¼¤AaQ@:ˆ—VÃt1ñÑ`I>Ñ¢N”> ¾¹—“s;×½àÙ©p0- Í'~aš«çÃÛåü†}aÆT`ö~–Dµr­EÖa]„€<øŠOȏïþ=Ö0ÓãÎÌ]7o')¸JDu?¢Ê’Qúä\Ÿ `&ž1H”˜†‰7WO +g ç¢ÎEß¡Åç˒4j 8aCO”8-X/êŸNȐBe¨š"Lg7ïùd bBZÙ(ZÛ)÷ F +ӟäª]:]UBáX5‘UèMʸÒbt6˜É½²cèú‰oʸLHíl+úÉC µ˜â`µûàzJ~+‡Ã@ šLG¦`Æä‹bu°\ë®nlp©?AӔ¤Ak}*„Í*=XÖks‡¢z9šÆFތ’…œ}´‹ðQ\|ûRÙzñG µÛ81V´³WL‰xze)‰‡À9ÇXXûÞƤþܹg‹¶H·pЂårF/ïz¬s¹¿îaʾé¥ëmPڍ~ȹ (aЕ2Ëu«ÃŽšê ÏûKø*å-fd§ÅCJuÜpê†t³nõ/ÄsÝsr?F—[)]ælŒÈêÄ̟{^ÆïŠÕ0윒ÛË%Ê8ýp›Çб¢ÞÝϥۋ=Ïèß´Š;>d$Àæa•*ûÎ ‡™Íº… –ñFu¦¹[:‚[ †¹¾m§ZtI¬*qÆeϾH¨8DFä¶u>£!0,ƒ˜lSٖZx—p®`AýCÁ +!•(ÀÈŎ% 5}úïä{22O*%kl“áàP^'՘ÐP·ˆ•$ï6ÃËtÄNwÑÀ=»¢K<ÍÌy³²ŸaÆS - +žž.0xŸ4ÜIª{.½[4°¡zŠâØáï¶@¡Þù£‡»SÕ#:F*AP¬þ>ùb_ÒOûcr™åTd»É½þ)ÍT0´fƒŸG³ªèr˜“ 2’K]b§(ž¥}ºvŠ~k‰§w\í¹é^vš89Î%7°÷âÞÂ͗ ˜«TܹºÂàÎ(lµåÞ£°Õ²Ú;šJâ7¨‚E¹2¥ W(v`iÇKÕÔÇjîS®òI¶4 wÕjPêA¬ǼÖð©£3³ÞØ¢·šÊ“ÂÜ[é:®:òu! àÌE H¨l>Ü#Žº›«Ï]å N‰2cv[¹\CGËi±£Ö?DÄåb:dgl»¥7ÆçJŠãp¬%FÀ5Õ"4Ætx¥Lhސž]™Œã6ÿcœ¡ T¬x)‚µ5ÇRE›n*%(€Š‡Š‰éPÔ£•©rg†™± 8Âҟ%ü¦ÄáaQ/\AHRˆ?É!–ž Oʀõ ‚Q ^ÇâeX0ºâNsf ð³ VŎPˆÆhHN±E«<{w8ÒlŠJK’ì®` =r¸VònXüpªÿΌkžê> KÁ¹«—-ôšY;ÈLd!Ä&wðr<‡‚¸J)K°$†Içž\›j ››6k9)­NP·JY DN!¬ÂŽlTOªÐßÊJ$ßJÅÇCYW.št´ª†wpF¬…ESiw’“IIofN¥µú:ñ|Gk §'È°Ìì!‹]×Kâl’êRX¥î& 3LyûUP¯j²2š‹22Ž3!j¶½õM*°T—çmHaæÄE“ÇF3Ý{fíب§)lM|ZÚ5Ë9àkJÝüðG«$í·:&½û­3®ù±Óô^ØëXƒ~ +󣢦ž^×2›–V]…¢îácÑ~1>Yí·©8,-‚Û· X¨ëfµØ= ‚LŸá³gN„¿z(£Ä›É+s¶a±cÓÔÂ|nç`=kÞ´6ŒDcSï»/±#)gªâ#È¥Š¦ÃÅ$f„Vè¸Ùç ¼]R}ž\?‡-EN#µöï»N«ž]Ñr+ïҢӕO§zYç‚ÔU‚ÝÙü3f8®™V +&Cé‹=ÅUARŽ«žÓ’+¦j‡iWɔöùH¹DgчÛ!Òrû!XÀ]ŸvÎ]É#£™V“³&,výèåj1Îí¾ÐKLCz‡ºÐ >‘ÀÇq£KÊz(Þ;e¥4[™'BÕ&u܄¡´eÏÚ\ñqé­î’ ‡›nó'—èœkª¾SÌ:†óu[m5æK®Ù9œ .î4…à‹S ·µìàx£<#wEM°”·‘xþdƒj¢Äc@p&$.w¢™c+êÖëGˆtªÅoݼ\Pª6ó'>8É#.ɞò—[ÀÒç;¹M+n’VTōK©«VVkH£ËRä#¯PªˆÀɹàԘé0äP}Ja·ù·SW=ÜƒØ Y$*¿\eôáöì§7UÈ*/ª,dhcOv+q¿Íå8Ù"/Õ"’‰Ä· ä—°Ñ<v¶ÅdËhoî*j>œia¡s”Ô'aWŠ-a9žüÕÇÂ`$#p‹îaE1ú½BþWõݽ)Õ¥»Ë¤j—¼]ÝÈÈ#Ìé²è Ëv.œàvôŒ‡  +C?ZUõ •½N.ʒaaVˆþINƒ5‚× àÑs;ޑªtN ðpBÓ{Þ.ÆÀðÆ)¤’˜Q+Ab.þ~Lë÷~aX¬›èŠƒ]„äX©gˆ Î¥J ‚* †rC µù>æ†,gç²9ÍäñÂF–ŒÊÕ³ûÍeïº3^-‡Ÿâ>;´‚~\Z‰œ oXªW™se”|g ìûsª^ôÐnRãï,¿â—¥¿Œ^—f=ŸõA°p°ªë臲¬ÇéÆÇxž¦NE2à Ép¦áK¼ +’0»zJ÷é"Üӟéÿà +ˆ¼AXiD¾\€ÉœErǛAÐÖ³y¥¤¢‘¤üèi†‚bh”8¥×ð{Ÿªœ?•ä¸!‘7aÝoñ—¢ÆRˆ(çZ‡*H>4$¨cƒ^•êFŽò¨WTŒ!ŸÅ£ßpS®î1áŠá ø’ âÕùbuúb—[ÐÁ|ëÅ}ü¨¨Z¸$u•FçKÈ(%ü=‰K "àï…”¡Dn“}éé +3£ÏI® »ÅáâY_H¡¦ÒÙ]á—ðÈe>­ö¡¤é²øNõŠí³X¡PjŒgXœò¢…:âÊ0îJiY© b‚f>2H1æãIp -ñ"°6(<]K))LU Ý\'ü{+ +x>ZµKV çÅB:'o^7Ž,¥ðËmã2±gÒ¹©t»,±¥e±˜©Þ)¼7—À ӂ–65cºÓÜ\t)Ð)õ…^ËO+‚o¿ø`! —(ÎÁ‹®ÒQv%ºU‹#r„쏂õ!3›PS'mÎ\³–ê` Wœ¤‡íˆdœkˆša%§'­ë p¢{©Î—Ê|VdœHÿTB†6 +r@lÑ8wVBñ²8§–gþ(3R§iÆPȵª +¦®² e½½„‡­ëD6ƕ!ÊX@0×¢ß#‚ˈ«Rx¨àY­W]Í+(*£as3uI¼”XS¹^ô÷®w¤‹3èDýě{O\ â*{ +bñ£LœìŽ†Í˜›çúXƒ¯û˜={Ïÿ0хVÏĐEájmVƒ€þ?+ÂPõÁ¸÷i‚,,‡ÊÜ°—9ëùª/ÊϝQ²Z™æD°è5Ñ +fo֊w ‘Ìt‘F@ìâtŸnÂ7 +µs©f”æÏ ¿Pl`‰tuc7¦šg¾üŸëP½‘RÍ(æRÖ/Æß]·{úlJù›* +YñDðͨ}º˜Tôú×TH¾D˜Ý£— ^´ð„‹k'rWQⱘ åôËch*T«gêPڏºЦ8ñ‹Ê;ÊE©yæÍáËr ¶úëÀçÕMzx'DLY…Ãß?jfpe­ç£‚$j% a!ŸˆM¥i1áÚêc`¦‡Œ[×͒Ct¶˜ÇêÊ>0àäØdU&§Tǽ4iqQðeMê¿ÄCU]¾(!ŠDJÕáeÊD¯eYÜ+HËä¬1ãc8õűt#læQ;™±Ô‡ý ŠÊZ&á!hÝÔZ–7étô°æb½‰kì£çD5hârîBWZÝûƒƒ•DèoB˜§+ç5 ˜¹nÔ"vý1~¢E·•êÕ&7L¾?:­¹g°±øu&¡Ÿ•Ë´Ì^/Ý]£À»;«¥6©Tçn¹?«j´§Ÿitîe…ç%p”>Ôx è\ù–6” +΁¥Ye‚Ú,j³k³¼ˆÕZÌ×;›ÖÜ]#÷TY)Ì*ak½4ç3iPû‰®@Œ÷ìFÆ@X¢†“£Èä«LTmaágŠ’µ¬®Øâ†Íi’êZm~ñ­¯)dT™cƒ™1‡+ 8]*³ø¡S7ؕ·È]«·SIÿ}mÐÁJ?Éb)ò´Úœ /c$È9Š[¢T=PiYãXiÑ®ˆi©´[÷tº\†7ÜŠ32ՑµÜ•½-²tUÚ©[—j_êƒïò£Ýøh½ñê2È}¸ò°ctÄ[O­±}ªË vßb'²ÃB½¢½±X†9ñŒ/±• +0W7Wñ×q:¿x¿Ä)ï˜Ú¢¡×)ú+FꟘ¤?£vuÝ©}ªÓÒ5]õœknin„8+.^Œôez‚6±Êm¨xœ\Êd؍pé‚ÅלÖ0O³#õé:ÎÜ.ÐfÄW՝ž÷Zu¬~\ÏD¢Ó„Äô;B³æõH^§<´aºé +¿„uI^¨vŸ¨·•äàOq6¬Õ8„Ck%ŠèÍê0¦õçÌ*ªK€%o!7#OÅôe=îva§3‡èñãvçªEaô¸ªª_Mìa9T¬ß¦@-Õ%,Ž(-~ç‡;ÀÂ"z,Ó'AËÒÓúva쑷åÒÂá ‡O‰ oµ!^ãrIi‡¢AlÚ'ZL>ƉˆîºlÇnâx' ùPf ,º-{¶¨Õ‹^aý¥„YÌu; û™rsC¦n%tîºþ},2Á4ó‚9õA­Þyr—}Àç²¢h”5ïþD7/˜QqA u£(þB 9 c÷§ âe<½yCñî†Û´ðWû¹X¼k7Ðf,®Q‘Y#>]Ì UžÉ ½¶ÃÅ)Œ<“jELõ©“UÈo4G1bís’gh™õuîÀ;Ô¨ _†‘JjÃü²‰7¥"`(bÊ;J} ,Cb\©kΙ Ïh<‘wèfžAçþÔ ›M¤‚¹¾1èÒeœ¤p³ +ëä;rZ¥3œ™ô¯žv¦‡Ý +îZ¼8‹Ž%wu¸B<÷”v) Öø†£sÃê¢É“Å6ì‡Ý–4oaû tÓU5pa)’Vē!Í <3Åc7+š»WoëHÖ Þlíqª$ÂcY ³C"’{†ôĈp»‹§Q¨ê.ю+÷¤+3ÅÞ´¿‰¦[Y`Çzòöž#ráõ0­h2XÌM_1†”´øJOˆX¶ÎíðÕâö²Ü’>p´‹‡”nvmnˆÙ+W„‰ÇU5CSíã¬icÙC­º½{ºy‹&-–¡²‰%’KaÁ£†Ù¬=¿¬Æ`¯Z茀u_Þ&We (ùî2Cɸ"ÕeVñt% —œ0žîØÍcÙ[VCŒ—(n»Ÿ)W"‚‡ùpâ­P'¸êåR‚² >Ç¢ãbŒ`Bb°²ⶠ+¯ ÐÞ±R—8\~Lùâìs›¸I!éà’ü5§lN@Ì}?V$‘ ÏT=gûG|‹guÉiø,a§¢éÕ*Ý ¹¨Îq +Ž¸ÔlQ\MŸÿfïf .…Ò;ÌÀ·ou?’£‡ðÈq.Oà>4Úò'$ïsŸ ê#rìãòЗ yàv_6֟RÕ÷æ‚}ùæNÞ?!ÍÿaHó(œØ‰æˆ¾±Þ €æœ—Ä—³ï¢(ÎüÎýÍø~Ý0s8Èägn,sT¦>—9 Ì£ÕX’̱ܣHy™£KØQs̋{e'Æ>ƜûªÄaÀ‡ï‰,ÔoÄß ìHvÌnbà5æh-ü\šG&¿<:%¾¼: ’øòjÕÜN/ŸVÃË«;ª&»øG2u6t9PðÇ]^¯hfåøMµŽaG—3ãix4‡„T¥mrùSòJ.‡„WpmÓ©`¨Jþ1ÎËr‡*S’ +îȂ¶uãÌ絜ڊò¼AËٍï~&³õÊÄrþÕv^9mcL\9ŽQž{ÒÊoK wXù]NcV9ÂZê¬hV9Ýd‡ ée^ºž“TÞLùOPySIæŽ)G£Ë.“¡‘lîA½ɟæ'€äÀh4û¶ä‘w«$wùxT£—4rVÚqÊ9»«µÑÈÕ$¤Ê±ÅþˆmÐÈa!df§‘Ÿáx'öý 9 ’Â>+/Eþ†‘cÎFÀȱbb}ÑÆ"G}ãe¤³È´(çãv"g?‰¯(r™YTo`8,Š˜usýŽ({]Yä0÷…DÎN/ç^ªó D”:)jÁ!™³‘ÔE(”mrÌ$ ‚|xòñ„¾nÃÑ­IXàÇq:<ÐFGcp®¾>>¢è$tÖ£›‚¿¡ÇG …ƒ<þܱ +1xÕË\ÎoÜq0¹Ø ìø=Â/3v<«Ë7êøm=©©ã —ðç:r‰úr¬Ìñ;Â~¿çMä8 Á«œ8PäTMlàx´ƒ Þ8ՙÔë­¸q&DN—¿"Pۜ¼ Ö8ýLál¬qä¡øújrµ£]³aèÛ,ƒ Gڊ•¾¯B%gå ·5¦3ŽŒH=CJÿåþh~ 8>ÀÐrŸ!&õ.FŒ3Ýô™Q¶Ì" Æ@À8†zUÌG6S%QƋõ# |£‹—6ë¤Ô0ÅS]²Å?yŽ3bkU:<Jä7²8Š€¥iù¯Ë°Œ!¸âp8„nXqBdNÉ [aµ¸|Ž-n#¹1űb"Ð7âø=.ÎfŽÇýGö…¯OXYž5”Ç$ì-ï4qä{”^6L¼ÊWJ”8ҁԱl$qÀÊù6gµ‚Åá#WÃÁ'Eü6>-!â0Du/sÏ0ˆP°"Ä¡¦¸Í馗˩$âÓ°òã4ñáwÄ;ƒ~ß íðð;º’;xòf8 Ûð›ÉY¸Í‚âB NJR)#sÃI_zŽ³ºË„†ƒÁÁúý`†ßÕ9³ «¾MÃa8M¹`ˆc“fðI 'À¥˜!ÎK©Fþ+'A%VT8ÒÅÛM +¯ÁPx=ƒ>¿rÂk¨uŽ\Üåâ`ŽtWLÅ$Âò‚ƒ^-UODøðø~…ø%áhQ«ºMÂÙ³ÖzˆÉ/í +^Ô¬1áàØíÒafåÞwMç&ƒ# ÔXUf0øbå• ˜@‰æ ddqiÀ¾›ÚxïPð¤5®S‹è^]ãMq¯Š ÎÞ=‰à- +Å?œ5Üqà®Î4ð¨cNøá$ôÎ7Mr¢Àú¾/ì|ÀÓWkzàL-Wö_UŸU¹äþ0ä­Z)!ÀaÆ&|8³ÀCôüo.&üR}±ÍöŪöds3“c”`@3Q» ùÛáÀ7ÕÔOîw6ìwZƒú=ê–7c‘gŸfxX¹™ýé$~OÃüNcð¾KV¾î;^ˍö=( +¨ûÆZ‹z¸`}Œzê=å³8†Äbb}‹åPËd}¬A¾ž7Ö÷A$&Å)†}‡¬ŸÙÓ¦}ƒä Ix£}ÃMin«!ÉZ‹ÞžA® €ø†úƊ)’ }ú¸’Iáb`áúxã|£Üè¨÷I€„;YZõôâµl˜oxPJ!æû œ?ÄÛTw 6Ê÷Eä¨d|fp¿Nk-UP!%ýŽø.¦5$áû**ÍHÀ73©ŸV¾7D-·Þû*NÝ8u‰=W¸w‰F„Áö.nho¢ÍêLâh¨Y°7Ä-´ÔߎmXoø’ÒHâùG×ËH"wÛó±C½Óå?Ðk°¾:˜Þ¼OöÚfQù0WŸDïË5X ôÆ\bl@ï+â‹Áó†J‚ÅãóÆXB3k< ëΠ󾆏`y§(oEyCEÇ,HÞ( a5P ºÁdâån$o®O®Åڂµ Ø4l$ïi5ÉûŽÓÈû“#>]u L®ÙZ9Þê·ÔÏ ò¦ÂMæƒäMy# 6’7>^Æ’ä …Í ’7<'õäM+ë ‚Ç­×½Ô$yŸ¬Æ½ËÉïÛ0¶Û;6¦òæߏiÑÇÃwF3Aސr–à*vLýTQQÆy“!‰Aޔ…ŠÄb7éH,\Ù@Þ4  o>©Þ&Ǜ"æ€7Ž7…5QîÁ44$5¸œäxs~²Çf6¿NŽ7E·GÉñ†dH€ÈãM;¦.s¼Or–û˜o¼¡ªÚ8ÞÔj»„#03Œ‘o¦Œ0_úDfÁr`¼!—:á Œ7…Ϥülo˜Ì Œ7¥r äã-í«ÕVŒ7÷dUM`¼Ï^ÆïvŒ7.¬û€¢< ´Ë{`¼) bøJñfÿåø¬.@XLpyc¼æ¸ë¹c¼–»î ñXa}¢‚Ñ[‘'º"¼‡‰fIðVÓ'ÀÇy§w'ž®áÝ æ1Èün\'¤ß +¨êŒ0Î.™ÞMòñ¥J¦„w#êJÐÀ»¡Èy¼¦éç +TôJîFƒwE´I~ìk%µ{ñ½Ý ÝRqÌnFYËÌnö†'îhcvó¢Ë¡]•ÃÃ{\`Ì© Õ¿-‹²ƒm3.×Âù3g;v§ZH”†síÀnXYE¼nGqgáºñk*%ZhÝ'E‡JÔÜI(ø³ëÖã$ÍÄu‹²miÙَDŠGŠ\ ø®fU<®›Ò׌릡X¨6qÝ4³+pÝü‰špnLÁL¦ëcÇu#°­zÕÀu³vC‚X7£ÊÛʬIëf½+}׍ + ýzàºy“TjºòºÏ€$¯›Úë^7‹7T§°òºYB“¨o9 Ý%Á릅Ôč×MA-EÁëf(.؍¹KŸ°[[JÍ ì憪2~¢ ½óH;±›®W4Aì–×Ö˂ÖjîövÃ*·ÄÀnšÅgù› ïÄnFø$4±[ýXixD>BÜêqK‚IìæªJmHŠHôòå,[‡…Cõ†ì–ù‰‚ÕKº˜WÈnD¿ßÝlnC|@ »µn0Ä[ké+úlÈnu$¬ÅÈnÆÃôìæ2'ÛÙMí¹°4fvSŸ®oÄÌnZô1¬Ìnš«3¿ + vÁÙÍeeä†ì–äÿT)­²¾‰ì––ÿpÖDvÓ}d˜  Ý¸o·¨†v+,â‚ØEà„àÈeD·9ÐÕÓ_@»*¹M:Ih÷™ýhÌìÎ@K2»œaâscvãRå̳›¾"\ðbòeïÆìÆ¢òä¢ýVN*‡%²›¨;¾H²[‘åÑ&²o?‰ì>ï;è8 ²›EcR‡ƐœŠÙM×_DVd÷™*†@vÓÂÔp »?¯–Ff~ç²™È\)ORˆÊ£Âs‘=Ó7d7Ílpfd7~‚ªµDvÉoGvÃL8O"»iQvÒÈnY˜t[‘ÝøQR:ٍ)Å[AìFJQ½ W`73¢$]°{8—–,n €¬‰Ø˜ÝýŠü°­Àhéþ˜ØÝj)­ÀnXG¾8ûÀ@ÚIàº[Bö¹$hÎ÷$¬»ÅØ›5ƒ®vTws§ô$uƒWw8ºÎØÚ°sÚ@Ý$]?cZŸ43sºÓ°qº§Õœî§DË0ã·ÁÆRÃÞÓÝo‡ás3sæҝ†Ñ=­Bt÷hJˆn€8|]ݤ•_  QnUÄ™Ï ƒ¦‘ύý8ïžû ™QйŸÃoÿçîÑ@-ØÜ`à¨]¤Ñܾp˜ÚÈÜd1W…ðxi8u9œVúi|åŠå†‘”Ë rÃP]¦@×1åàvO&w?¦òiÒînW‰ä†:ÃÈ äë#ȍ0+Yääîñ!/É&>ÇGB±™“ Ï½Q±aV^)¨ØDp~¤Ù`s›Çų´rÑXlX”ß +,öyFþ†ÅÖºiԉÅfœ.Q`±E0Ú}é+QÍãŒÅfâYÍã¢Ø'Ws¿1.nXì¡bð„bƒ5 N´fbkÂv$öðžDl 4{½¸ó°Y=|µ‰ÃÁ´Ê5£—L‚n4lB1H®Î ÁádW×Àa/™¼•‡Íu…:ˆ˜‡ÍU]o‡Í¨js]çdZ3¶J}wà°yv×5iØôϯq}eOå,ƒ†M‹ø¡=j[ŠËnV6 YTzf6/½QovZ66ö4äÁ8l|¨ '.XUÉΊÆùRÕ"JP‡M¯jÃaÓ©#»2pØ]¨òO4lnÁG·á°yr×5iØçáJɤa³ +†£òJæUiØ´47À`±âq*¬¸Ó°é’×%\ZŠ¸r)iØ°¨2cÃas1}™{¢q‚¥Eše +Ê66—×%êÝå¸ ÄVŠ¦JÉ9Ø¿ðß Ä¦á2þº©CÞm,÷ÊÃF.ÕÏ!bg”¡Ûè¶mX»)ŸTlx “ŠÍ˜;]lTlFœØ^-°Ø´h¢›‰"V,6ƒ:À÷ÝÑøÚXlÄTèºa±‰«îȨò¤ŠYJXl ‚úê6,6µ(ÔPΦ›˜‹Í@ Ñ.f.à“‹M Vp±iQûŕ‹Í#RP\l†cT>âZ]Û´s±é 3m\l²ùØ30¸ØÌ`¨¡æÊŞæàbsd+ÀàbóƱÿÂÆņٝwœ€‚EZ¯àbsj¸6.6Í|fÁÅ갟ŒMEd{ÃbSçÉ +ôÀbCsı&¹ØÌ wj™\lÆÈÉ*.6«šÇŠ»†×ÑÕqåbãHҚ͕•š† Š=­æ~¡ÿQt-ç;ùi5ðGXwð¾÷ǎľx—Ϗ$bãa“¢•@ìæáhça7‡_‡ÝšNöc_c‡a?Ž>&ÐÚEþ…ýÄ ¸‘°õVXv¾81؏‹kv ö #c°ù¾Ü%(ØP»(?²B°ƒIœlhÐ8ÖWºXÌ·!°atÓl¤ Žgò¯™Ì×þº´Hæ™~ Ãp—\ M}vø5±âX‰}^'T¨å9ŽXK¯èkÔkÐá òu°¨’|}E£ð | ùҁ½¦ú¹^“z TÕؑ××~§‰×Wtrà5S\ÇóÆ»¾Bà¸kA0x¸ëËø“v #]Ԁ]_¡\ Ø5Òbìë½±®Q 4Ê$]#½¡…_%TÜ°³Îƹ®ÃdõÀ\3x8®I¹n¡LÝ ×HÕ1א̐®„ëfà¸n^$ßû1xk˜ñ¿n}÷xœÜßэ5ØÖ·ç°mv‡‘Í`Ô š›Þƒw‹~ðœ7®5jJV +k‹@C­»Q3;ÓkGÇïéFq-Y• ¯ŒÝø–n@k„r²àƒ5ÅÕÚÄÀYC.¨)s¥Y㊛û»2aJAÍ­>a”Š0ûµ²¬]@—$kŠœ`b¶²s¬[t} Œur‚bÝP¸A¬Ù%çÒ„ ÓYØí‰ó +pÁ†°†•“b¬TfÂ3Ö·ùB¿šÄþŒ¯¾ƒ ôê;¤¸¼Vä»TÆÿ]_;“e]æ÷£ÐQ€«áӑºÜjfÔÇÇN­Fò„‘¿€VƒÄÏ.˜Õ—åB;²úÊFŽ&V£.E€S«¯HQmÀêD>¯MŒNÂÀHɆ«¾¢?@ЪA÷ãh°ê„µo¬jTØ©Ó%I—¥è&U—æÏwU—P§º„‚"0Õp>ZƒT{" ©†A\1ªKôMÝÕ/O@‹Ó$T×x¿ ¨¾9‚½ó©oŽ“ žš… Mê_.¯()y,êÍ4ݍҿ£ÎrK §$šA+2‘74õ`^öüH2uu+´Sww°Ú¹Ô· ‰¥>=o•ÚÚJ­R[1©ILx$’ú!UæH D gúñB0pÔ›ƒQ[¿•,êÝ'Œ¢.Q}·£¨›=I¢¶Æ2AÔL>|âP32åšø¸=i%„ïÇéJ¾ ¡FmÑAÔÁËí%Œ>ŽˆZMõe÷*Ô%ü„àO³°ßàíÄO£þ¯©•ÖC|=“=ÝÜô=mùz §o†ÎIžÖ’¬–7ò´4.ýšäi„ioö@ò4õ©GXR«EÍElÈ8 ,êŸèéÏ.û·_`hî±&ôtu–/ÉÓŠKðô]B'¼r§›ÓØi°CÔqÚÔé;Êb7è4"ôd‚9 4ˆÒ°FNÃнÅ\ Ý!~0p)`Š»‚7Äit+š*ž;J¯‡ –#ª)Òh^‰ÆdM?gd½e$η^“4=NE$vÐ4¬`4 ƒX»Îp¹Ë +ô 3= ÅIÊ4ÊÓ"ôfø}6ÆôãrÎdL¨üô‰ŽéƒÓÐF˜î&a¤µ¹5ÓiØøÒaM¼t÷\ŸÐhˆ”¹–ÞàÒ+DdësºÓ˜ÐÒóϕ,ÖK÷ÐWºtuÃJCp]6‰ªßAO6T†hƸø²Ñs&Ò=ôT„ë·«PÀ/ƚ̓F­•jñ“ÆwÔܯq¥ŸÛŽxð¤i(mâ¤/?î7š4ÀGü “~j`·“f/úû~cI©ô¹QҐ™ƒ!âÇð•$¸²àH' +30ҏ¿Þ"ò­ÓK£²•hɐ†¡8b?Ò#"P45ö}¼q¢‘Çb|Әhü͊)S¢ûÅæ+$ù±¨8§ò0,ÑHµ±{#D7‡×“Ý¢ì.ÑiØÑÓjHt3K* ÅX!3ê´!¢Ñí@}”=X¡Ð+À˜« wD4x]·o&“rX8•6ùÐXQ©qኇƲ ~\⡱zS½• ̪e;ú¶Š$ÙР:©i±ÑД”1•?ÑÐÍj¯$Cs™çâ?փ2ë¬ý”ÛЏ;ÏɅŽ¥qr¡¹xný …6qÏk (‚¡ÐÕJӝ nWœ;?˜ÈÊ%úÝ5úò͝¯ÿ~‘Ð_#=ÿâñëÇ?ÿW?ÿ~=<÷»¿áÿýåÿý×?êg¾ÿÝ¿þß~üÿü ÷ññÏÿâÇ¿üë¯ìö?ýö§_ÿùóÏ?ÿ~ÙádAøëµý¥ÝþÍo_¿ôï~û›ßÿUüÄ/×Ÿÿ͏ÿïoüÃë´þúo™½œÍëüûãß®'ó‹›ÿãüý¯_wöþ›ßýüû¿sëó»ÿüiã¨<ù¯^çÿòãoÿÓ_ýþï{¡ñ»?üí/>Ù?}ýõ/þÕõë?ýù7ޝ††_ÿÙï~þó×Û÷û× øÝw¶ÿËÿÓ뜗ù՟üÙæ¿=ú·ù7ÿåoÿ*õÏþìÇ?|ø¯óøÕññ/~õ'ÇÇ¿ÿïþä¿à?Vì÷ññ¿¾þëÿyÙþðQ?þõÇÿù¿yíñïÿâWò]úñ??Í¿·½ýž¦Ã…‰¿líôýv¬×_?ã‡ÿ÷×ÿ¼Ffâ´ -ú¬vQ¦Ðá¥ÌôZ^¾Öxø×Þha„ 8.9V€Ÿn˜¨³%™ç\í0>’½Œ(À(o6¬nt›#iýÄvTzQ¯Ñm;…0êX„ÃOÜ7>ýÚ;û9,ö<ßyÔåÂ>߅×þ#nqG÷4àì^«~øuláƒÉ™hø—3ô fäµÜ¾î‹¬ï 7÷<>þõ¯âav%;}‡!h:îÕ£+Ú^FŠú¯7£º¼Å^æØ _ìõ2ìç`ãóEÛÎí¯yÝñOíå„ xE@£8þµÚ}&¬]äµv¾!.ÈçºØ‘Å+íc?,Ù×Ç~6þð 疧ýOïóý}®O-ÆÙ= 㼖ùã¯í¨¯òÍ6»¨ãíOÅ+}iñxQÜòûýþB9€Åv§×\ëù.¶íÚ¦}¹ó¨Ë-›§°ß_àÎû}ã"ªþþØÒøöŒ§}¾yÔõÅùtþÛNjïx6]ÄøýæâÔÛñìçp8g´žìbÛ.lڗ»0ºÜ¯y +ûÍÅoÀß7†7[Þ^Þi|{ÀÓ>_†<êúÖ|º ßìå½ÕÌó}L+à¯öï4ä d¶i‹qÓûӖÃÎ1m9‡mLÏ ú°oÜ!y?ì4îç0íË ÏÃ.—öé>üã'f˜zœŸnf˜ãz;&“ÊïeùÅŸÞbŸ×²v^õrÛ-”ØñÜ6E«»í°Ó¸ŸÃ´/'<»\Ú§û·hÞ½}BŸ{™Ð狱Lè‹q›ÐûœÐ—ÃÎ }9‡mBŸ{Ý8_Œõ°Ó¸ŸÃ´/'<»\Ú§ûð•·h¿Eóq/Ǚ/Æò‹‹q;½Å>¯e9ì¼êå¶[4÷ºq¾ëa§q?‡i_Nxv¹´O÷á‡ÏŽ +IxŸý›7׃Ĝþndueÿä§`òDža÷~µœÚßý”uãézÌÃNã~‹}žð<ì¼²O7á›L£svÞnít&æ L¯c9ÓŸ]ÖâºÌ{°8>ón-þÁvkgbÙxzËKãÛãöå]ÈÃ./ÍûMøV“蜞·»;½‰yÓíXNv1nW¶ø.ó6,žÏ¼a‹ƒ°ÝÝśX6žnÇòÐÒøö„§}yò°Ë{ó~¾É‹;?|A=Cóó ûö¡_|ï£Zy}Šõâû'iãû¨°n݇9ïCï?>{—Õ>›ÿ‘ ”›§±7·d±Of9ìôv–sØ\£Ïç6ã*ŸWM<ôõ¶jâIh½1=쟹ã‹}úîËa§—}^0m¿¬óü·ëþéϿكº¯`ïõ ‚½¼Ÿ¾KXïÝ/Y½÷÷ŸŽ·}ÿÛ#’ûr¦ÅûõVÍi¦(žh»g°G½l?ßlë2ÉÈÌp@¯ÛA8xÊÇvaœ“Ìèýmc‹Ý·ÃNãv +‹9Ïvt¹¬Ï÷à[N1Øàýîžæl§!j÷½ïb[/mš—Û0ºÜ°yûݕOSÞ6.âí-ûžæù.äAחæÓ=øVÓ +YÞoíáÚ£íx×þâ.¶õº¦y¹ó Ëݚg°ßړmÂÛÛÆFPíO,ûӝæù"äA×7æÓ=ø–Ñ1Z<ª^c‰k@C9íßi,.½Æ8õ7#ŽÕ×è˜íUõ3ûa/‰<÷s¸-þ~äf×Èuã.õï~ØiÜÏaڗž‡].íÓ}Øâ·<æíq½ߎùµû/.Æíôû¼–å°óª—sØn<„ço»ln?ì4îç0íË ÏÃ.—öé>|›…{¾'sé3Mô ö7'ˆí©…ñýÍY7Ηa9ê´ÝŸÞۗ)]¡ù¨æòašòxóá-?|e0ØoÑ|ðËqæCZ~q1n§·Øçµ,‡Ýƒœ>‡OAN½OoAÎú~‹ã~Ó¾œð<ìriŸîÃ7 è_Ÿo/2Å$„­ç€œ2Þóílãvi‹}އå°{ÞÜçð)o¾ŸÛ–7ï-9EàøgYí>“öÜûˆ»·áy±Ï±|9ìõ—sئˆÏçö­†‹éNËGü´¢°y[%Ðut6bí:¾/)äéf4ÛëûÄ»Coãû’bÝx.æa§q?‡Å>Oxv^Ù§›ðÍ¢Ùò¥·[;=ÿys‰°œébÜ.kYfÌ{°,RæÝZ¼ùíÖ.®ÿ²ñ\#,O,owڗw!»¼4ï7áF³íNoww:ÿóæ*a9ÙŸ]ٲҘ·aY§Ì¶8ôÛÝ]¼ÿeã¹LXZߞð´/¯CvyoÞoÂ7‹f·ˆï=ýü<(„}ûÐ[+o£q÷óiT`•çÚGÆ÷Þ>HšÞG„¹áüÄç§qÿõÅ>Out¹¨ÏwàÛö{;¿ßå4旾œðbÜ®n.æ­X›¸e˹ÜÛåÛÍ ç7¾<¬4¾=Ùi_^ƒ<èúÂ|ºß8Ä°ßØùé.ç0?òålãviËH1ïÃ2ÎÄýZ>ÆåÆ.Ÿmn8?ïåI¥ñí±NûòäA×·åÓøá\ý·?ÿü—?ýø›þXý‡ÅVëÁŵ|迎B¨öw×è¬ZYíß¿ÙÑ"ŒÚïߎóKöå8?û<¿Òv;Yð%&–É.Ú êüm|ý¢Œä2ÞǸeÀ¼oáK<Ÿ痓z?lҘ_Ñú5Ñ›Æ&¶ƒí½çÆÞ´b¢Ö1ÖüÚ ÌsC—W>è×!Z¯WœJälE_*›®û ã¸ÃxðžÝ䨱-jl|â+_¿~ØcÈaÓ¶àØøô«—0o)JœÎxeîR㖢Ìîna?GÜR|ÈÍÏqœúà`D ,OƒjCÆûôëÁF_~áç@‰Ò»xy^Z‹[ý ‡zôžÀXÎæçˆÁÍÆzÇsóV=*yöÆýöÆG«'ÎâÁ h†#^dÁóñh=øØ8¾‹'óÕ«Xߥ׉>:jóUb¥£Ì(æý>í5ímÄÛ@š‚Œ1d¿x>`–·ûl„û)í×9l¯-`DªŸÙ¶»øyuïæ5ó±©6Þó ûøäh8ß&´*:¿±½ú3`ð'Œñº¼Byqã¾XjhûÃ3áJnüôü¹²a=‡<½ÅU”J`4Ù ô´³ð0]›òÜ~4wÅ*ÒÆφõˆŸŒ—çã¯ýb~ƒ>ül®³Æ8; h¶w ¢MíÏÆr‡qÄ«=€jÞ¸ …=~Ž_ÒWÏ!ï ‡O lÏùSØ__–þšœú‡ŒvøòUÛn}Kü/ß Éb®:¯âmO”©.óÑ×Î`ýîؖF#(fÑüðæðyûC*éûÜÇÃzÉü>Î9þ–RsÐ܊ŸzFmcÿ·Ÿ_oÛ~Õ?}͌aö“ñåþþ‡¼õÎÈcµìãŠñ >äˆ9ñu;Ÿ_º÷:?ð¨KÌƜ{~JûÙý&ܗ«:ßú»ûq…±1ó-^uÚË÷?w¶ê ý|Ó]éÒþxf¸Ò•ˆ©ÆŒÀÁ÷aÚéC½Ö[ò±ºê}m´ãôéÈóž@$>ʲýOa·gÁÑïѽŒwŽ~¬å ñ¾òàwÏ{†Ã¸óôrã’#í3g‰‘Úƒª㥏|Å)Ôø0Lÿ_½ˆy}èuôåJû1'68¨4¶óW6ö¸‹¤/q„l/-6.鵖'€5uû¿znßçd‚nw‡½z!?…ýBk~y_Sìgã}—y\¯‚âqVW»|±t²d|]¯«Üsÿ×MŠÇÎ)蛆Îæ¯ç\^.FE–3¹`ou^ZÍï†Þ“ï×så'öZ eÃî©;‰—S··²áRuêÆ×'v.Æ<Âqäz][\8šÕ /øâ#W+~Uk[®â†&ÂGnË'Њ¦O´Œkq+ô–ó%q€öûu·z÷]ï zÓå“Ðô[k~˜pòõE§½Ñӕ{ž¸¶ EÂîÃÎ8 åYmœÖèÏràÚóÊûð G=òôœPp€ÚÃ~·ËϜW!Þr´˜¥®«Í#Ìx`¬ik.³ðî#¦¼œÏùYp†Œwj¼îú÷a¿Î§™®“±Üq'Î82òg†Ïü\üŸЕŸË9^µf+ÐmkœÞåõ +Éá‘ÁxJ‰è݇Ü̗±‹‘§§á5?èiOxáµä}»€u«“ÀˆÆré¿ñ¥$%í‰@ϙ¯5Ð^÷vMÉXr WhšÆ9jܯEÓ× Rbÿüø»âv1üά䈂ý3364ècÛ;?ñÙ±§ñ\æLî;Aî<@±ñq<éIjŠºØã"‹AÏꛆÐñ÷a>ï旘ÎŒ§Ác6Êx¨V/îz^ÊõbFC—Ûrd½¯ñÄr1û:~L&h{ÇPó”ùb"£/D ä€ìÞñØìàéx֖î7‘Ü÷º•ñ¾îœ`ü2 àh·àõÇ¨_ê<±+ç´³ÕG%B¹Ž ªJÜ3„`çËò# +‚ §×•:dŒi}s‘`¿´Žƒ'=b¬C+s»ëp4RîÛ»8Ç­ÇQÂ7Àp’_!¬%rC½É-g??c‹0¢qsøµ·W¼²×ŒŠ{õªš¬¶½# QΥɓÞ6dgÎgöNÀ O¼Á ”ñ:âÍ«9Îá¹b‰¹-ÇrÛטy¬gä=¸3R‰äD<ù¹ê¬Ð%Þ¥–c}©Êúí?½iϑš`s1ŽÄ<ÀýÄëqå¶õ|òë™Æ«¯¾N ö¼]w|ì~¶ð–ñ}†¶Ä‡}Š˜ÚÀƒ¼ã +ž6o-FŜñÞ~ö«±Ð=Û4gIGJoñéë‡ÜĂó‰Ie~'=‡"ãZB:”äAö;ņëæÓf`þp +ãµfå–Ý-xRvìÑ+È9ÌÆ£„–·äà†Iéû°Ÿy'=sÃVÞãBèΨ¼éÖDFàCp"„¤ÆÙmà¦MÆ]€‹#ۃ}x܀ʉÚE)b<¹‚¤ä™6ÄÆsÚ)±³@‘'ëÍÇ6c@C§Ÿ6%hBít¢ŽQVž°NŽúËxs‹<%  ‚n’ó !¼‡T?4Н¸{ƒ8Âï¹$2~)7P±-žRŸó‰8 CÊGqB¬ô +ÏÓWBÖ(„ûàŒTxÓ¿fìÀ*Râ)Ï\+Á"†âòþe^¬KœMĵô±žÐÒ9œù”nd vHc<,rìø›@í£qóÌ÷Ãr$°‡m¦„™ažR  ´L™ @ká”bD‚ŸlZKXaXp 5µŒSû¶÷ë´ !#€=C1)(5©B’¢d ›Z… wˆ°}IÈᷚíŸÄ"áV æÆ„@°‡U{ä!0j¬™™Ê4# a ý&ƒŒ|yÎh‚#rñ¶ˆÔ%Ÿ`<4è#­åcÄrïôdt< Z²£Z‡ûpwË)Á3EüÝM!Ðd$ìYv*=Pyâsspº¡šMB¾AÂh9®&."/FÞ8`Â}0°Ž0d8×~Ž1(CÎþqÈÉð±=…ÓI=Ð-ž ÊËњŒ( R +”P’‚¤ E¢©Ôš€«O¸NA–’´'óŒxV†×çòÔ2ÀÃæPZ0«àXö¹.VL.[áBñ3HòN)Q#u5W|ã48¬üPàjê5¥7Ðۆaû2)²È½¢ +î‚Hsæè>4s½qì?ã,ƒJ‚W0žº¢c:Ò¹2ȋgî+X¦xF ”‚Cc¯*í Ôì—åÀ„ ͑ü¹ãžÐ8“̾S²De:¼3 ó̀dMˆÌ§-À•O|ØJzՑå^('Ñà ?9•æ åþ´ÅPâ\ԞsvNJ UÐB‡èß¹1 YÂë;™r׎ùcHR̜Ԋ¶k%F·P, ¥’Û2ã2yˆ¯ËãcÅc€ô Ég¤Æ$åa”#¹ ,ݰ̐Á-Ԕ0F9Z˜ÑV9ýeUžHp/É:×¾-ì‚(R¢‰Ý‘4µyõÀ.g–í9+%8•ö„ÄEâX:dYIw«?žÊÈ +ǕI3yãð%ŒBÄߊ(iM„~-’òׂiý/‡Z[Y\…ž Cö +äB¾»l[’(.Ó mg" H¼!|ܚϼ#Î÷LõìW¤Š§D´jè¼Â FNéP’™·a½ ÖtByZ9çýÈ'øµ›{D7/t£HóQŒ Äz§EFQ ™P¾:ãHÉk’¢‚¶pQÊQÆ´ä\D#s™ÒˆíéΑÒxŒæL N͋\µ»_ÍÁAõ}3ljNœ—È5¦Ð)`RžA’É2q~ÉB€^Q„ÉÁxÉ9‰Ñ:‚‡¬Jù2.þØȇêZ‰<£ª<•A†˜§ñY7™áP­ÄÝjêÑfü×ÝþŸÒ䜢”A¥ÏRg¢rTcý.môþ¶ÄłøC,S<℀b€ç4yðš<¶ržËfà$"þ€Æ>ˆ¥—êá¶VA¯+8ûFM¤w'‘Ê‚ru [(ŽÐÈ\؉Z›&iíhÊ$Î9Ëv9eu‚K‘ŸÏ9ùL²d—&Ô}e^ÂMi·¡¥*H¾!–hÊ9…0ٙeê‚òßdæÌÐˈÇÖ'½€æzá Ë xçtÂ¥Hƒüz`’XåY‘;H¢dâcۜ¢iå%HK˜Žì4ôÚ%a¤â)©iÞÉg%¢Ã”(,%e¨QÖfH}õðLðb7¤ÓFçmA¹¬°!œ„“å:£ÆñZ£3ʇ ùͨÉöƒ Ý ‡9Þ˜Ò1’RìI'kÜNrÄì¬S‚«„(Æûffs ¨ù–ÌtcV¬mJ/væ’ò­p¡qß´w¸$e7B¶& •Ü1—R ýbnÛ~$G‡',³åp÷)M±fkÓ =\.•ø̮бºÒsÆ*ò0ÅÁŠ›ø9l\„tÖ`¢ð9…>¿HÅ[Öýb¼Ù‹€¼‚qÌ©æ½éÍ2Šüš˜ömCrą ²‚¸Câ•k0ÔÈ<£ + (-=ÙÀ4Ì+²¬¼ ¼jJ$IÆÛÊ3¸¹’ZFF$R“®ªi¶Ü&z04ãÎd¹f-ۿ׀´²H<ÃÆ}àä©!˜rÿѶÁ¦ºPF@f~”ÅlŸrÊþH®{ÌÐ=c¸Ãþb:Â¥«ƒ0E¢©n7°7,Í`À#Cž¿ÝT™f™x¬šœ !ý¬ðJ¯æ9î'þLŖtú±ûÒ5Në÷+&#%3…5ÙWeA„LbK*ª->-Nø¦>n ž§­”GIg9«¡`ãÍ8-4T#Ë­‘tZÒnÊ#U4ñIñ9XF²x×0æ<§Á4xNàew`CB,ùB’ˆg+#Ȃžºp<¬`À, ïù¦Š(…·ú=¥¤\2äÃ€g“ž©ˆ˜äˆHRΙ$Ÿ­  jÆÞÃ)š”ÖÀ”–¤K+@ÏM"(+W2c°;Ã,õ¡`õEysø~4IÇÂ%Ø'D±GÅç}«2Îô6h¬^ÁŒ)I" >dy¼÷ÈA,¯jéNˆ5¥2¼KS|~¦Dj"ƒt–Z”¡Ú¸‚#-I µWÔ ïР¯s‚.:J’•{3Õ¿XƒÀ7T+,€÷СXVÃPaoÁƒ p¬¨Ö‘j:Q\¬¢sn:kÕ5 –î §˜ *™Ÿ¶Ø|ËÙS¶sꌃº¡Âªdƒ¤r±ñÂgDÆO̱H˜õacðù¨rf¦`Ÿ¤ñVŸ¨!o Ey!2g@H,³fàQ†rA…$_ž%žÈ’ÃñNÀi™A@zÇ A"1—~R‘§)U9a0Jò)ëŠ^ðºÑ9ËEÁ^pÝ®BjÊwÚª”g&X°}Æ'ô|ƎÕ$w<Â}‰ â2è]³Hšx¤ÞÅñƒ|”ù¼ ÌSšŒ(‘|ș0Š‚6妉X1,B`溣®²$&Qžmâªã8`¨A‰rÇ`¨8Õîm)Q•B†A˜0†Œðâ é÷wî¢ä;J%UüòjtœÔ ŧS«*1–¯ñùˆ¤ÅøKAºöÕPªq=0 Aß=,*‹ƒS˜p¶›— "åÜ‹KHKÄJ +(™ñ†©• 1jTüï•I´’¤• aFå)1& ¬ÈÃm™h)G¨: ¯%€*?'È@±l6-aâ®` %btàY±Túœ=]¤TÒ/ϘlÎäû&ÀdÉـX?Ƶ§Ä?(òJK—ÊlX`ÆuÑ0›Ùc†jŽôFj€@»´Ô„Öç5 ÆÍëY‚ÌGSê И-IjH!9]3W*ýó:b„Xzà”àAmÁI8”Qï”uò¬‡y)=±¡¸@ |¦£2wô6# k82u8J¥!¹à§½^hTƒDŠ­@2òé(M´YÑCï—:K²[B†3rSVð]MÌó•‚ÝLi˜¸,2OR±™QÞ·[®œj,¹Nd2O9ú 9S‚"› ëƒ%y$” -‚n¥Ö'‘é@%n+)H¦¾Ÿ9ÎNCS¸ÝçpAd€ûÔ|I +(Û#\j>[40š‚dyÁÝu/SœGô :÷/.~^QŽ)m ®{ 4É ’jN@´à <̇àȸTs¬˜G(9¨.ԑ0‹ú +eiTãj<æ428’¨¥/L* `Sò88ó`Œ]ô]Ë\p¹ŠrJ‚”tš`7¿`”Éyíñ6´-}t,§VoÛKVÞ(‡ª‚„BÖ>§[´N#¶ã KÁx~ª 懶ï%`r³ 3çÊÕXöž“cƒ‰f€g\ÏR9Á€†Ì\ڗAÓI  Êé*ß-"/—ðe¿´ ò18¡ðŠˆB,”pB‰–T··€ï¤<\R†<ˆXQó”àÁ*—¾( Yõ•BØj[p.1ԪḉqBY¦b cÁ¶ùBóδÉêäb@‚%°J•öÃâ›øyÍ«ËWF•€¸¬±¯Á À„]}FQwó,‹µ4YS]Röð"P‡ Ÿ³ªÁÀ. ¨Ê‘¦ú.HEgm*G’tPAô֑Û,’Î$IêZ»Lb‡Ö% 3’˜¾†¢¨M°ø`ù%Ô¥W6´‰ãˆ +Ö¦Î6Ë«^šsÿ¼šŠH%ÌPb` ¡†'„C;˜Ì¸˜©Î «J‚,›G]p’J«"ÄøfhÉҜŒJ"ª$„ÒŠ¯À”RKê¯jÁ"iÂj)À„ó„‹^iI©ÚSÊ<ãŽÂó’ü˜ìzJðpZ £Ë™y˲@_­%¦B̙Ò,,gԘ8¡ñ%ÐÒÈMŠÜAå/ö±;×ËkXÉցBñXLÌõσ­‡6Zæ xêŒb»wd,bµ@œñN /l–JuÊ_ý`|¥rF YbÌ57®:ÓH‘PsF€“ÀHŨC4NÀÀŽ#4›0_/#nœFb>•ÁI`©7—ñê(ØMOՇ-Û ¹L y>ã²a§ &®´¢§cJ:A çaâ±È‡#ªð²­Îc›T®¸âßà`´ˆjÞeLœÔWÔ±õ*¥Êg`à☚P + +rŽÔ‚ùFæ †˜P60s&íè{Xw\R0 ó$t“P ¯èˆ€ +†q\:Ñ ÖaÊ¡:ü¼ˆ¢.“ÌÔ&‰j? 5˜oÊSJš&Tc 3 +ƒubH!õ3TæXÂʌFA¡ÔQœ|ìØ4d™Ã¨V 7cª¸f†¯¯jjœEÅᜨ`bm„cFd¦Ü3š;æKrfÎí¡Øèðࡸyû-ç´°=%y€g† ¶Ä +Aàb·¥ñ՚Üg#0‹•§If¥ˆöž—Qð0pa\ԅԭug® Ö:Zëh†§©#Ó=RCØÜB…n§³Äþ/oÕ¦ü1œN÷š(ÈÆ­Y JEDeéKa~ûƒ¤“RAI˜N%>›b…‹ l»Æ’¯.‡ +Õ8$-AiØ1Fåb¼ÜáA¬ºEöLꗌ‚ÓMðð¬¹pA)®@ëQ,Gä¤"*m–§lÅÃ**®i˜üµñ@qexÆÕr°–{Dc*õ拺ŽP-Îiö˜ÀÃuK«\.5ÞçKs¦‚ï +å1õò݊”}š)$ER]«p²`–8kX +v(Êö¥Š›Ð2>ÍYI}x¼¼¦õU õ5~ÁÐ’‹¹Ò:d)· …,¸æ¶S•ÑÉ*.²ŽK‰jy ­Ð¹ŠE®Rª8YŒÝô^ঠ®Ì{‡ñ à¢îÄÔ +…¥Á6vT )'35=7áädã«Tš5÷‘pm,’{Mîñnȉ¯XG¥Ä0+ã„8ZᙄôÙ󌊆zÓ}ñ4é +Ešr Dï +–­)?¹ >âJX¨á$Hᶚ ã›\•„i*J΃ªnB ¬`‘Í€|˵trM@s±ÎLG4oe4`:`(m@žláI„C3=C&}ÇðA*ü >à¨Ú•È˜i¼5ìÜÒ3&.®kü䘨b)v‹1„ŒÏ\2ŕw2¯ýZ äk¡”‰Só¦îF•¼4UTϹMªYè3:*èƒ%‚}cAõ…¯æ5ÙS./h²€@QÌ.Tzÿw,/:OHÐ œZÃzSgM*æ²XDŠLÈN§ØJUb¼dï(V¹R_G»ÏxQãY¡]Å ØGM“Ö f"Þ<ãÄlMÅw  !0%Õ]‘¡e¤ˆ'”Îì˜%¶¥Z7R +ƚ ï{hœÐ:ôUý [œ¬tFƆ—¹5áÔ@8xþŠ‚̹äo }\B²²‹ÕŸ,cpµ|ðu Œ&eÝ ëáU:RÃ(TÏå: &½›,Õ$ù4•‹à0Èå×qD²¬á.ÐÁ‘è_†ë+Ÿ°JVUXoαÈÞ¨‰06û êJ QÐõÂE5¬,úËMˆPZ£,JåÈ…*3ëÁk«T^™¸_7\ã‘T—Z*œD÷ø-¤–lºpQQ %Whðºr®¨äd“ú¼’šôP¶Æ…6,}dmÌÊC)^n¸¦t]̇Òèi=–Óèj¾…²|5Ÿ*x›ûÃJÙ ¬ƒï\d^ÅU7èÒLh«3FÀupérᾪo¡\_ÕgX Q‡Å[x(rF5¿È‰üŠª7Ô¢ð/“g{Ó!âà\MÑ- «¸Äá֕†Å•ŽG\A!r !"՞ÆWTUkßñU”Z pCQ¸A §ˆRðæqaæ,M}¾ ĺrá ghòA¸\å3áêyËå÷|ï– +iÝ<ãqRº]!(¦&áêZ¡–ä¸TÁéÇPMÁ­Gx—Áp˜ÚœÄw +ùÍ']4ptÑU–$ëE¥1ÝF²¦%•ë÷<0š­¸|¨¶ga¾eTÀVB;Ý5ák$dAc/¸¢3¥å®$h‘Rñ*éó£ É­Te¹a¡Çõü¨k2*ªG…ê=œ/¥ŒjÒR7T»BDÅBøʈšƗ"/<úQI }á²÷ÀŒ…+ª|R× +endstream endobj 23 0 obj <>stream +~i¨FŽ…À7¾4cœïÖ\ۋ/\Â{Ýû•ê ‹èÞ¯”•1,Fîü4TL˪6’jâø>‹xox¥vå£ÜO)_“›Aa~¾q6ç» sÖb] ~‡œÇÃÅc×v:TÙ¢û³øwÉS]ßB·!µ’S°“ÐmC~/:빚B¡8w—²å¡¼ ›Ç|±GÀ Ù žˆ¨‚ +©~t+¬áZdI¨Ž´Ô·øPJC@œV2J>꛽€¾q0T*7‚ÌrÞñó}Cá3Èac…Î;µ=’Væ8€fãæ Ã{oò”“m§Cø¢/فâ;½Œ9¼´p!²îŒLùi,ÖWðÆTQÎfÎÅl$ÝêR‡'0Ù$Š~0a\P¼Ð)ÌOLTü0 ŠpºÏit b_±f'ßóÿ +Ž‹„‚Í*øÓ]m( +&Ãp¡ZÄ|àA,gÆ!b†ïÅØOC‹ä/‡pNvñ¦Þu#`‡f R·o|ÕþfIDË ©¾õr‚Ä«#¿fUÝ<ÜxŒqÍ.œÅèèÓxÕ­Ut¾þ¦óëߖ>õø‡üüûÑåñd>½~ћÍÊÉ¡ ç?G/&ƒÑl0z}täáÇåëÁ(þåË/~ºÅßDâ~<ûåÙÓÁТúò‹Gü¹ó­ýö돧?/KüüdП Æ£Þäý†Ÿ¾ë|ýÛÍpd<²œ .æ³rúMçO¶áãɤ·Ø¦=^NʶG?ŒfáGøgöþ¶Ä¿:ùê›Î£ŸGƒ¾…ŸYÜ£×Õ¶o{ùoünp9»^ßzÔ»qmw|ó?ÝÓЎd‹¡½o>¬÷{2¤ßšé·ûÒãÎ_¼.¯†½þõ¬üko4+ÌÎú×°Gç¢ñp—¶é¦B£ûi«­v]^_ÏšÏ µÿS³ì:Ï'ýòñðöº×|ÂGÍÉ3Ýß¼_ ç“ƃš”Óù°Å¼Sûûœn<²éìòIùvЃn5_õ©†«{ÕPĺ¡Ô3hWå³Þ|:ôFÇg4Âú™ÙñI»lqˆ\Þã)ÒbD-NúË{<ê[q}a…ã««i9Û¼}î†!Þ'«xŽ#Ýg&ašsöùäª×/Ïú½aق³Wžº¯9± t»þx8ž|ûîz0Û0†Ê‘ö¾Õˆ]óG¹ÃAMoËþóù†¶Çò•Hš¯FKŠù°7ùþ·Ûñ¨µäò“÷6ÜÖ£=¦³Þ6£ Oî©Òt$ûŸÆû½9‰~¿G‡h5¨=±Û˜6cjm¸¹OAçÅx0š¶2VüéãõæÌïíS¬ï³¶MD¶9·åým‰MF4¨ñm9éÍÆÍUîè‰}‘KòÖN©o'ã›Ûñt£.°Û ¤¹0õ¦×xsL£ùúfÃà+#{1¢ 6®Êˆô>ˆðoT‹©ýáyûs÷&ƒÙõM9ôôaì$©g“Þíu‹‘îˑ<Ì^ô›4àټ͌ìڑ¾…}‹e|Ÿ³üc9y]]÷Yòj½%?‡Iú¨ÙŽ`ŒWã~¹˜ËQ¿¹×Ù=ܔ>üª{Þh|6ÌúN…ŠKš¿ ˼µòн±¢nÒüi<˜ÔÓ½WO›[”ö[;mΜÚéA;Ý¡™:h§íô nîÇ~h§VX~R^ÊÑù†0·-¥å}(›SbÒ»Ì[ËÔþ¾XÆå`Øk‘9xàŠ;ÊOn¯ÇÃñëærï-nÇÓ[ôãkN‰[<°Å[|˜lñûÉørPNãg!0–v¶ŒñÀŒ±c<ˆŒ_d<0Æc<0ÆFŒñYoþÇLû×åäoå ý;ü3*'É=¿lòPžò°é>Ѧ˛Ώ¯9%›î°é6¯'aqž+fzã<Äƒ‹ôl5¤½‰õüËxøûMoZNæ› +©íUÀgnò™|>ìB)‡Büw)tíþ"+jº.›‹Û»&Iî9Ü.ÐpD‡Û>Vq¤IyÙ®nê¾qûqƒëö—îÿå WÃñøÒß)p1ìõß|×q ñm¯?˜½ÿ6é¶9°÷éšôƒÝxíF·gûî),Ñ}Þvp’/vÄ;Úr‡d“]c‘ÓëÞåøÝÉCf”ŸYyp·¢ZÞïTyè¾Öb»ûœª—A5êâs÷5Úæ3z9¸ºšOËö—ç,=x_cý<®'{zº_Cöl;¾tøíÜy£šïÙÞy?.?p_“ž6¿É¡Úoí¬ïÑ#÷5@<äšWþÛ3‰îÉϳ¹Èê‰ã!á«ÏK;È%{+—ÐՇûD+ä8Ü'Úl´{ŸèA@Ûí Ÿ}ùìpÑèÁ]²î’m„–ƒ@¶såî„G¡Åe–{ráh‹Ë,Žîþˆ6”“¨ŒHÝ߈Z÷æ0>\8úŽåÅ£{t&.?œÉ;½êöäLÞNÏ:œË;u.Š{y÷c`‡#¹ñŒìډþAAέ—ó}Îöá.ð‡:Iµ3û¼ZWî,n¯Üù|.„mU°¯wîlç$Ûé±é];û/?>Œ[…nz]óRAût<ˆNâÿ[÷‰!ÇŽ[°j¿G[q_¸Ì3ûôts°ãþ3L}û±ÁÝm.óO¼Ï"óPütwÝÑÃ+ŸsÔ\ ڗú9ŸÊúv/ƒ{~/¹ê÷É<ö¿àÌÌÙþx©x(g{y_8 +¸m`m¾ú ..~Q#[MØ>®Ææ ­û&ý‹n‹Tăü¿+;ïa¿^•“§ƒÉΘ€vmög½‹3¿O†]Ùiî#B*üÒÒr[y螙ÑÓù¨ÿrŸ¹ÐÃ]‡Ý¬“t>¯•øì°wr%ŠÏ%ïBˆêgP•àÕ¤7š^µ¸-gwǶ‰&‹ÏNX|¶‰÷IÞwës—$þƒÙg͔aøäãápW&k×è³å’>Dô~`gv #òb½6ז.Ö[3ÚݸXO?¼‹õLóíͽzýã¿®‡åñ¤Mˆÿî_«×fñ}f×ê‰n 7Sïr0oÁy¨ý}Íûå`ØkQÞsµ´‡ùp£[ÌÕ~•Âûq<¹½ǯ›á;¨jxâ^óÄ‡Ç ?I`ҎìÀ w<â{O£^ÌØEÛےöˆ=4ڞñ‡ýë>”XÜþ–HZH¼û] yàé¾VhÃ3÷å„{¸¡Ð-†¶g'Üèg°¡`Ìý[^–sÏ·ä´Xw{’óY_ó¸w¬¯ùж`}÷2¤ Õ±Gðäº7•Ã³rXö[ؖŸ¼¯Ñ>nîÑÝz´ËOÞó±öd0½öúåM9šýØ»Ýç³í×ê õx:KEåcãáï[¹ž6ìu_ÃææȽ; ›mÏô€Rr¨ÍíËvjn Ù·íÔârÅ»É/Þõ üL.ò¾š”åïÍÍÑWƒMå ‘”Ã}XÒW“ñM‹QaëûUó<·>Ç÷(zncSzùºÍYá›ß×ÀzÃw½÷Íg€YoÒîÌpÜÛZl>¸Ë•\ãûTóó-÷á'FӁ.jgv #±‚«I:¦¹†êH𲍒=r_BÌçXÊõñç/¿•Ãéí ž· sxÀ¡ç“òf¼)ÀnOCÏ£Ëòj0ÚXA¾¢tݖ½Ù“6a²Ñ#÷5ÐCì6«Ì{»-ZLÝþo7<Läöôb·‘Û‡ÈíV‘Û÷Ãq:â;™t„±ÿ&ûÿïìgû÷;ûCó[Ü>À3sZÜñê»&­=äÂÙ {lÏ> ëx«)<ØÇ.¸ûr?˄·Ûb{ÂúûtÕÛóùž~7GÀý:çÀµvÍígoZð7÷È6šÛ|ßl|eDb/F´!Т2"}ºKómˆÄªŒHÝ߈¶“ç÷å(îM³ë›rÖBÎØÇ#y«ÓkæO’÷úÎæ}tm7áwþvf:rpçÜùG¼Sîü–wþÁ¿Z9¸ó?š>ppçÜù»ïÎ?b;¸ó÷ŝò-8ôeò];Y÷àÂß'“ß~‹.|lypá˜RupáߕÄ홳vur*Ý×:|_‡ãw:¼¾žÙG}È}n>ÖÅçîMsh®7 ®®æÓòd<²ÊΨÿ\zðÞd–æŒt>¹²bjËõ[}j?éžð~ =Ø3¾íø>“û)VŃUñ`U¼7ÙàAÞðÐFb;˜¦Åƒiñ^4°ï^OÊrô•fËïìY9x=þîí`<,gßMÊËïƓÞhSìÂÁæxïò›È›Û…{¿næ³ EØ+k•¸¯…š6\9´ßڙå¢GîÙ|õd€Šû)œ;.dûƒÊÒ©?È÷yƒX^öù˜šö—½µ¿Lo˾ &Ÿ(Ofçק'Ç÷¿ÝZ‰¬1tùÉ{nóӋ:ÝÞö»üäÁu°D,QKÔÁu°D,QKÔ.[¢¼ÝÉY¢¼Y + RKÔ¾)ÚKÔ]Y¢î屮oïøçb_;óJÛC0°=ìD÷^sf«ÓÁ¢öà³Ûw½ªÉžTžiQÕäPyf÷G´'•gZG:îÍaü™TÙ¶Žß~ËÃÁìEo°ÉÅq8“wâL>Tƒ;œÉ;½êöäLÞNÏ:œË;u.·>¹öíH>Tky&ïcœEûÉ>T€ûÀÎì@Gb¸Ï´:ÚYÿÚ"-G‡«Î•7îð\¾—Á5/ïwG•7îó`z(E*š_Þ~Ùü–zl{_˰ň޷Ñû=áû +ÇWWÓrÛgR^¶ãö{ª°<ÇÆÚÊLùç ¶ìÚt}2×ÅÞÍÔAÁÜ?Sèä«Æ‹øÝà²MD£o~oGég¨; Ó|:[Èy÷(æµR aüeñØÂñqª¿ß/Q-xÉuÙ*R•ÛÌ7ëd†ÝWÄöÍ|“Ì7û'£çÎ|ÓbDóÍÁ|s0ßìÔF]›®ƒùæ`¾y8æ›ÏÑÆÚóÌÊËÓþ[Ôgp5éõg½áOãA‹¬÷xÓ¹ç—ÝS©€³Ù`ÖbƧØüÕ`Ø&Q¾òÐ} 5é6¯!uћ–O'åÿž—£~ ¹á±{35ëÍožÛþ¶ÍlÆÏÜ×û5ñ~†ÔÜd¹oƞC;Ï_!UJ–í\ɲÊÕd|Ób±õý«ù­V³q Ig|czðUØd¶bØ¡[Óqj°=Äl÷gÛ¢ÙÇ2‰½šO.æCË,€)õPi/3=Û¨:ûeüÞ*ò`snaµ9„ > sz‹É܏€ÁڛpÁ_ÊÉ»Áä¢ÎG¯Ï7„Ø«Á6¼ä3 œ5Ý÷è$Ÿ‹K§yœÚ¾zt`[>ô ®ƒ~zÐOïY?mµÍêAC=h¨ õ ¡î††Ú\Ú=h¨{¬¡¢’ŽÚ¼BÌ~«¨ÍÇyPQ*êAE=¨¨uUÔ¯ÿ ’óïG—¬ª"Ìèü§ñè…Å‚gyø1Ü¿ÿòå?Ý:<Úýxöþæb<´]:./åèª^B!‡á üã?ÊÑÔtή†ügÿº|þÖöùˤóøË/’ίï¾übNÿû×9Pä ÀŸÃ?¢“à}ßþÍ~ú§…½ëèΏ¿ÿ#é\~):¿¾„ßlÒn’$ºèû þž~ùÅȺ©É¤‚¯ð?øšJƒŸÓΉmPtRlXtø7zÛÐ +þœ†—áj_ÃgDŠžâ_ú%zqÔeÛö +bŸÛGoàOÖ‰ÑþÕ¶ücWá¯ýršåîÝö¯{9|€¥Ñ~Äýz”»Aån ü[ôHî ”;ú_À$}ýóVÖeçõ¤3>ë¨op®Ž +˜77sôﱝž£›$¢s$,F);Rw²Bëί7•–RÔ·LMç¸ßçq3œ2Eœ8 ÇÇv1þ Ӗt³h"¡nܪªÎÀNA 3íÈS-úËóÍÞÂÄVÿ„váa?Ç+Ítԃ¨c4Í«fN6Ÿ9‹J&UÚ ²Zœ9QÔ·LåÒÌ­ÆyÜ §Ìª3‡÷õ7_ÿã}l9UÒM Ã¤§Ê®ûG +#Œý`r• +ø!üÿ×Þ2ï.#»¹Ì…êè®ÔJà=‚Ï2…µç„)†Ï…íþ(EÐGû“² Et§8‚¯Îí 6«žÓ_m©åFyd8>~ „/dzP"ã«sàïç¾g€–^sÞX×±ºD͖Эï­ì*“ŠB7ííÏ«P‘˜aOõÊMFßÿv;žÌ^Ñ!ùÕyÒyt<«F½‹aùl>¸ôrÁWçbÕK{tMgìP„PwMG(ú¾ÁBxô²ì ìÙáü*ˆŠ³á _žõ{C;Ög“Áå_Ë÷Õò‚üC5»1Ô gxé N`xқÍo¦(0ŒkƒÄí_”ºF¤:ƒMj—¢.Lü!É,W°¡Q¤uܶNºù +¡B$,U¸ýn^Ïë3’$p—fü7óÛÀ"͌J5¼L¦Úï°ý³Tœ"*“ÆÔð–ԝöG™?à\p¼Ÿþk°RϗÞ}u> ;1áïÚcÚ¬gööà´¦ÊesàÇy|ììhbºî`^‹åx–¤ÊÎqd7ÑPáƒöcÕñØ·MÖô6Ù :‚Gí¹íLÀ i„€Q_×½±ð¸_k¾ïÑ DD ¼‹´;YkݳçA–dEÚÔºç˜õ4STJL‘2ÌÒ5ʺ)þÀ€¨g ‹§5áQ¤”Cm?ø¹á)ÌÃL¤a50*xRº9ԞJaÔùâª;üòâ# …ÐÒXSžƒ0²E5µiÀÿ‘›‹T墛ªؖ*’”8«À)¼Œ?€G ìè]øb?(”c²ö‹Å¡V>•ØW‰$CnÛö]ÇMÞ¥ÍÂk˜ýÞÕ2ýו|¼®Š‹½óè§ñìeÙO.íÔyv¿r¦–XôÉãžùé~u5žÜ¸ß¨Ó–…_Ž/ÊóÇ?ç¶Ïg³÷Ãò<¼}q ZæyéV“ÜÆB„N逹ÍMį—ÿMśti#-l´¥ÝXá¼Ñ­.oùE¦°Ä96²“˜¯ƒ1ÃZbi‹{zÅ>_d#"Ð2GYâڍ\| ¸E¶j;)(¥¬cn!Vî`|*ÑÌ-tÌ-Z¾ë¸É»´^xÍÝq‹=Ý᜼ ;[¦iùDšft@Bv•ÌE®p»êA`IŒ= íî–Æ´+Uæð:@ÞͲT;†žV™?R¢[¤™ q–!„çÔËF•W-væh±ÃpÊԌë(:~_¤ÍQL¹£˜ªÀ¬á»´}ÀøûÅvHYýáßÝOv¨if Âc6 j‹Léã ÐçG¨ýÚdð¥ú¦¨¡w'n9P¿ã1½ VKðÌ@(‡_¥J•bmŠ: ™uó¤@sÇғŽI™ÐGr@8¹®¡=þL ž£UB|ºü.×l½þ¨`DÎ>^¾ø½ŠÔ’ßöèzã§Æ¥™ÊàiY„©]„Ž6÷­k´*d‡sXˆ¼ Ï¼†ì·®‘Z 8'–¿îR@±€=¼ú„m_»eÊiGçmÉo„Fn»ÿ©yû÷ƒÑ›Þüjú®÷ºžÃæ.ìë 5DðBN„³[$’—2Ša±Ùu›)¡aiä–I úWHZià2¹€•–Øݕ¹ƒäȤ»c?OðõfyK’;c³e¹fßg$œ1î»´ß-‡±ïVørå¬>®‡:A©3ôLÈ ¹h¢SÇ~ +‚­}«Î-›€-’`à9@ïˆÄ 4ôªnšË'à‘2öÀ(w¡%P 7ŽËÌö*…0{¤x<îeôÝ7n,:tÀÀ£Ðw€=·,+. |°;±È3…c…‘ ԇ<ñ3C߁ò¾/âûj7‡VJ_¾×†¶)L/=íÖRea96 Áæ®rXIž$žsZÝ0ѶßöÜȍ,v œ¯ÜyïèÑcs\4µp¥Rnjßai’å7ž n¦sGS~2uJY†g‘UÛuk9ˆ]ËJC ¼%÷(eWf™BÉ°¨ßôh ˆ°¹—€‘R'JÅCal=‹:^ëvñË\Uölô’%lÁ/aUk·í/ ×à{¤OæÅzBÇîJ+r¥á»Æ‡ê¦‡äôwšÜKü÷>*!™eZÜÂêtij™N@A€è-¢ŽxÔυ¡8Õ>Ÿ™xxöéB%ü”ý“Û #œô•ßJß/zÚ÷Ûcã²íð˜÷%ð%ô4}eìðo§§}ߪ}wãÙ±ÃÔvMjÓ1V̔cUšÕÌ$ò“«OÛú4ˆÊ±ÚüDLjUÁž;ð·ðAÊö3Æìì4‚Á•Ž øgë`ѳW^§ƒ­“9é%,)- +{T¦ö ­ѓkìÜÚÛ-t½ÝBëÒx胇¦Æ@à„NMŠ.~{Ž‰\w)œ›V:ƒ•†®fJjYÿlfw‘=)í³F5;ߟåýiî4%må™ïµË †k“uqê7Ο¥¢@{£*ÉW<+³ÄÈ°÷á£Íº,@ï3.3±§öøiœ×ðs“€äG?ö¦oÌ!?ŒÞ–“Yy¹¸IO†ƒÛ[»/áOSزÔþ×?ÿsø‹ì(¿åo¸?^ö¦.!éÜöOt~}ælnåÛÞMõ¾óëOù;¯‚#Œ-Âþº‚­üëõšFr Ýÿòh]é:½±O_a‡žôf½oín“ù—_üúÃÿòÁÿù¿ÿ½ò?ÿ~_ýóÿ÷§ù}EÇ¿~ÿ—]XŸëß´¿>ì?ÀìÉ\9Ú_˜}Yh`^?­âª‘¸è<ÿþûûðÙª$ñÕ9rå PœÿúÿyÄßP!:µú9sØïñù2JÇÞ$°Ô͂D‚®„Ø°(‡,´ðLý_ç®gÛ§Às÷ç5B—%“¯Îëd“K"C=´‚áÊ¡YP"h$X,ËBJFbÊWç ¨À[‹*VîÝ^XùêüCĕ¯Î?D`ùêüD–¦¯Z¾:êVóÜ9ýj…s¿­ððø‡ÎãùlÜq[rð{|BËÞµçÓrò¶¼<·2ý¹k5­n;ߏGãQ§…[ñ‹¡LIäæHTN+ûÁjv¥…à§Ábµø·¥A ÔäTåÆIYÒº˜@RŸý›'näÎpd—4þB€/³'Jà©J¡uü¨]PÎ$@Ø#öÁ#ó@Ù0£§ @•aX¡·œ%ˆ{AÄ&øUó7¨ð(›ÑGìÅIÍH™áP´£ 2ÊRž»Y:ôà&î‚U½$uǝ·»½Hó¼Ú{0o!*FÓnnRmæ@´ °@»#dÌDz{D:îdD: ÁÂXâø;‘n‰Fþ¬Îë“.†á…‡¿Û¼Â +¦yõ@?ƒÖUÚÁûUÌ.¡ƒ©ŠhˆvhÃ`ˆŒ™hÀ¯7-u3"…äÑzÌÑw"Þ•‚§‘Ù¿ÂäYEf,¬ š{IÅ«¢k%‹<ˆŒô=–  Œá9/ôÌ@¯ÅETÊÒ¬"-Â_§ïyÔà«Éü!…ï'@$*(–ÃsDÆøú“*y⑘`BË wǔ£>Ƥ£ðƒ<|B˜t‹4Zþ*›ÖÃÂÖòÇtØ|^’ŠIG"WL:ÌøAÝ5bâ1,¢^sc$ÔLze×ú~V¶­LضDÞ¶¶íªÒ^D=É´r#$¹ˆH@²SD:–±"Ò±$F0–Õ1"ÒX ] Ãñ1j¢¿?"u3¢„@2ñF߉l‹ô©ŠwÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(Æ @°„ã"¬4nzqD-ê^D-xÐkô¨µH—ª<Q‹@4®œ +7n’“"jyi*" \"ŒÒ÷ˆX +Ċ@8,ÂJÃöïhE‹h•V ²G}'Z-R¥*ÀE´" ‹Dޏ^,ŠhEÒSD,’°ø)/1Vÿ="ƒ±"3*{¬4nzq¼}÷"jÑø)4a ߉Z‹t9Ý’øqý³‰7âß©Ÿ6éà?ÿèH«Š%+ü´Ü@®¡û·‰Ÿ6Ïô»i½+‰þ÷ßáû‡þø/ÕÿѧÃÿáÿÔ¬¡¹›Õ·úÇmÿsp†Ö;C´ÖI³nî¦ñžËEGoãªqO.9kÀmÜ5ðè²Ãƍx+—M ãÈQä“ˉðäzFoŽ}ºÎŸ³náѱOÖùt,x[¯>ºì×Y·ðìàà–|;ÝÊ»SGõ3PëöY·qüØGë\?ÞÆùƒ.¹ªÐ Ù² Á[9ê(¸žàuÞ¡pÿ}´ÎC„àí|Dø貗hÜÂO„£[ö!x+_Q׽ΉT…6w#ÙÔ9’¼¥+ ­q&-€[¸“,C­q(Á€·p)ÕPo-­ë|MUhsodÍ.û› hÎ6'xnÙçT…6ö:Á–ýNÝÂóTCµµ4®sIU¡ÍR.´ä–à6Ž)ˆ\ZvMU¡MS0 e÷@·pPÕÐl½dR㹪B›û®ìs5Þ+„ná¿Âç–>1BÿAJW-Ibp~8Å*GôkôÃtâªE¯¨vÀ÷Œ>¦h$~€'.`jq`˜LÙüÆ®xéÿ‚A'…O|å;~>Šž:r¨°mQéàòWÎ,wM]çoèkê‰ß9 +¸é¾4Å¿ŽbG‚Š¿pƒøIðÄ÷"ÌSõëׂrⓗ+xñüL½z|öêû{*¤¡˜¨JnqH+/),À¡»…2.Š`ʾH+\_B­I`»©ÛÞX>Ð¥ªY¨R¾ˆŽve„àՒëXÙýcÔÁv~gKƒ¥MPt]¤DŒ®"@`û.AðÁÄU9ÄÄè àãÛ÷(gqT¡Š¤r YÔ×ÜWNªƒ…'±¼ô¾ +W¢]ÍF¦›€2H®Nõ,j·ÐٝÝfYWY^•B¨s£3¨’º:bé§/Àõb|ûómå +ÕÚÊêíoOê†¨Ôv®2§+~ïfMEŸeø|7:Ry7øíHCáyșMò„¿úWøìâEñ#6Â󇧫ÀjLôñ4ôÏË¡\~« ñè!öпô”>Rzzú$TD‚©qÝÐGŁûŒÕÁ€¯r,ÖÁE ++{qCÆ[ÕOßIegÇþ(^«è/ZÑ?MiÔX_$uô÷WµÎÒzú¯Ä}Ü÷"ý?°j4”³Ã åf×¼/c(±ÌgÎpÎâN< +ÿ¥+?eŒX‡e±b{b“è£oqÍ1•>¥‡Eu,¯ˆuåÐö¡Ø´ê™eœ)Ô×u¡·ŸTzyv¶öf؏¨xÀ¥&MñFíBå”Æî`–?h ‹•Ê3eÐ씣Ž÷pí¥ÐG;Õ" m +o e, Wõ1¡ËÁì´va_ˆº ÞD€>¦2¹îp#ê0cYUMaõG¿þxúóO:ßv¾î&ýay®Î¿é`t¥:û€ý±:»ª›äM¦i¦•³£$]• »÷èT.-±\sfå3“ ¤à˺kaƒå&…®ÂéÕ¾$c^$pPÚƉò䆘Ÿ«ìjé–ø)¿FHŸ1ç€P:KS¯¢Ùþˆ/ñ.ÀÀ߁¿YÑ+)–Û^ÍÉòÝ·s%,ŠxØ©Õ%4:¸aڕi‘ÀÒÌSœ¹#¸NÃÅ=Ùß²T¡“2Õ ÓA‰barê¾¢®"€"± +WSF¶~WÜþ¢t¦Ú©“å~n`P÷£…Áíª£…åòhð6,Dã¬ž‰H²£‡QêCBÒ{èܦ'Þ䒲 -Âe[û‰ʝi=i^‘£ð’“z§®e½Æ³g¾S×r•¶S¹ë'¢ÙM•–,ý®øÏFež˜ÀGDáÊ4/­·2¥åClÍò¼t‹™ÃȺ¥¹sák­gÏ>V3‘´Å º ÇÅ9ô5[Ïb Õª2?» q³õÕy4_4K9Ö¥‡ÛL‡ðG¸ ŠÛ+Y˜0¡ ÄId].ýïš*±ð*MÐ*ÚÕÀ+Ç/y,?Ç~ùŒ‹~¯œé +ô÷À,Ø5 œÆcL"#XÖ-^¿‡W6àͤ²@•îؕ/`Á«4N²Õb48¹•J𶢤/ŒÅ~:{-u©Õ×4¸v]¸3¬² Ý4oWeôýÄÕµ@²«UQÀ ¥¸P­Ê”ÁüٞK)¨RqhûØ("Æݶcס¸kœ¢‘¤.|>q:jž¢¼c²Œ‘Îtg’f‰~'X©Ոð›r‘¨+ow \3B #¸_Ânpr]ƒ¥²«Ó/t‚2ý®#VÅN0¥ÉùÜ-Dˆ<ÅÇ}šŒeºÀk*¬ª ›ìKj9ìgagTdxå>gE'ǂ¤7À5mªp>»¶Œ…÷ØW!§Ñ]#„T<)ôµQ«Ç¨‚å׎H,A*`gçÚ_´€²Ù ތaUaÐnàn"wšQ®å0ÊU”µ,ËÙKÐa OaMTn\P{^™`保÷D»P¼†1—TŒÖ»Ša¶„v°ÔqF`I"ÌÌÒìÔÌh(\jggM@ÝÑf—Úi¼¨{ù Û%ÝÞØÀ26A°oÖÑAl܅]Ò|úà†W½‹ÓÒv´<²Ÿj•ûd ÅÞéY]'€Iºw­òªº¤ÿp‚†d¼…¿;2Þ ÄßáA“»ïRûƄ—©Ç濃‰ÞßÈ#ÍJ>ÏݝH€V:—)˜ú¹Kø-î3Pӓñí¬腕i@‹_|OÜ•<áÞ ³ø•z·Jû2-”oáG`üHƒ‡ÉÊ%™û /ëcx!e¾éÑ´À+UU´ï]Ôٚ½·öÆÓEee•ÜDßyUY¼kV(¯^ü\]ו%o¢É®®¿šUª«Kò.\hD{UCÀœi¯kæÊpCfðúGÓ¬vÎ[¼wIOoôÞÚ9÷Þ0¼ÙF ˜W¤o+Ù@Ùéô¿*¼Ÿ,)j– MËMí¶Œ.™§j@ÑCWþUªæUôäÍnøš/ã­Eí¿ÏÍÊzxQþîv•÷sÅë«ò·ÙE9)ýëó§ã7óé*‡ÜKÔ9ò4¨hä ç´ô[5Cc*E.••}¼êHƒµP–-Ÿ¬\K‰|«0ò·SúvD_k¾Ñ—©[‰iôj`йÝï¾ÌÀ¹¬éðßNéÛ}­ùF_¦{¾ܛi…2¼?³SÀ-ˆ æ°çɧ‚ûŸóÎÓÞÛñd0+GëÁè÷ùÕÿUs#姱±A.@*áRQz«7²Á5|‰Ï‹î¢S¸ÛÿÀD‚IZ¦ë°E79ÅGP€Ë1ÉHp²Êdîϼ1éºTp8rÌÆPEé.„Ti᜿ UgèÑÐ{¥ƒ85ۀÆ>˜ 4jf5u&îžF)\fŸ«_wQ:‰iJ¨}1zU5hØ&4<EJN‡ +²-àw~*þñËû¨å¹[*¹‘±3—Ë04[²B0¤@u"“ýk5ñ,PæÅ`8¼§·–Œ&Ƈè'ˤ¸+þ”«¢b£lì¢\ Û »“3ô¬éœÌpß&jš ‘s…¾øÌäPt@¸{MÐæJ<Ä»ø>)ô÷ž¸ê{áÃh.hG;„ydâ|'8#v¡©@4h؃å* ¹Ú´‚ƀ´–9@eNÐǪ„.-œ`ʒD¸Ûza‚ÑÎA ÂÎu +I;3Úm|3dá|÷„(,Êèu°š‘ÒQ38Eú÷²jUlåL$ž¾DêRéHÉ°ï✨¼C9ÙáÙT½±2›MPÒÅg%Ù­8}®†×!¶-¸¤ÏlÃï0ms+Ž‡IéÛð<·Þ·ázn“mÅ÷ÀÍSÃù¼ ïƒlæ¶ÜòZ—øˆ¡K|7[ð@L¨ ޒ”½%Þ²‡—g¹+4*X7F”–€)¨3®Œì Z9րœ™¨…Ñ£§N0E u X@¡Uüh i˜¥>ô;RŠę…)[E½XçéšS£†&SÀg¶.Ð%@£—9Ü"m"hÔý€ ‘#t«Xy¼†NXéS ­âÕµ“V÷¼ZEGÛ ™æhuÏ$ŽUjùÑ +Xôü§ñèÅd0šYGGŽz^ü˗_üt‹¿åî·ùý÷ùÅ?­zl5ALYîOæÓëΏ½Qïu9é<Ÿ\‚Ñ~Ï÷ëIo8¼žôn¯}ßô•¥ô£ÎËùè²sÔQ³î£¥Æßtl¿®ÄjˆµÏ,´~êp {ýkû‰Ÿ±«äùȒúºòÀ_Ç×Ãr:\ͨÝå±Ã*M{³ßK«^—ÔÖÏ\ ^‡ã¯“r0-}ÓézrÛ)ªû#LÜåñB×af¢ÎÃW(ð ÷Üb?í7ÕyüÃùñÄ®ïa‰(Nv[ŸœÙ–éùÓaovî÷bl;õi‡¶bÞaDOã9€°]\]ÿóÿ]ßá-_^Y¤îåö3þÏý?XÎ?jTx¿ê¨ÊÛ ÿ®ç«nÏájä]ß,³îë!{Ô¡ÿÅu|ªI° þ”€âSgÕvÿ†·: ç§òµîˆêWµôþ ÛPÛ#8s{ 6¤±ß$ÄŠÜŠ´ÒÑ"YI‹0µ…ûÍÎâÙ콝°/¿xô×ÑøÝ¿ÁAûõãáûé´wþìì›Î£ŸìÂqõè±=‹ß–ÜèÑÉøævlèÓÁП;¹î F×ā§é‘oó'8èý2˜ìqŒHkœÍzý7­÷¦ƒ~Ãdü¦lƒBâOÃçÿ(`…K†ñìeÙÛ#ñu =5:-l $>zR^u¾ë|ùEçëJßuðå+t½èMfµ£<.çƒY³®GcoEñõ´t2ÏyA}³¼º;ÝÌ{ÔÜ'N:ƒv£²•±tn[ٙ¡é¹OHaž–ß¿-GÏ//[Pþc“ Žî$×lœæ!d?˜L¸›pS«¢£ Þ*áxKn^h!ò¶¶ø»¥Ñz‚K{ÝÅß{/k@±vPö™ï+ûsèŒûQÔ°LÔ^ö[ÞIOg؝¤ž{>¿ºš–³op^V¢øú‡ápŽêÖxÒ-ƒKîtƒ[SˆŒV¤Í擷ådÚ¿”VÐý¶sj {ôýÕUùƾãÑ«ÁlKþõóùljUÂ(BìÉ`z;ì½w_¿ù茞·˜ûÁÑ퇑ëTcv´¿»ëãœnetž¿ÊŠ¶;ÇÞCXgu„­Î©ŽÌU|V nn‡á¬âõ˜C]MCëbLuñ«ò…݃³&Ó;‘ÍFaDBŽùØ.N! ™¨«ÝBZ!©øØ=F“øáè?ý‡£ÿpôo£î}Đ«ƒLp ɘ÷‘±ú£ã%à휌'#Ëëïäèø¾ÿ¦uz‹¸Å'ÅúÉ]¡Œtî¼Î×.?Ÿ®Ù ãåƒ7^~eæ´fIù~ÈՇ=¼Ë{E¬De ª„‰4 šÍ騉jy,þÝaƒº;8ã«_ïàÔü$©”¿öF³²ù™ ¹À&§3óå¦3óóåeŁ—xك”GvŠåP½àÀVr£ãaonGòS9Mz×7åžx-w-aŠ¦’‰»ÔJd2+|>nÈÏ̌„[›‚W~)QS؉˜¨™šš$MqW,íÞ(d’4ƒLÛ®ÌdžJLÀI¹P8D¸ÂÆ„R…éB‰‡J¨4Má^ »¦ŒÉD²Ê@@5dÌ +ø´†BP1ù!(ËS\7]-ñÚoÅh XFa}e)ØF׊d=H +å™R¹À°Â¤È¨%˜²Q³†2ú.ÉòQŒ„÷·=UjÆQ…W|C] Çñ»Ê­8K÷,Õò{ˆæ”k(ýQàG\ì€?žèò`IU^À"Q‰‚¢¨~kºó®ÉP DV%üV/t¯—Ž4‡µÓzíhçpòIˆw ǐ`ú(‡Ü8;ÕÊu“í÷ºù$Ëæ` 8x&ÚèÏÿfäCfÄÁ˜w7Ž \Nµy¡ñBqŒ QZ¦]¸h»# ++vU‘|~i‰H T˜“B:Ù¼(R#)@1· +u +ÄÚaÏÍgÀ!OýkÊÉõd|³Ÿ|r×BÐÖgŠn0·¯x¬ÛÜ®ˆ¼ô\ ÊÛÁhZ?(Öòѳçÿ|i—Ê·…tÞΦq=Šóáæ$üWi‘‘ÿñèuئÞî0*§Îôoüd`GˆÔw]xüIyk÷Àôù¨Šû¥7„zÁ•Ç^–Ã,éWcümqx~ úã˲EˆéËå'הL¤îûöÒ?¨µ‚6LãzúðÏ+'ìÕ§wDóð%}jÕã n#²ZgV&Ã& +cRÁô ú¨7×/~X· MžåÛ-ÂOh_t<È`Cþöõ¸/_\õ.;¼Þ&‘Šœüs4»EZhÚ37ÃÁ B ¸9\äáã«é¬Åö9&p˜È=;Lü¾ô7{®Ù«*•yz82¶92$ú5?ɑ±Ÿ íU1(].ëJ—'Éúâ宐÷>f;ȅ‚ó‡Eôñ‘¿tîA®!s?Y[{4ÿ*ÿdÓÿÙƒÎú×¥å,#ezó?þ£E"ÍZ†ô ö¯ƒÌ+”søþl8~w'úduý/¥²mtʋáè²j»ν +¥I¡¼íõ¿YÁ†[]Žò!&øièzÆ4̧勳Ócê±HI}B‚CZ¸¨ï»íY¦z\^'e竁°3üd2¾íœ]÷.ïŽW7OÓÜbϬúӉã­l¾»O~wL™M—½É›j£·ådV冷½óÇs?0wÏÜÿnyëÈ®ŸË4(ñӉlƒ8§w⪲è¬,ªƒ5I¿]FI7—6}Ñ–vºa¼¸hÞï¯ÿþ¢7–“»ÇÊÑ?¾A +üú;®ú×_¼è×Q R“þøú¹Å–Þñ®g7;c®/ùõõËgǝ—ã¿"IÜû‰¤Fè¼Cš+7V/¸}*³ ’A¹ 'ü׈[‘îV´®F¹$0Rxàä}/´Ïs•bÌj–"Jö†ö`ÄíeZ¸”Z¸?Ûß^'ªí콶Jyia‡ CÍò"à ™I¡±f¦}–MšcH¶ táâ°Ö?ÃÍÏþ¬ŠÎñŸµ dLìÓ©»!MK¯Pp׆vXp³|XŒ%[|цa—³´Ôzög™[Ì*&2³­Nzšg.Ñ8I„[Œ¯¸³U”öìÏERA [Rc–C‚®ºEnRã–—ÂÏ  „^ +û¯Å™Ä8!•† ŒaZ2¡\b…E¯þ˜Úu[¤{*”Âi ›Ðïã?›"àÔF(ß+Ã<2Ÿ£Q(ø./$,#“@F…tTaîá’ãÜOaè´]÷ʅÜçT÷4ƒŽ.c81vZ+ ¤ —ƒ¤Üj*•»%o|¾wFT´tKLÁ«H'0â:™”™N…3²Y\®¸`ât»Ò…rÛF´|¤£¦Gip^ra1f:ìªTAÁ[XÅR~°¿ÊŽÜåL™Ì—3“®Ç…Ó0i˜; ÜÍ·[FL[è°Ý,¯Œ8ºL&¸6DՏq‘i‚Ñ];}YÂëE˜Ü"ƒ¡{v:bêBº«as¸Ì²={¤t½dö"‰–Eà^;›ÀÍî´QÂâ˜2„SÀšª! +§EŠpTÊö§ÝäZ"ã·§±v‡~Fk&…ShÆiI ë9ǝQͲsÓ¢UnaÛábIsW#uPd-VR˜ +ç§PwpqSå¦ÒR ÅK|·-ß+áóaG'€ªv–Àa“œGxá‚3`¢ⵓ‘#:{”kÄÇ<ÐϏ4\¥Ãâ͡ø«S‘4Í7ÌñÂtÌérBZ"æÍ1ëçl-ãÉîo)aRÜDÏ*a +Œ@ՅÈÇWöüÃ5UäFÓP¥n팁ËQ궺À+—s*•Û™Ns®ûO—x`8¸ÙþÜ©\xnEÌRY‰ g/ՖÍãáªìvÀ%»{EXpjù…&f–.Š‘¨b§Ì%!ZôŽÌvWHܨ–:Æ ÄÁG¬ß±v£Ed.€ŽÈÆ:ËóÌìa–º]š Ü·©•'‘‡Iê± M—ø¸$‡i¬QÓVón!”âÿÔ!™<óëB‹Týeps¡-‘ø†•‡ŸOú׃˲lð87 H?¾Fdgcû‚IT¾áJDÏÆÃK[²7uÈVµG0xݵôO­»$`ñ9ߖŽÇ¯ŸMzóél~Ñyñº¥bætàÈÑ1)ciš"‡·šW!gØÅç‚ã@´5ˆÓÃ⓰ª#I#-´cuÊåÁ[ž€lÃXÕ +pø?  ²àm&©QXƪxjۃCõ,‹sÝSÔ«Åo†›t„,bŖŸ£èbðødâ“öLÇÃRóÿ+Rü \2ð2+_h<€M&þdÆËԹń["F•Ëþ¸ƒ´ÌÇ«³Ü±W{,wª[Ñ&ó'\Z9.ÝÁfÔâqiUKäÕÒ*†©²ìì;e&£Ž-~ ¤™;ƒQrÉÿ²GWŠ= ûeøÁ(¯nçüZ,‰F ŽûoP°rm +w„P¸þ¬ Ÿ¥^å¢-~`Y#A= –¶Œ5ÁíÊa¡j‰‚†©¶ÿ†-ø·òâª7¹ˆw _â–åkJ%+ô‹Š˜*–ôe$`ÚS$ÉÈ‚Å*/ d$lH‡”—ŽÚP,È"©ÍUá±dI•*o)Y©LS£L»ž¸i-`z¥Ç"à‚R+:‘Ã"a\*îŠÝ«™ËiQ2ƒôN'žºkÞ)׳Ú‰«7 ÛLZ^`p¡ÉÌ B¤Yê…GJÄ\¢O^„%'ߋã`c+[»;…NÓYÕ¹l9_ðe]¥š¥ä’/C>ޗñµEË6E×£-oLI|«: ú×ûÞpv5üã?í0ÎÇoÝey¯z§¥mQÙOZþ6»('PÓèüéøÍ| +Àã۟o뱀×ârünĀãbW®Êáå9ÐqPµŽ*?§g{³ùÍ›ÒÓOC$ÖË3$ÔÙÜ6ùû­.³7½É /¹ú~0zӛ_Mßõ^»ß_†÷Gòö|uþõÿIJW#?¥pÚbà/Øô}kAãyñø¥Ù³[tŽÀFºñ²¾¿t=p]z1ž`ø³ôiiÕ÷¢“‰æϊÐçÆùajwÜÅØîù'åUo>œEÝýŽþ|Mm¨Dá_<ýɎsíS¿Ý G¶Á‘å“ÁÅ|ƗyV&瓠¹£·Dí¬\o…è’–­múþ™…KI¿þGÓó·½Éô»¨„}Üöm´°ñ‡éŠ†£x~¨åŸ©FãQلJñe`—ÈDMïrán?À‹ÁèÒvX4¤]3–AºMÙ` qó»\N±ž(ÍH1€{íŒ&3}ï ¡=Søöms¶mwcÁÃ8ûVßßìûû¨KôÛi÷ Ù}Ø|¥~Š}s½ìVÖVž^½Ûõ½œ| +W¬?˜¹—VIïæ¹ä¢Ú+Çýnp éª &Þ·Ü ö}”æm 7Žï}£±Ý±±ý¸¼þ´iT¿5Ûª;2ªL¨f“u]^_7:¸éN Uו#»Ϭ¨æÒâŒqù¡‘*]žç“~y Ù»!VØÓn'úqSÎz—VÞºƒÎܙÿçқµ­¹¨õŸj7“Jißö.Iåë¬Ý^…ModzEXo8 %›Ñ溼t=LS¤óØÇø:“ϝÇóÙ¸ó²7•“Áïå"V´âÑ:oFVÅÏg×“ql¿«k;˜Ž‡½YÙ¹€PZʆ¯´.:·½ÛrҙnæÐ;– 4éy£TÇv|L=—QƒÙ¤7šÞöìüößÛ~ .->‡‘NìØ:ÒönÞ¸íëIɋhcã ["Rc”YÝTÄ}ØØ6îÃÆÆ¡"U¹â¦d•=éÞö¦g\¢2•/&崜¼-;`'ï|9˜õ.ÃÁŒŽö¯—Í uFߧCt-؉F„³Nl+ Ñõ0‚Ëé5¯E\—¥]Góhq¨¤òÈóùìÖ.È UmÌ/á [02G?¿ßÆ?rŒþ³áø¢7|YÞ·ÓU¨ñ€‰_–d«ÊY9üKofiv:î÷†@›iÅ»¢µÊròÓJÛø÷W |Á«i²„î&Ý$âXoÿðt>Òlù¸}û+Zfiæ×Ì ûãm‰¦÷gv‹#ŸEk1Y×ð¸~×¶}Ék6,Ú†Ïo{ý°µYÛøi¯_†*"뚃l°Ô:_ٕ_å;KÍ'ƒé¬7êÓ9Ôy¨¶E·Ãâóg³›íÐýép<žDäÜض 9±a•œrÎW‘B”BÔr}3 b¼:L^äbMÛãÊVd”v®˜wôF³AǞq½)óªÔµ;jё´ØÆr°Y´8×ô² -Q´¬®ÌˆC{VÛïÌ{ÀJ;§å[Qª²’úò·øzƹªíI9žXrÆ´_¿¾ÿmdµ²- NŠ5X¤r5¹þ2¶<{<úK¬zh“g«"^YATòü̊E'pöý8¾¬;Ғh=Y)f8•)¦NkV_]ë™= [>ú¢7qUp¦/ž<…ÌJ»©+G%-¾JÛïo.ÊË“ñÕ`Xþµ|¿/ µ§çtYHª4ûÛõ ½„²9;‚¹{1ìJwŽÅl)Ëìю˜š ù¥7L¯íBQ¬š‹[4À3~ nh–dƒ|Syb‚ÇýÑ[ûV+éØS9b¾«ÞÒn­h–Û߬hôڒ’yI)*ä<›_Ø-÷tl;ôøt iÒ92ôÐRPù(\·µ4ÁX™\‰t3.Ø#89°+;lí鋏`ö®H8q*çTV4X“•Ž*ýo¼¶Šåŕ§YÃÅåe·Jf…iHI^åÍ ¢~]–¿•ýñè²åCO“é¦áBY3c«žã!}èD3¢…yþž I– ríRæ6 ÄÑNíæ¦X„žüú÷ËËÁü&’íÿ ³Àÿ;V›]§lTE P}A¦x 2EÐOcîO€mœx¶ñ²Ê6Û>÷ÇÄÙÊC¥ÒìU8MbF‡mœBóèÇáŽ9\¥íóE¶¹™X¢óý‹³Ԃ֛Èåp6¤—k¼™`Õv+(æ5$™Ç¸H3&Fãpu#<6 ¦V©«YüÖ‚AñÑ?ÇÝ[»ê'võ/vl©¼º7nh6}3¸½°}³ÀÛMJ({YB'šöÇÃaà5Jþâdwh3,z&ò{y›PüßÆ?Œ®ÆHÝDñÖxô·òâÑ/ƒËrüèDZe…ÿX?n‰¨«1\KݟΆÝK>…£`Bn <çˆ ƒMº½¼±?GÍûu{Ù½óՇGêÖÃííÄ·[Óhä;@ÚAaº\“s±iìõʵèæ«VE7[‰qpc7UwhO.R!ºÅ†Æ³1:&7QO¢Žä‰éšt}{çf ©x2Ÿô¯;¯&åàÂrZK©Áh€…#ÖÍ U¸ñò û‹ä\ݪBË5ÈƱ’¹Ýb»¥EÍÐ6»Ý\–ÓÁëQlþ•ëxDž÷¬Å‰-Q jÒ°7½Ìnz·Í9^ub–Ç>œto‚ +ºª‰!¡€ó× šòady}Ÿx}&k›O.»V«†ìýª´¶å•=­¹Ô Ú:k›ÝúðÒµ _üº»~1úFµi^‹Í¦`¼al¾Ý0ÒiÿvØ¿†¹FýђŒ¾ØhfÅë؟±b”vʆ½Ûäð × àöõ͛n9›îZv ͦ\¶dãZÆöŽ¿G›¥ÉCvÌ Äuî«c‰ÐÖr<ÞU}ç/Àˆ¾©Q2¾ÝÔ䬁•!6µC–Z¿WÜ{Á¶tћL×Mi†å‘ñ¡Ô õl¼¿ºq|(՟GÐê¦LzÒ uèIƒÆqOêvÖÕhÖ½nàˆ®Ñíäjê¯[5®‘7#ðÊÙp‚àC½ÑˆƒêÕel¶QûèßIJÖ×'c«»^vž>öò±*:ÿëëΞw„Luv$¿•I¢ÿ×7ôÁ+Ʋc8jBW1m×5"Ëvÿæý: =j9ž]oÔН¸Z·g6Ťg¯´¯e£ôóiùdÜGGx½bÿ˜žŒUûØ,d‚¥ðÅà·rø¢œ@¹˜ïßÙ¾žQýh(AçâÖF ¸§NÁ˜ôxâžÂð†¥§ªïrF£Ö/s5x›¼–\˜£ÞR ÍR›ëñ»¿ .—m]Å¢Ýõ¶7âSq³E%*½x°» kŠ%Ž~ñäé9­—5K& š¾šôno7µÐ€ÇAP[ÑlˆÀm]†â`­µÚ>íMg+/ @€ ƒrÚ±‡ÈeÇ®¢QÔr‘鬴¤½.G‹rpÓ9»Å„Ãɨc,'x"žXþžðiǾåèÉø Îoê.¾+G—řEn_0-;ßǨÿÔ±¿ó¯‡gzûÇBæî`¿¤cgaðú›Îiïýx>³\ñõ¤wsÓygŸþ½Û9îv~=AíÝö’Ì1õæÿÉÀ#‡þo{õúÿίKê¥íÐô÷weÿ 6p]™.Ê7öT€Ð±º»Uꖄ}}2¸ÝÄ+ó÷rƒ´‘êOÖ)„ÿ{ï•ÜL¯$ +¾w„öð‘”èM½÷ވ¢è)Ñ;Iôîöí—YÄì`^f!³šYÆ(‡*–£é‡‰è8'¾Ÿb3D"‘ɼý9_ŠQYӀ7Œ$.Z•_oȚ<Ì«Àê)È[=Ì«ãï±)™VU=Ú2glÈÁ¥’·ÀcÀÁtÔŠÝú—5ÕEµÐÂÁâú)3ÚÊn»›Âªuppý疪ë¹> +ä(NŸÛØr€cSã=•/÷;WCczþ…íB)A$~¨œÐ zƳ¢9ñ²`ö€Çÿsw\%•Ž{æ—à ü/,%Nf‘7XÔgë‰Û <á~çj‰-w闍äÊ­B›BfÅÕòÜFels¸eg +Gˍ³]ˉɎ5F1 EHg5‰”÷ìáÆ&2QCì°÷*-Æ78ée)ùíö%W™ý¡`­ð…¼ü¹B à¨=ÿ.~Ymý6&P +ñIÆßjN§„t¡Úÿ¸Um‰åR!Óãn2>ía~¼Oq‡žüD"áj¦7­ðÕqÄ Á£ÈÚ ð‹:/‹^­ÔÆ<b-\'æ–)ÉiqI'{*ryO(íI *uóG´nžæÈ$lœéÒú4E³–Ê@½lü\6“íøw}R!¦§F6‰Ê&ªÊêkT\êaXj­Jvý¤\×ÿõ®:ªŒ©Í@C«3ӄ¿à|÷ÉN…¨PEmÏo–¢üVs:KV)ÖFe,áä/c'ê©BÁïIÏáŒÐSw¬ªÿ²„ÛChܱ]úª-?æ6?ÁåVSÌj¬FCêwl?½z›ùŒWŒ7sъ;,*ñãeêËfœÿévëâ”þK/­Äk<4°›ãaëþ?•œ€&*kŽÌ[Åsr™¯•ãa÷¼žúD§i»Ý°¼ÂUžuB_:ûôõrçô_?éîÙ¬‰Í®|JêçKÔ«»dÓî×vòomh4éQœˆB{õ¾Víë;ÑHÙ[ÒXñ÷‚ýxx•íǃ'ûƒ¶¾]²ÆÜlÐ zeG`ÝӋ~ۗ\Çםà"ùsNýøz$"#}zJ–ñpÌЦAŸRƒå`>é鬠IÚü¯‰ºM·¥ÑÏ.MàÏh™f¦žš1õã†Â‰7—Þ’|·Ž,ñ”¡™MÍ/æh«¨û M§ãüôkÉ,Ê?j’pŒ}Çß×QðwPœ%×o1ƒíhù¾$ÊuýNÀ\7ÔêÇÛ©ac‰TBßæ;òëó9N Wâ8-–UdANÓÅS PÎg˜ûÚ.büM9Æ`‘ÉJÄh³Î“kßdžšC·üOºvÆðÀÛõӅ/¯.êKí–pkötNt}7º}SŠzÍ:¸,_Þ¶·¶…¤Š&W&¯fÐÖ¬L}]%í‡õY¥w„h¼ðÁAA¯4ÄD[p£?,Ñl˜þngJÔû)kfDAsvÀÁf¬Îtl¡µ#áÐìï}€V“1€WMz4à­d‘BŸiŒ|·ænôG“L¹Œ‰¹½=ïß4ÑHÿYÒ G鐏 ¯Iï¤Y |¼uš‰j*ù‘^ÔñC?¸h’încH´çõ2CÒÒJº;‰j6ýצ~ÿ¼ŽÐbó¶Ì¦fÐ0:òù>g;¡¿~ؔÕ²¹”M›f%Š: ­©-Y༷×,±Öø@M)êõã¡ÆY›hϗëÉ ˆ‹Q‚YŒÎQÀªƒTMÁ„ÌLoö¶tŽÂ±4‘ýŽ»„GálðˆÙjIîázñ‰‹/.³ûÄ~ND'8œTÅr.1,’ˆo–}h”5.Jönôœ¦×A˜ Ÿ"ÞËg`ž5ê÷¦Ô÷s•±”íYŽ_Á>è©gfQã`wmô`r:Sjù“9ùBÓægÂ×s¶…ëð‘_·xÀµ¹ŒÍ: ˆ-K`5/¥šD£2³a ¤“åîJl¼èUì½\×·›'ã$œ9wåš}ÎYÓÇ:”M{zNK47‚W¢qSóš.²™´Ç—ôÚª-${ìd¾eEXӎÑޜü;Ï6Éõ¶µK4~:¯FÉÂØg¬»wgVoó}%>?ð³¾>鵔hÑiJ/ y/ï™V'ÏHt€¡Ôo¸²ñe¤åý(=qÿ´Í·é‰ÿž>ñÙøZûÿÖ¶0’nܹÑp/ìŠD8¹2î³áiÄD}ïÓ<ÆÉÎLt“Ää’1Fmîä<… m<û–`€óúÕ þ‘%T8-€üžêÁ§1ó~‚ ô#ôuñÜ€È%€aìD±Q’ã8ó'DÃÁEh¨ŸÁ¦Àýù—B¯PhþÒÌ àGô8¾b¸WÐÚ°kÎÍæ!@ ÐŸ ­eÑ·E–µ×¶wS“cР‘ A|1; <àö 76Ä-,4šÒ|j:UÄA̬«ޟˆp°…™Ù°²!Ý£œàï[ŒK؟Á!–gÇ:·o)4b¯â¤åÑUì;ãƒÁ–ç鳤KL +°ì©z XÑR{Íl^–¡ÅF©Ä¼–Hpb—Di†[Á‚~óuMs¢Ñ*m³qü싅?—‰-8•—åì¨Ò f5fû1ŸýŒZa{h€ž”^ÅÛºæ2õ;Æ3ÓÕAO™˜îâ9H›Q¸Žci˘QæôÒfŠQºæGÁôͦ<;ÐÅ[c õsùì¥K¥CŸRr8O|nÓÕx}pœclC^¡± “%øN¬‡aÛ(»ã^ ž:´¦/`·ö™©µáHz­Nf²’ÉÉ2=7gò˜*×(^aZëûöW±éâ °‹¡aXgw 1@Ç ~fÛ9*Ÿß 800<=Î"‚ÁÍFÑíR n5Šn¶ˆ Ö çGì<Ë{°â,#ÿÚ~ÌÓëÐ|[ÑêX§˜Dš3ŸT4(¾5C©ƒÏ7hÖ â´ÿƒñŒ—ÿ††G)é5 ¦I²ÿ2'koý3RÁ‰bŽô‰ +7÷G½%{ºðç (GÓ?±ÍC†n­ËDµYl¶©p0R¶ EÒ¨×kf÷A.¹ö.¿6§ÜbCWÓ¹ÕÛì³ZºU¦à“õœÛk'€%ä~çÃ-KØFaš¨¯ãðÛå !§Ÿ±ª3ÞÔh3¹ažz­Ü +Ngo¥Ký|k‚`ÐÃ!Ã};˜°½”\U,ÀúùX¸™Ù@‚¡=2H®œ ÷Œe{"8Û¬ ¸TEž…îMfÙo;»Ý|ÙA߬Ëf¶—‘ó-°ñSÌe}u|4~ß´\LÖ>âNSwóNõÒ}KÔÞë-hê3Ú.š#vz·ºL>ˆò޾Νªó£é¾$ ÒÚØàiÆ?j‹ù¬Ùdu4@tµaemÁqõ™ÍMš8]W<<lãíšEü±ÔÁøCìŽÉê+Jޖ.Í#ÓÐR Z“‰R¯²;™-ÿ­f;½ =}$ò¶1<¤¯w²‹ór;Ylc#ÛX¡»Eê÷ôëM/l_@ËRÏ¥ªÂˀÁ­iÀaÎlc™K•Öè• é×¼gMݏs¢Ô%g¬„Ž”ÞgéÙ&`e¸Ð¨M/ 1"Êë(’Úvš¨rDPgV;â ÎGú9Mªü‡#¹¶’n}Ëé"Á÷¦¿ŸÞ¾(gÊR?$Föûa¹È`ïë F Ï efâèýò5$¿¿ë€>ÂËKÀU•};ÌîU_ؕ™gÕÉh,!({¦ÌÔB|'ÜÆ@ HöŸÒhü.]<kêӅÍïWÒÓêØ5óÇ2ñÙ°dso¹¾/¹"gG¤½ÀíI)0Ôq¤ _e3Ô@>Ñ[@V‡ëbÃ÷7ô¯õìP§ï¦€dɵÿ՚.MFNå¡u‹åÛ +î›ßS@Z¼Öpµ‰ÆêÇêç)c1{øy×k?Lâ­×ó™E]˼ÔxÏåìgÒÓ°Û¸ 4Dá+¦a°G.òWþ‹à¯¡Vºž5‘Mwóf±ÉñÞóXBýÝ×7÷ +sHóÞj™}ïÓPU(4˜Vȟ|_†~3Ö]bÒC&êžl?·9› ð½?JØð‰R9t'p¶T~($æíäRï©VŒUøh^¢b*GÍP©Ÿ`¥ãLm¤Ù‚° +·÷((#Pnéu°ƒZòz#ÙC>œ^—=œ‚L¯å@§I/ê£]êWûêüí®&¶ÑÂNdIãUwÓ} ²ppßTƒ™R<”Üãj9=¶°1~´.PBǾþì=½Œ™Þü¬4ðw44€.0è&v?U³€_ .À¸…Ñ7ßÜðÁ°bŒ¢¯KŒK«D¦‘ð>‘>9L/j§%2èÁæѱ–Jô—ÙT|ù™…DÀ±JÞ¢_I˜ÿâ­Faœ §ÏØp€\ÖiãÁö|÷ïCÌEÊC“qšÌhÉ/}ü¦+9WJÿãF¡„sëÊÆõåòñC/Ôe— +IèÙ&s‚¡ƒà‘?}¼µh\0àQoñ’¶Îlñàûß +ÓÜÁ? ¯6»MÑ!!vßÎrrC^` 3¬?óÁˆ!7­ÐÓÉW/éüàtJ['ÙLØôúÖÙ=$7Õ¨çšijZp¢­zÉUˆ4‰ç~ +\ÁΛÆ؃ÄbƒmÅ©?ʽe5¥øQ78§»£]„oà]š`Щ“M-b®ëmÔ÷AŸp¢ªWöµó÷K8=«Ÿt.ú6zGÀKy„§­Þ‰…Ê ³64@¿¡´è¤çá4$.¡Àt™&¿çjM)÷‡ö ™tk<¶Š‡£{¾)í|š90ÄÉÚóF›îLÂc+Õ È …hÐ+hœƒ¬³9MìÒfËÛÌÔ³¨mv“½ _½’ëÐýHì‹+ñÑҗüdkF TË`ÅâúJ4z oË&w·ÿÉÈ4Þ.`ƒÄìéÆ6A8cÙ௑™vžt<¿?0/[wPáóR\•ëÆ×(¶‰ôK¤Ø+òxõ“k_ü™t´Õ Ã>óʏϠm>²Æ•¼‰H®×û‘ÐØgsúfÎóIfB„ ¸¦MƒôRëñLt0’D$>wåsÚZ=Ì-jua—;t¨rd¦ZoX<šc6ãÿÌ Nß!ÿYF6uh±Ñ끕ÿçåëIÕ „xÆ.àü¼aµP;c©,€†›Øa¼­€MYz¨³vYÔmD´uքkéBhu™]6ô!õž Œ¨S&zê8‰¦1ÖL]èLfÌ»ãW Ó:/óVv¸vxÔô®ã¾Î2“ðçNg¥·eE[+E67§Ð<¨ß€YšpÔÑÆÖ1cÓ9¡¡ü¼$ü“ý;) îÕÆy  îˆÐâ2? +¥ñΜv`¿`Ý5ˆs¼2PêxÆo²ñ%`öú¥1Sfc/²1 ©PlÔvM%\IÔ­q°6KóVÀ ™éE;„2Ío³k¡¾è08¤¶ó¤{5›y[Í~Ëò©Ÿ¯™šbÚx¸æ¤K¥°– j ʎõ™x¨ß\õYûjÂi=Läï­ÀY¼Ø'>מ6O.;ñ“©£M—Š.Àýºä^LÄ2=_cxق÷R‘ôÒãÕB3ÊzùþõFæ °•Ì‡l8;¥™’Õ1ØÔ9¤i]äDzK$îÓ¦Q¦I?å«ÏváÜþu`CLN[™àl6mcóGrm#¹N¯³ksNrN@ê•÷Áä’õ/?0=Ā,(ÛÖÚp ÖÊÃ1µ ‡ î°úMcb;YžXQÇ9pnÐш%…ð඀r;¸v߀ˆ«]øOۉFÓ×@h +Vñ¿2˜ü¦ÍóuBJÚààÚ§~ßcÞTD¯¤!ÜH›Ó°µ[J&üÖ„§ÿåC֒– >³@´þ—ŠVrš¨–ò0¨»ìBJ8ycªiÁY1ÿ +Û»¿´#óô³ÀîŠÎAç§ Ä­+òþÈÛ¬~ýѦœý–ž5C»ÌÔkò$+&Ó¯o[¨Y8G6$ó*P*Yàê×^ÆÖõ/“î¶Ë†±ÀïÀºL4Ò'³÷PÇ"ÀŒ6,Lò²P̑Ð$¸Š¤û¿]²ÖX˗„|à ÚHÁpÕR?ñ™-]X§Ú]€pÖ¾uYc)éO|ô¬;4šÓœ|7:'&~¡­êÉL'&y¨{P©Èϐ»›ñ¨ôȃ‹ì‡2qÒ3ãџ5±i>²#cß 7Åwº¨YØiàÃA¨PÍzƒæÌfž¥HÀp´Ü(K¨šøo??ÍÔõU¥DyCK¦b € h±‚½Ô8e¦Ñ¼-jê÷¯fæë5°lÁÀòЫo ÷ÃÏô GùD_ØêA'¼è_•ùœ`µÐ˜© æ±»°ð×°¼~».«>þ_óÊe}þݯ牫+–®Gza{2 +ýAlT@X°È<|ù”k‰%ž5i‰zF>K¬5qKÅf‰ýœ]ð“Ó®]ìƒû =¹bs(V¹U^÷Cû(Ê>uZ"ŸÞÑ6:k¬ÃÜc[10Ðض5ŸÆúó×ÓXMñ¼ÆRÓ|kŒ¯_FµÒÉÙ]å€ÆÍiôî“뵆FâŽUGQ"?*Æà8ý”þÖ>@sì·&ŸbÖàÐӜ-¢X¶Æ»$VŸcQ7pX!§aˆÃÓñ´œÄ±~ø _a=¢]R«fæ™ ÉyN|ºnSßmÄçªÍŽ=ºƒ÷RÃJdKµ$‡® iß<~OLkwHdw†8ÖÜkD_žÿ4Å°B™–«ù[RDÎëmû…5ó½Êò(¬5 q+¢°ù +k~¸ñÌ{`õÁvÀÂé– ï}k×fÌÕç±Û{âXݽ$QÞÔ|bXš“¶ ½øËÝ©!b­®çyI¬%ûao•Àúe!êåÃaEœ&˜nÉ5(g³1(ÖFá· ‰µ^ñ6FbXᾈÓD‹ĉ\¶é³¡9$Šµ5ˆœ$±¶Œóáa…åëéVˆ¶-–”Àš±´ãþcJkÏÚˆa¥i¯îOÛ('%ˆüí%úã‘Eë{ów|{·Šb :C„7×ÓÝÍcÆ¥Ö +1ʔÓâX³MRÛ9× +¬(Ö%Ôñݦ£§;q™›Ç0g\Ö±öœã‹§àñâJ«õ +k5b< 28ܞ3}ä(˜®%¸ëZi¬«€Y€õmñ¥] ¬Îd—,ðÅ'‘yÿÊA¬6+DC´ï¶×­+ô°¦ÎB"g2v +k̘± +ä¢af¡Å“ë5˜*ñ…âÜñ¿!Ê]w\ïÞ7m¤›Ï¬E«Æ™¬þÐXƒ5»`®»HfEa5Ëe„•ÒÓ("ƒô÷³C-P®>Rø°œçÆÜN$ž^ô×l³ê6í© #Ï\ê…#àˆÊ¯ÄÓî‘ W3ÔÓ+ý !Êq—=…ÛóJÞ÷bDù3æF/ˆ©“¥š¶(ñtº#ßWÎ_i¢ÍLd÷¯¤ÿ¹g°m„ÂçžøSçéCc0ßÑS§!jÌóŸ& íiÏÇ£Ô BAè<¯5awñ{š²™?qÍ8kX’»Ó;%Š( Îmý„â) ¸oždŽµh ÿú‡þÀŒ‡cŒ|‹;ΆT¶óuÓ½l·‘îeÂvð‘M%íÓT*é(Ypûnô¶†ÃqQ1Ô:—2£Š$ô )ôÅ BGÅ¿5ŽHç÷Ȑ•‹0kÎê¿‘‰ ì%mæä¯?x²÷¨u"6êLv_Oƒˆ¬žh +íıº»i¬ÚìÌ!À +Ðpˆ‘)$h½ÀKaÉ`ÍÙ|=m¦×ë8¬È6`±ºxXýyh„¬¹5ÂZ#ŽÕ]‡ÙÆb`5’vI¬È6ÀêÕAÛà[«»ûE™¸8b‘7NI¬È6Ä +mƒ‡Ά‡x.Õÿ^ëHc…Š†$…a<(C©éÖ®–V´ÒøÑ'šÝƒòï!aC¿RÒý]V÷žéƒzÊ ÊZ+{ù^$Þ&Î^€InøJqΤÙQr†!.·÷㤵IZÙ¾˜µ¡•@sHÚ=ÏYfÙBŸ˜ï.ú¡ßÁBU½ÇeÄ_ô¼½¡à’¶9í˜Ù7ئ#JCó0‹ÞâyçÒ«h ×üêßèÆL›¦}lÌ/¥ÉLÿ”£ÕAzÎØ £™7úkeGˆRéÞA0À‡) qÒ'?óôdhð_À™1¢ ?,ö‰1Y3Vꚤ$æ@ÄÜá/*þ¡gˆloÑ~h¸òì$Ù>q#Gd ]QZÃᙸôð)³Gà%¥X‹]é{×Ô$C–é%Í!«çè’c{qžÏu÷òüÅ1ÍÐÒüE,HmWõåIt@}%nU½ƒB„陵Q¦_ +ÙwWR¨kÝó0°óà!šV$'’Ã`°ƒæI!“ñ¦äöìZϒ#¢GD=ú‡&ŸXx’/óÝnO\Ž‹oOÊ´™\Œ,•ULŽZ|~¼ÉÙtò“£þ™ØõT(B”̹ Tn%Î'n^zj^âóƌé3iNþeŸ0ÃӏÓ:Õ9H%Lw`å¾’A;!ÕÓKv³‹Ñ AA~èkzݸÙyôâït;s¬ñ6û¦Èßìfœ¢/ÊõÔjU9Sd›¢Œ)xíÈ¥i ý>FR%‡²#ÒAÒð GeStÅZŠä䨴%_ˆë5p q„ÐR дvOIxÊâž[y¿o©Š¾€Wí$â76žÛÜ%¾¢À·#ÃÐ:q—_͎?Î5Ûk¾iôg³Te5íëuؗnò±q†ÏZ±&)ï6jÉRçb ‹Ìé)çU¡%ïKüsñÎ}kFL°;ÅÐû’ð@TéÆÆÙ=XÓðBlJÜlÔLéÍ}§(À9­tuÞ! +a'“D.qøI¨¹@ü“Oá\BhMWäð3Ô:ÔŸRà;ãFyÖØî“v?têwF7ðyå>6x4JÍ (ãނÐX/­ü¾Qá¥Ðäw¡: 7ù¨®œÉ(€")Td¾i8âvÈò”yášÍC€l*†C'Àȟ…šýc•%£›L×fg§ñpx6šÀ2»ûøãETF +%©9Ó;ÕD²/‡ÀŽ“nÀ´ñ˜Ò |T¡ÞéP`EA½è4–nhm€Ây“~/'Ý(éF'Y܃Ðn’n +th»–0®o~†¸N¨æ4E@jĉ<*:¤F’(Ç!iû#ƒ}g‰0¼tå Y4‹\L‰Ž@ÂœâÂ÷rPG³e Qd持ïÔ,†ªŒ®xV d«ÔØ:-NⲧçÝ1aMYâr¾N%¡ÛR›P!&q8)ëîånj6Z9~”´°Q$©øKBœž, G³*((¬Ù-ÈW¤6§‰ÍL‘܏Ú}NnîpÄÄpç,Âóq¬-«°yloÊ(촟¡ýKçApªºêó@“ÕþÅG)Ï-„v§ö¯+©õ<åXk+Ï9Ö ÇO#ªø¢òprŽ´g—m§ ˆ”<åG1aCjm·Ÿ2‡cЈ²»…çcÐx£‘!‘h˜#ù:³~…Ô,.µCRÒ&+¢&ڞ)¶ĝJ°HŒA»yŸK mry÷ƒœäåÍ+¿šü(®¬É´¥Fÿ ÃâFaGÖç-±'5&Œ-ø¾Nå}&fÆ9“®MpL ’1Tù¡%͸®Ü1…§ÆA™&’'$A²ó#ô`ß´Éø>›EÊ®`<©ÍƂ È6¢TËÐ<§œÏ"[Ë÷‚-=T·gh]×ò½àWLV·a©åÕ*瓯å{ÁK)瓯åã+P”óÉ×ò½à¥‹”óÉ×ò½ðKï/瓯壏µÇËùäkùC?£œO¾–žÍmå|üh™<ÖÀ†ð”>é:°ƒŠ1©qƒa)åŠWvòš;–FîN¼ýJócç#âÃMùë2‘¯4ß!u©˜ú¶«2ŸëT6žQ&W(›ò')”¦”å%1ëŠE|ªgxåèz€ðCùÂUjLX~šÌ°”]2cÚ tè[ë÷n;xG×ÃG0üêY>¿„6¸²=UòroL/ì%§¢ÃºÉ{#3&”dñ®’óÞ¼°7Ž©ÖmÞ¡Å÷GÎBï ,‹zÄ{ƒqÚ¦ø°÷Æõ4¾ŠYz¡2Î~¬yRey/,Î{vežÄÚ<»2OÁZ“Š åZ»gþÃ#O!]uê%EªÔ:U¤^hÎgH@󺊠—¨j€'\6Ÿ¡c (WyÈw‹ ¾‰­8QŸ ôð +½UdÞ+J7É ŽE3ïU¥X-=jîÇÌwJž†týØ}è²[Ö×¹0(Ýñ¢>Úpî 2M2ÚpP]à*£ª§Ä²%nf·Ö“®:F€”îÂQcâ"@7îGñc­õ”ýؒ<qŸJÅA›Üt1¤E೤L€^%,Áïn6»q4ü:¨OÉû™ÕÒ°ýÔ"ÙöS‹dÛO*’ý><¡H–ÔڞS$ =§Hz¼HByJ‘,,£S¾èZ˜;(YF6ŠÌU°ªò—øé…ÒpaM_¦­\-þ‰a´Ð ­›ï/’Å~žs¼mÞK•¢uåÊî–„ë ¿Oa?/]ì÷¶r´&RXÇ2XsD¯u +k—E$VÍ·Î۔¢°U¶ØO›-èK ÷­ áGŸ˜¢ÀËLÕ{UÝ\A,õª¶Ѩy¼ Wømãp֜ŠÊùӘM ~n5 +ÎX9Ÿ³r~ïµrû¡ßóó…~Ø»Š‹^¨ž^{I?•¸ƒEº§W\ô.jéŒ.éâ"Å5×ñ3QïàcíõøcºüŸÕ^OlùÔºí> ÚGŠ31ñWZ¹Û +/wP¦·›°­ž +·Ý õ$gø¢Ü O©ÑŠš¾ˆÝwwU¬ª+j ¯Ð~â†}C,ÊîoU¤Âý¤Ò]ù8£ði…}bÖÇ­>…}bV‚¸Ûî¡Â>±ª>IúþÂ>1/"í ~faŸXUÚ7Ï-ìc6¶ö¼Â>iw÷S ûÄÒS0 ý¬Â>ÅLÈçö‰Åy$¢¸öñוªê“ ¬Ü[Ø'Å}vaŸLÅÊ3 ûÔÞÑõ`a–ïÏVõá&î“ +ûÄ'ÊõÔÂ>±1á¡ï'ö‰Uõ 2ºžQØ'¶†ì¾y^aŸ(&XüÄÂ>±ª>±Š• ûî&Úm…}JD{RaŸXUß­DSQØ'VÕ÷"Qéõ@aŸ˜Nú"¬ú~¼°OLö`‡ô³ +ûĂ-”íùÔÂ>>½¢‰{gaŸØZKVî.ìÃW‰‰Ìȝ7wöI؞’¹³°#«c¾H”Ý[Ø'6¥ìæ$)}ëA‘Êž®Ê‡ŒiE½C®PÄ_و¸uõ•¢Ü¨Ïè⧤r<©‹_T¤…Ÿ¨Ê¡ŽTŠ=€1V¥œÒÍòKõÕñd¹RÏ^³ºåû‘>~ÅüåZî)õêÓuÊ–š­jLŒªVØȐÊ{ƒ°‘4™\¯•ƒo2…&Óub“Ðg&a{ +úÿÝY<ǹ™%ólTêë*›ÿ1œ&¿7ÿ£¼JýÿTÖô=ãŠð‡šÿazšLÿ?õ¥RÍÿnuBÞÙüOÜ )ìÿwc½Ôu󿗫 ÏÅúÿݑAŽ ¬=Sã!™”+S<÷¼}é9w’£µ Ö®&*Éçwp —Š5}bŽ·fwŸKPI2Óø*F±mŸtfˆêò8Ô±O!N]’¤ŽOCKöãÅOLÆksòN>žµvSÀzõUחɥă¡ºå}é·¤Z!‹à9©Vèn‚Ç9 Ð\M–•šBÌ'DRž*+Æ*ÝrJ'ŽA@wmÅ+(ÀÎå+íqhҗ$ªi^/¬öý›¯ª}ÿæÊÑ(õhsUý‘Eô>‘$rͬJ°a‡™$5ë[DMkƒ›rÁ) Å]§l·¨ë|å㞪œ…©«|”; cšOmîØ|^sǦ „â^)ÐÚݤÜK˜Q¨Ý#:E>}ô@O¸Æ€t_‡o¾}Éd#ݖ 6ŠH Å#Áb “]ïGðH Å=Îû;úþ‰f¦à­ÿî܏¨'öúVêû§RU´ï£ªK¶þ»±ôG¢ïß­&î}ÿDŽ5~ë¿Gæuå³¹­YŸšrß?ƒX¶Ú÷®¾ª¯oÏ}®/ƒ,´>…›7ÔWû’ZQӒeèÛª}Iímýåŝ)æsuŠ…˜Lé=gÜ H•óK!£ z¬ÚA¡NÏÇ«}Û²wÛÅÑéyKõýU֎ª.‚<ÍFXKuµËȚò'š¨L,ÏÌ^f?ÞXHÕA±*écM¼–J®Zn"íí£9Mµ ý¨ÈIZ÷Û@[©Øž* +©:ÈÄ’í9<ÊÛùW¶§Ä!4Úe2&5F¡û K¶–êVqBn…hÀ×ϸ~ÊÍ°›àùQÜ;ênSvéT>N(¼©L{äV­k¢=­æäąr%£Qj5›”ݧâ}QÙ@°3Tß(U2…úô=­&“ì-#ªën¹mõT¶¢éE(ŸŽGçÖFуÅ@–6à?qej/Âê3´»ÊWvùô¢ÑŸx5rÇùvä°"†æ·¦Ó:ƒñʼ°V/Y™w¼ŒìÒõ€Mعvâ³p­éDº²Õj=¹*Ä?R`ß +ïuI¬z²8œJaIÖÈ4'ÿ{²ŽM—_#wÒýÌ¥*óüùèáuÃÎUP™gÂê_Øîq‘#NI¬D6@¼K`õê^?7΁V€NW¦üQ›=¹¥±æ¬£–$VÃÜèûÁ]’@»Ö²AëñԌjÄ°4T!b¼okð–v`ð£Oôb˜R½ÙFÍ{ƒËfË6¯zu‡A¦SUéù¡¹>8a‰ÎwB ŽbIÆ͕&{9JŸYìɧ";“6ØE"J_駴]HCc,+z)e#Étåã©Ã¢mÝÔKmÂçu¬Œw€ÅËÊß!¤V N œÀ/"iTû¾ÒŠ`°„KyRݒ¸¥Tg–4Àn+“Ê}ÜA¬Š«n̓΂3TL„W[trù}£¾P!]ŽÖÓÔ KúŠž[÷MH:–Îu.߹ܓj„ö K##Ï®ZÏm×z~ÄÆ'Zæ»%Ÿb£6žyN˜¨kÓ=ÁŸ–yÆ%”°‘ÙÆ/R›©+ITë¥]ª’%‰ +Wª«GT_·¦dÕddsÀÔùÓø©(äuphâ<ÈÏZµ°gŸhIO\Z5‹¡¢J¬­`rë:çƋº½d.þgœ9/Tá¿:ÌÊ¿öÕú$%””êÚÅ:; ÒIœª +Ú°€ä,'¯ÒÝPÐæ¿Ž“—G*½& +W1pî5JtJ×ÙI_Å BUç)PW^Ò[ë±5D%EïP][ªØõçj %³†Vþ£b©jŽ8^éA“,¡}aû­ÝífƗ#šb5ÑMD{Öý(šdô.¢ÉTÆ]U1óƒÅw–$ªUñú›;JùÛSºñEäúJùƒ®G|ô“¾±$Qm="sHÚHR0nk4([»¡$QBì]Õ#Šì7”$*5RÙ7•$JôªQ @ÝZ’¨Ê<†WùSº©rI¡Qڒ®6ÅçuW³B\ +ü76+Äͨ«ÚÆç5+Tr?<©Y!w(ˏš +eÚS³BÚ¥zoc@µÍ +Y·Ýo³BÄipXÿ½Í +ñÌûÿÆf…âî8¬¹hÛQ¤WSÃQºÕ +ïvȦÁ=ÚðaUñn‡·fÛI6<¼çV«;JNî·Zq ʁRßðP¾ðå ·Z¡†‡O¸ÕJMÃCuõž7<ä$æôcè»Fe»b†Çc o,(»·á¡-øݯ`îmx(?¹Ùþž74<”ïv(ãë¼­á¡ü”(Uý “aŸÓðP¾)-Óox(¿YU]XukÃCù“O¨§ÝÝð—þtÕíPÔ¾¹§á¡|^–výXÃC¥$Ïhx(ßí=omxxcŸÂ{ò¡»^;ˆïlx(®F£yNÃCùx -Óox([Cåª?«ZMºÛ!n<ÔðP>΃tg4<”Oñ–ôÜÞÚðPª E›{ÊCy‘ìSøxÉÖíð±R’¦¤….ˆ6«KíUÑðP>‡ö…½_€Ý÷5<”¿y„3<lxÈ~‰Vl¿àEKêK ®ªiÏhx(ßíðqUnxø„rl5 ՘¸OhxÈ@·¸¯Žµ[*¶(”6w4<”+ôø>жçã E™Œívø˜Lk«U~ð¸çC å•,û᱆‡ÁÅJƒoõJ6<¼½÷®†‡¢PXQ,_±rCÃÃû3ºDÞ[ªÿBWH>Ü𐷯ºRhžÐ𐩪ïvHË´ÇÊ'QQÊíÊ[÷ ўVx%Þíð_'Ÿh†‡÷۞75<”’‡T·Ãg¥(¦ä»¾®Ö¿»á¡|·CZåx¼á¡|‘®ø!}GÃCùn‡Jzšú"]Ùn‡¸ò¡†‡÷h6w4<”\M⇾å )4jÞ¾-z ôi ƒüÆùKXBÑCÀ}v-ßՎÈdþDæÏ$²¥ ¯ÙÝo™ÈÕ6¢\xåÍbIT×ó¢^qˆFá·E4O? ¢Eœ×Dk¹m[ËHô¬Mџh«Ä`ÐYÃOי¹:bT1֎ÇcÆq<}ïBÇ ¹m4ÇËÐo<|z¨'|žaµ©Áö;ËWóïE¼Õï-5fý[çãÕZ'ß>ê¹¢þgõ¦ÕïFÝzúVpôÕÉ_'63E‰š‹uï~¡eA%p&‘m4ވ×ù |ý±'ôÚ ’×Ó ¸–5¶d׍5Ȥ;,“z!bA¢åjA7 Èå@ŒÂÓñøn³pÓ½š«ÛÔ±„]†8‘M–’Dv1-¹êûæ¤x'°˜VC#Œ2–ˆÿý‹pd‡šªB²FdZ¾!êH8ªs«@ ão#^+ÑqÃyi±Éq§§ Põ¿z)üîÖ؆,Núߪæ5íÏÂO¥¦MRµÀ–µ»Ì¾W֘:0×ñÁO³vö%¹Ó…è+iN‘!€&õ;vpjÃx¨¬9¢Êfœ?øTߓÖå2 +>µÈü'+­ýÜõ؜ Âhw ?¡„4ҟþæfð‹¼‰jhº0,Ô¾É[èo‚FüÓFÿYvÓ0€<8g¦«C€px +Db³+Ÿ¥v»Oä'…Nvhú*‘Vb;bÆY2[ÒÖ·K֘/HkêmаϬø³&9cØñ˃0ZÆãiŸ¤ “ šÀ¢éLÄÌh ¢ïÐÚäâöý™ÃÌûY÷eكïÊJwräªt[\¯Á7Î;Õö•œ ÞÆÌkÔÊʴɞ„¤ªÙX^z"Æuš½EN½)'ü“@ iä4_EÒp§½/’^¹nÖâ¨ÔW.ð´aEO&op†­a§Ð¦W?á\×ß2րi­W\ì±å§ÈȺV}Y¹Üppð ў’À†H:t§°¥:z£M÷{Âןi] é4õêzi»_NvEF®×px„xÉiºÌVÌÔÛ¿8Óùˆ~g§¨”îHÄ Îô´êAŸà!^7ôח¯:ǜÓxHr.áú¶=Œa/Aöì¨Ù–s¸Ê?úíðòI™:?ÌpzN4€†Ñ(4ûcŸ¹-™V'g3Áf3jkRpŸ‡\±Æù3¹¶/͉é¢œ.4uΌ$˜>¤)ÖM¢Çõ4Îg’t½] +sk߁&âÒ;›nJèC_úSzü˾ç¢ßkm‚á4‰jªÑϦ×Úiâ³ñmÈLlñ6ÐÊatƒ?½GÎ{/%€”e*Ó{µuàYӝÅQï[ê’îe睴nvɤúE]>sü +=ëIl—9ö[¥làµ9OLk£r¦<´À±ž,Ãý2w¬CQ`àR=Å =h°”Xk‹H`Xh†¢ÐÜYUŸàS»†ßàO҈KàŸÈüé3#\”µVwÓ2h<02nCòP~ö€&Ö:Rû|þá SJ§_¢–ébÿ¦wó“&­†˜:S2áb2p¶Àï,øwe ”L%JˆCIêHÃ;HÒ¬“¤¯Õ:¹Ön³¤íµðƒ ›wZKJÍʕµvgÚöeA‚._²…Ì|ÇwH¦" Äé灧žI .î;AáÏ{Ëìæy§n² Åªí6ú>qltí~Ù Hë~³ÄœNiYù ´Õ¤¡Eºõ+ù…þÔå­NãrSv%Â.'1Ÿ¸½â%¬H!¸ò#qÄ¿HÿŒ8þ®‹˜œ˜k=ÎBß½¹ßÓ5bö¶Mƒ—\A±:ã `¾­v>ŒŸhshÎ0*â©É»ƒƒÒØtà;ÿ…ꈮï9‹˜f‡n†È„«¤@9OµkŒ¼>ëIî:u§âÀîïNöÜgÍ[à';û}÷ ø°‡µXæl‘íç?…œö±yÓêÛÇ9 ù½ÄZó8§µ¶sZww“ ¾09rœ&Ã(=¹‰ü¨¦¦4§­.­Hwˆí[šhbЅ1¹M +¢cMc~|lEº?'_1DSÏZÝÕüýÂëˆín/Nä¨Û Ð;¨~"흃àtèžN§´Q§o†ÆÐúáÝ7™H ø!-GŒÉüðÈ ¨şYk²:=,:'Û³¢Ø“=—&‡ ®CßµÙ' þçT§åý©×!C‚vB)]XÒÎ<Ñ¿Ìnu8ëh¬‡}Yc­tª”vˆü”ŒÙہF©GàªeM  tZÈtÁ56¿­®±¶úYþŌ\ÇyÝþe=ÂÆö-Ø©àò$Pa Jë„F!éدœÅwÒô iڒæ|ÃÐ;Ó'ì´;ƒöFØ(3jž0F~KÔk*úk.›¨¥¾g ŠäÇhd’ŽYêtÌ8ë‘úSÀKŽO:)¿“Ž(v?á *6ÒÚÜPWë[{X–·†»’qF·-—«é9 ×€Áî°..E8Cè¶Kv-ܕsÞÙX¿µEèe=ŒÁåÖÐ̆3î½÷M=uçkÚwÒèO'4^Ïx ß@Ç r°3¼ÑtEüš$ëÃûd¬pL.ÎCÀEÎðr32™øn³$䐫ǜœ¥[¸’~—?8ëź,[´ùž[²`!?ÎK°ðHŸIVàPmäd¿Œ°)Iðº”ÎIˆpŽv9g²çÊsXCÉÏV…qw žòÝ LùJØ[|F]‰cæl孀~]Žßɦý>$r‰Pi ï:_Ìñk-ç`’±97]ú0Qã̼3)#Â!ô7Ã"çáƒþJ’rÚbå(òêSSâÿÌ÷gÈGÙÀ´Öi²âd>+‚}…Û“Ì•Ë —Þ•/òÇ;Dx›ÑÀsZ5Ðñ„ýåƒàOÿôõ†Á*ÙQ"C÷Jnd‡zgÚ6³ãǚÇՅõŽßê6Șĕ-iYœ™¶±ßèJ˜ .èV2ºbÍr™NNÊå(ÿg&ä ÞÝpŠ a”ngVÚâÿÀ›€(–=»ÈYæz›nlÎQ»VqüæR@ä§Y(QÔ³ö@ÿ”äôÍì…À¿Q™"99¼Â‚ˆ(« ¢ø·µfèD¿žr:ê½Ît\w%ÁäéœÝ ‚€‡ªG«b÷M4²ÇJŠà]¢ą€š ‚ÁmÄ_à•Á…Ý{FÎ} –Ûaá3¨-8ʇfxúUMWák:̼—zÀx,#]÷ÿ„ðþ'„÷?!¼ÿ áýÿ0„%“‡§f: §32²Ê–þYunf×Æ©£˜ =Ü·ïqÅڙ1"”ZvZ¯‡¾tpî[iŒ$©uЁ%OÄÊE(·¬•’ž”¦KuØX˜‰ÎÝódâùÛ@°áJ“Š Û3 휜ßͨÆL1Ѹ}G+\ÑÑâK·}Š`ÂjU’J3PÄÍEÌ$Ð„~·àaµʞw:H—Ûá øþñµò©Ñ*1t=-÷‰§ÏÀ¸™É©:ýº/àòüCÿ8>/ëù±zü]þnÿY_þœAŽD$›ÛÙ.{œÏóÿ}N聯Í|{þüçHÔS…‚ß“žOw³ù?ªq‚gäc¢ž ­µ»¤l%ĈÉô"[åuŸ‘qzAt£ehæÔÌa_˜óͺ/Õ™­kŒù“þÙ¥¬LJ ¤êQ» ;f]z~L^2–J¹-؃(L5r€&ÓNÎ?ãŽÓ2ìÈ'z¥t/ÛªÇgbÇD¬0ƒE!ïG2éÎæ5íwh¬¦xœ20-5í;œá;|ÓØ®4\ó*ò~$5jmž¥4Hj pK¨QÆç³a|&î>‡hĂ=¿¦"̃´^¹g@oƘg£-ÌÁ.{[£ †é ê\ʊ@4膚í@N›@ø¶PÁëþéú“Ûe,ð!Êße‘p03–wz#ý~”²é,û)uÖñQu@hE9¸àÏ&‚k¦ÈññåbU 4t()`°ƒsº[æ4œÏÀïA¢¥㰞5yÿ°¼IÜ¢e¥"#™,Ür€É›¤AŠÁ5’e@2Ï 7ÌéÂ,¢¹v4ç¯i=Ô1ÚÄØÍÎ~Œ3Ù¤Šò ¬€®¾-ø³é ¹Ò!€]T0O@£«ÉÀ œ`½&cT•Hÿ1s#ôú®>HÊäv˜#rõE0ŸÏM8£<˜¹°kgC© +•Ã=›ÕƋ³ói‘úñf«Éµ_çDŽ#% ¥L§‰0ÿPE‚œËåܱãûfJ³Ìy@92nŸÆ$óiÆ©eSú(;ÿ¹¯†ã9·²fS4äkÙ´•ì¨ò@ç@ãÒO>¢˜³@M«ï¥Õ¢¡SÈ䥌ËAi¿: Ìý,dx t4ÖÖ $d»£1½÷Œ´½? €ÍÁkhL¿ë¨Æ¶­}CÁk©B/Z¤K‰=°yF´ñ^Ø;d€ü¤ß ÐëÂÔ7¤—ª*Ã3«‡(g$íz‚¢ê0˜èìîìÈOå4Ä5}´ôHt¦ìVÔhÌÙ¿„ ŽßÎÙN©‚¿Ö ™æ@¦eŠb• À.z/ X%±ÐiHŒœ¥eZŸÞ +)«-쑀¥t˜þi²¢r|¬«n–V͘ ¬1.Á‡ªàñSú3™kᙵ¬B-ÅJ+-K7$Ú»Nôy3‰FÀ£$)&¿sM'Z 6­›»x‡5噃þmÍÈ™ÀyJ¹ +¹“±ÖkfàaSb¨tÌ#G¹„mxFËÔ_dÅh4g#Þ9}\¥Ä¸Í9»;Ÿ`2D";³ ã€Jà±U¸Ô§1Ðuñ²w¼:Í[ò5ÍÀ˜ê¯2€’ ™íäHäw` 1ZŽGººã7ÚÌ ²[±;ó]ëÀ|×=Bw”…³nãq¤ç<þ‚èœZ§?gpJtºÝHÅo›ÇLâ içFaâ ºÇáþÄ“XŠ™(æŒ0t ÕdÈdzÐÕÞâ.Œ(Ÿ‰¦ƒÛÁÑg…¹¾P)”Øm,¸Ú2t0¿ñé`{0‹*r~4x ~œÌ¢‚†£‰!$Ê{c(dNIRی º +uLyƒÔZÔ‚Î×»†4Z›HÊn㶓çzãDP¹âŠÈnOkàl~„µ¡CÑ"ÀM-1 ãÑv{bÚ ~a²âE'¢’š0u–DNÚ\>ia»KÑùzìÕ\ò`¢_…íÐØWaèèꆮÇ8 ¨-ÆÇ8­ì¶s¤9MÆ N<Ìi†ãcœFlMRœ¦FÙbUäš…€Ó>û#+‚ò¸Å@NS #WÖ*ï[q/tÔU BñA ìâԄƒ ¢ÚŠ+TOŽ/7Ü[¨ðÊS“:oä&’·eoÛ#Wƒð–QÌä‘=’}:qŒ:HüÎ»Ïöfƒ1¼=v$L– {HˎCf{Ršµƒ`¤€pÓWŸí!¶˜Ú"vŽš¸èT3 ãN¢›]r"¢s+Äð?óÕ8þg­™ c˜9Çm‚Y¿M3u§c–a'}çÊ©~‘J ¤|ž8㧂.8@~´Éˆê0 m2`ÌÎʖó§±Q–0¬×v:œ€üüÀ@ M¹w»œI~±¸4m¡­`¦(‡6€=+eœ';_GI`~–u°&>gƒyô ?¬ÏUXdÆ…•6Sö €Ûš}jÉ>#±@?€^Úw<ð +„í„-žÁ£®@²QWh€› Ê4 ’¨Ð,p¼“´qû„Öpà`ÇAâÖhs0~¶\¬•¦¼ ¹¯æ Ã¡±퇮Ñp!¸.̑™ߨ¨›Éæ†<ÚÀhã4Åâ!¡4Êý€EÓ®.,`NS>¾9:÷†_Xu ²VŽp Ïùãužë÷üËDýòú›éÍ> /5häì_qÚÕѸX_§›ïëLÇ|,Ë´mt´–‚"©í`6̧šô¡Û&ÇUÅ#`Ü¢íb?¹)™ÐÆ þìQfŠˆNÑê÷ÌÏ{û ã9çÈ9`ƒ‹=þ ½ze¼˜f6=/ë ¾-ŒÍý#Œ9÷± šKoªBºöÁ?ݶ‘â´>‰þ€Ÿœø«•¥~牪ײ£V7•¶øMÙl¦Òbbç‡˜O‚^È¥vÖýÑ£÷>µÞÄ;]‰H¦ÝàM¼Ó•øò·yït%âÙ j¼‰wº©luÞÄ …¤ðf¶3<Ø ¾~_Õçç˽â&çËßmyü_spܐÿ¨ÿàð¿N ¨Âÿÿ<ðËòäå?Œ…énkúW†wZ ‰ã9ý;=ÿî¶ããý ¢ï:•r³þüG¿úgƒ!†à]ð½ X‡pˆÃ—ÿ þ%à?ÿ¤C´p´ ñÏ#µ0b ßGŽ7óÂv6ÿßôõóîø_ìÎøÛÄöü;^ÿŽO¿Û%ú•';jÂ`ÿÿ*‚Oà»ÿüGÿ*ÿ¾úÄ¿Ù xø ‚ÿÎ^þÃûÏhú×iC‚%öðë*õŒ¡ù¯3~ùwÀõÏæñþSËæòSŸËÔg— ~‚opŸ˜ç …¤€ö„Ýïvy\î„Ýë÷x½n +¿púÜ0#»Ëéqƒ…³œ¤Ç@#ry|ÿln¿ŽÈíñRŸËôg§Ûî÷‘$ü½Gºüv/IøÙ/è—%‡‡­{òw9<þ.ÎÃén}Ù(ð=!0V?é÷»=hA°)PcwÁ1yI»¼'àôÁA»H»×G º¡/èA¢·ñÏì/UΠ¾¯×·ÏáŽE!0‹‚­ ³$ž³ýíqÛ=./É~áòD^üq:v'÷ç +Vž/ÎÏñùGÍ4ËIZxY‚D‡ ž¹oãå¼qÿ®¡,YžÆÿkþo¼ÝîÎãó|ý[ç'°gçÿN?»ÿ„ßÀ±?’© +LÅÿŒÈŸÈ +endstream endobj 7 0 obj [6 0 R] endobj 24 0 obj <> endobj xref +0 25 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000044463 00000 n +0000000000 00000 f +0000046571 00000 n +0000046388 00000 n +0000168557 00000 n +0000044514 00000 n +0000044880 00000 n +0000055560 00000 n +0000055447 00000 n +0000045262 00000 n +0000045826 00000 n +0000045874 00000 n +0000046455 00000 n +0000046486 00000 n +0000046828 00000 n +0000047096 00000 n +0000055634 00000 n +0000055830 00000 n +0000056898 00000 n +0000062550 00000 n +0000128139 00000 n +0000168580 00000 n +trailer +<]>> +startxref +168773 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png new file mode 100644 index 00000000..bc25641a Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg new file mode 100644 index 00000000..aa301583 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg @@ -0,0 +1,89 @@ + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png new file mode 100644 index 00000000..a5a40d10 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png new file mode 100644 index 00000000..955beb71 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png new file mode 100644 index 00000000..e2e6a010 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png new file mode 100644 index 00000000..dcd898c8 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai new file mode 100644 index 00000000..321e40ee --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai @@ -0,0 +1,1350 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[6 0 R 26 0 R 45 0 R 64 0 R 83 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_blue-orange + + + + + Adobe Illustrator CS6 (Windows) + 2019-07-16T17:02:54+02:00 + 2019-07-16T18:26+02:00 + 2019-07-16T18:26+02:00 + + + + 256 + 68 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9IeUfNmk+adEh1bTXrHJ 8MsLEc4pB9qNwOhH4jfMvW6KemyGE/7R3tODPHLHiinOYjc7FXYqkWt+cdJ0nWNK0aVvU1LV5RHB boRyVN6yv4L8NB4n6aZmn0M8uOeQfRAbn9DRk1EYSEf4pJ7mG3uxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KpDeee/KNnqJ0+51OKO6U8XWjFVbwaQAopHerZg5O0tPCfBKY4vx15Oyxd j6rJj8SMCY/jkOZ+SfKwYBlNQdwR0IzOdaQ7FXYq7FXYq7FXYq+Pvy5/MDUfJmtrdw8ptPnomoWd dpI6/aWuwdf2T9HQ56n2p2bDV4+E7SH0nu/Y8hpNVLDKxy6h9a6NrGnazpdvqenTCeyuk5xSL4dC COxU7EdjnmOfBPFMwmKkHrMeQTiJR5FGZUzY55987af5P8vyapdqZZWPpWdsNjLMwJVa9gACWPh7 7Zn9m6CWqyiEdh1PcHG1WpGGHEXzn5H1/VNf/NzSNV1OYzXdzeBmPRVHE8UQdlUbAZ3naGmhh0M4 QFREXndNllk1EZS5kvq/PNHq3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXzxqf5f eb7fV5LMafPdlnPC6jQtE4J2YyfZWvfkds4DN2XqI5DHhMvPp831PT9taWWIT44x25E7jyrn8nu3 lzT7jTtBsLC4f1J7aBI5GBqOSrQgHwHQZ2+kxHHijE8wHzfXZ45c85xFCUiUxzIcR2KuxV2KuxV2 KvhPPZnhXoP5SfmfceUNT+qXrNJoF44+sx7kwudvWQe37QHUe4GaLtrsgaqHFH+9jy8/L9TsNBrT hlR+g/i30xqnmPSdO0Q6zNOr2JRZIXjIb1eYqgjp15ds8x1eYaeJOTbh+/uey0WlnqZiGPcy+7ve D/ml5jvfMPkCLUbui1110giHSOIWgKoD3pU1Pjm6/wCB9q5Z55Zy868h6Wr210MNKceOP80We83L dhX5T/8AkxtA/wCYof8AETne9s/4pk/qvG6H++j731X5n8zaT5a0afV9Uk9O2hoAq7u7n7KINqs3 +e2ebaTST1GQY4Dc/i3qs2aOOPFLk+b/ADb+evnXWriRdPuDo+nmojgtiBLxIpV5qc+W/wCzxH68 77RezunxAcY45efL5frt5zP2nlmdjwjy/Wx/T/zO/MGwm9aHzBeu23w3EzXCbf5E3qL+GZ2TsnSz FHHH4Cvupx4a3NE2JH7/AL3uH5V/nXB5muE0bW0S01lh/o80e0NxQbihJ4Sd6dD28M4/tjsA6ceJ j9WPr3j9ju9D2iMh4ZbS+96qzBQWY0UbknoBnNO1fPf5jfn9qk19Np3lKUW1jESj6lxDSzEbExcg QieBpyPXbO57L9m4CInnFyP8PQe/vLz+r7UkTw49h3vOofzI8/w3IuE8w6gZASeL3Ekib/8AFblk /DN7LsrSkV4cPkPv5uuGsyg3xS+bLrv/AJyD86z6BBaxSra6xDMDJqEcULLNDxI4vHIrqrcqGqjf 276yHs1pxlMiLxkfTZ2PvH6XLl2rlMK5S73oH5Eee/NXmmbWl12++uC0W3NuPShi4mQycv7pErXg OuaP2i7OwaYQ8KPDxXe5Pd3l2HZmqyZeLjN1TEvzQ/Nfz/onnvVdL0vVPq9hbNEIYfQtn4hoEc/E 8bMfiY9Tmz7I7G0ubTQnOFyN9Zd583E1uuywymMTsPIdzHPOX5zecNbvVTT9Rn06whCpEtqxgkkY ABpJHj4t8bb8eg8Mz9D2FgwxucRKR7968hbjajtHJM7EgeT6G07Uj5Z8hWt/5mvHeaztEk1C4lPK RpWFSn+U3JuC+OcNlxfmNSY4Y7Sl6R5fjd6GE/DxAzPIbvn/AM4fnp5y1q6lXTbltH02pEMNueMx XpV5h8XL/VoP152+h9ntPhiOMcc/Pl8B+t0Go7TyTPpPDFJNI/Nb8wtLuBPDrl1cbgtFdyNcowHa kxelf8mmZmfsbS5BRxxHuHD9zRj12aJviPx3ZH5g/P8A87XtzBNpFz+i4vQRbm2EUEyeuC3N0aWN 34sKbE7ficDTezengCMg4zexsjb4FycvauUkGJ4dvJ7V+UnmLVte8i2mq6xcfWLyR5xLOVSMcUkZ R8MaoooB4ZyHbemx4NRKEBwxAH3ebuuz8ssmIGW5YB5v/NPW9RvpYdJuHsdNQlYjF8MsgG3Nn+0K 9gtM811/bWXJIjGeGHlzPxfUuzPZ3DigDlHHk8+Q8q/Wk2mfmD5w0+cSpqc1wK1aK6Zp0YeHxkkf 7EjMPD2pqMZsTJ9+/wB7n6jsTSZRRhGPnH0/c908p6+2vaFb6k1u1s8tQ0bVoSpoWQnqp7HO20Oq 8fEJ1VvnPaWi/LZjjvir8b+byLXfzK87WuuajbQajwgguZook9GA0RJCqipjJ6DvnKantfUxyyiJ bCR6R7/c9xo+wdHPDCUobmMSfVLu971jWtSvbbybc6jDJwvI7L1kl4qaSenyrxIK9fbOp1GaUdOZ g+rhv7HidLghPVxxkegzqvK3kukfm15rg1CKXUrw3dknIy26xQIX+E8RyVAR8VN85XB25nEwZy4o 91D9T2+p9m9NLGRjjwz77ka+3uS7WPzG83anO0h1CS0irVILVjCqjfaqkMevc5j5+1tRkN8RiO4b OXpewtLhjXAJHvlv9+yY+U/zR17TL2KPU7l7/TWIWYTEvKgJ+2rn4iR4GuZGh7Zy45ATPFDz5uJ2 l7PYc0CccRDJ0rYHyI5I7zj+bWq3d3Ja6FL9UsIyVFyoHqy0/aqa8F8Kb+Phl2v7cnKRjiPDHv6n 9Tj9l+zWKERLOOKZ6dB+s/Yxix89+b7OcTR6tcyEdUnkaZD/ALGQsM1uPtLUQNicvib+93GbsfS5 BRxxHuFfc9s8i+bU8zaN9aZBFeQt6V3EteIalQy134sM7Ps3XDU4+LlIc3zztjsw6TLwg3E7g/ju fIehqr63p6OAytcwhlO4IMgqCM9w1BrHL+qfufNMX1D3vRvzn/Kl/Ld42t6PEToNy/7yJQT9VkY/ ZNBtGx+ye3Twroewu2fHj4eQ/vB/sh+vv+bse0dD4Z4o/Sfsa8uX15cflE0E8rSRWmtrHbIxqERr V3Kr7cmJzhf+CXjjEwIG8qv/AGT2/wDwO5E5Zg9In74qHmv/AMlTa/8Abdf/AKg1yf8AwMv8p8f9 6x/4Iv8AfQ/qj75pB+U//kxtA/5ih/xE56P2z/imT+q8Bof76PvZn/zkjr9xc+Z7PRFci1sLcTMn YzTE1JHsgWnzOar2W0wjhlk/ika+A/a5va+UmYj0AZH+Qn5c6O2hp5p1O2S7u7p3FikqhkijjYoX Cnbmzqd+w6Zge0famTxPBgeGI511J/Q5HZekjw+JIWTyesa/5c0TX7B7HV7SO7gcEDmByQn9qN/t I3upzmdNqsmCXFjJifxzdtlwxyCpC3yF5o0a68pecLzToZmE2mXIa1uOj0FJIZNujcSpz1HR546n BGZG0xuPsIeRz4ziyGI/hL6D8/ecp5vyWOtwfurnVrW3jPE/Ya5KrMAR7cwM4fs3QgdoeGdxCR+z l+h3+q1BOm4hzkB9rxD8p/Jtv5s84Qafd1+oQRtdXiqaFo4yq8Kjpyd1B9s6/tnXHTYDOP1E0Pe6 TQ6cZclHlzL6wsdJ0uwshY2VpDb2YHH6vGiqhBFDVQKGo61zzTJmnOXFIky73q444xFAUHgv/OQP 5faTpAtPMWkwLaRXcxt723jAWP1WUukiqNlqEblTbO09mu0p5bxTPEYiwfLudF2rpYwqcRV80X/z jB/vR5j/ANS0/XNlXtdyx/53+9Zdi85fD9LBPzr/APJn65/rwf8AUNHm67A/xOHx/wB0XB7R/v5f D7g9w/I/y1p1j+XtncGBGudVDz3bsoJdeZWNTUfZCKNvGucf7Qauc9URe0Nh+n7Xd9m4RHCDW8mJ /wDOTOuXCW+j6JGxWGYyXdwAftFKJGD7DkxzZ+yenBM8h5igP0/ocTtnIajH4pP/AM4//l9petS3 fmHVoFureykFvZ20g5RmbiHd3U7NwVloDtvXsMyvaXtOeIDFA0ZCyetNPZWkjO5y3Ae/X2kaVf2J sL2zhuLKgX6tIitGABQUUigoOlM4nHnnCXFEkS73fyxxkKIsPk381PJsPlLzhcabakmwmRbqyDGr CKQkcST14urLXwGemdj646nAJy+obH3h5TXacYshiOXMPdfyOg9f8qrWCvH1Wu05eHKVxXOJ9po8 WqmO+I+56HsefDijLuP6Xl6LeeXPMSi7tlkudOnBe3lFUbgajr2I3B+nPHQJafN6hvA8i+1Ew1WD 0yqM48xz/He9Ttde/L7z01vDqUAttTR1ZI5SEZyD/drMtOat04mh8BnTw1Ok1tCYqfn919XjMmj1 3ZwJxnixkdOnnw9D5vQ4444o1jjUJGgCoigBQoFAAB0AzfgACg8tKRJs83zP5n/5SXVv+Y24/wCT rZ5xrP76f9aX3vr3Z/8Ai+P+pH7g918xf+S8vP8AtnH/AJNDO31f+KS/qfofN9D/AI/H/hn6XhPl zShq2vWOnMxVLmZUkYdQlatT34g5xGkw+LljDvL6RrtR4GGeT+aH0fbaPpVtp406G0iWx48Tb8AU YUp8QP2iabk56FDTwjDgAHD3Pk+TVZZ5PEMjx9751826XDpXmXUbCAEQQTERKd6I3xKPoBzz/XYR izSgOQL6r2ZqDm08Jy5kb+969+VXlnT7Dy7bamYlfUb1TI07AFlQkhUQ9hx3PjnWdi6OEMInXrl1 eF9o+0J5M8sd+iG1efeUi/O3RrOOGx1WKJY7h5GgndQBzBXkpanUjid8wfaLTxAjkA3ui7L2T1Uy Z4ibiBY8lL8i5H9fWIq/AVganuDIP45H2bO8x7v0s/a+IrGf636Hz5oH/Hd07/mKh/5OLn0Tqf7u X9U/c+JYvrHvfa99ZWl9ZzWd5Cs9rcIY5oXFVZWFCCM8jx5JQkJRNEPaSiJCjyeLeafIi+TfJ93Y wS+tY3WtJc2RJq6xtauvB9uqlTv3GYXtr2j+aw45EVIEA+/1O+9iNL4OpmByMTXziw3zX/5Km1/7 br/9Qa5tf+Bl/lPj/vXD/wCCL/fQ/qj75pB+U/8A5MbQP+Yof8ROej9s/wCKZP6rwGh/vo+9kf8A zkRps1t5++tstIr61ieN+xMdY2H0cRmB7MZRLS8PWMj+tye1oEZb7w9U/ILzDZ6j5Dt9ORx9c0l3 huIv2uLyNJG9PAhqfMHOb9pNNLHqTP8AhnuPlRdp2XlEsQHWL0h3REZ3YKigszMaAAbkknNCBewd k+OvzM12217z3rGqWrc7aaYJBIOjJCiwqw9mEdc9U7J05w6aEJcwPvN/peP1mUZMspDk9q85eWb+ L8grewKH63p9ra3M8XccCHlH+wDN92cjodXE9pmX8MpSA/R83dajCRpAOoAeVfkv5rsfLfneG41C QQ2V7C9lPO32YxIyurMey841qew3zpe3tHLUaYiO8oniA7/wC6rs7OMeWzyOz6wR1dQ6EMjAFWBq CD0IOeaEU9W8N/5yR82afLaWPlm2lWW7jnF3eBCD6YVGREan7TeoTT2987H2W0UxKWYio1Q8+/7n R9r5wQIDndlQ/wCcYP8AejzH/qWn65sl7Xcsf+d/vWPYvOXw/SwT86//ACZ+uf68H/UNHm67A/xO Hx/3RcHtH+/l8PuD6K/Kn/yXWgf8wi/rOcJ2z/jeT+s9Dof7mPueW/8AOTmnzC+0PUQKwvFNbs3g yMrgH5hjT5Z0fsllHDOHWwXWdswNxKZf841eYbNtJ1Ly+8gW8jnN7Ch2LxyIkb8fHg0Yr/rZj+1e mlxxyj6a4fjz+2/sbOx8o4TDrdva85F3T5Y/PnX7LWPP0gs3EsWnW8dk8imqmRHeR6H/ACWkK/MZ 6R7OaaWLSji2MjxfcP0PLdqZRPLt0FPZPyE/8lnp/wDxluf+TzZyntH/AI5L3R+53PZf9wPj97I/ M3lDy95lDQ3igXsAAFxCQJow1SobrVT2DD5Zyes0OHUbS+odRzD0mg7Tz6TeH0HoeR/Hk8Y86+Rd Q8r3ERklW4s7gkW9wo4mq9Vdd+J+nOP7Q7NnpiLNxPIvf9ldsQ1kTQ4Zx5j9T1L8qPMN5q/lxo7x zLcWMno+sxqzx8QyFj3I3GdN2JqpZcNS3MTTxntJooYNRcBUZi68+rxrzP8A8pLq3/Mbcf8AJ1s5 DWf30/60vve/7P8A8Xx/1I/cHuvmL/yXl5/2zj/yaGdvq/8AFJf1P0Pm+h/x+P8Awz9Lx38tv+U3 0r/jI/8AyabOR7I/xmHv/QXvO3v8Tye4feH0Pnfvlj54/Mn/AJTfVf8AjIn/ACaXOA7X/wAZn7/0 B9T7B/xPH7j95e2eSP8AlENH/wCYSL/iIzsuzv8AF4f1Q+e9r/41k/rli353f8o1Zf8AMav/ACak zWe0X9zH+t+gu59kv8Yl/U/SEn/Iz/evV/8AjHD/AMSfMT2b+qfuH6XP9r/px++X6Hz9oH/Hd07/ AJiof+Ti59Fan+7l/VP3PiGL6x7327nkD2zz787f+UVtP+Y6P/kzLmh9ov7gf1x90nqPZP8AxmX/ AAs/7qLx/wA1/wDkqbX/ALbr/wDUGudT/wADL/KfH/eun/4Iv99D+qPvmkH5T/8AkxtA/wCYof8A ETno/bP+KZP6rwGh/vo+99Ifmd+X1r500H6sGWHU7UmTT7luisR8SNTfg9N/DY9s4LsntM6TLfOB +ofjqHo9bpBmhX8Q5PmKaHzj5G1whvrGkanFVRIpKh1rvxYfBIh+kZ6HGWn1mPpOB/HwLzJGTBLr GSK1380fPuu2TWWp6xLLaOKSQxpFArg9n9FI+Q9jlen7I02GXFCAEvifvJZ5dblmKlLZm35Q/k3q Woajb675htntdLtmWW3tJlKyXDqarVG3EQ67/a7bb5qO2+3YQgcWI3M7Ejp+37nN0HZ8pSE5ioj7 f2PouaKKaJ4ZVDxSKUkRhUMrChBHuM4OMiDY5vQkXs+ZPzJ/JPXNCvZr7Q7aTUNDcl1WIGSa3B3K OgqzKvZx260z0Lsrt/HmiI5CI5PPkfx3fJ5rWdnSgbgLj9zCLHX/ADhaIdJsdR1C3Tk0ZsIJp0HL oy+krDfahFM3GTTYJeuUYHzIH3uDHLkHpBl7t0VrfkfzLpGhwa5rMDWi30/pQQT1Fw/wl2kZDuo2 p8W/tlen7Qw5chx4zxcI3I5e5nk004REpbWfi9R/5xgVvW8xtT4QtmK+9Zs5z2uO2P8Azv8Aeu07 F/i+H6WB/nX/AOTP1z/Xg/6ho83XYH+Jw+P+6Lgdo/38vh9wfRX5U/8AkutA/wCYRf1nOE7Z/wAb yf1nodD/AHMfcifPvk2y83eXJ9JuCI5T+9s7ilTFOoPFvluQ3scr7O10tLlExy6jvDPVacZYGJfK WsaF5p8ma4sd2k2nX8DFrW6jLKHC7epDKKch8vkc9KwajDq8dxqUTzH6CHlcmLJhlvsU0uvzZ/Mv U7QabJrM8kctIwkMcUcr1HEL6kSLI3Kv82+Y0OxtHjlxiA+N18iabJa7PIcPEUh1/wAuavoFxBa6 rAba6ngW5EDfbVHLBQ4/Zb4a07d98zdNqseYGUDYBq2jLhljNS2L6Q/JH63/AMqotvqXD63yuvq/ qV4c/VfjypvSueee0/F+anw/Vwivk9T2NweHHjvhveudW83vtQ826P5guLq6muLPWGYmeQkgtX/h WTw/Z8M8hyZc+LKZSJjk6/ju+x9lw4dLnwCMRGWLp+OYP2qWr+YvMfmOeBNQuHvZU+G3iVFXdv5U jVQSflXI59Xm1BHGeI9P7Az02h0+lBOMCA6m/wBJe0/ln5YudB8vcLxeF7dyGeaPugICqh9wBU/P Ox7H0csGGpfVI2+f9v8AaEdTnuH0RFDz7y8S8z/8pLq3/Mbcf8nWzjNZ/fT/AK0vvfQ+z/8AF8f9 SP3B7r5i/wDJeXn/AGzj/wAmhnb6v/FJf1P0Pm+h/wAfj/wz9Lx38tv+U30r/jI//Jps5Hsj/GYe /wDQXvO3v8Tye4feH0Pnfvlj54/Mn/lN9V/4yJ/yaXOA7X/xmfv/AEB9T7B/xPH7j95e2eSP+UQ0 f/mEi/4iM7Ls7/F4f1Q+e9r/AONZP65Yt+d3/KNWX/Mav/JqTNZ7Rf3Mf636C7n2S/xiX9T9ISf8 jP8AevV/+McP/EnzE9m/qn7h+lz/AGv+nH75foenLoWiKwZdPtlZTUEQxggj6M7E6jJ/Ol8y8H4U e4I7KWanPb29wgSeJJUBqFdQwr0rQ5GUBLYi2UJyibiaUX0rS3iEL2cDQhuYjMaFeVKcqUpWmTxH w/o9Pu2RkJn9Xq9+62LRtHhkWWGxt45UNUdIkVgfYgZZLPkIoyPzaxjiOQCMypmoXun2F/Abe+to rqBq8op0WRDUUNVYEdDk8eWUDcSQfLZjKAkKItBWHlTytp83r2Gj2NpN/v2C2hibbcfEig5dk1ma YqU5SHnIlhHBjibEQPgmmYzak3m+78w2Xl28vPL0EV1qluvqRW06u6yKpq6gI0bcuNeO/XbMvQwx TyiOUkQPUdPvadRKcYEw3k8Ls/8AnJbzcl3Gb7TLCW2Vv30UKzRSEeCu0soU/NTnYz9lMBj6ZTB8 6I+4fe6OPbGS9wK+LME/5yW8mmCr6bqKz0P7tUgZK9hzMoP/AAuas+ymovaUK+P6nLHbGOuUvs/W 8m/M78zr7zvfQfuPqemWfL6rbcuTEtSskjbAsQOg6fjnTdk9kx0kTvxTlzP6A6rW605jyqIe0fkD 5UutF8oSX17GYrnV5BOsbChECrSKo6/FVm+RGcn7SayOXPwx3EBXx6u57KwGGOzzk9OznXZuxV2K qF7YWN9Abe9t4rq3avKGZFkQ1BBqrAjoSMnjySgbiSD5MZREhRFoTTvLPlvTJTNpuk2djMesltbx RN0I6oqnucty6vNkFTnKQ8ySxhhhHeMQPgmWY7Y7FVC80+wvY/SvbaK5j/kmRZF8ejA+GV5MUZip AEebbizTxm4SMT5GlKy0XR7Bi1jY29qx6tBEkZP/AAIGRx6fHD6Yxj7gAzy6rLk+ucpe8kozLnHd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVYD5y/JXyd5muXvmSTTtRkPKW5tOKiQ9z JGwKknuRQnuc3eh7e1GnHD9UO49PcXA1HZ2PKb5HyYTJ/wA4voXYx+ZCsZJ4K1lyIHYEida/dm3H tca3xf7L/jrhHsX+n9n7WU+VfyD8maJdJeXZl1e5jIaMXPEQKR39JR8X+zJHtmt1ntJqM0eGNQHl z+f6nKwdl44Gz6j5vS8592TsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/9k= + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:551D098FDAA7E911B425F35AB770E4C7 + uuid:6a8ecdeb-674b-4af8-abe2-024c292e2d29 + + xmp.iid:541D098FDAA7E911B425F35AB770E4C7 + xmp.did:541D098FDAA7E911B425F35AB770E4C7 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:551D098FDAA7E911B425F35AB770E4C7 + 2019-07-16T17:02:54+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 2792.000000 + 736.000000 + Pixels + + + + + CenturyGothic-Bold + Century Gothic + Bold + Open Type + Version 2.35 + False + GOTHICB.TTF + + + + + + Cyan + Magenta + Yellow + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 88 0 R/TrimBox[0.0 0.0 2792.0 736.0]/Type/Page>> endobj 85 0 obj <>stream +H‰|’OKÃ@Åïó)昲™?›ÝìµµBqÁƒxj«`”¶‡~}g×j+ˆòæ…Ùß{ é¯çØ/焳‹9£”˜»2ížáßa–IDr*ƒÝ“î6Ð_ÞnöÐçLȘ×Ðٞ +應°\E}#Çó÷ÍGÛ±¸ÐlÚNƒé®%›Çö!_Ǖ¨¦x—á€âDló“ö¯FpÚLõè"ÃÍÿ•·Èµ£ŽTû¬&(&HÉ䭈âX’Bõ£Ó±Ì/°6ú¯vg´`oJê>stream +8;Z\t9t%q^#_hHc=A1XALg@6UBB8O0VJ0CY1+PLJMH]QAJuV'4g5)6AFB>,p>9qqj +$:KhHFH&hG]UWKc.M+c4rRZe:%^Zns62rH^8*%8i?R7b>7Bn$G.AE[ZS%%PRhHJrT +IGHRm-^l*8%,5@V=\L#Lol1D-IBL'G$IAapr:Y;>NVfG6%Ra!R7%@c/PJ4L[`^ZWp +"]>:Cd8iZ,LIGi`8J6H2S7iETbcsW)$*PS7:je@3Q\\n3:PeW]OmOWj&?XVl)hdlnq1`smp"drMl +endstream endobj 89 0 obj [/Indexed/DeviceRGB 255 90 0 R] endobj 90 0 obj <>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#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 83 0 obj <> endobj 91 0 obj [/View/Design] endobj 92 0 obj <>>> endobj 82 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <>stream +H‰|V xM×þ×>çÞD„äˆ8÷ƹf‰ð )!}TB‰YÍ"ƒˆD"ˆ%†ˆyz%ÄÜ(¥EñÌóX­ž{sbzÞ«(%¹ç­„Ï×÷ZÝûÛß>{¯µ÷ù×>ÿ¿ö¨†4HèÖ×/ ©îž±pžxÕks @€>("y¢rðTfÀ!G'ŽŽï]â\ pf»|rt\jô˧7Û®/ØpLTxäÑZñg^¼_ëž0´ujÂã¹<®?1e©ñ¹·N1q á;B +&žÓµŽOIÔ¯®R4ae\x|T(ö®ã1c’'&L˜¨uÕó»šô­°'&E%>ê<ˆÇÇM éŽ8ïµZג=Òßö ÑÂMÈ¢ªƒ¨,2ÏÍÃoJ°žaP ¼zØàžC)P€u¶•fªìkò©ñÕæ¦Ç»IîE¥Ïÿ6J²NïàXÅ©ªsµê.®·5k¹{xzÕ®ã]קžb4ùÖWÍ 6jܤi³æ~þ-Z¶úKë6mÛ~Ô¾CPÇNÁÿµs—Oº†„vëþiža½z÷éÛ¯ÿ€Ÿ }FÚÌY³ç¤Ï—1?3+;gÁÂÜE‹—,]¶|ÅÊU«×ü틵ëòÖoÈ߸ió–­Û¶Y°ã«»¾Þ½ç›o÷îÛÿ݁ƒ‡þ~øÈÑcÇOœÐ"ÜD1nóhEnÁ†ÝØ#>¡@ìÅ>œ]ñ ¾Å)ÌÂqÌÃKŠUx‚؄ÅŠ…Ô]Ì¡O©õéøNdâÅ1’©·X‰5ºx3ÃՊ&w‚7«ô6·’ŠÞž¤•TØ+z‰ï~†°jOtWQƒí?‹çpû-ß´^ÕüϹü֏x7rû Ó6òÃkþÖô‡Z0ör$OQN°…Z;†‘+¼˜ËKPB.š…íAÌôEäAžÚ,-GËã“zM.‰Réö%ƒ3y¢%ZñìVæ˜A¬]Bæh‘ÐbYý:pšªÀM‘Í>^ä#Gkùp@tÀæõzlbv¶ƒ YCh¯&§jÇ´'Z9œÐ˜wÅjæH36Æ /©…´^ã?¸p$Ñ=ÎÚZκËǞŠÈHböÒ@á-ÆKodƒîQ…[‡ßˆN¬ÁDVL²YËkY¥ùØÌ*=Ϻ»ÎŒ{Á¼³3§ëQ{ +¡PÖK2ˆ1H,›¥iÒ!‡Hm ¿¿£ D7ôc]&ðŽKy§­8Æ|»ÇÊiMm(¸R”Kûèý@÷¨LD‹b“8% ’õººåì/µÆÚCíd>gfÿ«pÌ]ÐCg4ŸPë|2«|6g¢,Î@kùÌ6rNÙÉlÞ˸Ïr¹…g|>‚«Ž«#£7°ݹ¶dm9’`F2„>Š•šÊÊ¡­´‹¬tŸÒkÆÕH„ˆ±\ñ-W’%ɗkˆ´RZ#m“vJeO¹™ ·”êæë;ésô'ôOÊËæÚSí5ƒ–ÎT…;|PkC´FW„1ß"9†Ñ•Yl笩œ›fó¹/ãï•ÏœÚÏ·Ãù®ئ®+|ïû³c;ñ³›ä9˜€íòŸÔ#b‡Ø!àd@ì(¡NÈŒŽ¤«ª)`J[è# ŠZ´Ýؔ•6íØ53bë"­›Ôj•ÐV&­hR;eVj¶nÑ-<ï¼çA5-ïùåÜ{ßýÎùÎ9÷øç}×Ák7µ,ýý*ím¨…ÿ†ãOµÁ U¡¯ÇP¥âP‰&ý+ø$Nâ[”*k9µ‚ +R#ÔqŠPÃõu‡Î«”^OGéô^8íOAÇr‘þ5= –‚8ù»˜aæ»Ì!æC˜̟XÄnb#l{ý{“çr¸w;®3éÞÓÛõbÎ- åkÙõgê]ˆsø#¨?%Ã/C9…Ô:ԀÚ…]†ÿN¼•Ò¢'‹)üèleþ€ÝmݐYP“öá/ASAÏCä•@̏ÁÙ1 +ul¯C]ø°å€êUyŽY8WðÝ«xÝ¥,!'5$›À·ÕY—à„:‰…ÌÌiˆ—ßd8ô“õׯߘ¹Á¥Ð[Ô µ·•ó?ÖÔØP_S]µ¦ru…ÏëYµ²|…»l¹XêJŠ—9EKí…KlùV oÎË5 9zÇ24…‘7(¶ÆâŽÆ-¶µùÔ±ØýMĉS­ê!®© jJ 9ü5M)«)=ÐļàG~ŸWŠù0 +)ÜÓùh@Œ $­ÉšÌ¸µA. \.ø†´‚ãB´>=*ãx_Òhh[† >/JŒ A"­âX·®Åš@µ›’Òç*A*B—ûI¤3 8\®˜ÏKpËq€ q=1{4Ô¢mC¸¢Ó¶vªæ #BÒ;#O¦x4÷˜ÅÁþÞ(¡ûcêÙ Ȇ½³vŸ7…ßØ%9-)Œ¶D¯¢p&‘ %˜º›µ%zèau-í;u(ˇr¶3úðªK}ÆbðRŸ·½+êÔbpRPÍèŠjÀK±}5€TçT3³‰Au&¾K 9âzqTÞ²Šd‚ºžq]( +KW3Ÿ pP·DEivˆ±þ€3Y€ä®g.†$!ôèŠÏ›ä-YO'óÌ ‚)÷aaèÁš&iꪨ]UDbB„;@ UÖ >†¼£Ôà/†Á£;Áq™oR‰`Ë ?—炘þâљþ…®ŒŸCª¨†ËƒƒõE™x’’Ð H¢3š hÀqI«=1BÅՕ™ÅÛVu%±¸òàëqÂù’ÖZۈÞýà6óKòƒ£M/ù?ËCÙuHŸ dØ29u÷ËGî¸<jZ!e¹UZå¸ÜŸÊ$Dåd{»<Œ/š”Êď8ÈÙÉØ(§’ê¬7H~K”vP±¬D9hÚ¿)¶wöDH#LÜ¡A18¸B(1° ø‚»R6—Ì“Ð]—ªG•ñ×Å÷¡æåTÀì×`c‚ò âC„.l€E¢TC¡r#Dà I²L +{/ Nw {…0þÛešFŽMaÏš¦Â9:Ðð\Â(¤O]Å"²{6ñwüsþMü]?çGÍ~þ¾ÎâšJ—Åe)ƒ†ãm^ gæ%S™Ö E3³Ì»L/tN‘*˜BšG–î\âhCa·ÎXtÑ1Šâ‹1_/Æ# Ãue-ëyJÛv¼#=Û> ûÞ÷Ï¢ætsssÚÒh±6®©Ä°kmKQm ª®ZRȖr¶‚%ÕUuµ5nú<æ•D~¸ý÷ÊoñªO÷¿ùöāéiFúÏÌw6¶à ÿšÇëÃáы“G¯\|é¼=Ê6 o ò ÝRIáòºå”Õm+A‚ÁÜÝm3°3ÆOŒ”1…¯þ,¯›3[K¬LádÄaŸ8byÀw¤zÇý;à°tº¯%zAÊè/¦‘Æ`‚f t—. ¯ã\¥x…«WW­Å –ñõuÿË´=¯(ýøärì+ß·íÛ/Ô·}ð¦ò»³/½¿ýÜå/Þ|çÙý?~ƒ‘æ{•/ž%‘W÷T¬ì~®­ûÿ‰é׏7ë'ŸŸ–O«,m€³nŠCН˜Ñ¸”÷û•Žâ$gqc†Ã\Š²K¼)é‚MœÙ°Ùò¸…¢¯QKQ.Ê¡–J¢)7/f6'LÇM”dŠ˜â œ5±¼I0UšhSˆÿQÖ}ãYùY~¶‹}üíqjz~ œXê®­©£Ò¹¶‘á ¡‘áuتÜæÐh84²³½mXÖÄa„tF`ȍž—VRzdºY[·ÑÈ5eGQ‘Å€ÊñãåûË©’r¡œ2óVKŒOQEWK‹œŽXˆ’ӍËbn7¤½y±ÇᧅB+ÆÑfÁއϳ¯o\{¸šá_šOs@]¾Ë¶« ©Ïblƒl¨q‹¥yY©/ˆ‡±µõí¡á©ªu¿{Št(éÞÞÖ=uJÚ³í=õÊmFšèØ8î>ÿÞýg©ò«#G_Sl”ùÄA©óÄëŠSåi+dÓ`{*BU’£žÇæn¤³uëö&촎$ŒØrôL,¦Ž~i5iҐ-}¸Š±Ú +(FK˜úºü‡BŠzñ 6Ÿ:­ÜûÁçÊåkSÜÿÖ¹DbúÓ{F¹wúŒrç{¸ãvfúe%“”‘ ““?&Â鄖Û’[_i]Öø„nBwTGӕ&Kãeú²‘š¢§Œ”ž§°A¯3#ΐÊ\‘ ù†c¬Ž7èR™ɞcjԅ­›­Ÿ3Çx>oYz~™¥Aea¶oÿ™B¦#íi^L›lÖôaOŸ'¿Zc Pnçl…Wøs÷¾öÚ¦­•%ÍÝXù’‘^ìÜâ¼em¶Viƒ·×À/ÎÀý_ö«=(Ê늟ï~]ä±±ò)¢A‚»ø¨2a•‡Pð 1eË.y,,«©!c$†&š¤$©E&5Qƒ8™h-­4ñ´µÆÆÔ±Ó6:còSãXë¤3Õ¯¿s÷[ªØi§f¦írç÷sï=÷ÜsÏ=çÜ%þ˜7{EÂê ΁T­ ¾hBIÚ:¥<þ©´GuvôŔ+Ρ”ØÑB©NoMß+vÇjneþ)yîeêz5¨>§v«úRɪª¹ª£NPŧêgꗪ…ÿVOr˜ ž‘Àkæ繖»ª]­®­.=ߥ¤¹f¹„p%¸ÄG®³®K®k.͵:n4u&׍YœÞ®uûºã•eñëãE|ɔA%뇑›­ª*»ñ§*y¹(‰·ªÚÚÚBWª†¾ë6vNÄ#‰®TÉ)6m.×\¸[™‚lCتSúë*f̞”ïkÓ¹]ýÞaOçÌo<½ööW§÷møP=Ü_;훮tsæÒwš_ÿù'æ-š=yA_už¨"ù‚Š5=¥¿´$m Ó㭇¦[I·^‰Itþ²£¥¼\匽í%ŠñZI–+&Ñþ=†=$¼Ãh—)U;C^­ƒ7.Ót½|Ê/h­CUÀµ‹fc¾²+Ôµt ôyõ}zò9ÀQ€y^?ð XÀ”åå¬côm}ˆœ@¶v^Z¯÷P¿–Aýêzÿ)ÔŽ>¬Û‰þTí&‡³hÖôc¾:ú$=Hb]lû†žJoAÏ<)×FX·@#r‹nêÇÜPöoÖȺùÇôbz؁¹JɧÒjìéÿ$ä^V†¨H$ZýØãð͎.z ãQù¼:³D­ôãvؕdÔÒXPëÆÂWqbÆhgÄ81hYñó¹|n>sôLÒþˆM÷‚÷„}w6ÍU†¬m@°}ضv݉zDEù @6ШQfaîÏëCÖW Ä]~ú>ü¾æ§ùðkìôé´›ûÃà{ï¥'Ô”…¹gŒ]ôÆId—áÿ˔e¤Ó\çAZƒ³làûçؓ±à§èƒºµÏi<ü•ÌÀރ£Ã¾‚œ´:Êùþœ|‡è°r+ûØØàf¿óÝ+ÅVtÇÀO) íÒ$:hš—ûx}Œ—2d,fÐ~›ÊXÄ|µðZߎ—Õ+ˆ†ïËô7iåôô-Ï^­Äúnœ}î¿BïQJ@߶e27å2n»7ˆQŽÄH²~fòÝÊØ=(㨏cÍ͝â­€‰°á)S¡“dÞ vy_[÷l™[ˆ(åXbÿ‰#":â¥9¾¢´>8 +;dl²-65i'l-â\Äy˜Š.j–ô45sËŒÒtëŒí§JÎSÎПŠnëhÔ>Î[ÎI?£Tö¥ŒA›û&Jː÷5Tí¨‡Þbœ§º×€~ºŠ& 8jØ6ø~‘ÖI-â$•Ê£>Çš®þ’[Ë oﺇá8§lÐ~BÒßçè qzðÇA[Å|ZõÕHßÞᯃwù;—‘”kœa›¹öó9õWIDë¾öµÈó°ßšŠzs°mÆ%*ãšo¼AÏÈÏ9Ëãl§ÚI«Ø7°½´EæÀŸajµö Uò¼ú[ØÀ1ë¥J™ËÿŽÅØ ,Çó2j)WŸG-ÚQð'±¶‚rY§Q £æãÀÿžÊízÜb×_9&㡋ù̈™j¾ >'ÛÊw븎³î‚?:(Q»:‰’ù¬ÒW¯â¼¶¿ŒLŠe]Žš¨=Nãôç Üå/ۏQ_qŒÊ7: 'y¤¯sWi±cúœÙÔ­çP¬qc/KùRçoÀ§•².ÌÅ9P‡ðnl×çÐ×íÖj|S#ïJ)êÔZ2Œ…üÞÉ’oOôÅú ö©3Ž–²¯t?Ö´“Ç1qÆëßÅۙšܦ%Æh&%É\:c]å½1^Éuƒßfö±H²úùØóglƒuUÚ¹·íðiŸÚF;¢1<’FcÚàzè¥wµë<¿‡ÎË2‡žŒÖV`°c{#uXLÄ{©èØï¦ò±> ¶1/ åTdŽ)ãιÿtü~ ~‡÷¹Qòx/¸¾ñoKǐâÌ(Åßž¦:3•=ÎFeб +µ·ï÷*ªÕ"#î?¢\Äãx')q„°f=TzÿOÚ®4%­ÖnW”+"S¶Õ¬íA{дÿm#¿{è:åÒÒIP¥Ñ|"µÙyˆTž¥XÚ-)ÿm"¼JÉèEx ü›6o€?fóhú5kÑF¡÷7Åaó +ÍªÍ zH̱yã…6¯ßhóø>›wгâbÅæÖ@­¯&`ö›õ³,Ø cÈ, †Zƒ!_¸!Øb¶6ÕÌ0ú¾#dºMVg® 6mä±v³¤+³sr Ùj4ƒµÿúxTA›©•TK>ª5©¨ zɗQZ€°-eR!z!ðüõa¼AJ˜iÂúàÊqß×Ôd’[®ŽJ¯Älm–kÇX hdÏlÊAóP¾ÙèçC¶ ´Òu° ,åË¡©Ñ&|ýTIET -•´ˆ2aOúÂØ#„]‹¤­õX_­rw¿ÔP‰&Xºõÿw˘wI™ø²'øvÂÒï~H7ËÓ4b,ˆ8ø:·¯FrÜZHƒôOþòãÈ#ª)X>Η€k¢zÀ™j*”_(Æ#Å»ÅúpPÑ+E¯éþšÈfHn*0 ÜVp[%.Nr‹\J܀Š^z9Rb™€G–T၄ãg…[37$}Â}\E'ÁòR(û±êütâÉ_& +p†¹kí.*ôEƗ˞!’¡í |o‚Nã{^r}øžÜ‹ø¾)¹:|Ÿ–Üj¹nƒGςÄú h¬H¡|@üñ² £ãø<“ko.——Ë ÃƳ·›\•B ¨|)ØÍåîª,š4—voÓb/9ô>Ùk´Ø„"¤VJÛ T¡ÁZk)ºw v/­m¿ˆ_Ú/~D°E¨öMÚB|fïZ*Fqîvž™çÿ›çٙÝÙ½#€õA_ÝDcH°þJ¶Ð˜ú8l¸Ë@wÀa  + ¹t#‹d™Ðä0¡ +Fž\'ôü §-å¬<(Î'ŒW#Œ­óX_ò[?RñØ¡µ BD"=”E¤H}߃x•Éï× ¾ü•c|Ï*ï¹°Šò[^—|˳»8I§ñêwv0õ4ÜÆVNU-EìFñÝ!C¡¯G[Á…ˆJ8œ$&DH/¶>tͽîÁxÕê–=0êfkÕzÍXÕê—›as#Ð ÄlZGr8,éšG»øІ~&Ï¢§Õ5—e V›ÍýüºuN¾fxt±*ÿjzô 5<Ä/Y\¾h­“¿[‚Q¾@Õþ`kè;% wˆdzŸÜ#ü(ڝî>þŽé­VCçøs¡“6½¦unŽ¿iaäSòN‘rGfÜMO´IÅù#÷ yó¸³*ž§S#ÚXBržî×30G¦}fz`¢9ªÏè:2EÝgà*Ñ}F‡«"΃ÈƉ×½Îtk÷˜n (árÝÊd«éÞtê@Ç4]½ ¿Wµ +éÔT<•Kþ7fÿ["Ó¸„ ’¬p3Ü»þ]º_ + 7v~&UÀXñTœs`fJröN*Jeþ¬§éÑÜd~J؉‚s6^H:óñ¤RÉϬ Ï9OVÈLj,[™Q Éj^ͧâIÃ-•Çgÿ–ëíû¹ÆË++‹`ã"WivyVÈ%‘kVäš¹JjÉÏ©WÅ^ÉVICÛëÖ¥áfÜY¹h¯‘à‘Òsþ6ÛÐ+ÍE—Ž“p¿á´ÄN+BR€øRºÛ’4·¡7ºÇRݸϫN¬—ñƒ¥\ÆoyW½²Ê¾Ç/~χ„SÜ9V_n©)¦RSŽz ç(ñ¤³Z8Ò G_<¹ ¬¿  +åì +endstream endobj 87 0 obj <> endobj 86 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (logo_blue-orange_clean.ai) +%%CreationDate: 7/16/2019 6:26 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -668 2732 20 +%%HiResBoundingBox: 56 -667.918 2731.9385 19.8062 +%%DocumentProcessColors: Cyan Magenta Yellow +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: -23 -665 2769 71 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: 957.0195 -584.8799 1757.6592 -8.87988 +%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: 1 +%AI9_OpenToView: -2915 1691 0.25 1586 946 26 0 0 51 123 0 0 0 1 1 0 1 1 0 0 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%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.MO +%%EndComments + +endstream endobj 97 0 obj <>stream +%%BoundingBox: 56 -668 2732 20 +%%HiResBoundingBox: 56 -667.918 2731.9385 19.8062 +%AI7_Thumbnail: 128 36 8 +%%BeginData: 6246 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 +%524C45FDFCFFFD04FFA9FD11FFAFA9FD6CFF08A9FD0FFFAF0885FD4CFFCA +%C2BAC3FD1CFF0F30FD0FFF310FA9FD4CFFC2B4BAB4C9FD1BFF080930FD0D +%FF5A0908A9FD4CFFB4BAB4BABBFD1BFF310F0F5BFD0BFF5B0F090F85FD4C +%FFC2B4BAB4C9FD1BFF080F08095AFD09FF8509080F08A9FD4CFFCAC1B4C2 +%CAFD1BFF310F31080FA9FD08FF5B08310F0F85FD2BFFAFFD2FFFCFFD10FF +%080F080F0831A9FD05FFCACA5B09080F08A9FD05FFAF5A310831305BA9FD +%09FFA95B0E0F0E5B7EFF855B5A85AFFFA9855B7FA9A9300F30FD04FFAF5A +%3108313085FFA95B7F5AFD05FFC2BBB4BBBBCAFD04FFC9C3C2C3CAFFFFCA +%C2C3C2FFCAC2BABAB4C2CAFFFFFFC3BBB4BABBC9FD04FF0F08310F0F0837 +%FD05FFBBC261080F080FA9FD04FF85080F090F080F08317FFD07FF5B0F08 +%0F080F080F5B5B080908FFFFFF080F09850E0F085BFFFFFF85080F090F08 +%0F09853009080FA9FFFFFFBABAB4BAB4BAB4C9FFFFFFC2B4BAB4CAFFFFC1 +%B4B4BAC9BBB4BAB4BAB4BBCAFFC1BAB4BAB4BAB4C2FFFFFF080F080F080F +%085BFFFFFFC2B4C95B09080F08A9FFFFFF5B080F080F0809080F08095AFD +%05FF7E09080F0809080F0809080F080FA8FFA90F080F0E09080985FFFF85 +%0809080F0809080F080F080F08A9FFFFBBB4B4BAB4B4B4BAB4CAFFFFC2B4 +%B4BAC9FFFFC2B4BAB4BAB4B4B4BAB4BAB4C1C2FD04B4BAB4BAB4C9FFFF0F +%08310F0F08310985FFCAB4BAC261090F080FA9FFFFA9090F080F315B5B31 +%090F080FA9FFFFFFA90F0831090F315B310F08310F0F0EFFFFFF0E310F0F +%085B37FFFFFF0F0F080F0F5B5B5B090F08310F31A9FFCABAB4BABAC2BBBA +%B4C2FFFFFFC3B4BABACAFFFFC2BAB4BAB4BABBC2BABAB4BAB4BAB4BBC2C2 +%B4BABABABBFFFF080F085B5A09080F0885C2B4B4C95B0F080F08A9FFFF08 +%0F08095AFFFFFFA95B080F0831FFFFFF5B080F083185FFFFFF8531080F08 +%0FA9FFA90F080F085BFD04FF5A0F080F08A9FFFFFFA9080F080F08A9FFCA +%B4BAB4CAFFFFBBBBFD04FFC2B4B4BAC9FFFFC2B4BAB4BAC2FFFFFFBABAB4 +%BAB4BBCAFFFFC9B4BAB4BACAFF310F0F30FF310F080F5BC9B4BAC2610831 +%090F85FF850F080F5BFD06FF5B090F08A9FFFF0E0F090FA9FD05FFA90F08 +%0F0FFFFFFF0F0F0831FD05FF31080F09A9FD05FFA9090F0831A9FFCABAB4 +%BAC1FFFFFFCFFD04FFC3B4BAB4CFFFFFC2BABABAC1FD04FFC9B4BAB4BACA +%FD04FFBBB4BABACFFF080F0837FFFF0809085BC2B4B4C95B09080F08A9FF +%5B080F08A9FD06FF7E0F08095AFFA90F080F30FD07FF3009080FA9FFA80F +%080930FD04FFAF080F0837FD07FF37080F08AFFFFFBBFD04B4C9FD06FFC2 +%B4B4BAC9FFFFC2B4BAB4C9FD04FFC9BAB4B4BBFD05FFBBB4B4BACAFF310F +%0F31FFFFA9080F5BC9B4BAC26108310F0FA9FF310F0831FD08FF0F0F085B +%FFA908310985FD07FF85080F0FFFFFFF0F0F085BFD04FFA90F080F5BFD07 +%FF5B0F0831A9FFFFCFBABAB4BAB4BBC9FD04FFC9B4BAB4CFFFFFC2BABABA +%CAFD05FFBABAB4C2FD05FFC2B4BABACFFF080F085BFFFFFF85085BC2B4B4 +%C95B09080F08A9FF31080F30FD07FFA931080930FF850F08095BFD07FF7F +%090831A9FFA931080930FD04FFA9080F0885FD07FF85080F08AFFFFFFFCA +%BAB4B4BAB4BAC3FFFFFFC2BAB4BAC9FFFFC2B4BAB4CFFD04FFCABAB4B4C2 +%FD05FFC2B4B4BACAFF0F080F31FD04FF5B37C9B4BAC261080F080FA9FF30 +%0F0931FD08FF080F085BFFAF090F085BFD07FF7F080F08FFFFFF080F095B +%FD04FF850F090F5BFD07FF5B0F090FA9FD05FFC2BAB4BAB4BACAFFFFC2B4 +%BAB4CAFFFFC2BAB4BACAFD04FFCFB4BAB4C2FD05FFC3B4BAB4FFFF080F08 +%5BFD04FFA985C2B4B4C95B09080F08A9FF5B080F08A9FD06FF7F0908095A +%FFA831080F08FD07FF0E0F080FA8FFA90F080F30FD04FFAF080F0831FD07 +%FF31080F08A9FD06FFCAC2B4BAB4C2FFFFC2B4B4BAC9FFFFC2B4BAB4CFFD +%04FFCABAB4B4C2FD05FFC2B4B4BACAFF0F080F37FD06FFC9B4BAC261090F +%080FA9FF850F0F0F31FD06FF37083109AFFFFF5B0F080F37FD05FF5B0F0F +%0F0EFFFFFF0E0F095BFD05FF37090F08A9FD05FFA908310F31A9FFFFFFCA +%FD04FFC1B4BABBFFFFC3B4BABACAFFFFC2BAB4BBCAFD04FFCFB4BAB4C2FD +%05FFC9B4BAB4FFFF080F085BFD06FFC2B4B4C95B0F080F08A9FFFF0E0F08 +%0930FFFFFFA95B080F0837FFFFFFA9080F080F308585853009080F080FA9 +%FFA90F080F30FD05FF5A09080F0885FFFFFF85080F080F08A9FFFFC9BAC2 +%FFFFFFBABAB4C2FFFFC2B4B4BAC9FFFFC2B4BAB4CFFD04FFCABAB4BAC2FD +%05FFC2BAB4BACAFF310F0F30FD06FFC9B4BAC2610831090F85FFFFA9080F +%0F0F0E5B31310831090FA9FD04FF5B080F080F090F080F090F080F0FFFFF +%FF0F0F085BFD06FF0E0F0F0F08373731080F090F0831A9FFCABBB4BABAC2 +%BBBAB4BAC2FFFFC3B4BAB4CFFFFFC2BAB4BACAFD05FFBABAB4C2FD05FFC2 +%B4BABACFFF080F0837FD06FFC2B4B4C95B09080F08A9FFFFFF7F080F080F +%080F080F080F7EFD06FF5B0809080F080F0831300F080FA9FFA80F080930 +%FD06FFA90809080F0809080F080F080F08AFFFC3B4BAB4BAB4BAB4B4B4CF +%FFFFC2B4B4BAC9FFFFC2B4BAB4CAFD04FFCABAB4B4BBFD05FFC2B4B4BACA +%FF0F090931FD06FFC9B4B4C25B080F090F85FD04FF850F0F080F090F0831 +%85FD08FF850E0F090F085BA97F080F0FFFFFFF090F085BFD07FFAF310F08 +%0F090F08855B09080FA9FFFFC9B4BAB4BAB4BAB4CAFFFFFFC2B4BAB4CFFF +%FFC1B4B4BACAFD05FFB4BAB4C2FD05FFC2B4BAB4CFFF305B307FFD06FFC9 +%C1BBCA855B305B30A9FD05FFAF5B310E31307FA9FD0BFF84857FA9FFFF30 +%090831FFFFA9857F8584FD09FF5B31083130A9FFA97F857EFD04FFCAC2BB +%BABBC2CAFD04FFC9C9C3C9CAFFFFCAC2C9C3FD05FFCAC9C3C9C9FD05FFCA +%C9C3C9CAFD28FFAFFFAFFD07FFA931090F30FD70FFA831080F085BA9FFA9 +%FF7E31080F087FFD71FF5B09080F09310E310F0F08310931FD73FF300908 +%0F080F080F080F080F85FD74FF5B0F080F080F080F0931A9FD76FFA98530 +%3730315AA9FDFCFFFDFCFFFD55FFFF +%%EndData + +endstream endobj 98 0 obj <>stream +%AI12_CompressedDataxœì½ms%¹‘ú}"ú?ØÉáaW +”®ãFð’Ú±%̈́4ò®½×ÑA±93ôv“m6[ò쟹?æþ±›Ï“‰ªÎ9löËheï4¤éfTá%‘/O&þîß}ó‡/O_ÞýéúËpÒmž}ñw·»¿¾|¸»ÿՆäÍW¯^½{ûpÒ/~ÿËM?t¨uúU~a5ÿËõýۛ»Û_ñw'¿½Àó¿ØýpóöáæòvsqýZ*ýró‹_â·ßÞ<¼º–ß¿ºûþîş^½»þòîþòöûëW¯®/oO.o~éï!íž]>Håô¼Ÿž]?o¦_ Óæ›ß²ÊåíŸ/ß¾½ù—kt2ûÞÞ½»}ysûýöîýj§Í—Ó”7C +Ãfà›ÿýÍï¯ß¨”Næžû“9ä¸éç“ÜM9»»z÷úúöá›û»«ë·oww¯îîßþj³ûQ>í·—ßËo.7ÿõúÕ«»¿´µ/înPKþùîþÇ_ß=üpsõåöîÕ˶Òﮯ_^¿|¬êéWñÅÅÍ«kÓח›~àœ~Õ/¶ïn^½üݻ׺–ážæžôð‚ï÷Ç·òbÒ$þMzzñÕk!ýáúáA>\zãhüþ×Ûö«„Êò‹úFöZz¼ÿçëÛÿþËÒòýݐäé/‡€Q‹2bÓ¼I¥ïo¯_¿y%3Ɓât¥&ÿj(•å³XqŽéDæV~óx’Ó<¿¾}yùö‡çׯù׃ìÉëçÂ1_^c«HcoWêÃw×Ï_Þ #þ%ë`~þ__Þ\ßË¿Ý<ûæòJ†cŸ_½»¿¿¾½úQ~˜žÿéþN6ãŸ.e?÷S~^ê?¿º{ó£µyÿò»ë×7·7·òxžËøß\]¾º½{xþÏo~¸¾}~/SñV>íúåóחWx-V™¤ço„Í˓ïÞ>øËÝÛw2h7w÷Ï~¸¿¾öŸ.¯Þ=\?ýnÓç𜴗W2ÿlíêúåÍ«W—Ò’lGB^èõåÛ«w¯øF9ã—ÿóÝå½<ƒþpùê;íÈo…íÏO¹¤©Síñ´™ÍSßSÿúS|ÀóÓóç;{…çç|üù9–VΛÇÏý¹¯´ÖWÚÅWM¯¼ÎùÃÏÇ¥™¯õ¯õ¯›¾Öwúڟ{ýîÕÃ͛W?>ÿúí+¬‰?–ú£>üÇæá?úSÿUùíw÷²ZÀ|oe©½}~©_–ï¹lž¾Ô®/½‘KÇåõó«2×úøµ¶~]–¦®ý¹­u£µnš.n¼Îµ Ç­vx§ÕïÊ;Ý5ÜYîå͟o@ÐÁx§¾ÓžÞ-Þç?ó£þúƒñc!?ûâÛse…ñ?½øö­ ÿ/ÈhÎo¯îp¶ÿjóbÿ@=xÆþÓó5ŸxXó·ÿí{WúÚ|{ÿîúÛߔƒˆ/òBÞ왎î°ß½áïò‹o^½“_þúþîݛ¯n¿»{öÅ/TÒú/×W"MÉñõróõŸþ‡ü òÒï.¯~øþú_®o®~¸½~¸ÙÊÐ +Ý늴ôæ—ïiXúýõF+ÏòGùû;üý”çÏ®¿Ù£6 Ô¿ÿB…ÿÝ~ù߄·>üË뻗ï^ÉoÏoÿ|ýêîÍõFVïæ.ïß<¥‹o^]Þ^Þoø‹ÒCÛîæ+°™Ë~¸ùóæõ¥t*•~s#gÆ7—2¾OêA˜Ë5>Ä:ËÞ«ÐüêI]]>ü°ÙÊK¾|뭟⨓Y|'rîzÄø!Zÿ)ÍÿáÇ׺{uóöµ7ÞRüßO|SÖÛ¯oõ•ïß½ýaóíÝÝ+où·ïpX¼¹¹}{ýjõÖ"(ésSyåC`óüoÑÅîRDa“o„óêå?Ûï¿»¹>Øّ矴º®8U‡zýÛë¹¹|u°ÇýÇþæ:³5¸@xç&ðh?üåòáê‡Íonþt/Çìõ{v+&û»›Û—ò¢xwópíàc 8ýöúá_„A {›‘.šjógM{œ|ùåãM?m¶·m•_ßCD¸}µû×r’AH¦ë¿E/H›íKÊç]ó¿¾üoÜü݋­HžÿQÈë?ýª M VF+‘ÿ/eÂÿ¥ÅiQ’—Ü͋rڔ­”•³¦œwÒâE)‹Wkÿ M M%j‘1Àß©Ÿ¤$þ›2/Êi¿õ²ó²íϤ”ŸÎ¤Å³þœ´³þ¢-íðñõʟД±)q˜Pž}¡©)y˜¥èO›²Õòì‹ÿûðœ›Õ°˜×±™Ý:ÇR¤Å2Ïc3Û:»í,g)ø³›ó<73-ÿ•uÎˬo}¾õoÌöy;ëò_ýÓœóAf ñ ó‹¿1Øë‰%s¶Ój¦O­,çsŠ¿ÏYÎV³Yº œË:w(:Weæf›3™'™S+ÌÙÎÊ˹• ”²Íð9«9í9[£æ¸n¹g.8BG`â7Îüž3¾uoo9qõœb­°oô5„Æ0…r˜ÃVÊY¸iïÇ0ŽcӘÇy<·ãÙx>^Èp1Ä1N1Å9žÆmÜÅó(ûT^©—%;Nqš¦<ÍÓ鴝vÓÙt!‹BTØ4¦˜¦”Óœ¶i—Î҅,˜>yÌ1O9å9Ÿæm>ËçùBŽÌéæq–†æ<ÏóvÞÍçó…,Ÿþ4œŽ§ñt:ͧóéééVÊîôìôœKjO·q›¶y;˯¶ÛÝö|{!ËLF“ƒvã.îävóît·Ýívg» Yv='c<‹gә¼ÞY>›Ï¶g»³ó³‹óN¦'œçÓy:Ïçó¹tv¾;—Ur~~~¥q!ƒv/äc/äõ/N¥H§òèÅêç´ã´:í¼)gMÙ5e»(§M™K‘g龖ԔiQbSƦ„¦Èj”/-g«\¹k_þ¼ýs¶(;-2dø{۔Ӧ̋’›’š25Eúyô2.JhÊД¾)][t؟}aÐ~@ûgה­–²Uó¹œÅåܕY[ÎÔrvdF¤Å±‘f&–ã¿uíÕsTe¼æ՘ÚH.Æp9n«ÑZŽŒ×r\tLN­Ì,ÙJ²2±D+#K°"뎛ÑÎT=|+”ÓÎʟ-Ë©•™%[‘Í.›?í&+ÑÊȬ(O.g€ðÕfNÏ9[Î[æFæÓ±Úʟe#o]¾.¥jLy¡K%Ó¯´Ä…fz™´Œè•ù*ñRÛ+§•ë‚®M°È(.´È%ô¢yàïyUòªTUÿ5™.ۖq¯„½2(öGZlÿ쩎؝­ìçŸ,ÂZdî¼l½œ)óђ‹†)-¦U™žXªöÛ"-.~v Gý÷~ G +—†´8<±äEZ|ZÍ'ÿ9h+ø¤?Ÿ¯Åæxí}`Uú-Rü™•ÛŠ-¤ØF²éÞÅvbû^vµêée·{LÝ +ë½]dß²—ÛÝ»µ]]¬û{7¹Õa²Ý&QíR¡Ý­nÍxdŸÊ¿ÜRmc«½Yv珦bcimlۃ{s»°ÌíïÎbÃYïÖ¼°òU«P± Ú¯þóÂv÷ʸ°6ߕKËÕÚfyhß>¶›W{•»úÈï>|G?º«ÿöàçoñˆÐÛªWû +–J-û +V‘U:*ìç”HfS0'“IW¯.©$-¤’¡Q±v¢dQÅzö…(YP³TɂšÕQÅR%kG«“*ZÙ­`ŠT­¨Y[*Z™6,YT¶zn” êßgèBÈ¢j©²ukPu‹ +י)\[*\™ +T.°2Y;¦v]P—†â¥ª”¯Lå ê×Hõ«ç¶º  +¶£ +% jX’nQU4-QÑ•1QÇh:§Bv& +T2(ePË ˜¥1R5ƒrȺ:*h¦Ãoµ#Dù^¢”7၀?=¬ÊÙ!ë„T9Ne·Lõ e$oywõ)¬Øsõï–'·2å%á·ãžläœuÁK’Í‚k.x¤ì˜VfAYq»ƒ|îùâ€<ñ4®q”›|æ]íª¨–ÖBÖþYSçÒWÎ\ª½©´µ„EYÚüâªL‹"À’˜6ÆLkYNWe».fÑlËÙ^Ùÿs±_Êjٞäý2,á`)VÄý”éhq{²´˜V%?Zæ÷)VíÃeûÄBŽ/-îžXΞV¤Å}ê¡©|r‘ýî#ÿ8^?º%7u®µæDÑ2ZQ{j±¯&+Åþ:[1무¨ÖÚò§°Šº…Ê´~[të"õK±Úe}Ó<¥eòRlÍÙËlåÔËöÏ:ƒyicâUՏp˜;5|iá§Xð¤#Üèj9ϖö ã¼çž³à1ÆghK;Îcp–÷qiñQ>ò²âôr9×øhNÑìþ£|â‰\aŸ<²«/Å]ýAfۅáV»ÚRé(†,Fك"NÃx+ŒAÆ¹á8Žtg<‹ûø d9tԁ(²Â‰,g ÙâJ†3ùœîdu(H¡t*ã˧•á\ÆfR3\̐?éf~ö]ÍR9ÝÍ[aOgîtîDJ„Ä Çó(/Y:Q„ŸEœ?¥z'ìãÜ\ÑÝ©ìú +ÿpJÃ-=&ªs㞦ƒZ +&䪶Ê@g5ÜՐݝÖYT™®ku^ïȜ°Ñ/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïåO=ý?~Ws8 _MìI¿ä_Ó&w'£ìM +ˆÃPùϾø»O©»}{ Í“(5c·Éý‰èÓñ×ÙÚI?¥yDMÅx(-1ça”¤8د‡>Nó´•á$tq¬Ý}rKú>(µq’jlû Šf.ª;›ÇØ͌´N9F„ýàï¾i,œtÂiš×úL ÚÛMðY4û.&>˜…?kc¢[fí`>‹Ædúâ¼h,vÝܾÝçiðærH'9„Må˜æOÐus‡Ö¬½ü<ŸŸ?º`—µÐÎö¬â7 ó,óïo^¿¾~P¦ýK $ó?:ë¼0†9«ŒææKÆOžµ>[cs£¡&(bzœ ë O5ò¢jËÃí‚æ=Ô&g§<ÈÎÉဧÂÁ¥‡Ö)m[gЄŠ,žµíª§IgØKuyì$§Ž@‹`ý9ŽFm-·±±?Ð8¦ˆb•°6%C'(>Á +4FaÝíù8ö¢A^< w±v\úÉޛ¾uÄWWüNOïÆ?úi=—ü™Oä3ƒñA*ËÂGYL|™òä.H]QF’ÖNÖ`Gé*Xï,¹7YGÙP ×°@F˜ñ¬s·àŽæ15‡%3{f@ï«QøÉؔ'áRܓ^Áê¢Od8¢3ǝb¨‡£!ƒÔñ¸?ßs:7ÀM‡nª%Q½ÇÁ¥çH z¢(IgšFO)Oo©NËìQpº d]ek…bbU¾V »Êؔ² œ©ðLÈِ´E⥴)myûl!s¯¤n“¹± +„“rw‘¼e—-eo¬’Ù`;ŠŽçî(yˆg+yï(yŸC䒹WÉ;4’w2©{K©ûŒR·Â?«¼=6ò6dm—¶E*?£Ä]äí}‰;šÄM™Ûåí-enJÜά òfÐä,HwÚþ¿ÏýßKª’éŒ3³²¹ìΫó®ü«ýÛÐ-ð]ÔþÜ»Ù:8 ¾þÆ¨ T::8^MâÂ8wÐÀã H>Ù՘®ÿU·gýïéÂô~f0ê’'ŽNÕH]aÔÁLû“©'sܪ  ßw +xoÀÓuÿÕ}(Yï9.OΡcnÿ:ôïåñ´÷ Ýz­ñ½wƒ}kºßwî»Gw¬–û?µ¯ÿÝÒ¢ûk(Çxöpÿ„Q”ŸÆ•C£usvñÖß»Ã×Þq=&}〭#[G¹ÎÄÒ=±€Šn@E“D+<´C ªÇ äðÞR,8¥ÊžÉN&Šß°7!aé=ꤸR°`…ë]ïù›ò~@w5›XDˆS7¯AÌÉMÍK se¶Ò™¥Å5˜ùlf>¾>³Ö§å*••]Ì-Œ¹ó5{a¶ý8í`ë«W×ïÌ£«XV¶®ä‰Ge]ÏÁ`vÊåÕõYÖö¹ Ù®ñë:—"+[W{²?Që £<™¼]Ïu¤ê8ç.à>püÀ!gÖ:|a]»Ì†=³÷^€ÃÁ@‡%è~/èAÖá^èà +”8b?ÂÀúÒâ¡Pˆ´rpN+÷çñ€ˆ@4í᠈þ‘]tl|p'mwKÝKí~jv՞!ëd¡4À>2%ÈýÐú…{d¨ÿ]/,,Ò6¢p)Ø)â<ô1-”x©ÝX»>WƒjøÈÓ4÷xtœEtÎfHÝV¡vžj7™NDÒÊÍû|túi Âa¡ IN{¸ï“( øHü _›Gá¥ÍwÄIí«Ý'·d¦ Ü…ÀÁŒaÎ4ÉQœCÍW“ÐŒL:ÄÖÎ|c‡ô9èS›ú@ÓÍ×÷W?ܼ¼¾†ñÆÿ-Í mDíÉ$’1¢äm ‡g‰¯•£±Œu`Ê[[díÉMyPóÙS{È °2¬"¾´ªxÚ,`O}c7N'"8/¦ácøÀÁÿ’Ýcèí_4ÅՁoåô"=·p˜šŒX`Œ[/>/ú–Á¡„(ºÞ“\»©¡¡%Ä·Õ^j8/•u˜Øi¡Ö@]…¬*€õ¸Í Òj@݅Q.E{Q›ÁÜh1[“4΋å \(Ë®lˆÖ]TóeYR}'œK- Ś°-ò‹Ņ¢¢ù`(s3gDk6ŠI{Ñi´,e³9h1¢„]E—–Ü^QŽ’¥©%x‰^êŸä%{9õ²­EZÜ5¥Â–n¡§Ú/Jh +‡ïÙiôeÿO^•ù@a3î•Ý‘röHqç ÃGœíÝ.hQ(†ÏQ7×ðæäÎÛºgûelMæÝÖPmìKفjOXÄèpÏ]4öêϞ-6謱ºe¯ÀÖ&ûE÷ǎÎÌÎà£BgÚROmeŸÓ®†µh]Ž¶JaUÛrMžq-_öÀUýاôcÛ< +ÚS ´z;Z¦yv4ȄjCë̆iAS¿õì^ë33øƒ%·« ‚ùì64ú«iC{Ìg]½Ösc?Û1à6ísÃHº¿ZԔ¥Çz¢*S‘BÅs­úIEU$PÅqˆû¸Ÿñ3ïá}^ìßãÈS —Xž">¯;ûH}”à®ÁÂå,9GÑ9 åd•}ûwLIZ"tÆ#øÀcØÀGK±µôËXè]¢ŸKÜsy.oR5SÂ5K•ªeTs/ªPU{jü²+4sf(¯e¼rUKö£”«Z¿Ré[UÞ°KUþ°¡iO_©ð¦Äþn©Æ/ù¥*¿Tæ³Y¹“„2K®ÒWµ¾(öƒg<éõþ¢QòÏ]—ópká¥óúgö’½Ôc­ÒÑËX‹´šRcúúEiq×KèF«AsR…CV†°[”í^9]•CD ]–ƒ;vNj JÒb§Ÿ&OÌgÊs*œ£f‰ùɳÛüüÖË·^85˜b‡díCR/ôûD“û‰Úµüã0ãü m‹jŽz’jã â'óÚ®;Ìm…Žœùk~;Òû}GL ™h–ÂQ “œ[,D¤rªÎ)Oü6™ÎQ²ï‚Ÿ˜®'eG-CPš{Zޅƒöã"﮺š +|»u3æ(…§ØöÉƒ\¥ð•Ä´Ê]NœEmðkÞRùË`Êe¢™>å´n8MùS—ë’Ï,ÀCk˜Tá8*G-¸Î1î3)+´2FçHïãO^¤ÅG~ûåq®÷QåçÿZ-~`\ԓÿ<Úâ„öì,ia2Ësr“–šÄ–m”­AjW)rSq¸OfÕ"\E%'†—¥SÚ´.\~iœnë”Ÿ‚,%2(r(LãÙt§+¬¦võ×ÄèH†ÃÛQŸü¸Ê»‚;Ñ£ò&á(úggqsðôvæH×Rö|™ÓÂÀŠ[¬ ©m1aïE£YµšS« -õ—µtÛü1,úف²Ÿ³F=ÓÝ£e°|éO+ãSŠá”ß_¦§iñÉuÿ-µØ˜ÉÎöÒ oeù¦ó([¹tÏ,oÚÄ|i3¥miòšhîê-3ÚV֛:×`䂉 æ-¸ÓàJS7šÆ-œ1û™F+ĒõŒ®2O/S ቢÄ%<%µô:¹´§—®ÑϾ07Wqq÷V°¨„ޝZgMlÂi“Û¬º±èÂ5,rœ-]WÅqUVÕeÕ:¬BuVYfËþ@f˵›jí¤:âžzöÅÊAuÌ=µpN=昒8¦9¥žà†Ò °§–ÝSŠÝÓñþrÌ µW˜Ïó³–ÿ3Zü™£üÌQ~æ(?s”Ï×âÏågŽò3Gù™£|¾nöG/?üø_Ò{Ÿ†1÷3éãœe‚’RTg|ß!|ïÀ?øÏé#ÿ³6[|úëÃ&ö'p»…gõ+Bº•ßLý MlÂx2õMº­Gª¬ZHÒp¦ÍН„aN‡ZXW©-¤tŒÐÒ?0Á# À#„àßÎWì³ûh)§ÝéÙ^Ù}Xñ–Ö€küyÌó³ç¥ò˜ù +é æÀøý+¼ò~¼QcÁlo)L F®½ç³½ãsUþf[jS6í<1cµ¯Ù +ñÙYÎÚbƽÎ!ìÆiÁnx#¿qÉ.5ò۝š55ÍRn,5é•>K% SV&•Bì3ÙV72ß]ûÀÜv]çn8ð#P¦ÏצÅFÇnèٜdÚ.<û€˜vý4žÕ¬ApÎh y¡kÀzÿ,_óùÇçÓYçaÆ9|löܜîËrȬÁ6y1.Á¦O‹¦=°è!˜ë +¬kB¯€}´‡Ã_sB»ø.»êÌð×}/˜ü¸TüìEz°°÷ôð Ìe54dŸ÷䘸ä ëßüu áà~ëý`Àºa•÷·Í@¦˹çú­™~cs=ŸfÜ2¥‘eömâ#k>ßÉóøžZÜ£¯k:Ù4¦{ â©„&ƒ,Ít¹m-^ûÜ ¾šHl¸áD˜˜4ÞþDUŸ[u0 e¤;®omó +ê>ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£!8~³J ÀÉ%ç3BŒìɧCŒ¬üM²Úó¸žfò`×!ýGèûÀú¨ð·)OmÞÔ¶Ãyê“wa>¼ ó:«g,ùیÝ>kb[Y{ ¤·BWÖëϜ;¸k1õéò¼ü)Ï,òsîÌå¸Ç¶æ䶗¼Ÿ#w¨I¶õW|¦š14mDê:½Ô¡SýS–\Š +PUyJt)æ³Ä’úá·¨õI¨,ŽôlÁ–N1WvµS‰í,‘C ô¾k?ñ`oÃ#)¯¼ÇÊ +¥ïe$â`+«s–èóEóè ¬äœ[ͼÐ*l{Ï3櫝äMéVÍ4…iFP?ƒ°K˜”+”˝/!åzúr›E½£½,¹½J~Þ[þž +”· ¾ù½µ¾$ùèeë}éúßÌ2ÑË ôróH›O ‰Ë–›B3SxVŠÇo+2W5¾»ukaxß6y¯Šá½ä¾jMï}î(6u<ÎÝfÙL·fŒ?õœXÅ,ŸÍ8_þ4)_yãS[ƽŽ”ápáí6‡Jÿ±…×´Öòá-:Уº+Z‡EqYô{ðþȞ ±Í„!sXdA¬×<%ÿá2"s»yˆPð҆-s«¥ƒ½žó†­cå ¤ûž²sÈg+ -®mˆÿú‚ôOÒâ£*‰´xø7‡/ Ù¿è ½ð€êØûW‡L{™E—ÙEû½]UöԖ·gŸšË0û…5£;kv¢Ãù‰úÕ) Wsàô\4Z½AŽû yñ-9ü$<}È~æüë ҟÔâaÅb<¢Š˜¢Bûõ²ì)9«\Û-R®ªM®J ?/9ÂËɦ9ÆõäQ±HSï `¾¥—,ûãH™p @ą¨a”w–é1¸œy-›#l‡ +&‡åv΀ñ¨œ*)ªµP¥Ä-ó"ª„HÙÐ$BH‚ÿ ïAÊ;¥‚yÍ}oÿúÒ¿ù—ª…}0²ÞIßÔþ·*‘ûüŽ®¥š:S-Šj^)ªi¡âZiTœOŸ½?¥W(ŽÝ_j…ÚúþµoëkÛZ5ÈÕ£½Á¤:%-Φ`mWØV¿„°¹Fph põê‹ì÷·n-{bqg¶ÍÇ\šû9,kK½~bvwÕ2#ێ9’Zªp‘¯#õ;nÿÕéOjñˆÊq¤˜¢Âl˲¯ä,• FA:t…´èNXÙZ˜z­Äy“¦óœ0e…9æÆm¸ÓâbÏ]s©ç@Çg<ÕË~q—öîüìš. £ìM¸®0r8\ñ/ÂR£y˜R>ÁG›4žô1µÁOkGj±fBÌ»~˜xϖ0Ó>jÏ1ÌCO˜7 ç­#±›1Ãn^瓛²»Í>è«rÚ ãIZ¾ÉG7ñ©Ž¼xБ׈܃õ‘öäÄÀ㸇ÖYãuúæ†f$óZ¦=.·Æ–®ÊëM§Ë»b«LÖ?7÷»®oy]‹ÐD:[Þò]`«Z5½s•W¦sy[zÍÂÔi@Üö.‹æšÅý»@ææ‚Äåm £ß"orôFªÑŸ6¶/•S×A€¢3ñòÀnÈ)•Ëò¦Nv×Àp уæߺNÚûáOÛýz²_è—U2ÉÍ%ØcVï8îG<üÉ;ñ08>þŒŽ‡Pø3:þgtü_?Í÷¡EmõOˆÚ:~݁)ŒŸß´<£ž¸Ÿ¾YÖõΪ3»¥¹Ü[Uo®Ê~sÕÔÜ£U/æ-]Όf¿ËõùQÛå{7w,—â± +ŸºêÒaA,íIbnP÷yîÅ×=rÍÆy}4~¯ÊCÓ¡uÝôPÌ#q!øH\`m3¯b×WTì½óñhÀã û8],ïGyöS¹öã›æigÁ“®b8tt/§YÐÐ@é¦y¶õoÜÙ7Âú‚âõ.úäÆ~’¨Â¸¾ùÿþßÿ°ùÃÕ¹¼ÿl›å¯u);Iï#¯¥yöÅ^Úâ’½$-nŸù˜Ëè%QñŽ³sKR<4Hýe$ÁñKÚ+¶MôÀ§DHìšk!AIö#c$¬xÞPOî¹6­Ì8?õ•?{æߏ¾ô‡‰ŠŽ¯™’ø5Úͪºjjºë"cהא­gIéúÜnò}BýUºk3j>jÐ|Z\ʁË=>62e™¢¹Ücäìpš‰'­‰¹P©û\W*µ×@ùŠXD8уٮˆö®Ý²š$菮‰÷%B_¦A7s7=ɟ ´^gMÜÒÇ5k¥Y1vQÁádÿ‹´"ŸO"/rù_±ÅCNµC7Á§%Ǔ÷9ÞÍå`*ëe"k‹ÀzöÅ'Æ`%Âª1X²Ê>: +Ë\![µzÐÞÎäT—²L"s~8ÌOv§ÖÇXުŴÙO¶:~± KŠ¿³šäOÆ[!LôçiþΞ”èo™æÏb·Dæù¤è-ž6Ô.£·d•}tü»@iL†ÔF{ëb•ì'N ôóšøyMü¼&~^®‰eZ°ȘµŸÿëÃþIÍ[Byñ»»Ûoîonnn¿ÿòËVuoóì‹ß½áï‚þî›Ë‡‡ëû[ÑêO_ýøöí%´yû×fžOæi˜á§)l†q<édv6C?ÈâšôOõ¯ü þ~§?ê?þ¨?ÿ'ù÷ÿê_d(6¿ÝüÓï6/Ÿñ©ß£Bé©4¼y ê^›ß,Èå½~Ó6q¸làÿy~zÿpvsõpsw{yÿãæWjy¾½»{%cñ•Ë‹ó—7w÷/¶—Wÿ,£÷âۛW×/~}õðËÍÀÿþãßýïßi+gúÑ_ëZpí¥Cû!rՌ²Z²e‰´Kƒs¹÷rœsæÍ?^j[ˑ }҅©ßÄ|DI°’嵐MœO&‘É6ÂNÐZL¸¢xÜ Yª 3ØÄxÒËÜ\ñ±Od“‡MN&؊q2Sތó‰è¸4y:éƒÔÉìÈ¡<7Ÿt) › ¿Ml>±»!ŸÄn‡ÜÄϧ“C°>–ÆÑg6ÄÐgém’^D(݄A_ +„ œkä3DB¶Ç„Ú‹†³‘iϽ¬Â)ˆÈÚ0#Wt*™Ü8€0„\>nê¤ÕaÜŒÓ ®¨Ú 28ý,+cìOä“ðV#ēџêODÚíý͇)žŸŒš4Éé¦édìó¼é£Ìì4•ç¦“Y¸Ñ}à·x©1Íq#íå·AÇ sÁh`aHþœ|FîËþDøF,ä“Nô½Í(C)ÌRò&Ó$¬€\'Ús2ô&¦Oö1£°ž/.3?Fþ<&¼7f~.3°!ðÁ½0ß Z]4o¤SŒèF·1ž[+óúùAÖÜ$ãÛË·Éó¢®L›i” ŒòÒã 3;ϛI:Ãës²úúaÚ¤ ñ™C)ÜzÆcr† Aöj h#ƒ—„§×Õ5`OHcˆ­Þ„N>i–G™ðyƒ=ÀÅ,‹SΛ9y±“©“‘µ¯˜¬*t'Ýdy<ÊPYx\ÝiШÏÉL‹ÆŸåž&¬F©Ÿ§ˆÍÓE¬òõžãsßé?ÓÙÏ'yì2á¾y½ Ê:C–J.9Ë~‘E†8ÿl+IÞn–‰óJ²—Ʀ þX:ò¥š,ãyBkAVœh€Cí§ê’ÅÛÔjå+¼¡ÕgÕ}>®#c„Èòz½¤ŽºÀ‚,O9ÆGäPNBÝ8ɲ.›;Yo¢œ6ÕFí¹6T֟=W¨Ã‰èÁ2wÞP2Ê*hú3‚=W^Ë«•÷†VßW?ýßÿÿýãœ!_½}ñÛK9†wwo~|q÷ϔ_ßß½{c‡ÈáG~ýæúòáúå éd}Ứ_üróÿpäà‘•§Ž°*‘Nfºm;aj'Ž°©4ÄöÄIz_½8c>¾%cƒ}4ÚZ®T¤‡€ÇWVMÈ!l„ÏMY¸p/ܗ5kYäF±^Î0ë‚Õçd›jCQ›wÂl5ô¹Bí»Ùp°¡ô“Q„3ÊáÞPôÑY¨Â¸ü«3øá¼Ù›=N kO†% ¯d|…é¼^RErKë…aŽ"F–ÖãL’ù±í;'{ªu0”Aؗ7â뫎8©½LlF_¥Nw±wÖ5»º¾‘×*ïìí¬>m½%V‹0áƀïur”Ð{%çZ?YJíŽ)`³Âäó(g¼-ÁAÎZ^a¸#ÈÑØ)ööÀ,àr¸ +»êF$Œƍ%†¾“cIŽ"¼q×vÚ ǁÈSL­>/ÊÏfå Îr@ÊVŸEØÌr^ˆøaÏá°2³09#6<{y™Y„%Ñ]„ ¼B–'œyÊé%TÑ®ôÔÉò „"9Ý0°"‚ õ³ ¨°–.Œå9¡Žƒô.‡$ °ìO´‹„S73ž[Êþ1„MÓIÒw줇×K*>Ç·|p¹Ø°Œa†¸²¼ü|åƒ-šb­$’°‰¦‘B°¾ì±B•Ù–aØx; ƒ%Ûí9¨rÂñ!¬ÙρzH +"ò“±}ÊţΠãJdAþ¨“E´†ù…'Ԍ9ۅ¯fƒægN+E•YDöÜT”×Lqy@R!j(¢}Ì},2YK ŒŸ€eªdw‡€Oè1Wå…e®i9R'H2É'aı$‹³“ãDf ÇfŸša:™«MÍ6,O¤‰6»¬¼„»¹9g¹ úš€gÀ`wÐ0¦!Ðµä8O²ÕÀ£sחý$?“¼¢(ÅA4 yUIᩛ¹ÓX/ÖýcºWl®R‘Š*b¦|ÒC¹÷Âϑ*§R|­ŒSS+2Sß´åëӞt² G%­iKÄÙI¶QÓ©QìQ;¯èà­¿´F?s˜x“ú1Ï9bq²¨Ù"Çc`;Y s\PDÌ˃O“±×rÜ4Ééñ«Ú«QìÑp2«o+ʁ ´YӘS–½:Ù_ÏóOXk3²o8F¢&‡,=¿^Rš±ë‚÷ˆ×Q¢u#`Y‚s)d ªÕ¦¬3ì 9Áú»*‹O©AÖ @ØÞÐ`_åýÁv}y-¯V^¼4´þ¾÷HzŸdà‚ÚÁTÕ´ÀýD¡p{”‹Üi1hõ£Ho¢Â- ZlE›Ý ¥ê‡¬¦bЂ˜+ëm\´ÐÚ<ÂD`-ðRöW,Z=-%ÂC-²SðÄbҒÏ?iÝMZ òB ‹V?Œs±hý†AÆ X´È1ó ‹+ìWfСÒMÓì­R¡±g£Ž#NJ{otaâéݞÕ²ò<-íY ¦,'B±g¹ìPìYØv,íY`Í87hÉ΂AßíYØiPOæ,ِ³R¬YÂòē€Æ,ù1Œxç֖Fºj̒6Bx̖%¼¶0e‰¨žä¤qK̤Y¡²äüðR ;V¯âG5da »,bd1dIÿ'ðS, Y½t͍V Y½¬Þ¸vÑè„s/ Y=4ã4» Gm—åÊ«œ‹zaÇ¡Fɸر¤g9ÂeG;ÖÞVÛ?æÔԏK;–S‹ +‹#c1™‰ª˜`raƹ6L¹Öéa6…­¯4R ãR¥š ÊÛ)VªÒÙ–åoTk•/)í¬?mÉÎEŠ—¶¬J5øf˜£Û¨D`EˆÚ¼4eç"¢ª©ÖiǵBhMK•j¨ÚÙ¨j­)ËßÊk•×övV_÷¿•%댆 1´yçLq•Y¶ú„#Æ]rà^+„^ ÂàT1c6T”Qz›™;8dàû™v„ÌZŠN*+sç…ù&`RŠtW ¢±p›Ê)/ÞON0¿„}5Úh5ü“°õœÍëQóŒÜü`Tl“nÂ{ÊÑ',I5 +2°ŒÚ(ûÂ,ê 8¼Wô!Ä®RK)ƒºo„HZ\qbˆe&°Jæ)úĨÖe:6ðפöq‘¦J±1„²i­8ÀÑ4¥?—ݐ>«Nщh»©Í@ãz…b–óŠõ›Jc{_ùÊH¸,þ¸òúAí!‡/n?Ô °àÅï7ÆÉxæø“³]dH°… +Åôœ¬Jo­(Œ)Cw¬mUJ×°¡J–¡0W…U ýØôZ(WeRùvµ^ùokïKß#}5¼K\K5ìÉ:ÝÅI ¿B7®]¼Ô½O0H¬ÜÔ´YóÑâ€_Ñeç”ÛEæä±,²â©âXÖ§yª²ôT׊Å=pW„–R³Ê*Ó[ß4μ.Út-‡é¸»z€(‹!^¯È8¼‡©:¬ýŒ-^d',Öµ^ñG׶*Å:]:®yÓDàAȦ=¯tZKßuSÏ?ÀÛZéOæ¾G¶‘Wš§“‹æé¶È¢yb™Ð„³Ð<Á^Dg\ó„~&2çìš'l4º-TO7"ÕÓmE§„U<ÁºP=¡Ov‚ +ÛdQ<ËÏ ½³]í„Ù¦.W&é p-´N˜Î҈·óŠ>|EëÜЖ«I#K­³’‹ªH;íE™Ä?èÐ_j´3A¿©ûÂ/½1§,´À†lêbm¬¨”µ×…îY_¯Vô/óÆÖßzÜþI¦ù1âVpø«_¯ÈàHô<ŽÅ©9©F‚ÝÖAìqŠÛçigm*B €±6æëÕ‹‘g˜)Æ¢É©%lnjz-·î›sÕ+ú'xcëoý }ã6ð4¨zØa« ÊȜ:e ”9†@ãú@÷C@^,°û” ·Ž2;ZEV ½f°ó½òVWuÁ ;À?,ÝÓ4萍>Sájö!ˆ£O”t2q½"èÊûöÔUã8s¯s&_¬öQ“>šfØ&„ûÐ茖+ëf„€>D^èáË¥S.“7ú‰è'úíáfw|¨è‡r–$zï*BŒC¯Ns$‹ì/ò(WU”ÉÔc‰jÏÏÀ)•;´5ase…ÀN¸~F‰Á½lù˜Q¡QòâišÕ]G»<,yà ž'ªS®]÷k¡ðvY§&Ù^?ŒnÉý±¯:°)ÀZ"i,ÐïJ.V +,£ÖŸ„ jÁÓT ¶f‚"Žšz¬mS…`]ڃ… \[ôl­=ÍaÛ¼™×ó·÷¶ÖŸù +’C¸@ƒÔ’N>€pú±W$C.óEB<é†â‚ÁúÊŒ½0ÞPu…u +~Á®<¥t¢|Ù7â$VZm!LÂéŽE®Ø ¨6 ±?ŠºÑȐðaá֊i.@ÉY»à +U Ǽ!ӊ N©*˜¬Pz"©Ê•œB‘SÍÏ' Ð‡)›@a˜y!i'×ÀШï;•÷•h§¹³O-çiAVc%Ž+å{ؙ66·Jøߊ€~êlS ‰NMßr§†ªà½rµw4 +ÀÓA4£N‰nhðØ öIšSýIe.©?¡y³4Ú§.,iS›’Qu^šÊFK£YûiP@E°Z¬8Øޔ¯;’ê)̀¾È[¬ûË~ŸÛ`y·‡O¢ÕîõŠ,ÇO¦ÙE䘚=ðò.<>F~e¡ØæO`¬µ¢œe±mÊ~­°#n\ë7M30DÁtWû3Š=è/æýå½±õW6^AY¿ô¿aåó({½"ÏjBü†ž;(â€e9 +ÏsŠ6zE%5eóqјS¬WÔÈI%àÚÜ»0´Ö^ Å-¯W+ú'xcëomÆA¦gŽ8—E$óõ’ŒvRîZ5Ë`Ba9L™('8èˆ_¨õF¤ M[N)Ú£N†¨D×Ai €H1¥OûÙ8GyµR«~Tihï3ëÀæ+"^æTO¡xˆòÉYq‰"¼©y‰’9¬²YC¡?‚ÝÆúB&tm˜¦ÚXC±^íQ'ó¦i n‰Û^rU^Ø^Ï+ú'XcûßڌC€KzP´–è?ŵçdØô ÃCvÓ +£t´HS¥\é%Æij+Α›ÆœRzuaÂÈf© We —wjsZ”—+Õêg•–ö>ô'38ª‡I# vÇy61ïlA»ã˜š"Yî«GÈî(€w¨ +tI9âØô˜hñ6Èû BÑ@>ļC@…,å˜wŒ™z^ èuCt’Þin§±¢Þ)1ê¯ÀÞÁtü†½ãûÈrÜ;Lq×þ8® ŽP¡[Bß¡ U‚hÎSðZÇ£;åÊÇ'CSÑ íM[…R:u…ÊÈù ²Ú–ô5$J¥ÓBqù1Ž¡­çŸUšZçqÕÿ³ààéžïZɊ:)s,1YKsE¦;Å,"†`o*Ƚ6åëҞt²üS6M[ÉÌѵÓԚ­ý弞¿¾·µþΆÛÁxjE„ù"2€Â•%4»'2>‹ €²ÔD™–àºÁ<:2Ҝ†¡†8ÅD#¨õ +ò»ä e‘Ém!S{ŒåNÕk,HL¶ +è%W¿ª"ü‰ Z)Ìþ¨“Eꆜk”@Kx”€SLr²(Z±€ÿ‡d€‰J) ºŒÜŸ#]‚:¡ÂTƒ6šêû– ¸FÔ0W‚àñɼçTt¡”4jL N€H ö`4)ah¾ª1&èM:%€yèû>×0œ5ÈwT$+‹€v?å&N§_bõî[¢ €³Ù#ìäõŠ,*.åv4>¿|nB +Á× Ñýµš4-9ź´'Ü}º´PØІ'8Å-ïV+úû{cëm”†‚žŽmì=Š´€ûìØ ôá4”ØFÈT2,dxcØa¨½Å5pSњƜ²ìÕÉþzޘÂú[›q(Hz,¥4º ½’…¹ëâ |‘O:"Î xß)γò¯K@m¬R¬×«²Ü›­¦6ÖÙçÕ^b<À_Ï+ú'”Æö¾õ=Bóg XBâJ܀#âà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q^eˆs¢„G8"® 'hqOàˆ¸PPqQ°@ÄyDCâJD#â<¤`ˆó˜‚‚‡+A‡+aK4\‰+p8\ ,p4\ -X‚áJlcáJpCáJtÁ çá…óø‡Ây€Á +ç…óƒê~/1K(\ 2p$œG8Îà –H83p$œ8nwp؉„kÈ_sh¿ÜJÀ灵^‰%¨mUJ LkȆ`óÆåV:]¢áüåšzþ¥­½/]žç/Ñp Ù0læ_Pn °ÃyÌ@­fQMCNi‘i Ù lµ-C¹Õ.[0œ¿˜×òW÷†ÖßxLg­îNØù„yû’“a­H* Å¬¯4KOîٙQ̺€c`HmEaa!Lm[N±N«aBɲÉÚS¼1š^[¡¡¾]©W? ´µ÷¥Íù$Í}z‹šbu$0‚×+r¯ÁI°ùˆlu⺠z‹H¡RÜØcš™WÄÙ9…¶1§X¯WÅRhä ÁMcr@l{5Š=ê¯çý¼±õ·¶£ú :+ܕ]Rõ%¦¹H³• sӊã¸{ª±3Àa¡˜&WÒ¨xEF(Æ©i¬R¬Wcú… Å-ïV+úgycëý©$dðÔɒúôŽt©ÔÁð.†Ýk\ ²^I +ÁT€[ÑR[Û®ŸÛ¶œb}º6id8kÕ¨!mŸ›N`OúËy½òþÞÔê3šJCOG½Ić”ˆíd˜µ¢ +ijRD®'$QÆfæ 1Š}³+mÅΌMµ1§X¯þ¨‘eµ1¡ˆv>6½ŠÏ…¾^­èŸà­¿õ³ÂÀ,uøüþõ’šKjˆÉŒ– ’Õ Œk*ń‘±d[ôŠ"œ!TӘS¬S·÷(Y†ŽùñjcC§!Sµ×B¹*﫯W+ÚÔ¶VZGðsFȽ'ðí3ú7sIí¶€vâF UAvËgw©ÏØ Ïê®;#V%WT7,3¨;arhvm1ݲ-„i¤ +éFÖNàŒÑ=!-!Þ- ;2]öXñÜ0ÖÒ©\àÜðŽ}·@sÃÞüD»‘¸ÌP±ÜÈ|*œ-”[úӈ†‚äžLGq ÷Üì$-Ž;­æ +ãN³lê*Š›’6˜ÞÄ S²¡Æ ÄÝ+в¯ nb€`±\‚¸:ËËF_#„9Êæý7ó{6Ï 8ñp-‚»RͨŽ„›)7¸lÄӇ=üv‚{ƧBMòŠÙҝ²¡Jh¡Ô•jëڐ¡²k-z»¾V©æ/n í}ß{@Ÿ†Pet°aÝvrnÏÈ¢#?ä6|ü¹nÃà nTpÛÂàå܌¶Í|@d- +>*2µgí̱ØØÈd[¶üÌШB HØÀ°εÆj‡–ÔU€v·Bfw’ ´4W‘=@ÝY㱡½W,ö`oRÖȇeReíbŒŠí/D¤ãÂXAØ£µ²€`‚ƒ„hãëØk`"0¾Kè5Vj犼Fœ—¼ÆŠc4ñx²±Ã]c€hI*°k¦(Žq…ºæ{f26Ð5 ׬V0×9a¹î™jU\×ÅY ×ûËu;€w˜®âºR %ÍdR ¸:3ÙmL©Ï«!ž ›j;•ÐBŸ+Õ Òµ!CQ×þZ´µ¿•ëk[;{_W¿†¾ã +h]©mVuO#¨!­1Ö"ä2²¦B¬å|žÚfœ°XjD—†5mÝ-ÁÕöN…X_ښÙû¶úفñØ Äùõ‚Z Ð؂¸üÓÑÒa´d™ T5ls}njáàƒèåíÂß\©†ƒ.íPÚ;káÔþJ¥’Iidýiõ«‘~‹ÉPêJ5ð3´oaÓýÄ0­D´@L¯6ªW§6ä„Î\©{® 2ºö×"¨ëk•jþ⥡õ÷ÕO‡ +~úxº ÚYö‹æá,€hǘ_uœƧ¡±^MD¡.6l', ̕jPgoÈÀÐÞ] ™ö—*•Ê—”FV_vÌÁÿÀ\â He%$}{Êe))çxNy\!*ábï§T©Ùº™ÞZrÂÛèԂô† +LÒû[À)ë{r}÷ÒÔþGþ4:Í'eý8ú"ãæùW·nÀÁ_—zu­ï󛻫ÿùúGë!v›ç¿¿¾4XüØtô1Þ³ó7/~(]{¯oî¯ÿ|sýy­WoLó6òþ7×oۗ9Zý7×ß=¼)¸¸¿»}xoíoïÞìUpï‰FõèwþýõÍ÷?<<õC÷—·Ggöü™Þít~ûÒvð²§ÿtóçk\õÄ¿©æ1Zq¾aV"ÏtʪrLKÖ¿7=ÜüCo|*]–*~kѯ^ØädÁß´m¦.›ø«ÞùD¹œ'³£Ž¸H ZNî‡N/ïÊåÝã2yNԘmäŽ=û<¨kAÖxv€ òÍn_#_J‚£µ |äAÕoàžØ|.¦áØ rM¨X;•„z ¯–£BVôèÞ É5`z”ã]T3:{D¦ó{'L•ôît³]ÏÁp! L B¦O(ØøXGê¡’£õ1tJÈ!ÍJCý:½i (€"mÍàízþRÏCÎeý69Õç˜Óbæ̊”̳ôç‰y Dš•okÉãÔëƒaœ•9+9µ c£Á°y4¢e¡rx@ §€õ¢…Ç%U6Çq*³‡”ô©ïy [Ô`w|’‡Pù¢ŽßÊ»‹ÈæµFv¯I3Ì¢Zßé"*L]³Ä‰¦•‚‡JL“ÅŸ3NJš‰“J&g5ÏÖkê&¦öuo“~FßلM½ d†`’bA]p!ÕGGjÂ=îÍ͔>1·1•Ùz)!!Òí1·¦ ªq„Õ›†>$µ¡wŒž×8Ð H úr#V Ù`ÿè&‹£ƒ™ÐÑnWVPŸ)è ‡œ54˜fåFÏ!Qï)·é‚´¶4Àb,”¨?rkfÛ<¤Lþ²À†Î*FVË}V¡NQãšGRbð« 2ÌU4p…ÒÄدÀµ!Jê@|î‰ÄâŸ`íÜù“#²Íð~MíÅ wêÈÌ~0òaí!#ê䱅îò&8b; Ôp;ê~°‡94υ)ŸS´uxåˆÔJ‘ã&ýyt·<¼Þ1cÂx“9ËÛÍ£¥ÀwäHfœË2SF ½…1˜ IO3Ó­X˜XÁԎ'©]àd\" 0õ,C#îmë-yS߄‘qÐ@MŠiJÒ,Û!N³:ÌÓ{:F#MäÔ¡ ü0R:gø\àr‚P];° 뻣y%k-D²ôFf Æ ç©ˆLî9fž9k¢;°Iü<ù˜t–Ô`‰r17e`mzoøªÌύ`F1ÅÔh"STtFBh{š•‡ÛçõÚ_JºBiš{Þâ5¹Bëò/ Ì¡ó<ž bóMÀD2™ŸhBà9Ê7BC ´uidcÌ)½ñPF¥-þ\ízT*Á–º’S6 Ö7•5EÀ8´1â†Ò•Í^:Ô«“‡ Ò|‘å ½Â¸\™¨zÅ!œöoô>Ò= ˆÛ‘€‹c+·O)3“|ʳ ±ÙðÎ=%dÙ +ažk¸”šò·FhºQ×öŒ½:•˜‘|QNjå(˜ç,ӓq"ÏêÞËÒlW,LHè7cH˜ÔÎêd‹§§ßžfç1r§(«e•"q2Æ?¸·Ô s,ãV1He?œ¨SP6æâĜmM€©‘€# ­ÓÍ=fML"FywÝl[0‹“ÛêkëmOHe/â”~œ ¬.“^±-012âÞÆQ5}ÖlãÓTïˆú0Xwê–á—Œ_ìI{VFÊ8F…ñážÞ&«ÁÀ‹RÑåé?0Õ&®?в!x»ä8z(úÄÄe¤’_Ð!à«7y +n±^ùµ='L/ã,ÊvZÂ×Ò{‡ÐN•LøTÂUQôÜ-ÕpÏ÷b´DDH)#ìVX»òؔp–Ìú2DÉC<‚m²„ üǀò8‰©Óˆ„z&œtàÑÍϲâ'>ÕûÑ ù9%m‹ÔÄxaĦ©ò‘f°•A÷júÀp!$¿gqCósÖt‘VôŠˆÛ<"£Ú#@c#¯œÍª–/")¨0<{Í õaá#ªy¢av !Ìz­LîdPñ\ç—! ¾°“mÃFIŸ£¦#rU>‡Y +£ž•öyòZr2ƒ¥t˜!fáu´Î+Ó”‹`ƒçÔzº1!*E5½Í¼m ›Év‚¤œy¦Ò¯âÏñí§¹|Π‡ Ñò'DøžA誼žt!³s´MAÖ8®ˆ`JlpȄ1kN¬]ó9Ú±/É©˜JS]¨dr#C!x[#Þí99û0¸Ô'‚¡O‘| y¼%)dã ½šb¯Ü°ÈUº4kb®!荖" hV鞇j§*?F„Ž§+> àÅÄÿÏúNœÔéç›ëu+ð Ps0xŒÖ¦cÄ9gsˆ˜G=Cz­’½efb¸º".ð4‚ö&û›§ WAbÄ1F¶”K*ÜæÐʒ¼.J n{᎟Àɨ0Ïǒ á¦öÞ´4+mª™¿; Aª½˜ÏQ€òü¹k,W€L4^sfä¾!{”ForZìôuaÄÅû’s̚ˆmÀ«Á§t0E䜐‚Œ^ÆN[Fà ‡¨1ÃàHýçx嚃…€ƒÊ Š´Ø0 䒰T–Üò´S53Ÿ±Ö@ÂÀ$hGN²&C€Ýa!C5ÅOP e‰Sâ©lû ìÔlj$ã-&Þ‚¥ŽX9Ûôg[Ð&^y%SsŠ5 x#Çݶ ªñLq+Pq$••9Ìͦ9ôFRÕç)Êe d4£VfÆQ†AÁ¤8|€Ú¶PCQਯ€@–xNä> 9ÐÔþŒˆLŠfp‚þ¡W5L )6 óÜM†™+]µ+šŒ°™r4”%6OCŠ[aƒ.L¢Ç£…¦ïû™a˙ŠQ<«gÈ4fz®µ»ÙC:â?2©X’0ɊBŠûyT˧±Íê4@âmåüxOjq jú˜¨·;5šf]5€Tdº^G¸1©WÀýë¯Æ +…G–Ç '³²rpOÄ癅 «pœ™:Q3­øÚe‹¢VæÚ :+À’^<Ö3ˆ ·CÍõ1Jf¾‚&|ã  Å\‚Eß3G=ù†±h,e*=f}AÔbÒÄF F,ð•«*òÓDsjЫ—8u#¼-"ic.«©„’峁¹“1Q0I•3LGK€Â„¾X¿HnÊ¡Äñ8a©'¶ì9Ès0¸¨NŒ ™°EªŸ(yªCú骻y¾,Õ!4òh”Y󌌾MØÇ<–„$vqEœéôÈV;%3õótÐO Y%{œôÔWFz?5š–3¤Í»Yƒ)ؖv +Ã+ +ø ‹Ãúiìõ¢¾ôä£ ÒÅtôÖbäØbvÓDMʘ;4§¦Ó¡× ¾äú¨G3³¾/â/é¢âR)¯Ú£ÀôÏ&›$Íî2Làь©óìêŸ!ÖÔ°Á6#³£¦x éc¼‘{74<76V„7ê½(8FF›Ê +¥a êcffØ^5D{]ÌèijÉQ^D¾$ΊÛ×Ul[)58}®4¹ +ØXHú¨ð? Ÿ¤š”Ùo´§úF堎 æKMÂ-CP×EV3ÁˆÜËúÞ÷4CÎþÙc½[7…³~R¯ËU±¹)›ì*‚:¥h!ÄÕÅ ô–‚‡–Pr̝’iUcÅ!ªÏ9©…«d…»9.:ÐP­ÅÈG†BÏćᾃIÃya_°³ %ËmË+3™c ¦?ºî! 2b·ÌÙm›cç˜QG£ öf,‡±g5®W¥6Ý1qB“zÓdöÙb^g“µxܧhö¹~ö# n™’>Õ²„á‰I'š¾±Û³%3Ÿ *è§bÀŽº –N(Áb`†©Ž6]šÖª/p0ó¤€ÕÌwf¾bû9¼9~öÝ1P1‘U£ڙs¹´8ªÌǦºzàƒ€=vŽ–B¤×<°³1ìé8ê®ajYý:$ïÓê:5;a]SižyeçÌà\š„•s¶ÿ ¬a ö½ûN8ÇgÓÛH€UéRID*Lð¦A›dCvÓn˜F¦á„¾ÙW ScrçN?«e6§ CD’lÕ“b²Á¾EâF¥šÆ /I#ŸÇ¸(ü™»Ï¶?®om‹¼áÀI†ïŒÉpw%c¿ýÊ4d%†ä„Æ0Hm§V58ÍFM’0ρ5û÷ÀÛ;#‘6Ð%ÀF‡™W½ÑÀ#œH4•ÞæŽéøvFÝp(|VÔíÈÂ=¡õ“@FÆU4 v¼¤ ÂvžÎù²øýš§òhW#¥4ߤP;ƒdŌR~$ÃvA€Æj¬CˆW¸ìhfЕˆ"ù¤ÜîIÑXƒId Jí™ ÊŽR¤ì€íT ¼¹  žvD‘xll‡Û`TaŽÝÁªQ|Qö~=p͉‰ØàŸèx¡Å|Ü€ßæ L>Ê:BÈÌ\zP 9OÙä%¨7}t“ ¨€|á“Aî­.ÑSFOA +øúY­êõ)L3ü¸Gëšö8™¾Qaš™cœÕçK§R‚º{‡ÑÚÄ Ô­J[0S+L§J{eV +Pj¯0ƒðõ¨Öa·E¨ ЬìÂÉ>iµ4ñ/êšÇ§RéÑ ÎúdŠr¶tQ4ˆAÈαá^ç}W}ÐtªXcsÇ,£zõζ ÉI§¹… GÚÜ@&£¡éR'+E„àLJòµ@LB¯õè˜#…—3Bò‡ïl_hôðô±èË%YÓKâHØÁ 0íi4ñ·}ã̞&›5֌¸'aw0é)çïu—ðVD{Žga +õ¹R +¨½4314¯jjgž²©Ñt˜ª¬>1¨w’K +· 3Õü€ð½^ß]d3óÒ.J&mÁ*ÀŠÜÀ¨… bט W«!Édê¨ØÁÛFóRøwn§Cì<¹È(«†f:ފ=¨•?—u" ä` ©0 j”³Zôì!û?Z­ðäܓó“¸SÍÞ©w+ª]Ètö£‰CAE˜R‡™Šh:žh?C+ô±(´^±@ˆà1-ŠåhбŸmƒêµ¤"ùŠÕ»åÜ1ç:ðJíwDYd®L¸(à“ç6çêgà Z4Çý/ wšè;ë㮩®} raê¬y5N*‚“‘YcÖÇCvÆm°ð̺֘:4Œ¨„ø¤¬ŠÊhŽµ$3`,ÖðšPŒ³^'9âdš'ùå= à{ F6é8²:Ùw‚j¾ÆYý¿ƒ¹1Ó¬Ž=žU½¾&³Õã±ÎgþÄn¤7Hoº`Æ™È ÊiêͶY!`aoïÊr±*nªÝuj{ +ƒ"Ë@ Ä‰Qq‰=‰ôäó1ø®˜ +"i´'M` ÌÍc<Öa^×ô9"˜šM„qÍ6Nà ¢Ç +œªà"ϼ›JýMZÎ8ô\÷þރ³Œ^)ZšL͂DÅEˆÏ±É˜Ic:\¬aRo7E$Ük ¨¦YNXíõúÉzdͤÚTɑ slŠT-­?ó"öÜC#?‡Ž¦Î¹AW0:Ê¯ñDw¢Âò&Ãaå¹ ®”`Œ`´4©¥"£ À!)Y̚üŠ*U +Ó¡;¨~ÁŸåp@îð¸žQµÇâ£1Rlš˜S®W¼÷è&ÊQm§ãÂB9ªi£a´aëc`$#ÙÀ )BBnŒŒ ÊZ'„¬gžÂ¸¡Í’9ü[8xU3ÖÏ3QrElI\´e¨ +½¥F’-Ù;vö¶„{MÏH• ŸF"O}ÜZ];£Lœ‡ÖƄþ}Ù Pv38£¦E†R;bXõ.Z:"c +¬@ë`§nëúAq†îdüP$!y–7nÃN-êö–3áÈQ~ô­Ì«Âp_#;ù×I=JÀRäâí2ÌU±@Ø)‘1°^ñgõÛèq‡hnŽò¬þ3`Y±d‡IÁ”Ld +ÿãK¨àGb˜žÄ¤á>?: ó¨2 ¹M•iéSS³ŒÌr§ÀVxZiŒ,L.¡Î€f⸽lp5pCð¿M.zá9ˆ Õ×Ó!Q¢F QFÉ,‡Øš]lƒÖÖÄÃ?™Yۜ'^2¹ì?»• àÄ:ÕqèGÆt@ ½ž÷ˆ¥D)NcÚÀs§¨4auŠF¦l"/:Ýoúm¼/»9ªÀ¸Ý' ü§(»Þ¯ü"  vô%ÂmÇ2£>‡ +øü1@͖¼é ¦`N9 tùéblLŠÃŠAÁmD»AÈaÚrì£#&¸ßíó²â% ÞP—(Ð@d;  $1bopeƒæəzƒXƒ0+AQ9SPÔÔ«¬kϵ\#]=¯H#61΋çȶØrÅmNÊDÙä>R-H’Á()©‰&Ûe‚ýÅrà”ÔÒ9uz†`‚©œÞ]'5 Mõ?ÎŒ3…)ˆòl'·~o¼&xç¤ê?~¦zà€O’"³»zŸXgÊ~g·¦¬Bx^FûBœÕÐa¢¦92&³`êe†96ˆ±$¼yFE˜‹ÊbÀ\èÁà ^è<‹ÀApsx(r;ŒŠ:Úɝ'«boS½êéò ÄFÿ@ñ+À|UTj°àíÇçǜ(™"×!ÑêÅí602X`qnÜåuù+;SOòŒt·ÀY0Ü;ºh3¨ûs2ô¤§Ã”‹Äˆý¦3ëDé•ÔÔ*‰…ƒû^H8`ÊÕ¢ámM’£÷³ÁÚÄËoÕçG³°|Kfv®?q¨M—ræ²ÐmVwOèPe}ï e‚Êæ!ÊßÑ {bbµ× +7ûŗ÷2÷¿Ü<ÿÃÃýÍí÷›_l·§WWï^ÿþîá•×qfå’ˆ£YTi2x]ȊSè»"k%Ë0Ñ@›2„Þ³Ô5ð"šàF»V R&ëƒHZR: û¡ƒ­ú õÒ'f½ïëýyLN9Dª…b"Ǥx˜Z&šÁÒ±¨Þe~°IC¿vå9Õ99FBÍ«/ϼ%¦W¤ ݁ap­7 Æ°SMÁ]*fÌÞâ«';=XA&؇Æü¤ Òkˆ +(äX®ïiWV÷§T(a@ö3Póà0.óʳ"ÀáÊ$Ú¹h“I;w\wÖKÏgR-ÙÊAèmn‰ÕÁsãësôÇ3«â¨Ï] 0–$$þÌÓؾ.h‚„ÕþŔӰ¢¤bÛóßÅaV1&EeÆ˘ÎDm‚¼Î4€/7ÇPàÄ˃ª‹Ü¢€ë¥ìÞ©üì£Ò‹] ϞÔË8Y»Ë”n3žu;ׁ'Dw& ƒâ×4<>™c¶c.È7«?7ÉɸaÖ ¬cêE3-á*2e:SךÔiÒ‰Ù¿„ˆˆ4Tã\Òÿ¡<B½kkŒ¬ÀÙÇ»1Ê)!@×c;@÷Nv’Ûcà‘cÕ^ˆcB˜‘W\Ád% ÃêA̾.+"€ô¬¬‘s@«›KÍ4O óT+᱗N¤ õ%CjéáÚigàô#ûÑ@M5îíÜÅõ£ + ­óOþÊp.{24CMZ®?ÊÌ +:ÔKӐˆBXÃy@‚ nÙ ”Ïeá9Èp2MÞ_V,uÑèÁ4#™ðiñ!]3Bþ®žèñV +i›* ^ëÚ,@¼¦ó<ê‚ÕîÆ`ݍ +!ó­Få5$À‰9¢b€@ŌCã!b‰Õ0 +%µ%Z` ÊÍäs©X{flŨw§nxõÙÏ"?R®·§Œh–C| M&¸[DïëéÍãÞ7¡4sÅA#e´Zˆ +žH† ®„Y16öœQsTÿÀ@Ÿ„4Oô¶.K¸>f¿Ä˜¸~äñê (†\ª°ðC\d8” !‡=Ò÷<œë€pýM=#óh²£ÿ.©¤W#e¸æ³N@dYtJNÇ ;ö0g•sa«ÃtßnÙ\}IW X°ÿfÚÍweª5„¿cT1¾³ ƒ>¥;‡ rVo»¸oÈê™çg a~`<¥J̟’ý‚Ç<Æ| "•øt¢âg8@á¨'3g<•¶3Ömƒ±†£1¥X}ð W&€bԀ©YSŽTÕs­HÆnTØÄ8ʨ¸Ì~6^ïˆ[x`‡,a¼ ¨ kts¦>q„é`xCV$7¯!©",SG³‚IÁÄÐKÞÓZŒxNå­?Äó¤þîAÁˆYW )üΐվFJöSï1²ÎÍzM6‘ö”spÜ蝈±×ÓÞ¡%F„?œÐBbîwå”ÐüɄÆ`*kÀŸ¬gª·Möz †Ù"²' W( „3ÃØ ‚Ëü´¡Cã 8§ý:Š ÁüŒ”ÇA +b˜lò̍I6Ðk2î¼haÿÀ)ÆiiÆ'¬Ä¬ n^# 9Z¬?Fä9¨~41wCTÄq-½†=•4\%šÑH~” >£e°–<ŦnЀËQ£nX Ǎ·¼çΌ½1µf~øtà8ÂK‘Ó!€ÀÐ.àÛÁÍj ŽZK㢃Éà1ÕîÈ̐£p˜<’8h¨ýX.K ù ñ¼¡Ê‚å¦ÐÇ ³YdžŠz snŽ4TF0û“?ÇöD’@hY*Ñ°&:üÜtg·‡‡bv¤Ù…“YÚæzÎ +.5 '¨™`„°@bÔÃ;”Øމ‘ @:¹E†B æðç2ˆW½AÜHàúîU¤ñçhf@dâha!|ˆô£þLP@°@pz]ÐJT†Q,Ó áeÅçâsÎ0)k¼&Ù7£‰FÃ÷v„ç·Ç`. +81´3ٕJH`؆yª!Ñ£5f»¾· cA3‡ø×é]5³¾n_®x +º†Áê£rL,}“ß&]æ`fš Z¦rbb+ÄU:OÔhs0›s1›×7Œ+¢Š¾éšuin%*ØO³¾e§öÝl™½f…õ@°nCŒ¸ÄeQ„ad:d›ºµÈþh`Ò +§!ÙréÉRââu¬“zQyb¥X²ƒuŸšËÁŽ€N¿æAF2Á¼ézÕßÉÄ8à˜b+5‰À¸ƒ@µô´#£õXtèÅF=BëÔá÷î,,¼ ×ÛèDð#cèëœ4ß?š7]‚›N%Œ +VXsñ‘`Ž¿Î]ÎZmN6,M[ï êÕôçþBŠåÅo€ZXÔ°üÁ%ÔÐìí¡ + ³¡Q³…bþÿì½[¯.IržwO`þú” 4T•••Yy)mÓ°ìM’%Á0tOKƒÝ##üïý½‡ˆÌüÖnñ =€.x3Ó+vU}ǔŒxã ¦1ŽÅf4`¤ÁqR^–.ÝkM¶—ĝîÎ0´Œé¦?ô|r+ì$¥„x§ÃðÔm7[‰ÍÇÿxŽ‡@ƒ=Áž[Wìç=úîr³qH&‡ò"֋§áX$fi}‚ºŒ°+^À'êÝÀ +‚ûñ”5Cü8Nð˜ÜA<¬Ç­ái€Ï÷ì~ìåR–\©Cqåf*‡Çïõs¼_—RVèøXôO€Á›t AsôÔ{ à)\Áä!’QÎÆ}ETŒ>!­øñ¬8Z -íº_,üÍ"»ä×:\&«•–¼FüM8äpŽ31UvXdbk6ÀܸòA¼óâðçË`Lª +ñfJk€¼  ä˜Â‹Ì9áIygÖü‹§F¿Çó>÷«Õã²` Çø¸¤<÷㭆3+ép:8ë2‹ê1¡—ÖÀ”¦âÊ*ÿ30©¼¿ +zXýà 4¢ f-ŽF,Î`pCE¬Ÿn‹Ø[§ÆV1ÍI1Ôò᣶hŒ™„óûÊ>õøƒëÖåF©¢ӕ¬ö³ô-´“Mo–°Œ –9L„Á—x:ž¢Bw~Ç­RT¹;OÐ*Ã⁢{’"gs¹SQ¥|鱺 +B¨gΆ=¤zp%ÞcZe™1&Ìn= ‰%S-þXq܈tޏJàXÕKw©»^’ÛLAŠÜÎæÇÁÕµ0ŠÅeåñ÷¹VL„­¨‰A7' É]^Õ× 0QZËTËP'‚/ˆ †Lú ›*舟ögQq¤àèr޴̪”.¡DcÍÆãw×óK•2¨'‚vTÃM8äAÛqÏÅèáêƒÃC#Tê| +¨{ålýø:Ž­Rà”PÃVZøi3¶Š Q•ù†>õ/Ä#‰ ò¨”z ‡×ud5\&¡P£æ=r8Îåþ£j‡7¤"óìÂd~úâì2¡DˆùÛA™a¡Ñ»Ûôå›;fÿã/r¶ÿ1Gûï†þ|ü$êØTH·ñõBüãÒTEøc•IT\éÇ×P‚3àÇh}Ë#›} Ÿª•}Œuùs=I>ÆÒń>Æ 랍{ 2‘‡ÆãoœmPñ7 +»6ê1w’KÀ°ŽÜqÜ¥voÄcH+!^à1b¹ˆw|C`†ÏwÁCû}Ö+iǨ=¤¡ ¥Z·µÃŽW+1¾èÚ +Mt¢ŽëeÄîF:®bÒ1˜ütIt\‹ßIÇÌô 8Ë@–‚8IŽoÏ´èrPa…Ì9f¾ž“sŒ0F„sŒH*“rÌfNOcªÊóÆ8†€(“@ß…&à˜·7¼1cLº1Sž{o Þv¶1º'‘ãa´1d›ӈFca'æÄJ6Mk‚›ùßÉ5n*™Û©ÆX+\÷dw¸UíI¤1¦éã|s6¿Çä³\í<çÚºû³ØÆ=ø!â£8®{âŒa@ÉÈN3†G¬¬aÆh tu²Œ{UìiCý>ÄȖ³¿<“k$È™dê7Ž1*J»ú?0šôú{ ~/(Æøûì;Ãû°ð[cµ&ÃÙBÅ0~š2¢Á/ÆGšÛÀãÜñ…lôbÉpµ/f‰0>€sF'ƒkžTë #;>(#ጼ™fœð*ÞN#»Ú}ÔóNv1ÿ¦òòÙ``MR–`ãö°ìb´ŸBÆ{Eã²/!b)ՇýÚ(ÈŜÄQe³‘‹e}j†a8 !i ,;4æmèb¾7\L2Óe§v¶²s‹±’@©v`‹º jÉZ%@+³A‹Ê¿“X̵Ó˗ `ñx,óZyÅ0âÛ +\ñð,´bœ²ÂŠ¡À¬b|‡ŽË¤8¤}Ôã.¤âqéS P1ß!|Éâc2…‹¼aŠA‰ÅZ,(Å÷Ñ7(Å·ñ'¤ø¶Z1 ŀ;à‡ƒQ ¶´v¢øvT-Å(yÆ/¡¢‰Nd!2#ÀŸ˜êùëI<1¼ +øù+˜˜®óI8qS~2ÐĈ°#­±¡‰YbÜJ‰!BýuèÔ« >6.1òµ —¹®Zê2ˆlÏN%F ŠpÌ +\„¦ÇÌ$&þîâ]ÏhN ƒHÌÌ +ô•×*ñÆ#¾’=ŒªvÝ-eªݽƒ‡ÁPÅûeÎðÍ®ÁË_ømÐa@¦1Ks»Ò’‘üÍRՕ8Œä?ÈæW‹ªóÏ7ŒbAÌWA~­¼Hý +Ø0úv^*:¬aäÜá$j ãæNf—†b6Ð0¼8›ÁÆÃĉ1Ãøw<Œ2| ðŒa$ìà¸bø®òl„aù‘yœÂßHl_£JÝáÂðÐÈg5[ZB|˜\’,Œü'a…!­„”3¸ÂÕ})6¬0uGMª04ƈrxºØ—òܙ€XBÈHa.p¶& +ƒʏ{ +C5wՒ@a?ï;yÂø›³ÝŠ.CxŸ  …ƒ%Œ}®{' £ç%Þmƒ„‘ĆkáË× #ŒÜ]›/qS éÀí坣éÊnFAÙvPÏ §ØáƒoÂ5Þ¯·—°„›fâÄCPë=ø‡/áÁ® Mvð¡lêŽ6Ñ.ÉÁ¸Eurƒ5˜Rk †zóR/KÕäU.6d0À¿˜7’Œ„Hm<ÄiÚyÁÖ~.E@5YÁÅ:ÂmâEN5PÁÜè*“Œ@·~wwQÉ n"H&&8þÞ(Áa HðPlÀø_ðWé+-ˆàbÇ&6ñÚ!Áù÷ÊcàQá„ã&دÜÌc×d5‡&ÐÀ—Óúz§ò2•P>¸¨%ÑÀEn׳£ñ½Šem6ðwøYÑk >X@|^;尔¹~ØÕ ÌÀô}ïd` %!Æ7øõÞplL.0×ã×-3©Àæµ$£+·”ŽKPÒ¹¥ °ã`àã +,RÙ9™À‡}Fðæzv"0bԈYš¬hÌÆhÂ׆ƄƒedЀAa`¡TÔ! u]; ¸¸‡—QÀ¬ø&Ú@*ü Ïuã@×ݓŒd·¸L Þ +­`8n ž·ZznÑ!”Dpgc‡1À;DŸ‰æ]!¸d‘ÂC…×&ÀP*`p þ/þÀҕÿ{9ÂøßË5îAÿEþŸ +ª¥¨ndCÌþ@€¤Y£¦¿·’áŸ` +ð/F<ÔwÓ÷F$;¯à_:û×42`ãï ü›FƒoLu$÷÷Ý͝~0âÑŸ­Ø_5:égrOê‡Ì¥çú z‰Ñ¹Hðï í…FþÅvòø½Ô8ßîà_šO3Þ%$FÙ#Ù¯þ=Yy—7ð/DÔ_ï‰%Z“ûKËs>oÜ_°Ü„÷šû+l«©iJÐPéQÚ÷—(øëÉýŞyÁý%ʶŸ×÷—f¶ÿ +î/þãémbù­¶7ì¯h¿×5±¿¼ÀçûË:ýO“VP£{ՉýeŒ/I`ù€È£Û°¿ÈT‰5lì/îÕÁ~́ýÕ+5džýe†®´Iý%f‹ þ²}À`¢s¥þâž›mMýÅ)Dþõ—îc§þž%°‚Aý¥J«¸5¶2XÔmòFýå®,ª&ƒ¯Pa9ŸÐ%õ—´\ÐÐ_„Egê/ã‹í~ƒþ2Q§ïÊÔ_†„¢6õw¼þŸ q6ê/0םÌ_ð'ËÙ'òÝÉx¢ñV¦ÊøËÍÚ=y¿8Ð;ìw¸AG²~ôR‰q¿¸N9;îw Aû§ Š ûENBe%+ë±Èê0¦Üên&é—r¿~¬9'å÷±Ë”_fMúxcü¢~ýnçDü26§pc‰>R½¼!~yÕå8'㗏d6‘»ùÜ¿C5™ü"Æ|ƒ¿øàœ•ï ªhï‹#Ð 2ݗTD”W¸ïI5ÀÑî«À¼SjiصNÜé¾ԚÛ8ª©9OKº/ïôîË>‚JA÷¥1X/§hÀ +y£û*ÿS{Ò}•  ˜ou +ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥<ÒM¸/»Sä)UŒÂ|v¦ûò¾°`pÅûÒ +Ãx_fíì¼/ L]lx_Xƒ +ÜTëÞE— ¼/ Ì>¬x_*7ûÝïËî. ‚ï‹Ñ뫝ï+-'H¿r3–„šï{'K6À/¬\sàW’OmÖ5J£IËÆ÷…‘ÞFð}i@ˆ0ø¾4`A¿~1’‹]lÀ¯ú0èK0 ÚÆc Ú¿°²r8¿'٭ו€_0ön„_YŸ‘„_ˆÕ—&üÂ@úþFøe ,Xƒð«²Ô´‹ðËÞ°EÒÀIøU3µ»&á}ˆ8¥á÷$#STÞIø¥Ð{ô3¿g5tو_þÍ÷{EüÒZK~¥/Ê#6_ü¿~%?•î ’„m† +#Iø•öûxvÂ/ý¿»hè“XMèîãu¤»íŒ_˜ÏËD_2~añôeÆ/-‘ß3ûOñËcET‹, †™ÀÛ¿¸P9cøådM"¿ð€X¹!~©Íâ,mM°ÂQ[~q3:7l„_ˆô.6áïØÝ®{~ÏÛK¬ðË"!º‚Aøeï5%ŠMø¥ó®– á÷Œ4|~iéÖÇÈôÙí_–gñ=o„_q%Î; ¿x_¯^ƒ§í„_ZñáG—¿$üÂÀ‰k#ü2ÿ±"‚ÎaÜ|~ehu'üâ÷ÈÛ Â/¿’ãJÀ/&£·ïËLßÝ[ò}™&=τ÷b„z€ˆ_ wÎsÒÂ ƒÏqí|_ƒxmà è¾ÃÉ\á¾ìJ¨02CyHa4ò6ø£ÅFöm= +d:vÃyÍìEgaf6®/!¹Ï„Žì‹ç=ãïë›6c}OÏÁëÃËۍêÛoE©s#“¦ƒé¯Hß´™èû:ÿ5‹‰¾Ï¡þ£ Ï÷ñ<ßçÐÐ8_ü›ºÑ|±—ç¦ù>ÖºÌ÷9ô&o,ßîGòíÉd6/©®õJŽ/ÿð,Ä»‘vØ(¾0⽈/þÆK _Å ù]¾ýprÔßîÖ4AðeX¼œ;À™=œ{ð{ñ ¢„<ø½=?¬ø^`¹š@› + cT[Â{[‘0~e÷Ò&Ê1³Ù؇4H“{ASºÕÛ.¥˜àŽ]íNn/ò«Èˆ Û æ°Kµ—šGÔóڋŒ±ÚŠÙÛ½´Ü½ì}Ë +\{›×IìÅy€z¿ñzy2`š×Û¼j Z/lA­°^V»áå4«—5qP*Õ;²z³{©A½ÑQüȯۜ^Ð=ষèÝø](ì1òn^ˆÑ¸Ð‰^Aè%Q ɶÐ+Êá>/þl¬MŸ÷±²bÃóÂ8Dã%žê~ÄïƒÎ Ü0†Õ ΋º‰ƒW#6/V¯lÜáêéø{%ó¦Í`^ÐrA5)‰ç‚eÃò³v‚Ê‹ešÓZAJWú+•VµPLŒB”ûI*/W+œþW*/‘SlÔ~ÈêSy¹éþ+•“CÅAå…GZÄqdY%VÑxø“Ë.xÅÁäå9ÚJõÑð/StgÁ|Œ[w€Ý 5 )Šúµ3yåa”'™¼0p¸ &/ lv°2yé¦ñäÍä%ˆt0y?9*_҇ùc2y¬CQÄÆ䥕YD3yÂ+=¼ ̱teò2îÙL0yÉÍàáÅäUïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8íšáæ°fÝ¢‡f’Wñ;‹Ú~6‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Å½1€"/)¼6"/UöUÀWá;HE>{y…)c'òRùHíÂ9•ß 4‘’ §È‹¬Nɋ2+²®UÿË~S;Žʪ¦ï‘®7|ZŒãe”ªªtrÂxQiOIoŠiƒÆK;Z­5@4’¥'‰"s¾âZ͍—!Á›ðI×Oa‰`›q¼ fçÎãE´‡Õ“Æñ‘5ˆ ’h„µ#JãO/J¨êDñv$eú™(^ÀöŸkñÂv=#]?«Íê“ÞîïbÃðBe‡üƒ)¼ø}  •&êÁÛݶ'¼ Ôr'‘ÄF6ow°5ø» .æq&·9¶·áwy"¦ÄøÝæ aÐwI…ê;{—Mb zz·1ªÜÝæLã†ÝmæEÑ/” ôÔ]œú¥áºËþÕHڙ¹ËõóIänµÔk#îR0zwÑB¡§àí$z—7Þ.V£øÄ·‹5RmÉß`»PÁ ¼¬]¨³ +Ô.аuçì¢@ÑíÀìÞ¨/MÆ.´8Xqoˆ]» Â.4<ˆÛ(sòfáý]• ¼î­ž£Ë>¯v¶.Jé)S7¤9$d]TÕP²½‚uíÀW÷vsàÀê¢"K⍪ #¾¢ êޞtª‹3¹ çË2ïˆê©‹g7a> ˜ +—ÚçL®—kku±BÂ{<]TÕÁµátÇé„ÅÝ™¦ É2ùz+LF »ÁÒeMѨ‰Ò…Á¾•¤K±ö}'Hw8„]ü?”]& ¶º‚þšÂÑE­`WEõ‹õšÝa˜b@t‡ãÈCY ½&Ë>Ŝ-®èY¥ì ]Z5±´„hÓs$C—¡t¸·D—­Òk ˆ.æ}†ý¢Kâ|+Dw¬EAÆėS]- رQtáêÄË¡Œ—+&šžËˆasiÝdà2nغ |.Ud„bàÏ;r^Lx®Šƒžò‘ô\ZØÃw£çr–™žË Çtcznþ½ÑsNF>蹪gî#é¹Lª±´b¥ç2Ïց=$x‡D«AÏ¥»Œ'´ÑséhA›ô\$X‡ãÃÂʍžË³º®„ç²Ø!€ç²n£ìÏ¥•_»á¹4p´1<—# +'6x.ýCœ{Àsa(øJž ö=—ËÓK€fPa`=ø\rTŸËå*î]àsñ–³f!ð¹Ê|–±ãs ê@/®Àç* žÉÏE’€ÃÍÆÏ%-¥J°£±ØCÄm‚Ÿ«ä‚F³ÉÏ¥èÕ^ÁÏ¥á/Wí±oá{W|.|ºçÆçÈEãs±oӆυ>ƒÍíŸË< cÎ#@?Cᐠ  ¢3鹜 ̋ÐE†/ËЅµ’2J€.øKt ‚ ‹”CPA—8¬]ƒ  ݼ è҅ëFÐ%©*\ÍÙQ¤äçr/–ý¬üÜó¶oü\”sQü\õƒßè¹Ì¦ò‡©dä9W9ꟄƐïoô\Xõc¦çž„]#é¹4 ³Ñsa­xàAÏåf¼¦çòȧðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ'UÔåÚºHêÒSË͊@Н† ›Ö螥ÁM2@7_Ì ¡Ëìì˜]\#]¦×ŠJ¿¦pV,킡ËäÖ5ÁÐe† æ¡Ë×kZ2tY̍”ºüW¬D7ˆ.ñbp¥¢Ëd¡º¯Æ¡!|… D—¨Æ㔢¤ëSQ;ó€èòãrž{í$RéE¢‹?ҋх¡;°4K•ae¦ (º4¸- ^4:P]>ž¢T®)ºÌ3m](ïX1¸StñÀ% Š.‰]dIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±>ƪòEƒüu¼Ñ……1±£Kߔ)Zct ë·²Y ’CØjÅè¦11ºœ®†»ÛêI↱ùà†Ñ…Y¯—1º00|]n"ÙɊѥ™*0ºâ°uƒuE·@éc§èRH©@Pt¡\áø‘]Š[³OŒ.ÃììŒ.º±ðqùðÊWŒ.W>Ç4‹¢›†¡;­Æ¡MItÒå{øÉ7ÿ#¬X£EŽÇBÐUqþ™]8û\­?·i´Ùñ¹M±Œ¤ç6©ÉžûÈ/ØÙ¹/c)WÐG%ÑIÎ}¢]å +Î}ÈE^ö鬺 +j®µ¬;5÷q:ÄÔ\4SíÅý¤ŠS+3säwÍÌEx Ñ΀Ñ ¾6b.Œð˜‹Xàñ$.õ˜­7Z.ôèJK –‹¿•‘,£Îlcå’:ŒN{FåBq×'ÏÎMÊ7R.ó1ð¨ES‚šœÅô.z-pð#[8¹ÐZ¥Áöü’{56\_ ¹ð7ü @.{òWòqD˜{Çã^ÖK$òw„q³&„v8.¬˜±‚{¹yA²q¯Kª¬{ êd ÆE’QõxcgŒ‹[‡…5¦â2Ô6®„â"À5òÊÄEÜ£N".ªn4?KIÓ,Ûx¸0R0e.v¢Ú4\ÅRÆý-Ö +îíƄÂ½c"ZH¸ÐË0zo.$ˆ%>Î ƒ‹°+sm¦àBg0&5²X3o\äéKM.þ‰#ø·ØoáÆ¿…L§¸Í‹6ѯ³õ ßBUV„‡ð[\$ŠQ‚}‹›ÀïÈÑP+Oõ%œ‹]Dø„²d²€éôú$÷¶y°ao›[6õ6j«zÛ Sؘ·ìjqÕDÞf¬‰·—«º7â-”ˆE,LI!иé®Á»E܃% ãI»½ÝZ*`··%˜ëFÄ,u ^¼µ Ýâ—N“oÓ9¯.+Î-|.ø5¹EEX}ƒÜRm…·à à;2âwï×F¸…‘]S ¸!aûàÛ^N¼l|ÛÖÞ#d¼-þDa£Ûâ–ÀY ¸íÕ¬“0´å2æ`CÛ¢Šõp*+¹¬*°-j¬ð)n\[? `ߣŒBAµEÒ´õi[ì Ó#¸H[ü,ôF´-U‹¿ÚV¿@âÙÞ€Þp¶È°¸¤Ì4ö“"܀ÙRÇðÜ;ËöF#²£fÕæNx‘A²Eä чd;XvNmUÈ-9¶]½vŒí­ðzRlOÏ©†Ø>ÒKo [Õ œ‰°}ø6O‚íCRÆÀì Âïͯ}T²`zí#ÍлV²ŸD×v‹uL®-®ÚɵM¼‘×Z›ÜZŠ˜ß±µ gÔI­Õ̒ÌZd\ÏöƬEÌ{,ÈZ¼·lab-õ>×°ö’—¼ÚâÙ;pµ¬…¾ëN«…¤õdÕbíAþ"wè,8Ãx‚9 ¤-²œÅßE!êIœ¥ñ¼8;°(2^«GTíÀsÛp³cv•céa¾­l–u/ç½³fh*J=GYŸ +Iƒ4ûx5¸ƒfÑ´3;bÑ”YV¦¹—ÎÔ"“&ÌW3fqN¬œ Ä,jqnÃi'b1HNj…÷KU˜ÇXù²O$7—}œì ˜l|ò\’N…—}NÝÁDÆöj2܆–_…ÔÁ°"å3&W–jé>Þ°² 0ìTY¢G\ŽLœC?fÕn +™û1 w½;áO¢ìË JÖ (ÛcN l;¢ÒÔËiX‘²Ó(¦l3'‘¦Xvr¡½e)¶áf^L Ü& {tDª+Äv¢,”öª«6P–ò|Ç qk±†‰`3•‰4Óyù`<úpD£KªSô;Kö¶À!Q²È±¡€8H²”-12d‘ØÄê'@²\Xy+ÕVésª?P0uù°6¹ ±#‹e‹br+E¶bÉ~–yÇaP]¹²ÕòÄ !‹.‰:s'#óÙwwæË7w˜þ‰ û#Ȳ[s€uáÅü”f +ˆ!lÊõIMËPÒ°(ºj!˜³\Ñ|œ£'xw"gòÉëS·–(‡£aâ@?ì4®2ØÛñ´Kž:ÏÅ\9:É­²(©ƒ@ ;#ÁrË®›ž®³€ÁmL°æ…dÿVLÄÀŸlʀU›¥R΀àC’)EÅ#†>ƒÝŠS.¶W©ÈO‘HÀj/õ>vÀ²©Rý³À‹í‘°A[ë‹#h3¨ ­¯IŒe&._SÊŗú8AèZ\Eh5e¹à= ÿM9-‹lç~‚Ä`ÁIT+Ž…,\)ñ'ٟ–urê)vé'YHŇÎn]‡›‹qQUº÷ÌL]T°q<»ZBû+ÐM“ö©Šqñ…Žj}ŒGEg :…JüMuGÓǵu¸|àÎst÷.ÇÝU7³Ž.«ó{ o–3ÏÞ"»rF +…•ð$+ÀR=¹3™ ø|¹Pǃ÷o òò¸øn\l ùMŸh ¹h\ÇÑÔæY”<³Åõ`çn7ÃÇÃ:>ŵ I"Rú0z‘–Þµ!ãÍ0 ^XX2›WšŸ`¦OQ‚@ …¥ÉøiÉòy”ð ø³$dÒrêÂ{\»™†¬Hª‡ØóÀ½’Ø·“čq‹\‹÷Bò®¾Þ`šYè9Þ¾@­aÎ^€kqmŽs°í:µó]/n¨Žø Œ´0„$aïiá'b”ô3N=#ÄâÑ'C- 0TøR/5dû ˆì°§6|Ìèããe§ ¬ˆ2ØD3BP'N§ 3í ™†þ&Cžy‹Ž!Ê×Ih²÷S…qì‡*q†“|äâ±°€‹_tvÁ¹Bò|²¼Yœg(¿à«<ý“X0¦Ç8ݐÑ8>k¼&X¶×ÌÂÌN‡½hµD çBhÞ ¶à‰ñ`½H­•»²ª’ffo ±¥š£;ÝË£ÞE”ïZ„bc+ ¶¥Ãò‰]€f37"h9•EõXVDÀû¦"Ë~T©aôW’ønë(3“Y³ãO&Òh ž£Ü –+gnÔzè.3^ì&‚4Äµ§—¡ ‹óLŽØ¼ŸtµáÂDOB¶èÁ1G©ðޒà©Ñu$Õ`ȕ‰Pä¦G¯E 4Â|Šðžñ»_®Çdfq«nTœkྻËÕìg ásºCÇ0H< ÒUlÈRªnµDz(êÁÁ,ì#Ÿ@L€¢(ð–‰ páÁ ²1W­uXË*ùí+`“¹“ѳ¸R#è%rÜL| ¾2®´¥3I¹éãšñÒ뻬ʧ¡…’R±h/»9¬3êjÅ2T$ìÒÜ¢ëo‹Œ'Ì£´Àa!ˆ +ƒ¼]ôWOFè˜ €…•r ƒÐ_ƒ…þñ%Þ^ìÕ¯\ˆŸê×%üÎk©NÀ:ûƒ©Ž-ö»n7pÉ ´•Ì¨lŠ)|COÿò¶Hei‡[¨‰»Äw3cQåuIrí>ü¢^&^ãô(Mß,'îšÓ<ٚ]Gd`-Ì j‚…er܆ªjTõžJ°f$;š%PL„«ç+p›¿ºXQûҗfQ?(Î> ]R5_£Ñ8 +sØð +d“'ån-šÕ  <k¬:bgßː5–hàVqrO-·±æ=‡öäj ÁFØÄþѳá¤ìK},ëa +T©9ØWW±ä²;å;.}Ϗ’Û´pÞ7€‡´YÍÌ WË]uDÄú U²УF°êË=× = µºÞÚ£÷ºqÍI¯/±äû‡/[UïáÐi‡ã%Û¸zÅÚ +ï +ä,+À!í¾5R©çiw¨ôdÒ¯h¾"•ÊÈüèÇKÞ’±Ì“M%©óÀìN4¦ì.ºë<ŽÄËÂñýP‡»R%†úünêރëóÎj‚ÿÉ9¬kñ}k…CºÌË̺uàú¼«†P¦Å sk`[œ«JÊÎ ÑN‘“e÷ñȖ¶«›Ò¶óQ[QísP9J€EBãäWŽôWÁ(x ‘eȐéÌ éÁ±@Þä® ¢‹˜s ˧­x¥ÔIä‰pÕZÁ»†ÇHÍá’Y\1h”-RîÇ2wÃIt{©E»u`/^ÔÓ=0ˆ¦ô%æŒ (æÛôCi…ácêFtaw1J6˜6DÛYˆà±D…²ºË»6™Ô.H%(92åù<‹´\*+÷živ)!㼌‚ 5SЂʍ´Å/~øysC¯Ðèg‘29-ÄxÏ°Þ&t“]ȟÀ×ϕs¾½@ÃÀëð3íRÒ¨i³½i$ò¥°$ x×îIp o]s„×ŽÞ Ê ßU¾°ÔÉêQU7Ü=K½ºñ ˜(€…k<Ñ9 +‚ÂFGÊýGEn'7ÌrEHŒßmuÙݗxT¤iœ>µÇ­m..=X(Âtâ±Á7ZN±D¾NÄÓâ]©bç®5cqñ¼v•™ÒBžjG©éî W‘î2?µSŇ¢‡1ðýx +¿RíÒÝôtœ\¶P@-ÐX ÷ò´& Ô/ƒ·^¦"NÀ£`Q)$†CO ‡ª`WŇPïȘBþkaêåu³S¾‹d©b×hõÇìy ¸€ì}ùM¢ïȸáåx ,xzï…ýW?è*Ñ;µü"ãBt&r@J3aTÉRÊæ/玻Æq¿‹3“sŒÞ8˜"ÀC' ‡`1å€+ÌÜS Vž;rú5g牧¸t„úŵ ß÷³ë‘3W„’h•G`â凸—Úýä ÎBxÈ¥sÜ·XíÍ(.0:¥OC®ì¢OŸ7S7g•AÑý¶ÂÄÑÒÿ kurŒÝJ.å©ô:~ZÌÕCi†7È ñbº²_ˆæy1YÌu+˜4Äñ·ˆM8kù_ Û+—u+ßC¬ˆA¬åõÒ0!S®gFNaUhž î,̉ÒB&J½.íÈç˜{Ry¿íI8áôßh&}Y7;Ò*”S"2÷¶/Tq"…åü¢ëŸ ïhÁ:åâU™ÝT®Öt•Xò,jÈ>a–TˆWÉe·–§ÈÂw–Ù0FÿpD¹é©:hp‚‘š—z‡¨…?Ê'×­ÉÒùÐùâ_¬Ã%3å=]õ‡GÏ&1µ@ˆJâ?È*(¹®a®]Içu>ÍR¦€øUç…éåSW0Ì|ÏÄvÊyð!PPˆ"祕ÃòԐÀÌu ͈¤Ã¢v/h» |ë9”ŒsîÉ&̌8òXWÀB/–? +y¡,¡!+lÎÅo=•PgÔ¾¿rD°wáspÝπ"c](ŠFDD1@Ä_ „gÐë"Ɇ?ŒŠ†£ ‘l àL•É·ð¸´€YK+uîI ¬ r»Âù6ÿ°¼…–ìûP÷¼/äˆu¤o~.j.sz¶â“î¡MD|»E.ƒpXö´fø +Vý  Ú]´ Â5Ž-Ÿj/#ë@Ð_¹0 0<¥CÀÔؽç‘23÷d]I¡«Îx¬4Xœî²æ–6{†ò‚‡‡L"$£ßÎiÀΛõ(%h])nÀ­=Y†ËÇY|§è1±Sïq)þË8É DòE9 W a¥œù6‡Ób°Üóㆹ3;𨢘ÇRXýáôÀT\}´gÉwˆÍ>ð~·G êüœå¸Ãw„x¨Ó*]f1dŽy.¾ø$2tÜB2àŸÔæ Ț‘ã žŒî%\Ø"üûCKDZu'ä3è]4?—¶ÚÇzº6d\»°‘âSl)ËWFxïU9‡3:UÍ¢™,Å;-ŒÐq«lÜOԎ:Jèøm ‰FaÀ3<ö³¸¸0‚ÊIÑc­IV‹¿hq«ËBùñzÀmf?pÍèi=®Û(”5mÈþ3܆]ÐtÆü!”ç +kD‹v†zT?šxNõ8ÂWN(¸Ÿéðz4j8 %AëìâÞ=§Á£ÄoÎÜÑe®åœ}õs—ö + $,ªiƒ%ÅÄ0ëã|$â)¤_:Vþ&1HîZNÞ¥s¡EQ%^ÕêڞB¤î7ÂN¬1äÕS`Ö¿Ñ[õ6؟#!(0² „Y@«éKº'K_Ìųäoƨ=–߬rÁ‘c˜§«÷î03®’:s¦pF°¯ ¢Wøß®ö ’{ìeÝÁ5Âú&£B0?l¶3Tz !BL 1§‡M”îJ)Ì=Yтž×sߑHRúó†F-¶wµVf·kr.9’qbÙ'R†‘ù„ûX4xjC¸….F¤OJ ÚÕi†~³¹ùÍêø[ÄöåDLæžG±Ì€Õ&œ3”umj;"{ؖ%vuªK3jò°%¹ ‚ óEuyŽ= ·ŠS Ÿ¹Þ›‰CêAáˆHÆ9"Ð+õö7hè»eBO¥¥‡ý™œä_0KJˆ¢4j ›©~°N¹Rú0 ƒß\s¡4ÜUç†Ì¥± +¼z¢Þõ¶Ò{ƹûu _Q¶Ç¤0Øç2ßsn70xIƒÂ¢þ4€t&/­†éb⣠À’|¢Eœ(}|s/'æv®{Á³Sá`ZšOüÂ4Wχ·Ëù ûŒ©Àìý,‰jåZ‹¬ÃºyðŸœ1ßý{¬a¦Ç™ºnÞNR,p•ˆê~,D•%£ôȹ >ÁLLÁŒÉ Åê`¹Ö]ÝØàR$‚¦)IƒÖúT›Uz°¬ ÖæEõr4¼% !9ûh᣸øö¥:!³7ôâj·qb¬hg¯˜ñôÊRsŽ°°ö½Iý¹sÏmná ËåŒ^ÞõXçrÝÔ}ÓK×Û ´ýsP +e–ëV‡5ÕA*ž÷—ðUÊ[ÌÈN‹‡”ê>:¹áÔ éfÝ*ê_ˆçºç(& ä~.·RºÌÙ‘Õ‰™?÷¼Œß«aØ9%·—1J”#púá69Ž¡cE½»ŸK·{žÑ¿i5w|ÈH€ÍÃ*Uö;3›t …,ãê=h¸“T÷\z·h`5BõűÃßmB½óGw§ªGtŒT ‚ Xý}òž¤ŸöÇä23Ê©Èv“{ýSš©`hÍ"8?fUÑå0'd„%—ºÄNQ,=ž”ë£@¼ŽÅË°`tŝ(æ Í@á!f¬Š¡-ѐœb%ŠVyöîp¤Ù•–$Ù]Áz äp­äÝ°øáTÿ×<Õ}@7–‚3rW/[è5³v™ÈBˆMî(4àåxq•R–`I& “Î=¹6Õ67mÖrR8Z n•²@ˆœBX…Ù©žþT¡%¾•;”H¾;”Š‡²®\4éhU ïàŒ2X ‹¦Òî %'“’Þ̜Jkõuâ'øŽÖNO$a™yÊ.p ó•Ôƒ@ìõY €JPj^ªKõt¡ÐèŠÔaýD9ÚmbÿƒN0{wz*0³H¼Gÿ>ä8)gê®Ø‚E]/¡-sOéAz´ĺBÝ]‹ó—²Æ +sj̱RQ‘üåiºEzVDúã +{ ¡ŠY;¾ÔGåÞ\œqýÓ\kÌ:M>E5+xjËÒ fÔYÂ,%>,é¥pB”#¢´¡ä+،»¤ù¾¥ª£ð~ÛUý•yø©ÕmÀ³ +pèǬç)Vu׉žÑŸäK¬€ô«f²¨ÚbjUºj÷Za(‚2ù¤‹ÁÜ»ðP¸£c…VTÀ_RSùXÏ*(h.u£rOKš&©óm*váÑÓ]áJCñè»MŸ¢·¢3XÕ²´Q©ît—G„…ÚÅP/õˆ©Ìö²ûã%e~zŸ0RO:ܛ‰ÉžDÀÇ`q–ªªú'weY0Ì\g2SÀßĆLzpzў\çx­ŠîFd™¡9›yþÖ³s/¤h-•r =zyÙµ¯dLH’n~Û3¥pTݼ;Ó‡â&SôE.Ýý3ˆìŽ>ÆþDãd|ØC»®—Ä#Ø$Õ¥°JÿÜMf˜òö« ^Õde4edg0BÔl{ë›T`¨8.ÏېẨ‹&fº÷ÌÚ?Š1QOSؚø´´k–sÀה,ºù7àVIÚouLz÷[g\óc§é½°×7°"ýæGEM#<½®e6-­º +EÝÃÇ¢ýb|²ÚoS;qXZ·o°P×Íj±{™>ÃgϜõPF‰7“!VælÃbǦ©…ùÜÎÁzÖ¼im‰Æ¦Þw_bGRÎTÅGKM‡‹IÌ$ ¬Ðq³Ï>xº¤ú<¹~[ŠœFjíßw=œV=-º¢åV(Þ¥E§+ŸNõ²Î©«»³%øgÌp\72­VL†Ò{Š«‚¤W=§%WLÕ?Ò®’)ìó‘r‰Î¢1*8·C¤åöC&°€»>휻’GF32¬&gMXìúÑËÕbœÛ}¡—˜†ôu¡A=|"#€1Žã4F—”õP¼wÊJi¶2O…ª3Lê¸ Ci˞µ¹âãÒ[?Ü%. 7݄!çO.Ñ9×T|§˜u çë$0¶(Új̗\³+r8\Üi +Á§@nkÙÁñFyFî*Šš`)o#ñüÉÔD9ˆÇ€àLH\î(D3ÇVÔ 0¬×éT‹ßº9x¹ TmæO|0p’G\’=å/·$€¥Ïwþr›VÜ$­¨Š—RW­¬ÖF—¥ÈG^¡T“sÁ©1ÓaÈ¡ú”Ân!óo§®z¸±²H,T~¹"ÊèÃ%:íÙOoªU^TYÈÐ(ƞì(Vâ4~›Ëq²'D^(ªE$‰oÈ9.a£y,ìl‹É–ÑÞÜUÔ|8ÓÂBç-(©O®[Âr<ù«…ÁHFàÝÊbô-„{…ü¯ê»{SªKw—IÕ.y»º‡‘G˜ÓeÑ–í\8ÁíèA†~´ªê*{\”%ìý“œk¯A)À£çv¼#Uéœàᄦ÷¼]Œá)RH%1£V‚Ä\üý˜ÖïýÂ%°X7Ñ»ɱRÏAœK•U å†@kó}Ì Y,(ÎÎesš‡Iㅍ,•ªg÷›Ë4Þug6¼Z>Å}vhý¸´9Aß°T¯2çÊ(;ùÎØ÷çT½è¡Ý$¤ÆßY~Å/#J½.Íz>#êƒ`á`U×Ñe'XÓ-Œñ<MŠdÀ’7àL×x $avõ”îÓE¸§?3Òÿ‡yƒ°,҈|¹“8‹,äŽ7ƒ ­góJIE#IùÑÒ, ÅÐ(qJ¯á÷>/T9*ÉqC"oºßâ/E¥QεU|hH6Pǽ*Ս(åQ¯¨ +C>‹G¿á¦\ÝcÂÃ%:ð%AÄ«=òÅêôÅ.· ƒù֋ûøQQµpIê*Î9–5‘QJø{—>DÀß (C‰Ü&ûÒÓfFŸ“ ]Aw‹Ãų¾BM¥³»Â/á‘Ë|ZíCIÓeñê!Úf±B¡ÔÏ°8åE uŕaܕҲRÄÍ|dbÌǓàZâ+D`mPxº–RR˜ª@»¹Nø÷Vð|´j)–¬@΋…tNÞ¼nYJá—ÛÆe"bϤsSévYbKË c1S½Sxo.¦-mjÆt§¹¹èR Sê ½–ŸVß~ñÁB.Qœƒ]¥£ìJt«Gä +0ÙëCf6¡:§Nۜ¹f-ÕÁ®8I7ÚÉ8×5ÃJNOZ×à;܄o<jçRÍ(5Ìž~¡ØÀéêÆnL5Ï|1ø?סz#¥šQÌ¥ ¬_46Œ¿»n÷ôٔ ò7U²(â‰à›Q(út1©èõ"®©|‰0!ºF/*¼há ×N䮢Äc1%Êè—ÇÐT¨VÏÔ¡´;u Mqâ•w”‹Ró2̛×å@lõׁϫ›ôð0Nˆ<˜² +‡¿Ô Ìà$ÊZÏGIÔJ@ÂB>›2JÓ"bµÕÇÀL·®›%‡è l1Õ•}`Àɱɪ.4LN©Ž{iÒâ¢à;ʚ<Ô‰‡ªº.|QC‰”ªÃ˔;0ˆ^˲¸W–ÉYcÆ%Æpê‹)béFØÌ£(v2c©û•µLÂC"к©1´,oÒéè7`ÍÅz×ØGωjÐÄå܅®´º÷ *‰Ð߄(0NWÎk6@1sݨEìúcüD‹n+Õ«Mn2˜|tZsÏ`b9ð ê4LB>+—i™½^º»FwwVKmR©ÎÝr~VÕhO?ÓèÜË +ÏKà(}¨-ðйò-m(œK³ÊµYÔf×fy«µ˜¯w6­¹»FR˜UÂÖziÎgÒ ö]ïٍŒ*°D 'G‘;ÈW5˜.¨ÚÂÂÏ%kY]±Å ›Ó$ÕµÚüâ[_SȨ2Ç3cW(@pºTfñC§n°+o‘»Vo§’þ+úÚ ƒ•~’ÅRäiµ9^ÆH5r·D©z Ò!²Æ1°Ó¢]ÓR%h·îét¹ o¹gdª#k¹+{[d骴S·,.Õ¾Ô2ÞåG»ñ!ÐzãÕeûp=äaÇ舷žZcûT—ì¾ÅNd‡„zE zc± sâ_b+& `®n®â¯ãt~ñ4~‰SÞ1/´EC¯SôWŒ8Ô?1IFíêºSûT§¥k(ºê9×ÜÒÜqV\¼éËômb•ÛPñ:9¹”É°á0Ò‹¯9­ažfGê+Òuœ¹] Íˆ¯,ª;=ïµêX-ü¸ž‰&D§; ‰éw„fÍ둼N9xh-ÂtÓ~ +꒼P5ì>Qo!*É-ÀŸâlX«q‡ÖJћÕaLëÏ9˜UT—+JÞBnFžŠ=èË2zÜíÂNgÑãÇíÎU‹ÂèqUU¿šØÃr¨X¿MZªKXx¨P]éø̺OK‰?Âr…2S—`t¬2Ì· 2:žJà‘4‰ïu¿ÄÓÉ1¥ÕB €¾AoŸMÑ.¥Ú4oÂ2¡»Ði‚9(1—òÈÕM‘`Q*´.+8ü†¤‹á¤°¥ì Ç©jBڋL:tÎLé“ÆÍÜÇÇ#dáhÜI!È#r£gzBˆK+›ïÍ%Ör‘7ƒ`ñ;.K2×ÊA|QZ4üÎw€…EôX¦O‚–¥§õíÂØ#oË06¤…ßÞjC¼6Æå’ÒEƒØ´O´˜|6ŒÝuَÝÄñN@ò¡Ì@Xt[ölQ«½ÂûJ ³˜ëv ,ö3å&æ†L!ÜJèÜuýûXd‚iæsêƒZ½óä.û€ÏeEÑ(kÞý‰n^0£â‚êFQü…rÆîOÄËxzó†âÝ ·iá¯ös±x×n  ÌX\£"³F|º˜ª8<“zm‡‹Sy&Պ˜êS'«7ÞhŽbÄÚç$ÏÐ2ëë܁w¨Qþ¾ #•Ô†ùeoJEÀPĔw”ú@X†Ä¸R;=֜92žÑx"ïÐÍ8<ƒÎ5ü©6›Hr|cÐ¥#Ê8IáfÖÉwä´Jg83é_=íL»ܵ:yqKîêp…xî)íR¬ñ9 Gç†ÕE“'‹mØ»-iÞÂö覫jà* ÂR$­ˆ';BšxfŠÇnV4w¯Þ†W‘¬¼ÙÚãT;H„Dz:@g‡D$;ö é!ˆávO£PÕ]¢WîIWfŠ½i!M·²À6Žõäí=GäÂëaZÑ(d°˜›¾b )iñ•ž ±lÛá«Åíe¹%}*4àh)ÝìÚܳV®«j†¦ÚÇYÓƲ‡Zu{;÷tóMZ,CeK$—‚G ³Y{~YÁ^5´Ð#ë¾¼M®Ê@PòÝe†’qDªË¬âéJ.%8a<Ý;±›1Ʋ=¶¬†ÿ.QÜv?S®DóáÄ[¡OpÕË¥>e1|ŽE ÆÅÀ„Ä`e'Äm^A #¼c¥.9p2¸ü˜ò'ÄÙ-æ6q“BÒÁ%ùkNٜ€˜û~¬H"Až©zÎö0øÏê’ÓðYÂN-DÓ«;Tº/rQãq©Ù¢¸š>ÿÍÞÍ\ +¥w˜oßê~$Gá‘ã\žÀ}h´åOHÞç>ÔGäØÇå¡/AóÀí¾l¬?¥ªïÍûò͝¼BšÿÐæQ8±Í}c½AÍ8/‰/gßEP6œù5œû š9ðý:ºaæpÉÏÜXæ¨L}.9r@™G«±$™c¹G‘ò2G!–°£æ˜÷ÊNŒ9 |6Œ9÷;U‰Ã€ßYþ¨+ވ¿Øì ˜#ÜÄÀkÌÑZø¹4L~ytJ|yu$ñåÕª¹^>­†—WwTMv9ðdêlèr ¡à%º¼^ÑÌÊñ›jÎ.gÆÓðh%#¨JÛäò;¦ä•\ ¯àÚ¦SÁP•ücœ—åU§$ܑ l9êƙÏj9µåyƒ–³ßýLf9:ë•+ˆåü«í¼rÚƘ¸r£<÷¤•ß–î°ò»œÆ¬r„µÔYѬr,»ÉÒ˼t='©¼™òŸ ò¦’ÌSŽ>F—yò˜{»}£d”c?„ ŸnçúÛX +¶™.Dy÷g²Ê{PqPŽºË><…"÷BôóeÒ³QD§\´éäA¹N8y¯fÇllr´:L½g„åµbqZ’Éc±°ƒÉ±ÌŸg.ùpÉÀ’Q´v(9Å>—yãø|\&C#Ù:܃z'’?ÍNɁÑhömÉ#ïVIî8òñ¨F/i䬴ã”4rv!Vk£‘«IH•c%Šý!Û ‘ÃBÈÌN#?ÃñN9,ìû0r$…}6V^Šü #Ç2œ!Œ€‘cÅÄú¢EŽúÆËHg‘iQÎÇíEÎ~&*_Qä2³¨ÞÀpX1ëæúQöº²Èaî ‰œ^(νUçˆ(uRԂC>2g#©3ŠP(?Ú(ä˜Iùð2 äã }Ý + ‡5*<¢[“&°Àãtx >ŽÆà\}||DÑIè¬G7C@ yü¹cbð8ª—¹œß¸ã`:s±Øñ{„_fìxV—oÔñÛzRSÇA.áÏtäõåX™ãw„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆœ.E ¶9y¬qú™ÂÙXãÈCñõ Ô8äjG»fÂзY4Ž´+}4^„JÎ8ÊAokL'f‘z†”þ5ÊüÑüp|€¡ä>CL<ë]Œg*ºé3£l™E@Œ,€q, õª˜/Žl¦J¢Œ‡kG@ùF/mÖI©aŠ§ºd‹ògÄÖªtx”Èodq=JÓò_–aCpÅápÝ°â„Èœ +’¶Â jqù[ÜF +rcŠcÅD o Åñ{\0(œÍû (Žì _Ÿ°²«rÉüaÈ[µRB€ŒMøp:g€‡è?øß\þLø7þ¤úb›í‹UíÉþæf&Ç(Á€f¢v7ò·Ã þnª©ŸÜï4lØï´õ{8Ô,oÆ"Ï> :Íð°r3ûÓIüž†øÆà}—¬| Üw¼–í{PP?öµõpÁú>õ4Ô{Êgq ‰ÅÄúË¡–Éú>Xƒ|=o¬ïƒHLŠS ûþY?³§MûÉA“ðFû†›ÒÜVC’µ½=ƒ\ñ õ;S$Aúôq%“Â7ÄÀÂõñÆùF¹ÑPï“ w²´0êéÅkÙ0ßð ”B Ì÷A8ˆ-.¶©îl”ï‹ÈQÉø4Ìà~ÖZª BJúñ]LkHÂ÷UTš‘€o fR?­|oˆZn ¼÷Uœº7pê{®pí]Ü*:ÑÞ0D›Õ™ÄÑP³`oˆZh¨/¾!Û°Þð%¥ÿ4†E󏮗5Dî¶çc‡z§5Ê ×`}u0½yŸìµÍ¢òa®>‰Þ—k°è-¸Ä؀ÞWÄƒç •‹Çç °„fÖxÖÿœæ} ÁòNQފò†ŠŽX¼QÂj @tƒÉÄËÝHÞ\Ÿ\‹µk!@±iØHÞÓj’÷=§÷'G|ºê˜\³µr¼Õo©ŸäM…›ÌɛòFY{—7’7Þ·al·wl&L äÍ¿Ó¢†ïŒf‚¼!å,Á1Tì˜ú©¢¢Œ ò&C,ƒ¼) ‰Å oґX¸²¼i&(@Þ|R½MŽ7E6Ìoo +k¢ÜƒihHjp9Éñæ&üd7Ž7Ìl~oŠn:’ã ɐ‘Ǜš}M]æxŸä,÷19ÞxCU1´q¼©Õv G6`f#1ÞMa¾ô‰Ì‚åÀxC.uÂo +ŸIùÙ0Þ0+˜oJåÈ5Æ[Ú9V«­oîɪšÀxŸ ¼ Œ7, Þío\X÷Ey@h—1öÀxS@Å:ñ•âÍþËñY)\€°˜àòÆx#Ìq×sÇx#,wÝâ=°Â:ûD£·"OtEx͒à=¬¦O€7ŽóNïO<]ûÌc9øݸNH;¿PÔ'aœ\2½›äãK•L ïFԕ ÿ€wC‘óx#LÓϨè•ÜïŠh“ üØ×Jj7öâ{»A»¤â ˜ÝŒ8²–9˜Ýì OÜÑÆìæE—C»*†‡÷¸À˜Sª[eÛf\®…ógÎvìNµ(9 çځݰ²Š*xÝ8ŽâÎÂuã×TJ´ÐºOŠ&•¨¹“Pðg×­9ÆIš‰ëe/ÚÒ²³‰& ¸ð7\7̪x \7-¤¯×MC±Pmâºif9Vàºù5áܘ‚™L×ǎëF`[õªëfí† ±nF•·•Y“ÖÍzVú®úõÀuó&©ÔtåuŸH^7;´3Ö¼no¨Naåu³„&QßrºK‚×M ©‰¯›‚ZŠ&‚×ÍþP\°s—*>7`·$¶”šØÍ UeüDzç‘vb7]®h‚Ø--®7¬—­ÕÜí ì†Un‰Ý44‹Ïò7 މ݌ðI>hb·ú±<Òðˆ|„¸Õã–“ØÍU•Ú‘èåË=X¶ ‡ê Ù-ó«—6t1¯Ý0ˆ~¿!»Ù܆ø€@vkÝ`ˆ·ÖÒWô;ِÝêþHX‹‘ÝŒ‡éÙÍeN¶'²›ÚsaiÌì¦>]߈™Ý´ècX™Ý4Wg~ì‚$²›?ÊÊÈ Ù-Éÿ©RZe}Ù--ÿᬉì¦ûÈ0A@»qßnQ? íVXı‹À Á‘ˈns «§¿€v+Tr›t’Ðî3ûјٝ–dv38ÃÄçÆìƥʙ f7}E: ¹àÅäËލٍDåÉEû#¬œTKd7Qw|‘6d·"Ë£Md7Þ8"~Ù}ÞwÐqd7‹Æ¤† !9²›®¿:ˆ¬Èî3U ì¦…©á@v^5,+ +ŒÌüÎ7d72‘)¸Rž¤•G…3æ"{¦oÈnšÙàÌÈnüUk‰ì†…ߎ솙pžDvӢ중ݲ0é¶"»ñ£¤t&²)RŠ·‚؍”¢z®ÀnfDIº`÷p.-YÜY±1»ûùa[ÑÒý1±»Õ(RZÝ°Ž|qö´“Àu·:…ìsIМïIXw‹±)6k]í¨îæNéIê¯îpt±1´aç<´ºIº~Æ´>=hfæt§aãtO«9ÝO‰–aÆoƒ¥†½+¦»ßÃçfæÌ'¤; £{Z…èîє0Ýq0øººI+¿@7¢Üªˆ3ŸM#+žûqÞ<÷2£ s?‡ßþ ÎÝ£Z°¹ÁÀQ»H£¹|á0µ‘¹Éb® +áñ.Òpêr8­ôÓøÊË #)—A冡ºL®+bÊÁížLî~LåÓ¤ÝÝ®É u†‘È;ÖGaV²ÈÈÝãC^xÜ@Ö5ÓnÝjÑC9hÜ`´²äaƒqÓjˆ9ÕØOV£¸_EÖ6w‹õAÜýªw›yI"ß0ÜÔ¦²ÍŸ)ÜÈÃ+`w÷bwgp³IøÁÝ¢:Ü8!–mnžÆÍàoãVs@ü6 ôîWúv¾Í²ÊÚ'{{=ÎDogç o÷Ècg;ˆ ¼Ý­WKîvw«ˆ¤i£¨‚£üFÝ~š«r³ÁÕb"·!G¤Öc%n‹.:&pαÜ~Bì²ñ¶aåp¼mÔu0ƒ¸mPÅU·Ò¶QEÃ@À¶±ôfúͬíü{CmO«IÛ ã4·ZdÛѦ³=?˜m,MÝÑ;ºSÁ_Æff­„"®G¹ÐáRz5SWÌ6¬µf +[³Ímxˆ³¹VañÀl³¥’²å‘Ú¾¯í×Eªò% Û<1Þå€l‚ð{VÏÀéäµd›ö%È6èãݲÍÇÊÚlC¶ù~p È6-Š‘®m6 «P€ýx\`bÈögïéKzVLÈ6# –mmš•}5d[‘ÉÒ'R›G• ¯m†Ä¨n +È6³Ðmà0ùÂlŒmÜ×q›±=—ÉÁØÖ·î†K ¸D?é`lÓÂ+¸3BÚ¹ÝÛgÐm’± ‹Ä ÁØf‰í£M&bW*‘] ¶ñ +‹ˆmx….õ^ÛÓNeÞא•ˆ‘qF•Ó†Ø^ÌFl³É33Ø†E*· ±MbãØ>É??U:«nô sàÙÛx…­1b›C5&6bÏY » ±r=Òӂ±º5qî]’Îîy;_9¥¢Œ×†Î!%èÚx]äɯtm‘8œ^›A$uB÷B ׬+][V*’Œ×æ±î€i«<¸xxÙðڌ‹²CIðµñÜsL¾öx‚ƒ¾¶QOåºLæ<Áȼ6ë‹Na´']m~êÂֆ”‘”`k£kÇ£´ÆŒ>ö( ²6Ë«V´Làe[ö•«õ‘3ºP¸âå,ÕbÒAØ ÚÝ-ƒ©Ý]¼–HmÙ ZˆÚhÄq;€ÚÔ¦ÀõlvîÄV Ðör,Ñ_V`öí”äeßîÁ¼ìFÜæËΆKÁÊnŽ•&*úNâ)ÁŸ PöíՃ“3µºZ1Ùw*“}ǜ”lœÑe<æÌÍcªap$٘žº¡Ùô‰nâíˆl8ý +'8d„Óã€l貨¨^ùب·VÆqÔqGûEÓ±Gs:{¥cÃÈ0SÀ±Gô46v03w4ö° $ÉØÃyˆcÃ?7ÁØL´VÝ1t©äbCÁª‰Å~z´Ã0{æ4¨Ø#ð+©½D-“§ûT„X›‹'º›f>Š}’M|Ž„b3'AŸ{£bì¼RP±‰à:ý:H³Áæ6‹fiå<¢±Ø°(¿XìóŒ*ü ‹­uÓ¨‹Í8]¢Àb‹a´ûÒWþ¢šÇ‹ÍijšÇE'°O®æ ~c.6\68Ü°ØCÅà Åk@hÍÄքíHìá<‰Ø0h ö0zqça³zøj‡=‚i”kF/™Ýh؄b\‚ÃÉ®®Ã^2y+›ë +u1›«ºÞ&›QÕæºÎÉ´fl•úîÀaóì®kÒ°éŸ_ãúʞÊY ›ñC{Ô¶—ݬ8l²¨ôÌ8l^z'¢Þ8ì´l8lìiȃqØøPN6\°ª’‡ ó¥6ª=D” &›^;ՆæSGveà°ºPåŸhØ܂nÃaóä®kÒ°ÏՒIÃf G商M«Ó°iin€ÁbÅãTXq§aÓ%-®K¸´qåRÒ°aQeƆÃæbú2÷DãK‹4Ë: *”m½V + 6—¢ÊèL¶Ä ãš8lž=OÃFlL¥fÿdõêéŽb8ã°i¸bÅaÃlD‰pØÜNwÃ8l\#֊ÃæڈܕÀaãÉKiö4l@ìÅl"6~BA›]3 :÷[s…K˜–ト½XV"ö4›«B‰ +LÄÎwwgb3=>$6Á8›IÍârÄ©ÿ¤™ïJ@±™ÕäÛ$(6“ŒJlPl‰òû˜Pl–†0(PlnõóFŖ⺷IŞ}ɂŠÍØóÜoTlâTÕ³ÂTl¦¢Ø¢!¨ØüC|°v-R>©Ø0ð&›13vºØ¨ØŒ8±½Z`±iÑD',6 E¬Xl>u:ï»£ñµ±Øˆ+¨ÐuÃb'VݑQå?H³”>°ØõÕmXljQ¨¡ +.6œM7ÿ0›¢]6.6Ì\À'›>¬àbÓ¢ö‹+›G¤ (¸Ø Ǩ }ĵº¶içbÓfÚ<¸Ødó±g`p±™ÁPC͕‹=ÍÁÅæÈV€ÁÅæcÿ…‹ ³;ï8‹´^ÁÅæ6Ôpm\lšù̂‹-Ôa?'›ŠÈö†Å¦Î“èÅ†æˆcMr±™*îÔ2¹ØŒ‘“U\lV5w ¯£« âÊÅƑ¤5›+*5 {ZÍýBÿ£èZÎwòÓjà°îà}?}ñ.ŸIÄÆÃ&E+ØÍÃÑÎÃn¿$»944ìǾÆÃ~}L µ‹ü' +û‰p#a?ê­°ì&|qb°×ìì'FÆ`ó}¹KP°¡vQ~d…`“8!ØРq¬ ®t±˜oC`Ã(è¦ ØHAÏä_3™5®7üui‘Ì3ý†á.¹›úìðkbű +û½N¨PËs±–^ÑרנÃäë`Q%ùúŠFáøò/¤{Mõs½&õ¨ª±#¯¯;üN¯¯èäÀk¦¸Žçw}…À%p×(‚`ð:pחñ'íFº¨»¾B¹°k¤ÅØ×{c]£h”IºFzC ¿J¨¸ags]‡Éꁹfðp\“rÝB™ºA®‘:ªc"®!™!]/×Í:Àpݼ(H¾5öc >ðÖ80ãÝúîñ8¸¿£k°­oÏa;Úí#›Á¨47½ï!ýà9o\k,Ԕ¬Ö:†Zw£fv¦5֎ŽßӍâZ²*;@_»ñ-݀ÖådÁkŠ«µ‰³†\PSæJ³Æ7÷we”‚š[|Â(aökeY»€.IÖ58ÁÄ4l3dçX·èúëäź pƒX³KÎ¥¦³°Ûçà‚ a *'Å X¨Ì„g¬oó…6~56ˆý_},èÕwHq7x5¬,Èv5¨6Œÿº¿v&˺ÌïG¡£Wç#u#¸Ǫ̃Zä #­3ˆŸ]0«/˅vdõ•M¬F]Š§V_‘¢Ú€Õ‰| +^5 š„‘’ W}E€ UƒîÇÑ `Õ kßXÕ¨°S¦K’.KÑMª.͟ïª.¡" Nu E`ªá|´þ©.öDR ƒ¸bT—蛺!ª_ž€§I¨®ñ~P}s{çSß'<5 AšÔ¿\^QRòXԛiº¥Gå–NI<45‚Vd"ohêÁ¼ìù‘dêêVh ¦îî`µs©o'K}zÞ*µ%´;”Z¥(¶bR“˜ðþH$õCªÌ;‘ˆ6Î õã…`à¨#6ÿ£¶~+YÔ=ºOE]¢únGQ7{’Dme‚¨™|øÄ¡fd&Ê5ñq{ÒJ5ޏӕ|BÚ8¢)‚¨ƒ—ÛK}4µšêËîU¨Kø ÁŸfa¿ÁۉŸFý_S)*=*¬‡øz&{º¹7è{Úòõ@Oß 9œ“<­%Y-oäii\ú5ÉÓÓÞìäiêS°¤V‹š‹ØqXÔ?1Ðӟ]öo¿,ÀÐÜcMèéê,_’§—à黄NxåN# !6§±Ó`‡¨ã´©Ów”ÅnÐiDèÉsh¥aœ†¡{‹¹@ºCü`à4RÀwo‰ÓèV4U¡Ñ)s-½Á¥!.VˆÈÖçt§1¡¥çŸ+Y:¬ –î¡ +®tèꆕ†àºlU¿ƒžl¨4 ьqñe£çL ¥{è© ×o'V7 4€_Œ5™'Z+Õâ'ï¨¹_ãJ?·ñàIÓPÚÄI3^~Üo4i€ø5&ýÔÀn &Í^ô÷ýƒ Sés£¤!3 5Bďá+;H:qeÁ‘Nf`¤½;Eå[§;—Fe!+ђ! CqÄ~"¤GDx‚ ŠÖ¼èÂãÈmÜøÑcm‰/°îÖ&=Ù¦66x4iÅmf£µ«^ÅèèNj؝ýˆo—ÜèáÕYb£YHy_;5š¼p¶Í34'ÅBß`FK‚ä= eIdôˆÊ  F¯šÀè'2ÅÁ‹~œ$K8t ;-J^v Z4èm¤ºGŸÊ ¡I¡aEb}, hjìûxãD#Åø¦1Ñø›S¦D÷#ŠÍWH4òcQq.Nåa X ¢‘jcöFˆn¯'!ºEÙ] ¢Ó°1¢§Õèf–TŠ±BfÔiCD£Ûú({°B¡W€19*V.îˆhðºnßL&å°p*mò¡±¢Rãeü¸ÄCcõ¦z+˜UËv8ômI²¡AuRÓb£¡))c*¢¡›Õ^I†æ2ÏŬ'dÖYû)·¡wž“ KãäBsñÜú m2âž×PC¡«•¦;Ü®8w~0‘•K$ô»kôå›;_ÿý"¡¿FzþÅã׏þ¯~þýzxîwÃÿûËÿû¯ÔÏ|ÿ»~ý¿ýøÿùîããŸÿŏù×_ÙíúíO¿þóÿæ‡þý²Ãɂð×kûK»ý›ß¾~éßýö7¿ÿ«ø‰_:¯?ÿ›ÿßßþø‡×iýõßþ2{9›×ùÿöÇ¿]Oæ7ÿþÇÿøû_¿îìÿü7¿ûù÷çÖÿæwÿùÓÆQyò_½ÎÿåÇßþ§¿úýß÷BÿâwøÛ_|²úúë_ü«ë×úóo¼; 7 ¿þ³ßýü篷ï÷¯ð»ïlÿ—?þ§×9/ÿò«?ù³ÿÌ{ôoÿòoþËßþUëŸýُøð_çÿð«ãã_üêOŽÿ‡_ýÉÁ¬Øïãã}ý×ÿó²ýá£~üëÿóÿ:>~óÚãßÿůþä»>0ôã~šn{û=M‡ ÙþÚéûíX¯¿~Æÿï¯ÿy<ÌÄhZôXí¢L¡ÃK˜éµ¼|­ñð¯¼ÑÂ! +p\r¬)>Ý0QgK2ϹÚa|${Q€QÞlX3Üè6;FÒþú‰í¨ô¢^£Ûv +aÔ°‡Ÿ¸o|*úµv÷sXìy¾ó¨Ë…}¾ ¯üGÜâŽîiÀÙ½VýðëØ“3Ñð/gèAÍÈk¹}Ý1XÞnîy|üë_ÅÃìKvúCÐtÜ«FW´½Œõ_oF *ty‹½ +̱¾ØëeØÏÁÆ拶Û_óºãŸÚË ð"Š€FqükµûLX»8Èkí|3B\Ïu±#‹WÚÇ~X²9®ýlüáÎ-OûŸÞçÿúû\ŸZŒ³{Æy-óÇ^ÛQ+^å›mvQÇ۟ŠWúÒâñ¢¸å÷ûý…r+Ší4N¯¹Öó]lÛµMûr#æQ—[6Oa¿¿À œ÷ûÆETýý±¥ñíOû|ò¨ë‹óé.ü·ßñlºˆñûÍÅ©·ãÙÏápÎh=ÙŶ]Ø´/wau¹_óö›‹ß€7¾o o¶¼½¼Óøö€§}¾ yÔõ­ùt¾ÙË{«™çû˜V(À_íßiÈAÈlÓã6¦-ö9¦-‡cÚrۘ†Aôa߸C8ò~ØiÜÏaڗž‡].íÓ}ø!ÆOÌ0õ8?Ý"Ì0ÇõvL&•ßËò‹‹q;½Å>¯e9ì¼êå¶[„)±#â¹m ŠVwÛa§q?‡i_Nxv¹´O÷!oѼ{û„>÷2¡Ïc™Ðã6¡/ö9¡/‡úrۄ>÷ºq¾ëa§q?‡i_Nxv¹´O÷á+oÑ~‹æã^Ž3_Œåãvz‹}^ËrØyÕË9l·h>îuã|1ÖÃNã~Ó¾œð<ìriŸîß’ð>û)6o®‰9ýÝÈêÊþÉOÁä‰<Ãîý*ëÅ÷OÒÆ÷QaÝx~èó°Ó¸ŸÃbŸ'<»\Úçûðí—/ûž_ñró{_Nx1nW· óV,Cμi˗¹Ýáå+^6žßûòàÒøö”§}y%ò°ëËóé>|ãÌ~{çg¼œÃüà—³]ŒÛ¥-£Æ¼˘3ïØòin·wùŒ—ç¿<µ4¾=âi_އ<ìúæ|ºsއÞ|ö/«}6ÿ"()6Oc1nnÉbŸ>ÌrØéí,ç°¹FŸÏmÆU>¯šxèëmÕēÐzcz؋qsÇûôݗÃN/ÿú¼`Ú~YçùoÖýӟ³uÿ^ÁÞë{y?|—°.Þ»_²zïï?o úþ·G$/öäL‹ö뭚ÓLQ<ÑvÏ`zÙ~¾Ù0×e’‘™á€^?¶ƒ2pð”í Â8'™ÑûÛÆ»o‡Æísží<èrYŸïÁ·œb°ÁûÝ=ÍÙNCÔî{;ßŶ^Ú4/·at¹aó ö»+Ÿ¦¼m\$ÄÛZ÷<Íó]ȃ®/ͧ{ð­¦V²¼ßÚõGÛ9ð¯ýÅ]lëuMóræA—»5Ï`¿µ'ۄ·· ÚŸX÷§;ÍóEȃ®o̧{ð-£c´xT½Æ׀†rÚ¿ÓX\zqþêoF«¯Ñ1Û«êgöÃ^yîçp%Zü;ýÈÍ®‘ëÆ]êßý°Ó¸ŸÃ´/'<»\Ú§û°Å5nyÌÛ-â„{¿‡sk;÷_\ŒÛé-öy-ËaçU/ç°Ý"xÏ3Þ6vÙÜ~ØiÜÏaڗž‡].íÓ}ø6 ÷|OæÒgšèìoN8ÛS ãû›³nœ/ÃrÔi»?½·/SºBóQÍåÃ4åñæÃ[~xÞ¸ý,ç]^7Îç±uÚîO¯Nžå· â߃°o÷‰×1ê›Ñý~Sãí‡Ýƒœ>‡OAN=Ò· §ßzØiÜÏaڗž‡].íÓ}øÊ`°ß¢ùà—ã̇´üâbÜNo±ÏkY»9}Ÿ‚œzŸÞ‚œõý-Æý¦}9áyØåÒ>݇o2Ð/¾>ß^dŠI[Ï9e¼çÛÙ.ÆíÒû¼Ëa÷¼¹ÏáSÞ|?·-oÞ[&rŠÀñϲÚ}&í¹÷w1nÃóbŸcùrØ9ê/ç°MŸÏí[ ӝ–øiEaó¶J ëèlÄ4Úu|_RÈÓÍh¶×)ö‰w‡ÞÆ÷%źñ\&ÌÃNã~‹}žð<ì¼²O7á›E³åKo·vzþóæa9ÓŸ]ֲ̘÷`Y¤Ì»µxóÛ­]\ÿeã¹FXžXßï´/ïBvyiÞoÂ7Œf۝Þîîtþç9ÌUÂr²‹q»²e¥1oòN™7lqè·»»xÿËÆs™°<´4¾=ái_^‡<ìò޼߄oÍnß{úùyPûö¡3¶VÞFâîçÓ¨À.*ϵ +Œï½}4½sÃù‰ÏNãþë‹}žê<èrQŸïÀ·2ì÷v~¿ËiÌ/}9áŸ]Ý2\Ì[± 6q˖/r¹·Ë·›Îo|yXi|{²Ó¾¼yÐõ…ùt¾qˆa¿±óÓ]Îa~äËÙ.ÆíҖ‘bއeœ‰ûµ|ŒË]>ÛÜp~Þ˓JãÛcöåȃ®o˧;ðÃ?2¸úoþù/úñ7ý=°ú‹­Öƒ ŠkùÐ…Píï®ÑYµ²Ú¿³£Eµß¿ç—ìËq~öy~¥ív²àK8L,;’]´ÔùÛøúE Èe¼qËx¢¨èK¡Õ×ëù|â¿——ú²¢µ=Ê´ù½Ú'ƒöÍg‘ýÁÎ2¶ µ +üÝ×ëfã}>™ú\y2,¢õ¢ªm¨ìÒ%¢úJƳ>…׳à@՜Ná9âÒúVê~0× £zÖõn ¼ß¾uåò¦¯“ê>ƒbÓkàûŽjìܝe#º3x²>§žÆz·¸*ßö‹ƒå +·Ï¿^¹íÝ}€yÞ—x>xB¨u9،æè~> ‰½n¶íÍšŒ±xj tˆØ¿¥e?hþ¸Ùg<Œãµ¸ðï¡|Î/';õ~؆%1¿¢1ôk4¢56MlÛ{ύ½iÅD­c2¬ùµ˜ç†.¯|ЯC´^¯87”Èي¾T6]÷Æq‡ñà=»ÉQyâÔ.Ñ7eoºGQâ&#JX¿zŸu×ÇyžjdoW<ªR›LõÛ \{þŽ§ÕÙ8áÒ«ûz×r:õè=±œÍσ›õŽç8æ­zTòìû퍏V=NœÅƒÐ G¼ȂçâÑzð±q|Oæ«W±¾K¯}tÔ8æ«ÄJG™QÌû}ÚkÚۈ·4cÈ~?ð|À,o÷Ù÷SÚ¯sØ^5ZÀˆT?³+lwñóê+ÞÍjæcÿRm¼çA÷3ðÉÑp6¾MhUt8~c{õgÀàOãux…òþâÆ}±ÔÐö‡gÂ#”Üøéùse9Âzyz‹«(•Àh²èhgáaº6å¹ýhîŠU¤‡ ë?/ÏÇ_ûÅü8;}øÙ\gqv@ÑlïD›۟åãˆW{Ô¼qA3 +{ü¿¤¯žCÞ+@Ÿ0؞󧰿¾,ü59õí6ð嫶Ýú–ø5^¾#’Å\u^Å۞(S]棯Áúݱ-FPÌ¢ùáÍáóö‡TÒ÷¹+†õ’#ø}œsü-¥æ  ¹?õŒÛÆþo?¿Þ¶ýªúšÃì'ãËýýyë!œ‘=ÆjÙÇã|>Èsâëv>¿tïu~àQ—˜9÷ü”ö³ûM¸/=Vu¾õ v÷ã +c?bæ?Z¼ê´—+6î56~î8lÕúù¦»Ò¥ýñÌp¥+S€ƒïÃþ´Ó‡z­·äcuÕûÚhÇéӑç=H|”eûŸÂnς£ß£+zïýXËAã}åÁïž÷ ‡qçéåÆ%GÚgÏ#µUÿÆKùŠS¨ña<˜þ¿zóúÐÿêèËþ”öcNlpPil#æ®,lìq'I_âÙ^Zl\Òk-O%j6êöõܾÏÉÝî{9ôB~ +ûyœ^»Ðµ´ñºü÷£Ô0jXA¸¼§0—pŸXd#cõ´b[/_=…ݍŒ¤—žCW—éÚVúêðýÒ bû«W‚Zl´¿ƒ#Œûïò#{\6;t‡±Ù‘ÄññՋX? +ú«šF‡xA²?µ…K¼ïÃnWö'^ÔvDˆÇøêó7¯ 3_ÐSžxQ0Î%ðƒUé÷i?j_âãÃx´¯y^è °ÙW.x´æ¥°Vj2¦‹>(y¤ñ„o$ã±¾Ûg¿ýöŒrǶ£Ä¶5¿¹rÄ«@¼Ä—_8µõã &Ó¯öµ|˯yæÓgðþŽm×ãþüEô{ÿâ*l`‡ç§°—[*ì'!"Þóª<’¼ŒWë#¾ÓŸ$[Wûf74ÓÕ¶g/y[†mGyüK§—£Ü¿7“ÍӓŒ7.A¿uÙÁt=kÞkØkDDÛl<ã|ml¼ãG]Îa~a ´ÝϻĪòGŒK¯å~øöl|ó{:+”ÛËØâ-ºŸ»|õ1å(J×Gî¡FoYæÏÇÎçœÁ·Ñî€vÆSËBº¯Wÿ±1â<§€Ž>©µeÍ ›¾:jŒÖ‡V£0>sïÁ íÝo倓/ó/ï"f‚Ç+nn׸—‚8½cÛËî8xñâŒ+ž<—WŽ U òJœÿН[6Ñg}ÜSw/§noeÃ¥êÔ'Œ¯Oì\Œy„ãÈôº¶¸4p4«^ ðÅG®VüªÖ¶\Å M„Ü–O MŸh×âV0è-çKâ#ì÷ënõï»Þô¦Ë'¡é·Öü0áäë‹N{£§+÷¹™/c#OOÃk~ÐӞðÂkÉûvëW'å:ÓãKIJځž3_k ½î+ì(š’±ä®Ð4sÔ¸_‹¦y„p20€¶énö3§gL…i¿Ó¹õ¬‹{ú nk-á9ZÂ-ñøzQ„Lý]â%ÌQé:7ŸêÐp‰~¥9K>ž6h‚žÕ7 ¡ãïÃ|ÞÍ/1/OƒÇl”ñP­^Üõ¼6”ëŌ†.¶åÈz_ã‰äböuü˜LÐ2öŽ¡æ)óÅDF5^ˆÈÙ½ã±Ù3ÀÒñ¬-Ýo4"¹ïu-*ã}Ý9Áøe8"ÀÑn9ÀëQ¿ÔybWÎi1f«J„rAT+”¸gÁΗ;<äGN¯+9tÈÓúæ"Á~iOzÄX‡Væv×á:i¤Ü·w/pŽ[£„o€á$¿BXKä†z“[ +Î~~ÆaDãæðko¯xe¯÷êU5Ym{G@£œK“'½mÈϜÏ은ž.xƒ(ãuěWsœÃrÅs=ZŽå¶¯! 0óXÏÈ{pg¤+ȉ6xòsÕY¡/J¼K-ÇúR•ôÛzӞ#5À6æb)ˆy€û‰×ãÊmëùä×3W_}<@íy»îøØ!ýlá-ãû„ m‰û1µyÇìW9b¡{¶i>Ž”&ÞâÓ×1¹‰ç“ÊüN +zE,(Æ´„t(ɃìwŠ ×ͧÍÀüáÆkÍÊ-»[ +ð¤ìØ£Ws",˜G -oÉÁ “Ò÷a?óNz憭¼Ç…НQyxÆÏùEÄ œÏ –h¬:Ùñ0£wêCû÷c<4+°Õ á×az¬*Íg'x{”¸<­BôÄÑyª·œŸV®Ð¼Ä^#ü÷“kìüzyª­JL1z Ž×sɯüqŽÆöԊDdáK b<šý žšq¨'ä4bd+Å.ÉGÞnþ/øQç¾¥ôè.Á¶é)ŽçŒ”;k¾ay„㊡¶…&Пii½†±9àk÷QÏæ˜$ëÛ¶ÜvhÒÂQ#¦îcd|­«A‰ßÙ+~í°7ÇVdqØאŸsËÉå@{¨˜¾Çðùb ³l—+÷‹1BÐØ®œ4‚pãâÂÐl2Vvm†\Ž9ɲ¾S0öi9ÅÛîÔ7,+Ti38Yè'âåô4ÄtHÆ æ4†þm¾´å–_¹µd㝠šž‹†ðþÁäÑ6¿'žŒŒÍ·« ¿HÓO„ +#'€¦£™(hŽ¿j÷§ûK-˜Ç“7ì(±FAn¿â–KùrÑq¬ԃ†¡22BnwKz4žk1xÜÝþíçș躽míGúö©{j‹¨?{ÏÆ#ÓBã þ°ÇEIÒڂdෞ™7Æ÷”«¿çj޸ՖÑ«‚ðAÅbƒ×ås]‰·šïV3Õʽ쟞ËL2Í7h×sEšïșðÀn6ú–£!ιœYÉo2(£ýÿì½Ûr9²(:ÏÑÿÀˆ}¢{]@…ªé˜Kn{¼FnûXîž^{ö„‚¢JÇ©Í‹»Ý?³^ög¬·ù¨ý¸2L È"YEË)s.™De!@"oHD¶B¢ + +”{ 8¨n š»:¥¼.H;/k)X{=È\4ǁ©» ­‘:¥Eå5f +u!Ø\<>$f4Ç\v]¡)\Šú^Âtì>Ë +n̎$tD8´A5jÅPڍ a™$cšú䨧O¶µ՟ø”!©±Yâ ÜôÂÊ¡6ܸ82e°Oo€P9!Q¹,EÌG£P”< †ØyN+%¤IÆzó±†ÍÐÑé‡-4O¡v:qG…,+ Oا4gý^Ü"Ϩƒ¢›äL4¤÷é‡ºS‚mÏ51@å³qs㊏{² ì¦@‹)aa˜g”h-3ÐÚg8e˜‘ƒ ”w6%µ‡%l‰‰@\çBM­àT¾mý*+AHdÀ `ASGFBJE¦¤,YÍ®V!hÆÁ"ì_Drú­bÿ'‰H¸U‚¥1&¡¼€$aÓ =ò ˜55V,Lef¨YƒÅ¸‰Ç £XžóZ àŒ\¼-"ó@É;“}¤Ù‘ú±ÜG=Lƒ–¨V!Ã>Oœäz[(Êí8çÍSm.ˆ3Bsjm¡hFEY´¹Ï{çŸÛCCr.渻½2ObqŠ¨c¹'-¤Îccb‚H$ëŲ‚A±±,ü¾˜'î¶/~CZ ³ÐC¢9ÉD +ƐRþ¿VþøAÁö¶í­”œýR¸R֎?pwË)ÁMJòÝ%M!PRö¬8•˜zâÏ 0ætC3›0„ó £å¼š8e¸ˆ¢`˜y〠÷AÃ|8”á\Qú9æ x 9ÇÇáL†Ïí)œMênò(/Gs2â0`È(Q"•”$]¤¤šJ¥hØ|ÂyÊLFÚžÌ É,ƒ×çòÐ2ÀÃâH• +`ÚW!°ìϺX5=„l…KÅ7pÈ;£ƒ™«¹âg!`åI«u¨×t¼€Þ7 ˗Ya¢ðJZpD–³D÷I ÆõƉ؁J‚WŸ0ž¹¢c*²¹ œ‹gé+X§¸!JÉ¡qT•Ö€*ŽËrb…âLþÜIOhl$‹ïŒIŠ0„è èüÓ Y“Âøc påo¶’“^U乩Óèᆟœ’Jó„Èr¿Ûb*I.LjÏùtNF‹´ ‰;ÐpcV²„·wLê®óې¤œ9©RZ®•Ý"em(“Ü–—ÎC~]o+ߐ¼IjLZž€r,—A¤kÖ ÜBMÆ茖áA¼Mý²êœH/Ë:W¾-%ì‚*ÑA»"ihó<ꁝάÛó©”TL•g \$‰¥Â)+é®qõÛsB'²ÂvåUR#¢hÞ¢ä€Sˆä[šC¡Ÿ …¤ókÁ5ƒñ€S­­.ž†ž Mþ +”B¾»ì[’8.³ m$ޑ1nÅûÞç{–õìg¤ Š»D4kh¿Â¤F>ґJޚí2˜Ó ÓÊùÜùˆüa?wsæቮS²|RFr½³ÂP¨©ïÊâžD& ê Ô5rl¡:B”¹´“tíy0IsGÑIâœ0`¢±n—Ó©N)òó9>“¬Ùe 5ÅX™×p3Zmè© +šoÈ¥Þ°aAA!<ìÌ:uAçߤqžÐ3$ã4ۓ^As½pŽe° |ð :áŽHƒþz “ØäYqvTÉÄç¶93DÑÌ© [,a>rÐÐ[Ct˜3OÉLóAÎøT"L‰ÃRÒ 5:µŽ¾z¸<Ù5ÙtAÐy_P.+¢ >„cre¨qA²V+CçáÂùf´dûŒAmá•Ão Ìhɨ v§“Œ5îrÄÓY§O ˜ïK˜Ý¢æ[²pPyŒ9ekSzµ3—tÞ +'÷Mù€K¡tÀ@êF8­ h%wÌ©„~±´}?’³ÃÖÙr¸û”†Ø+³µÇ =\-•ø“]¡1bu;¤æŒUäaˆƒ7ñ)sظÇYƒ‹ÂŸ)ôçہT&^²è÷íÝ^äœ{àæȯMï–I)®‰Ç¾5aÈÂq¡StH¼q Ž™Z°’€2¥©'#˜‚qåM– B€t®š ’Äð²òÂn®¤–‘‰”Ô¤›Ö4[n=šqgL®ØÊöïÕ ­,2O³sä0Yj¦³ÿèÛ`W](# §F±Ø§‰œq<Òïë³¾†; /¦-\º:KI5!ìþƂµLxD`8ço•ñ@S‹ÇšÉyÀŽŸÞèµÀ<§ÄýÄï©Ø’v?_ºÆYý~Æ2âð¤°"ÿª,ˆ‘IìIE³Å‹¾©Ï[‚çi)åÑ¡³œÍPðñ>ª‘€çVKÚ-i5å‘)šøCñ9xFL¼jsžÓÁ,DNàe·aÁXŠ…$‘ÌNµ zæÒñ°‚‹0¼ç›*¢ÞëôŒå’#<šœ€€p“F̤@D’ñ™IŠÙ +:AÀ8š¢ùˆ&ë`FSÒ+ÀÈM"èT0ÎdÆ`W†^êCÁæKêÝmûQ¤+H—à˜åAŸ­Êø ÷Acõ +LIað)»(ã}DrxVK·C¬)•áC:ؘºàÏÇá‘HElÎC“2 ÐT»×B¤%™¦ö)õÂ4èëœ`ˆŽI‚ŽÊˆ½€ê_¬Aà“ª zè¶P,«¡©0‡w„`cÉ8VTëÈí(.WÑ7·ŽêPK¶h„éÝØá”b¦VؐP•¾cŠ‰¾4cÐYØÕ2 +Ûz/O$" +åî8ô³‹ÓXx8eŽé#èÍ;\žƒ¾·¨Ô  ²ñ¡ŒHÓX¸ó Ô)͝¨ð4vI±Pg 0YÕdÛ£4aÌZK1.šÑr-¹e„Xs• LP`ÄÞÖ¸¯Ô¢á:wE0Ã0:UŒfBØb€G¤,ÙiRk§‚û= „P3H© á þdœOØÙ ’ê†ÃNkÈ0©áÆ9ՖP:崃ŒŽn«„U5L} i©”vÂÅZÊS¡BòDÊÓ Ìæ€ÁÇ1î+P‘¨%pmQ79­8ŠMB®Ÿðμ\˜HÔâ’f ÁÄs©­ØØçÂë¼ ÒUx!ã‘2Ncñ‡Jn(ÃƟZÃ×q¼bƒ›7oԐϓ°0ñz7y‡s'ÆÒúó¾±3Kp#!' € é—, ŒKùñŸgpÙl¨ú{Ä9m|0§¨¹¢çi‡µj‰${U~œ\ÿÞ\r@ïKÇñ)˜'¤˜`ýÆPddèRºUîò¸Ýú!IÓùÈŃܮ ֓ðeˆ_ÒGñ +xOô(=¦ }‡§ ”/Œ#; Iê¯õË2LÓj[ù¹ñ6Vðy ï a8… +‚*…(xoñ\/¨+G$+ò{$Þq@If im€•´Ü”MQè@A…¤r ‚ó&®ÖÏ¦3¤fÈ$r÷‚¾)<§Ö)/cŸ¹›$ä½D+ÊëJø{Èé?8O“Щ†$Î?_’ƒá/bðÀ zFg.ž±º“øôJH™% ¦ìÑúZY»1WëЂ¶ »æd EÎgQ,Xïߦ)KgTFyȒã *£Zõ•Sã}‰‘QRºr ’(–SÂ৏ L{©i‡ÆËË<†‚’†jÅõ1 +:õ«“ØS÷F»x@&,HT8_SŽà.ÇÎ7æú\`üLÇcЍéòhb<Æ• û:59ŸZn¡ûéë AºùQow@Ÿ÷†CÌ„ˆÜ‰‰?¶Ø}ÓÙ3ös*ÃIÝPaU²C2u¹ñŸ,ˆœŸxÆ"aч)ŒÁŸD«Of +ŽIjïð5DÊK#¥s!2{@8XnÍ £4’b!¸—x&KNÇOøè IËŽ×yÌ$sé§4Š4eiNt*y—uE/DÝhŸå¢`/¸nW!wXEe÷\Þ»ë‰U©&X°ƒcÆ'ô¼áÀj’;a¾DIô¡YdM8x¤œƒÞÅöƒ~dü¹ Ì3Œè 4.x“ӁŠ‚M±aX„S€™ëŽºÊ’xxˆÎÙ&®:Ž†”¨×y šŠsáVíޖq"U)D` B áÅÒ¯ïÜeÉ9q”Iªøå7´èøP/ŸÎX­N¨ÄX˜¾ÚŸG MÆ _ +²Ý°¯šŽŠ‘Ôc‹ÔñÝÃ2¡²88„ ŸvóšAdœ»bq Y‰XIÁ% Þ0´2!A†Ÿ“½2‰f’tª44TžÏÁ‚ y¸-Óµ ãÍBôµÐäç2P,›]Kxp‚‰+ØÂBØmxV-•þ̞*2*é—f¦3ù¾ pYòi@¬ãÚÓÁ?(òJS—ÊlX áºhxšÙc†jŽôF—j€@Ÿ»¼T„ÖŸk@‹›ç³†Ô9 ñ´$™!…äãšyšÆ +£^E‚Kœ<˜-8GxdÔe>ëa>GFG¬)¯¤þ¤£†2wô6- kØ2UØJ¥&½à{Õ<Ѩ‰Ô”[läÝQêh±b„Þ—9O²›BšOäflà»"šxÎW +3eaàL䞤b7Òйo7]ù¨±ä:‘I8yÊG¡ŠbJ0dM±00Y’çIB´E° ¢£õIä:H·”R8$L}Óþä8 uáVŸGÀ‘îæK2@ÙáŽæ³G³)É î®{YÊç(ƒ½@þÅÉÃϧtƔ–×=ŠôI5' ÛFð +æS +2®Â§,#R¨.ԑÐAŠú +eYTój<æ,r8’ª¥/t¦ +Àfÿpp–Á˜»è»f\r¹#%uF] +GÒi€Ýø‚S&ç¹ÇËжôÙA0Â±zÛ^²ñFgX¡*H(díÏt§ ­“Èý8ÇR0^ކ*(;iá{ 8½Y†‘såj¬xÏ)0ƒÉD3À ׳Lb@Mn.åË ©$ðÐ åtSß%¢(—ðe¿” ò18¡ðŠˆR,Rá”%©n1.ßIçpÉòd´!bEÍS‚¯\^ø¢0d3ÖW +a¯mÁg‰¡V ÀM´SâÈ60± öÍŠW¦mL^'—Š ,UªPsßÄÏ+ž¥X¾2ªÄe} N&êÓ)u77&¶Òx•p9T¨Æ!i +J́1*ãõgbÕ-ògR¿d”œ®C„gͅ iÊhý&Šåˆá¾ +H&¢ÒfyÆ^<"[Ñùä‚ä8¨+a¢† ƒÛ +h,´oZpATR¦˜Ò!à<˜ê:$Ê +VÙ4è·\K'WT9ë4* x)£ÓCiŠdkHO"´˜šé1hré;GL¨ð/xƒ£jW°Ðxjع©§u\\WûÁÑQÅRìc'>sÉR®¼c¼õk’k¬…"P:>š¯u7ªä¥¨¢zÎ5h2ÅJŸVQA,ì ª‡(|5/¨ÉžqyAm‚”j¸Péý?°¼è9p…È% „ˆT{v_QU­}ÇWTÑÑj€kÊ j8e”B4 3›,óç!ו O8G“OÂå*Ÿ WÏ[.¿ç{·THë†à†é¤ãv… ,04 W× +µ $ç¥ +>~ ÕÜ|„—qL‡©íÁI|§_|ÒeGmQeIò^TÓm$kjPR¹~_À³¨éъˇj{Æ[Fl%ÔláÛ]¾FBD{ÁéXîJ†¯’þ|t!#½•j¢,w , T⸞uÍ  ¢ +yT¨ÞÃù‚Q:Q @šêšjWˆ¨X_Q +endstream endobj 99 0 obj <>stream +óÂøRä…'B_¸à1‰¡/\áhX¹¢Ê'u}ᗆjäX|ãK Ûà|·–àÚ^|AàޓèÞ¯L³XD÷~elŒa1²p秦bZZPµ‘L‘Ä÷§ˆ—ñ†W*W>Êý”ñ5¹ +óó³9ßm˜³ëJð;äL]ÛéPe‹î6ñ=º¾…nÃÑJ>‚„nkŠ{Ñ^ÏÕŠ”ÏîÒiy(oÃî1_ì0(v¨'"ª…†£~t+¬æZdI¨Ž´Ô·xSÊBBœJeؔ|Ö7G}ãà¨ÖTn($™å¼â Ë}Mé3Èic…Ê;µ=š–q@±só†á‚£7yƇm§Cú¢/9€â;½Œ9¼´p)²nÌøi,ÖWðÂL£3›9³‘t«Kž d“(ûAº x¡3˜žè¨øaH(@átžÓèÄ ¿bÍN¾ç-ü+8/ +6§!ž.èjC‘P2¦ Õ"æ r9 §ˆi¾r?5%,R¼Ò99ěùЍ€j´nß8Īý͒ˆ–¤újÔË}¯ŠâBxªê†àáÆc<ÇÙ,áÂY̎>]ÇqÝÚPEçÛï:¿üméó7Ÿçç?Œ.'óéõ«ÞlVNFÕ=ÿqš…áŸÙ‡ÛüV¨ä›ï:~ ú~fqÞVÛ¾ï ç¾ñ¯ƒËÙõú֣ލkl»ã›ÿñžH;’-HûМ¬{BÒoÍIúíþHzüüüñÅÛòjØë_ÏÊ¿öF³òÅ`vÖ¿†•8:É\Ú¦›…F÷Ei«¥v]Þ^Ϛ µÿc3 +vM ç“~ùxx{Ýk>à£æìŒîoÜ/†óIc¢&åt>l1îÔþ¾ˆS)›Î.Ÿ”ï=èVsúªO5œÝ«HëH©Wå³Þ|:ôFÇG4"aýÈìø ]¶ØD.ïqiAQ‹þò·úVRc_DáøêjZÎ6/Ÿ»ˆ÷)*^"¥û,$tsÉ>Ÿ\õúåY¿7,[HöÊS÷5#‡ 6m×Ǔ?ýz=˜m ¡²¥}hE±k~(wHÔô¶ì¿œoXh{¬_‰¤ùl´¬˜{“~»ÊQ "—Ÿ¼7r[S{2Mg½m¨ Oî©Ñt$ûŸÆû½9‹~¿G‡hEԞømtšZ;nîSÑy5Œf§­œüt½9ókûÔoëû¬€mç‘mömyKb“‚5¾-'½Ù¸¹É=±/zÉAßÚ)óíd|s;žn´v[€4W¦ÞµïîQh4ßCßm ¾B‘Ø Š6ø¸*©}Páߥ-(J÷GæíÏ&ܛ f×7ålÐЛ±Ó¤žMz·×-(ݗ-y8˜½ê 6YÀ‡=y›Ùµ-} úÓø>GùE9y[_÷Yój½$¿„Aú¤ÙŽ`ŽWã~›GnïVãô`œŒÓƒqºÓÆiótûƒqºÇÆéÕ¤gñáãÁô`žî½yÚÜ£´ßÖisát°NÖéÔÁ:=X§ëts?öÃ:µÊò“òzTŽÎ7¤¹m©-ï£Bٜ“Þå`Þb[¦ö÷%2.Ã^‹“ƒ©¸£RñÅxr{=Žß6×{bq;±˜Ä¢§¯9'bñ bñaŠÅ&ãËA99(Œ_„ÂXÚÑ>ƃ`<Æ‚ñ 2>|•ñ ‚ñ  Æg½ù¿þsÚ¿.'+ýëßáŸQ9ùDáù}“‡ò”‡E÷™9,:O_sNÝaÑmžOBòæy‰—éي¤½ÉõüËxøûMoZNæ› +©íUÂgiò…%|>ìB)‡Büw©tíþ¢(j:/›«Û»¦Iîš9Ü.А¢Ãퟪ8Ò¤¼lW7uߤý¸Áõû+ ÷ÿò„«áx|éï¸öúï¾ï8Ðø¶×Ì>ü)é¶Ù°÷éš$úÁ.¼vÔíÙº{ +StŸ—ÝGì‡Ã;m¹ÂºÉ®‰ÈéuïrüëÉC”_Xyp7£ZÞïTyè¾æb»ûœª—A5'uñ¹û¢¶ùˆ^®®æÓ²ýå9KÞ­_ÆõdÒN÷sèÁn€méûD›ßÎí7ió5Ûû}p3oÇåîkгæ79”Cû­÷=zä¾ÄM®yå¿=Óèž p?ۙ‹¬ž8òî±ú²t°ƒ^²·z ] y¸O´ÂŽÃ}¢Í¨ÝûûD +Úþ+hýìóèg‡‹Fᒝ—l£´²+w÷ " +-.³Ü“ G[\fy¸pt÷)ÚPN¢BQzµv ïÍf|¸pôlˇ G÷hO>\~ؓwzÖíɞ¼uؗwj_þ÷òîa‡-¹ñˆìڎþQIέ§ó}Žöá.ð‡:HŸ´3û<[Wî,·¿Wî|9¶È*Ø×;w¶ ’í‡öØô®ý×Æ­B7=‹®y© }ÚD'ñÿ­ûĐƴãÇ¢†ÚïÑRÜ)óÌ>=ݜì¸ÿB¾½h°Fw[Ê<äï‹8ˆy(~º‡«îèá•Ï9jníKýœÏå}»â^ÞËYõûû_pæ#Æl¢T<•³½‚¼/Â607ß|?ˆ¬‘­lgcó­û¦ý‹n‹£ˆýWVÞÃÞ~¹*'O“qíÚèÏz-F~Ÿ»²ÓK¡‡;»¦“t¾¬™øì0wr&Š/M$ïBŠÚgP•àͤ7š^µ¸-gWǶMŸðøl¥ïæç.iü·Ïš!ÃôÉÇÃá® Ö®ñgË)}ÈèýÈÎì@GäÅzm®-;\¬·†ÚݸXO=¼‹õtsŠöæ^½¿þë¿®‡åñ¤MŠÿî_«×fò}a×ê‰n‹0Sïr0o!y¨ý}ûå`ØkQÞs­´‡œùp³[ŒÕ~•Â{1žÜ^‡ã·Í·ð452q¯eâӄŸ%1iÇ);HÂÏøޓô臗3vÑö¶¤=ÍIÛ3ù°ÿi݇r‹Äío9€¤…Æ»ßåš'žîk5€62s_v¸‡› +݂´=ÛáF=ƒ %céßò²œ{¾%§Å¼Û›”œ‡(úšOÀ½}ÍIÛBôÝ I«ãˆàÉuo4*‡gå°ì·r°-?y_Ô>nÑݚÚå'ïy[{2˜Þ{ýò¦Í^ôn÷yo{ÀµzB=žÎÒGQùؘü}+×ÓF¼îËfØܹw›asÒöÌx %‡Ú о,§æΐ}[N-.W¼›óÅ»>€_ÈEÞW“²ü½¹;új°)¡|!“r¸Súj2¾iA¶¾/ªšÏàÙ¸…ò9¾GÕsƒŽ»ÒË·mö +ßü¾ë í}hNœÝf½I»=Ã=pos±9q—-*9¸Æ÷ETóý-"ûð#’єЅÇî‹äá`TöšßÞï û/Æ-Ž”DO܉“Íôòr0¼o3–üÄ}Ñ8ZØïÏoæ›sÛ*$FÏÜ«‘Ô nÚôüŸª#§VÍQ~È\Úy´ÿp3—Z¶gþœCæRƒq:d.}¶Ì¥ÃM&˄îkîR©¹/{ÜÃÍ]jAڞíq#w©¹ +¼_¹KmæÝÞä.=DÑ÷ps—ZvÈ]:ä.r—¹KÛç.‰/.w©xݗÍðáæ.µ mÏ쀒»Ôf€öe9r—ö;w©Åî™Ðø!´}LÅj3Àí…Î}ðVE(wmxÚä†ç³Ï'-b³w£óI;³yˆ\uÒÑÍ-Tǂ×mŒÔè‘ûRb¾ÄR®ŸŸ¿üV§·ƒrxÞ2Í᧞Oʛñ¦»=M=Œ.Ë«ÁhcùŠÑu[öfOÚ¤ÉFÜ¡‡Üm6™÷,w[´ºýIÞn¸+>˜Ìíé-än2·™Û­2·ïGâtÄ÷2émÿM:öÿßÛÏöï÷ö‡æ·¸}Ddæþ¬¸-òÕwM[{ȅ³/6:÷Ø;n¾ïx«!<øÇïQ„.¸ûz?˄·[b{"úûtÕÛËù™~7[ÀýçÀµvÍýgïZȍw÷(6šû|ßm ¾B‘Ø Š6$ZT(R÷h»4§hC&V…¢ôþ(ÚNŸß—­¸7Ì®oÊY =c·ä­v¯}ܚ?˹ׇ´7ïc@h»?„ó?²3;БC8ÿÎoLñN…ó[žè<„óáü՚È!œÿÉìC8ÿÎßýpþ¡Û!œ¿/á|Ôo! /“ïÛ麇þ>¹üöÃYtácËCÿ㌪Cÿ®â n͜µ«“Syè¾æá‡r8ÿژÐáàíõÌ68êÃÙçæ´.>wo–Cs»apu5Ÿ–'ã‘5vF-äç҃÷¦³4¤óɕUS[ÎßêSû!H÷dƒ÷sèÁîñméûBî§8x^ŃWñÞtƒyÃCíàZ<¸®Å{±À¾;)ËÑ÷V›-¿·{åàíøû÷ƒñ°œ}?)/¿Oz£M¹ Ÿã½ëo"oîîý>¸™Ï6a¯ÌUzà¾&j֜¸rh¿µsËEÜ³ûêÉ ÷SØ8w ]Èö¥S¿‘ïó±²ìËq5ü/{ë™Þ–}«L>Ó9™ŸŸž?üvk5²6ÎÐå'ïÜæ»uº½ïwùɃ'êà‰:x¢ž¨ƒ'êà‰:x¢ž¨]öDy¿“óDy·:¤ž¨}3´ž¨»òDÝßVyßÑñ/Å¿v捶‡à`{ØÝx͙m¼NÚƒ?ݾëUMö¤òL‹ª&‡Ê3»OўTžié¸7›ñRufÛ:~û±-³W½Á¦ÇaOމ=ùP î°'ïô¬Û“=y;;ë°/ïÔ¾ÜzçÚ·-ùP®åž¼yíûPî#;³yˆà¾Ðêhgýk‹´®:;TÞ¸Ã}ù^ˆk^ÞïŽ*oÜçÆôPŠT4¿¼ý²ù-õØö¾¦a Š>´ èÞH}…ã««i9ƒå3)/ÛIû=5X^"Å_°µòCþ%˜-»6\Ÿ-t±w#u00÷ÏÀ*ù¦ñ$þupÙ&£Ñ7¿·­ô ´„n>œ-ô¼{TóZ‘ÔB¿G]<öp|šêï÷#KÒ²äºl•©Êíî›u:Ãîbûæ¾Éî›ýÓÑóç¾iAÑÁ}spßÜ7û0ä_‚S`׆ëà¾9¸oŽûæKôq€õ<³úò´¿Áõe\MzýYoøãxÐâT„{¼éØóËî©TÀÙl0k1âSlþf0lsP¾òÐ}‘št›×ºèM˧“òÏËQ¿…Þ¿ðؽ9Œšçuæ7/í ßf4ãgî‹Äþ'ÍA¼’š»,÷ÍÙӂ´CñüZÅ¡dÙΕ,k±¡\MÆ7-[ß]Íoµš[h:ãû£éÁWa{EØZ¨a‡lMé<Ô`{ˆ5ØîÏ-¶E²Oå{3Ÿ\̇VX<Wê¡,Ò^žôlcêì—ó{«Ÿs ¯Í!eð¹Ó[ æ~$ ¶ hoÒ.'¿&åp>z{¾¡ Ä^¥ ¶‘%_XÊଡ’xˆèì~D'ùRB:ÍóÔö5¢Ëò¡'uìӃ}zÏöi«ev°PêÁB=X¨ u7,ÔæÚîÁBÝc õuølÔæböÛDmNçÁD=˜¨õ`¢LÔ=4Q¿yü\$ç?Œ.ÙTE˜ÐùãÑ+‹/Î<òðc¸5þåë¯~¼ux”ûñìÃÍÅxh»t\^ÊÑU9¼„BÃAù¯ÿ,GGPÓa8»þëÿô¯Ë—ïmŸ¿N:¿þ*éüòë×_Íéÿ6Ž<øKøGtüï/àÛ¿ÛOÿ´°_;ªó¢ó÷$Ë¯Eç—×ð›íQÖM’D£¢sc¿ÁßÓ¯¿:⦛i#Sø +ÿƒ¯™Ôø9ëœØE'ÆE‡£g°M­àÏix~¡æð5|F¤øà)þ¥_¢G]¶m¯€K|n½?¦+­ þU¶ücWᯣ‰~9 +͏r÷nû×½>ÀR«?â~=ÊQG¹#„‹É=ƒrǟã ¤oÁ̺켝ô`Ägô;«£Æ͍ý{l‡ç(b“DtŽ„Å(e'L!UÇJu~¹©´”¢¾e¦;Çý¦8›á”âÄQ8>¶“ñ'¶¤k¢IˆŒºq³ª:G8ÍÄ´#ϵè/S4z [ýڅ‡ý{¬4ÒQ¢ŽÑ0¯9Ù|ä,*™Ty§Ëéâȉ¢¾e&—Fn5Îãf8¥©ŽÜ·ßu~ùÐûØJª¤›*‡AÏR;Sì)´ÐöƒÎÓLÀáÿ¿ô–eHÙÍe.ҎêJ• +\£GðYf0÷ü0Äð¹°ÝÊúhJíhÝ)Rð͹ÝÁfÕ}ú›óo-L®Ó"|ÇǏ!ðõxJd|sòýÜ÷ ÐÒknÂë:VG@Ôl ÝúÞÊnª3Q¨¦½ýi*R3ìN“¾‚²@“Ñ¿ÝŽ'³7´I~sžtÇÃj£QïbX>›.½^ð͹XFõÚn]ÓÙ;!T]Ý)ýß`"Üá¬T•Yiª?(]CšªLʅ'j(’ž ééI<ô÷nç¤Z¹ÊÔªU¦V®²iO‘öѸÐß»œƒjãS«Ö˜Ú¸ÆêèKü”~šI?ï’ð÷§Ÿ¨ —ªþ d U¢2Z O,#-ґ’8 +üŸ»ybÕJ«V’Xµ’êIюgßtü`ø?w9åÄÊ%$V-!±r Ց‚¢ìÿ +¯aÐ_$‡DݝL1§Ԍ‹Wª–©¡'–ÆÅý°D N1íf“vs+¥?w:ÅHQ ¤Ô¬–RÔ&R´#Åëº~0üŸ;œbŸzLbEäöLº…”BäØ10^D!…XÎÛéôÁ› [ð j¢ ËÐâÎvv2ÞÙÿ•¾=8½¼Ë¬—N°SÀ<ò†Ú*75¶ +1«†Àl0>öaªŠ²qShIÙA¥º¦­Î»Ë~ÂÕx—4¡Uxe±4–;dÒ£5ŸÐ?é}˜ô“ñíåø×Q­AïÝüήßÚÙ_t‹T +;FèA¿YÐQÖUø!†å]¡3£:y7ÓÚ@˜À7ʨNÐÏK®ú€ê ´û +´Ó{€d6F}] clôÆÂ7â~¼ù¾ÿE@D4ˆ˜@xyw²Ö»g÷“˜"kêÝsBˆzš‡!.%ºÈfé™n†?0 êÃâa @x9åPÛ~lxó0Y˜ Œ +ž”n •çRAu¾8«À¿<ùD¤Z¢5ã1”-ò¨©OþÒ\di.ºYšØJ‹$#É*pˆƒ,ã?z¾Ø)儬ýbq¤+ŸJì«D’G¡´mû®ã&ïRzá5,~ïjšþÛJ9ÞW%ÄÞyôãxöºì'—v輸_9RK"úäñóg~¸ß\'7î7ê´á—ã‹òüñóâÜöùlöaXž‡·/.A+¿Ê?ï¿+G‹ÊþBBH¾*W>­¢+²Ää9ËL¢s˜^yžIS*[­KÁ ØM´ÎÐ6…¯ÚÊ‘Z£·è¦‰ÀÜ“¤Ö”Yøl…¦•Yfè4€„ì¦2„Âí¬…%I ífhW·h0f]™‡×ò®1™r=)¬1”Šn‘—@â-Cϩ׍*¯:ZìÌÑb‡a—©¡ë(&¿/òæ(æÜQÌUÖð]Ú>`þŠýb;”Zûá?ÜO–ÔÌhȆðXALƒÙ"3úxBúïLpāÚï¡}@_ªoŠ:zwâ¦õ;¦é}ð’X† ©V}•i–:%&Qº Ó’¦›'º;–žtBJ‡–HÉMáຆvûÓ5€xŒVAñéò»\°Yôú£ +€ ØûDxùâ÷*RË~Û[àëÿ•FÊÀÓ²C»lî[W«´ %Æ°yAŸyÙo]-•°O,ÓÜ¥€b{xõ û¾v˕#²ŽÊ;ʲ_ GFn»ÿ¹eûƒÑ»Þüjúkïm½„ÿ Â]ØÖAoˆà‰œç·H$OePÃd³óÖ¤BÁÔÈ­@1ô¯(Tª@ÊäfZbWW^ä’£î +Ìý<Á×;˜•-IîœÍd0s;OKØcÜwi¿[ cߝâ#ÈSçõq=$Ði ʜ£‡`B”¢‰Êœø)4(¶ö­*·bvôHZ€†ç½cƒÐћv³D>Rm7Œq)¢$ªáÚIy‚Ù^eÐÆc·Ç½Œ¾ûíÆÑ¢B< $ +}Gì¾eEq¼Hàƒ]‰EnR¤(hyæM߁ó¾/âûj‡J-”¾¦ø^K l2^zÚÍ¥ÊÄrb@‚Ï=ÍaJ$y’xÉimÃDÙ~Û}#×>³Øp¼r½£Gk@ŒÍIÑÌÂÓ4ã¦ö–'&‡¼ÁðtuÊOùÉÌ©TË +0<‹¢ÚÎ[+Aì\Nä@Á[rRv¥1)ÊH†Eý¦Gk@„ͽœ”*IӘ†ÁÒ³¨ã¹n'¿ÌÓʚ^²„-Ä%¬iíÖ±ýô|ôï1^ýÑ`'t쪴*W¾+\qhnzHN¯ñp… ëÁ½Äï£b¬ÐâÖ¦Ë2+t +Do!uÄã ~.â Tû¼Ñ1yöé"Mø)û'·F8é+¿•¾_ô´ï·Çè²íp›÷TàKèiúÊØ àßNOû¾UûîèÙ±ÍÔvM*ÝÑV4©†mUê·U£ùÙ·Õ§ƒáMý1ˆÊ¶Ú|“ÄÀˆSÁî;ð·ðIÊö3æìì4‚Á‡ÔN øgë`ѳWÞ¦ƒ¥“9:é%L)% +»Ufv#­ѓküÜÊû-T½ßB‚èR¸é›¦UÆS€Àé Cüv „î2Ø7­v+]5·ÀT*Yÿ¬±«Èî”öÙ³š]ìÏÊþ,w–’²ú̊÷ÚÎå…ǵ6Ý$…<õHç7™(ÐߨEšä+ž•€Ybæ øûðÑf]`÷i—™ØÝ{ü4>×ðS“„äG/zÓw îç£÷ådV^..ғáàöÖ®‹Eø“Á–,µÿåÏðïþÁƒEv ”âo¸>^÷¦î@Ò¹íŸèüòÌùÜÊ÷¼›êCç—òwžG˜[„ÿül»–ò/×kÈ5tÿË£y¥:ôÆ>}ƒzқõþdW›Ì¿þê—ç_ýá£ÿóÿ{åþ/ü¾úçÿþïÏóûŠŽ~?üþ‡]˜Ÿëß´¾>î? ìÎR%Ú_X|Yh^?®’ª‘¸è<ÿþû‡ÈÙª&ñÍ9Jå Pœÿòÿz…ÄßP!:µö9KØïñù2J'Þ$ˆÔ͊D‚¡„8°¨‡,´ðBýßæ®gÛ»ÀK÷ç-B—5“oÎët“k"C=´‚áÊ¡YVP"h¤X,ËJJFjÊ7ç ¨­U«÷n¯¬|sþ1êÊ7磰|sþ*Kӎ×*-ߜ?u3ÈEî\„~µÂÂg¿­òðøyçñ|6î¸%9ø½ 1¡åèÚˋi9y_^ž[þܵšV—ïÇ£ñ¨SÈÂÍøÅT¦$ +s$© •ý`- ;ÓÂHðSà±ZüÛÒ!fr–æó‹¤,4YÝ LàPŸý›'näÎqd§4þB€¯³'© +ÀS”B©øQ;¡œK€°GìƒG恲+`DO€©Á´(Bo?8O÷‚ ˆMð«æ=Ž¨ð(ÓÍè#ö⤎gdÌp*ڑe™ +ÏÝ,zˆÀ wÁšÞuǝ·«½Èò¼Ú{po#*µð¬îZτÀ¬dXÄɆ¤2jæ÷ f$÷5æ$“Äϲ=úÀœ\âyØì3W‹9ý¤ïŠœV™_¶#¹ZXS°!DXá¤ýX¤&šÀb0w!à!Ìˌ˜wºØ£gŽp/*’ˆú[‘DDVDL:I¢$Ñ"×NÉ¿›WÔM†´ZY$r±C€ÌÑE…“VùÃÓ'Á+›VØ §@ešG ¼!NFÀÀÉ +H 艡'¹»#™&‚ªîø;qq‰[ÛL‹l‰1 ÉÔ‹Žyfwv¡²ª”Tv·L¤©ð0µ$%iÄ´›)8:ʨc10ÀÿbÈ˜‰üúˆyÜ͈yL Áµsü˜·Ä%ǼÜÊ ,1/†!…y$U‘¹E+²¼Â<ãrbÞY½Mšxͺ¹Î”˜cñ.ÀïbPȘ‰ôöˆuÜɈuL Á­qüX·Ä#¿W uYÐ@!ÂæﯰŠi^ÝP ΠT•wðþ4—ÐÁ,xˆwxÀDÆL<à×Nj–º1iá™Z9úNÌ[âRˆÔ 2ûWèÜTtÆÂ*¢¹×$P½*ºV³ÈƒÊHßc‘`±ÂžóJ_ÀìôúX]D£,3mþ:{Ï£†Xñ›¾Ÿ‘ªH XS ÏsàëOj¸ä™GjNÌ<‚1‰¤C1¼¢3²˜y¤¶ñs¤Ø1fÄÌcXļæH$ÔÌzÌ<ß͘yD +?Ç Ì€™·È¥]0fÁ˜DR›˜ ¤\ÅÜ#-,æéjü Wæ³ÿóŽ@ëÈÑGh™ôî˜sÔǘuD?ÈäêÀ¬[äтòWY´––ߦÃâóšTÌ:R¹b֑bÆ’êƨ 3a÷"˜£‘P3èý•UëûYY¶ž˜°l‰¼l ,Û>Uµ½ˆ{’yå($½ˆX@ºSÄ:Ö±"Ö±&F0ÖÕ1"ÖX`] Cú5q€ß±ŽºqŽ(! ŒD¼ÑwbÛ"ªê]Ä5q¤õ¤4E\#Ý*bé_"ýŒ°Ò÷ˆc + ‹@Ha%ºéÅ·¨{·ˆ1Ñkô¸µÈ—ª>q‹@DWÎ…£›ô¤ˆ[^›Š˜E +H!#¤ô=bƒ³"’EX‰lÿވWÔ¹ˆWyõb’=Òè;ñj‘+U.⁈,Ryx=zµ(âiO³HÃ⧼ÆXý÷ˆY +̊@Ωì±ÝôâxúîEÜ" +ø)"š°†ïÄ­E¾œnNIü´ñÙÄ;ñï4N›tðŸt¤5ŒqZn ×ÐýÛ$N›õÑaZJ¢ÿýwøþ±?þ¡ú?útøÏá?üŸš9ô‡»™}«Üö?‡`h}0ÔÅAkƒ4 àæa¹\ Ô8ð6¡÷äR°fÜ&\.lÅ[…lêxˆGn‹¢˜\NŒ§Ð3FsìÓuñœp‹ˆŽ}².¦cÁÛFuðÑå¸Î¸Ed‰[Ší t«èN׎@mØgÜ&ðc­ ý x›à>¸þ©B[€²å‚· +Õqp=Ãë¢C à6ñ!ûh]„ÁÛňðÑå(ѸEœ©[Ž!x«XQ×2½.ˆT…6#ÙÔ’¼e( ­ &-€[„“¬@­ (Á[„”j¸·–×u±¦*´y´ NÍ.Ǜ hÎ6'xn9æT…6Ž:IËq'€nyªáÚZׅ¤ªÐæA)HZ +Kp›Àd.-‡¦ªÐ¦Á) h9<Ð-T5<[¯™ÔD®ªÐæ±+û\Mô +¡[įð¹¥VÚ8†…$-E±Ú>ŽUõ [ár€+‚¶ qEÚvädŠ”íVa®H§ŽœMUhóPWP³#ŸS¤e‹6á®®­çqM,‚¶‰„Eêt•Ç[EÃ"¹Êã­"bA®òx«¨X ךéÐUo0‹ôç*“·š-¹Êámg‘â\åðVÁ³ž5Sš$Å6qµHa®rx«ØZ¤W™¼U|-ҔdÅ61¶¾5Ғ+LÞ"üiÈo‚‹Ôà +‡· ÃÕ¸Âà-BqËüj¤W˜»E”.¨ÄÞn© Šo…¯[Dë‚.\aê»e>5҃+LÝ"˜Ç:p…§[ô‚¦[áiû ^P~+,Ý"°·Ì¥FŠo…¥[Äü‚Ò[áéq¿ ÚVxºEì/h»¦nÿ[æÓZ¦®®UøyAäΎnu"ú¯“òr0{כÌÊú2#‹ç,>aÅ,vájø§®Z’, +wÕÖBÀ/îÆ/ühw]W[Á}µßì.LßýløÄý)]µ$‰Éøá«ѯÑCӉ«n½¢Úß3úD˜"J<'.ajq`šL§ùµñÒÿ‡NÿžøÊ=>w<ü|=uäPaÛ¢ÒÁå¯|²Ü5u¿¡¯™g~ç(à¦øÒ ÿ:Ž *þ â'=Âߋ0NÕ¯;\Ê]ˆÏ^®àÕË3qôæñٛ‚b>`J¤¢p“CZ})Ū[¤Ú¥@,µ/R)Î/‘®I»™[ÞX>ÐU³Ð4õEt”+#¯–\ÇÊ®KPÛù•-5–6AÕl‘ +1ºŠTå»ÁWå_£_d€ÏoKÜ£PœÅq…*’zÈi€˜¨¯¹¯œT Oby#è}  ®D¹šÌ7e\êYÔn¡³;»ÌL7µ²*…$PçF¨’¹:bÙç/Àõj|ûÓmå +ÕÚÊêíoOê†¤™/ì$\eNWüލZ}–áóQÜè(Í»Fà·#…çáÌl’'üÕç¸Âg—/Š±îŸø8<XVc¢§¡þ[åºð[G¹‡þ¥§ô‘šÐ£ÐӘè“P r”ˆë†>ú+Üg,¨ü4Ç2a¼QÄ3$ÁÝEúÏÄ5‘¦Ñgÿ0> xsºÖ¿Üu*ô„岃£–époŽÞ ÓêGßîçi<ð‰ç,b…¯Tè1á„;tz—Á‚“óh‰Ï `—)¬]¼V¯jkÄâEkñ.^ »¯T›/…9xSenÌôh,¢Š†.â>1Ÿ†šgC4F'·¨C'wqí«L/^͋ÔñRWÆ´b¼ã®¾µ)–/äX‹û¸9n©/Á¢q¸‰VÚ/µh ‡‰}fö₌—ª¾“ÊʎüQ< Vñ_´â–ÕX_$uü÷Wµ6Y=ÿWâ>nŽ{‘ÿY5ʋÙÎá‚r£Žsޗ1”Xæ3g8ŸâN< +ÿ¥+?eŒX…i±byb“è£oq1•>¥‡Eu,ψuåÐö¡ØtÚ-ŒœÔ×u©·ŸUz}v¶öfØOhxÀ¥:ËðFí"Í黃Yù €/V+7©F·SŽ6ÜÃ]ô—:@ìL‰,´)¼'”±€^ÕÇ]fß ”KûB,Ѕ\ˆð&ôñ(“ë7¢3–Eªúk +«?úåÅéOϟtþÔù¶?˜ô‡åyzþ]³+íÐÙìÕÑM»I.Ðeš•:?JÒMsa×>É¥$–k6V?Ó Ú@*¹¬ºvÖXnR(pà¦8¼Ê—d̋6JÛ8I=»¡¦Åç*»Z¾e~J Ä¯ҟ˜s@(m²Ì›h¶?"ÇK¼ pðwà¯1½’a¹íEjN– tK܎•°(b²3kK( qì+³"©™g8rGp†Ë{²¿™,Å e¦À¦=‚ÅBçÔ}„I!]EEbSœM†|ý®&¸ý%M¡3ÕN,÷sƒ€º+ nH;JXÉ—‘ ¼¨º(tþÙ%Ð'¶¿ìfæns7[ælWES»“y \yÁv’¬¾HR^d‡í/÷˜H°\.às֎ûpʯT Y&Ñ!ºƒX½›Ñ#~+ šº{zÑYS Îp¤ÎJX…NË¥w'Ô£„ˆ¦OÐÖH®ô|äÑàmXˆélž‰H³£‡QëCFÒ{hߦ'Þ咱-Âe[û‰'åܞ,¯èQxÉI½ÍSײÞâY³ÆÞ©k¹ÊÚ©Üõñì¦ÊKÖ~W|ŒG£2NÌà#âpe˜—怛'ñD©û@Sk†Ö,™U~úðì‰=ž Éý»²§´hpÅÕhóP|¬®e–7Ðã çâè¯À¹¨Áïµ¾ª:Yªjúù7Š¹Ý –êäóÿ>ƒÂ +u ­Ê[¥U}µ ¼+Óƒ—…ÆBá¹sËBÂYêJp%\lRíõU¡T¹¯I!ÁyŒÕ‰ ` JÄJ¬~Rdv'°çWƒK VœU׌Hâk? «çÁ_„ˆ,ÛÐu•ôڗI!g÷Vxª€Øªµó¬‚ã. ±ÝµÓUCIæÂu ªjx2‰põ “f®5fCR‘D€eŒÇ´À¥!é@u'~ŠÊéŸúâ‡þØäKŸ™Òr€!·fyܺÅÈafÝÒعôµÖ£g«?ÌHÚb]Òãâúš­G±†kˆ M™ŸÜ€¸Ñúæ<¯¥ëÒCŠ­Q!ý.èâö©,t80‘jȓ0].ýïÍRбð*EÐ*ÚÕÀ+'/™–Ÿâ¸¼á℟'*§»ã=0 +v¤ÎâÑ:‘Ìt‹¯ßÃ+ðfRY ÉwìJ…°àÕF +ÙZ1 +‚ÜišàmEIQ‹ âtv#ÓJªÜ?#3k¯)íºtg˜eÃ4ogeôýÄÕ³@²«Ò¢€Êp¢Z“ÉÀøٞK)¨R$q(ûX¨"Úݶc硸jœ¡™¤.|>q6jž¡¾c'²† Œ™Îtg²f‰'X©͈ð[ê2Qᬼ]1ṕŽà~ »À)t žÊ®Ê2¼Ð Êô»ŽX;Á#M.æn!Bä>îÉX1¡ +¼¦ÂšÚ°ÈN°¤F‘ÃzvD…Á+'ð9«:9$½ó®iK ³±sKk8ââ=öU(iTW !SúŽÖ¨µc҂é׎H,A*`eçÊ_´€ºÙ ތaMa°nàn"wšU®åЩ«(kE–ó—`ÀžÂš¨.\»¤ ÷¼2ÁÌ;ï‰v©:'x c.©­Ãh å`™“Œ ’D™¥Ñ;©ÑP¸ÔΎš€º£Í.µSxQ÷ò¶K¶½¶;€lÊ@²¯é(È ÖîÂ.©?rÛÞÅii;ZÙOµÆ}²…aï쬮SÀ$] +«6õ¦†¤ÿp‚Žd¼…¿;2Þ ÄßáA»ïRùƄ—™Ç濃‹ÞßÈ#õJ>ÏݝH€Vº)¸ú¹Kø-î3Ðғñå¼…•Y@‹_|OÜ•<áÞ ½ø•z·ÊúÒ-Œoá)ОÒa²z‰q?b!âe{ /¤Ì7=šx¥Ê¢‰Ö⽋6[³÷ÖÞxº¯¬Ì’›è;O£Ê$‹g`Í åًŸ«óº2åu4ØÕùW3KUuJÞExŸÖ00gÞ«š1‡2Üp2xý£™©óï]²Ó½·vÌ}4 o¶¨ææÇ[EÀj6Pv:;ÀÏ +'KŠšiBÃrS»,£KæéPôЕUZó*zòf 7|͗ñր¢‡ö?æfu=¼¨ÿ‚ w»Êû¹âõMùÛ좜”ƒþõùÓñ»ùtU@î5Úy– 44rȄsVFƒ­™¡ð(E.S«'þòxՖ +k‘Z9´¼³¸–å$Vaäo§ô툾Ö|£/S7³èÕ  s»,~ýÚ@pYÑ澝ҷ#úZó¾L÷| +¸7Ó*exf§€[<Þ'Ÿ? îÎ;O{ïǓÁ¬u®£ßçWÿú¯š)? Îd.`·z'\×øsÂ]ô  wû¸Hð–îºlÑÍDNùÑrL )N֘Ìý‚÷1&]w¶†ÏaCª¢tB¦YႿ`Uôh5ؽÒAœ™­ÁG£L05³–ºÊwO£îdŸ«_wÑ:‰yF¨}1FUXØ:4<C*œœ¶€Üù]høÇ/çn©äFڎ\.i.¶(d…à:ȀëÄ&û×Zâ&pÆEc:¼ç·S–ŒƧ¨KgB»+þRWEE'*GÝØe¹¶?À;¯v'9žÐ³6¤ 2Ã}›hiF0HGÎSŒÅCÑáî5AŸñïâû”b¼÷ÄåÀPß ŸF›â„v¼C°G&.v‚#b'ŠÐ0)˜“{0]®¶0•Â£A[3Pô±*¡;N°Ô²D¸Ûza€ÑÏAŽuI;7úm|3 ²p±{B&eô:˜ÍÈé¨l„„~㽬*­Ë'u.ÏL_"ó ¹t”Ê°î₨¼BS +²Ã³™„{ce7› ¦‹ç ¸8UD3u&ä4h¼S1“àßߊK¦†“>™]"J[[[uHa`žA‰»ñãûºð×9È.SQ¯—ÌEz¸NS¼;;CÒéd¥sû›óZYÎÇ-¥8>k䀷”h®3[É4w¼} ©ó%–kp\rI²Á‘¸¶²Ín¯[I7ûÜVòÍê5ÎAÛË8|nIÊYhœ³šìV’Î>W#ëÛÒŽÏl#ïðØæV¥o#óÜ|ßFê¹E¶•Üƒ0Oäð6²N3·•~p®uIþº$!v³… Ä•!Z’q´Ä{öðò¬"w…FÛƈÒ20sƕñ#áB¥N4à N#jaôè©SLÑC]P¨4~´„<4™O=ŎԀ¢qdaȖAQ/é<]³kÔð$cø“­ | Ðèe."·È›u? ¨FìݪV¯áSVúTëxví¤×=ƒ¨VÑQvAf9zݍDZ¥’ŸÜ¡€5AϏ^M£™EqtäáhçÅ¿|ýՏ·ø[î~{5œÛ_^üӚÇÖÄ#˝ãÉ|zÝyÑõޖ“ÎËÉ%8í7üØq¿žô†ÃÁÛIïözÐ÷MßXN?꼞.;G´ójÖ}´Ôø»Žíñ·õX ±ö™…ÖOŽa¯mÒñ3v–¼YV_WøëøzXNgƒ«µ»/i+Æ(z9„ýèòê +üŸÿïúoùòÊ$u/·ŸñîÿÁsþI;†÷§´òöFäßõxÕ­9œ¼êà›Ö +=˜Gú/pìQÇ5 ¾#ÁŸˆO|NrV-÷ïx©9?–¿R뎨~M—¾Âa*»·¶`AjûMB¡È­J+/’•¼øC[¸ßì(žÍ>Øûú«Gá7Øh¿}<ü0öϝ}×yô£@Ø®=¶{ñû’=:ß܎í}:Z’ñ¹“ëÞ`ÔqMØEšù6„þÑσéÀnLj´ÉÙ¬×× +Éqo:èW0LÆïÊ6($þ4|9ñÖXù°lÏ^—ý±Ý/ñW×Ðs£ÓÂJJá£'åUçûÎ×_u¾p¡fð}_Þ±úAçÑ«ÞdVKåÉxt9̚¸Ðފãëyèg^ò„únyvwþ.ºÆGÔÜ' A:~š±tn[ù™¡é¹OÈaVš–?¼/G///[pþS³ ¶î$W˜lœå!d?h#ÜM¸™5ÑÑop¼%7/”y[_üÝòh=·¥ÝÈîŽcˆo‹µÑP¬%Ê>óÃoeq?"Š‘‰ÖË>HË;éÉ⻝ÔKϗWWÓröŽËJß>çhn'Ýò7¨±äv7¸5…ØhUŠÑl>y_N¦ýëAyaÝ?uN-c~¸º*ßÙwÍîöI&ø'—ù«¼h»³í=„yöP)lµOuÒ<÷ª³ÁÍí0ìU<s¨«©i>BŽ©*>bV¾²kpÖ¤sÅÆÎAf³N1#!ÇóØ.O!$™¨«ÝBZ%©øÔ=F—øaë?lý‡­ÿ°õocî}”«ƒNpÐ éx +îobõ[ÇkÀÛ9OFVÖßÉÖñCÿ]9êô.&q9ŠwŠõƒ#º"Õ҅ó:ßBºü|ºf1œ—Þyù1œ9¸Ó>Z$åû¡WÖð.¯aT±’Ô$h&R'è6§`&*¨å±øw‡ên㌯~½ƒ]óopH¥ìüµ7š•Í÷L8 ¬sÚ3_oÚ3¿\YVdÙA–=H}d§¤QÕ Òh¥4:ö斒ËñhÒ»¾)÷$j¹ b h¦2q—Z #MáÏã†ó™FK¸µ)Då—j +;ðjfºæ¦¸+‘voÒIfà¤mW™g`‹¤À³P8D¸ÂƘŒJ )²5Œ•QY–Á½vNimDî§Rjd@AÕä4|ZÃ!¨˜üdò çMWI¼6Ä»Fñ 40<£0¿L¾Ñ5 ‚"Y’C¹IÓ\`ZaR*D`擄ìB”Z¯áŒºK¶|'áý-Ï4Ó)æQë¯ø†ºNâwS7ã,ßM¦ Ê{Èæ”k8ýI'à'V\,ÁŸNuy°Hgi^À$I“Š¢ú¥éö;¸&S@ +PYS(á·zêd{=u¤>̝ÖsG©<‡OBŽ¸›8šƒÌg9äÚù©Vγßóæ³L›ƒ'à™hc?ÿ»5'#μ» Làtª=ç!^(Ž9!©’Y.ÚîˆÂê£Ý´H¾¼c‰È +4˜“B:ݼ(2-)A1·uÌÚáÈÍ !Oýk åäz2¾ÙO9¹k)hëOŠnp·¯x¬Ûܮȼô\ ÊÛÁhZ?*×òѳ—ÿ|m§ÊŸ: Çy;›èzŸw„›“ðGœ¥EBNþÇ£·a™z¿? À¨œ:׿&𓁥¹ï»ðø“òÖ®éËQþöso2õ‚+½.‡=˜ÒoÆøÛ"y~ úã˲EŠéëå'הL¤®ûöÚ?QHÜZÁæq=øçöêÓ;byø‹’>·éqŽ + ·Y«Ó…6øA'"ŜTp=ƒ=êÝõ‹ÖMC›|»Iøý‹N¹l8¿}}'áËWW½Ë'¯·IB¤"'ÿÍn‘ŠÖÌÍppƒ(nWyøøj:k±|›ÉGl&rÏ6¿.ý͞kÖjšÉ<;lÛl㚟eËØÏíM1(].ëJ—'Éúâ宐÷>žv ç“èÓM"é܃œCú~NmíÑø§ùgþ/ÞtÖ¿.­d.ӛÿë?ËQ¤Òì¡gèàAßàÿ:Á¼A9‡ïφã_ïЬ®£ÿ•¦f›òb8º¬úÄ.†soÂ@©@2(o{ýïVˆáV—£|Œ ~Úºžñ óiùêìô˜z,22Ÿáp,ÜÔ¿Ýö¬P=.¯Æ“²ó³µÀwÈRØ™<콝ö¯¡XÝ!ÿ÷ ‡²~2ßvή{—w'ˆ«‹§éÙb/¬úӉ“­ì¾»O~wB™]—½É»j£÷ådV•†·½Ëǃp?w/ÜÿneëÈΟË4(ñӉ|ƒ8¦wª%YtVÕÁš¤?Œ.£Š¤›K›¾ê K»¯.š÷ûÛ¿¿êM§åäÆ®±rôï¿ü¬«þðõW¯úu\‚£IÿúOú¹Å’ÙñkÏ.vÆ\_òëÛ×ώ;¯Ç3~E’ ¸÷È´Py‡,Wnþ¬^pûLš ’Á¸ 'ÿú¯·ÔÂîV´®:u‡4¥ðÀɇ^hŸçi†9«&+D•ì í့—YáŽÔÂýÙþö:Qmÿ¢÷Öå=~Dd…%H5ya0ÉC)VÃ4ʟ²ÉrLÉtÜF¸‰2LR-ºÄç%9ÄÈã5-5B-þÒÉ#5¿> ´ø@Ù_77Ú²‰oXyøå¤=¸,ˏsӀ€TðãkDv6¶/˜4@å®Dôl<¼t¹%QqS‡luR{„“×]KÿÔºKŸómi{üöÙ¤7ŸÎæWà‘Wo[fnC‰m“R;eJxkye†|.9T;Qó$=L> ³:Ò4²B9Q—ºsðV& ØÐÖ´Â þOJ#¨,d›ÛE¦Sƒ–¶¦îÚv£ÆT=+â\÷RêÕâ×àbÁD¢ØÊsT]´™cŸ´{:n–Šÿ_Ñ +à_’A–YýBáöbªÐñ‡Äh¯_Pç?n‰M.ûoÒ +s¤W™Ü‰W»-i·«[ÕÆø.«l—ncÓéâviMK”ÕÒ†™S²ìè;cÆPÇ?Rãö`Ô\L_vëÊ°‡t?ƒtêÍíœÿO“%Q¨aÀv`ÿ V®táî‚)Î?«È›Ì›\ԣŬk$hgÁԖ±%¸]9,4-QR0Ôöß°ÿV^\õ&ñ +ôS܊|E‡@ÉĊý¢¢f)kú2R0í.’ò€à‚AµÊ놔 éòÔqJª&ÒÚ,©)nK–UYê=%+i­kŒi×7¬ ¯ôX\ðƒJjÅ&rX$ЕÆ]±kÕ¸3-©4p¼Ó©§îšw:ëYí‰ÄÙkÂ2“VhœhÒ8AˆÌd^y¤c£‘šKüɋ0åá{uüoìekw§Ðé`:«ú"—=ç듾®«T³t¸äëpïëøÚ¢eŸ¢ëі7&‰$¾UPýÁõ¾7œ] ÿõ,çã÷î²¼7½‹ÓÒ¶(ì§-›]”¨itþtün>à«ñíO·õX jq9þuĀãrW®Êáå9ðqP·Ž*¿¤g{³ùÍ›ÒÓOCdÖë3dÔÙÜ6ùû­.³w½É /¹úa0zכ_Mí½u¿¿zy&ŽÞ<>{ó|[}™<ôxUW¿[ºÆгk ëýäy2îÏí(Ïlÿ{x$Àc _nƒTÑu¢ÃÏÊÙü¶sÚ½[*:–ÉóÛp7¤‹Ëòò´¼šýÜΣ›#݉åýãIÙsÁPÿã£Ç“Iïʞ˜ÂnÜîFüx…ž»òõ|XN^N–¼…·øüÝéùæüÛÿ‰%¯F~8á´Å¤_ðçûւhyõøµIc×þøgC7^—Ã7ã×®®K¯ÆÓô–þÑ#+SŒhþœ½pá›çS»Ò.Æv­?)¯zóá,êê÷ôç[jƒÌ$ÎþòâôGKã +ÞÚ§~»Žlƒ#+7&ƒ‹ùŒ/ñ¬ ÊgAsGo‰ÚY}Þ*Ï%MšÓô3ü3 —‘~ûÿŒ¦çï{“é÷Qéú¸íûhBãÓ GñøPË?>$VÆ£² —†c+¸.±‰šÞåÄݞÀ‹ÁèÒvX4!ÒÎ+Ý¢l@hÜü.'ÅÇ3E¬gJ3V à>àF+£ÉHßûDh/þô¾¹X€¶»1áÎ¾µóÇ7; þ>éýÓ´{P…ì:l>S?Ǻ9ƒ ^v«?k)O¯~݁ù½’| +W«?˜±—™ÑÝÂ^³_I÷¯ƒK8¦Ú`à}˝ßÖ21ÝBäÉûЈ´;¶¶&Kg ú­Ù"Ý‚²Üt $¥l"뺼½n´pӝ Ö•”]ŒgVÉÙî h\~hgô ”gãù¤_C*öÉÌb+&5?W8ëMޖ3«i€ÛjúüI£ ±üÐNLÿo_ýøLª§ãÉMoÕâ­Ð~5–k[W©Ž›?$B²QjÌ&½Ñô¶g1ö›maÕvcrü§øŸ&ãù'ãáx҈ڸùNкyD£Y9öú ÝCqó=¡p4~Ñn«ì •W˜ÞßpCãÙ¿7KìÏkzWw¶èÒøv6¸üŽ…Avªc֚߉~ܔ³ÞeoÖ»ƒÎݙÿqéÃuVdÔúµ"&eì¶wy¹(nðNš*lz;ž-ÂzÃ-lC"çòvÐõ0E'¸ÆÃIèÛãçÇóÙ¸óº7µRcðû’PÂè$Ðy7÷ߍç³ÎÛÉ8ŽKÖµLÇÃÞ¬ì\À!ªòSi]tn{·å¤3Ü̇¡&N˜.Фçƒn~$³eÔ VCl¿—Ó¡¥’ùJli{7oÜöí¤äI´±qÁ™Ö©^ÝTÄ}ØØ6îÃÆÆ¡"Kó”›R´ù¤7zߛžv‰ÊP¾š”Órò¾ì@ü¿óÃå`Ö» 3Òö¾]ñÖ³Ÿ1eÂ4"œuâ8p85¼(§×<qFt^—vͣɑ&•G^Îg·vBnx¨; æüBð<úùÍø6þ‘=Zφã‹Þðuy;N+“•xvöôo“áà¶ófÜ¡`qíŽÑ؎_²l0T7ç³rø—ÞÌrötÜï ƒÓJzEëç Ó=Riÿþ\ÐðjR¡ºI7‰äÚ»Çϟ·CSjÑþJÃ!MfüÌze¼-1ñà™]ˆçÈçgьMÖ5<®_µm_ǫ́¶áËÛ^?ÌX¥×6~j•ßPCm]sð“,µÎWvåçAù«åæ“ÁtÖõ遪\bNÿbâÅâóg³'/4àûÓáx<‰Ø¹±mvbÃ*;å +œob·0œÙªoLŒg‡Î‹\¬i{\Y°,¨²ÎK˜Þh6è؝°7åÕـ»vE-úRÛX97‹&çš^6á%ºÙª33’ã^`Âòûÿæ=¸Óò=$hWEIýa)H¯«Úž”ÃáÉxÎÓI¯ž¼¸4~øm4˜te[@í'k° *Håjvýel%ûxô—Ø «tnVM,dD<³‚B!äù™UžÐ|a7®š/‰æ“Õu†ƒQٙb„iÍì«k=³ûå"b+G_õ&®àôՓ§PWÂ.êʆJ“¯Òö‡›‹òòÕd ž©¿–Öâ¤v.«R•f»ô¯—P6G0v¯†½Qéö±X,cÄÔÉϽÑ`zm'zŒbÕXܒ:y·„ÇúnЂ*OLP)8zoßjõ!»wGÂwÕ[ú°÷Ç¿þÍ*Po-+Y–Í£Âγù…]rOǶC¯AN–&#M­aÏÄy[ËÌÎS‘mÆkÖbe…­Ý}ñ¬€3vœÊ>eŠ#`²:T¥ÿçV@±<¹òÌ4œ\^ëá¤)tCNò,oÎȐ/ù|tYþvVöǣ˖=L¦›^„e͈­zŽIú؁fD ãœT•á~»Of Ÿœ­Ôt HþòæÅi‡œ"gãSÛ ’žKûvÝ#gv§EAz;ûc9mðÌó›ÞÛòEïöM%ð¶²ù›'ƒXue‡’ Ѓ6™)j3~/œõ†ÍŸ±JûlÐï ›ð +KXT" bÝp<õ‡óK°¦ÇXV»}Ö{êÔªAó°ƒe—F`DÂt2Ò½Z=¥jGbÓS”U,ŠV¥ô²¤Õc”‹Üôevˆ*öz‹W%ÔÃvüÈé±vCf¶{LÇΩ ¬X5Ûf „7²2iöŒëä +ÒÖ?ô¿’„'dÞòÁUsrãƒbÛ®¦Û>¸<€+ù_;‹ŸÌoíà9 —×v°ûoaƒð2¨óˋW«fĂ ã~ôfkÙýV/éâVŒ.Ç¿Ö‹ _øúT¢Ÿ«úþ·ÇƒáeG®žÖ’µ¸o…64é:±:³ÈÖÅ'ܛܥ ÞKjŒ‘Bo~O-ÅQ£â¹]ì­6x—æZ`×Ré®mŽ÷N­QDÎIÎêøöï/ÊËÁü&òœþ£2-…ì<~¾Ö•[uÉ@`|1Á¼ÿ±Õ…Ñ]zâÍ­×Usk±íKo^Ÿ­4Æ+ÍÞ+<6±s?úÙY†Ç‹–a¥íËEss3³Dç‡Wg-¸­7±ËálÈ/×x3êíVpÌ5jÈ2q‘g"ûŒÆÁ†ï FhnÃù¬ZgxÍä¼~‚ڏþ9¾èÞÚY?±³±cKíàÕ½ápC³é»Áí…%4 +ÀÕ¶›”pYJ ]œlhÚ‡ADՄP ¨N²è™ŠüÁˆpüßÇÏGWãNä÷ßÄñpöèoåÅ£Ÿ—åøы±ÝÍþ±ž ·DÔÕMl©ûÓÙ°{éß!ÌÈ ,‚çüQصÉC·—7öçá¨y¿n/›£w'=Â#uóáövâÛ­é4ò ¯j¡»|“ËbÓ8g:W¢›¯jXIj-ºf%Æl“Ý¡µøÉâìÏÆ´ëè\oD=‰:’'ºr’ëÛ»TUŠ'óIÿºófR.¬¤µœŒXntݲQE/¿°¿ÈÎÕ­*¼\ƒl;ç× [l·4)°F¾7ˆ›Ër:x;Š} rì¸ðùµkqbKt7i؛^ f7½Ûæ¯:0Ë´'ݛàº_Õ¤?AÙYH•XG4åÍÈÊú>Éz#k›O.»ã \ÄЫ†—k[^Ùݚ äb$¹¶Ù­?œ¼vbà‹ßv×OF߈μEëÅfSz1¶ ßo tÚ¿ö?¬c®Q´äÛ\l4³Rœ-²‚Ê÷«xۀ¾á:nßÞ¼ë–#ˆ…¯×ÐlÊÅn7Îelïä{´Xšßî +¹ÂóeVÐ×@*ÄeG1q4‚ +/$@¬0^ÿGNCÇZnO¿Š:%®Ší¥3ƒ§˜¨àì¼ö¢l”×ýù8MoÇ(€P\±O0¿ÄU{Ü,äå,…ï‹ÿš®Þ§X™g Ld%eûÊ1UÇ`á*:S6“úU“êW(xôâW|X”Ñèj`ÔÏÔ@£q[oå`˜†ÀëÊÄ.Ã6Ë ç‹6¿Ûç“KKXPh•Ý 7왩loÁÊyØñ¢°µÔyÞÓÙCM2.)lÚ8 w;¥–$l‰ìãINŒ“j˚ U´¥n½ZÈÚ☶ÙáñԞŽ`Ø%k&XLÏàˆ™<{f0 +xÌñ4¨Þ̧›çÑt±~®ïÐEV‡Í3x9=<㠑ÜÆŸ{z»Dë뀵<þ=ÝL@uÐ9pœ>gð®mÏà=ûö™êç¸ûïÿ Þ·Øà@ž·ê¿~.ÿ³=ŸÏœ†ëõó¿Á¯ÿ§ã9éx.lÒH·£†¢[ÍÖÿý¿ásªø0ªùÿ?«Ób>eF tüŸÿžŽ—¨5”óf4]‚3†í‹Õë# ~|Xì”X$oý>dYŽˆ(‘/qS™ÖÓ9¼‰LVqà #‰3^åæ Y…ˆiút¢‚¼NÄ4mk|Ĩ@hfHUõh˜*"×/8^ +¦c!Ûxß®¬"/*£^d'.½2£­l7Û1¼ kÿÞPwÆH²nQŒÓ§:¶{`– ØÔpGå*,¦jpLÏ9’(ÐC‚Ä•ÃDE%–õ!_ÌÐø¿·‡eRI`~ ŽÉÿ`žtˆ°¼:£>SB\‹à1÷WKl¹K‹ ï®Øú °)¤t\,ÏuXÆ6‡Gv¦p´Ü8‘«81Ú²ª*&¿ñ¬&‰åՃ=ÜØðpÊ­ˆö>¥¥ÃèG½,& ½]¿ä*cjt>³‚吡´ŽÚÓb¶`eùëˆ@ý)ÄG«¹\ÜQkôãQµQ$–KKLŒÛÑð¤‡éá6~Äzò°„‹™^µÂÇ3¯"i7À/Dâ¹TpmÌÞ!fîÂeaŸçt²§"MŽ‚ÉU!‚R7„ëæqŠƆÀÔ.-OS8k\Þø ‹ˆe ^6~ÏëÑf¸XU°)Á醡Mb€²é?²òå5†r嫒\?(ÃöÞTûœ1±H(Cujšð¼“ï6Þ©àSŠ¨íé5ÌR”ÞÃ@kNg©Ã*Åꨌ&œ\0Zp¢ž*ÞôνõĪ†Ok¤ýj ;¶¢ÛPµ'ã‡Üú74ßhŠYÍdL-†Ž£Þ×Ìg|ºP¼™‹V<±PùËX‰Îc6ãª^HGGÇô_zn#ôñpßa‰Gl»cüXr9˜x¸¬90­Š§ä<_+Ç#ži=µxŽÓ‡q~«<é€þtö%äïåNé¿ï¤§g·%ÖÛò1Q¨Ÿ~­QŸîœM{ôíäßÊØ`Ò3¢8íMïÎü­ÚçW¢‘r´¤¡âíBßñÈ2ûkkÚörΚr“ƒð•ý랞}·ýÉU|Õ Í’¿§Ô¯¿Gò0òcHÉò>‰ÛTG`ÐÇTÞ߂O†}º0)h’öÀŸ>Q·ë6Ô :ÃÉ€ þ™¬ãÌØ[3¥~=ƒp$ñâ6X“o¶kC®‘îõݼ€)E}\–O_ÛWÛ@TE“K³ÏNhkR&Èo]%íF Yµw€`|ðEõ‚š0ÄH[ð /Öh6BŠ´3%ª}ʖù¡zsu]@Áfl®tlþJwÔ~„'o}´šìˆAÕ¤—Z%‹ì¾¹!¦×ØjêAϼšdz€Ð xLÌãëùþƉFúϚž9KûÌphÔ'}£f-øþÒi&ª©ä{zV_ìãûïЀIzº…ОoÒË Hk+éé$ªÙô_{ZüùœáÙúežMÍ,$ÀaôÇïÿ˜l9€ú~]JT˖R6mž”(ì0¸¦¶$ÓÎQ³ÆZÃ=5¥¨/0Œ‡'m¢Q</''@.† f1: ÓUì j +¦¹dz“—¹ë'KÙ¯¸ÑAä'’M±Ø¬Ém°/\/>rñÅeƒ"ŸØïñŒðgƒ£ªXÎ%EÑMĺ ÿdM³’#AD=—YߏP#ácÄwþN³&ÃΜúõ},3Ö²#ËÑ+ØÝ-b6õÌj쮵LNgNÍ3GxÜüHø{®¶pÞó«¯sm.c·‚bË\NK)&ѨL¬€ÙDƒéd¹»/jŠµËuý3°y2.•óT.Éçôž5¿¯ÂÙ´·ç²Fs?ðš}nj`^ãY6“öú“>{µ…xƒÌ·ljÚù³³$ÿN“urµimßŽôQ²²ì2¶í›+k°û?³_#øÙ·!鳖iÖiNόyïö—b‰™V'Ïpt¡ôÝpgãó×ä÷?é‘緝h¾Œüv†ÄGãsø[Ù#ˆ»qçÃ5؉HriÚ-²‘iÂX}ïÃ2ÄÑÎŒu“Äèœ1½îÛÜÉ#x ÚtòÏÁ§õ‹k¸pœþ=Öy“äyõ™¨ÿSôÛ`â'ɧ ÉO ðƒ²!Iö΃DýÜðpoQcÈÓÀ“uü0¨%Ã7ª­‰US¿¿4ÔÅe3F”L»,ø3I%r’ ŠÝ× õ‰zaŽ}€OCæü_@0èGèqñÔ‘sЇ©Å~D}%‡qæ+Ãõ‹ÀP?ƒ/ÌÁwúù—BM(0i¦ø=ŽÏ¯·H7’Ï(þÖԇð×fšp8XW“$†›.ӊêr9I_Œ9594Mø՜¬Ó¿íé+ †é·,Ò,:Âê—Á~ñTP¿,.?xG¨s³¯Ê ̚C ‚_ìß º£aŸ3¹Ëàí¹a‘A¡¥þšcT FP'~Õª^,iOSf?DšԎŽó „S£Rþœ½sMÐÚ°kÎÍæ.@]¡¯ ®eÁ·…–´Wö7ŒK“cÀ ‘ A|2; ¼àö 76D-lo4¦ùØt«ˆ‚˜YW_y_à`) 3³ay(ºG9.Àß·•°?ƒC,OunßR`Ěâ¨åáU와ðÁ`ËÓô³¤sŒ °ä©z HábkŒf6/KÐb£T"^ ‹HÄ8¶Ë° Â4C­`A¿ø²¦%Ñh•6Ù¸qÚúÅ̅ŸKÁÄœÊórö§Ò e5Ç/1…ŒXa×0@NJ/ãm]sžZôñÌx¹7Pg&&»xOïÒj.ãXÛ2j”%=·›c”¬ù^0q‡)OÏ#tñ–ÑLýž?zéRiŸÄ§”L›t5^ïF@[“`¬He ½«AÄþ“Ýr ¨·N­ù(À­]flk8“>›ËŽ©¬dr4OO-™<&Ê5Šç ‡†–ú¾Ulº¸Äôb¨XWÙíL¬ÐAÇ~fß:+_ 80;P¼=N#‚ÁÕJÑõ ®UŠ®Öˆ Ô çG)ì<Í»¿ä4£ÀÊqÈÓëÐ|YÒâX§˜D’3UtW|m†¯Ð´Diÿ€Bƒ”xFËAÅ£”ôó(Y‹Z’µ—ïÁ‰bŽô‹  +WõG}%Gºðç +0Gã?±ÉC‚n­ÊDµYd¶©p0Rº …Ò¨Ïga÷A.¹òÍ?:'ÜbCVÓ¹åËì³ZšUÆà“í”ÛiGÁ 5ìyã÷[–Ѝ"F5Q_Å­à·ó=CŽ?bUW¼© ÒjrÃ2øZzŒ®ÞR—úý҄À †¾`ŽRrY±íç}æaf‚úH?¹t½j¸w,Ù¡ÉzEÀ¥*ò4t_2É|9ØíæÏö¿-ºlfsþq½×Š¸lzç'ðËÅdí=þî2w×oôPÏݗDí­Þ‚ª>ó¢ýç¦)bk üËóè(ï«Ü±:=ȃ`Ä ßš!ËlüpømB#d¨ÒŽ!a"þŠeŠ˜S¬óê.™OzÎI‚´5Þ:|öÁpÉξhxöŽE¼ÍØâm1Ÿµ˜m°®6P¬l“ 8®>²ÙYó §ëŽGFýM¼]³B¿ÖúˆÁ?D0¡äíéâÁò# š €Ak2Qª)»“y½å¿Ôlc—/a DÞ6†‡ôåNvsöOn'‹mcl$p-t;K-Ž _zfÿ²XfŸBýñLª*¬ X¿5 8̙mì&s©Ò +5 ‘Í[ÖÜ}?%J]rÂrè×ÒÛ$=Ym š´é™1F¤Sy…RûVuP†êÌj¿zCÓÔFUþݙ\9>HÐo}ÃÉ"¡·fà;3è¿|RƔ¹&¾OöMìöËRàÁ>ý @F°Ï yfäì-ø’ âߟÈt@áå9 ªÊ®Îæ ×Ôqg¦™~u4Kòž™93¶_ )XÜ° ä¾[Äš†ta½øLz[G¢fyŸ'>Ölî%÷íO.ÉÉI/p{R uÀ¼:ӅϲJ ¨àՑºØ𠃾žè Ýô  ,¹ +èmé¢ÉlâDZ¶˜¿,á¾YƒÚðL_ÿÅÅ&ª«njÕâ›áç\¯Ý ُ·ô§ º –y®ñÊُ¤·á°s/(0jˆÂg.B÷Á¹È^\ù›ÍB c­d=["›îæ-b“ãµóZÃßÛÏ/® sHóZµ,þ·q¸*è(<훗Ȟz›‡Û¶G6é%uoö;·>YŒ°ÝÅlø„D‰º#8[*¿”Lóur©·T+Æ +|4-Q>•ƒæˆÔû°Òñ=&6ÒdA8†Û;ä”·ô:8ÀF-ù|¯Ù}>’^•½œ€L¯e_§IÏê?ÛÔB«÷úöT›ha+²¤NŠðªÛñ.X™9I¸oª¡L)Nîp±œ[Ä?؃gÈ¡ã ÿ÷ä-= þ83½éÉ @iðï`lY ßMl«½@Y€1 £'_ÜðÁ°bŒŒ¢¯>·•—‰L#á~ yržÕŽ%ŠeЃͣc-•øžgSñùG^ÿJAç2!hE7IXþâ­Fa˜¤OØp_Öiã¡ötìÌDÊ“q™-hÉ-½ÿ +¦+9WJþãF{‰äV•µ5êÏåãû^¸Ë.âГuæ]5@#†xkÖ8cG}ÅsÚñ1±ÇCoKLr>mv“¢]Bì¾Ý'\åä†<Ç +g\9§ýÝ´@Oc$_=§óýã1me3³þ¥ (²»O®«Qï%ÑÔ´àD[ö’Ë0iÏ󸆝7Ð‰Ùۊ…ã÷Oî%«)źþ)=Û"tçèÜ Nljs_n£o?´ !(zeõ¿áò.Ó¹èËÈAe·zG¶ßpÖT˜´¡ú¹E'=ô¡"q¶ +¦Ûb2¼‡pHJ¹?´oȤhã±e<ÝéðMÉHGàÓĉõAm=_´éÉ$¼öR ² R5Aãìg] Hib‡”6[ÞdÆÞ mw˜EðeLøë•,X‡î{b›˜]° ¾@@¸ìÄ*bªXݟ‰FàQµe娀ámÖ@œÀvnl„+–­Òú!2ãîÁ›Žçw{¦±m e=EP¹n|…ÜšHä°¾{œV÷‰œ^åìwråë‘¦A;Z}Ðãᷜ!ëøÙg‘;WÜVQɛ‰äjµûêùüsù=׋QfDDŒ¸Mwé£^$VÃ)ô•è ‰H|l˧´­ºŸ0Ôò̎œ;oCf¬õ}CJ«¯4‡l&ð‘0þ}þ£ŒÔéðlm0ÿÏÇ‘RAðïŒCŒhhý†4Â팵j´öíbçÓ.Zû±¤ ³YÐíxd•5SÍ +èÂÞê2ìå}ê-ü¡˜è±äx%šÒ«©fîBõZ՝ ](B‹»L«ì`åô†é[Åýy&ÈOÐAoϚŠöVŠl®áiÈ°³þ0ã £û5-^ÆÆÓ ÖyNF»9vH öÛ« ó@ÜáÙyz2â­%íÄ~ÁZjåøöd°$ñz6ŸÇWˆ΍‰2ûrŒµ„ + £¶ )‘J¢n‹ƒµ™[6͌ÏÚA"`wh!AQÑ' 2p>m¦IÏr2ñµšß­€?–ʧ~?'Z¨…i㑚»Ÿ.•"Z֟-üY8;4dâáï&Gý5+”\¶ý0ýÞó]âcåmóXò°?š;Út©èþNÔuɝwe‚ Þ{þÆà¼íR¯é¹×§ØÎ_ È¢{K¨I–}6’ÓDÉò*–M1ŠæiGZçx7X_ã~m9€‘|§üõÉ6’ÛéûvN`B“ɸr -ïɕlä:½Î¬Í)ÉÙÿ¨&oýÑ9ûó}þ…‘!F¤<Ù7¶†çb͉Ó­áím°ôM$Íh~dY¯Ë¾kNE,„×o ȵý3Àa÷°¸Ú™ÿ¶h4ý „>HƒÁeü¯ &¿nó̜Ó?mpfíˆc‚ˆ¼í0C*ÂWÒi¤- ç8b떒‰€­WÄ°Ȅ¸8(À>³@´è—2Vrœ¨–òП;ïBd¸xcªiÁY1ý ÛÛ¿´3óD³àv‘éwù°{W¤ý¯Yýü£™M9û%ÙyÖ| +o3cŸÙ›¬˜Í ÿ¦P³ +lؔFP²@%kT­ïeìÝÀ<éi»í ,ú¶y¢‘>Z|ûÒ0ö +4hо"$ ۋå5< +-_Óߋ®‘­{b!õœAk©>ܵÔo|bOV©¶@ \µ/]ÖTJï=ۖ›¿@ÀÙĪ©Þ̨‘ñrl’ºå‰üYºcJ/ˆÌ/(¦ˆãýŒ=-3üù³%61Í{öÇô킛â+]ÔÌl€tçƒ~¸PÍøBæÌfš¥eG@p4ß(s(ü™„/ÊÈÏF?øBºoUÑPÞàÀš©Xƒ`Zm`/5Ž™q4zkvú`3ó©ÎÛ0°<4è;ú‰Æïø‡ø¿¢OlN¡ ^ô\Eé=G˜%4drB®’„ jJL¶£)ʓjmóáh +o5ØR …W‹á}`A‘JYrbѝ‹Íru<9ÆØÝæ¦ÿïÿþ?þßÿS>X’þÙq|˜ö‚äÊÂfù\^OxV%~{ÝðL+çÕi±[M‚‹—ØfõVî}>D¥‚‡éFš‹­d›Âš,¥éá"A¼jL×;ì),³]Nåˆþî¿NÕ vٝ‡û%ºô¿´ët0Æ co`„2ö7÷æý0/Ž"ù•à]ç2£ÎÒ +*j/¬‡EÅEŸ¸±„E(" O™BpÙL˜ìKHºè)I’Óùb1Á¼|úŠ_ʼnG¢Z£Þ¿5Ö9 §µb·Æ~OnøÉå‰ÔBnöEý„^„ݱÆ) $ÖÜ2¯ûxB3ʾuY_?|¿“ý礱 &]Fc/ûû¦æ×Ø~ÿz›9ž×Xkš/IÿiÒØ*œÃ]j¬ÑœÆà9ºõ54O¬ú%ò?Åg€RL¦‡ä9c­”ÛéRASgÞ¦¡ÍÌá謗šn>ZóoZâP=æŽ5<®VÄ Î?!“å%¢ùá Bç ˜È±ˆTŸNςP»_D¶‘¬‰ÎU›ÝÁÛD_ª‹Ê‡Øt‰œn[–„j,–=) 7_cWB5#¨O([ZmÛýâ=Á/=ۋ¥ é£4Ôw£Q@Pž†?·BPÁ®eøP¡¶|øn>8À<¨¡·9™;E¡öí7I¨~ç¬nä BJÃG4æÃ1d=ŠC}÷÷2¾€z4F»¤T/’ÌÆä4'>]ùÛ ¯ÅçªÍ½º½ï\ƒJdKµ$® i_¼oLjw@d·†8ԜþÕPžþ6Å Bž–«ZRHÎìÇ/5óµÌò0¬5q°åj~°öî-;@õïát˅·oj×nÌÕïu8zâP=½$Q^×übP˜£¶ =ÊÝqB­®¦yI¨%Ç~g“€úi%êåýAE”&˜nÉÝ/g³1(ÔFaQ„Z¯ø?bPá¾€ÓD‹èő\¶ë“%, +µÕ=JBm™¦ƒ‚ +õ—Ó­m{,)5cmLJ”(Ԟ­ÑƒJÒ>ݟ¶QNJ ùËG|¬âPߚ‹eèåÍ& +µßï TtÞ\Nw;™æRP+ÄO¦œ‡šm’ÚΩV@Eþ3È¡ov=ݑÛ,Ø<Ö %㦠µ§Ÿ=…gwŠ€PmP«¯¦}?ӉÃí91¼Óµ†¶] u´ ¾Ì>µ3Օì’>£ø 2oŸ9ÕÎA…`èƒöͮ߸Ãïjê$Dr&óç  ÆL›€/'Vš=¹õ¡T‰Ï§Ö×ÀÛ' ,×i­q…6#‰·gƒÆ=YïÄßzÌ;*jË;•jpQYH¼í¾™H5C½½z¯D9îv¡·p{^ðû^Œ(Ä<¨ÈÛQž”|RoSDEÓÞrHóô2Du\øúù€¨§–'‰·Ÿ6¢ÞÒi¤Þ: ˜F¼b’jà%šš½CümDCÎ?ýö’eå‰VSóÊ"M¸ã<ŸE¢5·Ç¨Ÿ_¾-m}0!õöhû2)Á[ iŸïDOçÿ–úùñÝéY$Þ~ù‰ï¿™Mêm‚é7Ãn©qbà%Þ¤ÃRòJ¼šÈà«"´‘ŽLúY‰Ÿêd©¦-J¼oÉ·¥k!´‰™ìþ• â?÷ö7päÔë:¾kŒæâzë2FMyþÛÔ=ùx”j d„®ÓJñÿ°·)»å×ÑL“†5¹=¾Q¬ˆÒà<¶Ȟ’€ú¦IæX‹óú?ôS1ò%î<SÙFÌßM÷²ÝFº—‰8À3"›J:Æ©TÒY²âúÝÏË +ÇMÄ@ëÜFJ*®ӃªÐ'ǝ•ÀÆH8_;g¸G>¯œEXuVç\¼ŽÌ`/i3Ç@-ôÎã½­Ëøún§Î¨ñå4˜êý…ªÐVª§Û‘†ªÍNœ¨ ©BPÔ ô ¡Ô¨9{/§M é,T7j uƒ05·âaXk¡zêzäØb­‘tHBEºTŸê_âP=ÝOJÅÅó¼vIBEº$T¨L8¨p6<ÀSi¨·ZG*4$1 -ç@ÐHM·v±´º†>Ñä’o‡˜ Ý4¬ªKÏWY];ó;Õò J[+ûøV$Þ&΁JnüLqÆ$ÙQ|†A.·÷㤭IÚØ?ŸÌÚÐÂÀ9DíŽg,³n`˜í.únØÂBQ½Çy„_ô¾¼ ?pIۜtÌìlS‚¥¡z˜E­xÖ¹ô2Ì5ßÁWà ýgØÁ¤iÚÆÆì`Ðø3Mf¾9Z¤çŒ :šy¡ÿØ*[ +A”H/°‚9:Lñpˆ£>éü¦_ Aƒeƈ‚ü°Ø&c²elÔ¥$f@ÄÌâÏ*þÐ3Dº·è ß5Ü ùFHv’ìŸ\ÉYC CW”ÖppF*.=|JíXI)ÒbWúÖ5DŠ5É°õJ|ISDØ&èŠ3tɑ½8Íçº;yú∋&hiú"f¤¶«ûò¨G²À¾µªÞAaB õÌÚ(ã‹Ï…Û .ÔµíxØùƒî!˜+V$'’Ãú`ÍãBf¢MÉíÙµ$GD°zô‡FŸ˜{¢/óÕnOœ‹oOJµ™\Œ,•ULŽZ|~¼ÉÙuò“£þLßÊ!ŠæÜû +·ç7/5/qšïgˆéqٖŸšÍå’ (ì Üâäž+‚<ÒÀj¥ÀÍ@úà†³™žšNš‚X‚¦4ÑÞFGÉÞ$»Âiþ$wpäÚ«˜µØîãk`DYhr*È,èàlB`ÅƲ'“m ³®ïs²„&L;V$Vþ¡‡OY°/ ̐Ïy]ْ&4&JñÀÆf•1K9>%¦Y­‰IgÜ +ÓHã/‹g±,ËÀAþГçB¼c Ì«s”:©D¥I¾(É­pNÀb©íÉ?©T/ò$GõƼ +¡ +9H1Ç,ÄWP£„¯×‘I~LHaÃr%{Á¢ø°X1OJÖãI'wzr+¨â0(]êe¥ ’F€/£‚¬wÅ"ž64Ó1ý›¶Äº¢ÖæêÞøŒòÀpÖyÑÛ̸ï<i +ß5Ӝ…L½Ç!MÀÝ®Fm cl6§è^ Ýº’¾$?JΜØL³Nþxçyþá/'늟ÙyèžÉËó4\ú À”–ÚGmÏ\*߅ e͐rÉ#hàPmo™$‡¸b©¢Z 7FñŒ?P 9À`\w£E’ ‘P-ÐC{ñ3ë=ÊbÊ#òm2jÂÄEÁaqvp0¢¿àÌz<ó_²ù>n4×p©òWÈ"¥PqX¼1tjY Ôêbïà +¨ƒà¯ žÈÏðd5ŠÍÎæjÄ+IBÊõl¹ƒ€O¼1SúDZ’ÙÌðøë¤NuR ÕhD¹¯½$EÐFHõø’ÝìbøB½ ;ô%¾®Üì<|ñwºƒ9Öx›}]äov 5NÑåև´ZUÆY£Ãº(£ +^r©CZB¾‘”EAÉ` lÈE‡tˆ4ÞiQYݱV£"99*,AÉâÖ÷Ä=†š ˜Ööî) OYÜr+o×ã-UñÌgðªD¼óâÆ{¹D¶SØvdZ'n’à‹Ù±ÐûI f»c͍ÿl”ª¬¤}¹»ÒU66ŽÙðI+Ö$å͆B)Yê\,¡s‘9=å,¢*¤ä]‰.Þ¸obÍWó=äNô®$<Uš±qrÕ4üƒ›75SzñÜÈ +pJ+]œ€7°€ÁÉÇÄ‘K~b.DÿäS8—FÒ9üŒ´Îˆ9uÁ§xfZ+ÏÛ}Òæ‡NýFï>¯Üû÷F©9eÌ[°7ÖJ+¿oTXiAoò»P‡†›‡¼×ŒWÎlô"á)TîÈrÕpÄ=ì¨#ëCæ…K6wudW1:Fþ,D½9î8VY¤1±Ù|©vvw»'0fzhf7?p`<¯‘JO¡$6'—OcåèñbÜ ¨6^³€»g!â9VċNónî†ÖœWÉ÷rÜ t%ÂÝè ‹k}P ·«¸›„ Úôë[Á.*¤)M±#5ìD¾*:¬†“(Ç)©û#…}k}ehéÂ&²hV9Ÿ큄œœà·rPG³e RdƌgjCUDW +¼+H:²UJlÇqÙÓófŸ0èM™ãr¶N%¦ÛRP!Æq8.ëîä•nb6Z9~À”4³QìHRð—ìEpz²ÝUAõªÝòŽ|ŎÔÆ4±‘)’ûõv›‘›;q±œÅ9«ð|jË*tݛR +;íGHÿ_Òqœ¨®ú|½ÉJÿb‡£”åöv£ô¯+©õ>äXj+9Ö@G÷ŸFTòEåîà$4iË/ÚN¹#Rò|”?Ř ©µ_>ÊŽ!Šîž!ӕJ†D a +ŒäóÄÚB³¸ÐI~2I«¬›h{ +w¦” è7 +Á">ÔÛÕû\r`h“Ë›ä8/i>ùÕä{qeU&° -5ò§˜W +;²6oéˆ=©1adÁ·u*ï315Εìtí‚cJŒ¡Ê-©ÆuåŽ)<4ò4‘è8! +’_¡ûªMÆ·ÙÌRåIm4ìÊ+·6W¹`o +´|…1ŕìj ×ÈÂ@Gœ »È0§¶7‰m?:ŠEúb`pÊPŒ¿Dc’¶& 7³6‹¾=~áõ6ف(UÓë€òö¢Õßܪ5¤u“s&ÔÇûÙFô=ƒrù˜Ç¤óYesùž°¤¥»Òùð­Ë\¾'üŠ‰{Òùäsùž¸ÔÅûÒù0¨"¹|x ò]é|ò¹|Oxêâ=é|ò¹||êŽt>ù\¾'ù\¾'~êâíé|ò¹|ô±v:Ÿ|."èG¤óÉçòѳ¹.-“€ÇÚXž’À'¶W1&5b0,¥XñÊV^r§ÃÒB/À́·Ÿi¾`ìºÇ@ün¼*~]ÆSø™æ¤n@“ßv‘æsÊÆSÊäòeCþD=…2½)EyIÌð"cEEŸê^ºî@ü@>q•Ÿ&3,%C—̘vúÚü½+ØNÞÑu·Á ¿z’/¡!&™{|< +Íïnó˜Ü—N09ñpÅ´»kãKÄì0íîjKóå”Ò•j”RڝúøiÖ p#br“–‚Zm¢˜š¯èȵˆÈÂü¤ˆ©Ž\gEcŠê¼×¡v U^ Ñ¤× •Ï¨¼ÊÐ͖.91Ï¢"ahãÛ¡lã[Tr1AÈÈ9rÒGž§*-pR’1®É)쟯Jx‘É)ä dbù70¢ ³qIçÈM%“p„b¶Rä}N.ò¾úÁZ¤Öð‰Î)TŠ¼WŸS(”þ„gä_‘S(°z*Qd!ݛB†ÚQštKÚõ4•¯1¸¦7ißÇ-HSÈÿ¹iî{zãۋ© /yATT +–BúŽ*17/4‹$-qÛ^]êž ßè­’>ˆö9©È«çy1}P,æV…>xŠ)$Ÿpr5×î“F}®ïƒ×AôHˆÜã"PqÙå–B‹RʞÄ*áÂmþ±"£¨I¦ý‰î[PĈjC„¤U])aï⼓gà”<‚)]F©ò0¹Sú ÌÔý>ÎObXÂ2½ø¦AƒÃô*‡rõtZÖEpÒÍrÚ_Arïs{žåŠ¨R½oÅBœ0Jû+\g ’É`ã{\èž*é@9G7¦'ö’SÑa]e½‘ +²x UÉYožØÇÔ ë:ëPâۍ_OBë L‹ºÇzƒQÚºx·õÆ­™ôbšÙ¨Ô*Š×[o¤íëâÝÖ09I&dD}>œJë͓Ü=P(î^ë L†scFÈ[㒊*¬7ô¾QÌ”¶Þ¨Êb%ˆ «„d/œAú‰ÉôRHU%H—$c.ž®É ÕRRs¸Œèrǚ~ɬ*®=+qQº’Ī&gVK¥Èž&N¨%•ÁJil0‚oë¼1ÅO™ãRº§BŠŸšŒVÙL%bÊØéԄ`’2› +Zj' ÂÃ4 +²à™4EàcÊ®‹›3óÚ“œ÷èÌ<ù°ë‡eæ)RÚc2ó(ëàErÞõÉgæ] {Of.CcÉyÎÌ»T +ÕF^•™'jÅ¡ÈÌ££$óD”™GGÞ “ó™'±6ÎÌSÐÖ¤üB¹Öö‰ÿðÈSˆ_Wz º"UJ*B/Ao®Gp€óº +§—¨h€\6!c ^.âop£Žø*¶âpDm6¨£»¯@½Ð›QEä½"w“¼àX4ò^Uˆ5Ò£á~Ì|¥äqHǪ؏ݻ.»em3£Ò/êC¡{áRÁÓ$C¡{Õ ®2¢zJ,Zâjrk=èªcԑÒ]8jT\ÔѕûQüXk=d?¶$GÜf£RðG½®ºÒ*°ÙB&À /–೫Õn ?êCò~fµ8l?4I¶ýÐ$Ùöƒ’d¿öH’%µöÇ$ɂŽ“$ ;º?Iöò$Y˜F§|ѵ0vP2 l™«`UÅ/ñÃy ¯¸ÜƒÃÝf0šÙ`yywÇ +‰%åñŽ55±BüiªÕî±µ‘T𐔇mO:/ïIÊ»]÷¼*)OÚxÿФ<:ÈB!]ó't3l_þlQ©ÁŽ’<Šn1¾ .ûŠs¡|ûý[=Nd‘…'ß|%´½¨ éjÃ3ØITî»E²é +¯PVöL ¹›‡!cw¢3ðI*W9ëZ0&Á}æ|²ÀîåÃ]9i>‰î È+(ÿ¡Gåãë FÁÌb=`h,¥0©±¥?Ú[«_‡åÖK#ჟÞaӔÆ^x gg駧×í4cŸâ—У2ÂpË-/íîÝIà˜æ%Àú-^œ–Ÿvgé?–’É~ó—\Ú]ß. •È&}U ¨>ÊÍz’NöëË¥Ýi¼ÒPs¹C—…ê©S(Ñ|˔•«Å?0¨‚záUóíI2ÙÏûk‰·-;©T´®\Úݜ@}â×)üÎK'û½,­‘Ô¡ ÔâKÂÜÆyQ' Uó¥ó5¥0l“MöÓf ÁÒÂ}kGðÑ'&)ðµf»w£öžäLÌ@ü™V®¶Â‹”©í&,«§ÂlwEe=É>)×ÂS*´¢f†Ob·Áݜ«ªÆŠZÄ+”Ÿ¸bß³²çKªp;©tU>N)|XbŸ˜öq­ÍFEbŸ˜– n¶»+±O,«OR†¾=±O̊Hˆ™Ø'–Õ‡öÍcûÄȇõ­=.±OÚÜýÐÄ>±ðŒC?*±O1ò1‰}b~ /î=‰}üu¥²úd+·&öIxqØ'“±òÈÄ>µwtݙ؇Åû³Y}¸Šû Ä>±Ã‰²@=4±OlL¸ëûA‰}bY}‚ˆ®G$ö‰­!»o—Ø'Öã,~`bŸXVŸXÆʝ‰}7#íºÄ>%¤=(±O,«ïZ¤©HìËê{’Èôº#±OL&}f}ߟØ'Æ{°CúQ‰}bÎJ÷|hb¿ƒ¢Š{cbŸØZK;VnNìÃW‰ñÌȝ77&öI螒¹1±C+c>I'”ÝšØ'6¥'ìæ$)yëN‘Š/҇LiE¹C.QÄ_鈸u{ö•"߈¨â§$r<¨Š_T¤„Ÿ¨È¡UŠ5€1R¥ŒÒÅòSõÕÑ$©RÍ^‹ºåû•>~ÅüåJî)ÕêÓeÈ–š­jLŒª–ÙÈ Êw³‘T™ÜúàÒÉW™ŠB•é2°Ih3“Ð=õÿnLžãÌ̒q6*åu•ÅÿJ“_‚»‹ÿQV¥ú*súqEø]Åÿ09M¦þŸúT)‰â×!o,þ'n„Öÿ»2_ê²øßÓŅçbõÿnˆ ÇVƞÉñ ʕIž{\ŽÇ®ô˜;ÉÑڄjwg•äã;¸€KŜ>±Çk£»áÂß]%¨$i|£X¶O:2DuzªØ§@§.H bǯŽ %ëñü'fÓ¥: “y'O[»Êa­úªóËäBâÁP=ò¶ôkB­Fð˜P+t7Áý”p®&ÊJM"æ<)¨ž(+F*;ºæ ”ƒÝ´/zz.ß\i÷&}I¢šâõÂlß¿©é"Û÷oªìRŸ€ö7UUYDî "½YT16ì0“Äf}ƒ°©bmpeSÎ9¤¸Ëíu¯¼ßS•±0urcbLó¡Å›+îؤPÜÊZÛ«„{ 5 +Õ¢»GÆàz‘½¦£\c@ut[…o¾~;’‰Fº.,l‘Š{œÅ@&»Üà™H +Å-Æûêþ‰F¦à¥ÿn܏XW¬õ­T÷O¥¨~oÝ?FT—,ýweêDÝ¿kUÜëþ‰küÒ÷ÌëÂfs]±>aoÊuÿbÙlߛêþ©¾¾=÷µ¿;¿ ’únÞPŸíKjEUK– ¯Ëö%µ×՗7¦@œOUä}(&b2©÷œFpkGªŒ_ +]¨£û²}Q/Ôéy¶o[ön»8:=¯É¾¿ˆÚQUE'Ùs©.£v`YSþD5ƒ‰ÅـÙËìÇ+©:ÈW%}¬‰çRÉeˍ¤­}4¥©VðAo¿*b…Ú½Äö½-UlO‰T¤â?H÷äõü ÝS␠+™2“Š£Ðü†%›Ku­Ä8¢·B0àñ#®Ÿƒ‰rì&x¾÷†¼Û”C:”c +O‚;ïe2Óî¹Uëi+†9:r®\Io”ZÉ&åð«8GŸTì ÔJ•ôF¡:}+† Æ${ˈê¼[nG½•(@zÊÇÃÁu‚¹QtÂ`1؅©† ø'®±ŽE˜b˜By†w9¨g—Ï @ý‰—#w8’/*"h~i:­+Ï̋h ’™y‡óC:‚‰¸æÂJ|V®4HÕA6[­'—…øG +ôA"âì­. Õ@c)¨É9æxKÖ±éòs䎺ߩTf^ Ýë×ì\™yf,ð‰­‡!ùÕ% •È‰7 ¨>þcíê‹A`àteÒµÙ£GjÎöӒ„jœšü¿˜¡K˜萃Z6JB=›QT†JDŒÛ¼¥øè½æTo²VÓ®^oxÌF¢©O·ïg:UÅ.½¿4õÑ'LÑùJÄQ,È´¾°ÀdÏé3‹=ùTDgÒ +»ˆGé3ý² i¨ŒeN/¥h$™ª|"sHêHR}\WhPÌ·vEJ¢Û»ÈGSدHIT>j¤¢®JI”@éE>¢@€º6%Q•z(t¯ò§tUæ’B>¢´&]mŠÏë¦b…8ø‹âjÔEnããŠ*™T¬;”ùÇÅ +…<í*VH›To- ¨¶X!k¶ûg‹"JƒÃúg‹â‘÷ÿ`±BqóÖT´ì(’«©á(Ýj…W;dÃàî-xȐªxµÃk£í$ Þr«Õ %'÷ˆ[­¸‚‡wÅ@©/x(Ÿøô€[­PÁÃÜj¥¦à¡º|Ï» r3zˆôM£²Õ1Å㾂‡W&”ÝZðPHüj‡0·<”ŸÜ“l}Ï+ +ÊW;”±u^WðP~J”¨þ€‚‡ŠÁ°)x(_Œæi÷<”ßƬ¨.Lº¶à¡üÉ'”Ón.xÈ º¨v(ªßÜRðP>. »¾¯à¡ŠT’G<”¯vȞ7÷<¼²Ná­ù½«^ˆo,x(®FƒyLÁCy ÍÓî/x(›CŪ?*[MºÚ!®ÜUðPÞσdG<”ñ–´Ü^[ðP* wEܙrzS`#<. r1•+xx¸§à!Kn¢Õ/l6·<”ïåI²Náý)XµÃûRIš’ºÀÛ¬.´WEÁCùÚ'ö~v?ÞVðPþæNñ¸³à!›ø%š±ý„'-©Oº,x¨‚§=¢à¡|µÃûEuºàáÒ±Õ à!Ӌ¸Æ}q¬][ðP±D¡ ³¹¡à¡\¢ÇמÖ=ï/x(JdlµÃûxZ[­ðƒû=ï*x(/ü`Ñ÷<ä.–|­uP²àáõ¹¸7<í…eÅò+W<¼=¢K¤àá­©úOt†äÝyûñ¢Ú!晬:ñj‡4O»¿à¡|%Ü> à¡¼vÏ ía‰WâÕ¯°uò‘&,xx»îyUÁC)~HU;|TˆbJ¾Úá“àjý› ÊW;¤EŽû Ê'éŠÒ7<”¯v¨$§©Oҕ­vˆ!ï*xx‹dsCÁCÉÕD ¾ë[®7…‚‡ªâ:ï/x(V “ªð¸˜ž.e7ðLú¬ ‰‹0ÖÌH6Ĭr +-Âà™ ¿—÷ç'QR©$Uí&/°@ï)Žðü´Ö Ž”ŸÀæa µ›RЕ 8i0MяEÜyŠd ]w£Ú4j³ºòÖÆûð yù²4Ðj¤1öó¿Çë_ÂŽîƒÖHø£km,–["“ùs™?{ˆÈ–jнJd·‹2‘«íD¹ð6 Êëٜ¨®¦¿D½âÂ¢E4¿3¢EœVD«ÿz&Úö–‰èٚfâ{¤­ý~gF >Ü'âÇÝ1?Síp8dœ‡ã×6|8“›s8¦£Ño€rÂÇ f›í‹I¾š Îâ­ïÞ\c1¼tÞõð*ùò^Ï ¿Ë­6è|3éV㗂'h¨Žþ:鈅IJԜm;ÏÛZ”ÀhÙFã…ÐO'àñûV”ÐkƒR^G˜àZÖؓ]V “®°J +ð…‘–«…<#ç=ñ雇7»•›îÅ\=æŽ5â6Ɖl²”$²³q‘ÈUßÖG]ß7‚É´`tŸ±¾Þ> gv y¢2$kD¦å ú‡„³:µ „0þ6â•2ü1­9+-69î4âd*ÿ× 1GÞ<»Ó؂iÀi˜÷[ÕèӁ,ü”ÑXkÚ$• l]yÊl»²Æ²×¹÷š´³gÈÉ]VÈDõ¤%E†˜Ôbè$áÔñpYs@ ”͸*ð©¾#móy|jí‘úO8—Zú¹[\ŸÂäp¢¯CšèOS øEÞL4÷Vjßä­ô“É¿Úé¯eÝà§Ìx¹NoH¬·åc¢ÔnùQ¡“˜?K¤Øü0ã,Y¬iÛË9kÊ +¤-õ2`Øw6ü]“œ°/ø‹ù+0ZÆåi—¤“ ™Á¢éÌÄÄd +¡ghmrq+Û¾Ofú¡Ó>kç^ ({ð¬ì¤d'g®J@ó±Õ­½xÁpÞ¨²¯ä¨ÿ2d†X³¢RŽ§v$DUÍÎҒ°”jԊûR.ø•@iä8_E_é~ǽO’^¹nÖê¬Ô—nð¶aCo]f_h‚!­á Àf}€p­ê/[Ð܏‡‰–g{lú)R².E_–/7œ\iè’À†H:uLjµ>ø¢MÏ[Âÿ=1Ѳ@ÒeîÕ5ôÒv?]ìŠü¸õ‘È¢%—ù½8ì²ç@Ŷ\ƒþÑoçºósç—Nυ†ÀP#ú OþØwk¦ÕÉÃٌ°Ùü´5)¸ÏÃîXãô‘\9æ–ÄûxVN— +š:§FLÒk&1àrg3Iº_΅)õۉ&â6¸šŠŸ^úSz¸`Û¹év­uB0&QM5¾³é•vœøh|3#{¼ ä„rÝàOï‘ÓÎG1 ežÊÔ^míy@uFgqÔ÷’:§{Ùi'­›œ3©ï¢.Ÿ9|FÞÕ(¶Í¾[¥lPߜ&ƵŸr¦Ü·À±ž,Ãý2w¬CV`äB½Å5=h°[j‹ˆaXi +†¬àÜI&Uá['»†_à«ð/iBŽ%ðçu¾ú-¥­Õ=4‡ ™ö ‡ŒÛQ‚<äŸ= ‰µÔ>Ÿ¾û#”PØ駨f:ëÇ¿èÆüa|Ò¤Íø CgJfœMOVø̊?+[!g*QLrRgºÙ€“f'Õ—«äJ»É’v}ác6of´–”˜•+k®´ýӊ+\¾ +$ ?™ùŠoOE<°Ó=ÅN½£\Ü7‚‚Ÿ÷•ÙÍóFÝdA³UûdôuäÈèÒü²î“¶Ý:f¹\^Òºôi5ªI÷öÚ­_ð/ôU38£Ý;QìŒÌ†IZքêKÙ+4ÂbvaF>%a¾Ö3bò²I¯c~Íd(FJ”v»R‘‡Ó’Ð3X»‚:@’Íëϋ°óè}Ä¡À™*wn蹊˜Ø†ži^»kF€<6y7t@ÆÓ}ç:€â Á»Í +ûp>¹>êT´Q¦˜(Øþ ÜiF—yôC¹ËDæúsJQfúÙpoAÏҖZ+`,#/»Ù&˜˜E•[‡˜;ÿ=„W¢{Ϛ¥î1za6Å>WX 䤐Ґ” ¯?؋;àýA-WU+¸Ñƒ[R´Í֙¡dèC²ûɈÏTYö/Š xr`D¤ƒ'M¢Ò©ig '´j<ÇO’W‘˜ _è¸áàê*ýH!!îfx…‡—ˆæ‡ÁƒÇÉáAP(žºñŒBBúXçՋg‘pþ¬²Hè0|<ØTàÁ¯™L4†±* ¨0%ÒqH€³¡–E1²x¤·QÒ\b‘ÿvhÿšòÄÀ(…ð #hZöW—4\gÇøZ‘":®€B¤k^PKiò} _èíIŸ79«ä8T §‰àläû@&º;&‚jÁ0H»mELøŠÈ‘6b6 u ûÀVïC-6M6!딜H,´Ü0}XûËDÆQƒMJŽGßD>]±w#møí̔ˆD]BÔH²«Ï¿Tˆ¢4®é”FI³wR8!÷ !æNJÃ1q+¥áÈPLj…¤Ên|Ä:% ïã‚Z±}«ˆM J»wEÌL ¤‰!C®yn,ÖÁűf–ÚûjWÄÌ­GWiêIˬ‚‹u€ÚñU½i"ܒ +6…4U‘bbjAËÐf‡´Æ˜þªÑ}¸Ž}þ ,ò•;¤eaáÈóÆAPænUG“ä pÚ¼‘uZÄÈóšsɂh““¡oÙìW²K°¯ß§P‘ûêևR%ÖY<ý›BA6o㛛á͊==`ïACj^c«šmH3…^ÚvHÙkqåх©/¶ß¿ +4½á! :ªkl­ï,ÿNƚ𗸎”^°Æ`/£ö”ß(='d!f¨®œ.wÔ|Ó´͙…‘dˆúhKmˆ°ƒAL“”pû°F}æb  䲉Zê•@G¯ùÃ!ú:JǬõF:fšôÈd0éG¢º”ÉIG»p;ik®¬më!mmZ{¸ð2ÂÙ퐌º ´ü\ÍÀ¡€ZÆ9Æ÷ àËBáYà’]k†õFQVœ•Ó˚¬­Bû'k\ Í7Æf6’ñl靹k¨K8õiÿIc8#P»=ñ$ZWÏujt¬Îàl¢§{aÒ$Yõt¯’±Á1¹9ç¸cÖ:oÄyši+|‹Y÷ò}`ÈÊcIN҈,Üɀ;šôb]–,Ú8 +Æ0G`Âi æ2É +ªíæ¯l4¼)¥sväúÙæ\ɞ;ÏA '?ZdÃF/³zÌwÏ0Ú+a'J¦j +üéd©}́}²u²î¤ÁèCE*"áMç‰9Ý*²{!ãªÁýr>f‰YÅR¥l²`ÂßëA‘3îÁ†²'¹Œ±rô©)ñGîÿ3棬OZë2ëwq·Aã˂Nn—E„Þ(2ï |`0Qw"“¯ÑÁ#eËsÙ4ÐÜ‚UåCàkàZx#H‡¥îËÈ ÄtŠÅã)ÄèޔßÓºkñ@ØtÖÿ‹»~\ý×ÔùfóÄ܆Ê<‰=«lM>×`œ}ş}í=и§ž±1·Ð-71ô#mØ?[ÖHA‰…äh¯‡) a?ØÐw¢Ý~‡›×á6üä+'nC;Ÿc׺'d^ƒ³¡,læpÀeš7ÓdÞïóÓQ3EŽÊ˜;±h.Nï_Ð%ûE;üyYqŒ‚ +ðwm}UȅEõ}ݽ`&BÐäÄY ˆ‰é£‹,í0~ÝÈ[ó¥^íåt¹~Ú³(áŒzL”~Cí¸ÖÌ·»ðaó^0¾ëâšï1!ƒ#´1ö3geƒÌ¬ÐªXǀe"?`O­àÁ¡³ÑöGo—¶ ;O&…šÕ;ŒÓGlš¶±1Ög€¢4F¿Úm H‚ŸÐZr0¿Ì:6'p±ñwÍøÖüfÎ"ŒüŽ´¯,újÅ^ õ©WÎ!Mq~´o°›1æEXÂBû2f\FÃ\Y˺ÕÞ0ó5¤´\ß1fßÙ±Žr»Ÿ9 >42CW[ÞWöQÞ»XSs&œïq ;ÄŠ÷ϲ6ˆ' vz¦—ÐP€d hÎù^uŽl(~|m’èG”SÕùþéf=uà\ÒEtÈ¡ 81tËb~„‡tϞv#öÌúÃbð#‰HeÂRYt‰y¸èz£në’a±<9"nœ6҅ɫFpÞS³i¸0‡œy5Ð1μ¡‡ý€9i²U‘ÀFSð¨é¤i~Ô!ó(˜Á§O’&ÚQ߅¢» .°d£¡›ù4ñ >èõ]~ .íHÐ_;Œ‡jùI0Ÿú$;œwj€7¾=G®¾Æ= =u•ý =›åڇFÓ¾y–úõe«ÉU@ÀDÊs:ÚÅÃü¡ü±[Áïpî—1M2§>Aæȸ |’̧ çӇÿéÏs1突µ˜£aË®…¶ÎìOå%Hù ƒ£Ÿ(æ¬ÐÑùí£P‡Ð!æÄð¯—ä_F:æ 0"O³µÞ·4";K*,…áÑÆ{‡s¡}7°‘GÆóå ¬ƒôŽóz(]š½!+ $ž(%.°^6ð‹ÜÕyŠ@„‰ôŽ':岘ÞwJä—ÆÆ÷˜2/ GïÝ Ã(—Xêe„žQ]²Ñ›$äÁ%À]ü­|êg™˜ð¸[™`|[%gJɽü +ù€ÐÝ"o¦nŠ¦i 2¤lÔcŠqS„éï”.oÏBgÇÞy>ö™MÍÂ%‰ü¯èÓ¿üA·÷ýq~œWÓCõ°˜/6Ïà,B¡3Q Éæf²Í¦ÓÆô¿Néíø¼žnNÏ¡gg¢ž*Þôt¼LŸm4ƒò³œÃN+Mán) y“éY0·Ìë>^‡éэ +U/ã®±‡9”í úö¢± &Ÿ›+[טòGüÚ¥ÜÔ/Σôě,ºôô’a>p6útÀ©±™ãq¤ZÂHŸ78Ã7ø"¦±'܍­ÒÉ«ˆô‘ ó¡ÖæQ‘>’a>HÃSéÃ1ô+¤Nd€ìVJjÀ½Òáy‚yQå8xŸæW¹W ܃Û çê}:Ük@„²€½öe¥vÝ÷ñ#¹tº›ÕJ œÈ€‚4ÿ)©;â˜Njàú£õÕFjàD6h某8‘“/5p"œÍ?&5p"¾o.5p"#-5ÈÇî2šXHڜ†NËw’<:[«Ÿ²Ýјßz&š‰žCïÁæc54æÅ*ª±oj_±Ŋ¨Ð‹öÚ¥ØØ< 䯱<±·ÆþI·îíŒÂå1q +«"‘ÀÀXœ ëšÎ:éƒÝè2Æ5ßhéëL9lÈXêú>G +ÎEçä ‘…-dEº9ài™¢Xî§;Öz+ H…­ÐG Ÿ¥yÚ7½\‰€Á±!͒'l}?#Ô1V¦„Pr!=TÎN€ +z#sMS€kh )7÷@¤½9èÐ}œ -ÊU Š“bü;×t¡Å`¹¹«v¨Ðr.朶ìÄÌd›)e!äNjDZúL߈¨Ô„^ʔlÇCeƁÒE¨ÌÉtdûx¿ •±äž|b̈́ôl-ŒlNjê±W°¨S°ëæEõøtš—¤>-”tbÙNŽDv&z’f€â)“Ð"ÚÌ ‰’[‘;ó¬µgžuÎEucåBáñÔ:Dƒöùhp÷¾ŠPÄΨP•W—D¼’­é F²Ã9MnsӚÅâT?î2dG"^ݏNᡏ#¹>h$ôp$€áð¯> .ófBvnˆ×a}ybH`1r~;‹*WH^OH¸#n)z?©ˆ×¡„[‰ø­éqi¾+ pm :§’(/ú µVµƒxBõŒDú™l÷M$å°s[‹¦z"(ÁçŠ*‘íi ž,÷6Ô¹­‚¤©ETÐíJFÞ¸ܟ+’ÕÙ>v)Bt"*± ™$êà¨Íå“V¶žcù<¸÷XÓ\ro¦›ÂhlÓÏ[úçâN®û( ˆ-¦û(­ìqpHSšlý8q7¥M÷Q±1KQšê>ÊV›"•à Y(­ïwܳ"(r[¬HijûȕµÊûV>zJ‚ª¡ø úqlÂA@ƒ¿Š¢§âޗò+ìB÷­xå±I7rÉÛ³×푋AøÊ(Ñéž=’}¸qˆ:IüÎ{NŽfëcÔ¹ïHÍ­V.¾]n2ƒØ‘Ò¤%Äãëýö»ÈblupØÄY§Âф÷áK‰nvÉAˆ°Îq¬ÿæ«qük­™ ¨^’Š$Å욱'³:éó0WN}ƒ:Î}á3v*ʑ ÞªÂ ŠBît„ªð‚ÂÙð¡¬ÍU˜VÃ:'…¹5¬g²„{&yʶSf—š³ïžh¥}ó%³±¾O§êu?à5„“<ý‹xNÀ?ÓÎ_ˆ8@âÙ }ÀÐ Û£¯Ãõ´°™Lÿ‹~P?mÿa¸žð·‰Íi1\-†ÇÅfN;•¥0ÀŽ€B%Äà·"øôžýû™$ž+ϟßÄóä ¼ü€/Á¿“§ùžMæçN.EbWÁGÀãöº=τÃðú|ªSáò{¼‚ÃíòzÀ9‚.Òë >w†Oÿr{ýÏvOÀÿ Ô<×G}.ӟ]GÀO’ð;jGºIØt㙊N.æƒÃbþ{Œ·«óz#±Ú4FÀ¬6h²Žx¼Aب±»á˜|¤Ã šÀ ¸üpÐnÒáóA80ô€$jf©rõõpµº~7, +év³‹‚­ ³$Þ ³ }÷z^·d¸ýÏ ¿£n\® ÃÅ}½bÅÊÓÙið><ýª™f9I³ À5ÐV³ÃÓõå}8Ÿ6ÃÅ +rùqø?¦ÏÃÍf{ž¦;ðêy~˜Áš>·ÿ†OàØTJáÿ1¶—_ +endstream endobj 6 0 obj <> endobj 26 0 obj <> endobj 45 0 obj <> endobj 64 0 obj <> endobj 72 0 obj [/View/Design] endobj 73 0 obj <>>> endobj 53 0 obj [/View/Design] endobj 54 0 obj <>>> endobj 34 0 obj [/View/Design] endobj 35 0 obj <>>> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 84 0 obj [83 0 R] endobj 100 0 obj <> endobj xref +0 101 +0000000004 65535 f +0000000016 00000 n +0000000201 00000 n +0000045144 00000 n +0000000005 00000 f +0000000007 00000 f +0000170608 00000 n +0000000009 00000 f +0000045195 00000 n +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000017 00000 f +0000171227 00000 n +0000171258 00000 n +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000027 00000 f +0000170675 00000 n +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000036 00000 f +0000171111 00000 n +0000171142 00000 n +0000000037 00000 f +0000000038 00000 f +0000000039 00000 f +0000000040 00000 f +0000000041 00000 f +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000046 00000 f +0000170743 00000 n +0000000047 00000 f +0000000048 00000 f +0000000049 00000 f +0000000050 00000 f +0000000051 00000 f +0000000052 00000 f +0000000055 00000 f +0000170995 00000 n +0000171026 00000 n +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000060 00000 f +0000000061 00000 f +0000000062 00000 f +0000000000 00000 f +0000000000 00000 f +0000170811 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000170879 00000 n +0000170910 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 +0000047239 00000 n +0000047055 00000 n +0000171343 00000 n +0000045567 00000 n +0000055928 00000 n +0000055815 00000 n +0000045927 00000 n +0000046493 00000 n +0000046541 00000 n +0000047123 00000 n +0000047154 00000 n +0000047455 00000 n +0000047723 00000 n +0000056002 00000 n +0000056198 00000 n +0000057266 00000 n +0000063713 00000 n +0000129302 00000 n +0000171368 00000 n +trailer +<<025EC4A9513F8B4B84067E8D2E8B1981>]>> +startxref +171562 +%%EOF diff --git a/plugins/net.mograsim.plugin.core.nl_de/.classpath b/plugins/net.mograsim.plugin.core.nl_de/.classpath new file mode 100644 index 00000000..bc3587db --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/net.mograsim.plugin.core.nl_de/.project b/plugins/net.mograsim.plugin.core.nl_de/.project new file mode 100644 index 00000000..8863fad2 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/.project @@ -0,0 +1,29 @@ + + + net.mograsim.plugin.core.nl_de + + + net.mograsim.plugin.core + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..cd95f141 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/plugins/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF b/plugins/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF new file mode 100644 index 00000000..4a3f56fa --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: German translation +Bundle-SymbolicName: net.mograsim.plugin.core.nl_de;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Fragment-Host: net.mograsim.plugin.core;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.plugin.core.nl_de +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-Localization: OSGI-INF/l10n/bundle diff --git a/plugins/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties b/plugins/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties new file mode 100644 index 00000000..5f8222d7 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties @@ -0,0 +1,34 @@ +#Properties file for net.mograsim.plugin.core +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim Basis +content-type.name = Assembler +category.name = Mograsim +view.name = Beispiel AsmOpsEdit +e4view.name = Simulation und Visualisierung +extension.name = Mograsim Project Builder +extension.name.0 = Mograsim Project Nature +category.name.0 = Mograsim Project Nature commands +command.name = Mograsim Project Nature hinzufügen/entfernen +command.label = Sample builder deaktivieren +command.label.0 = Sample builder aktivieren +extension.name.1 = XML Problem +decorator.label = Resource Decorator +themeElementCategory.label = Mograsim +colorDefinition.label = Simulation Hintergrundfarbe +colorDefinition.description = The Background of the Simulation Visualisation +colorDefinition.label.0 = Simulation Vordergrundfarbe +colorDefinition.label.1 = Assembler Kommentarfarbe +colorDefinition.label.2 = Assembler Beschriftungsfarbe +colorDefinition.label.3 = Assembler Operationsfarbe +colorDefinition.label.4 = Assembler Zahlenfarbe +colorDefinition.label.5 = Simulation Farbe 1 +colorDefinition.label.6 = Simulation Farbe U +colorDefinition.label.7 = Simulation Farbe X +colorDefinition.label.8 = Simulation Farbe Z +colorDefinition.label.9 = Simulation Farbe 0 +colorDefinition.label.10 = Simulation Textfarbe +fontDefinition.label = Assembler Operation Textstil +view.name.0 = Simulation View +view.name.1 = Speicher +view.name.2 = Instruktionseditor +themeElementCategory.label.0 = Simulation \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core.nl_de/build.properties b/plugins/net.mograsim.plugin.core.nl_de/build.properties new file mode 100644 index 00000000..34520a00 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/build.properties @@ -0,0 +1,3 @@ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/ diff --git a/plugins/net.mograsim.plugin.core/.classpath b/plugins/net.mograsim.plugin.core/.classpath new file mode 100644 index 00000000..4a00becd --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.core/.project b/plugins/net.mograsim.plugin.core/.project new file mode 100644 index 00000000..29dcdb4f --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.project @@ -0,0 +1,30 @@ + + + net.mograsim.plugin.core + + + net.mograsim.logic.model + net.mograsim.logic.model.am2900 + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..3c8fadd6 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=false +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=true +sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.correct_indentation=true +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=true +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=true +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=true +sp_cleanup.remove_redundant_semicolons=true +sp_cleanup.remove_redundant_type_arguments=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=true +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=true +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=true +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.plugin.core/META-INF/MANIFEST.MF b/plugins/net.mograsim.plugin.core/META-INF/MANIFEST.MF new file mode 100644 index 00000000..6dfa9547 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/META-INF/MANIFEST.MF @@ -0,0 +1,36 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: net.mograsim.plugin.core;singleton:=true +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.plugin;uses:="org.eclipse.ui.themes,org.eclipse.swt.widgets", + net.mograsim.plugin.asm, + net.mograsim.plugin.asm.editor, + net.mograsim.plugin.asm.editor.rules, + net.mograsim.plugin.nature, + net.mograsim.plugin.tables, + net.mograsim.plugin.tables.memory, + net.mograsim.plugin.tables.mi, + net.mograsim.plugin.util, + net.mograsim.plugin.views +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.ui, + org.eclipse.jface.text, + org.eclipse.ui.editors, + org.eclipse.ui.genericeditor, + org.eclipse.core.filebuffers, + org.eclipse.core.resources, + org.eclipse.e4.ui.di, + org.eclipse.e4.ui.model.workbench, + org.eclipse.ui.themes;bundle-version="1.2.400", + net.mograsim.logic.model;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.logic.model.am2900;bundle-version="0.1.0";visibility:=reexport, + javax.annotation;bundle-version="1.0.0", + net.mograsim.preferences;bundle-version="0.1.0", + net.mograsim.machine, + net.mograsim.plugin.core +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Automatic-Module-Name: net.mograsim.plugin.core +Bundle-Vendor: %Bundle-Vendor.0 +Bundle-Activator: net.mograsim.plugin.MograsimActivator +Bundle-ActivationPolicy: lazy diff --git a/plugins/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties b/plugins/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties new file mode 100644 index 00000000..856144a6 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,35 @@ +#Properties file for net.mograsim.plugin.core +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim core +content-type.name = Assembler +category.name = Mograsim +view.name = Sample AsmOpsEdit +e4view.name = Simulation und Visualisierung +extension.name = Mograsim Project Builder +extension.name.0 = Mograsim Project Nature +category.name.0 = Mograsim Project Nature commands +command.name = Add/RemoveMograsim Project Nature +command.label = Disable Sample builder +command.label.0 = Enable Sample builder +extension.name.1 = XML Problem +decorator.label = Resource Decorator +themeElementCategory.label = Mograsim +colorDefinition.label = Simulation Background +colorDefinition.description = The Background of the Simulation Visualisation +colorDefinition.label.0 = Simulation Foreground Color +colorDefinition.label.1 = Assembler Comment Color +colorDefinition.label.2 = Assembler Label Color +colorDefinition.label.3 = Assembler Operation Color +colorDefinition.label.4 = Assembler Number Color +colorDefinition.label.5 = Simulation Color 1 +colorDefinition.label.6 = Simulation Color U +colorDefinition.label.7 = Simulation Color X +colorDefinition.label.8 = Simulation Color Z +colorDefinition.label.9 = Simulation Color 0 +colorDefinition.label.10 = Simulation text color +fontDefinition.label = Assembler Operation Style +view.name.0 = Simulation View +view.name.1 = Memory +view.name.1 = Instruction Editor +themeElementCategory.label.0 = Simulation +Bundle-Vendor.0 = Mograsim Team \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/build.properties b/plugins/net.mograsim.plugin.core/build.properties new file mode 100644 index 00000000..7a5784ee --- /dev/null +++ b/plugins/net.mograsim.plugin.core/build.properties @@ -0,0 +1,9 @@ +source.. = src/ +output.. = bin/ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + OSGI-INF/l10n/bundle.properties,\ + OSGI-INF/,\ + icons/ + \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png new file mode 100644 index 00000000..51707352 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png new file mode 100644 index 00000000..a0584969 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png new file mode 100644 index 00000000..3589af36 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png new file mode 100644 index 00000000..0eef2dd2 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png new file mode 100644 index 00000000..5fecefe8 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png new file mode 100644 index 00000000..a0dc941a Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png new file mode 100644 index 00000000..5b287ad0 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png new file mode 100644 index 00000000..4d5f38ff Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png new file mode 100644 index 00000000..2b6b2e83 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png new file mode 100644 index 00000000..cbb88e68 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png new file mode 100644 index 00000000..ff9c9bfe Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png new file mode 100644 index 00000000..bc2386bb Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png new file mode 100644 index 00000000..8ae04cda Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png new file mode 100644 index 00000000..d7cc656b Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png new file mode 100644 index 00000000..dedba0c0 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png new file mode 100644 index 00000000..771b0091 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png new file mode 100644 index 00000000..2018a5a4 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png new file mode 100644 index 00000000..9b294e7c Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png new file mode 100644 index 00000000..63e2e040 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png new file mode 100644 index 00000000..934402bd Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png new file mode 100644 index 00000000..2582dd58 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png new file mode 100644 index 00000000..06daaaf3 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png new file mode 100644 index 00000000..250e61fc Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png new file mode 100644 index 00000000..849cc254 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png new file mode 100644 index 00000000..b99adf87 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png new file mode 100644 index 00000000..be406743 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png new file mode 100644 index 00000000..f5793ed7 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png new file mode 100644 index 00000000..c2d6dc32 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png new file mode 100644 index 00000000..6860ac7b Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png new file mode 100644 index 00000000..5c0f9493 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png new file mode 100644 index 00000000..9723b914 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png new file mode 100644 index 00000000..abd8fe4e Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png new file mode 100644 index 00000000..8972d910 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png new file mode 100644 index 00000000..881c9948 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png new file mode 100644 index 00000000..1c3c070d Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png new file mode 100644 index 00000000..54295a26 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png new file mode 100644 index 00000000..1bcc361f Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png new file mode 100644 index 00000000..c842fdfd Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png new file mode 100644 index 00000000..25f277e1 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png new file mode 100644 index 00000000..edf5f726 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png new file mode 100644 index 00000000..92cae0b7 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png new file mode 100644 index 00000000..6a9510f4 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png new file mode 100644 index 00000000..1818767c Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png differ diff --git a/plugins/net.mograsim.plugin.core/plugin.xml b/plugins/net.mograsim.plugin.core/plugin.xml new file mode 100644 index 00000000..dccf76c8 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/plugin.xml @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %colorDefinition.description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java new file mode 100644 index 00000000..8ff21f49 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java @@ -0,0 +1,45 @@ +package net.mograsim.plugin; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; + +public class AsmOps +{ + public static Set ops = new HashSet<>(); + public static Set>> listeners = new HashSet<>(); + + static + { + ops.add("add"); + ops.add("mul"); + ops.add("mov"); + ops.add("inc"); + } + + public static void setWords(Collection s) + { + if (ops.size() == s.size() && ops.containsAll(s)) + return; + ops.clear(); + ops.addAll(s); + update(); + } + + public static void addListener(Consumer> con) + { + listeners.add(con); + con.accept(ops); + } + + public static void removeListener(Consumer> con) + { + listeners.remove(con); + } + + public static void update() + { + listeners.forEach(c -> c.accept(ops)); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java new file mode 100644 index 00000000..cc96edbb --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java @@ -0,0 +1,66 @@ +package net.mograsim.plugin; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +import net.mograsim.logic.model.am2900.machine.Am2900Machine; +import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MachineRegistry; + +public class MachineContext +{ + private Machine machine; + private Set observers; + private static MachineContext instance; + + private MachineContext() + { + observers = new HashSet<>(); + } + + public static MachineContext getInstance() + { + if (instance == null) + { + instance = new MachineContext(); + // TODO don't hardcode the Am2900 + instance.setMachine(new Am2900Machine((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"))); + } + return instance; + } + + public Machine getMachine() + { + return machine; + } + + public void setMachine(Machine machine) + { + this.machine = machine; + notifyObservers(machine); + } + + public void registerObserver(ContextObserver ob) + { + observers.add(ob); + ob.setMachine(Optional.ofNullable(machine)); + } + + public void deregisterObserver(ContextObserver ob) + { + observers.remove(ob); + } + + private void notifyObservers(Machine machine) + { + observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine))); + } + + @FunctionalInterface + public static interface ContextObserver + { + void setMachine(Optional machine); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java new file mode 100644 index 00000000..c17f5304 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java @@ -0,0 +1,14 @@ +package net.mograsim.plugin; + +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import net.mograsim.machine.MachineRegistry; + +public final class MograsimActivator extends AbstractUIPlugin +{ + + public MograsimActivator() + { + MachineRegistry.reload(); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java new file mode 100644 index 00000000..5fcc1688 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java @@ -0,0 +1,103 @@ +package net.mograsim.plugin; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.themes.ITheme; +import org.eclipse.ui.themes.IThemePreview; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.model.LogicExecuter; +import net.mograsim.logic.model.LogicUICanvas; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.atomic.ModelNotGate; +import net.mograsim.logic.model.model.components.atomic.ModelOrGate; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.preferences.Preferences; + +public class SimulationPreview implements IThemePreview +{ + private LogicUICanvas ui; + private LogicExecuter exec; + private Preferences oldPreferences; + private Preferences currentThemePreferences; + + @Override + @SuppressWarnings("unused") + public void createControl(Composite parent, ITheme currentTheme) + { + oldPreferences = Preferences.current(); + + currentThemePreferences = new ThemePreferences(currentTheme); + // TODO this will change the global preferences; so if another LogicUICanvas redraws, it will use the "new" colors too. + Preferences.setPreferences(currentThemePreferences); + + LogicModelModifiable model = new LogicModelModifiable(); + CoreModelParameters params = new CoreModelParameters(); + params.gateProcessTime = 50; + params.wireTravelTime = 10; + + ModelManualSwitch rIn = new ModelManualSwitch(model, 1); + rIn.moveTo(10, 10); + ModelManualSwitch sIn = new ModelManualSwitch(model, 1); + sIn.moveTo(10, 70); + + ModelOrGate or1 = new ModelOrGate(model, 1); + or1.moveTo(70, 12.5); + new ModelWire(model, rIn.getOutputPin(), or1.getPin("A")); + + ModelOrGate or2 = new ModelOrGate(model, 1); + or2.moveTo(70, 62.5); + new ModelWire(model, sIn.getOutputPin(), or2.getPin("B")); + + ModelNotGate not1 = new ModelNotGate(model, 1); + not1.moveTo(110, 17.5); + new ModelWire(model, or1.getPin("Y"), not1.getPin("A")); + + ModelNotGate not2 = new ModelNotGate(model, 1); + not2.moveTo(110, 67.5); + new ModelWire(model, or2.getPin("Y"), not2.getPin("A")); + + ModelWireCrossPoint p1 = new ModelWireCrossPoint(model, 1); + p1.moveCenterTo(140, 22.5); + new ModelWire(model, not1.getPin("Y"), p1); + new ModelWire(model, p1, or2.getPin("A"), new Point(140, 35), new Point(50, 60), new Point(50, 67.5)); + + ModelWireCrossPoint p2 = new ModelWireCrossPoint(model, 1); + p2.moveCenterTo(140, 72.5); + new ModelWire(model, not2.getPin("Y"), p2); + new ModelWire(model, p2, or1.getPin("B"), new Point(140, 60), new Point(50, 35), new Point(50, 27.5)); + + ModelWireCrossPoint o1 = new ModelWireCrossPoint(model, 1); + o1.moveCenterTo(150, 22.5); + new ModelWire(model, p1, o1); + + ModelWireCrossPoint o2 = new ModelWireCrossPoint(model, 1); + o2.moveCenterTo(150, 72.5); + new ModelWire(model, p2, o2); + + Timeline t = LogicCoreAdapter.convert(model, params); + exec = new LogicExecuter(t); + + rIn.clicked(0, 0); + + ui = new LogicUICanvas(parent, SWT.NONE, model); + + ui.zoom(3.5, 10, 10); + exec.startLiveExecution(); + + currentTheme.addPropertyChangeListener(e -> ui.redraw()); + } + + @Override + public void dispose() + { + exec.stopLiveExecution(); + if (Preferences.current() == currentThemePreferences) + Preferences.setPreferences(oldPreferences); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java new file mode 100644 index 00000000..42da25d1 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java @@ -0,0 +1,65 @@ +package net.mograsim.plugin; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.resource.ColorRegistry; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.ui.statushandlers.StatusManager; +import org.eclipse.ui.themes.ITheme; + +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.DefaultPreferences; +import net.mograsim.preferences.Preferences; + +// TODO proper getInt/getDouble implementation, maybe via own preferences page? +public class ThemePreferences extends Preferences +{ + private final ITheme theme; + + public ThemePreferences(ITheme theme) + { + this.theme = theme; + } + + @Override + public boolean getBoolean(String name) + { + return new DefaultPreferences().getBoolean(name); + } + + @Override + public int getInt(String name) + { + return new DefaultPreferences().getInt(name); + } + + @Override + public double getDouble(String name) + { + return new DefaultPreferences().getDouble(name); + } + + @Override + public ColorDefinition getColorDefinition(String name) + { + RGB rgb = getColorRegistry().getRGB(name); + if (rgb == null) + { + StatusManager.getManager().handle(new Status(IStatus.ERROR, "net.mograsim.plugin.core", "No color for name " + name)); + return null; + } + return new ColorDefinition(rgb.red, rgb.green, rgb.blue); + } + + @Override + public Color getColor(String name) + { + return getColorRegistry().get(name); + } + + private ColorRegistry getColorRegistry() + { + return theme.getColorRegistry(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java new file mode 100644 index 00000000..580c3249 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java @@ -0,0 +1,211 @@ +package net.mograsim.plugin.asm; + +import static java.lang.String.format; + +import java.math.BigInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class AsmNumberUtil +{ + + private AsmNumberUtil() + { + + } + + private static final String sgnPat = "([-+]?)"; + private static final String binPat = "((?:[01]+_)*[01]+)"; + private static final String octPat = "((?:[0-7]+_)*[0-7]+)"; + private static final String decPat = "((?:[0-9]+_)*[0-9]+)"; + private static final String hexPat = "((?:[0-9a-f]+_)*[0-9a-f]+)"; + + private static final String preferredBinPat = "%1$s0b%2$s"; + private static final String preferredOctPat = "%s%sq"; + private static final String preferredDecPat = "%s%s"; + private static final String preferredHexPat = "%1$s0x%2$s"; + + static final Pattern numberBin = Pattern.compile(format(preferredBinPat + "|%1$s%2$sb", sgnPat, binPat), Pattern.CASE_INSENSITIVE); + static final Pattern numberOct = Pattern.compile(format(preferredOctPat, sgnPat, octPat), Pattern.CASE_INSENSITIVE); + static final Pattern numberDec = Pattern.compile(format(preferredDecPat, sgnPat, decPat)); + static final Pattern numberHex = Pattern.compile(format(preferredHexPat + "|%1$s%2$sh", sgnPat, hexPat), Pattern.CASE_INSENSITIVE); + static final Pattern numberFloat = Pattern.compile(format("%1$s%2$s(?:\\.%2$s)?(?:e%1$s%2$s)?", sgnPat, decPat), + Pattern.CASE_INSENSITIVE); + + public static boolean isPrefix(CharSequence cs, Pattern p) + { + Matcher m = p.matcher(cs); + return m.matches() || m.hitEnd(); + } + + public static boolean isBinary(CharSequence cs) + { + return numberBin.matcher(cs).matches(); + } + + public static boolean isOctal(CharSequence cs) + { + return numberOct.matcher(cs).matches(); + } + + public static boolean isDecimal(CharSequence cs) + { + return numberDec.matcher(cs).matches(); + } + + public static boolean isHexadecimal(CharSequence cs) + { + return numberHex.matcher(cs).matches(); + } + + public static boolean isFloatingPoint(CharSequence cs) + { + return numberFloat.matcher(cs).matches(); + } + + public static boolean isNumber(CharSequence cs) + { + return getType(cs) != NumberType.NONE; + } + + public static boolean quickCheckForNumber(CharSequence cs) + { + if (cs.length() == 0 || !isStart(cs.charAt(0))) + return false; + return cs.length() == 1 || isPart(cs.charAt(1)); + } + + public static boolean isStart(int c) + { + return isDigit(c) || c == '+' || c == '-'; + } + + public static boolean isDigit(int c) + { + return ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'); + } + + public static boolean isPart(int c) + { + return isDigit(c) || isMarker(Character.toLowerCase(c)); + } + + public static boolean isMarker(int lowerCase) + { + switch (lowerCase) + { + case '.': + case '_': + case '+': + case '-': + case 'e': + case 'x': + case 'b': + case 'q': + case 'h': + return true; + default: + return false; + } + } + + public static NumberType getType(CharSequence cs) + { + if (!quickCheckForNumber(cs)) + return NumberType.NONE; + if (isDecimal(cs)) + return NumberType.DECIMAL; + if (isHexadecimal(cs)) + return NumberType.HEXADECIMAL; + if (isBinary(cs)) + return NumberType.BINARY; + if (isOctal(cs)) + return NumberType.OCTAL; + if (isFloatingPoint(cs)) + return NumberType.FLOATINGPOINT; + return NumberType.NONE; + } + + /** + * Checks if the {@link CharSequence} is a prefix of a valid number, and returns the NumberType it is a prefix of. If a String is a + * prefix of multiple different {@link NumberType}s, the one with the smallest radix is returned. If no valid {@link NumberType} is + * found, {@link NumberType#NONE} is returned. + * + * @param cs The potential prefix + * @return The type the {@link CharSequence} is a prefix of + */ + public static NumberType prefixOfType(CharSequence cs) + { + if (isPrefix(cs, numberBin)) + return NumberType.BINARY; + if (isPrefix(cs, numberOct)) + return NumberType.OCTAL; + if (isPrefix(cs, numberDec)) + return NumberType.DECIMAL; + if (isPrefix(cs, numberHex)) + return NumberType.HEXADECIMAL; + if (isPrefix(cs, numberFloat)) + return NumberType.FLOATINGPOINT; + return NumberType.NONE; + } + + private static CharSequence extractSignAndDigits(NumberType type, CharSequence cs) + { + return type.numberPattern.matcher(cs).replaceAll("$1$2").replaceAll("_", ""); + } + + /** + * Computes the {@link BigInteger} value of a {@link CharSequence}, by determining the {@link NumberType} and parsing the number with + * the determined radix. + * + * @throws NumberFormatException if the {@link CharSequence} does not match any of the expected number patterns + */ + public static BigInteger valueOf(CharSequence cs) + { + NumberType type = getType(cs); + if (NumberType.NONE.equals(type)) + throw new NumberFormatException(); + return new BigInteger(extractSignAndDigits(type, cs).toString(), type.radix); + } + + /** + * Formats a {@link BigInteger} in accordance with the pattern associated with the supplied {@link NumberType} + */ + public static String toString(BigInteger number, NumberType type) + { + String pattern; + switch (type) + { + case BINARY: + pattern = preferredBinPat; + break; + case OCTAL: + pattern = preferredOctPat; + break; + default: + case DECIMAL: + pattern = preferredDecPat; + break; + case HEXADECIMAL: + pattern = preferredHexPat; + } + if (number.signum() < 0) + return String.format(pattern, "-", number.abs().toString(type.radix)); + return String.format(pattern, "", number.toString(type.radix)); + } + + public enum NumberType + { + NONE(-1, null), BINARY(2, AsmNumberUtil.numberBin), OCTAL(8, AsmNumberUtil.numberOct), DECIMAL(10, AsmNumberUtil.numberDec), + HEXADECIMAL(16, AsmNumberUtil.numberHex), FLOATINGPOINT(10, AsmNumberUtil.numberFloat); + + public final int radix; + final Pattern numberPattern; + + NumberType(int radix, Pattern numberPattern) + { + this.radix = radix; + this.numberPattern = numberPattern; + } + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java new file mode 100644 index 00000000..cc0d0ffa --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java @@ -0,0 +1,212 @@ +package net.mograsim.plugin.asm; + +import java.util.Arrays; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.eclipse.e4.ui.di.Persist; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.ViewPart; + +import net.mograsim.plugin.AsmOps; + +/** + * This sample class demonstrates how to plug-in a new workbench view. The view shows data obtained from the model. The sample creates a + * dummy model on the fly, but a real implementation would connect to the model available either in this or another plug-in (e.g. the + * workspace). The view is connected to the model using a content provider. + *

+ * The view uses a label provider to define how model objects should be presented in the view. Each view can present the same model objects + * using different labels and icons, if needed. Alternatively, a single label provider can be shared between views in order to ensure that + * objects of the same type are presented in the same way everywhere. + *

+ */ + +public class AsmOpsEdit extends ViewPart +{ + + @Inject + private MPart part; + + /** + * The ID of the view as specified by the extension. + */ + public static final String ID = "plugintest.views.AsmOpsEdit"; + + @Inject + IWorkbench workbench; + + private Text txtInput; + private TableViewer viewer; + + private IAction saveAction; + + class ViewLabelProvider extends LabelProvider implements ITableLabelProvider + { + @Override + public String getColumnText(Object obj, int index) + { + return getText(obj); + } + + @Override + public Image getColumnImage(Object obj, int index) + { + return getImage(obj); + } + + @Override + public Image getImage(Object obj) + { + return workbench.getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT); + } + } + + @Override + public void createPartControl(Composite parent) + { + parent.setLayout(new GridLayout(1, false)); + + txtInput = new Text(parent, SWT.BORDER); + txtInput.setMessage("Enter new Asm OP"); + txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + txtInput.addKeyListener(new KeyListener() + { + + @Override + public void keyReleased(KeyEvent e) + { + // TODO Auto-generated method stub + + } + + @Override + public void keyPressed(KeyEvent e) + { + if (e.keyCode == SWT.CR || e.keyCode == SWT.LF) + { + String in = txtInput.getText().toLowerCase(); + if (in.startsWith("-")) + viewer.remove(in.substring(1).trim()); + else + viewer.add(in.trim()); + txtInput.setText(""); + part.setDirty(true); + save(); + } + } + }); + + viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + + viewer.setContentProvider(ArrayContentProvider.getInstance()); + viewer.setInput(createInitialDataModel()); + viewer.setLabelProvider(new ViewLabelProvider()); + viewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); + + // Create the help context id for the viewer's control + workbench.getHelpSystem().setHelp(viewer.getControl(), "PluginTest.viewer"); + getSite().setSelectionProvider(viewer); + makeActions(); + contributeToActionBars(); + hookContextMenu(); + } + + private Object createInitialDataModel() + { + return AsmOps.ops; + } + + @Override + public void setFocus() + { + txtInput.setFocus(); + } + + @Persist + public void save() + { + AsmOps.setWords(Arrays.stream(viewer.getTable().getItems()).map(i -> (String) i.getData()).collect(Collectors.toList())); + viewer.refresh(); + } + + private void makeActions() + { + saveAction = new Action() + { + public void run() + { + save(); + part.setDirty(false); + } + }; + saveAction.setText("Save"); + saveAction.setToolTipText("Save Changes To ISA"); + saveAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); + } + + private void contributeToActionBars() + { + IActionBars bars = getViewSite().getActionBars(); + fillLocalPullDown(bars.getMenuManager()); + fillLocalToolBar(bars.getToolBarManager()); + } + + private void fillLocalPullDown(IMenuManager manager) + { + manager.add(saveAction); + } + + private void fillContextMenu(IMenuManager manager) + { + manager.add(saveAction); + // Other plug-ins can contribute there actions here + manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); + } + + private void fillLocalToolBar(IToolBarManager manager) + { + manager.add(saveAction); + } + + private void hookContextMenu() + { + MenuManager menuMgr = new MenuManager("#PopupMenu"); + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() + { + public void menuAboutToShow(IMenuManager manager) + { + AsmOpsEdit.this.fillContextMenu(manager); + } + }); + Menu menu = menuMgr.createContextMenu(viewer.getControl()); + viewer.getControl().setMenu(menu); + getSite().registerContextMenu(menuMgr, viewer); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java new file mode 100644 index 00000000..7198a27a --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java @@ -0,0 +1,38 @@ +package net.mograsim.plugin.asm.editor; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.DocumentCommand; +import org.eclipse.jface.text.IAutoEditStrategy; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; + +public class AsmAutoEditStrategy implements IAutoEditStrategy +{ + + @Override + public void customizeDocumentCommand(IDocument document, DocumentCommand command) + { + if (!">".equals(command.text)) + { // NON-NLS-1 + return; + } + try + { + IRegion region = document.getLineInformationOfOffset(command.offset); + String line = document.get(region.getOffset(), command.offset - region.getOffset()); + int index = line.lastIndexOf('<'); + if (index != -1 && (index != line.length() - 1) && line.charAt(index + 1) != '/') + { + String tag = line.substring(index + 1); + command.caretOffset = command.offset + 1; + command.text += "= natureTag.length() +// && text.substring(offset - natureTag.length(), offset).equals(natureTag)) { +// IProjectNatureDescriptor[] natureDescriptors = workspace.getNatureDescriptors(); +// ICompletionProposal[] proposals = new ICompletionProposal[natureDescriptors.length]; +// for (int i = 0; i < natureDescriptors.length; i++) { +// IProjectNatureDescriptor descriptor = natureDescriptors[i]; +// proposals[i] = new CompletionProposal(descriptor.getNatureId(), offset, 0, +// descriptor.getNatureId().length()); +// } +// return proposals; +// } +// if (text.length() >= projectReferenceTag.length() +// && text.substring(offset - projectReferenceTag.length(), offset).equals(projectReferenceTag)) { +// IProject[] projects = workspace.getRoot().getProjects(); +// ICompletionProposal[] proposals = new ICompletionProposal[projects.length]; +// for (int i = 0; i < projects.length; i++) { +// proposals[i] = new CompletionProposal(projects[i].getName(), offset, 0, projects[i].getName().length()); +// } +// return proposals; +// } +// return new ICompletionProposal[0]; +// text. + return AsmOps.ops.stream().map(o -> new AsmOperationProposal(o, "", offset)).toArray(ICompletionProposal[]::new); + } + + @Override + public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) + { + return null; + } + + @Override + public char[] getCompletionProposalAutoActivationCharacters() + { + return new char[] { '\n', '\r' }; // NON-NLS-1 + } + + @Override + public char[] getContextInformationAutoActivationCharacters() + { + return null; + } + + @Override + public String getErrorMessage() + { + return null; + } + + @Override + public IContextInformationValidator getContextInformationValidator() + { + return null; + } + + private class AsmOperationProposal implements ICompletionProposal, ICompletionProposalExtension4 + { + + private String asmOp; + private String desc; + private int offset; + + public AsmOperationProposal(String asmOp, String desc, int offset) + { + this.asmOp = asmOp; + this.desc = desc; + this.offset = offset; + } + + @Override + public boolean isAutoInsertable() + { + return true; + } + + @Override + public void apply(IDocument document) + { + try + { + document.replace(offset, 0, asmOp); + } + catch (BadLocationException e) + { + // ignore + } + } + + @Override + public Point getSelection(IDocument document) + { + return new Point(offset + asmOp.length(), 0); + } + + @Override + public String getAdditionalProposalInfo() + { + return desc; + } + + @Override + public String getDisplayString() + { + return asmOp; + } + + @Override + public Image getImage() + { + return null; // TODO image? + } + + @Override + public IContextInformation getContextInformation() + { + return new IContextInformation() + { + + @Override + public String getInformationDisplayString() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public Image getImage() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getContextDisplayString() + { + // TODO Auto-generated method stub + return null; + } + }; + } + + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java new file mode 100644 index 00000000..91946bc7 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java @@ -0,0 +1,77 @@ +package net.mograsim.plugin.asm.editor; + +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.text.DocumentEvent; +import org.eclipse.jface.text.IDocumentListener; +import org.xml.sax.InputSource; +import org.xml.sax.SAXParseException; + +public class AsmDocumentValidator implements IDocumentListener +{ + + private final IFile file; + private IMarker marker; + + AsmDocumentValidator(IFile file) + { + this.file = file; + } + + @Override + public void documentChanged(DocumentEvent event) + { + if (this.marker != null) + { + try + { + this.marker.delete(); + } + catch (CoreException e) + { + e.printStackTrace(); + } + this.marker = null; + } + try (StringReader reader = new StringReader(event.getDocument().get());) + { + DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + documentBuilder.parse(new InputSource(reader)); + } + catch (Exception ex) + { + try + { + this.marker = file.createMarker(IMarker.PROBLEM); + this.marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); + this.marker.setAttribute(IMarker.MESSAGE, ex.getMessage()); + if (ex instanceof SAXParseException) + { + SAXParseException saxParseException = (SAXParseException) ex; + int lineNumber = saxParseException.getLineNumber(); + int offset = event.getDocument().getLineInformation(lineNumber - 1).getOffset() + saxParseException.getColumnNumber() + - 1; + this.marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); + this.marker.setAttribute(IMarker.CHAR_START, offset); + this.marker.setAttribute(IMarker.CHAR_END, offset + 1); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + @Override + public void documentAboutToBeChanged(DocumentEvent event) + { + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java new file mode 100644 index 00000000..50ab95cd --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java @@ -0,0 +1,44 @@ +package net.mograsim.plugin.asm.editor; + +import org.eclipse.core.resources.IProjectNatureDescriptor; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextHover; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.Region; + +public class AsmHoverProvider implements ITextHover +{ + + @Override + public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) + { + // TODO this is logic for .project file to show nature description on hover. + // Replace with your language logic! + String contents = textViewer.getDocument().get(); + int offset = hoverRegion.getOffset(); + int endIndex = contents.indexOf("", offset); + if (endIndex == -1) + return ""; + int startIndex = contents.substring(0, offset).lastIndexOf(""); + if (startIndex == -1) + return ""; + String selection = contents.substring(startIndex + "".length(), endIndex); + + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + IProjectNatureDescriptor[] natureDescriptors = workspace.getNatureDescriptors(); + for (int i = 0; i < natureDescriptors.length; i++) + { + if (natureDescriptors[i].getNatureId().equals(selection)) + return natureDescriptors[i].getLabel(); + } + return ""; + } + + @Override + public IRegion getHoverRegion(ITextViewer textViewer, int offset) + { + return new Region(offset, 0); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java new file mode 100644 index 00000000..655160e0 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java @@ -0,0 +1,61 @@ +package net.mograsim.plugin.asm.editor; + +import org.eclipse.jface.resource.ColorRegistry; +import org.eclipse.jface.resource.FontRegistry; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.TextAttribute; +import org.eclipse.jface.text.presentation.PresentationReconciler; +import org.eclipse.jface.text.rules.DefaultDamagerRepairer; +import org.eclipse.jface.text.rules.EndOfLineRule; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.themes.ITheme; + +import net.mograsim.plugin.asm.editor.rules.AsmLabelRule; +import net.mograsim.plugin.asm.editor.rules.AsmNumberRule; +import net.mograsim.plugin.asm.editor.rules.InstructionRule; + +public class AsmPresentationReconciler extends PresentationReconciler +{ + + private final Token comment = new Token(null); +// private final Token std = new Token(null); + private final Token op = new Token(null); + private final Token label = new Token(null); + private final Token number = new Token(null); + + private IRule[] rules; + + public AsmPresentationReconciler() + { + RuleBasedScanner scanner = new RuleBasedScanner(); + rules = new IRule[4]; + rules[0] = new EndOfLineRule(";", comment); + rules[1] = new AsmLabelRule(label); + rules[2] = new InstructionRule(Token.UNDEFINED, op, true); + rules[3] = new AsmNumberRule(number); + + scanner.setRules(rules); + DefaultDamagerRepairer dr = new DefaultDamagerRepairer(scanner); + this.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); + this.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); + + ITheme current = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(); + updateStyle(current); + current.getColorRegistry().addListener(e -> updateStyle(current)); + current.getFontRegistry().addListener(e -> updateStyle(current)); + } + + void updateStyle(ITheme current) + { + ColorRegistry cr = current.getColorRegistry(); + FontRegistry fr = current.getFontRegistry(); + comment.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_comment_color"))); + op.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_operation_color"), null, 0, + fr.get("net.mograsim.plugin.asm_operation_font"))); + label.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_label_color"))); + number.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_number_color"))); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java new file mode 100644 index 00000000..efee8a31 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java @@ -0,0 +1,37 @@ +package net.mograsim.plugin.asm.editor; + +import java.lang.ref.WeakReference; + +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.reconciler.Reconciler; +import org.eclipse.jface.text.source.projection.ProjectionViewer; + +import net.mograsim.plugin.AsmOps; + +public class AsmReconciler extends Reconciler +{ + + private AsmReconcilerStrategy fStrategy; + + public AsmReconciler() + { + fStrategy = new AsmReconcilerStrategy(); + this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE); + } + + @Override + public void install(ITextViewer textViewer) + { + super.install(textViewer); + ProjectionViewer pViewer = (ProjectionViewer) textViewer; + fStrategy.setProjectionViewer(pViewer); + WeakReference tv = new WeakReference<>(textViewer); + AsmOps.addListener(ops -> + { + System.out.println("refresh"); + if (tv.get() != null) + tv.get().invalidateTextPresentation(); + }); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java new file mode 100644 index 00000000..a3253a43 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java @@ -0,0 +1,173 @@ +package net.mograsim.plugin.asm.editor; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.Position; +import org.eclipse.jface.text.reconciler.DirtyRegion; +import org.eclipse.jface.text.reconciler.IReconcilingStrategy; +import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension; +import org.eclipse.jface.text.source.Annotation; +import org.eclipse.jface.text.source.projection.ProjectionAnnotation; +import org.eclipse.jface.text.source.projection.ProjectionViewer; + +public class AsmReconcilerStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension +{ + private IDocument document; + private String oldDocument; + private ProjectionViewer projectionViewer; + private List oldAnnotations = new ArrayList<>(); + private List oldPositions = new ArrayList<>(); + + @Override + public void setDocument(IDocument document) + { + this.document = document; + } + + public void setProjectionViewer(ProjectionViewer projectionViewer) + { + this.projectionViewer = projectionViewer; + } + + @Override + public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) + { + initialReconcile(); + } + + @Override + public void reconcile(IRegion partition) + { + initialReconcile(); + } + + @Override + public void initialReconcile() + { + if (document.get().equals(oldDocument)) + return; + oldDocument = document.get(); + + List positions = getNewPositionsOfAnnotations(); + + List positionsToRemove = new ArrayList<>(); + List annotationToRemove = new ArrayList<>(); + + for (Position position : oldPositions) + { + if (!positions.contains(position)) + { + projectionViewer.getProjectionAnnotationModel().removeAnnotation(oldAnnotations.get(oldPositions.indexOf(position))); + positionsToRemove.add(position); + annotationToRemove.add(oldAnnotations.get(oldPositions.indexOf(position))); + } else + { + positions.remove(position); + } + } + oldPositions.removeAll(positionsToRemove); + oldAnnotations.removeAll(annotationToRemove); + + for (Position position : positions) + { + Annotation annotation = new ProjectionAnnotation(); + projectionViewer.getProjectionAnnotationModel().addAnnotation(annotation, position); + oldPositions.add(position); + oldAnnotations.add(annotation); + } + } + + private static enum SearchingFor + { + START_OF_TAG, START_OF_WORD, END_OF_WORD, END_OF_LINE + } + + private List getNewPositionsOfAnnotations() + { + List positions = new ArrayList<>(); + Map startOfAnnotation = new HashMap<>(); + SearchingFor searchingFor = SearchingFor.START_OF_TAG; + + int characters = document.getLength(); + int currentCharIndex = 0; + + int wordStartIndex = 0; + int sectionStartIndex = 0; + String word = ""; + + try + { + while (currentCharIndex < characters) + { + char currentChar = document.getChar(currentCharIndex); + switch (searchingFor) + { + case START_OF_TAG: + if (currentChar == '<') + { + char nextChar = document.getChar(currentCharIndex + 1); + if (nextChar != '?') + { + sectionStartIndex = currentCharIndex; + searchingFor = SearchingFor.START_OF_WORD; + } + } + break; + case START_OF_WORD: + if (Character.isLetter(currentChar)) + { + wordStartIndex = currentCharIndex; + searchingFor = SearchingFor.END_OF_WORD; + } + break; + case END_OF_WORD: + if (!Character.isLetter(currentChar)) + { + word = document.get(wordStartIndex, currentCharIndex - wordStartIndex); + if (startOfAnnotation.containsKey(word)) + { + searchingFor = SearchingFor.END_OF_LINE; + } else + { + startOfAnnotation.put(word, sectionStartIndex); + searchingFor = SearchingFor.START_OF_TAG; + } + } + break; + case END_OF_LINE: + if (currentChar == '\n') + { + int start = startOfAnnotation.get(word); + if (document.getLineOfOffset(start) != document.getLineOfOffset(currentCharIndex)) + { + positions.add(new Position(start, currentCharIndex + 1 - start)); + } + startOfAnnotation.remove(word); + searchingFor = SearchingFor.START_OF_TAG; + } + break; + } + currentCharIndex++; + } + } + catch (BadLocationException e) + { + // skip the remainder of file due to error + } + return positions; + } + + @Override + public void setProgressMonitor(IProgressMonitor monitor) + { + // no progress monitor used + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java new file mode 100644 index 00000000..8b0b5736 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java @@ -0,0 +1,29 @@ +package net.mograsim.plugin.asm.editor; + +import org.eclipse.core.filebuffers.IDocumentSetupParticipant; +import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.text.IDocument; + +public class ValidatorDocumentSetupParticipant implements IDocumentSetupParticipant, IDocumentSetupParticipantExtension +{ + + @Override + public void setup(IDocument document) + { + } + + @Override + public void setup(IDocument document, IPath location, LocationKind locationKind) + { + if (locationKind == LocationKind.IFILE) + { + IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(location); + document.addDocumentListener(new AsmDocumentValidator(file)); + } + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java new file mode 100644 index 00000000..b55e0b3c --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java @@ -0,0 +1,52 @@ +package net.mograsim.plugin.asm.editor.rules; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.jface.text.rules.ICharacterScanner; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.Token; + +public class AsmLabelRule implements IRule +{ + + /** The token to be returned when this rule is successful */ + protected IToken fToken; + + /** + * Creates a rule which will return the specified token when a numerical sequence is detected. + * + * @param token the token to be returned + */ + public AsmLabelRule(IToken token) + { + Assert.isNotNull(token); + fToken = token; + } + + @Override + public IToken evaluate(ICharacterScanner scanner) + { + int c = scanner.read(); + int i = 1; + if (Character.isJavaIdentifierStart(c)) + { + do + { + c = scanner.read(); + i++; + } while (Character.isJavaIdentifierPart(c)); + if (c == ':') + return fToken; + return abort(scanner, i); + } + scanner.unread(); + return Token.UNDEFINED; + } + + private static IToken abort(ICharacterScanner scanner, int i) + { + for (int j = 0; j < i; j++) + scanner.unread(); + return Token.UNDEFINED; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java new file mode 100644 index 00000000..728030dc --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java @@ -0,0 +1,59 @@ +package net.mograsim.plugin.asm.editor.rules; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.jface.text.rules.ICharacterScanner; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.Token; + +import net.mograsim.plugin.asm.AsmNumberUtil; + +public class AsmNumberRule implements IRule +{ + + /** The token to be returned when this rule is successful */ + protected IToken fToken; + + /** + * Creates a rule which will return the specified token when a numerical sequence is detected. + * + * @param token the token to be returned + */ + public AsmNumberRule(IToken token) + { + Assert.isNotNull(token); + fToken = token; + } + + @Override + public IToken evaluate(ICharacterScanner scanner) + { + int i = 1; + int c = scanner.read(); + if (!AsmNumberUtil.isStart(c)) + return abort(scanner, i); + StringBuilder sb = new StringBuilder(); + sb.appendCodePoint(c); + while (true) + { + c = scanner.read(); + i++; + if (AsmNumberUtil.isPart(c)) + sb.appendCodePoint(c); + else + break; + } + if (!AsmNumberUtil.isNumber(sb)) + return abort(scanner, i); + scanner.unread(); + return fToken; + } + + private static IToken abort(ICharacterScanner scanner, int i) + { + for (int j = 0; j < i; j++) + scanner.unread(); + return Token.UNDEFINED; + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java new file mode 100644 index 00000000..df0f80b4 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java @@ -0,0 +1,48 @@ +package net.mograsim.plugin.asm.editor.rules; + +import java.util.Objects; +import java.util.Set; + +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.IWordDetector; +import org.eclipse.jface.text.rules.WordRule; + +import net.mograsim.plugin.AsmOps; + +public class InstructionRule extends WordRule +{ + private final IToken instToken; + + public InstructionRule(IToken defaultToken, IToken instToken) + { + this(defaultToken, instToken, false); + } + + public InstructionRule(IToken defaultToken, IToken instToken, boolean ignoreCase) + { + super(new InstructionDetector(), Objects.requireNonNull(defaultToken), ignoreCase); + this.instToken = Objects.requireNonNull(instToken); + AsmOps.addListener(this::update); + } + + void update(Set words) + { + fWords.clear(); + words.forEach(s -> fWords.put(s, instToken)); + } + + static class InstructionDetector implements IWordDetector + { + @Override + public boolean isWordStart(char c) + { + return Character.isJavaIdentifierStart(c); + } + + @Override + public boolean isWordPart(char c) + { + return Character.isJavaIdentifierPart(c); + } + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java new file mode 100644 index 00000000..581b4a6f --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java @@ -0,0 +1,82 @@ +package net.mograsim.plugin.nature; + +import java.util.Iterator; +import org.eclipse.core.commands.*; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.handlers.HandlerUtil; + +public class AddRemoveMograsimNatureHandler extends AbstractHandler +{ + + public Object execute(ExecutionEvent event) throws ExecutionException + { + ISelection selection = HandlerUtil.getCurrentSelection(event); + // + if (selection instanceof IStructuredSelection) + { + for (Iterator it = ((IStructuredSelection) selection).iterator(); it.hasNext();) + { + Object element = it.next(); + IProject project = null; + if (element instanceof IProject) + { + project = (IProject) element; + } else if (element instanceof IAdaptable) + { + project = ((IAdaptable) element).getAdapter(IProject.class); + } + if (project != null) + { + try + { + toggleNature(project); + } + catch (CoreException e) + { + // TODO log something + throw new ExecutionException("Failed to toggle nature", e); + } + } + } + } + + return null; + } + + /** + * Toggles sample nature on a project + * + * @param project to have sample nature added or removed + */ + private void toggleNature(IProject project) throws CoreException + { + IProjectDescription description = project.getDescription(); + String[] natures = description.getNatureIds(); + + for (int i = 0; i < natures.length; ++i) + { + if (MograsimNature.NATURE_ID.equals(natures[i])) + { + // Remove the nature + String[] newNatures = new String[natures.length - 1]; + System.arraycopy(natures, 0, newNatures, 0, i); + System.arraycopy(natures, i + 1, newNatures, i, natures.length - i - 1); + description.setNatureIds(newNatures); + project.setDescription(description, null); + return; + } + } + + // Add the nature + String[] newNatures = new String[natures.length + 1]; + System.arraycopy(natures, 0, newNatures, 0, natures.length); + newNatures[natures.length] = MograsimNature.NATURE_ID; + description.setNatureIds(newNatures); + project.setDescription(description, null); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java new file mode 100644 index 00000000..9fc0ea41 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java @@ -0,0 +1,195 @@ +package net.mograsim.plugin.nature; + +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IResourceDeltaVisitor; +import org.eclipse.core.resources.IResourceVisitor; +import org.eclipse.core.resources.IncrementalProjectBuilder; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +public class MograsimBuilder extends IncrementalProjectBuilder +{ + + class SampleDeltaVisitor implements IResourceDeltaVisitor + { + @Override + public boolean visit(IResourceDelta delta) throws CoreException + { + IResource resource = delta.getResource(); + switch (delta.getKind()) + { + case IResourceDelta.ADDED: + // handle added resource + checkXML(resource); + break; + case IResourceDelta.REMOVED: + // handle removed resource + break; + case IResourceDelta.CHANGED: + // handle changed resource + checkXML(resource); + break; + } + // return true to continue visiting children. + return true; + } + } + + class SampleResourceVisitor implements IResourceVisitor + { + public boolean visit(IResource resource) + { + checkXML(resource); + // return true to continue visiting children. + return true; + } + } + + class XMLErrorHandler extends DefaultHandler + { + + private IFile file; + + public XMLErrorHandler(IFile file) + { + this.file = file; + } + + private void addMarker(SAXParseException e, int severity) + { + MograsimBuilder.this.addMarker(file, e.getMessage(), e.getLineNumber(), severity); + } + + public void error(SAXParseException exception) throws SAXException + { + addMarker(exception, IMarker.SEVERITY_ERROR); + } + + public void fatalError(SAXParseException exception) throws SAXException + { + addMarker(exception, IMarker.SEVERITY_ERROR); + } + + public void warning(SAXParseException exception) throws SAXException + { + addMarker(exception, IMarker.SEVERITY_WARNING); + } + } + + public static final String BUILDER_ID = "PluginTest.mograsimBuilder"; + + private static final String MARKER_TYPE = "PluginTest.xmlProblem"; + + private SAXParserFactory parserFactory; + + private void addMarker(IFile file, String message, int lineNumber, int severity) + { + try + { + IMarker marker = file.createMarker(MARKER_TYPE); + marker.setAttribute(IMarker.MESSAGE, message); + marker.setAttribute(IMarker.SEVERITY, severity); + if (lineNumber == -1) + { + lineNumber = 1; + } + marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); + } + catch (CoreException e) + { + } + } + + @Override + protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException + { + if (kind == FULL_BUILD) + { + fullBuild(monitor); + } else + { + IResourceDelta delta = getDelta(getProject()); + if (delta == null) + { + fullBuild(monitor); + } else + { + incrementalBuild(delta, monitor); + } + } + return null; + } + + protected void clean(IProgressMonitor monitor) throws CoreException + { + // delete markers set and files created + getProject().deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE); + } + + void checkXML(IResource resource) + { + if (resource instanceof IFile && resource.getName().endsWith(".xml")) + { + IFile file = (IFile) resource; + deleteMarkers(file); + XMLErrorHandler reporter = new XMLErrorHandler(file); + try + { + getParser().parse(file.getContents(), reporter); + } + catch (Exception e1) + { + } + } + } + + private void deleteMarkers(IFile file) + { + try + { + file.deleteMarkers(MARKER_TYPE, false, IResource.DEPTH_ZERO); + } + catch (CoreException ce) + { + } + } + + protected void fullBuild(final IProgressMonitor monitor) throws CoreException + { + try + { + getProject().accept(new SampleResourceVisitor()); + } + catch (CoreException e) + { + } + } + + private SAXParser getParser() throws ParserConfigurationException, SAXException + { + if (parserFactory == null) + { + parserFactory = SAXParserFactory.newInstance(); + } + return parserFactory.newSAXParser(); + } + + protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException + { + // the visitor does the work. + delta.accept(new SampleDeltaVisitor()); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java new file mode 100644 index 00000000..5422731e --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java @@ -0,0 +1,73 @@ +package net.mograsim.plugin.nature; + +import org.eclipse.core.resources.ICommand; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IProjectNature; +import org.eclipse.core.runtime.CoreException; + +public class MograsimNature implements IProjectNature +{ + + /** + * ID of this project nature + */ + public static final String NATURE_ID = "net.mograsim"; + + private IProject project; + + @Override + public void configure() throws CoreException + { + IProjectDescription desc = project.getDescription(); + ICommand[] commands = desc.getBuildSpec(); + + for (int i = 0; i < commands.length; ++i) + { + if (commands[i].getBuilderName().equals(MograsimBuilder.BUILDER_ID)) + { + return; + } + } + + ICommand[] newCommands = new ICommand[commands.length + 1]; + System.arraycopy(commands, 0, newCommands, 0, commands.length); + ICommand command = desc.newCommand(); + command.setBuilderName(MograsimBuilder.BUILDER_ID); + newCommands[newCommands.length - 1] = command; + desc.setBuildSpec(newCommands); + project.setDescription(desc, null); + } + + @Override + public void deconfigure() throws CoreException + { + IProjectDescription description = getProject().getDescription(); + ICommand[] commands = description.getBuildSpec(); + for (int i = 0; i < commands.length; ++i) + { + if (commands[i].getBuilderName().equals(MograsimBuilder.BUILDER_ID)) + { + ICommand[] newCommands = new ICommand[commands.length - 1]; + System.arraycopy(commands, 0, newCommands, 0, i); + System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1); + description.setBuildSpec(newCommands); + project.setDescription(description, null); + return; + } + } + } + + @Override + public IProject getProject() + { + return project; + } + + @Override + public void setProject(IProject project) + { + this.project = project; + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java new file mode 100644 index 00000000..c94e440a --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java @@ -0,0 +1,19 @@ +package net.mograsim.plugin.tables; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.ColumnLabelProvider; + +import net.mograsim.plugin.asm.AsmNumberUtil; +import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; + +public class AddressLabelProvider extends ColumnLabelProvider +{ + @Override + public String getText(Object element) + { + @SuppressWarnings("rawtypes") + TableRow row = (TableRow) element; + return AsmNumberUtil.toString(BigInteger.valueOf(row.address), NumberType.HEXADECIMAL); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java new file mode 100644 index 00000000..dde6b015 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java @@ -0,0 +1,49 @@ +package net.mograsim.plugin.tables; + +import java.util.HashSet; +import java.util.Set; + +import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; + +public class DisplaySettings +{ + private NumberType dataNumberType; + private final Set observers; + + public DisplaySettings() + { + this(NumberType.HEXADECIMAL); + } + + public DisplaySettings(NumberType dataNumberType) + { + this.dataNumberType = dataNumberType; + observers = new HashSet<>(); + } + + public NumberType getDataNumberType() + { + return dataNumberType; + } + + public void setDataNumberType(NumberType dataNumberType) + { + this.dataNumberType = dataNumberType; + notifyObservers(); + } + + void notifyObservers() + { + observers.forEach(r -> r.run()); + } + + public void addObserver(Runnable ob) + { + observers.add(ob); + } + + public void removeObserver(Runnable ob) + { + observers.remove(ob); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java new file mode 100644 index 00000000..1b371e28 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java @@ -0,0 +1,64 @@ +package net.mograsim.plugin.tables; + +import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.ILazyContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Table; + +public class LazyTableViewer extends TableViewer +{ + public static Color highlightColor = Display.getDefault().getSystemColor(SWT.COLOR_YELLOW); + + public LazyTableViewer(Composite parent, int style) + { + super(parent, style | SWT.VIRTUAL); + } + + public LazyTableViewer(Composite parent) + { + super(parent); + } + + public LazyTableViewer(Table table) + { + super(table); + } + + public void highlightRow(int index, boolean highlight) + { + Table table = getTable(); + if (index < 0 || index >= table.getItemCount()) + return; + table.getItem(index).setBackground(highlight ? highlightColor : table.getBackground()); + System.out.println("Infinite loop!!!"); + ((ILazyContentProvider) getContentProvider()).updateElement(index); + } + + @Override + public void setContentProvider(IContentProvider provider) + { + if (!(provider instanceof ILazyContentProvider)) + throw new IllegalArgumentException("Content provider must be an ILazyContentProvider"); + super.setContentProvider(provider); + } + + @Override + public void refresh() + { + Table t = getTable(); + ILazyContentProvider provider = (ILazyContentProvider) getContentProvider(); + doClearAll(); + int startIndex = t.getTopIndex(); + int numRows = t.getBounds().height / t.getItemHeight(); + int endIndex = Integer.min(startIndex + numRows + 5, doGetItemCount()); + + for (int i = startIndex; i < endIndex; i++) + { + provider.updateElement(i); + } + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java new file mode 100644 index 00000000..a1d81072 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java @@ -0,0 +1,62 @@ +package net.mograsim.plugin.tables; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TextCellEditor; + +import net.mograsim.plugin.asm.AsmNumberUtil; + +public abstract class NumberCellEditingSupport extends EditingSupport +{ + private final TableViewer viewer; + private final CellEditor editor; + private final DisplaySettings displaySettings; + + public NumberCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings) + { + super(viewer); + this.viewer = viewer; + this.displaySettings = displaySettings; + editor = new TextCellEditor(viewer.getTable()); + editor.setValidator(new NumberCellEditorValidator()); + } + + @Override + final protected boolean canEdit(Object element) + { + return true; + } + + @Override + final protected CellEditor getCellEditor(Object element) + { + return editor; + } + + @Override + final protected Object getValue(Object element) + { + return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType()); + } + + @Override + final protected void setValue(Object element, Object userInput) + { + try + { + setAsBigInteger(element, AsmNumberUtil.valueOf((String) userInput)); + } + catch (@SuppressWarnings("unused") NumberFormatException e) + { + setAsBigInteger(element, BigInteger.valueOf(0)); + } + viewer.update(element, null); + } + + protected abstract void setAsBigInteger(Object element, BigInteger value); + + protected abstract BigInteger getAsBigInteger(Object element); +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java new file mode 100644 index 00000000..e0b445dd --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java @@ -0,0 +1,17 @@ +package net.mograsim.plugin.tables; + +import org.eclipse.jface.viewers.ICellEditorValidator; + +import net.mograsim.plugin.asm.AsmNumberUtil; + +public class NumberCellEditorValidator implements ICellEditorValidator +{ + + @Override + public String isValid(Object value) + { + return AsmNumberUtil.NumberType.NONE.equals(AsmNumberUtil.getType((String) value)) ? (String) value + "is not a valid number" + : null; + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java new file mode 100644 index 00000000..6ee2c2b4 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java @@ -0,0 +1,25 @@ +package net.mograsim.plugin.tables; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.ColumnLabelProvider; + +import net.mograsim.plugin.asm.AsmNumberUtil; + +public abstract class NumberColumnLabelProvider extends ColumnLabelProvider +{ + private DisplaySettings displaySettings; + + public NumberColumnLabelProvider(DisplaySettings displaySettings) + { + this.displaySettings = displaySettings; + } + + @Override + public String getText(Object element) + { + return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType()); + } + + public abstract BigInteger getAsBigInteger(Object element); +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java new file mode 100644 index 00000000..b72df0e9 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java @@ -0,0 +1,67 @@ +package net.mograsim.plugin.tables; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; + +public class RadixSelector +{ + private final Composite parent; + private final DisplaySettings target; + private Label label; + private Combo combo; + + public RadixSelector(Composite parent, DisplaySettings target) + { + this.parent = parent; + this.target = target; + setupRadixSelector(); + } + + private void setupRadixSelector() + { + label = new Label(parent, SWT.NONE); + label.setText("Radix: "); + combo = new Combo(parent, SWT.READ_ONLY); + + String entries[] = new String[] { "Binary", "Octal", "Decimal", "Hexadecimal" }; + NumberType corTypes[] = new NumberType[] { NumberType.BINARY, NumberType.OCTAL, NumberType.DECIMAL, NumberType.HEXADECIMAL }; + combo.setItems(entries); + combo.select(3); + combo.addSelectionListener(new SelectionListener() + { + @Override + public void widgetSelected(SelectionEvent e) + { + int index = combo.getSelectionIndex(); + if (index == -1) + target.setDataNumberType(NumberType.HEXADECIMAL); + else + { + target.setDataNumberType(corTypes[index]); + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) + { + widgetSelected(e); + } + }); + } + + public Label getLabel() + { + return label; + } + + public Combo getCombo() + { + return combo; + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java new file mode 100644 index 00000000..46b7c5c3 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java @@ -0,0 +1,23 @@ +package net.mograsim.plugin.tables; + +public class TableRow +{ + public final T data; + public final long address; + + public TableRow(long address, T data) + { + this.data = data; + this.address = address; + } + + public T getData() + { + return data; + } + + public long getAddress() + { + return address; + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java new file mode 100644 index 00000000..46eefcd9 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java @@ -0,0 +1,30 @@ +package net.mograsim.plugin.tables.memory; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.TableViewer; + +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.NumberCellEditingSupport; + +public class MemoryCellEditingSupport extends NumberCellEditingSupport +{ + public MemoryCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings) + { + super(viewer, displaySettings); + } + + @Override + protected void setAsBigInteger(Object element, BigInteger value) + { + MemoryTableRow row = (MemoryTableRow) element; + row.getMemory().setCellAsBigInteger(row.address, value); + } + + @Override + protected BigInteger getAsBigInteger(Object element) + { + MemoryTableRow row = (MemoryTableRow) element; + return row.getMemory().getCellAsBigInteger(row.address); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java new file mode 100644 index 00000000..aaecc754 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java @@ -0,0 +1,79 @@ +package net.mograsim.plugin.tables.memory; + +import org.eclipse.jface.viewers.ILazyContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.widgets.Display; + +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MemoryObserver; + +public class MemoryTableContentProvider implements ILazyContentProvider, MemoryObserver +{ + private long lower; + private TableViewer viewer; + private final static int limit = 10_000; + private int amount = 0; + private MainMemory memory; + + public void setLowerBound(long lower) + { + if (memory != null) + this.lower = Long.min(memory.getDefinition().getMaximalAddress(), Long.max(memory.getDefinition().getMinimalAddress(), lower)); + else + this.lower = lower; + updateItemCount(); + } + + public void updateItemCount() + { + if (memory != null) + { + long size = memory.getDefinition().getMaximalAddress() - lower; + viewer.setItemCount(size > amount ? amount : (int) size); + } else + viewer.setItemCount(0); + } + + public long getLowerBound() + { + return lower; + } + + public void setAmount(int amount) + { + this.amount = Integer.min(amount, limit); + updateItemCount(); + } + + public int getAmount() + { + return amount; + } + + @Override + public void updateElement(int index) + { + long address = lower + index; + if (address <= memory.getDefinition().getMaximalAddress()) + viewer.replace(new MemoryTableRow(address, memory), index); + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) + { + this.viewer = (TableViewer) viewer; + this.memory = (MainMemory) newInput; + if (oldInput != null) + ((MainMemory) oldInput).deregisterObserver(this); + if (memory != null) + memory.registerObserver(this); + setLowerBound(0L); + } + + @Override + public void update(long address) + { + Display.getDefault().asyncExec(() -> updateElement((int) (address - lower))); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java new file mode 100644 index 00000000..81ee6e65 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java @@ -0,0 +1,17 @@ +package net.mograsim.plugin.tables.memory; + +import net.mograsim.machine.MainMemory; +import net.mograsim.plugin.tables.TableRow; + +public class MemoryTableRow extends TableRow +{ + public MemoryTableRow(long address, MainMemory memory) + { + super(address, memory); + } + + public MainMemory getMemory() + { + return getData(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java new file mode 100644 index 00000000..09368807 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java @@ -0,0 +1,175 @@ +package net.mograsim.plugin.tables.memory; + +import java.math.BigInteger; +import java.util.Optional; + +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.part.ViewPart; + +import net.mograsim.machine.Machine; +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MainMemoryDefinition; +import net.mograsim.machine.standard.memory.WordAddressableMemory; +import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.MachineContext.ContextObserver; +import net.mograsim.plugin.asm.AsmNumberUtil; +import net.mograsim.plugin.tables.AddressLabelProvider; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.LazyTableViewer; +import net.mograsim.plugin.tables.NumberColumnLabelProvider; +import net.mograsim.plugin.tables.RadixSelector; + +public class MemoryView extends ViewPart implements ContextObserver +{ + private LazyTableViewer viewer; + private MemoryTableContentProvider provider; + private DisplaySettings displaySettings; + + @Override + public void createPartControl(Composite parent) + { + provider = new MemoryTableContentProvider(); + displaySettings = new DisplaySettings(); + + GridLayout layout = new GridLayout(6, false); + parent.setLayout(layout); + + createHeader(parent); + createViewer(parent); + + displaySettings.addObserver(() -> viewer.refresh()); + + setupContextBinding(); + } + + @SuppressWarnings("unused") + private void createHeader(Composite parent) + { + Label fromLabel = new Label(parent, SWT.NONE); + fromLabel.setText("Address: "); + Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH); + fromText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); + VerifyListener vl = new NumberVerifyListener(); + fromText.addVerifyListener(vl); + fromText.setText("0"); + fromText.addModifyListener(e -> + { + try + { + provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue()); + viewer.refresh(); + } + catch (NumberFormatException ex) + { + // Nothing to do here + } + }); + + Label amountLabel = new Label(parent, SWT.NONE); + amountLabel.setText("Number of cells: "); + Text amountText = new Text(parent, SWT.BORDER | SWT.SEARCH); + amountText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); + amountText.addVerifyListener(vl); + amountText.setText("0"); + amountText.addModifyListener(e -> + { + try + { + provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue()); + viewer.refresh(); + } + catch (NumberFormatException ex) + { + // Nothing to do here + } + }); + new RadixSelector(parent, displaySettings); + } + + private void createViewer(Composite parent) + { + viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); + createColumns(); + Table table = viewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + viewer.setUseHashlookup(true); + viewer.setContentProvider(provider); + bindMainMemory(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE))); + getSite().setSelectionProvider(viewer); + + GridData gd = new GridData(); + gd.verticalAlignment = GridData.FILL; + gd.horizontalSpan = 6; + gd.grabExcessHorizontalSpace = true; + gd.grabExcessVerticalSpace = true; + gd.horizontalAlignment = GridData.FILL; + viewer.getControl().setLayoutData(gd); + } + + private void createColumns() + { + String[] titles = { "Address", "Data" }; + int[] bounds = { 100, 100 }; + + TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]); + col.setLabelProvider(new AddressLabelProvider()); + + col = createTableViewerColumn(titles[1], bounds[1]); + col.setLabelProvider(new NumberColumnLabelProvider(displaySettings) + { + @Override + public BigInteger getAsBigInteger(Object element) + { + MemoryTableRow row = (MemoryTableRow) element; + return row.getMemory().getCellAsBigInteger(row.address); + } + + }); + col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings)); + } + + private TableViewerColumn createTableViewerColumn(String title, int bound) + { + TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); + TableColumn column = viewerColumn.getColumn(); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(false); + return viewerColumn; + } + + @Override + public void setFocus() + { + viewer.getControl().setFocus(); + } + + private void bindMainMemory(MainMemory m) + { + viewer.setInput(m); + } + + private void setupContextBinding() + { + MachineContext.getInstance().registerObserver(this); + setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); + } + + @Override + public void setMachine(Optional machine) + { + if (machine.isPresent()) + bindMainMemory(machine.get().getMainMemory()); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java new file mode 100644 index 00000000..54d71762 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java @@ -0,0 +1,26 @@ +package net.mograsim.plugin.tables.memory; + +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.widgets.Text; + +import net.mograsim.plugin.asm.AsmNumberUtil; +import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; + +public class NumberVerifyListener implements VerifyListener +{ + + @Override + public void verifyText(VerifyEvent e) + { + String text = computeModifiedText(e); + e.doit = !NumberType.NONE.equals(AsmNumberUtil.prefixOfType(text)); + } + + private static String computeModifiedText(VerifyEvent e) + { + String modifiedText = ((Text) e.getSource()).getText(); + modifiedText = modifiedText.substring(0, e.start).concat(e.text).concat(modifiedText.substring(e.end)); + return modifiedText; + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java new file mode 100644 index 00000000..c3318b58 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java @@ -0,0 +1,53 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.CheckboxCellEditor; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewer; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.BooleanClassification; + +public class BooleanEditingSupport extends EditingSupport +{ + private final CheckboxCellEditor editor; + private final BooleanClassification boolClass; + private final TableViewer viewer; + private final int index; + + public BooleanEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index) + { + super(viewer); + this.viewer = viewer; + this.boolClass = (BooleanClassification) definition.getParameterClassification(index); + editor = new CheckboxCellEditor(viewer.getTable()); + this.index = index; + } + + @Override + protected boolean canEdit(Object element) + { + return true; + } + + @Override + protected CellEditor getCellEditor(Object element) + { + return editor; + } + + @Override + protected Object getValue(Object element) + { + return ((InstructionTableRow) element).data.getParameter(index).getValue().getMSBit(0).equals(Bit.ONE); + } + + @Override + protected void setValue(Object element, Object value) + { + ((InstructionTableRow) element).data.setParameter(index, boolClass.get((Boolean) value)); + viewer.update(element, null); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java new file mode 100644 index 00000000..b8021b74 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java @@ -0,0 +1,38 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.ILazyContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; + +import net.mograsim.machine.mi.MicroInstructionMemory; + +public class InstructionTableContentProvider implements ILazyContentProvider +{ + private TableViewer viewer; + private MicroInstructionMemory memory; + private long minAddr = 0; + + @Override + public void updateElement(int index) + { + long address = memory.getDefinition().getMinimalAddress() + index; + viewer.replace(new InstructionTableRow(address, memory.getCell(address)), index); + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) + { + this.viewer = (TableViewer) viewer; + this.memory = (MicroInstructionMemory) newInput; + if (this.memory != null) + { + this.viewer.setItemCount((int) memory.size()); + this.minAddr = memory.getDefinition().getMinimalAddress(); + } + } + + public void update(long address) + { + updateElement((int) (address - minAddr)); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java new file mode 100644 index 00000000..677d1668 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java @@ -0,0 +1,12 @@ +package net.mograsim.plugin.tables.mi; + +import net.mograsim.machine.mi.MicroInstruction; +import net.mograsim.plugin.tables.TableRow; + +public class InstructionTableRow extends TableRow +{ + public InstructionTableRow(long address, MicroInstruction data) + { + super(address, data); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java new file mode 100644 index 00000000..3af070f3 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java @@ -0,0 +1,249 @@ +package net.mograsim.plugin.tables.mi; + +import java.io.File; +import java.io.IOException; +import java.util.Optional; + +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.part.ViewPart; + +import net.mograsim.machine.Machine; +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.MicroInstructionMemory; +import net.mograsim.machine.mi.MicroInstructionMemoryParseException; +import net.mograsim.machine.mi.MicroInstructionMemoryParser; +import net.mograsim.machine.mi.parameters.ParameterClassification; +import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.MachineContext.ContextObserver; +import net.mograsim.plugin.tables.AddressLabelProvider; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.LazyTableViewer; +import net.mograsim.plugin.tables.RadixSelector; +import net.mograsim.plugin.util.DropDownMenu; +import net.mograsim.plugin.util.DropDownMenu.DropDownEntry; + +public class InstructionView extends ViewPart implements ContextObserver +{ + private String saveLoc = null; + private LazyTableViewer viewer; + private TableViewerColumn[] columns = new TableViewerColumn[0]; + private MicroInstructionDefinition miDef; + private MicroInstructionMemory memory; + private DisplaySettings displaySettings; + private InstructionTableContentProvider provider; + private int highlighted = 0; + + @SuppressWarnings("unused") + @Override + public void createPartControl(Composite parent) + { + provider = new InstructionTableContentProvider(); + GridLayout layout = new GridLayout(3, false); + setupMenuButtons(parent); + + displaySettings = new DisplaySettings(); + new RadixSelector(parent, displaySettings); + + parent.setLayout(layout); + viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); + + Table table = viewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + viewer.setUseHashlookup(true); + viewer.setContentProvider(provider); + getSite().setSelectionProvider(viewer); + + GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); + viewerData.horizontalSpan = 3; + viewer.getTable().setLayoutData(viewerData); + + displaySettings.addObserver(() -> viewer.refresh()); + MachineContext.getInstance().registerObserver(this); + setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); + } + + public void highlight(int index) + { + viewer.highlightRow(highlighted, false); + viewer.highlightRow(index, true); + viewer.getTable().setTopIndex(index); + } + + @SuppressWarnings("unused") + private void setupMenuButtons(Composite parent) + { + DropDownEntry open = new DropDownEntry("Open", (e) -> + { + FileDialog d = new FileDialog(parent.getShell(), SWT.NONE); + d.open(); + String filename = d.getFileName(); + if (!filename.equals("")) + open(d.getFilterPath() + File.separator + filename); + }); + + DropDownEntry save = new DropDownEntry("Save", (e) -> + { + if (saveLoc == null) + openSaveAsDialog(parent); + save(saveLoc); + }); + DropDownEntry saveAs = new DropDownEntry("SaveAs", (e) -> + { + openSaveAsDialog(parent); + save(saveLoc); + }); + new DropDownMenu(parent, "File", open, save, saveAs); + } + + private void openSaveAsDialog(Composite parent) + { + FileDialog d = new FileDialog(parent.getShell(), SWT.SAVE); + d.open(); + String filename = d.getFileName(); + if (!filename.equals("")) + saveLoc = d.getFilterPath() + File.separator + filename; + } + + public void bindMicroInstructionMemory(MicroInstructionMemory memory) + { + deleteColumns(); + this.memory = memory; + viewer.setInput(memory); + this.miDef = memory.getDefinition().getMicroInstructionDefinition(); + createColumns(); + } + + private void deleteColumns() + { + for (TableViewerColumn col : columns) + col.getColumn().dispose(); + } + + private void createColumns() + { + int size = miDef.size(); + columns = new TableViewerColumn[size + 1]; + + TableViewerColumn col = createTableViewerColumn("Address", 200); + columns[0] = col; + col.setLabelProvider(new AddressLabelProvider()); + + int bit = 0; + ParameterClassification[] classes = miDef.getParameterClassifications(); + + for (int i = 0; i < size; i++) + { + int startBit = bit; + int endBit = (bit = bit + classes[i].getExpectedBits()) - 1; + String name = startBit == endBit ? Integer.toString(startBit) : startBit + "..." + endBit; + int bounds = 20 + 20 * classes[i].getExpectedBits(); + + col = createTableViewerColumn(name, bounds); + columns[i + 1] = col; + createEditingAndLabel(col, miDef, i); + } + } + + private void createEditingAndLabel(TableViewerColumn col, MicroInstructionDefinition miDef, int index) + { + ParameterClassification parameterClassification = miDef.getParameterClassifications()[index]; + EditingSupport support; + ColumnLabelProvider provider; + switch (parameterClassification.getExpectedType()) + { + case BOOLEAN_IMMEDIATE: + support = new BooleanEditingSupport(viewer, miDef, index); + provider = new ParameterLabelProvider(index); + break; + case INTEGER_IMMEDIATE: + support = new IntegerEditingSupport(viewer, miDef, index, displaySettings, this.provider); + provider = new IntegerColumnLabelProvider(displaySettings, index); + break; + case MNEMONIC: + support = new MnemonicEditingSupport(viewer, miDef, index, this.provider); + provider = new ParameterLabelProvider(index); + break; + default: + throw new IllegalStateException( + "Unable to create EditingSupport for unknown ParameterType " + parameterClassification.getExpectedType()); + } + col.setEditingSupport(support); + col.setLabelProvider(provider); + col.getColumn().setToolTipText(miDef.getParameterDescription(index).orElse("")); + } + + private TableViewerColumn createTableViewerColumn(String title, int bound) + { + TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); + TableColumn column = viewerColumn.getColumn(); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(false); + return viewerColumn; + } + + private void open(String file) + { + if (miDef == null) + { + System.err.println("Failed to parse MicroprogrammingMemory from File. No MicroInstructionDefinition assigned."); + return; + } + try + { + MicroInstructionMemoryParser.parseMemory(memory, file); + viewer.refresh(); + saveLoc = file; + } + catch (IOException | MicroInstructionMemoryParseException e) + { + e.printStackTrace(); + } + } + + private void save(String file) + { + if (memory == null) + { + System.err.println("Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned."); + } + if (saveLoc != null) + { + try + { + MicroInstructionMemoryParser.write(memory, file); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + } + + @Override + public void setFocus() + { + viewer.getControl().setFocus(); + } + + @Override + public void setMachine(Optional machine) + { + if (machine.isPresent()) + { + Machine actualMachine = machine.get(); + bindMicroInstructionMemory(actualMachine.getMicroInstructionMemory()); + } + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java new file mode 100644 index 00000000..ce61581f --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java @@ -0,0 +1,25 @@ +package net.mograsim.plugin.tables.mi; + +import java.math.BigInteger; + +import net.mograsim.machine.mi.parameters.IntegerImmediate; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.NumberColumnLabelProvider; + +public class IntegerColumnLabelProvider extends NumberColumnLabelProvider +{ + private int index; + + public IntegerColumnLabelProvider(DisplaySettings displaySettings, int index) + { + super(displaySettings); + this.index = index; + } + + @Override + public BigInteger getAsBigInteger(Object element) + { + return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java new file mode 100644 index 00000000..d3b48ce4 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java @@ -0,0 +1,43 @@ +package net.mograsim.plugin.tables.mi; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.TableViewer; + +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.IntegerClassification; +import net.mograsim.machine.mi.parameters.IntegerImmediate; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.NumberCellEditingSupport; + +public class IntegerEditingSupport extends NumberCellEditingSupport +{ + private IntegerClassification classification; + private int index; + private InstructionTableContentProvider provider; + + public IntegerEditingSupport(TableViewer viewer, MicroInstructionDefinition miDef, int index, DisplaySettings displaySettings, + InstructionTableContentProvider provider) + { + super(viewer, displaySettings); + classification = (IntegerClassification) miDef.getParameterClassifications()[index]; + this.index = index; + this.provider = provider; + } + + @Override + protected void setAsBigInteger(Object element, BigInteger value) + { + InstructionTableRow row = ((InstructionTableRow) element); + row.data.setParameter(index, new IntegerImmediate(value, classification.getExpectedBits())); + provider.update(row.address); +// viewer.update(element, null); Does not do anything for some reason + } + + @Override + protected BigInteger getAsBigInteger(Object element) + { + return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java new file mode 100644 index 00000000..98181c46 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java @@ -0,0 +1,24 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.ICellEditorValidator; + +import net.mograsim.machine.mi.parameters.MnemonicFamily; + +public class MnemonicCellEditorValidator implements ICellEditorValidator +{ + private MnemonicFamily family; + + public MnemonicCellEditorValidator(MnemonicFamily family) + { + this.family = family; + } + + @Override + public String isValid(Object value) + { + int index = (Integer) value; + return index >= 0 && index < family.size() ? null + : String.format("MnemonicFamily has %s elements, index %s is out of bounds", family.size(), value.toString()); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java new file mode 100644 index 00000000..765e4343 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java @@ -0,0 +1,57 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.ComboBoxCellEditor; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; + +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.Mnemonic; +import net.mograsim.machine.mi.parameters.MnemonicFamily; + +public class MnemonicEditingSupport extends EditingSupport +{ + private final ComboBoxCellEditor editor; + private final MnemonicFamily family; + private final int index; + private InstructionTableContentProvider provider; + + public MnemonicEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index, + InstructionTableContentProvider provider) + { + super(viewer); + family = (MnemonicFamily) definition.getParameterClassifications()[index]; + editor = new ComboBoxCellEditor(viewer.getTable(), family.getStringValues(), SWT.READ_ONLY); + this.index = index; + editor.setValidator(new MnemonicCellEditorValidator(family)); + this.provider = provider; + } + + @Override + protected boolean canEdit(Object element) + { + return true; + } + + @Override + protected CellEditor getCellEditor(Object element) + { + return editor; + } + + @Override + protected Object getValue(Object element) + { + return ((Mnemonic) ((InstructionTableRow) element).data.getParameter(index)).ordinal(); + } + + @Override + protected void setValue(Object element, Object value) + { + InstructionTableRow row = ((InstructionTableRow) element); + row.data.setParameter(index, family.get((Integer) value)); + provider.update(row.address); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java new file mode 100644 index 00000000..5e06370a --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java @@ -0,0 +1,20 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.ColumnLabelProvider; + +public class ParameterLabelProvider extends ColumnLabelProvider +{ + private final int index; + + public ParameterLabelProvider(int index) + { + super(); + this.index = index; + } + + @Override + public String getText(Object element) + { + return ((InstructionTableRow) element).data.getParameter(index).toString(); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java new file mode 100644 index 00000000..ffa18575 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java @@ -0,0 +1,86 @@ +package net.mograsim.plugin.util; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; + +public class DropDownMenu +{ + private Button button; + + public DropDownMenu(Composite parent, String label, DropDownEntry... entries) + { + button = new Button(parent, SWT.PUSH); + button.setText(label); + setupDrowpDownMenu(entries); + } + + private void setupDrowpDownMenu(DropDownEntry[] entries) + { + Menu menu = new Menu(button); + for (DropDownEntry entry : entries) + { + MenuItem item = new MenuItem(menu, SWT.PUSH); + item.addSelectionListener(new SelectionListener() + { + @Override + public void widgetSelected(SelectionEvent e) + { + entry.listener.widgetSelected(e); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) + { + widgetSelected(e); + } + }); + item.setText(entry.title); + } + + button.addListener(SWT.Selection, new Listener() + { + @Override + public void handleEvent(Event event) + { + Rectangle rect = button.getBounds(); + Point pt = new Point(rect.x, rect.y + rect.height); + pt = button.getParent().toDisplay(pt); + menu.setLocation(pt.x, pt.y); + menu.setVisible(true); + } + }); + } + + public Button getButton() + { + return button; + } + + public static class DropDownEntry + { + public final String title; + public final EntrySelectedListener listener; + + public DropDownEntry(String title, EntrySelectedListener listener) + { + super(); + this.title = title; + this.listener = listener; + } + } + + @FunctionalInterface + public static interface EntrySelectedListener + { + public void widgetSelected(SelectionEvent e); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java new file mode 100644 index 00000000..212f777c --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java @@ -0,0 +1,62 @@ +package net.mograsim.plugin.views; + +import javax.inject.Inject; + +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.ViewPart; + +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; +import net.mograsim.logic.model.LogicExecuter; +import net.mograsim.logic.model.LogicUICanvas; +import net.mograsim.machine.Machine; +import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.ThemePreferences; +import net.mograsim.preferences.Preferences; + +public class LogicUIPart extends ViewPart +{ + @Inject + private MPart part; + + private LogicExecuter exec; + private LogicUICanvas ui; + + @Override + public void dispose() + { + if (exec != null) + exec.stopLiveExecution(); + } + + @Override + public void createPartControl(Composite parent) + { + // set preferences + Preferences.setPreferences(new ThemePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme())); + + Machine m = MachineContext.getInstance().getMachine(); + + // initialize UI + ui = new LogicUICanvas(parent, SWT.NONE, m.getModel()); + ui.addTransformListener((x, y, z) -> part.setDirty(z < 1)); + ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui); + userInput.buttonDrag = 3; + userInput.buttonZoom = 2; + userInput.enableUserInput(); + + // initialize executer + exec = new LogicExecuter(m.getTimeline()); + + // run it + exec.startLiveExecution(); + } + + @Override + public void setFocus() + { + ui.setFocus(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.docs/.classpath b/plugins/net.mograsim.plugin.docs/.classpath new file mode 100644 index 00000000..bc3587db --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/.project b/plugins/net.mograsim.plugin.docs/.project new file mode 100644 index 00000000..bb1ec996 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/.project @@ -0,0 +1,28 @@ + + + net.mograsim.plugin.docs + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..cd95f141 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/plugins/net.mograsim.plugin.docs/META-INF/MANIFEST.MF b/plugins/net.mograsim.plugin.docs/META-INF/MANIFEST.MF new file mode 100644 index 00000000..b895844a --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Mograsim docs +Bundle-SymbolicName: net.mograsim.plugin.docs;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Automatic-Module-Name: net.mograsim.plugin.docs +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: net.mograsim.plugin.core;bundle-version="0.1.0", + org.eclipse.help diff --git a/plugins/net.mograsim.plugin.docs/build.properties b/plugins/net.mograsim.plugin.docs/build.properties new file mode 100644 index 00000000..0b7cb312 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/build.properties @@ -0,0 +1,5 @@ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + html/,\ + *.xml diff --git a/plugins/net.mograsim.plugin.docs/html/.gitkeep b/plugins/net.mograsim.plugin.docs/html/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/plugins/net.mograsim.plugin.docs/plugin.xml b/plugins/net.mograsim.plugin.docs/plugin.xml new file mode 100644 index 00000000..29023f1d --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/plugin.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/toc.xml b/plugins/net.mograsim.plugin.docs/toc.xml new file mode 100644 index 00000000..4a82ec9d --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/toc.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/tocconcepts.xml b/plugins/net.mograsim.plugin.docs/tocconcepts.xml new file mode 100644 index 00000000..d01f925e --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/tocconcepts.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/tocgettingstarted.xml b/plugins/net.mograsim.plugin.docs/tocgettingstarted.xml new file mode 100644 index 00000000..38f27e0b --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/tocgettingstarted.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/tocreference.xml b/plugins/net.mograsim.plugin.docs/tocreference.xml new file mode 100644 index 00000000..660cdecc --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/tocreference.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/tocsamples.xml b/plugins/net.mograsim.plugin.docs/tocsamples.xml new file mode 100644 index 00000000..ddfa61e7 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/tocsamples.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/toctasks.xml b/plugins/net.mograsim.plugin.docs/toctasks.xml new file mode 100644 index 00000000..c96b94bb --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/toctasks.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.preferences/.classpath b/plugins/net.mograsim.preferences/.classpath new file mode 100644 index 00000000..e801ebfb --- /dev/null +++ b/plugins/net.mograsim.preferences/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/plugins/net.mograsim.preferences/.project b/plugins/net.mograsim.preferences/.project new file mode 100644 index 00000000..0f30cb05 --- /dev/null +++ b/plugins/net.mograsim.preferences/.project @@ -0,0 +1,28 @@ + + + net.mograsim.preferences + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..2aece3be --- /dev/null +++ b/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,458 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.preferences/META-INF/MANIFEST.MF b/plugins/net.mograsim.preferences/META-INF/MANIFEST.MF new file mode 100644 index 00000000..315ec1ab --- /dev/null +++ b/plugins/net.mograsim.preferences/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Mograsim Preferences +Bundle-SymbolicName: net.mograsim.preferences +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.preferences +Bundle-Vendor: Mograsim Team +Automatic-Module-Name: net.mograsim.preferences +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.eclipse.swt;bundle-version="3.0.0" diff --git a/plugins/net.mograsim.preferences/build.properties b/plugins/net.mograsim.preferences/build.properties new file mode 100644 index 00000000..b107977f --- /dev/null +++ b/plugins/net.mograsim.preferences/build.properties @@ -0,0 +1,3 @@ +source.. = src/ +bin.includes = META-INF/,\ + . diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java new file mode 100644 index 00000000..621de5f6 --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java @@ -0,0 +1,89 @@ +package net.mograsim.preferences; + +/** + * A way to define a color with the possibility to use colors built into the system (called "system colors" in SWT). + *

+ * A {@link ColorDefinition} is defined either by a {@link BuiltInColor} constant, in which case r==g==b==-1, or by red / green + * / blue components, in which case builtInColor==null + * + * @author Daniel Kirschten + */ +public class ColorDefinition +{ + /** + * The built-in color constant defining this color. + */ + public final ColorDefinition.BuiltInColor builtInColor; + /** + * The red color component defining this color. + */ + public final int r; + /** + * The green color component defining this color. + */ + public final int g; + /** + * The blue color component defining this color. + */ + public final int b; + + public ColorDefinition(ColorDefinition.BuiltInColor col) + { + if (col == null) + throw new IllegalArgumentException("Illegal built-in color: " + col); + this.builtInColor = col; + this.r = -1; + this.g = -1; + this.b = -1; + } + + public ColorDefinition(int r, int g, int b) + { + if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) + throw new IllegalArgumentException("Illegal color components: r=" + r + "; g=" + g + "; b=" + b); + this.builtInColor = null; + this.r = r; + this.g = g; + this.b = b; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + b; + result = prime * result + ((builtInColor == null) ? 0 : builtInColor.hashCode()); + result = prime * result + g; + result = prime * result + r; + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ColorDefinition other = (ColorDefinition) obj; + if (b != other.b) + return false; + if (builtInColor != other.builtInColor) + return false; + if (g != other.g) + return false; + if (r != other.r) + return false; + return true; + } + + public static enum BuiltInColor + { + COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_DARK_RED, COLOR_GREEN, COLOR_DARK_GREEN, COLOR_YELLOW, COLOR_DARK_YELLOW, COLOR_BLUE, + COLOR_DARK_BLUE, COLOR_MAGENTA, COLOR_DARK_MAGENTA, COLOR_CYAN, COLOR_DARK_CYAN, COLOR_GRAY, COLOR_DARK_GRAY; + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java new file mode 100644 index 00000000..f6f5d8dc --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java @@ -0,0 +1,29 @@ +package net.mograsim.preferences; + +import org.eclipse.swt.graphics.Color; + +public abstract class ColorManager +{ + private static ColorManager currentManager; + + public static void setColorManager(ColorManager manager) + { + if (manager == null) + throw new NullPointerException(); + currentManager = manager; + } + + public static ColorManager current() + { + if (currentManager == null) + currentManager = new SimpleColorManager(); + return currentManager; + } + + public abstract Color toColor(ColorDefinition col); + + public void clearCache() + { + // this method is intended to be overridden + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java new file mode 100644 index 00000000..2f5c7c2a --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java @@ -0,0 +1,70 @@ +package net.mograsim.preferences; + +import net.mograsim.preferences.ColorDefinition.BuiltInColor; + +public class DefaultPreferences extends Preferences +{ + @Override + public boolean getBoolean(String name) + { + switch (name) + { + case "net.mograsim.logic.model.improvetext": + return true; + default: + throw new IllegalArgumentException("Unknown boolean preference name: " + name); + } + } + + @Override + public int getInt(String name) + { + switch (name) + { + default: + throw new IllegalArgumentException("Unknown int preference name: " + name); + } + } + + @Override + public double getDouble(String name) + { + switch (name) + { + case "net.mograsim.logic.model.linewidth.default": + return 0.5; + case "net.mograsim.logic.model.linewidth.wire.singlebit": + return 0.5; + case "net.mograsim.logic.model.linewidth.wire.multibit": + return 0.85; + default: + throw new IllegalArgumentException("Unknown double preference name: " + name); + } + } + + @Override + public ColorDefinition getColorDefinition(String name) + { + switch (name) + { + case "net.mograsim.logic.model.color.bit.one": + return new ColorDefinition(BuiltInColor.COLOR_GREEN); + case "net.mograsim.logic.model.color.bit.u": + return new ColorDefinition(BuiltInColor.COLOR_CYAN); + case "net.mograsim.logic.model.color.bit.x": + return new ColorDefinition(BuiltInColor.COLOR_RED); + case "net.mograsim.logic.model.color.bit.z": + return new ColorDefinition(BuiltInColor.COLOR_YELLOW); + case "net.mograsim.logic.model.color.bit.zero": + return new ColorDefinition(BuiltInColor.COLOR_GRAY); + case "net.mograsim.logic.model.color.background": + return new ColorDefinition(BuiltInColor.COLOR_WHITE); + case "net.mograsim.logic.model.color.foreground": + return new ColorDefinition(BuiltInColor.COLOR_BLACK); + case "net.mograsim.logic.model.color.text": + return new ColorDefinition(BuiltInColor.COLOR_BLACK); + default: + throw new IllegalArgumentException("Unknown color preference name: " + name); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java new file mode 100644 index 00000000..f2498564 --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java @@ -0,0 +1,35 @@ +package net.mograsim.preferences; + +import java.util.Objects; + +import org.eclipse.swt.graphics.Color; + +public abstract class Preferences +{ + private static Preferences currentPreferences; + + public static void setPreferences(Preferences preferences) + { + currentPreferences = Objects.requireNonNull(preferences); + } + + public static Preferences current() + { + if (currentPreferences == null) + currentPreferences = new DefaultPreferences(); + return currentPreferences; + } + + public abstract boolean getBoolean(String name); + + public abstract int getInt(String name); + + public abstract double getDouble(String name); + + public abstract ColorDefinition getColorDefinition(String name); + + public Color getColor(String name) + { + return ColorManager.current().toColor(getColorDefinition(name)); + } +} diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java new file mode 100644 index 00000000..60b53110 --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java @@ -0,0 +1,95 @@ +package net.mograsim.preferences; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Device; +import org.eclipse.swt.widgets.Display; + +import net.mograsim.preferences.ColorDefinition.BuiltInColor; + +public class SimpleColorManager extends ColorManager +{ + private static final Map systemColors = new HashMap<>(); + + private final Device device; + private final Map cachedColors; + + public SimpleColorManager() + { + this.device = Display.getCurrent(); + this.cachedColors = new HashMap<>(systemColors); + } + + @Override + public Color toColor(ColorDefinition col) + { + if (col == null) + return null; + Color cachedColor = cachedColors.get(col); + if (cachedColor != null) + return cachedColor; + if (col.builtInColor != null) + { + Color systemColor = device.getSystemColor(toSWTColorConstant(col.builtInColor)); + systemColors.put(col, systemColor); + cachedColors.put(col, systemColor); + return systemColor; + } + Color nonSystemColor = new Color(device, col.r, col.g, col.b); + cachedColors.put(col, nonSystemColor); + return nonSystemColor; + } + + @Override + public void clearCache() + { + cachedColors.entrySet().stream().filter(e -> !systemColors.containsKey(e.getKey())).map(Entry::getValue).forEach(Color::dispose); + cachedColors.clear(); + cachedColors.putAll(systemColors); + } + + public static int toSWTColorConstant(BuiltInColor col) + { + switch (col) + { + case COLOR_BLACK: + return SWT.COLOR_BLACK; + case COLOR_BLUE: + return SWT.COLOR_BLUE; + case COLOR_CYAN: + return SWT.COLOR_CYAN; + case COLOR_DARK_BLUE: + return SWT.COLOR_DARK_BLUE; + case COLOR_DARK_CYAN: + return SWT.COLOR_DARK_CYAN; + case COLOR_DARK_GRAY: + return SWT.COLOR_DARK_GRAY; + case COLOR_DARK_GREEN: + return SWT.COLOR_DARK_GREEN; + case COLOR_DARK_MAGENTA: + return SWT.COLOR_DARK_MAGENTA; + case COLOR_DARK_RED: + return SWT.COLOR_DARK_RED; + case COLOR_DARK_YELLOW: + return SWT.COLOR_DARK_YELLOW; + case COLOR_GRAY: + return SWT.COLOR_GRAY; + case COLOR_GREEN: + return SWT.COLOR_GREEN; + case COLOR_MAGENTA: + return SWT.COLOR_MAGENTA; + case COLOR_RED: + return SWT.COLOR_RED; + case COLOR_WHITE: + return SWT.COLOR_WHITE; + case COLOR_YELLOW: + return SWT.COLOR_YELLOW; + default: + throw new IllegalArgumentException("Unknown enum constant: " + col); + } + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..781cda46 --- /dev/null +++ b/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + net.mograsim + pom + + net.mograsim + net.mograsim.configuration + ${revision}${changelist} + ./releng/net.mograsim.configuration + + + plugins + features + releng + tests + SWTHelper + + + + + + \ No newline at end of file diff --git a/products/net.mograsim.product/.project b/products/net.mograsim.product/.project new file mode 100644 index 00000000..d95f9637 --- /dev/null +++ b/products/net.mograsim.product/.project @@ -0,0 +1,22 @@ + + + net.mograsim.product + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/products/net.mograsim.product/.settings/org.eclipse.core.resources.prefs b/products/net.mograsim.product/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/products/net.mograsim.product/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/products/net.mograsim.product/NOTE b/products/net.mograsim.product/NOTE new file mode 100644 index 00000000..c63784b3 --- /dev/null +++ b/products/net.mograsim.product/NOTE @@ -0,0 +1,2 @@ +Not really necessary, but you could still build it as an Eclipse RCP product (by using an appropriate target platform). +This would then be comparable to the pre-configured packages offered at eclipse.org. \ No newline at end of file diff --git a/products/net.mograsim.product/build.properties b/products/net.mograsim.product/build.properties new file mode 100644 index 00000000..f63dee38 --- /dev/null +++ b/products/net.mograsim.product/build.properties @@ -0,0 +1,3 @@ +source.. = src/ +output.. = bin/ +bin.includes = . diff --git a/products/net.mograsim.product/net.mograsim.product b/products/net.mograsim.product/net.mograsim.product new file mode 100644 index 00000000..02443455 --- /dev/null +++ b/products/net.mograsim.product/net.mograsim.product @@ -0,0 +1,702 @@ + + + + + + + + + + -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts + + + + + + + + + + + + + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + + + + https://www.eclipse.org/legal/epl-2.0/ + + This program and the accompanying materials are made available under the +terms of the Eclipse Public License 2.0 which is available at +http://www.eclipse.org/legal/epl-2.0, or GNU General Public License, +version 2 with the GNU Classpath Exception which is available at +https://www.gnu.org/software/classpath/license.html. + +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/releng/net.mograsim.configuration/.project b/releng/net.mograsim.configuration/.project new file mode 100644 index 00000000..03120f4c --- /dev/null +++ b/releng/net.mograsim.configuration/.project @@ -0,0 +1,11 @@ + + + net.mograsim.configuration + + + + + + + + diff --git a/releng/net.mograsim.configuration/pom.xml b/releng/net.mograsim.configuration/pom.xml new file mode 100644 index 00000000..7a58f171 --- /dev/null +++ b/releng/net.mograsim.configuration/pom.xml @@ -0,0 +1,170 @@ + + 4.0.0 + net.mograsim + net.mograsim.configuration + ${revision}${changelist} + pom + + + + 0.1.0 + -SNAPSHOT + + 11 + 1.5.0-SNAPSHOT + UTF-8 + + + + + + tycho-snapshots + https://repo.eclipse.org/content/repositories/tycho-snapshots/ + + true + + + true + + + + + + + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho.version} + true + + + + + + + + org.eclipse.tycho + target-platform-configuration + ${tycho.version} + + + + net.mograsim + net.mograsim.target + ${revision}${changelist} + + + + + linux + gtk + x86_64 + + + win32 + win32 + x86_64 + + + macosx + cocoa + x86_64 + + + + + + + + org.codehaus.mojo + flatten-maven-plugin + 1.1.0 + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho.version} + + + plugin-source + + plugin-source + + + + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho.version} + + + source-feature + package + + source-feature + + + + + + + + + + + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho.version} + + + attach-p2-metadata + package + + p2-metadata + + + + + + + \ No newline at end of file diff --git a/releng/net.mograsim.plugin.updatesite/.project b/releng/net.mograsim.plugin.updatesite/.project new file mode 100644 index 00000000..4a4f372d --- /dev/null +++ b/releng/net.mograsim.plugin.updatesite/.project @@ -0,0 +1,17 @@ + + + net.mograsim.plugin.updatesite + + + + + + org.eclipse.pde.UpdateSiteBuilder + + + + + + org.eclipse.pde.UpdateSiteNature + + diff --git a/releng/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs b/releng/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/releng/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/releng/net.mograsim.plugin.updatesite/category.xml b/releng/net.mograsim.plugin.updatesite/category.xml new file mode 100644 index 00000000..18d4a8d0 --- /dev/null +++ b/releng/net.mograsim.plugin.updatesite/category.xml @@ -0,0 +1,22 @@ + + + + Provides updates for the modular graphical simulator (Mograsim) + + + + + + + Mograsim - Modular Graphical Simulator + + + + + + + + Mograsim Sources for development of Machine Extensions and Plugins + + + diff --git a/releng/net.mograsim.target/.project b/releng/net.mograsim.target/.project new file mode 100644 index 00000000..a66292fd --- /dev/null +++ b/releng/net.mograsim.target/.project @@ -0,0 +1,11 @@ + + + net.mograsim.target + + + + + + + + diff --git a/releng/net.mograsim.target/.settings/org.eclipse.core.resources.prefs b/releng/net.mograsim.target/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/releng/net.mograsim.target/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/releng/net.mograsim.target/.settings/org.eclipse.m2e.core.prefs b/releng/net.mograsim.target/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/releng/net.mograsim.target/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/releng/net.mograsim.target/net.mograsim.target.target b/releng/net.mograsim.target/net.mograsim.target.target new file mode 100644 index 00000000..f09ebd3e --- /dev/null +++ b/releng/net.mograsim.target/net.mograsim.target.target @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/.classpath b/tests/net.mograsim.logic.model.am2900.tests/.classpath new file mode 100644 index 00000000..e61c696d --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/net.mograsim.logic.model.am2900.tests/.project b/tests/net.mograsim.logic.model.am2900.tests/.project new file mode 100644 index 00000000..98071c26 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.project @@ -0,0 +1,28 @@ + + + net.mograsim.logic.model.am2900.tests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.core.resources.prefs b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.core.prefs b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/tests/net.mograsim.logic.model.am2900.tests/META-INF/MANIFEST.MF b/tests/net.mograsim.logic.model.am2900.tests/META-INF/MANIFEST.MF new file mode 100644 index 00000000..48e1b9ae --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Am2900 Tests +Bundle-SymbolicName: net.mograsim.logic.model.am2900.tests;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Fragment-Host: net.mograsim.logic.model.am2900;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.logic.model.am2900.tests +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.junit;bundle-version="4.12.0", + org.junit.jupiter.api;bundle-version="5.4.0";visibility:=reexport, + org.junit.jupiter.params;bundle-version="5.4.0";visibility:=reexport, + org.opentest4j;bundle-version="1.1.1";visibility:=reexport diff --git a/tests/net.mograsim.logic.model.am2900.tests/build.properties b/tests/net.mograsim.logic.model.am2900.tests/build.properties new file mode 100644 index 00000000..34d2e4d2 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/JavaJsonLineCounter.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/JavaJsonLineCounter.java new file mode 100644 index 00000000..2f6cd4e3 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/JavaJsonLineCounter.java @@ -0,0 +1,35 @@ +package net.mograsim.logic.model; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.function.Function; +import java.util.stream.Stream; + +public class JavaJsonLineCounter +{ + public static void main(String[] args) throws IOException + { + printLineCount("..", "java"); + printLineCount("..", "json"); + } + + private static void printLineCount(String path, String filetype) throws IOException + { + long lineCount = Files.walk(Paths.get(path)).filter(Files::isRegularFile).filter(p -> p.toString().endsWith('.' + filetype)) + .flatMap((Function>) p -> + { + try + { + return Files.lines(p); + } + catch (IOException e) + { + throw new UncheckedIOException(e); + } + }).count(); + System.out.println("Total lines in " + filetype + " files: " + lineCount); + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/TestableCircuit.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/TestableCircuit.java new file mode 100644 index 00000000..d36d80ff --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/TestableCircuit.java @@ -0,0 +1,40 @@ +package net.mograsim.logic.model.am2900; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; + +public interface TestableCircuit +{ + void setup(); + + Result run(); + + void clockOn(boolean isClockOn); + + TestEnvironmentHelper getTestEnvironmentHelper(); + + default void assertRunSuccess() + { + assertEquals(Result.SUCCESS, run()); + } + + default void assertFullCycleSuccess() + { + assertRunSuccess(); + clockOn(false); + assertRunSuccess(); + clockOn(true); + assertRunSuccess(); + } + + default void displayState() + { + getTestEnvironmentHelper().displayState(); + } + + public enum Result + { + SUCCESS, OUT_OF_TIME, ERROR; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Test.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Test.java new file mode 100644 index 00000000..0d55c750 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Test.java @@ -0,0 +1,302 @@ +package net.mograsim.logic.model.am2900.am2901; + +import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Dest.*; +import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Func.*; +import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Src.*; +import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Register.*; +import static net.mograsim.logic.model.am2900.util.TestUtil.*; +import static org.junit.jupiter.api.Assertions.*; + +import java.awt.Point; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import net.mograsim.logic.model.am2900.am2901.TestableAm2901.Register; +import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; + +@DisplayName("Am2901 Tests") +@TestMethodOrder(OrderAnnotation.class) +public class Am2901Test +{ + private TestableAm2901 am2901 = new TestableAm2901Impl(); + + @RegisterExtension + DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2901); + + @BeforeEach + void initialize() + { + createAndSetup(); + setInputsToZero(); + } + + void createAndSetup() + { + am2901.setup(); + } + + void setRegistersToZero() + { + setInputsToZero(); + for (Register r : Register.values()) + { + setRegisterToZero(r); + } + } + + void setRegisterToZero(Register r) + { + am2901.setD("0000"); + am2901.setSrc(DZ); + am2901.setFunc(AND); + setRegOutput(r); + + am2901.assertFullCycleSuccess(); + } + + void setRegOutput(Register r) + { + if (r == Q) + { + am2901.setDest(QREG); + } else + { + am2901.setReg_B(r.toBitString()); + am2901.setDest(RAMF); + } + } + + void setInputsToZero() + { + am2901.setCarryIn("0"); + am2901.setQ_0("0"); + am2901.setQ_3("0"); + am2901.setRAM_0("0"); + am2901.setRAM_3("0"); + am2901.setReg_A("0000"); + am2901.setReg_B("0000"); + am2901.setD("0000"); + am2901.setSrc(AB); + am2901.setFunc(ADD); + am2901.setDest(QREG); +// am2901.setNotOutEnable("0"); TODO + am2901.clockOn(true); + am2901.assertRunSuccess(); + } + + @ParameterizedTest(name = "{0}") + @Order(1) + @DisplayName("Direct / high level access") + @EnumSource(Register.class) + void testDirectAccess(Register r) + { + assertEquals("UUUU", am2901.getDirectly(r)); + + am2901.setDirectly(r, "1011"); + + assertEquals("1011", am2901.getDirectly(r)); + } + + @ParameterizedTest(name = "{0}") + @Order(2) + @DisplayName("Setting each register to 0") + @EnumSource(Register.class) + void testSetToZero(Register r) + { + assertEquals("UUUU", am2901.getDirectly(r)); + + setRegisterToZero(r); + + assertEquals("0000", am2901.getDirectly(r)); + assertEquals("0000", am2901.getY()); + assertEquals("0", am2901.getCarryOut()); + assertEquals("0", am2901.getOverflow()); + assertEquals("0", am2901.getSign()); + assertEquals("1", am2901.getZero()); + } + + @Test + @Order(3) + @DisplayName("Setting all registers to 0") + void testSetAllToZero() + { + setRegistersToZero(); + + assertEquals("0000", am2901.getY()); + assertEquals("0", am2901.getCarryOut()); + assertEquals("0", am2901.getOverflow()); + assertEquals("0", am2901.getSign()); + assertEquals("1", am2901.getZero()); + assertEquals("0", am2901.getQ_0()); + assertEquals("0", am2901.getQ_3()); + assertEquals("0", am2901.getRAM_0()); + assertEquals("0", am2901.getRAM_3()); + + assertAll("register values", Register.stream().map(r -> () -> + { + assertEquals("0000", am2901.getDirectly(r), r.name()); + })); + } + + @Test + @Order(4) + @DisplayName("ADD operation") + void testADD() + { + am2901.setSrc(DA); + am2901.setFunc(ADD); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x + xy.y; + int res4Bit = res32Bit & 0b1111; + int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y); + int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn); + + assertAll("Result of " + xy.x + " + " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"), + () -> assertEquals(to1bitBin(res32Bit > 15), am2901.getCarryOut(), " Cn+4"), + () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR")); + })); + } + + @Test + @Order(4) + @DisplayName("AND operation") + void testAND() + { + am2901.setSrc(DA); + am2901.setFunc(AND); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x & xy.y; + + assertAll("Result of " + xy.x + " & " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3") +// () -> assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), " Cn+4"), // TODO +// () -> assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), " OVR") // TODO + ); + })); + } + + @Test + @Order(4) + @DisplayName("OR operation") + void testOR() + { + am2901.setSrc(DA); + am2901.setFunc(OR); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x | xy.y; + + assertAll("Result of " + xy.x + " | " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3") +// () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), " Cn+4"), // TODO +// () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), " OVR") // TODO + ); + })); + } + + @Test + @Order(4) + @DisplayName("XOR operation") + void testXOR() + { + am2901.setSrc(DA); + am2901.setFunc(EXOR); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x ^ xy.y; + + assertAll("Result of " + xy.x + " ^ " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3")); + })); + } + + @Test + @Order(4) + @DisplayName("SUB operation") + void testSUB() + { + am2901.setSrc(DA); + am2901.setCarryIn("1"); + am2901.setFunc(SUBR); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x - xy.y; + int res4Bit = res32Bit & 0b1111; + int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y); + int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn); + + assertAll("Result of " + xy.x + " - " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"), + () -> assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), " Cn+4"), + () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR")); + })); + } + + static Stream getAll4BitPairs() + { + return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y))); + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java new file mode 100644 index 00000000..414054e9 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java @@ -0,0 +1,119 @@ +package net.mograsim.logic.model.am2900.am2901; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.atomic.ModelAndGate; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.atomic.ModelNotGate; +import net.mograsim.logic.model.model.components.atomic.ModelTextComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.ModellingTool; + +@Deprecated +public class Am2901Testbench +{ + public static void main(String[] args) + { + Am2900Loader.setup(); + SimpleLogicUIStandalone.executeVisualisation(Am2901Testbench::createTestbench, Am2901Testbench::beforeRun); + } + + public static void createTestbench(LogicModelModifiable model) + { + ModelComponent comp = IndirectModelComponentCreator.createComponent(model, "Am2901"); + ModellingTool tool = ModellingTool.createFor(model); + + comp.moveTo(240, 0); + + ModelManualSwitch enable = new ModelManualSwitch(model, 1); + ModelWireCrossPoint wcp0 = new ModelWireCrossPoint(model, 1); + ModelNotGate not1 = new ModelNotGate(model, 1); + ModelNotGate not2 = new ModelNotGate(model, 1); + ModelNotGate not3 = new ModelNotGate(model, 1); + ModelAndGate and = new ModelAndGate(model, 1); + tool.connect(wcp0, enable, ""); + tool.connect(wcp0, and, "A"); + tool.connect(wcp0, not1, "A"); + tool.connect(not1, not2, "Y", "A"); + tool.connect(not2, not3, "Y", "A"); + tool.connect(not3, and, "Y", "B"); + enable.moveTo(20, -32.5); + wcp0.moveTo(35, -26); + not1.moveTo(50, -20); + not2.moveTo(80, -20); + not3.moveTo(110, -20); + and.moveTo(135, -30); + Pin last = and.getPin("Y"); + + List inputPinNames = new ArrayList<>(); + List outputPinNames = new ArrayList<>(); + for (Pin p : comp.getPins().values()) + if (p.usage == PinUsage.INPUT) + inputPinNames.add(p.name); + else + outputPinNames.add(p.name); + + inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); + outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); + + for (int i = 0; i < inputPinNames.size(); i++) + { + double x = 55 + 70 * (i % 2); + double y = 10 * i; + + ModelWireCrossPoint wcp = new ModelWireCrossPoint(model, 1); + ModelComponent d_ff = IndirectModelComponentCreator.createComponent(model, "dff"); + ModelManualSwitch sw = new ModelManualSwitch(model, 1); + + tool.connect(last, wcp); + tool.connect(wcp, d_ff, "C"); + tool.connect(sw, d_ff, "", "D"); + tool.connect(d_ff, comp, "Q", inputPinNames.get(i)); + last = wcp.getPin(); + + ModelTextComponent label = new ModelTextComponent(model, inputPinNames.get(i)); + + sw.moveTo(x, y + 7.5); + wcp.moveTo(160, y); + d_ff.moveTo(170, y); + label.moveTo(x - 48, y + 8); + } + + for (int i = 0; i < outputPinNames.size(); i++) + { + double x = 300 + 75 * (i % 2); + double y = 10 * i - 2.5; + ModelBitDisplay bd = new ModelBitDisplay(model, 1); + bd.moveTo(x, y); + tool.connect(bd.getInputPin(), comp, outputPinNames.get(i)); + + ModelTextComponent label = new ModelTextComponent(model, outputPinNames.get(i)); + label.moveTo(x + 25, y); + } + } + + public static void beforeRun(VisualisationObjects vis) + { + vis.model.getComponentsByName().values().forEach(c -> + { + if (c instanceof ModelManualSwitch) + { + ModelManualSwitch cCasted = (ModelManualSwitch) c; + cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); + } + }); + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java new file mode 100644 index 00000000..d8899089 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java @@ -0,0 +1,108 @@ +package net.mograsim.logic.model.am2900.am2901; + +import java.util.Arrays; +import java.util.stream.Stream; + +import net.mograsim.logic.model.am2900.TestableCircuit; +import net.mograsim.logic.model.am2900.util.TestUtil; + +public interface TestableAm2901 extends TestableCircuit +{ + + void setDest(Am2901_Dest dest); + + void setFunc(Am2901_Func func); + + void setSrc(Am2901_Src src); + + void setReg_A(String val_4_bit); + + void setReg_B(String val_4_bit); + + void setCarryIn(String val_1_bit); + + void setNotOutEnable(String val_1_bit); + + void setD(String val_4_bit); + + void setQ_0(String val_1_bit); + + void setQ_3(String val_1_bit); + + void setRAM_0(String val_1_bit); + + void setRAM_3(String val_1_bit); + + void setDirectly(Register r, String val_4_bit); + + String getQ_0(); + + String getQ_3(); + + String getRAM_0(); + + String getRAM_3(); + + String getNotP(); + + String getNotG(); + + String getCarryOut(); + + String getSign(); + + String getZero(); + + String getOverflow(); + + String getY(); + + String getDirectly(Register r); + + enum Am2901_Dest + { + QREG, NOP, RAMA, RAMF, RAMQD, RAMD, RAMQU, RAMU; + + public boolean doesShift() + { + return ordinal() >= 4; + } + + public int getShiftDir() + { + return doesShift() ? (ordinal() < 6 ? -1 : 1) : 0; + } + + public int getI7() + { + return this.ordinal() >> 1 & 1; + } + } + + enum Am2901_Func + { + ADD, SUBR, SUBS, OR, AND, NOTRS, EXOR, EXNOR; + } + + enum Am2901_Src + { + AQ, AB, ZQ, ZB, ZA, DA, DQ, DZ; + } + + enum Register + { + r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF, Q; + + public String toBitString() + { + if (this.ordinal() > 0xF) + throw new UnsupportedOperationException(); + return TestUtil.to4bitBin(this.ordinal()); + } + + public static Stream stream() + { + return Arrays.stream(values()); + } + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java new file mode 100644 index 00000000..bddddea5 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java @@ -0,0 +1,211 @@ +package net.mograsim.logic.model.am2900.am2901; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.util.SwitchWithDisplay; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; +import net.mograsim.logic.model.am2900.util.TestUtil; +import net.mograsim.logic.model.model.components.ModelComponent; + +public class TestableAm2901Impl implements TestableAm2901 +{ + private ModelComponent am2901; + private CoreManualSwitch I; + private CoreManualSwitch C; + private CoreManualSwitch Cn; + private CoreManualSwitch D; + private CoreManualSwitch A; + private CoreManualSwitch B; + private CoreBitDisplay Y; + private CoreBitDisplay F_0, Cn_4, OVR, F3; + private SwitchWithDisplay RAMn, RAMn_3, Qn, Qn_3; + + private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "Am2901"); + + @Override + public Result run() + { + return testHelper.run(); + } + + @Override + public void setup() + { + testHelper.setup(DebugState.NO_DEBUG); + } + + @Override + public void setDest(Am2901_Dest dest) + { + BitVector oldI = I.getValues(); + I.setState(TestUtil.of(dest.ordinal(), 3).concat(oldI.subVector(3))); + } + + @Override + public void setFunc(Am2901_Func func) + { + BitVector oldI = I.getValues(); + I.setState(oldI.subVector(0, 3).concat(TestUtil.of(func.ordinal(), 3)).concat(oldI.subVector(6))); + } + + @Override + public void setSrc(Am2901_Src src) + { + BitVector oldI = I.getValues(); + I.setState(oldI.subVector(0, 6).concat(TestUtil.of(src.ordinal(), 3))); + } + + @Override + public void setReg_A(String val_4_bit) + { + A.setState(BitVector.parse(val_4_bit)); + } + + @Override + public void setReg_B(String val_4_bit) + { + B.setState(BitVector.parse(val_4_bit)); + } + + @Override + public void setCarryIn(String val_1_bit) + { + Cn.setState(Bit.parse(val_1_bit)); + } + + @Override + public void setNotOutEnable(String val_1_bit) + { + throw new UnsupportedOperationException(); // TODO + } + + @Override + public void setD(String val_4_bit) + { + D.setState(BitVector.parse(val_4_bit)); + } + + @Override + public void setQ_0(String val_1_bit) + { + Qn.setState(Bit.parse(val_1_bit).toVector()); + } + + @Override + public void setQ_3(String val_1_bit) + { + Qn_3.setState(Bit.parse(val_1_bit).toVector()); + } + + @Override + public void setRAM_0(String val_1_bit) + { + RAMn.setState(Bit.parse(val_1_bit).toVector()); + } + + @Override + public void setRAM_3(String val_1_bit) + { + RAMn_3.setState(Bit.parse(val_1_bit).toVector()); + } + + @Override + public void clockOn(boolean isClockOn) + { + C.setState(isClockOn ? Bit.ONE : Bit.ZERO); + } + + @Override + public String getQ_0() + { + return Qn.getDisplayedValue().toString(); + } + + @Override + public String getQ_3() + { + return Qn_3.getDisplayedValue().toString(); + } + + @Override + public String getRAM_0() + { + return RAMn.getDisplayedValue().toString(); + } + + @Override + public String getRAM_3() + { + return RAMn_3.getDisplayedValue().toString(); + } + + @Override + public String getNotP() + { + throw new UnsupportedOperationException(); // TODO + } + + @Override + public String getNotG() + { + throw new UnsupportedOperationException(); // TODO + } + + @Override + public String getCarryOut() + { + return Cn_4.getDisplayedValue().toString(); + } + + @Override + public String getSign() + { + return F3.getDisplayedValue().toString(); + } + + @Override + public String getZero() + { + return F_0.getDisplayedValue().toString(); + } + + @Override + public String getOverflow() + { + return OVR.getDisplayedValue().toString(); + } + + @Override + public String getY() + { + return Y.getDisplayedValue().toString(); + } + + @Override + public void setDirectly(Register r, String val_4_bit) + { + am2901.setHighLevelState(regToStateID(r), BitVector.parse(val_4_bit)); + } + + @Override + public String getDirectly(Register r) + { + return ((BitVector) am2901.getHighLevelState(regToStateID(r))).toString(); + } + + private static String regToStateID(Register r) + { + if (r == Register.Q) + return "qreg.q"; + return "regs.c" + r.toBitString() + ".q"; + } + + @Override + public TestEnvironmentHelper getTestEnvironmentHelper() + { + return testHelper; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Test.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Test.java new file mode 100644 index 00000000..332f4f64 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Test.java @@ -0,0 +1,211 @@ +package net.mograsim.logic.model.am2900.am2904; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_Carry; +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_Inst; +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_ShiftDir; +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.CompleteStatus; +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Register; +import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; + +@DisplayName("Am2904 Tests") +@TestMethodOrder(OrderAnnotation.class) +public class Am2904Test +{ + private TestableAm2904 am2904 = new TestableAm2904Impl(); + + @RegisterExtension + DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2904); + + @BeforeEach + void initialize() + { + createAndSetup(); + setStandardInputs(); + } + + void createAndSetup() + { + am2904.setup(); + } + + void setStandardInputs() + { + am2904.set_CEµ("0"); + am2904.set_CEM("0"); + am2904.setI("0000"); + am2904.set_E("0000"); + am2904.set_OEY("1"); + am2904.set_OECT("0"); + am2904.setCarry(Am2904_Carry.CI0); + am2904.setCX("0"); + am2904.setI10(Am2904_ShiftDir.RIGHT); + am2904.setShiftCode("0000"); + am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); + am2904.setSIO0("Z"); + am2904.setSIO3("Z"); + am2904.setQIO0("Z"); + am2904.setQIO3("Z"); + am2904.set_SE("1"); + am2904.setY("ZZZZ"); + am2904.clockOn(true); + am2904.assertRunSuccess(); + } + + @ParameterizedTest(name = "{0}") + @Order(1) + @DisplayName("Direct / high level access") + @EnumSource(Register.class) + void testDirectAccess(Register r) + { + assertEquals("U", am2904.getDirectly(r)); + + am2904.setDirectly(r, "1"); + + assertEquals("1", am2904.getDirectly(r)); + } + + @Test + @Order(2) + void testBasicStateAndOutputs() + { + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getC0()); + assertEquals("0", am2904.getCT()); + assertEquals("Z", am2904.getQIO0()); + assertEquals("Z", am2904.getQIO3()); + assertEquals("Z", am2904.getSIO0()); + assertEquals("Z", am2904.getSIO3()); + assertEquals("ZZZZ", am2904.getY()); + } + + @Test + @Order(3) + void testSimpleLoadTestIZ() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("1000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + + am2904.setInstruction(Am2904_Inst.Load_Load_I_notZ); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + } + + @Test + @Order(3) + void testSimpleLoadTestIC() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_C); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0100"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + + am2904.setInstruction(Am2904_Inst.Load_Load_I_notC); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + } + + @Test + @Order(3) + void testSimpleLoadTestIN() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_N); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0010"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + + am2904.setInstruction(Am2904_Inst.Load_Load_I_notN); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + } + + @Test + @Order(3) + void testSimpleLoadTestIOVR() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_OVR); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0001"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + + am2904.setInstruction(Am2904_Inst.Load_Load_I_notOVR); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + } + + @Test + @Order(3) + void testRegisterContentAfterLoadLoad() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); + am2904.assertFullCycleSuccess(); + + String[] statusValues = { "0001", "0010", "0100", "1000", "0000", "1111" }; + + for (String status : statusValues) + { + am2904.setI(status); + am2904.assertFullCycleSuccess(); + assertEquals(status, am2904.getDirectly(CompleteStatus.micro)); + assertEquals(status, am2904.getDirectly(CompleteStatus.MAKRO)); + } + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java new file mode 100644 index 00000000..e46561d5 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java @@ -0,0 +1,65 @@ +package net.mograsim.logic.model.am2900.am2904; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.Renderer; + +public class Am2904Testbench +{ + public static void main(String[] args) + { + Am2900Loader.setup(); + SimpleLogicUIStandalone.executeVisualisation(Am2904Testbench::create, Am2904Testbench::beforeRun); + } + + public static void create(LogicModelModifiable model) + { + // TODO replace with proper LogicModel deserialization + DeserializedSubmodelComponent testbench = (DeserializedSubmodelComponent) IndirectModelComponentCreator.createComponent(model, + "jsonfile:Am2904Testbench.json", "testbench"); + testbench.setSize(1000, 1000); + testbench.setOutlineRenderer(new Renderer() + { + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return null; + } + + @Override + public Void getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + // do nothing + } + }); + } + + public static void beforeRun(VisualisationObjects vis) + { + ((SubmodelComponent) vis.model.getComponentsByName().get("testbench")).submodel.getComponentsByName().values().forEach(c -> + { + if (c instanceof ModelManualSwitch) + { + ModelManualSwitch cCasted = (ModelManualSwitch) c; + cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); + } + }); + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java new file mode 100644 index 00000000..e41e3fef --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java @@ -0,0 +1,236 @@ +package net.mograsim.logic.model.am2900.am2904; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import net.mograsim.logic.model.am2900.TestableCircuit; + +public interface TestableAm2904 extends TestableCircuit +{ + + void setInstruction(Am2904_Inst inst); + + void setCarry(Am2904_Carry carry); + + void setShiftCode(String val_4_bit); + + void setI10(Am2904_ShiftDir dir); + + void setCX(String val_1_bit); + + void setY(String z_c_n_ovr); + + void setIZ(String val_1_bit); + + void setIC(String val_1_bit); + + void setIOVR(String val_1_bit); + + void setIN(String val_1_bit); + + default void setI(String z_c_n_ovr) + { + setIZ(z_c_n_ovr.substring(0, 1)); + setIC(z_c_n_ovr.substring(1, 2)); + setIN(z_c_n_ovr.substring(2, 3)); + setIOVR(z_c_n_ovr.substring(3, 4)); + } + + void set_CEM(String val_1_bit); + + void set_CEµ(String val_1_bit); + + void set_OEY(String val_1_bit); + + void set_OECT(String val_1_bit); + + void set_SE(String val_1_bit); + + void set_EZ(String val_1_bit); + + void set_EC(String val_1_bit); + + void set_EOVR(String val_1_bit); + + void set_EN(String val_1_bit); + + default void set_E(String z_c_n_ovr) + { + set_EZ(z_c_n_ovr.substring(0, 1)); + set_EC(z_c_n_ovr.substring(1, 2)); + set_EN(z_c_n_ovr.substring(2, 3)); + set_EOVR(z_c_n_ovr.substring(3, 4)); + } + + void setSIO0(String val_1_bit); + + void setSIO3(String val_1_bit); + + void setQIO0(String val_1_bit); + + void setQIO3(String val_1_bit); + + void setDirectly(Register r, String val_1_bit); + + void setDirectly(CompleteStatus r, String z_c_n_ovr); + + String getC0(); + + String getCT(); + + String getY(); + + String getSIO0(); + + String getSIO3(); + + String getQIO0(); + + String getQIO3(); + + String getDirectly(Register r); + + String getDirectly(CompleteStatus r); + + enum Am2904_ShiftDir + { + RIGHT, LEFT; + } + + enum Am2904_Carry + { + CI0, CI1, CX, USE_SR; + } + + /** + * Pattern:
+ * [microSR]_[machineSR]_[condCodeSource]_[condCode]
+ *

    + *
  • Load = load from I inputs (Am2904s)
  • + *
  • condCodeSource = µ, M, I (and a special case: I and M)
  • + *
  • condCode = the boolean term defining the CT output
  • + *
+ */ + enum Am2904_Inst + { + // @formatter:off + LoadM_LoadY_µ_NxorOVRorZ(0_00), + Set_Set_µ_NxnorOVRornotZ(0_01), + Swap_Swap_µ_NxorOVR(0_02), + Reset_Reset_µ_NxnorOVR(0_03), + Load_LoadForShiftThroughOvr_µ_Z(0_04), + Load_Invert_µ_notZ(0_05), + LoadOvrRetain_Load_µ_OVR(0_06), + LoadOvrRetain_Load_µ_notOVR(0_07), + ResetZ_LoadCarryInvert_µ_CorZ(0_10), + SetZ_LoadCarryInvert_µ_notCandnotZ(0_11), + ResetC_Load_µ_C(0_12), + SetC_Load_µ_notC(0_13), + ResetN_Load_µ_notCorZ(0_14), + SetN_Load_µ_CandnotZ(0_15), + ResetOvr_Load_IM_NxorN(0_16), + SetOvr_Load_IM_NxnorN(0_17), + Load_Load_µ_NxorOVRorZ(0_20), + Load_Load_µ_NxnorOVRornotZ(0_21), + Load_Load_µ_NxorOVR(0_22), + Load_Load_µ_NxnorOVR(0_23), + Load_Load_µ_Z(0_24), + Load_Load_µ_notZ(0_25), + Load_Load_µ_OVR(0_26), + Load_Load_µ_notOVR(0_27), + LoadCarryInvert_LoadCarryInvert_µ_CorZ(0_30), + LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ(0_31), + Load_Load_µ_C(0_32), + Load_Load_µ_notC(0_33), + Load_Load_µ_notCorZ(0_34), + Load_Load_µ_CandnotZ(0_35), + Load_Load_µ_N(0_36), + Load_Load_µ_notN(0_37), + Load_Load_M_NxorOVRorZ(0_40), + Load_Load_M_NxnorOVRornotZ(0_41), + Load_Load_M_NxorOVR(0_42), + Load_Load_M_NxnorOVR(0_43), + Load_Load_M_Z(0_44), + Load_Load_M_notZ(0_45), + Load_Load_M_OVR(0_46), + Load_Load_M_notOVR(0_47), + LoadCarryInvert_LoadCarryInvert_M_CorZ(0_50), + LoadCarryInvert_LoadCarryInvert_M_notCandnotZ(0_51), + Load_Load_M_C(0_52), + Load_Load_M_notC(0_53), + Load_Load_M_notCorZ(0_54), + Load_Load_M_CandnotZ(0_55), + Load_Load_M_N(0_56), + Load_Load_M_notN(0_57), + Load_Load_I_NxorOVRorZ(0_60), + Load_Load_I_NxnorOVRornotZ(0_61), + Load_Load_I_NxorOVR(0_62), + Load_Load_I_NxnorOVR(0_63), + Load_Load_I_Z(0_64), + Load_Load_I_notZ(0_65), + Load_Load_I_OVR(0_66), + Load_Load_I_notOVR(0_67), + LoadCarryInvert_LoadCarryInvert_I_notCorZ(0_70), + LoadCarryInvert_LoadCarryInvert_I_CandnotZ(0_71), + Load_Load_I_C(0_72), + Load_Load_I_notC(0_73), + Load_Load_I_notCorZ(0_74), + Load_Load_I_CandnotZ(0_75), + Load_Load_I_N(0_76), + Load_Load_I_notN(0_77); + // @formatter:on + + public final int code; + + private Am2904_Inst(int code) + { + this.code = code; + } + + private static final Map instCodes; + + static + { + Map instCodesMod = new HashMap<>(); + Am2904_Inst[] vals = values(); + for (Am2904_Inst inst : vals) + { + assert inst.code == inst.ordinal(); + instCodesMod.put(inst.code, inst); + } + if (instCodesMod.size() != 64) + throw new IllegalStateException("There must be exactly 64 Am2904 instruction codes, but was " + instCodesMod.size()); + instCodes = Collections.unmodifiableMap(instCodesMod); + } + + public static Am2904_Inst getInstFor(int I_543210) + { + Am2904_Inst inst = instCodes.get(I_543210); + if (inst != null) + return inst; + throw new IllegalArgumentException("Invaild Am2904 instruction code: " + I_543210); + } + + public int getBlock() + { + return code >> 4; + } + + public boolean isLoadCarryInvert() + { + return (code & 0b001_110) == 0b001_000; + } + } + + enum Register + { + µZ, µC, µN, µOVR, MZ, MC, MN, MOVR; + } + + enum CompleteStatus + { + micro, MAKRO; + } + +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json new file mode 100644 index 00000000..964d7d3d --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json @@ -0,0 +1,846 @@ +{ + "width": 0.0, + "height": 0.0, + "interfacePins": [ + { + "location": { + "x": 10.0, + "y": 20.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 145.0, + "y": 125.0 + }, + "name": "C0", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 145.0, + "y": 75.0 + }, + "name": "CT", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 10.0, + "y": 125.0 + }, + "name": "Cx", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 30.0 + }, + "name": "IC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 35.0 + }, + "name": "IN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 40.0 + }, + "name": "IOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 25.0 + }, + "name": "IZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": -87.66482568016058, + "y": 58.834004835619645 + }, + "name": "I_10", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": -80.0, + "y": 40.0 + }, + "name": "I_11_12", + "logicWidth": 2, + "usage": "INPUT" + }, + { + "location": { + "x": -85.0, + "y": 100.0 + }, + "name": "I_5_0", + "logicWidth": 6, + "usage": "INPUT" + }, + { + "location": { + "x": -84.26853373181032, + "y": 78.72500503091884 + }, + "name": "I_6_9", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 145.0, + "y": 145.0 + }, + "name": "QIO0", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 10.0, + "y": 145.0 + }, + "name": "QIOn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 135.0 + }, + "name": "SIO0", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 10.0, + "y": 135.0 + }, + "name": "SIOn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 30.0 + }, + "name": "YC", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 35.0 + }, + "name": "YN", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 40.0 + }, + "name": "YOVR", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 25.0 + }, + "name": "YZ", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 10.0, + "y": 45.0 + }, + "name": "_CEM", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 50.0 + }, + "name": "_CEmu", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 60.0 + }, + "name": "_EC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 65.0 + }, + "name": "_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 70.0 + }, + "name": "_EOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 55.0 + }, + "name": "_EZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 145.0, + "y": 65.0 + }, + "name": "_OECT", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 80.0, + "y": 10.0 + }, + "name": "_OEY", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 100.0 + }, + "name": "_SE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 1.0, + "submodel": { + "components": [ + { + "id": "Merger", + "name": "Merger#0", + "pos": { + "x": -30.0, + "y": 70.0 + }, + "params": 13 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": -45.0, + "y": 140.0 + }, + "params": 6 + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": -45.0, + "y": 100.0 + }, + "params": 4 + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": -45.0, + "y": 70.0 + }, + "params": 2 + }, + { + "id": "Am2904", + "name": "Am2904#0", + "pos": { + "x": 20.0, + "y": 15.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Am2904#0", + "pinName": "C" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IZ" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IZ" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EZ" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EZ" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I_5_0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I1" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I3" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I5" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I6" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I7" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IC" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "IC" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I8" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I9" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I11" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I12" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I_6_9" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "I" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I_10" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I10" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I_11_12" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_SE" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_SE" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cx" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "Cx" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IN" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IN" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SIOn" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "SIOn" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "QIOn" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "QIOn" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "QIO0" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "QIO0" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SIO0" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "SIO0" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C0" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "C0" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "CT" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "CT" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_OECT" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OECT" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YOVR" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YOVR" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YN" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YN" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YC" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YC" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IOVR" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "IOVR" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YZ" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YZ" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_OEY" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OEY" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_CEM" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_CEM" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_CEmu" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_CEmu" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EC" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EC" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EN" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EN" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EOVR" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "default", + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "musr": { + "id": "delegating", + "params": { + "delegateTarget": "Am2904#0", + "prefix": "musr" + } + }, + "msr": { + "id": "delegating", + "params": { + "delegateTarget": "Am2904#0", + "prefix": "msr" + } + } + }, + "atomicHighLevelStates": {} + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java new file mode 100644 index 00000000..b43f130e --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java @@ -0,0 +1,293 @@ +package net.mograsim.logic.model.am2900.am2904; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.util.SwitchWithDisplay; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; +import net.mograsim.logic.model.model.components.ModelComponent; + +public class TestableAm2904Impl implements TestableAm2904 +{ + + private ModelComponent am2904; + private CoreManualSwitch I_5_0; + private CoreManualSwitch I_6_9; + private CoreManualSwitch I_10; + private CoreManualSwitch I_11_12; + private CoreManualSwitch C; + private CoreManualSwitch Cx; + private CoreManualSwitch IC, IN, IOVR, IZ; + private CoreManualSwitch _CEM, _CEmu; + private CoreManualSwitch _EC, _EN, _EOVR, _EZ; + private CoreManualSwitch _OECT, _OEY; + private CoreManualSwitch _SE; + private CoreBitDisplay C0; + private CoreBitDisplay CT; + private SwitchWithDisplay SIO0, SIOn, QIO0, QIOn; + private SwitchWithDisplay YC, YN, YOVR, YZ; + + private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, + "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/am2904/TestableAm2904.json"); + + @Override + public void setup() + { + testHelper.setup(DebugState.NO_DEBUG); + } + + @Override + public Result run() + { + return testHelper.run(); + } + + @Override + public void clockOn(boolean isClockOn) + { + if (isClockOn) + C.switchFullOn(); + else + C.switchFullOff(); + } + + @Override + public void setInstruction(Am2904_Inst inst) + { + I_5_0.setState(BitVector.from(inst.ordinal(), 6)); + } + + @Override + public void setShiftCode(String val_4_bit) + { + I_6_9.setState(BitVector.parse(val_4_bit)); + } + + @Override + public void setI10(Am2904_ShiftDir dir) + { + I_10.setState(BitVector.from(dir.ordinal(), 1)); + } + + @Override + public void setCarry(Am2904_Carry carry) + { + I_11_12.setState(BitVector.from(carry.ordinal(), 2)); + } + + @Override + public void setCX(String val_1_bit) + { + Cx.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setY(String z_c_n_ovr) + { + var bv = BitVector.parse(z_c_n_ovr); + // correct order apparently unknown, most likely Z-C-N-OVR + YZ.setState(bv.getLSBit(3).toVector()); + YC.setState(bv.getLSBit(2).toVector()); + YN.setState(bv.getLSBit(1).toVector()); + YOVR.setState(bv.getLSBit(0).toVector()); + } + + @Override + public void setIZ(String val_1_bit) + { + IZ.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setIC(String val_1_bit) + { + IC.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setIOVR(String val_1_bit) + { + IOVR.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setIN(String val_1_bit) + { + IN.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_CEM(String val_1_bit) + { + _CEM.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_CEµ(String val_1_bit) + { + _CEmu.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_OEY(String val_1_bit) + { + _OEY.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_OECT(String val_1_bit) + { + _OECT.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_SE(String val_1_bit) + { + _SE.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_EZ(String val_1_bit) + { + _EZ.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_EC(String val_1_bit) + { + _EC.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_EOVR(String val_1_bit) + { + _EOVR.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_EN(String val_1_bit) + { + _EN.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setSIO0(String val_1_bit) + { + SIO0.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setSIO3(String val_1_bit) + { + SIOn.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setQIO0(String val_1_bit) + { + QIO0.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setQIO3(String val_1_bit) + { + QIOn.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setDirectly(Register r, String val_1_bit) + { + var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); + bv = bv.withBitChanged(r.ordinal() % 4, b -> Bit.parse(val_1_bit)); + am2904.setHighLevelState(regToStateID(r), bv); + } + + @Override + public void setDirectly(CompleteStatus r, String z_c_n_ovr) + { + am2904.setHighLevelState(regToStateID(r), BitVector.parse(z_c_n_ovr)); + } + + @Override + public String getC0() + { + return C0.getDisplayedValue().toString(); + } + + @Override + public String getCT() + { + return CT.getDisplayedValue().toString(); + } + + @Override + public String getY() + { + // correct order apparently unknown, most likely Z-C-N-OVR + var y3 = YZ.getDisplayedValue(); + var y2 = YC.getDisplayedValue(); + var y1 = YN.getDisplayedValue(); + var y0 = YOVR.getDisplayedValue(); + return y3.concat(y2).concat(y1).concat(y0).toString(); + } + + @Override + public String getSIO0() + { + return SIO0.getDisplayedValue().toString(); + } + + @Override + public String getSIO3() + { + return SIOn.getDisplayedValue().toString(); + } + + @Override + public String getQIO0() + { + return QIO0.getDisplayedValue().toString(); + } + + @Override + public String getQIO3() + { + return QIOn.getDisplayedValue().toString(); + } + + @Override + public String getDirectly(Register r) + { + var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); + return bv.getMSBit(r.ordinal() % 4).getSymbol(); + } + + @Override + public String getDirectly(CompleteStatus r) + { + var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); + return bv.toString(); + } + + private static String regToStateID(Register r) + { + if (r.ordinal() < 4) + return "musr.q"; + return "msr.q"; + } + + private static String regToStateID(CompleteStatus r) + { + if (r == CompleteStatus.micro) + return "musr.q"; + return "msr.q"; + } + + @Override + public TestEnvironmentHelper getTestEnvironmentHelper() + { + return testHelper; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Test.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Test.java new file mode 100644 index 00000000..18b2578d --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Test.java @@ -0,0 +1,69 @@ +package net.mograsim.logic.model.am2900.am2910; + +import static net.mograsim.logic.model.am2900.am2910.TestableAm2910.Am2910_Inst.*; +import static net.mograsim.logic.core.types.Bit.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.am2910.TestableAm2910.Register; +import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; + +@DisplayName("Am2910 Tests") +@TestMethodOrder(OrderAnnotation.class) +public class Am2910Test +{ + private TestableAm2910 am2910 = new TestableAm2910Impl(); + + @RegisterExtension + DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2910); + + @BeforeEach + void initialize() + { + createAndSetup(); + setStandardInputs(); + } + + void createAndSetup() + { + am2910.setup(); + } + + void setStandardInputs() + { + am2910.set_CC("0"); + am2910.set_CCEN("0"); + am2910.set_OE("0"); + am2910.set_RLD("1"); + am2910.setCI("1"); + am2910.setD("000000000000"); + am2910.setInstruction(JZ); + am2910.clockOn(true); + am2910.assertRunSuccess(); + } + + @ParameterizedTest(name = "{0}") + @Order(1) + @DisplayName("Direct / high level access") + @EnumSource(Register.class) + void testDirectAccess(Register r) + { + String us = U.toVector(r.size()).toString(); + String three = BitVector.from(3, r.size()).toString(); + + assertEquals(us, am2910.getDirectly(r)); + + am2910.setDirectly(r, three); + + assertEquals(three, am2910.getDirectly(r)); + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java new file mode 100644 index 00000000..59ac5b14 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java @@ -0,0 +1,85 @@ +package net.mograsim.logic.model.am2900.am2910; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelClock; +import net.mograsim.logic.model.model.components.atomic.ModelClock.ModelClockParams; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class Am2910Testbench +{ + public static void main(String[] args) + { + Am2900Loader.setup(); + SimpleLogicUIStandalone.executeVisualisation(Am2910Testbench::create, Am2910Testbench::beforeRun); + } + + @SuppressWarnings("unused") // for ModelWires being created + public static void create(LogicModelModifiable model) + { + ModelComponent am2910 = IndirectModelComponentCreator.createComponent(model, "Am2910", "Am2910"); + ModelClock C = new ModelClock(model, new ModelClockParams(1000, Orientation.RIGHT)); + ModelManualSwitch D = new ModelManualSwitch(model, 12, "D"); + ModelManualSwitch _RLD = new ModelManualSwitch(model, 1, "_RLD"); + ModelManualSwitch _CC = new ModelManualSwitch(model, 1, "_CC"); + ModelManualSwitch _CCEN = new ModelManualSwitch(model, 1, "_CCEN"); + ModelManualSwitch I = new ModelManualSwitch(model, 4, "I"); + ModelManualSwitch CI = new ModelManualSwitch(model, 1, "CI"); + ModelManualSwitch _OE = new ModelManualSwitch(model, 1, "_OE"); + ModelBitDisplay _FULL = new ModelBitDisplay(model, 1, "_FULL"); + ModelBitDisplay _PL = new ModelBitDisplay(model, 1, "_PL"); + ModelBitDisplay _MAP = new ModelBitDisplay(model, 1, "_MAP"); + ModelBitDisplay _VECT = new ModelBitDisplay(model, 1, "_VECT"); + ModelBitDisplay Y = new ModelBitDisplay(model, 12, "Y"); + + C.moveTo(35, -35); + D.moveTo(10, -20); + _RLD.moveTo(-30, -1.5); + _CC.moveTo(-30, 20); + _CCEN.moveTo(-30, 40); + I.moveTo(-30, 60); + CI.moveTo(75, 45); + _FULL.moveTo(80, 6.5); + _PL.moveTo(30, 85); + _MAP.moveTo(30, 105); + _VECT.moveTo(30, 125); + Y.moveTo(40, 65); + _OE.moveTo(60, 85); + + new ModelWire(model, C.getOutputPin(), am2910.getPin("C"), new Point(60, -27.5)); + new ModelWire(model, D.getOutputPin(), am2910.getPin("D"), new Point(36, -12.5)); + new ModelWire(model, _RLD.getOutputPin(), am2910.getPin("_RLD"), new Point[0]); + new ModelWire(model, _CC.getOutputPin(), am2910.getPin("_CC")); + new ModelWire(model, _CCEN.getOutputPin(), am2910.getPin("_CCEN")); + new ModelWire(model, I.getOutputPin(), am2910.getPin("I")); + new ModelWire(model, CI.getOutputPin(), am2910.getPin("CI"), new Point(100, 52.5), new Point(100, 40)); + new ModelWire(model, am2910.getPin("_FULL"), _FULL.getInputPin(), new Point[0]); + new ModelWire(model, am2910.getPin("_PL"), _PL.getInputPin(), new Point(13, 92.5)); + new ModelWire(model, am2910.getPin("_MAP"), _MAP.getInputPin(), new Point(19, 112.5)); + new ModelWire(model, am2910.getPin("_VECT"), _VECT.getInputPin(), new Point(25, 132.5)); + new ModelWire(model, am2910.getPin("Y"), Y.getInputPin(), new Point(38, 72.5)); + new ModelWire(model, am2910.getPin("_OE"), _OE.getOutputPin()); + } + + public static void beforeRun(VisualisationObjects vis) + { + vis.model.getComponentsByName().values().forEach(c -> + { + if (c instanceof ModelManualSwitch) + { + ModelManualSwitch cCasted = (ModelManualSwitch) c; + cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); + } + }); + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java new file mode 100644 index 00000000..5290c5a6 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java @@ -0,0 +1,60 @@ +package net.mograsim.logic.model.am2900.am2910; + +import java.util.Arrays; +import java.util.stream.Stream; + +import net.mograsim.logic.model.am2900.TestableCircuit; + +public interface TestableAm2910 extends TestableCircuit +{ + + void setInstruction(Am2910_Inst inst); + + void set_CCEN(String val_1_bit); + + void setD(String val_12_bit); + + void set_CC(String val_1_bit); + + void setCI(String val_1_bit); + + void set_RLD(String val_1_bit); + + void set_OE(String val_1_bit); + + void setDirectly(Register r, String val_X_bit); + + String getY(); + + String get_FULL(); + + String get_PL(); + + String get_MAP(); + + String get_VECT(); + + String getDirectly(Register r); + + enum Am2910_Inst + { + JZ, CJS, JMAP, CJP, PUSH, JSRP, CJV, JRP, RFCT, RPCT, CRTN, CJPP, LDCT, LOOP, CONT, TWB; + } + + enum Register + { + S_0, S_1, S_2, S_3, S_4, SP, PC, REG_COUNT; + + public static Stream stream() + { + return Arrays.stream(values()); + } + + public int size() + { + if (this == SP) + return 3; + return 12; + } + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java new file mode 100644 index 00000000..48b85698 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java @@ -0,0 +1,159 @@ +package net.mograsim.logic.model.am2900.am2910; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; +import net.mograsim.logic.model.model.components.ModelComponent; + +public class TestableAm2910Impl implements TestableAm2910 +{ + + private ModelComponent am2901; + private CoreManualSwitch I; + private CoreManualSwitch C; + private CoreManualSwitch CI; + private CoreManualSwitch D; + private CoreManualSwitch _CC; + private CoreManualSwitch _CCEN; + private CoreManualSwitch _RLD; + private CoreManualSwitch _OE; + private CoreBitDisplay _FULL; + private CoreBitDisplay Y; + private CoreBitDisplay _PL, _MAP, _VECT; + + private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "Am2910"); + + @Override + public void setup() + { + testHelper.setup(DebugState.NO_DEBUG); + } + + @Override + public Result run() + { + return testHelper.run(); + } + + @Override + public void clockOn(boolean isClockOn) + { + if (isClockOn) + C.switchFullOn(); + else + C.switchFullOff(); + } + + @Override + public void setInstruction(Am2910_Inst inst) + { + I.setState(BitVector.from(inst.ordinal(), 4)); + } + + @Override + public void set_CCEN(String val_1_bit) + { + _CCEN.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setD(String val_12_bit) + { + D.setState(BitVector.parse(val_12_bit)); + } + + @Override + public void set_CC(String val_1_bit) + { + _CC.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setCI(String val_1_bit) + { + CI.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_RLD(String val_1_bit) + { + _RLD.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_OE(String val_1_bit) + { + _OE.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setDirectly(Register r, String val_X_bit) + { + am2901.setHighLevelState(regToStateID(r), BitVector.parse(val_X_bit)); + } + + @Override + public String getY() + { + return Y.getDisplayedValue().toString(); + } + + @Override + public String get_FULL() + { + return _FULL.getDisplayedValue().toString(); + } + + @Override + public String get_PL() + { + return _PL.getDisplayedValue().toString(); + } + + @Override + public String get_MAP() + { + return _MAP.getDisplayedValue().toString(); + } + + @Override + public String get_VECT() + { + return _VECT.getDisplayedValue().toString(); + } + + @Override + public String getDirectly(Register r) + { + return am2901.getHighLevelState(regToStateID(r)).toString(); + } + + private static String regToStateID(Register r) + { + switch (r) + { + case S_0: + case S_1: + case S_2: + case S_3: + case S_4: + return "stack.c" + BitVector.from(r.ordinal(), 3); + case SP: + return "sp.q"; + case PC: + return "mupc.q"; + case REG_COUNT: + return "r.q"; + default: + throw new IllegalArgumentException("unknown: " + r); + } + } + + @Override + public TestEnvironmentHelper getTestEnvironmentHelper() + { + return testHelper; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java new file mode 100644 index 00000000..3f68c67e --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java @@ -0,0 +1,30 @@ +package net.mograsim.logic.model.am2900.util; + +import java.util.Objects; + +import org.junit.jupiter.api.extension.AfterTestExecutionCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +import net.mograsim.logic.model.am2900.TestableCircuit; + +public class DisplayStateOnFailure implements AfterTestExecutionCallback +{ + public static final boolean ACTIVE = true; + + private final TestableCircuit circuitUnderTest; + + public DisplayStateOnFailure(TestableCircuit circuitUnderTest) + { + this.circuitUnderTest = Objects.requireNonNull(circuitUnderTest); + } + + @Override + public void afterTestExecution(ExtensionContext context) throws Exception + { + if (ACTIVE && context.getExecutionException().isPresent()) + { + context.getExecutionException().get().printStackTrace(); + circuitUnderTest.displayState(); + } + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java new file mode 100644 index 00000000..c085c52e --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java @@ -0,0 +1,65 @@ +package net.mograsim.logic.model.am2900.util; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.util.ModellingTool; + +public class SwitchWithDisplay +{ + private final Pin pin; + private final ModelBitDisplay modelBitDisplay; + private final ModelManualSwitch modelManualSwitch; + + public SwitchWithDisplay(LogicModelModifiable model, Pin target) + { + pin = target; + modelBitDisplay = new ModelBitDisplay(model, pin.logicWidth); + modelManualSwitch = new ModelManualSwitch(model, pin.logicWidth); + + ModellingTool tool = ModellingTool.createFor(model); + ModelWireCrossPoint crossPoint = new ModelWireCrossPoint(model, pin.logicWidth); + tool.connect(modelBitDisplay.getInputPin(), crossPoint); + tool.connect(modelManualSwitch.getOutputPin(), crossPoint); + } + + public final BitVector getDisplayedValue() + { + return modelBitDisplay.getBitDisplay().getDisplayedValue(); + } + + public final void setState(BitVector bits) + { + modelManualSwitch.getManualSwitch().setState(bits); + } + + public final Pin getPin() + { + return pin; + } + + public final CoreBitDisplay getBitDisplay() + { + return modelBitDisplay.getBitDisplay(); + } + + public final CoreManualSwitch getManualSwitch() + { + return modelManualSwitch.getManualSwitch(); + } + + final ModelBitDisplay getModelBitDisplay() + { + return modelBitDisplay; + } + + final ModelManualSwitch getModelManualSwitch() + { + return modelManualSwitch; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java new file mode 100644 index 00000000..4bae8ec5 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java @@ -0,0 +1,276 @@ +package net.mograsim.logic.model.am2900.util; + +import static org.junit.jupiter.api.Assertions.fail; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Objects; +import java.util.Optional; +import java.util.Queue; +import java.util.Set; +import java.util.TreeSet; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.model.LogicUIStandaloneGUI; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.am2900.TestableCircuit; +import net.mograsim.logic.model.am2900.TestableCircuit.Result; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.ModellingTool; + +public class TestEnvironmentHelper +{ + private final TestableCircuit testEnvInstance; + private final Class testEnvClass; + private final String modelId; + private Field componentField; + private Optional timelineField = Optional.empty(); + + private ModelComponent component; + private Timeline timeline; + private LogicModelModifiable logicModel; + private ModellingTool modellingTool; + private HashMap idSwitchMap = new HashMap<>(); + private HashMap idDisplayMap = new HashMap<>(); + + private DebugState debug = DebugState.NO_DEBUG; + private Set wireDebugChangeSet; + private boolean debugWires = false; + public int debugEventThreshold = 10_000; + public int debugEventCount = 500; + private int eventCounter; + + public TestEnvironmentHelper(TestableCircuit testEnv, String modelId) + { + this.testEnvInstance = testEnv; + this.modelId = modelId; + this.testEnvClass = testEnvInstance.getClass(); + for (Field f : testEnvClass.getDeclaredFields()) + { + if (ModelComponent.class.isAssignableFrom(f.getType())) + { + componentField = f; + componentField.setAccessible(true); + } else if (Timeline.class.isAssignableFrom(f.getType())) + { + f.setAccessible(true); + timelineField = Optional.of(f); + } + } + if (componentField == null) + throw new IllegalStateException("No component or timeline field found!"); + } + + public void setup(DebugState debug) + { + this.debug = debug; + // Create logic model + logicModel = new LogicModelModifiable(); + modellingTool = ModellingTool.createFor(logicModel); + Am2900Loader.setup(); + component = IndirectModelComponentCreator.createComponent(logicModel, modelId); + setField(componentField, component); + + component.getPins().values().forEach(this::extendModelPin); + + // Create core model + CoreModelParameters params = new CoreModelParameters(); + params.gateProcessTime = 50; + params.wireTravelTime = 10; + timeline = LogicCoreAdapter.convert(logicModel, params); + timelineField.ifPresent(f -> setField(f, timeline)); + + // Bind switches/displays to this test class + component.getPins().values().forEach(this::bindModelPin); + + if (debug == DebugState.DEBUG_AT_PERFORMANCE_COST) + { + setupDebugging(); + } + timeline.addEventAddedListener(te -> eventCounter++); + } + + private void extendModelPin(Pin p) + { + String javaIdentId = idToJavaIdentifier(p.name); + try + { + Field f = testEnvClass.getDeclaredField(javaIdentId); + Class type = f.getType(); + if (CoreManualSwitch.class.isAssignableFrom(type)) + { + ModelManualSwitch gms = new ModelManualSwitch(logicModel, p.logicWidth); + modellingTool.connect(p, gms.getOutputPin()); + idSwitchMap.put(p.name, gms); + } else if (CoreBitDisplay.class.isAssignableFrom(type)) + { + ModelBitDisplay gbd = new ModelBitDisplay(logicModel, p.logicWidth); + modellingTool.connect(p, gbd.getInputPin()); + idDisplayMap.put(p.name, gbd); + } else if (SwitchWithDisplay.class.isAssignableFrom(type)) + { + SwitchWithDisplay swd = new SwitchWithDisplay(logicModel, p); + setField(f, swd); + } else + { + fail("unkown field type " + type); + } + } + catch (NoSuchFieldException | SecurityException e) + { + fail(e); + } + } + + private void bindModelPin(Pin p) + { + String javaIdentId = idToJavaIdentifier(p.name); + if (idDisplayMap.containsKey(p.name)) + setField(javaIdentId, idDisplayMap.get(p.name).getBitDisplay()); + if (idSwitchMap.containsKey(p.name)) + setField(javaIdentId, idSwitchMap.get(p.name).getManualSwitch()); + } + + private void setupDebugging() + { + // Debug code + HashSet wiresIncludingSubmodels = new HashSet<>(); + Queue modelsToIterate = new LinkedList<>(); + modelsToIterate.add(logicModel); + while (modelsToIterate.size() > 0) + { + LogicModel model = modelsToIterate.poll(); + wiresIncludingSubmodels.addAll(model.getWiresByName().values()); + for (ModelComponent comp : model.getComponentsByName().values()) + if (comp instanceof SubmodelComponent) + modelsToIterate.offer(((SubmodelComponent) comp).submodel); + } + System.out.println(wiresIncludingSubmodels.size()); + logicModel.setRedrawHandler(() -> wiresIncludingSubmodels.forEach(w -> + { + if (debugWires) + { + wireDebugChangeSet.add(w.toString()); + } + })); + } + + public Result run() + { + // Normal execution until completion or eventLimit + int eventLimit = debugEventThreshold; + eventCounter = 0; + debugWires = false; + while (eventCounter < eventLimit) + { + timeline.executeNext(); + if (!timeline.hasNext()) + return Result.SUCCESS; + } + + // Start debugging if event limit is reached (if debug is active) + if (debug == DebugState.DEBUG_AT_PERFORMANCE_COST) + return debugThisRun(); + + return Result.OUT_OF_TIME; + } + + private Result debugThisRun() + { + int eventLimit = debugEventThreshold; + debugWires = true; + wireDebugChangeSet = new TreeSet<>(); + Set oldChangeSet; + // observe wire changes to detect, if we are really stuck in an endless loop + do + { + eventLimit += debugEventCount; + oldChangeSet = wireDebugChangeSet; + wireDebugChangeSet = new TreeSet<>(); + while (eventCounter < eventLimit) + { + timeline.executeNext(); + if (!timeline.hasNext()) + { + // no endless loop, but more events needed than expected + System.out.println("run() took longer than expected: " + eventCounter); + return Result.SUCCESS; + } + } + } while (!oldChangeSet.equals(wireDebugChangeSet)); + // if stuck, abort execution and print wires + System.err.print("Problematic Wire updates:"); + wireDebugChangeSet.forEach(System.out::println); + System.err.println("run() failed: " + eventCounter); + return Result.OUT_OF_TIME; + } + + private static String idToJavaIdentifier(String s) + { + StringBuilder sb = new StringBuilder(s.length()); + char c = s.charAt(0); + sb.append(Character.isJavaIdentifierStart(c) ? c : '_'); + for (int i = 1; i < s.length(); i++) + sb.append(Character.isJavaIdentifierPart(c = s.charAt(i)) ? c : '_'); + return sb.toString(); + } + + private void setField(Field f, S value) + { + try + { + f.setAccessible(true); + f.set(testEnvInstance, Objects.requireNonNull(value)); + } + catch (Exception e) + { + fail(e); + } + } + + private void setField(String name, S value) + { + try + { + Field f = testEnvClass.getDeclaredField(name); + f.setAccessible(true); + f.set(testEnvInstance, Objects.requireNonNull(value)); + } + catch (Exception e) + { + fail(e); + } + } + + public void displayState() + { + try + { + new LogicUIStandaloneGUI(logicModel).run(); + logicModel.setRedrawHandler(null); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public enum DebugState + { + NO_DEBUG, DEBUG_AT_PERFORMANCE_COST; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestUtil.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestUtil.java new file mode 100644 index 00000000..5989dfbe --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestUtil.java @@ -0,0 +1,100 @@ +package net.mograsim.logic.model.am2900.util; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; + +public final class TestUtil +{ + private TestUtil() + { + + } + + /** + * Transforms the last four bits of an int to a string that contains the binary ('1' and '0') representation of the 4 bits + * + * @author Christian Femers + */ + public static String to4bitBin(int x) + { + StringBuilder sb = new StringBuilder(4); + sb.append((x & 0b1000) == 0 ? '0' : '1'); + sb.append((x & 0b0100) == 0 ? '0' : '1'); + sb.append((x & 0b0010) == 0 ? '0' : '1'); + sb.append((x & 0b0001) == 0 ? '0' : '1'); + return sb.toString(); + } + + /** + * Transforms the given boolean to a string that contains the binary ('1' and '0') representation of the bit + * + * @author Christian Femers + */ + public static String to1bitBin(boolean bitIsSet) + { + return bitIsSet ? "1" : "0"; + } + + /** + * Transforms the given int to a string that contains the binary ('1' and '0') representation of the int. "0" is only returned when the + * int is equal to zero. + * + * @author Christian Femers + */ + public static String to1bitBin(int someInt) + { + return someInt != 0 ? "1" : "0"; + } + + /** + * Transforms a 4 bit signed integer (-8 to 7) to a int representing the same number. (Adding leading 1-bits if the 4 bit int is + * negative) + * + * @author Christian Femers + */ + public static int signed4ToSigned32(int signed4bit) + { + if ((signed4bit & 0b1000) > 0) + return signed4bit | 0xFF_FF_FF_F0; + return signed4bit & 0x00_00_00_0F; + } + + /** + * Transforms a 16 bit signed integer (-32768 to 32767 - a short) to a int representing the same number. (Adding leading 1-bits if the + * 16 bit int is negative) + * + * @author Christian Femers + */ + public static int signed16ToSigned32(int signed16bit) + { + return (short) signed16bit; + } + + /** + * Transforms the last n bits of an int to a string that contains the binary ('1' and '0') representation of the n bits + * + * @author Christian Femers + */ + public static String toNbitString(int x, int n) + { + StringBuilder sb = new StringBuilder(n); + for (int i = 0; i < n; i++) + { + sb.append((x >> i) & 1); + } + return sb.reverse().toString(); + } + + public static BitVector of(int value, int length) + { + BitVectorMutator mutator = BitVectorMutator.ofLength(length); + int val = value; + for (int i = length - 1; i >= 0; i--) + { + mutator.setMSBit(i, Bit.lastBitOf(val)); + val >>>= 1; + } + return mutator.toBitVector(); + } +} diff --git a/tests/net.mograsim.logic.tests/.classpath b/tests/net.mograsim.logic.tests/.classpath new file mode 100644 index 00000000..e61c696d --- /dev/null +++ b/tests/net.mograsim.logic.tests/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/net.mograsim.logic.tests/.project b/tests/net.mograsim.logic.tests/.project new file mode 100644 index 00000000..b8cd02dd --- /dev/null +++ b/tests/net.mograsim.logic.tests/.project @@ -0,0 +1,17 @@ + + + net.mograsim.logic.tests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF b/tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF new file mode 100644 index 00000000..4a72ac6b --- /dev/null +++ b/tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Logic Tests +Bundle-SymbolicName: net.mograsim.logic.tests;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Fragment-Host: net.mograsim.logic.model;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.logic.tests +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.junit.jupiter.api;bundle-version="5.4.0";visibility:=reexport, + org.junit.jupiter.params;bundle-version="5.4.0";visibility:=reexport, + org.junit;bundle-version="4.12.0" diff --git a/tests/net.mograsim.logic.tests/build.properties b/tests/net.mograsim.logic.tests/build.properties new file mode 100644 index 00000000..34d2e4d2 --- /dev/null +++ b/tests/net.mograsim.logic.tests/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java new file mode 100644 index 00000000..12df5844 --- /dev/null +++ b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java @@ -0,0 +1,465 @@ +package net.mograsim.logic.core.tests; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import net.mograsim.logic.core.components.CoreDemux; +import net.mograsim.logic.core.components.CoreMux; +import net.mograsim.logic.core.components.CoreTriStateBuffer; +import net.mograsim.logic.core.components.CoreUnidirectionalMerger; +import net.mograsim.logic.core.components.CoreUnidirectionalSplitter; +import net.mograsim.logic.core.components.gates.CoreAndGate; +import net.mograsim.logic.core.components.gates.CoreNandGate; +import net.mograsim.logic.core.components.gates.CoreNorGate; +import net.mograsim.logic.core.components.gates.CoreNotGate; +import net.mograsim.logic.core.components.gates.CoreOrGate; +import net.mograsim.logic.core.components.gates.CoreXorGate; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +@SuppressWarnings("unused") +class CoreComponentTest +{ + private Timeline t = new Timeline(11); + + @BeforeEach + void resetTimeline() + { + t.reset(); + } + + @Test + void circuitExampleTest() + { + CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), c = new CoreWire(t, 1, 10), d = new CoreWire(t, 2, 1), + e = new CoreWire(t, 1, 1), f = new CoreWire(t, 1, 1), g = new CoreWire(t, 1, 1), h = new CoreWire(t, 2, 1), + i = new CoreWire(t, 2, 1), j = new CoreWire(t, 1, 1), k = new CoreWire(t, 1, 1); + new CoreAndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); + new CoreNotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd()); + new CoreUnidirectionalMerger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd()); + new CoreMux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd()); + new CoreUnidirectionalSplitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd()); + + a.createReadWriteEnd().feedSignals(Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ONE); + c.createReadWriteEnd().feedSignals(Bit.ZERO); + d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE); + e.createReadWriteEnd().feedSignals(Bit.ZERO); + + t.executeAll(); + + assertEquals(Bit.ONE, j.getValue()); + assertEquals(Bit.ZERO, k.getValue()); + } + + @Test + void splitterTest() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), in = new CoreWire(t, 8, 1); + in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + new CoreUnidirectionalSplitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd()); + + t.executeAll(); + + assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); + assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO); + assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); + } + + @Test + void mergerTest() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1); + a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO); + c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); + + new CoreUnidirectionalMerger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); + + t.executeAll(); + + assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + } + + @Test + void fusionTest1() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1); + CoreWire.fuse(a, out, 0, 0, a.width); + CoreWire.fuse(b, out, 0, a.width, b.width); + CoreWire.fuse(c, out, 0, a.width + b.width, c.width); + ReadWriteEnd rA = a.createReadWriteEnd(); + rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); + ReadWriteEnd rB = b.createReadWriteEnd(); + rB.feedSignals(Bit.ONE, Bit.ZERO); + ReadWriteEnd rC = c.createReadWriteEnd(); + rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); + + t.executeAll(); + assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + t.executeAll(); + assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X); + assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X); + assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X); + rA.clearSignals(); + rB.clearSignals(); + rC.clearSignals(); + t.executeAll(); + assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); + assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE); + assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); + } + + @Test + void fusionTest2() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); + CoreWire.fuse(a, b); + ReadWriteEnd rw = a.createReadWriteEnd(); + t.executeAll(); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); + + rw.feedSignals(Bit.ONE, Bit.U, Bit.Z); + t.executeAll(); + assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z); + } + + @Test + void fusionTest3() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); + a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X); + t.executeAll(); + CoreWire.fuse(a, b); + t.executeAll(); + assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X); + } + + @Test + void fusionTest4() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); + a.createReadWriteEnd(); + t.executeAll(); + + CoreWire.fuse(a, b); + t.executeAll(); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); + } + +// @Test +// void connectorTest() +// { +// t.reset(); +// Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1); +// new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect(); +//// b.createReadWriteEnd(); +// a.createReadWriteEnd(); +// t.executeAll(); +// assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); +// } + + @Test + void triStateBufferTest() + { + CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), en = new CoreWire(t, 1, 1), notEn = new CoreWire(t, 1, 1); + new CoreNotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd()); + new CoreTriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd()); + new CoreTriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd()); + + ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd(); + enI.feedSignals(Bit.ONE); + aI.feedSignals(Bit.ONE); + bI.feedSignals(Bit.Z); + + t.executeAll(); + + assertEquals(Bit.ONE, b.getValue()); + + bI.feedSignals(Bit.ZERO); + + t.executeAll(); + + assertEquals(Bit.X, b.getValue()); + assertEquals(Bit.ONE, a.getValue()); + + aI.clearSignals(); + enI.feedSignals(Bit.ZERO); + + t.executeAll(); + + assertEquals(Bit.ZERO, a.getValue()); + + } + + @Test + void muxTest() + { + CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), + out = new CoreWire(t, 4, 1); + ReadWriteEnd selectIn = select.createReadWriteEnd(); + + selectIn.feedSignals(Bit.ZERO, Bit.ZERO); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + + new CoreMux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), + c.createReadOnlyEnd()); + t.executeAll(); + + assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + selectIn.feedSignals(Bit.ONE, Bit.ZERO); + t.executeAll(); + + assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + + selectIn.feedSignals(Bit.ONE, Bit.ONE); + t.executeAll(); + + assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); + + } + + @Test + void demuxTest() + { + CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), + in = new CoreWire(t, 4, 1); + ReadWriteEnd selectIn = select.createReadWriteEnd(); + + selectIn.feedSignals(Bit.ZERO, Bit.ZERO); + in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + + new CoreDemux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), + c.createReadWriteEnd()); + t.executeAll(); + + assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); + assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); + selectIn.feedSignals(Bit.ONE, Bit.ZERO); + t.executeAll(); + + assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); + assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + + selectIn.feedSignals(Bit.ONE, Bit.ONE); + t.executeAll(); + + assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); + assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); + + } + + @Test + void andTest() + { + CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1); + new CoreAndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + + t.executeAll(); + + assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO); + } + + @Test + void orTest() + { + CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1); + new CoreOrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + + t.executeAll(); + + assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE); + } + + @Test + void nandTest() + { + CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1); + new CoreNandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + + t.executeAll(); + + assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); + } + + @Test + void norTest() + { + CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1); + new CoreNorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + + t.executeAll(); + + assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO); + } + + @Test + void xorTest() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2), c = new CoreWire(t, 3, 1), d = new CoreWire(t, 3, 1); + new CoreXorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); + b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); + c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); + + t.executeAll(); + + assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE); + } + + @Test + void notTest() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2); + new CoreNotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd()); + a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); + + t.executeAll(); + + assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO); + } + + @Test + void rsLatchCircuitTest() + { + CoreWire r = new CoreWire(t, 1, 1), s = new CoreWire(t, 1, 1), t1 = new CoreWire(t, 1, 15), t2 = new CoreWire(t, 1, 1), + q = new CoreWire(t, 1, 1), nq = new CoreWire(t, 1, 1); + + new CoreOrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); + new CoreOrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); + new CoreNotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd()); + new CoreNotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); + + ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd(); + + sIn.feedSignals(Bit.ONE); + rIn.feedSignals(Bit.ZERO); + + t.executeAll(); + + assertEquals(Bit.ONE, q.getValue()); + assertEquals(Bit.ZERO, nq.getValue()); + + sIn.feedSignals(Bit.ZERO); + + t.executeAll(); + assertEquals(Bit.ONE, q.getValue()); + assertEquals(Bit.ZERO, nq.getValue()); + + rIn.feedSignals(Bit.ONE); + + t.executeAll(); + + assertEquals(Bit.ZERO, q.getValue()); + assertEquals(Bit.ONE, nq.getValue()); + } + + @Test + void numericValueTest() + { + CoreWire a = new CoreWire(t, 4, 1); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); + + t.executeAll(); + + assertEquals(11, a.getValues().getUnsignedValueLong()); + assertEquals(-5, a.getValues().getSignedValueLong()); + } + + boolean flag = false; + + @Test + void simpleTimelineTest() + { + Timeline t = new Timeline(3); + flag = false; + t.addEvent((e) -> + { + if (!flag) + fail("Events executed out of order!"); + flag = false; + }, 15); + t.addEvent((e) -> + { + if (flag) + fail("Events executed out of order!"); + flag = true; + }, 10); + t.addEvent((e) -> + { + if (flag) + fail("Events executed out of order!"); + flag = true; + }, 20); + t.addEvent((e) -> + { + fail("Only supposed to execute until timestamp 20, not 25"); + }, 25); + + t.executeUntil(t.laterThan(20), 100); + + if (!flag) + fail("Not all events were executed in order!"); + } + + // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes + @Disabled("Out of date") + @Test + void multipleInputs() + { + CoreWire w = new CoreWire(t, 2, 1); + ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd(); + wI1.feedSignals(Bit.ONE, Bit.Z); + wI2.feedSignals(Bit.Z, Bit.X); + t.executeAll(); + assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X); + + wI2.feedSignals(Bit.ZERO, Bit.Z); + t.executeAll(); + assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z); + + wI2.feedSignals(Bit.Z, Bit.Z); + t.executeAll(); + assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); + + wI2.feedSignals(Bit.ONE, Bit.Z); + ReadEnd rE = w.createReadOnlyEnd(); + rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change.")); + t.executeAll(); + rE.close(); + wI1.feedSignals(Bit.X, Bit.X); + t.executeAll(); + wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed.")); + wI1.close(); + assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); + } + + private static void assertBitArrayEquals(BitVector actual, Bit... expected) + { + assertArrayEquals(expected, actual.getBits()); + } +} diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java new file mode 100644 index 00000000..a3689a30 --- /dev/null +++ b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java @@ -0,0 +1,302 @@ +package net.mograsim.logic.core.tests; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.WindowConstants; + +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.components.gates.CoreNotGate; +import net.mograsim.logic.core.components.gates.CoreOrGate; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.Timeline.ExecutionResult; +import net.mograsim.logic.core.wires.CoreWire; + +public class GUITest extends JPanel +{ + + private static final long serialVersionUID = 1L; + + private static final int WIRE_DELAY = 40; + private static final int OR_DELAY = 100; + private static final int NOT_DELAY = 100; + + private Timeline t = new Timeline(11); + + CoreWire r = new CoreWire(t, 1, WIRE_DELAY); + CoreWire s = new CoreWire(t, 1, WIRE_DELAY); + CoreWire t1 = new CoreWire(t, 1, WIRE_DELAY); + CoreWire t2 = new CoreWire(t, 1, WIRE_DELAY); + CoreWire q = new CoreWire(t, 1, WIRE_DELAY); + CoreWire nq = new CoreWire(t, 1, WIRE_DELAY); + + CoreManualSwitch rIn = new CoreManualSwitch(t, r.createReadWriteEnd()); + CoreManualSwitch sIn = new CoreManualSwitch(t, s.createReadWriteEnd()); + + CoreOrGate or1 = new CoreOrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); + CoreOrGate or2 = new CoreOrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); + CoreNotGate not1 = new CoreNotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd()); + CoreNotGate not2 = new CoreNotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); + + Map switchMap = new HashMap<>(); + + int height; + int width; + boolean sizeChanged; + + public GUITest() + { + addMouseListener(new MouseListener() + { + + @Override + public void mouseReleased(MouseEvent e) + { + for (Entry dim : switchMap.entrySet()) + { + if (dim.getValue().contains(e.getPoint())) + { + dim.getKey().switchFullOff(); + repaint(); + } + } + } + + @Override + public void mousePressed(MouseEvent e) + { + for (Entry dim : switchMap.entrySet()) + { + if (dim.getValue().contains(e.getPoint())) + { + dim.getKey().switchFullOn(); + repaint(); + } + } + } + + @Override + public void mouseExited(MouseEvent e) + { + // none + } + + @Override + public void mouseEntered(MouseEvent e) + { + // none + } + + @Override + public void mouseClicked(MouseEvent e) + { + // If you want toggle buttons, use this code instead +// for (Entry dim : switchMap.entrySet()) { +// if (dim.getValue().contains(e.getPoint())) { +// dim.getKey().toggle(); +// repaint(); +// } +// } + } + }); + } + + public Timeline getTimeline() + { + return t; + } + + @Override + public void paint(Graphics some_g) + { + super.paint(some_g); + Graphics2D g = ((Graphics2D) some_g); + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + + checkSizeChange(); + adaptFont(g); + + drawWire(g, r, "r", 2, 9, 4, 9); + + drawWire(g, s, "s", 2, 3, 4, 3); + + drawWire(g, t2, "t2", 5, 8.5, 6, 8.5); + + drawWire(g, t1, "t1", 5, 3.5, 6, 3.5); + + drawWire(g, q, "q", 7, 8.5, 9, 8.5); + + drawWire(g, nq, "nq", 7, 3.5, 9, 3.5); + + drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5); + drawWire(g, q, "", 7.5, 7.5, 3, 4.5); + drawWire(g, q, "", 3, 4.5, 3, 4); + drawWire(g, q, "q", 3, 4, 4, 4); + + drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5); + drawWire(g, nq, "", 7.5, 4.5, 3, 7.5); + drawWire(g, nq, "", 3, 7.5, 3, 8); + drawWire(g, nq, "nq", 3, 8, 4, 8); + + drawSquare(g, 4, 8, "OR"); + drawSquare(g, 4, 3, "OR"); + + drawSquare(g, 6, 8, "NOT"); + drawSquare(g, 6, 3, "NOT"); + + drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75); + drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75); + + drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0); + } + + private void checkSizeChange() + { + sizeChanged = height != getHeight() || width != getWidth(); + if (sizeChanged) + { + height = getHeight(); + width = getWidth(); + } + } + + private void adaptFont(Graphics g) + { + g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f)); + } + + @SuppressWarnings("static-method") + private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY) + { + int h = g.getFontMetrics().getAscent(); + int w = g.getFontMetrics().stringWidth(s); + g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY)); + } + + private void drawWire(Graphics g, CoreWire wa, String name, double x1, double y1, double x2, double y2) + { + setTo(g, wa); + g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2)); + drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0); + } + + private void drawSquare(Graphics g, int posX, int posY, String text) + { + int x1 = gX(posX) - 5; + int x2 = gX(posX + 1) + 5; + int y1 = gY(posY) - 5; + int y2 = gY(posY + 1) + 5; + + g.setColor(Color.WHITE); + g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + setBlack(g); + g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5); + + } + + private void drawSwitch(Graphics g, CoreManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2) + { + int x1 = gX(posX1) - 5; + int x2 = gX(posX2) + 5; + int y1 = gY(posY1) - 5; + int y2 = gY(posY2) + 5; + + if (sizeChanged) + { + Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1); + switchMap.put(ms, r); + } + + g.setColor(ms.isFullOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE); + g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + setBlack(g); + g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5); + } + + private static void setBlack(Graphics g) + { + g.setColor(Color.BLACK); + } + + private static void setTo(Graphics g, CoreWire wa) + { + switch (wa.getValue()) + { + case ONE: + g.setColor(Color.GREEN); + break; + case X: + g.setColor(Color.RED); + break; + case Z: + g.setColor(Color.DARK_GRAY); + break; + case ZERO: + g.setColor(Color.BLACK); + break; + case U: + g.setColor(Color.MAGENTA); + break; + default: + throw new IllegalArgumentException(); + } + } + + private int gY(double pos) + { + return (int) (pos * height / 11); + } + + private int gX(double pos) + { + return (int) (pos * width / 11) + 50; + } + + public static void main(String[] args) + { + JFrame f = new JFrame("Test circuit 1.0.0"); + GUITest gt = new GUITest(); + f.add(gt); + f.setSize(800, 600); + f.setLocation(500, 400); + f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + f.setVisible(true); + + long begin = System.currentTimeMillis(); + + long lastFrame = begin; + long updateT = 16; + + while (f.isVisible()) + { + ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14); +// if (t.hasNext()) +// t.executeNext(); + if (er != ExecutionResult.NOTHING_DONE) + gt.repaint(12); + try + { + Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0)); + } + catch (Exception e) + { + e.printStackTrace(); + } + lastFrame = System.currentTimeMillis(); + } + } +} diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java new file mode 100644 index 00000000..5056345f --- /dev/null +++ b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java @@ -0,0 +1,52 @@ +package net.mograsim.logic.core.tests; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import java.util.function.LongConsumer; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; + +public final class TestCoreBitDisplay extends CoreBitDisplay +{ + + public TestCoreBitDisplay(Timeline timeline, ReadEnd in) + { + super(timeline, in); + } + + public void assertDisplays(Bit... expected) + { + assertArrayEquals(expected, getDisplayedValue().getBits()); + } + + public void assertAfterSimulationIs(Bit... expected) + { + timeline.executeAll(); + assertDisplays(expected); + } + + public void assertAfterSimulationIs(LongConsumer r, Bit... expected) + { + while (timeline.hasNext()) + { + timeline.executeNext(); + r.accept(timeline.getSimulationTime()); + } + assertDisplays(expected); + } + + @Override + protected TimelineEventHandler compute() + { + TimelineEventHandler handler = super.compute(); + return e -> + { + handler.handle(e); + System.out.println("update: value is " + getDisplayedValue()); + }; + } +} diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java new file mode 100644 index 00000000..2b46a6c7 --- /dev/null +++ b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java @@ -0,0 +1,289 @@ +package net.mograsim.logic.core.types; + +import static net.mograsim.logic.core.types.BitVector.*; +import static net.mograsim.logic.core.types.Bit.*; +import static org.junit.jupiter.api.Assertions.*; + +import java.math.BigInteger; +import java.util.Iterator; + +import org.junit.jupiter.api.Test; + +class BitVectorTest +{ + + @Test + void testOfBitArray() + { + BitVector.of(); // should be allowed and work + + assertSame(SINGLE_U, BitVector.of(U)); + assertSame(SINGLE_X, BitVector.of(X)); + assertSame(SINGLE_0, BitVector.of(ZERO)); + assertSame(SINGLE_1, BitVector.of(ONE)); + assertSame(SINGLE_Z, BitVector.of(Z)); + } + + @Test + void testOfBitInt() + { + assertEquals(BitVector.of(), BitVector.of(ONE, 0)); + + assertSame(SINGLE_U, BitVector.of(U, 1)); + assertSame(SINGLE_X, BitVector.of(X, 1)); + assertSame(SINGLE_0, BitVector.of(ZERO, 1)); + assertSame(SINGLE_1, BitVector.of(ONE, 1)); + assertSame(SINGLE_Z, BitVector.of(Z, 1)); + + assertEquals(BitVector.of(X, X, X), BitVector.of(X, 3)); + } + + @Test + void testGetUnsignedValue() + { + assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").getUnsignedValue()); + assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").getUnsignedValue()); + assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").getUnsignedValue()); + assertEquals(BigInteger.valueOf(0b0000000101), BitVector.parse("0000000101").getUnsignedValue()); + assertEquals(BigInteger.valueOf(0b1010000000), BitVector.parse("1010000000").getUnsignedValue()); + + assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").getUnsignedValue()); + } + + @Test + void testOfLongInt() + { + assertEquals(BitVector.parse("101"), BitVector.from(0b101L, 3)); + assertEquals(BitVector.parse("01010"), BitVector.from(0b01010L, 5)); + assertEquals(BitVector.parse("10101"), BitVector.from(-11L, 5)); + assertEquals(BitVector.parse("0000"), BitVector.from(0L, 4)); + } + + @Test + void testOfBigIntegerInt() + { + assertEquals(BitVector.parse("101"), BitVector.from(BigInteger.valueOf(0b101), 3)); + assertEquals(BitVector.parse("01010"), BitVector.from(BigInteger.valueOf(0b01010), 5)); + assertEquals(BitVector.parse("10101"), BitVector.from(BigInteger.valueOf(-11), 5)); + assertEquals(BitVector.parse("0000"), BitVector.from(BigInteger.valueOf(0), 4)); + } + + @Test + void testMutator() + { + var bv = BitVector.SINGLE_1; + var bvm = bv.mutator(); + + assertFalse(bvm.isEmpty()); + assertEquals(ONE, bvm.getLSBit(0)); + assertEquals(SINGLE_1, bvm.toBitVector()); + } + + @Test + void testGetMSBit() + { + assertEquals(ONE, SINGLE_1.getMSBit(0)); + assertEquals(ONE, BitVector.of(ONE, X, X, X).getMSBit(0)); + assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getMSBit(4)); + } + + @Test + void testGetLSBit() + { + assertEquals(ONE, SINGLE_1.getLSBit(0)); + assertEquals(ONE, BitVector.of(X, X, X, ONE).getLSBit(0)); + assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getLSBit(1)); + } + + @Test + void testGetBits() + { + assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.of(X, ONE, Z).getBits()); + assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.parse("X1Z").getBits()); + } + + @Test + void testIsBinary() + { + assertTrue(SINGLE_0.isBinary()); + assertTrue(SINGLE_1.isBinary()); + + assertFalse(SINGLE_U.isBinary()); + assertFalse(SINGLE_X.isBinary()); + assertFalse(SINGLE_Z.isBinary()); + + assertTrue(BitVector.of(ONE, ZERO, ONE, ONE, ZERO).isBinary()); + assertFalse(BitVector.of(ONE, ZERO, ZERO, X).isBinary()); + } + + @Test + void testJoin() + { + // binary + assertEquals(SINGLE_0, SINGLE_0.join(SINGLE_0)); + assertEquals(SINGLE_X, SINGLE_0.join(SINGLE_1)); + assertEquals(SINGLE_1, SINGLE_1.join(SINGLE_1)); + + // other + assertEquals(SINGLE_1, SINGLE_Z.join(SINGLE_1)); + assertEquals(SINGLE_U, SINGLE_0.join(SINGLE_U)); + assertEquals(SINGLE_X, SINGLE_X.join(SINGLE_Z)); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, Z).join(BitVector.of(ONE, ZERO, ZERO, ONE, Z)); + assertEquals(BitVector.of(U, X, ZERO, ONE, Z), result); + } + + @Test + void testAnd() + { + // binary + assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_0)); + assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_1)); + assertEquals(SINGLE_1, SINGLE_1.and(SINGLE_1)); + + // other + assertEquals(SINGLE_X, SINGLE_Z.and(SINGLE_1)); + assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_U)); + assertEquals(SINGLE_X, SINGLE_X.and(SINGLE_Z)); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, ONE).and(BitVector.of(ONE, ONE, ZERO, ZERO, ONE)); + assertEquals(BitVector.of(U, X, ZERO, ZERO, ONE), result); + } + + @Test + void testOr() + { + // binary + assertEquals(SINGLE_0, SINGLE_0.or(SINGLE_0)); + assertEquals(SINGLE_1, SINGLE_0.or(SINGLE_1)); + assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_1)); + + // other + assertEquals(SINGLE_1, SINGLE_Z.or(SINGLE_1)); + assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_U)); + assertEquals(SINGLE_X, SINGLE_X.or(SINGLE_Z)); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, ZERO).or(BitVector.of(ZERO, ZERO, ZERO, ONE, ONE)); + assertEquals(BitVector.of(U, X, ZERO, ONE, ONE), result); + } + + @Test + void testXor() + { + // binary + assertEquals(SINGLE_0, SINGLE_0.xor(SINGLE_0)); + assertEquals(SINGLE_1, SINGLE_0.xor(SINGLE_1)); + assertEquals(SINGLE_0, SINGLE_1.xor(SINGLE_1)); + + // other + assertEquals(SINGLE_X, SINGLE_Z.xor(SINGLE_1)); + assertEquals(SINGLE_U, SINGLE_0.xor(SINGLE_U)); + assertEquals(SINGLE_X, SINGLE_X.xor(SINGLE_Z)); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, ONE).xor(BitVector.of(ONE, ZERO, ZERO, ZERO, ONE)); + assertEquals(BitVector.of(U, X, ZERO, ONE, ZERO), result); + } + + @Test + void testNot() + { + // binary + assertEquals(SINGLE_1, SINGLE_0.not()); + assertEquals(SINGLE_0, SINGLE_1.not()); + + // other + assertEquals(SINGLE_U, SINGLE_U.not()); + assertEquals(SINGLE_X, SINGLE_X.not()); + assertEquals(SINGLE_X, SINGLE_Z.not()); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, Z).not(); + assertEquals(BitVector.of(U, X, ONE, ZERO, X), result); + } + + @Test + void testLength() + { + assertEquals(0, BitVector.of().length()); + assertEquals(1, SINGLE_0.length()); + assertEquals(3, BitVector.of(X, X, Z).length()); + } + + @Test + void testConcat() + { + assertEquals(BitVector.of(U, X), SINGLE_U.concat(SINGLE_X)); + assertEquals(BitVector.of(Z, X, U, ONE, X), BitVector.of(Z, X, U).concat(BitVector.of(ONE, X))); + } + + @Test + void testSubVectorInt() + { + assertEquals(SINGLE_0, SINGLE_0.subVector(0)); + assertEquals(BitVector.of(), SINGLE_0.subVector(1)); + assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1)); + assertEquals(BitVector.of(X, Z), BitVector.of(ZERO, U, ONE, X, Z).subVector(3)); + } + + @Test + void testSubVectorIntInt() + { + assertEquals(SINGLE_0, SINGLE_0.subVector(0, 1)); + assertEquals(BitVector.of(), SINGLE_0.subVector(0, 0)); + assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1, 2)); + assertEquals(BitVector.of(ONE, X), BitVector.of(ZERO, U, ONE, X, Z).subVector(2, 4)); + } + + @Test + void testEqualsObject() + { + assertEquals(SINGLE_X, SINGLE_X); + assertNotEquals(SINGLE_0, SINGLE_1); + + assertEquals(BitVector.of(X, Z, U), BitVector.of(X, Z, U)); + assertNotEquals(BitVector.of(X, Z, U), BitVector.of(X, X, U)); + } + + @Test + void testEqualsWithOffset() + { + assertTrue(SINGLE_X.equalsWithOffset(SINGLE_X, 0)); + assertFalse(SINGLE_0.equalsWithOffset(SINGLE_1, 0)); + + assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(Z, U), 1)); + assertFalse(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(X, U), 1)); + assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(U), 2)); + } + + @Test + void testParse() + { + assertEquals(SINGLE_U, BitVector.parse("U")); + assertEquals(SINGLE_X, BitVector.parse("X")); + assertEquals(SINGLE_0, BitVector.parse("0")); + assertEquals(SINGLE_1, BitVector.parse("1")); + assertEquals(SINGLE_Z, BitVector.parse("Z")); + + assertEquals(BitVector.of(X, U, Z, ONE, ZERO), BitVector.parse("XUZ10")); + + assertThrows(RuntimeException.class, () -> BitVector.parse("01BX")); + } + + @Test + void testIterator() + { + var bv = BitVector.of(U, Z, ONE, ZERO, X); + Iterator it = bv.iterator(); + + assertEquals(U, it.next()); + assertEquals(Z, it.next()); + assertEquals(ONE, it.next()); + assertEquals(ZERO, it.next()); + assertEquals(X, it.next()); + assertFalse(it.hasNext()); + } +} diff --git a/tests/net.mograsim.machine.tests/.classpath b/tests/net.mograsim.machine.tests/.classpath new file mode 100644 index 00000000..e61c696d --- /dev/null +++ b/tests/net.mograsim.machine.tests/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/net.mograsim.machine.tests/.project b/tests/net.mograsim.machine.tests/.project new file mode 100644 index 00000000..c9605526 --- /dev/null +++ b/tests/net.mograsim.machine.tests/.project @@ -0,0 +1,28 @@ + + + net.mograsim.machine.tests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/tests/net.mograsim.machine.tests/.settings/org.eclipse.core.resources.prefs b/tests/net.mograsim.machine.tests/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/tests/net.mograsim.machine.tests/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.core.prefs b/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/tests/net.mograsim.machine.tests/META-INF/MANIFEST.MF b/tests/net.mograsim.machine.tests/META-INF/MANIFEST.MF new file mode 100644 index 00000000..175305b4 --- /dev/null +++ b/tests/net.mograsim.machine.tests/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Machine Tests +Bundle-SymbolicName: net.mograsim.machine.tests;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Fragment-Host: net.mograsim.machine;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.machine.tests +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.junit;bundle-version="4.12.0", + org.junit.jupiter.api;bundle-version="5.4.0";visibility:=reexport, + org.junit.jupiter.params;bundle-version="5.4.0";visibility:=reexport diff --git a/tests/net.mograsim.machine.tests/build.properties b/tests/net.mograsim.machine.tests/build.properties new file mode 100644 index 00000000..34d2e4d2 --- /dev/null +++ b/tests/net.mograsim.machine.tests/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/tests/net.mograsim.machine.tests/src/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java b/tests/net.mograsim.machine.tests/src/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java new file mode 100644 index 00000000..9d38b894 --- /dev/null +++ b/tests/net.mograsim.machine.tests/src/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java @@ -0,0 +1,64 @@ +package net.mograsim.machine.standard.memory; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.math.BigInteger; +import java.util.Random; + +import org.junit.jupiter.api.Test; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.machine.MainMemoryDefinition; + +class WordAddressableMemoryTest +{ + + private Timeline t = new Timeline(10); + + @Test + public void wordAddressableMemoryLargeTest() + { + CoreWire rW = new CoreWire(t, 1, 2); + CoreWire data = new CoreWire(t, 16, 2); + CoreWire address = new CoreWire(t, 64, 2); + ReadWriteEnd rWI = rW.createReadWriteEnd(); + ReadWriteEnd dataI = data.createReadWriteEnd(); + ReadWriteEnd addressI = address.createReadWriteEnd(); + + @SuppressWarnings("unused") + CoreWordAddressableMemory memory = new CoreWordAddressableMemory(t, 4, + new WordAddressableMemory(MainMemoryDefinition.create(64, 16, 4096L, Long.MAX_VALUE)), data.createReadWriteEnd(), + rW.createReadOnlyEnd(), address.createReadOnlyEnd()); + + Random r = new Random(); + for (long j = 1; j > 0; j *= 2) + { + for (int i = 0; i < 50; i++) + { + String sAddress = String.format("%64s", BigInteger.valueOf(4096 + i + j).toString(2)).replace(' ', '0'); + BitVector bAddress = BitVector.parse(sAddress); + addressI.feedSignals(bAddress); + t.executeAll(); + String random = BigInteger.valueOf(Math.abs(r.nextInt())).toString(5); + random = random.substring(Integer.max(0, random.length() - 16)); + random = String.format("%16s", random).replace(' ', '0'); + random = random.replace('2', 'X').replace('3', 'Z').replace('4', 'U'); + BitVector vector = BitVector.parse(random); + dataI.feedSignals(vector); + rWI.feedSignals(Bit.ZERO); + t.executeAll(); + rWI.feedSignals(Bit.ONE); + t.executeAll(); + dataI.clearSignals(); + t.executeAll(); + + assertEquals(dataI.getValues(), vector); + } + } + } + +}